diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 15aedca55..13f49a3ec 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,6 +12,7 @@ name: Java CI with Gradle on: schedule: - cron: "0 0 * * *" + workflow_dispatch: jobs: build: diff --git a/build.gradle b/build.gradle index 07cca4635..4e7e8f7f4 100644 --- a/build.gradle +++ b/build.gradle @@ -79,6 +79,18 @@ repositories { // name = "CurseForge" // url = "https://minecraft.curseforge.com/api/maven/" //} + maven { + name = "Jitpack" + url = "https://jitpack.io" + } + maven { + name = "CurseMaven" + url = "https://cursemaven.com" + } + maven { + name = "OpenComputers" + url = "https://maven.cil.li/" + } } dependencies { @@ -94,6 +106,8 @@ dependencies { compileOnly "inventorytweaks:InventoryTweaks:1.59-dev:deobf" implementation "li.cil.oc:OpenComputers:MC1.7.10-1.5.+:api" + + compileOnly "com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta.56-GTNH:dev" } processResources { diff --git a/changelog b/changelog index 6f3ede9f5..191a7880f 100644 --- a/changelog +++ b/changelog @@ -1,48 +1,15 @@ -## Added -* New chemical factory - * New form factor, uses a smaller 5x5 footprint - * Only does four recipes instead of eight - * Double base speed, but also double power draw - * Three upgrade slots, upgrades follow the same rules as on the new chemplant - * Upgrades stack with the double base speed - * Stackable! - * Water consumption rate is fixed at 100mB/t for each active recipe - * Has a dedicated coolant line, so that the coolant water doesn't get used up by recipes - * Coolant line has a tooltip which should make it clear that the machine uses water and produces LPS - * Also has sound, unlike the old chemical factory - * Output fluids are now automatically sent to input tanks, at a rate of up to 50mB/t for somewhat fair fluid sharing - * This means that a chemical factory can make hydrogen peroxide, sulfuric acid and nitric acid, and the only fluid input needed is water - ## Changed -* The DNT suit now has a damage threshold of 1,000 -* Compressed biomass now has a nice cube shape -* The new chemical plant's indicator lights are now functional -* The new chemical plant can now use upgrades -* Reeds now drop sticks when broken -* Switching the recipe in the new chemplant now annihilates residual fluid that is not overwritten by the new recipe - * I don't know why people wanted this, but here you go -* The alternate recipe for oxyhydrogen now uses compressed air instead of nothing -* Improved threaded Mk5, should be a smidge faster now -* Spires no longer progress phases on peaceful difficulty -* Spires now have a 20% chance of coming with instructions -* New chemical plant now has sound -* Old chemical plant and factory have been renamed and their recipes removed -* The new recipe selector no longer changes recipe instantly on click, rather as soon as the selector GUI is closed. This should prevent issues when misclicking, which would destroy buffered fluids -* The memespoon is now safe(tm) - * Instead of using a bugged instakill implementation, a fall distance of >2 now deals 50 extra melee damage - * Instead of blowing up like a nuke with a fall distance of >20, it now explodes similarly to a non-HE artillery grenade. This deals 150 damage in an AoE, has armor piercing properties and is, like the original functionality, still lethal to the user +* Updated ukrainian, chinese and russian localization, including QMAW +* Some previously hardcoded lang strings are now affected by translations +* Due to severe issues with ticking order as well as a crash caused by certain tiles that uses threaded packets, Torcherino accelerator torches no longer affect NTM machines +* RBMK control rod colors and auto control rod settings are now copiable +* Murky wings no longer have slowfall, and using shift+space cancels the momentum +* Murky wings are now slow by default and speed up when sprinting +* The arc furnace can now be used with AE2 buses, which was previously not possible due to the unique stacksize limitations ## Fixed -* Chemical plant ports. For real this time. -* Fixed cable and pipe gauges returning the incomplete delta second value for OC and ROR readers -* Fixed new chemical plant not saving power values to disk -* Fixed laser rifle scope texture being missing -* Potentially fixed shift clicking issue with the new chemical plant -* Fixed blowtorch having a minimum gas requirement of 1,000mB despite only using 250mB -* The gas turbine now uses audio with a 20 tick timeout, fixing a rare issue where the loop gets stuck and never ends -* Potentially fixed a dupe caused by using InventoryBogoSorter in combination with crates -* Rapidly spinning dyx should no longer have a state leak that would rotate lighting of unrelated TESRs with it -* Fixed issue where mining strange stone with silk touch ability would cause a desync. It also now drops cobblestone, as if silk touch wasn't active at all -* Fixed issue where applying a filter to a mask that doesn't support certain protection types would permanently remove those types from the filter until the game is restarted -* Fixed InventoryBogoSorter being able to move held crates -* Fixed tier 2 pickaxes mining depth rock causing a desync with the depth rock not actually being broken \ No newline at end of file +* Fixed conveyor grabber dropping items off at an offset when placing them on a conveyor belt due to a client desync +* Fixed occasional crash caused by using the settings tool on the autoloader +* Fixed QMAW not correctly working with other languages +* Fixed QMAW loading breaking entirely due to file encoding +* Fixed PWR fuel rod textures being 18x18 instead of 16x16 \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 17c61bd4b..03457ea9b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5357 +mod_build_number=5426 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/blocks/BlockDummyable.java b/src/main/java/com/hbm/blocks/BlockDummyable.java index 9508350b5..5b72660bf 100644 --- a/src/main/java/com/hbm/blocks/BlockDummyable.java +++ b/src/main/java/com/hbm/blocks/BlockDummyable.java @@ -5,7 +5,7 @@ import com.hbm.handler.ThreeInts; import com.hbm.interfaces.ICopiable; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IPersistentNBT; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; @@ -37,7 +37,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -public abstract class BlockDummyable extends BlockContainer implements ICustomBlockHighlight, ICopiable, INBTTransformable { +public abstract class BlockDummyable extends BlockContainer implements ICustomBlockHighlight, ICopiable, INBTBlockTransformable { public BlockDummyable(Material mat) { super(mat); @@ -77,27 +77,20 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl super.onNeighborBlockChange(world, x, y, z, block); - if(world.isRemote || safeRem) + if(safeRem) return; - int metadata = world.getBlockMetadata(x, y, z); - - // if it's an extra, remove the extra-ness - if(metadata >= extra) - metadata -= extra; - - ForgeDirection dir = ForgeDirection.getOrientation(metadata).getOpposite(); - Block b = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); - - if(b != this) { - world.setBlockToAir(x, y, z); - } + destroyIfOrphan(world, x, y, z); } public void updateTick(World world, int x, int y, int z, Random rand) { super.updateTick(world, x, y, z, rand); + destroyIfOrphan(world, x, y, z); + } + + private void destroyIfOrphan(World world, int x, int y, int z) { if(world.isRemote) return; @@ -110,10 +103,32 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl ForgeDirection dir = ForgeDirection.getOrientation(metadata).getOpposite(); Block b = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); - if(b != this) { - world.setBlockToAir(x, y, z); + // An extra precaution against multiblocks on chunk borders being erroneously deleted. + // Technically, this might be used to persist ghost dummy blocks by manipulating + // loaded chunks and block destruction, but this gives no benefit to the player, + // cannot be done accidentally, and is definitely preferable to multiblocks + // just vanishing when their chunks are unloaded in an unlucky way. + if(b != this && world.checkChunksExist(x - 1, y - 1, z - 1, x + 1, y + 1, z + 1)) { + if (isLegacyMonoblock(world, x, y, z)) { + fixLegacyMonoblock(world, x, y, z); + } else { + world.setBlockToAir(x, y, z); + } } + } + // Override this when turning a single block into a pseudo-multiblock. + // If this returns true, instead of being deleted as an orphan, the block + // will be promoted to a core of a dummyable, however without any dummies. + // This is only called if the block is presumed an orphan, so you don't + // need to check that here. + protected boolean isLegacyMonoblock(World world, int x, int y, int z) { + return false; + } + + protected void fixLegacyMonoblock(World world, int x, int y, int z) { + // Promote to a lone core block with the same effective rotation as before the change + world.setBlockMetadataWithNotify(x, y, z, offset + world.getBlockMetadata(x, y, z), 3); } public int[] findCore(World world, int x, int y, int z) { @@ -550,6 +565,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl @Override public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { int[] pos = findCore(world, x, y, z); + if(pos == null) return; TileEntity tile = world.getTileEntity(pos[0], pos[1], pos[2]); if (tile instanceof ICopiable) ((ICopiable) tile).pasteSettings(nbt, index, world, player, pos[0], pos[1], pos[2]); @@ -575,7 +591,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl meta -= extra; } - meta = INBTTransformable.transformMetaDeco(meta, coordBaseMode); + meta = INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); if(isOffset) { meta += offset; diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 106dbe846..d30f6b619 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -34,6 +34,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; +import cpw.mods.fml.common.Loader; import java.util.ArrayList; @@ -314,12 +315,14 @@ public class ModBlocks { public static Block floodlight; public static Block floodlight_beam; + public static Block rebar; public static Block reinforced_stone; public static Block concrete_smooth; public static Block concrete_colored; public static Block concrete_colored_ext; public static Block concrete; public static Block concrete_asbestos; + public static Block concrete_rebar; public static Block concrete_super; public static Block concrete_super_broken; public static Block ducrete_smooth; @@ -747,9 +750,6 @@ public class ModBlocks { public static Block machine_microwave; - public static Block machine_arc_furnace_off; - public static Block machine_arc_furnace_on; - //public static Block machine_deuterium; public static Block machine_battery_potato; @@ -791,6 +791,7 @@ public class ModBlocks { public static Block fluid_duct_paintable; public static Block fluid_duct_gauge; public static Block fluid_duct_exhaust; + public static Block fluid_duct_paintable_block_exhaust; public static Block fluid_valve; public static Block fluid_switch; public static Block fluid_pump; @@ -802,6 +803,7 @@ public class ModBlocks { public static Block radio_torch_reader; public static Block radio_torch_controller; public static Block radio_telex; + public static Block oc_cable_paintable; public static Block conveyor; public static Block conveyor_express; @@ -827,6 +829,7 @@ public class ModBlocks { public static Block drone_crate_requester; public static Block pneumatic_tube; + public static Block pneumatic_tube_paintable; public static Block fan; @@ -845,6 +848,8 @@ public class ModBlocks { public static Block ladder_steel; public static Block ladder_tungsten; + public static Block trapdoor_steel; + public static Block barrel_plastic; public static Block barrel_corroded; public static Block barrel_iron; @@ -999,16 +1004,18 @@ public class ModBlocks { public static Block machine_mining_laser; public static Block barricade; // a sand bag that drops nothing, for automated walling purposes - public static Block machine_assembler; - public static Block machine_assemfac; + @Deprecated public static Block machine_assembler; + public static Block machine_assembly_machine; + @Deprecated public static Block machine_assemfac; public static Block machine_arc_welder; public static Block machine_soldering_station; public static Block machine_arc_furnace; @Deprecated public static Block machine_chemplant; public static Block machine_chemical_plant; - public static Block machine_chemfac; + @Deprecated public static Block machine_chemfac; public static Block machine_chemical_factory; + public static Block machine_purex; public static Block machine_mixer; public static Block machine_fluidtank; @@ -1115,6 +1122,7 @@ public class ModBlocks { public static Block rbmk_heater; public static Block rbmk_console; public static Block rbmk_crane_console; + public static Block rbmk_autoloader; public static Block rbmk_loader; public static Block rbmk_steam_inlet; public static Block rbmk_steam_outlet; @@ -1239,6 +1247,10 @@ public class ModBlocks { public static Block wand_air; public static Block wand_loot; public static Block wand_jigsaw; + public static Block wand_logic; + public static Block wand_tandem; + + public static Block logic_block; public static Material materialGas = new MaterialGas(); @@ -1514,12 +1526,14 @@ public class ModBlocks { floodlight = new Floodlight(Material.iron).setBlockName("floodlight").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); floodlight_beam = new FloodlightBeam().setBlockName("floodlight_beam"); + rebar = new BlockRebar().setBlockName("rebar").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(20.0F).setBlockTextureName(RefStrings.MODID + ":rebar"); reinforced_stone = new BlockGeneric(Material.rock).setBlockName("reinforced_stone").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(100.0F).setBlockTextureName(RefStrings.MODID + ":reinforced_stone"); concrete_smooth = new BlockRadResistant(Material.rock).setBlockName("concrete_smooth").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(140.0F).setBlockTextureName(RefStrings.MODID + ":concrete"); concrete_colored = new BlockConcreteColored(Material.rock).setBlockName("concrete_colored").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(140.0F).setBlockTextureName(RefStrings.MODID + ":concrete"); concrete_colored_ext = new BlockConcreteColoredExt(Material.rock).setBlockName("concrete_colored_ext").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(140.0F).setBlockTextureName(RefStrings.MODID + ":concrete_colored_ext"); concrete = new BlockGeneric(Material.rock).setBlockName("concrete").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(140.0F).setBlockTextureName(RefStrings.MODID + ":concrete_tile"); concrete_asbestos = new BlockGeneric(Material.rock).setBlockName("concrete_asbestos").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(150.0F).setBlockTextureName(RefStrings.MODID + ":concrete_asbestos"); + concrete_rebar = new BlockGeneric(Material.rock).setBlockName("concrete_rebar").setCreativeTab(MainRegistry.blockTab).setHardness(50.0F).setResistance(240.0F).setBlockTextureName(RefStrings.MODID + ":concrete_rebar"); concrete_super = new BlockUberConcrete().setBlockName("concrete_super").setCreativeTab(MainRegistry.blockTab).setHardness(150.0F).setResistance(1000.0F); concrete_super_broken = new BlockFalling(Material.rock).setBlockName("concrete_super_broken").setCreativeTab(MainRegistry.blockTab).setHardness(10.0F).setResistance(20.0F).setBlockTextureName(RefStrings.MODID + ":concrete_super_broken"); concrete_pillar = new BlockRotatablePillar(Material.rock, RefStrings.MODID + ":concrete_pillar_top").setBlockName("concrete_pillar").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(180.0F).setBlockTextureName(RefStrings.MODID + ":concrete_pillar_side"); @@ -1811,9 +1825,8 @@ public class ModBlocks { machine_rotary_furnace = new MachineRotaryFurnace(Material.iron).setBlockName("machine_rotary_furnace").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_fire"); machine_crystallizer = new MachineCrystallizer(Material.iron).setBlockName("machine_crystallizer").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_crystallizer"); - machine_uf6_tank = new MachineUF6Tank(Material.iron).setBlockName("machine_uf6_tank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); - - machine_puf6_tank = new MachinePuF6Tank(Material.iron).setBlockName("machine_puf6_tank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); + machine_uf6_tank = new MachineUF6Tank(Material.iron).setBlockName("machine_uf6_tank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null); + machine_puf6_tank = new MachinePuF6Tank(Material.iron).setBlockName("machine_puf6_tank").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null); machine_reactor_breeding = new MachineReactorBreeding(Material.iron).setBlockName("machine_reactor").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_reactor"); @@ -1863,8 +1876,6 @@ public class ModBlocks { machine_electric_furnace_off = new MachineElectricFurnace(false).setBlockName("machine_electric_furnace_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_electric_furnace_on = new MachineElectricFurnace(true).setBlockName("machine_electric_furnace_on").setHardness(5.0F).setLightLevel(1.0F).setResistance(10.0F); - machine_arc_furnace_off = new MachineArcFurnace(false).setBlockName("machine_arc_furnace_off").setHardness(5.0F).setResistance(10.0F); - machine_arc_furnace_on = new MachineArcFurnace(true).setBlockName("machine_arc_furnace_on").setHardness(5.0F).setLightLevel(1.0F).setResistance(10.0F); machine_arc_furnace = new MachineArcFurnaceLarge().setBlockName("machine_arc_furnace").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_microwave = new MachineMicrowave(Material.iron).setBlockName("machine_microwave").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_microwave"); @@ -1920,6 +1931,7 @@ public class ModBlocks { fluid_duct_neo = new FluidDuctStandard(Material.iron).setBlockName("fluid_duct_neo").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pipe_neo"); fluid_duct_box = new FluidDuctBox(Material.iron).setBlockName("fluid_duct_box").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":fluid_duct_box"); fluid_duct_exhaust = new FluidDuctBoxExhaust(Material.iron).setBlockName("fluid_duct_exhaust").setStepSound(ModSoundTypes.pipe).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":fluid_duct_box"); + fluid_duct_paintable_block_exhaust = new FluidDuctPaintableBlockExhaust().setBlockName("fluid_duct_paintable_block_exhaust").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); fluid_duct_paintable = new FluidDuctPaintable().setBlockName("fluid_duct_paintable").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); fluid_duct_gauge = new FluidDuctGauge().setBlockName("fluid_duct_gauge").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); fluid_valve = new FluidValve(Material.iron).setBlockName("fluid_valve").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); @@ -1959,6 +1971,7 @@ public class ModBlocks { drone_crate_requester = new DroneDock().setBlockName("drone_crate_requester").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_crate_requester"); pneumatic_tube = new PneumoTube().setBlockName("pneumatic_tube").setStepSound(ModSoundTypes.pipe).setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pneumatic_tube"); + pneumatic_tube_paintable = new PneumoTubePaintableBlock().setBlockName("pneumatic_tube_paintable").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); chain = new BlockChain(Material.iron).setBlockName("dungeon_chain").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":chain"); @@ -1973,6 +1986,8 @@ public class ModBlocks { ladder_steel = new BlockNTMLadder().setBlockName("ladder_steel").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_steel"); ladder_tungsten = new BlockNTMLadder().setBlockName("ladder_tungsten").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_tungsten"); + trapdoor_steel = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_steel").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_steel"); + barrel_plastic = new BlockFluidBarrel(Material.iron, 12000).setBlockName("barrel_plastic").setStepSound(Block.soundTypeStone).setHardness(2.0F).setResistance(5.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":barrel_plastic"); barrel_corroded = new BlockFluidBarrel(Material.iron, 6000).setBlockName("barrel_corroded").setStepSound(Block.soundTypeMetal).setHardness(2.0F).setResistance(5.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":barrel_corroded"); barrel_iron = new BlockFluidBarrel(Material.iron, 8000).setBlockName("barrel_iron").setStepSound(Block.soundTypeMetal).setHardness(2.0F).setResistance(5.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":barrel_iron"); @@ -2155,6 +2170,7 @@ public class ModBlocks { rbmk_heater = new RBMKHeater().setBlockName("rbmk_heater").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_heater"); rbmk_console = new RBMKConsole().setBlockName("rbmk_console").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_console"); rbmk_crane_console = new RBMKCraneConsole().setBlockName("rbmk_crane_console").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_crane_console"); + rbmk_autoloader = new RBMKAutoloader().setBlockName("rbmk_autoloader").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(60.0F).setBlockTextureName(RefStrings.MODID + ":rbmk_autoloader"); rbmk_loader = new RBMKLoader(Material.iron).setBlockName("rbmk_loader").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(60.0F).setBlockTextureName(RefStrings.MODID + ":rbmk_loader"); rbmk_steam_inlet = new RBMKInlet(Material.iron).setBlockName("rbmk_steam_inlet").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(60.0F).setBlockTextureName(RefStrings.MODID + ":rbmk_steam_inlet"); rbmk_steam_outlet = new RBMKOutlet(Material.iron).setBlockName("rbmk_steam_outlet").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(60.0F).setBlockTextureName(RefStrings.MODID + ":rbmk_steam_outlet"); @@ -2221,14 +2237,16 @@ public class ModBlocks { machine_ore_slopper = new MachineOreSlopper().setBlockName("machine_ore_slopper").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_mining_laser = new MachineMiningLaser(Material.iron).setBlockName("machine_mining_laser").setHardness(5.0F).setResistance(100.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_mining_laser"); barricade = new BlockNoDrop(Material.sand).setBlockName("barricade").setHardness(1.0F).setResistance(2.5F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":barricade"); - machine_assembler = new MachineAssembler(Material.iron).setBlockName("machine_assembler").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_assembler"); - machine_assemfac = new MachineAssemfac(Material.iron).setBlockName("machine_assemfac").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + machine_assembler = new MachineAssembler(Material.iron).setBlockName("machine_assembler").setHardness(5.0F).setResistance(30.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":machine_assembler"); + machine_assembly_machine = new MachineAssemblyMachine(Material.iron).setBlockName("machine_assembly_machine").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + machine_assemfac = new MachineAssemfac(Material.iron).setBlockName("machine_assemfac").setHardness(5.0F).setResistance(30.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_arc_welder = new MachineArcWelder(Material.iron).setBlockName("machine_arc_welder").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_soldering_station = new MachineSolderingStation(Material.iron).setBlockName("machine_soldering_station").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); - machine_chemplant = new MachineChemplant(Material.iron).setBlockName("machine_chemplant").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + machine_chemplant = new MachineChemplant(Material.iron).setBlockName("machine_chemplant").setHardness(5.0F).setResistance(30.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_chemical_plant = new MachineChemicalPlant(Material.iron).setBlockName("machine_chemical_plant").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); - machine_chemfac = new MachineChemfac(Material.iron).setBlockName("machine_chemfac").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + machine_chemfac = new MachineChemfac(Material.iron).setBlockName("machine_chemfac").setHardness(5.0F).setResistance(30.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_chemical_factory = new MachineChemicalFactory(Material.iron).setBlockName("machine_chemical_factory").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + machine_purex = new MachinePUREX(Material.iron).setBlockName("machine_purex").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_mixer = new MachineMixer(Material.iron).setBlockName("machine_mixer").setHardness(5.0F).setResistance(30.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_fluidtank = new MachineFluidTank(Material.iron).setBlockName("machine_fluidtank").setHardness(5.0F).setResistance(20.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_fluidtank"); machine_bat9000 = new MachineBigAssTank9000(Material.iron).setBlockName("machine_bat9000").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -2329,6 +2347,10 @@ public class ModBlocks { absorber_pink = new BlockAbsorber(Material.iron, 10000F).setBlockName("absorber_pink").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":absorber_pink"); decon = new BlockDecon(Material.iron).setBlockName("decon").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":decon_side"); + if (Loader.isModLoaded("OpenComputers")) { + oc_cable_paintable = new BlockOpenComputersCablePaintable().setBlockName("oc_cable_paintable").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); + } + volcano_core = new BlockVolcano().setBlockName("volcano_core").setBlockUnbreakable().setResistance(10000.0F).setCreativeTab(MainRegistry.nukeTab).setBlockTextureName(RefStrings.MODID + ":volcano_core"); volcano_rad_core = new BlockVolcano().setBlockName("volcano_rad_core").setBlockUnbreakable().setResistance(10000.0F).setCreativeTab(MainRegistry.nukeTab).setBlockTextureName(RefStrings.MODID + ":volcano_rad_core"); @@ -2388,6 +2410,11 @@ public class ModBlocks { wand_air = new BlockWand(Blocks.air).setBlockName("wand_air").setBlockTextureName(RefStrings.MODID + ":wand_air"); wand_loot = new BlockWandLoot().setBlockName("wand_loot").setBlockTextureName(RefStrings.MODID + ":wand_loot"); wand_jigsaw = new BlockWandJigsaw().setBlockName("wand_jigsaw").setBlockTextureName(RefStrings.MODID + ":wand_jigsaw"); + wand_logic = new BlockWandLogic().setBlockName("wand_logic").setBlockTextureName(RefStrings.MODID + ":wand_logic"); + wand_tandem = new BlockWandTandem().setBlockName("wand_tandem").setBlockTextureName(RefStrings.MODID + ":wand_tandem"); + + logic_block = new LogicBlock().setBlockName("logic_block").setBlockTextureName(RefStrings.MODID + ":logic_block"); + } private static void registerBlock() { @@ -2678,6 +2705,7 @@ public class ModBlocks { GameRegistry.registerBlock(reinforced_laminate_pane,ItemBlockBlastInfo.class, reinforced_laminate_pane.getUnlocalizedName()); //Bricks + register(rebar); GameRegistry.registerBlock(reinforced_stone, ItemBlockBlastInfo.class, reinforced_stone.getUnlocalizedName()); GameRegistry.registerBlock(reinforced_ducrete, ItemBlockBlastInfo.class, reinforced_ducrete.getUnlocalizedName()); GameRegistry.registerBlock(concrete_smooth, ItemBlockBlastInfo.class, concrete_smooth.getUnlocalizedName()); @@ -2685,6 +2713,7 @@ public class ModBlocks { GameRegistry.registerBlock(concrete_colored_ext, ItemBlockBlastInfo.class, concrete_colored_ext.getUnlocalizedName()); GameRegistry.registerBlock(concrete, ItemBlockBlastInfo.class, concrete.getUnlocalizedName()); GameRegistry.registerBlock(concrete_asbestos, ItemBlockBlastInfo.class, concrete_asbestos.getUnlocalizedName()); + GameRegistry.registerBlock(concrete_rebar, ItemBlockBlastInfo.class, concrete_rebar.getUnlocalizedName()); GameRegistry.registerBlock(concrete_super, ItemBlockBlastInfo.class, concrete_super.getUnlocalizedName()); GameRegistry.registerBlock(concrete_super_broken, ItemBlockBlastInfo.class, concrete_super_broken.getUnlocalizedName()); GameRegistry.registerBlock(ducrete_smooth, ItemBlockBlastInfo.class, ducrete_smooth.getUnlocalizedName()); @@ -3159,6 +3188,7 @@ public class ModBlocks { GameRegistry.registerBlock(rbmk_heater, rbmk_heater.getUnlocalizedName()); GameRegistry.registerBlock(rbmk_console, rbmk_console.getUnlocalizedName()); GameRegistry.registerBlock(rbmk_crane_console, rbmk_crane_console.getUnlocalizedName()); + register(rbmk_autoloader); register(rbmk_loader); register(rbmk_steam_inlet); register(rbmk_steam_outlet); @@ -3187,6 +3217,7 @@ public class ModBlocks { register(fluid_duct_neo); register(fluid_duct_box); register(fluid_duct_exhaust); + register(fluid_duct_paintable_block_exhaust); register(fluid_duct_paintable); register(fluid_duct_gauge); register(fluid_valve); @@ -3222,6 +3253,7 @@ public class ModBlocks { register(drone_crate_provider); register(drone_crate_requester); register(pneumatic_tube); + register(pneumatic_tube_paintable); register(fan); register(piston_inserter); @@ -3236,6 +3268,7 @@ public class ModBlocks { GameRegistry.registerBlock(ladder_steel, ladder_steel.getUnlocalizedName()); GameRegistry.registerBlock(ladder_lead, ladder_lead.getUnlocalizedName()); GameRegistry.registerBlock(ladder_cobalt, ladder_cobalt.getUnlocalizedName()); + GameRegistry.registerBlock(trapdoor_steel, trapdoor_steel.getUnlocalizedName()); register(barrel_plastic); register(barrel_corroded); @@ -3261,15 +3294,15 @@ public class ModBlocks { GameRegistry.registerBlock(machine_converter_rf_he, machine_converter_rf_he.getUnlocalizedName()); GameRegistry.registerBlock(machine_electric_furnace_off, machine_electric_furnace_off.getUnlocalizedName()); GameRegistry.registerBlock(machine_electric_furnace_on, machine_electric_furnace_on.getUnlocalizedName()); - GameRegistry.registerBlock(machine_arc_furnace_off, machine_arc_furnace_off.getUnlocalizedName()); - GameRegistry.registerBlock(machine_arc_furnace_on, machine_arc_furnace_on.getUnlocalizedName()); GameRegistry.registerBlock(machine_microwave, machine_microwave.getUnlocalizedName()); GameRegistry.registerBlock(machine_assembler, machine_assembler.getUnlocalizedName()); + register(machine_assembly_machine); GameRegistry.registerBlock(machine_assemfac, machine_assemfac.getUnlocalizedName()); GameRegistry.registerBlock(machine_chemplant, machine_chemplant.getUnlocalizedName()); register(machine_chemical_plant); register(machine_chemfac); register(machine_chemical_factory); + register(machine_purex); register(machine_arc_welder); register(machine_soldering_station); register(machine_arc_furnace); @@ -3514,6 +3547,11 @@ public class ModBlocks { GameRegistry.registerBlock(gas_explosive, gas_explosive.getUnlocalizedName()); GameRegistry.registerBlock(vacuum, vacuum.getUnlocalizedName()); + // OC Compat Items + if (Loader.isModLoaded("OpenComputers")) { + register(oc_cable_paintable); + } + //??? GameRegistry.registerBlock(crystal_virus, crystal_virus.getUnlocalizedName()); GameRegistry.registerBlock(crystal_hardened, crystal_hardened.getUnlocalizedName()); @@ -3531,6 +3569,10 @@ public class ModBlocks { register(wand_air); register(wand_loot); register(wand_jigsaw); + register(wand_logic); + register(wand_tandem); + + register(logic_block); } private static void register(Block b) { diff --git a/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java b/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java index 6eefdf20e..16110461e 100644 --- a/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java +++ b/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java @@ -151,7 +151,7 @@ public class BlockVolcano extends BlockContainer implements ITooltipProvider, IB @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - nbt.setInteger("tier", this.volcanoTimer); + nbt.setInteger("timer", this.volcanoTimer); } private boolean shouldGrow() { diff --git a/src/main/java/com/hbm/blocks/generic/BlockBobble.java b/src/main/java/com/hbm/blocks/generic/BlockBobble.java index ea53feb69..3ba895977 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockBobble.java +++ b/src/main/java/com/hbm/blocks/generic/BlockBobble.java @@ -4,8 +4,8 @@ import com.hbm.inventory.gui.GUIScreenBobble; import com.hbm.items.special.ItemPlasticScrap.ScrapType; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; -import com.hbm.world.gen.INBTTileEntityTransformable; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTTileEntityTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; @@ -34,7 +34,7 @@ import net.minecraft.world.World; import java.util.List; import java.util.Random; -public class BlockBobble extends BlockContainer implements IGUIProvider, INBTTransformable { +public class BlockBobble extends BlockContainer implements IGUIProvider, INBTBlockTransformable { public BlockBobble() { super(Material.iron); diff --git a/src/main/java/com/hbm/blocks/generic/BlockCrate.java b/src/main/java/com/hbm/blocks/generic/BlockCrate.java index e24a62d78..abfebe1d1 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockCrate.java +++ b/src/main/java/com/hbm/blocks/generic/BlockCrate.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Random; import com.hbm.blocks.ModBlocks; +import com.hbm.interfaces.Spaghetti; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; import com.hbm.items.ModItems; @@ -16,6 +17,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; +@Spaghetti("this is implemented in the most braindead fucking way imaginable") // TODO: rework this unholy abomination using configurable loot pools public class BlockCrate extends BlockFalling { List crateList; @@ -69,22 +71,16 @@ public class BlockCrate extends BlockFalling { // Lead Crate BlockCrate.addToListWithWeight(leadList, ModItems.ingot_uranium, 10); - // BlockCrate.addToListWithWeight(leadList, ModItems.ingot_u235, 5); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_u238, 8); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_plutonium, 7); - // BlockCrate.addToListWithWeight(leadList, ModItems.ingot_pu238, 5); - // BlockCrate.addToListWithWeight(leadList, ModItems.ingot_pu239, 4); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_pu240, 6); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_neptunium, 7); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_uranium_fuel, 8); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_plutonium_fuel, 7); BlockCrate.addToListWithWeight(leadList, ModItems.ingot_mox_fuel, 6); BlockCrate.addToListWithWeight(leadList, ModItems.nugget_uranium, 10); - // BlockCrate.addToListWithWeight(leadList, ModItems.nugget_u235, 5); BlockCrate.addToListWithWeight(leadList, ModItems.nugget_u238, 8); BlockCrate.addToListWithWeight(leadList, ModItems.nugget_plutonium, 7); - // BlockCrate.addToListWithWeight(leadList, ModItems.nugget_pu238, 5); - // BlockCrate.addToListWithWeight(leadList, ModItems.nugget_pu239, 4); BlockCrate.addToListWithWeight(leadList, ModItems.nugget_pu240, 6); BlockCrate.addToListWithWeight(leadList, ModItems.nugget_neptunium, 7); BlockCrate.addToListWithWeight(leadList, ModItems.nugget_uranium_fuel, 8); @@ -96,7 +92,6 @@ public class BlockCrate extends BlockFalling { BlockCrate.addToListWithWeight(leadList, ModItems.cell_puf6, 8); BlockCrate.addToListWithWeight(leadList, ModItems.pellet_rtg, 6); BlockCrate.addToListWithWeight(leadList, ModItems.pellet_rtg_weak, 7); - BlockCrate.addToListWithWeight(leadList, ModItems.tritium_deuterium_cake, 5); BlockCrate.addToListWithWeight(leadList, ModItems.powder_yellowcake, 10); // Metal Crate @@ -110,14 +105,13 @@ public class BlockCrate extends BlockFalling { BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_battery), 8); BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_lithium_battery), 5); BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_electric_furnace_off), 8); - BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_assembler), 10); + BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_assembly_machine), 10); BlockCrate.addToListWithWeight(metalList, Item.getItemFromBlock(ModBlocks.machine_fluidtank), 7); BlockCrate.addToListWithWeight(metalList, ModItems.centrifuge_element, 6); BlockCrate.addToListWithWeight(metalList, ModItems.motor, 8); BlockCrate.addToListWithWeight(metalList, ModItems.coil_tungsten, 7); BlockCrate.addToListWithWeight(metalList, ModItems.photo_panel, 3); BlockCrate.addToListWithWeight(metalList, ModItems.coil_copper, 10); - BlockCrate.addToListWithWeight(metalList, ModItems.tank_steel, 9); BlockCrate.addToListWithWeight(metalList, ModItems.blade_titanium, 3); BlockCrate.addToListWithWeight(metalList, ModItems.piston_selenium, 6); diff --git a/src/main/java/com/hbm/blocks/generic/BlockDecoCRT.java b/src/main/java/com/hbm/blocks/generic/BlockDecoCRT.java index b1ede562a..bee8f863e 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDecoCRT.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDecoCRT.java @@ -2,7 +2,7 @@ package com.hbm.blocks.generic; import com.hbm.blocks.BlockMulti; import com.hbm.lib.RefStrings; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; @@ -15,7 +15,7 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class BlockDecoCRT extends BlockMulti implements INBTTransformable { +public class BlockDecoCRT extends BlockMulti implements INBTBlockTransformable { protected String[] variants = new String[] {"crt_clean", "crt_broken", "crt_blinking", "crt_bsod"}; @SideOnly(Side.CLIENT) protected IIcon[] icons; @@ -77,7 +77,7 @@ public class BlockDecoCRT extends BlockMulti implements INBTTransformable { @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDecoModel(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDecoModel(meta, coordBaseMode); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java b/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java index 2e2febe67..fcf9fbc7e 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java @@ -1,7 +1,7 @@ package com.hbm.blocks.generic; import com.hbm.blocks.BlockEnumMulti; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.client.registry.RenderingRegistry; import net.minecraft.block.material.Material; @@ -12,7 +12,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockDecoModel extends BlockEnumMulti implements INBTTransformable { +public class BlockDecoModel extends BlockEnumMulti implements INBTBlockTransformable { public BlockDecoModel(Material mat, Class theEnum, boolean multiName, boolean multiTexture) { super(mat, theEnum, multiName, multiTexture); diff --git a/src/main/java/com/hbm/blocks/generic/BlockDecoToaster.java b/src/main/java/com/hbm/blocks/generic/BlockDecoToaster.java index c35dd1d3b..149cdf7f4 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDecoToaster.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDecoToaster.java @@ -2,7 +2,7 @@ package com.hbm.blocks.generic; import com.hbm.blocks.BlockMulti; import com.hbm.lib.RefStrings; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; @@ -17,7 +17,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockDecoToaster extends BlockMulti implements INBTTransformable { +public class BlockDecoToaster extends BlockMulti implements INBTBlockTransformable { protected String[] variants = new String[] {"toaster_iron", "toaster_steel", "toaster_wood"}; @SideOnly(Side.CLIENT) protected IIcon[] icons; @@ -94,7 +94,7 @@ public class BlockDecoToaster extends BlockMulti implements INBTTransformable { @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDecoModel(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDecoModel(meta, coordBaseMode); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java b/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java index 0e496af45..3dfe4814a 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java @@ -17,6 +17,8 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -92,7 +94,7 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb { @Override public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB entityBox, List collidingBoxes, Entity entityIn) { - AxisAlignedBB box = getBoundingBox(worldIn, x, y ,z); + AxisAlignedBB box = getBoundingBox(worldIn, x, y, z, true); box = AxisAlignedBB.getBoundingBox( Math.min(box.minX, box.maxX), Math.min(box.minY, box.maxY), Math.min(box.minZ, box.maxZ), Math.max(box.minX, box.maxX), Math.max(box.minY, box.maxY), Math.max(box.minZ, box.maxZ)); @@ -111,11 +113,27 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb { @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { - AxisAlignedBB aabb = this.getBoundingBox(world, x, y, z); + AxisAlignedBB aabb = this.getBoundingBox(world, x, y, z, true); if(aabb.minX == aabb.maxX && aabb.minY == aabb.maxY && aabb.minZ == aabb.maxZ) return null; return aabb; } + // Enables clicking through the open door + @Override + public MovingObjectPosition collisionRayTrace(World world, int x, int y, int z, Vec3 startVec, Vec3 endVec) { + AxisAlignedBB box = getBoundingBox(world, x, y, z, false); + box = AxisAlignedBB.getBoundingBox( + Math.min(box.minX, box.maxX), Math.min(box.minY, box.maxY), Math.min(box.minZ, box.maxZ), + Math.max(box.minX, box.maxX), Math.max(box.minY, box.maxY), Math.max(box.minZ, box.maxZ) + ); + + MovingObjectPosition intercept = box.calculateIntercept(startVec, endVec); + if(intercept != null) { + return new MovingObjectPosition(x, y, z, intercept.sideHit, intercept.hitVec); + } + return null; + } + @Override //should fix AI pathfinding public boolean getBlocksMovement(IBlockAccess world, int x, int y, int z) { //btw the method name is the exact opposite of that it's doing, check net.minecraft.pathfinding.PathNavigate#512 return hasExtra(world.getBlockMetadata(x, y, z)); //if it's open @@ -140,11 +158,11 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb { @Override public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { - return getBoundingBox(world, x, y, z); + return getBoundingBox(world, x, y, z, false); //return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1); } - public AxisAlignedBB getBoundingBox(World world, int x, int y, int z) { + public AxisAlignedBB getBoundingBox(World world, int x, int y, int z, boolean forCollision) { int meta = world.getBlockMetadata(x, y, z); TileEntity te = world.getTileEntity(x, y, z); int[] core = this.findCore(world, x, y, z); @@ -155,7 +173,7 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb { TileEntity te2 = world.getTileEntity(core[0], core[1], core[2]); ForgeDirection dir = ForgeDirection.getOrientation(te2.getBlockMetadata() - BlockDummyable.offset); BlockPos pos = new BlockPos(x - core[0], y - core[1], z - core[2]).rotate(Rotation.getBlockRotation(dir).add(Rotation.COUNTERCLOCKWISE_90)); - AxisAlignedBB box = type.getBlockBound(pos.getX(), pos.getY(), pos.getZ(), open); + AxisAlignedBB box = type.getBlockBound(pos.getX(), pos.getY(), pos.getZ(), open, forCollision); switch(te2.getBlockMetadata() - offset){ case 2: return AxisAlignedBB.getBoundingBox(x + 1 - box.minX, y + box.minY, z + 1 - box.minZ, x + 1 - box.maxX, y + box.maxY, z + 1 - box.maxZ); diff --git a/src/main/java/com/hbm/blocks/generic/BlockModDoor.java b/src/main/java/com/hbm/blocks/generic/BlockModDoor.java index 233f8da71..0093135d5 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockModDoor.java +++ b/src/main/java/com/hbm/blocks/generic/BlockModDoor.java @@ -4,7 +4,7 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.items.ModItems; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -21,7 +21,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockModDoor extends Block implements INBTTransformable { +public class BlockModDoor extends Block implements INBTBlockTransformable { @SideOnly(Side.CLIENT) private IIcon[] field_150017_a; @SideOnly(Side.CLIENT) @@ -400,6 +400,6 @@ public class BlockModDoor extends Block implements INBTTransformable { @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDoor(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDoor(meta, coordBaseMode); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockNTMTrapdoor.java b/src/main/java/com/hbm/blocks/generic/BlockNTMTrapdoor.java new file mode 100644 index 000000000..48afba69d --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockNTMTrapdoor.java @@ -0,0 +1,60 @@ +package com.hbm.blocks.generic; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockTrapDoor; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockNTMTrapdoor extends BlockTrapDoor { + public BlockNTMTrapdoor(Material material) { + super(material); + } + + @Override + public boolean isLadder(IBlockAccess world, int x, int y, int z, EntityLivingBase entity) { + int meta = world.getBlockMetadata(x, y, z); + + // isOpen + if (!func_150118_d(meta)) + return false; + + Block blockBelow = world.getBlock(x, y - 1, z); + return blockBelow != null && blockBelow.isLadder(world, x, y - 1, z, entity); + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + // Make the hitbox in-line with ladders, if relevant + if (isLadder(world, x, y, z, null)) { + int meta = world.getBlockMetadata(x, y, z); + float thickness = 0.125F; + + if ((meta & 3) == 0) + return AxisAlignedBB.getBoundingBox(x, y, z + 1F - thickness, x + 1F, y + 1F, z + 1F); + + if ((meta & 3) == 1) + return AxisAlignedBB.getBoundingBox(x, y, z, x + 1F, y + 1F, z + thickness); + + if ((meta & 3) == 2) + return AxisAlignedBB.getBoundingBox(x + 1F - thickness, y, z, x + 1F, y + 1F, z + 1F); + + if ((meta & 3) == 3) + return AxisAlignedBB.getBoundingBox(x, y, z, x + thickness, y + 1F, z + 1F); + } + + return super.getCollisionBoundingBoxFromPool(world, x, y, z); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + // The original code prevented manual operation of Material.iron trapdoors. This bypasses that behavior + int meta = world.getBlockMetadata(x, y, z); + world.setBlockMetadataWithNotify(x, y, z, meta ^ 4, 2); + world.playAuxSFXAtEntity(player, 1003, x, y, z, 0); + return true; + } +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockPipe.java b/src/main/java/com/hbm/blocks/generic/BlockPipe.java index 27eaf3b27..824fc5aae 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockPipe.java +++ b/src/main/java/com/hbm/blocks/generic/BlockPipe.java @@ -4,7 +4,7 @@ import java.util.List; import com.hbm.blocks.ITooltipProvider; import com.hbm.lib.RefStrings; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; @@ -17,7 +17,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.World; -public class BlockPipe extends Block implements ITooltipProvider, INBTTransformable { +public class BlockPipe extends Block implements ITooltipProvider, INBTBlockTransformable { @SideOnly(Side.CLIENT) private IIcon sideIcon; @@ -96,7 +96,7 @@ public class BlockPipe extends Block implements ITooltipProvider, INBTTransforma @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaPillar(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaPillar(meta, coordBaseMode); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockPlushie.java b/src/main/java/com/hbm/blocks/generic/BlockPlushie.java index 848065a84..946961fc4 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockPlushie.java +++ b/src/main/java/com/hbm/blocks/generic/BlockPlushie.java @@ -5,8 +5,8 @@ import java.util.Random; import com.hbm.blocks.IBlockMulti; import com.hbm.blocks.ITooltipProvider; -import com.hbm.world.gen.INBTTileEntityTransformable; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTTileEntityTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -29,7 +29,7 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.StatCollector; import net.minecraft.world.World; -public class BlockPlushie extends BlockContainer implements IBlockMulti, ITooltipProvider, INBTTransformable { +public class BlockPlushie extends BlockContainer implements IBlockMulti, ITooltipProvider, INBTBlockTransformable { public BlockPlushie() { super(Material.cloth); @@ -96,12 +96,16 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + TileEntityPlushie plushie = (TileEntityPlushie) world.getTileEntity(x, y, z); if(world.isRemote) { - TileEntityPlushie plushie = (TileEntityPlushie) world.getTileEntity(x, y, z); plushie.squishTimer = 11; return true; } else { - world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:block.squeakyToy", 0.25F, 1F); + if(plushie.type == PlushieType.HUNDUN) { + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:block.hunduns_magnificent_howl", 100F, 1F); + } else { + world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:block.squeakyToy", 0.25F, 1F); + } return true; } } @@ -155,7 +159,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti NONE( "NONE", null), YOMI( "Yomi", "Hi! Can I be your rabbit friend?"), NUMBERNINE( "Number Nine", "None of y'all deserve coal."), - POOH( "Winnie the Pooh", "Beloved children's character with no malicious intent."); + HUNDUN( "Hundun", "混沌"); public String label; public String inscription; diff --git a/src/main/java/com/hbm/blocks/generic/BlockRebar.java b/src/main/java/com/hbm/blocks/generic/BlockRebar.java new file mode 100644 index 000000000..391533e0a --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockRebar.java @@ -0,0 +1,496 @@ +package com.hbm.blocks.generic; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.config.ClientConfig; +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.tool.ItemRebarPlacer; +import com.hbm.lib.Library; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.main.ServerProxy; +import com.hbm.render.block.ISBRHUniversal; +import com.hbm.render.util.RenderBlocksNT; +import com.hbm.tileentity.IBufPacketReceiver; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.tileentity.network.TileEntityPipeBaseNT; +import com.hbm.uninos.GenNode; +import com.hbm.uninos.INetworkProvider; +import com.hbm.uninos.UniNodespace; +import com.hbm.uninos.networkproviders.RebarNetwork; +import com.hbm.uninos.networkproviders.RebarNetworkProvider; +import com.hbm.util.BobMathUtil; +import com.hbm.util.Compat; +import com.hbm.util.InventoryUtil; +import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.util.fauxpointtwelve.DirPos; + +import api.hbm.fluidmk2.IFluidReceiverMK2; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.MovingObjectPosition.MovingObjectType; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class BlockRebar extends BlockContainer implements ISBRHUniversal { + + @SideOnly(Side.CLIENT) protected IIcon concrete; + + public BlockRebar() { + super(Material.iron); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + super.registerBlockIcons(reg); + this.concrete = reg.registerIcon(RefStrings.MODID + ":concrete_liquid"); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityRebar(); + } + + @Override public int getRenderType() { return renderID; } + @Override public boolean isOpaqueCube() { return false; } + @Override public boolean renderAsNormalBlock() { return false; } + + @Override + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + TileEntity tile = world.getTileEntity(x, y, z); + if(!(tile instanceof TileEntityRebar)) return; + + TileEntityRebar rebar = (TileEntityRebar) tile; + rebar.hasConnection = false; + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + TileEntity neighbor = Compat.getTileStandard(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); + if(neighbor instanceof TileEntityPipeBaseNT) { + rebar.hasConnection = true; + return; + } + } + } + + public static class TileEntityRebar extends TileEntityLoadedBase implements IFluidReceiverMK2, IBufPacketReceiver { + + public Block concrete; + public int concreteMeta; + public int progress; + public int prevProgress; + protected RebarNode node; + public boolean hasConnection = false; + + public TileEntityRebar setup(Block b, int m) { + this.concrete = b; + this.concreteMeta = m; + return this; + } + + @Override + public void updateEntity() { + + long time = worldObj.getTotalWorldTime(); + + if(!worldObj.isRemote) { + + if(prevProgress != progress) { + worldObj.markTileEntityChunkModified(xCoord, yCoord, zCoord, this); + prevProgress = progress; + } + + if(this.progress >= 1_000) { + if(concrete != null && ItemRebarPlacer.isValidConk(Item.getItemFromBlock(concrete), concreteMeta)) { + worldObj.setBlock(xCoord, yCoord, zCoord, concrete, concreteMeta, 3); + } else { + worldObj.setBlock(xCoord, yCoord, zCoord, ModBlocks.concrete_rebar); + } + return; + } + + if(time % 60 == 0) { + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + this.trySubscribe(Fluids.CONCRETE, worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + } + } + + if(this.node == null || this.node.expired) { + + this.node = (RebarNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, RebarNetworkProvider.THE_PROVIDER); + + if(this.node == null || this.node.expired) { + this.node = this.createNode(); + UniNodespace.createNode(worldObj, this.node); + } + } + + this.networkPackNT(100); + } + } + + @Override + public void invalidate() { + super.invalidate(); + + if(!worldObj.isRemote) { + if(this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, RebarNetworkProvider.THE_PROVIDER); + } + } + } + + @Override public void serialize(ByteBuf buf) { buf.writeInt(progress); } + @Override public void deserialize(ByteBuf buf) { this.progress = buf.readInt(); } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.progress = nbt.getInteger("progress"); + this.hasConnection = nbt.getBoolean("hasConnection"); + + if(nbt.hasKey("block")) { + this.concrete = Block.getBlockById(nbt.getInteger("block")); + this.concreteMeta = nbt.getInteger("meta"); + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("progress", this.progress); + nbt.setBoolean("hasConnection", this.hasConnection); + + if(this.concrete != null) { + nbt.setInteger("block", Block.getIdFromBlock(this.concrete)); + nbt.setInteger("meta", this.concreteMeta); + } + } + + public RebarNode createNode() { + TileEntity tile = (TileEntity) this; + return new RebarNode(RebarNetworkProvider.THE_PROVIDER, new BlockPos(tile.xCoord, tile.yCoord, tile.zCoord)).setConnections( + new DirPos(tile.xCoord + 1, tile.yCoord, tile.zCoord, Library.POS_X), + new DirPos(tile.xCoord - 1, tile.yCoord, tile.zCoord, Library.NEG_X), + new DirPos(tile.xCoord, tile.yCoord + 1, tile.zCoord, Library.POS_Y), + new DirPos(tile.xCoord, tile.yCoord - 1, tile.zCoord, Library.NEG_Y), + new DirPos(tile.xCoord, tile.yCoord, tile.zCoord + 1, Library.POS_Z), + new DirPos(tile.xCoord, tile.yCoord, tile.zCoord - 1, Library.NEG_Z) + ); + } + + @Override + public FluidTank[] getAllTanks() { + FluidTank tank = new FluidTank(Fluids.CONCRETE, 1_000); + tank.setFill(progress); + return new FluidTank[] {tank}; + } + + @Override + public long transferFluid(FluidType type, int pressure, long amount) { + if(type != Fluids.CONCRETE) return amount; + if(this.node == null || this.node.expired || !this.node.hasValidNet()) return amount; + + List lowestLinks = new ArrayList(); + int lowestY = 256; + int progress = 0; + int capacity = 0; + + for(Object o : this.node.net.links) { + RebarNode node = (RebarNode) o; + int y = node.positions[0].getY(); //rebar can only have one pos, there's no multiblock rebar + + if(y < lowestY) { + lowestY = y; + progress = 0; + capacity = 0; + lowestLinks.clear(); + } + + if(y == lowestY) { + TileEntity tile = worldObj.getTileEntity(node.positions[0].getX(), y, node.positions[0].getZ()); + if(!(tile instanceof TileEntityRebar)) continue; + + TileEntityRebar rebar = (TileEntityRebar) tile; + + progress += rebar.progress; + capacity += 1_000; + lowestLinks.add(rebar); + } + } + + if(capacity > 0 && !lowestLinks.isEmpty()) { + int maxSpeed = 50; + int maxAccept = (int) BobMathUtil.min(capacity - progress, amount, maxSpeed * lowestLinks.size()); + int target = Math.min((progress + maxAccept) / lowestLinks.size(), 1_000); + + for(TileEntityRebar rebar : lowestLinks) { + if(rebar.progress >= target) continue; + int delta = target - rebar.progress; + if(delta > amount) continue; + + rebar.progress += delta; + amount -= delta; + } + } + + return amount; + } + + @Override + public long getDemand(FluidType type, int pressure) { + return 10_000; + } + } + + public static class RebarNode extends GenNode { + + public RebarNode(INetworkProvider provider, BlockPos... positions) { + super(provider, positions); + } + + @Override + public RebarNode setConnections(DirPos... connections) { + super.setConnections(connections); + return this; + } + } + + @Override + public void renderInventoryBlock(Block block, int meta, int modelId, Object renderBlocks) { + + GL11.glPushMatrix(); + RenderBlocks renderer = (RenderBlocks) renderBlocks; + GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + double o = 0.25D; + renderer.setRenderBounds(0.4375D - o, 0D, 0.4375D - o, 0.5625D - o, 1D, 0.5625D - o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0.4375D - o, 0D, 0.4375D + o, 0.5625D - o, 1D, 0.5625D + o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0.4375D + o, 0D, 0.4375D - o, 0.5625D + o, 1D, 0.5625D - o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0.4375D + o, 0D, 0.4375D + o, 0.5625D + o, 1D, 0.5625D + o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + + renderer.setRenderBounds(0D, 0.4375D - o, 0.4375D - o, 1D, 0.5625D - o, 0.5625D - o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0D, 0.4375D - o, 0.4375D + o, 1D, 0.5625D - o, 0.5625D + o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0D, 0.4375D + o, 0.4375D - o, 1D, 0.5625D + o, 0.5625D - o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0D, 0.4375D + o, 0.4375D + o, 1D, 0.5625D + o, 0.5625D + o); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + + renderer.setRenderBounds(0.4375D - o, 0.4375D - o, 0D, 0.5625D - o, 0.5625D - o, 1D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0.4375D - o, 0.4375D + o, 0D, 0.5625D - o, 0.5625D + o, 1D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0.4375D + o, 0.4375D - o, 0D, 0.5625D + o, 0.5625D - o, 1D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0.4375D + o, 0.4375D + o, 0D, 0.5625D + o, 0.5625D + o, 1D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, Object renderBlocks) { + + RenderBlocksNT renderer = RenderBlocksNT.INSTANCE.setWorld(world); + + Tessellator tessellator = Tessellator.instance; + tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z)); + tessellator.setColorOpaque_F(1, 1, 1); + + double o = 0.25D; + double min = -0.001; + double max = 1.001; + + if(ClientConfig.RENDER_REBAR_SIMPLE.get()) { + renderer.setRenderBounds(0.4375D, min, 0.4375D, 0.5625D, max, 0.5625D); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(min, 0.4375D, 0.4375D, max, 0.5625D, 0.5625D); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0.4375D, 0.4375D, min, 0.5625D, 0.5625D, max); renderer.renderStandardBlock(block, x, y, z); + } else { + renderer.setRenderBounds(0.4375D - o, min, 0.4375D - o, 0.5625D - o, max, 0.5625D - o); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0.4375D - o, min, 0.4375D + o, 0.5625D - o, max, 0.5625D + o); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0.4375D + o, min, 0.4375D - o, 0.5625D + o, max, 0.5625D - o); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0.4375D + o, min, 0.4375D + o, 0.5625D + o, max, 0.5625D + o); renderer.renderStandardBlock(block, x, y, z); + + renderer.setRenderBounds(min, 0.4375D - o, 0.4375D - o, max, 0.5625D - o, 0.5625D - o); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(min, 0.4375D - o, 0.4375D + o, max, 0.5625D - o, 0.5625D + o); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(min, 0.4375D + o, 0.4375D - o, max, 0.5625D + o, 0.5625D - o); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(min, 0.4375D + o, 0.4375D + o, max, 0.5625D + o, 0.5625D + o); renderer.renderStandardBlock(block, x, y, z); + + renderer.setRenderBounds(0.4375D - o, 0.4375D - o, min, 0.5625D - o, 0.5625D - o, max); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0.4375D - o, 0.4375D + o, min, 0.5625D - o, 0.5625D + o, max); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0.4375D + o, 0.4375D - o, min, 0.5625D + o, 0.5625D - o, max); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0.4375D + o, 0.4375D + o, min, 0.5625D + o, 0.5625D + o, max); renderer.renderStandardBlock(block, x, y, z); + } + + /*TileEntity tile = world.getTileEntity(x, y, z); + if(tile instanceof TileEntityRebar) { + TileEntityRebar rebar = (TileEntityRebar) tile; + if(rebar.progress > 0) { + double height = rebar.progress / 1000D; + renderer.setOverrideBlockTexture(concrete); + renderer.setRenderBounds(0, 0, 0, 1, height, 1); renderer.renderStandardBlock(block, x, y, z); + renderer.clearOverrideBlockTexture(); + } + }*/ + + return true; + } + + // from ModEventHandlerClient.onRenderWorldLastEvent + @SideOnly(Side.CLIENT) + public static void renderRebar(List tiles, float interp) { + + List rebars = new ArrayList(); + for(Object o : tiles) { + if(!(o instanceof TileEntityRebar)) continue; + TileEntityRebar rebar = (TileEntityRebar) o; + if(rebar.progress > 0) rebars.add(rebar); + } + + Minecraft mc = Minecraft.getMinecraft(); + EntityPlayer player = mc.thePlayer; + World world = mc.theWorld; + + double dx = player.prevPosX + (player.posX - player.prevPosX) * interp; + double dy = player.prevPosY + (player.posY - player.prevPosY) * interp; + double dz = player.prevPosZ + (player.posZ - player.prevPosZ) * interp; + + if(!rebars.isEmpty()) { + + GL11.glPushMatrix(); + GL11.glShadeModel(GL11.GL_SMOOTH); + //RenderHelper.enableStandardItemLighting(); + + EntityRenderer entityRenderer = mc.entityRenderer; + entityRenderer.enableLightmap(interp); + + RenderBlocksNT renderer = RenderBlocksNT.INSTANCE.setWorld(world); + renderer.setOverrideBlockTexture(((BlockRebar) ModBlocks.rebar).concrete); + mc.getTextureManager().bindTexture(TextureMap.locationBlocksTexture); + + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + + for(TileEntityRebar rebar : rebars) { + tess.setTranslation(-dx, -dy, -dz); + tess.setColorRGBA_F(1F, 1F, 1F, 1F); + renderer.setRenderBounds(0, 0, 0, 1, rebar.progress / 1000D, 1); + renderer.renderStandardBlock(ModBlocks.rebar, rebar.xCoord, rebar.yCoord, rebar.zCoord); + } + + tess.draw(); + tess.setTranslation(0, 0, 0); + renderer.clearOverrideBlockTexture(); + entityRenderer.disableLightmap(interp); + + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glPopMatrix(); + } + + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.rebar_placer && player.getHeldItem().hasTagCompound() && + player.getHeldItem().stackTagCompound.hasKey("pos") && mc.objectMouseOver != null && mc.objectMouseOver.typeOfHit == MovingObjectType.BLOCK) { + + int[] pos = player.getHeldItem().stackTagCompound.getIntArray("pos"); + MovingObjectPosition mop = mc.objectMouseOver; + ForgeDirection dir = ForgeDirection.getOrientation(mop.sideHit); + int iX = mop.blockX + dir.offsetX; + int iY = mop.blockY + dir.offsetY; + int iZ = mop.blockZ + dir.offsetZ; + + double minX = Math.min(pos[0], iX) + 0.125; + double maxX = Math.max(pos[0], iX) + 0.875; + double minY = Math.min(pos[1], iY) + 0.125; + double maxY = Math.max(pos[1], iY) + 0.875; + double minZ = Math.min(pos[2], iZ) + 0.125; + double maxZ = Math.max(pos[2], iZ) + 0.875; + + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glColor3f(1F, 1F, 1F); + + Tessellator tess = Tessellator.instance; + tess.setTranslation(-dx, -dy, -dz); + tess.startDrawing(GL11.GL_LINES); + tess.setBrightness(240); + tess.setColorRGBA_F(1F, 1F, 1F, 1F); + + // top + tess.addVertex(minX, maxY, minZ); + tess.addVertex(minX, maxY, maxZ); + + tess.addVertex(minX, maxY, maxZ); + tess.addVertex(maxX, maxY, maxZ); + + tess.addVertex(maxX, maxY, maxZ); + tess.addVertex(maxX, maxY, minZ); + + tess.addVertex(maxX, maxY, minZ); + tess.addVertex(minX, maxY, minZ); + + // bottom + tess.addVertex(minX, minY, minZ); + tess.addVertex(minX, minY, maxZ); + + tess.addVertex(minX, minY, maxZ); + tess.addVertex(maxX, minY, maxZ); + + tess.addVertex(maxX, minY, maxZ); + tess.addVertex(maxX, minY, minZ); + + tess.addVertex(maxX, minY, minZ); + tess.addVertex(minX, minY, minZ); + + // sides + tess.addVertex(minX, minY, minZ); + tess.addVertex(minX, maxY, minZ); + + tess.addVertex(maxX, minY, minZ); + tess.addVertex(maxX, maxY, minZ); + + tess.addVertex(maxX, minY, maxZ); + tess.addVertex(maxX, maxY, maxZ); + + tess.addVertex(minX, minY, maxZ); + tess.addVertex(minX, maxY, maxZ); + + tess.draw(); + tess.setTranslation(0, 0, 0); + + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glPopMatrix(); + + int rebarLeft = InventoryUtil.countAStackMatches(player, new ComparableStack(ModBlocks.rebar), true); + int rebarRequired = (Math.max(pos[0], iX) - Math.min(pos[0], iX) + 1) * (Math.max(pos[1], iY) - Math.min(pos[1], iY) + 1) * (Math.max(pos[2], iZ) - Math.min(pos[2], iZ) + 1); + MainRegistry.proxy.displayTooltip((rebarRequired > rebarLeft ? EnumChatFormatting.RED : EnumChatFormatting.GREEN) + (rebarLeft + " / " + rebarRequired), 1_000, ServerProxy.ID_CABLE); + } + } +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java b/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java index 63076df31..d64470934 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java @@ -18,7 +18,7 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BufferUtil; import com.hbm.util.i18n.I18nUtil; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.common.registry.GameRegistry; @@ -47,7 +47,7 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; -public class BlockWandJigsaw extends BlockContainer implements IBlockSideRotation, INBTTransformable, IGUIProvider, ILookOverlay { +public class BlockWandJigsaw extends BlockContainer implements IBlockSideRotation, INBTBlockTransformable, IGUIProvider, ILookOverlay { private IIcon iconTop; private IIcon iconSide; @@ -123,7 +123,7 @@ public class BlockWandJigsaw extends BlockContainer implements IBlockSideRotatio @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); } @Override diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java b/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java new file mode 100644 index 000000000..734345786 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java @@ -0,0 +1,345 @@ +package com.hbm.blocks.generic; + +import api.hbm.block.IToolable; +import com.hbm.blocks.IBlockSideRotation; +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.blocks.ModBlocks; +import com.hbm.config.StructureConfig; +import com.hbm.interfaces.IBomb; +import com.hbm.interfaces.ICopiable; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.BufferUtil; +import com.hbm.util.i18n.I18nUtil; +import com.hbm.world.gen.nbt.INBTTileEntityTransformable; +import com.hbm.world.gen.util.LogicBlockActions; +import com.hbm.world.gen.util.LogicBlockConditions; +import com.hbm.world.gen.util.LogicBlockInteractions; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +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; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.ArrayList; +import java.util.List; + +public class BlockWandLogic extends BlockContainer implements ILookOverlay, IToolable, ITooltipProvider, IBlockSideRotation, IBomb { + + @SideOnly(Side.CLIENT) protected IIcon iconTop; + + public BlockWandLogic() { + super(Material.iron); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_logic"); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_logic_top"); + } + + @Override + public IIcon getIcon(int side, int meta) { + return (side <= 1) ? iconTop : blockIcon; + } + + @Override + public int getRotationFromSide(IBlockAccess world, int x, int y, int z, int side) { + if(side == 0) return IBlockSideRotation.topToBottom(world.getBlockMetadata(x, y, z)); + if(side == 1) return world.getBlockMetadata(x, y, z); + return 0; + } + + @Override + public int getRenderType() { + return IBlockSideRotation.getRenderType(); + } + + @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, 3, 2); + if (i == 1) world.setBlockMetadataWithNotify(x, y, z, 2, 2); + if (i == 2) world.setBlockMetadataWithNotify(x, y, z, 0, 2); + if (i == 3) world.setBlockMetadataWithNotify(x, y, z, 1, 2); + + ForgeDirection dir = ForgeDirection.UNKNOWN; + switch(i){ + case 0: dir = ForgeDirection.SOUTH;break; + case 1: dir = ForgeDirection.WEST; break; + case 2: dir = ForgeDirection.NORTH;break; + case 3: dir = ForgeDirection.EAST; break; + } + TileEntity te = world.getTileEntity(x, y, z); + if(te instanceof TileEntityWandLogic) + ((TileEntityWandLogic)te).placedRotation = dir.ordinal(); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { + + ItemStack stack = player.getHeldItem(); + + if (stack != null && stack.getItem() instanceof ItemBlock && !player.isSneaking()) { + ItemBlock ib = (ItemBlock) stack.getItem(); + Block block = ib.field_150939_a; + + if (block.renderAsNormalBlock() && block != this) { + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityWandLogic){ + TileEntityWandLogic logic = (TileEntityWandLogic) tile; + logic.disguise = block; + logic.disguiseMeta = stack.getItemDamage() & 15; + return true; + } + } + } + return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); + } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandLogic)) return false; + + TileEntityWandLogic logic = (TileEntityWandLogic) te; + + switch(tool) { + case SCREWDRIVER: + List actionNames = LogicBlockActions.getActionNames(); + int indexA = actionNames.indexOf(logic.actionID); + + indexA += player.isSneaking() ? -1 : 1; + indexA = MathHelper.clamp_int(indexA, 0, actionNames.size() - 1); + + logic.actionID = actionNames.get(indexA); + return true; + case DEFUSER: + List conditionNames = LogicBlockConditions.getConditionNames(); + int indexC = conditionNames.indexOf(logic.conditionID); + + indexC += player.isSneaking() ? -1 : 1; + indexC = MathHelper.clamp_int(indexC, 0, conditionNames.size() - 1); + + logic.conditionID = conditionNames.get(indexC); + + return true; + case HAND_DRILL: + List interactionNames = LogicBlockInteractions.getInteractionNames(); + int indexI = interactionNames.indexOf(logic.interactionID); + + indexI += player.isSneaking() ? -1 : 1; + indexI = MathHelper.clamp_int(indexI, 0, interactionNames.size() - 1); + + logic.interactionID = interactionNames.get(indexI); + + return true; + + default: return false; + } + } + + @Override + public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandLogic)) return; + + TileEntityWandLogic logic = (TileEntityWandLogic) te; + + List text = new ArrayList<>(); + text.add("Action: " + logic.actionID); + text.add("Condition: " + logic.conditionID); + text.add("Interaction: " + (logic.interactionID != null ? logic.interactionID : "None")); + + String block; + + if(logic.disguise != null && logic.disguise != Blocks.air) + block = I18nUtil.resolveKey(logic.disguise.getUnlocalizedName() + ".name"); + else + block = "None"; + + text.add("Disguise Block: " + block); + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + list.add(EnumChatFormatting.GOLD + "Use screwdriver to cycle forwards through the action list, shift click to go back"); + list.add(EnumChatFormatting.GOLD + "Use defuser to cycle forwards through the condition list, shift click to go back"); + list.add(EnumChatFormatting.GOLD + "Use hand drill to cycle forwards through the interaction list, shift click to go back"); + list.add(EnumChatFormatting.YELLOW + "Use a detonator to transform"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityWandLogic(); + } + + @Override + public BombReturnCode explode(World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandLogic)) return null; + + ((TileEntityWandLogic) te).triggerReplace = true; + + return BombReturnCode.TRIGGERED; + } + + public static class TileEntityWandLogic extends TileEntityLoadedBase implements INBTTileEntityTransformable, ICopiable { + private boolean triggerReplace; + + public int placedRotation; + + Block disguise; + int disguiseMeta = -1; + + public String actionID = "FODDER_WAVE"; + public String conditionID = "PLAYER_CUBE_5"; + public String interactionID; + + @Override + public void updateEntity() { + if(!worldObj.isRemote) { + if(triggerReplace) { + // On the first tick of this TE, replace with intended block and fill with loot + replace(); + } else { + networkPackNT(15); + } + } + } + + private void replace() { + if (!(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockWandLogic)) { + MainRegistry.logger.warn("Somehow the block at: " + xCoord + ", " + yCoord + ", " + zCoord + " isn't a logic block but we're doing a TE update as if it is, cancelling!"); + return; + } + worldObj.setBlock(xCoord,yCoord,zCoord, ModBlocks.logic_block); + + TileEntity te = worldObj.getTileEntity(xCoord, yCoord, zCoord); + + if(te == null || te instanceof BlockWandLoot.TileEntityWandLoot) { + MainRegistry.logger.warn("TE for logic block set incorrectly at: " + xCoord + ", " + yCoord + ", " + zCoord + ". If you're using some sort of world generation mod, report it to the author!"); + te = ModBlocks.wand_logic.createTileEntity(worldObj, 0); + worldObj.setTileEntity(xCoord, yCoord, zCoord, te); + } + + if(te instanceof LogicBlock.TileEntityLogicBlock){ + LogicBlock.TileEntityLogicBlock logic = (LogicBlock.TileEntityLogicBlock) te; + logic.actionID = actionID; + logic.conditionID = conditionID; + logic.interactionID = interactionID; + logic.direction = ForgeDirection.getOrientation(placedRotation); + logic.disguise = disguise; + logic.disguiseMeta = disguiseMeta; + } + + } + + @Override + public void transformTE(World world, int coordBaseMode) { + triggerReplace = !StructureConfig.debugStructures; + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + if(interactionID != null) + nbt.setString("interactionID", interactionID); + nbt.setInteger("rotation", placedRotation); + if(disguise != null){ + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); + nbt.setInteger("disguiseMeta", disguiseMeta); + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + actionID = nbt.getString("actionID"); + conditionID = nbt.getString("conditionID"); + if(nbt.hasKey("interactionID")) + interactionID = nbt.getString("interactionID"); + placedRotation = nbt.getInteger("rotation"); + if(nbt.hasKey("disguise")){ + disguise = Block.getBlockFromName(nbt.getString("disguise")); + disguiseMeta = nbt.getInteger("disguiseMeta"); + } + } + + @Override + public void serialize(ByteBuf buf) { + buf.writeInt(placedRotation); + BufferUtil.writeString(buf, actionID); + BufferUtil.writeString(buf, conditionID); + BufferUtil.writeString(buf, interactionID); + buf.writeInt(Block.getIdFromBlock(disguise)); + buf.writeInt(disguiseMeta); + } + + @Override + public void deserialize(ByteBuf buf) { + placedRotation = buf.readInt(); + actionID = BufferUtil.readString(buf); + conditionID = BufferUtil.readString(buf); + interactionID = BufferUtil.readString(buf); + disguise = Block.getBlockById(buf.readInt()); + disguiseMeta = buf.readInt(); + } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + if(interactionID != null) + nbt.setString("interactionID", interactionID); + if(disguise != null){ + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); + nbt.setInteger("disguiseMeta", disguiseMeta); + } + + return nbt; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + actionID = nbt.getString("actionID"); + conditionID = nbt.getString("conditionID"); + interactionID = nbt.getString("interactionID"); + if(nbt.hasKey("disguise")){ + disguise = Block.getBlockFromName(nbt.getString("disguise")); + disguiseMeta = nbt.getInteger("disguiseMeta"); + } + } + } +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java b/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java index bf457843d..cf5cebce0 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java @@ -17,7 +17,7 @@ import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BufferUtil; import com.hbm.util.LootGenerator; import com.hbm.util.i18n.I18nUtil; -import com.hbm.world.gen.INBTTileEntityTransformable; +import com.hbm.world.gen.nbt.INBTTileEntityTransformable; import com.mojang.authlib.GameProfile; import api.hbm.block.IToolable; diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandTandem.java b/src/main/java/com/hbm/blocks/generic/BlockWandTandem.java new file mode 100644 index 000000000..1ad176e63 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockWandTandem.java @@ -0,0 +1,438 @@ +package com.hbm.blocks.generic; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.input.Keyboard; + +import com.hbm.blocks.IBlockSideRotation; +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ModBlocks; +import com.hbm.interfaces.IControlReceiver; +import com.hbm.items.ModItems; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.BufferUtil; +import com.hbm.util.i18n.I18nUtil; +import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.world.gen.nbt.INBTBlockTransformable; +import com.hbm.world.gen.nbt.NBTStructure; +import com.hbm.world.gen.nbt.NBTStructure.JigsawConnection; +import com.hbm.world.gen.nbt.SpawnCondition; +import com.hbm.world.gen.nbt.JigsawPiece; +import com.hbm.world.gen.nbt.JigsawPool; + +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.BlockPistonBase; +import net.minecraft.block.material.Material; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import net.minecraftforge.common.util.ForgeDirection; + +/** + * You're familiar with Billy Mitchell, World Video Game Champion? He could probably do it. + * So I gotta find a way to harness his power. And I think I've found a way. + * + * THAT'S RIGHT, WE'RE GONNA CHEAT. + * + * NBTStructures have the inherent flaws of the vanilla structure system: Structures are composed + * before terrain gen even kicks in, placement order of components are arbitrary and certain + * connected parts will fall apart due to unexpected variance in the terrain. Not good. + * The solution: Simply delay generation of parts using a tile entity that checks if the chunks + * in front of it are loaded, and then places a random part from the chosen pool. When this happens, + * the player is usually still far far away so they'll be none the wiser. Chunk load checks help + * prevent forced chunk loading and all the lag that comes with that. + * + * The system is named after tandem shaped charges: Make a hole with the first charge, then deliver + * the actual payload. + * + * @author hbm, Mellow + */ +public class BlockWandTandem extends BlockContainer implements IBlockSideRotation, INBTBlockTransformable, IGUIProvider, ILookOverlay { + + private IIcon iconTop; + private IIcon iconSide; + private IIcon iconBack; + + public BlockWandTandem() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityWandTandem(); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { + int l = BlockPistonBase.determineOrientation(world, x, y, z, player); + world.setBlockMetadataWithNotify(x, y, z, l, 2); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_tandem"); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_tandem_top"); + this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":wand_tandem_side"); + this.iconBack = iconRegister.registerIcon(RefStrings.MODID + ":wand_tandem_back"); + } + + @Override + public IIcon getIcon(int side, int meta) { + if(side == meta) return blockIcon; + if(IBlockSideRotation.isOpposite(side, meta)) return iconBack; + if(side <= 1) return iconTop; + if(side > 3 && meta <= 1) return iconTop; + return iconSide; + } + + @Override + public int getRotationFromSide(IBlockAccess world, int x, int y, int z, int side) { + if(side == 0) return IBlockSideRotation.topToBottom(getRotationFromSide(world, x, y, z, 1)); + + int meta = world.getBlockMetadata(x, y, z); + if(side == meta || IBlockSideRotation.isOpposite(side, meta)) return 0; + + // downwards facing has no changes, upwards flips anything not handled already + if(meta == 0) return 0; + if(meta == 1) return 3; + + // top (and bottom) is rotated fairly normally + if(side == 1) { + switch(meta) { + case 2: return 3; + case 3: return 0; + case 4: return 1; + case 5: return 2; + } + } + + // you know what I aint explaining further, it's a fucking mess here + if(meta == 2) return side == 4 ? 2 : 1; + if(meta == 3) return side == 4 ? 1 : 2; + if(meta == 4) return side == 2 ? 1 : 2; + if(meta == 5) return side == 2 ? 2 : 1; + + return 0; + } + + @Override + public int getRenderType() { + return IBlockSideRotation.getRenderType(); + } + + @Override + public int transformMeta(int meta, int coordBaseMode) { + return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandTandem)) return false; + + TileEntityWandTandem jigsaw = (TileEntityWandTandem) te; + + if(player.getHeldItem() != null && player.getHeldItem().getItem() == Items.paper) { + TileEntityWandTandem.copyMode = true; + if(!player.getHeldItem().hasTagCompound()) { + player.getHeldItem().stackTagCompound = new NBTTagCompound(); + jigsaw.writeToNBT(player.getHeldItem().stackTagCompound); + } else { + jigsaw.readFromNBT(player.getHeldItem().stackTagCompound); + jigsaw.markDirty(); + } + TileEntityWandTandem.copyMode = false; + return true; + } + + if(!player.isSneaking()) { + Block block = getBlock(world, player.getHeldItem()); + if(block == ModBlocks.wand_air) block = Blocks.air; + + if(block != null && block != ModBlocks.wand_jigsaw && block != ModBlocks.wand_loot) { + jigsaw.replaceBlock = block; + jigsaw.replaceMeta = player.getHeldItem().getItemDamage(); + jigsaw.markDirty(); + + return true; + } + + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.wand_s) return false; + + if(world.isRemote) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + + return true; + } + + return false; + } + + private Block getBlock(World world, ItemStack stack) { + if(stack == null) return null; + if(!(stack.getItem() instanceof ItemBlock)) return null; + + return ((ItemBlock) stack.getItem()).field_150939_a; + } + + @Override + @SideOnly(Side.CLIENT) + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GuiWandTandem((TileEntityWandTandem) world.getTileEntity(x, y, z)); + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + if(!(te instanceof TileEntityWandTandem)) return; + TileEntityWandTandem jigsaw = (TileEntityWandTandem) te; + + List text = new ArrayList(); + + text.add(EnumChatFormatting.GRAY + "Target pool: " + EnumChatFormatting.RESET + jigsaw.pool); + text.add(EnumChatFormatting.GRAY + "Target name: " + EnumChatFormatting.RESET + jigsaw.target); + text.add(EnumChatFormatting.GRAY + "Turns into: " + EnumChatFormatting.RESET + GameRegistry.findUniqueIdentifierFor(jigsaw.replaceBlock).toString()); + text.add(EnumChatFormatting.GRAY + " with meta: " + EnumChatFormatting.RESET + jigsaw.replaceMeta); + text.add(EnumChatFormatting.GRAY + "Joint type: " + EnumChatFormatting.RESET + (jigsaw.isRollable ? "Rollable" : "Aligned")); + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + + + public static class TileEntityWandTandem extends TileEntityLoadedBase implements IControlReceiver { + + public static boolean copyMode = false; + + private String pool = "default"; + private String target = "default"; + private Block replaceBlock = Blocks.air; + private int replaceMeta = 0; + private boolean isRollable = true; // sets joint type, rollable joints can be placed in any orientation for vertical jigsaw connections + + private boolean isArmed = false; + private SpawnCondition structure; + + @Override + public void updateEntity() { + if(!worldObj.isRemote) { + tryGenerate(); + networkPackNT(15); + } + } + + private void tryGenerate() { + if(!this.isArmed || target == null || target.isEmpty() || pool == null || pool.isEmpty()) return; + + JigsawPool pool = structure.getPool(this.pool); + if(pool == null) return; + + JigsawPiece nextPiece = pool.get(worldObj.rand); + if(nextPiece == null) return; + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()); + + List connectionPool = nextPiece.structure.getConnectionPool(dir, target); + if(connectionPool == null) return; + + JigsawConnection toConnection = connectionPool.get(worldObj.rand.nextInt(connectionPool.size())); + int nextCoordBase = directionOffsetToCoordBase(dir.getOpposite(), toConnection.dir); + + BlockPos pos = new BlockPos(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); + + // offset the starting point to the connecting point + int ox = nextPiece.structure.rotateX(toConnection.pos.x, toConnection.pos.z, nextCoordBase); + int oy = toConnection.pos.y; + int oz = nextPiece.structure.rotateZ(toConnection.pos.x, toConnection.pos.z, nextCoordBase); + + nextPiece.structure.build(worldObj, nextPiece, pos.getX() - ox, pos.getY() - oy, pos.getZ() - oz, nextCoordBase, structure.name); + + worldObj.setBlock(xCoord, yCoord, zCoord, replaceBlock, replaceMeta, 2); + } + + private int directionOffsetToCoordBase(ForgeDirection from, ForgeDirection to) { + for(int i = 0; i < 4; i++) { + if(from == to) return i % 4; + from = from.getRotation(ForgeDirection.DOWN); + } + return 0; + } + + @Override + public void serialize(ByteBuf buf) { + BufferUtil.writeString(buf, pool); + BufferUtil.writeString(buf, target); + buf.writeInt(Block.getIdFromBlock(replaceBlock)); + buf.writeInt(replaceMeta); + buf.writeBoolean(isRollable); + } + + @Override + public void deserialize(ByteBuf buf) { + pool = BufferUtil.readString(buf); + target = BufferUtil.readString(buf); + replaceBlock = Block.getBlockById(buf.readInt()); + replaceMeta = buf.readInt(); + isRollable = buf.readBoolean(); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + if(!copyMode) { + super.writeToNBT(nbt); + nbt.setInteger("direction", this.getBlockMetadata()); + if(isArmed) { + nbt.setBoolean("isArmed", isArmed); + nbt.setString("structure", structure.name); + } + } + + nbt.setString("pool", pool); + nbt.setString("target", target); + nbt.setString("block", GameRegistry.findUniqueIdentifierFor(replaceBlock).toString()); + nbt.setInteger("meta", replaceMeta); + nbt.setBoolean("roll", isRollable); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + if(!copyMode) { + super.readFromNBT(nbt); + isArmed = nbt.getBoolean("isArmed"); + structure = NBTStructure.getStructure(nbt.getString("structure")); + } + + pool = nbt.getString("pool"); + target = nbt.getString("target"); + replaceBlock = Block.getBlockFromName(nbt.getString("block")); + replaceMeta = nbt.getInteger("meta"); + isRollable = nbt.getBoolean("roll"); + } + + @Override + public boolean hasPermission(EntityPlayer player) { + return true; + } + + @Override + public void receiveControl(NBTTagCompound nbt) { + readFromNBT(nbt); + markDirty(); + } + + public void arm(SpawnCondition structure) { + isArmed = true; + this.structure = structure; + } + + } + + public static class GuiWandTandem extends GuiScreen { + + private final TileEntityWandTandem jigsaw; + + private GuiTextField textPool; + private GuiTextField textTarget; + + private GuiButton jointToggle; + + public GuiWandTandem(TileEntityWandTandem jigsaw) { + this.jigsaw = jigsaw; + } + + @Override + public void initGui() { + Keyboard.enableRepeatEvents(true); + + textPool = new GuiTextField(fontRendererObj, this.width / 2 - 150, 50, 300, 20); + textPool.setText(jigsaw.pool); + + textTarget = new GuiTextField(fontRendererObj, this.width / 2 + 10, 100, 140, 20); + textTarget.setText(jigsaw.target); + + jointToggle = new GuiButton(0, this.width / 2 + 60, 150, 90, 20, jigsaw.isRollable ? "Rollable" : "Aligned"); + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + drawDefaultBackground(); + + drawString(fontRendererObj, "Target pool:", this.width / 2 - 150, 37, 0xA0A0A0); + textPool.drawTextBox(); + + drawString(fontRendererObj, "Target name:", this.width / 2 + 10, 87, 0xA0A0A0); + textTarget.drawTextBox(); + + drawString(fontRendererObj, "Joint type:", this.width / 2 + 60, 137, 0xA0A0A0); + jointToggle.drawButton(mc, mouseX, mouseY); + + super.drawScreen(mouseX, mouseY, partialTicks); + } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + + NBTTagCompound data = new NBTTagCompound(); + jigsaw.writeToNBT(data); + + data.setString("pool", textPool.getText()); + data.setString("target", textTarget.getText()); + data.setBoolean("roll", jointToggle.displayString == "Rollable"); + + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, jigsaw.xCoord, jigsaw.yCoord, jigsaw.zCoord)); + } + + @Override + protected void keyTyped(char typedChar, int keyCode) { + super.keyTyped(typedChar, keyCode); + textPool.textboxKeyTyped(typedChar, keyCode); + textTarget.textboxKeyTyped(typedChar, keyCode); + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int mouseButton) { + super.mouseClicked(mouseX, mouseY, mouseButton); + textPool.mouseClicked(mouseX, mouseY, mouseButton); + textTarget.mouseClicked(mouseX, mouseY, mouseButton); + + if(jointToggle.mousePressed(mc, mouseX, mouseY)) { + jointToggle.displayString = jointToggle.displayString == "Rollable" ? "Aligned" : "Rollable"; + } + } + + @Override public boolean doesGuiPauseGame() { return false; } + } +} \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/DecoBlock.java b/src/main/java/com/hbm/blocks/generic/DecoBlock.java index bf25850eb..05642281a 100644 --- a/src/main/java/com/hbm/blocks/generic/DecoBlock.java +++ b/src/main/java/com/hbm/blocks/generic/DecoBlock.java @@ -6,7 +6,7 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.tileentity.deco.TileEntityDecoBlock; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import api.hbm.block.IToolable; import cpw.mods.fml.client.registry.RenderingRegistry; @@ -25,7 +25,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class DecoBlock extends BlockContainer implements IToolable, INBTTransformable { +public class DecoBlock extends BlockContainer implements IToolable, INBTBlockTransformable { Random rand = new Random(); @@ -185,6 +185,6 @@ public class DecoBlock extends BlockContainer implements IToolable, INBTTransfor @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/DecoPoleSatelliteReceiver.java b/src/main/java/com/hbm/blocks/generic/DecoPoleSatelliteReceiver.java index 109cabbc5..a55592ae9 100644 --- a/src/main/java/com/hbm/blocks/generic/DecoPoleSatelliteReceiver.java +++ b/src/main/java/com/hbm/blocks/generic/DecoPoleSatelliteReceiver.java @@ -1,7 +1,7 @@ package com.hbm.blocks.generic; import com.hbm.tileentity.deco.TileEntityDecoPoleSatelliteReceiver; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; @@ -11,7 +11,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class DecoPoleSatelliteReceiver extends BlockContainer implements INBTTransformable { +public class DecoPoleSatelliteReceiver extends BlockContainer implements INBTBlockTransformable { public DecoPoleSatelliteReceiver(Material p_i45386_1_) { super(p_i45386_1_); @@ -61,7 +61,7 @@ public class DecoPoleSatelliteReceiver extends BlockContainer implements INBTTra @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/DecoTapeRecorder.java b/src/main/java/com/hbm/blocks/generic/DecoTapeRecorder.java index e7143aae6..ca8e32474 100644 --- a/src/main/java/com/hbm/blocks/generic/DecoTapeRecorder.java +++ b/src/main/java/com/hbm/blocks/generic/DecoTapeRecorder.java @@ -1,6 +1,6 @@ package com.hbm.blocks.generic; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.client.registry.RenderingRegistry; import net.minecraft.block.BlockContainer; @@ -11,7 +11,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class DecoTapeRecorder extends BlockContainer implements INBTTransformable { +public class DecoTapeRecorder extends BlockContainer implements INBTBlockTransformable { public DecoTapeRecorder(Material p_i45386_1_) { super(p_i45386_1_); @@ -63,7 +63,7 @@ public class DecoTapeRecorder extends BlockContainer implements INBTTransformabl @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/LogicBlock.java b/src/main/java/com/hbm/blocks/generic/LogicBlock.java new file mode 100644 index 000000000..462755811 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/LogicBlock.java @@ -0,0 +1,162 @@ +package com.hbm.blocks.generic; + +import com.hbm.world.gen.util.LogicBlockActions; +import com.hbm.world.gen.util.LogicBlockConditions; +import com.hbm.world.gen.util.LogicBlockInteractions; +import cpw.mods.fml.common.registry.GameRegistry; +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.init.Blocks; +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.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.function.Consumer; +import java.util.function.Function; + +public class LogicBlock extends BlockContainer { + + public LogicBlock() { + super(Material.rock); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new LogicBlock.TileEntityLogicBlock(); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof LogicBlock.TileEntityLogicBlock){ + LogicBlock.TileEntityLogicBlock logicBlock = (LogicBlock.TileEntityLogicBlock) tile; + if(logicBlock.disguise != null){ + return logicBlock.disguise.getIcon(side, logicBlock.disguiseMeta); + } + } + + return super.getIcon(world, x, y, z, side); + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { + TileEntity te = worldIn.getTileEntity(x, y, z); + if(te instanceof LogicBlock.TileEntityLogicBlock && ((LogicBlock.TileEntityLogicBlock) te).interaction != null) { + ((LogicBlock.TileEntityLogicBlock) te).interaction.accept(new Object[]{worldIn, te, x, y, z, player, side, subX, subY, subZ}); + return true; + } + + return super.onBlockActivated(worldIn, x, y, z, player, side, subX, subY, subZ); + } + + public static class TileEntityLogicBlock extends TileEntity { + + //phase is incremented per condition check, timer counts since last condition check by default + public int phase = 0; + public int timer = 0; + + public Block disguise; + public int disguiseMeta; + + /**Actions always get called before conditions, use the phase and timer variables in order to control behavior via conditions*/ + public String conditionID = "PLAYER_CUBE_5"; + public String actionID = "FODDER_WAVE"; + /**Interactions are called on right click, and passes on the parameters of the right click to consumer*/ + public String interactionID; + + public Function condition; + public Consumer action; + /**Consists of world instance, TileEntity instance, three ints for coordinates, one int for block side, and player instance, in that order **/ + public Consumer interaction; + + public EntityPlayer player; + + public ForgeDirection direction = ForgeDirection.UNKNOWN; + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + if(action == null){ + action = LogicBlockActions.actions.get(actionID); + } + if(condition == null){ + condition = LogicBlockConditions.conditions.get(conditionID); + } + if(interaction == null && interactionID != null){ + interaction = LogicBlockInteractions.interactions.get(interactionID); + } + + if(action == null || condition == null){ + worldObj.setBlock(xCoord,yCoord,zCoord, Blocks.air); + return; + } + action.accept(this); + if(condition.apply(this)) { + phase++; + timer = 0; + } else { + timer++; + } + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("phase", phase); + + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + if(interactionID != null) + nbt.setString("interactionID", interactionID); + + nbt.setInteger("direction", direction.ordinal()); + if(disguise != null){ + nbt.setInteger("disguiseMeta", disguiseMeta); + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.phase = nbt.getInteger("phase"); + + this.actionID = nbt.getString("actionID"); + this.conditionID = nbt.getString("conditionID"); + if(nbt.hasKey("interactionID")) this.interactionID = nbt.getString("interactionID"); + + this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); + + if(nbt.hasKey("disguise")){ + disguiseMeta = nbt.getInteger("disguiseMeta"); + disguise = Block.getBlockFromName(nbt.getString("disguise")); + } + } + + @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()); + } + } + +} diff --git a/src/main/java/com/hbm/blocks/machine/BlockMachineBase.java b/src/main/java/com/hbm/blocks/machine/BlockMachineBase.java index b5d111c13..41e0c6a03 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockMachineBase.java +++ b/src/main/java/com/hbm/blocks/machine/BlockMachineBase.java @@ -1,7 +1,7 @@ package com.hbm.blocks.machine; import com.hbm.main.MainRegistry; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; @@ -17,7 +17,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public abstract class BlockMachineBase extends BlockContainer implements INBTTransformable { +public abstract class BlockMachineBase extends BlockContainer implements INBTBlockTransformable { int guiID = -1; protected boolean rotatable = false; @@ -115,6 +115,6 @@ public abstract class BlockMachineBase extends BlockContainer implements INBTTra @Override public int transformMeta(int meta, int coordBaseMode) { if(!rotatable) return meta; - return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/Floodlight.java b/src/main/java/com/hbm/blocks/machine/Floodlight.java index 25e70cac2..4dcdf6fa0 100644 --- a/src/main/java/com/hbm/blocks/machine/Floodlight.java +++ b/src/main/java/com/hbm/blocks/machine/Floodlight.java @@ -4,10 +4,10 @@ import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.FloodlightBeam.TileEntityFloodlightBeam; import com.hbm.util.Compat; import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import api.hbm.block.IToolable; import api.hbm.energymk2.IEnergyReceiverMK2; -import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -28,7 +28,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class Floodlight extends BlockContainer implements IToolable, INBTTransformable { +public class Floodlight extends BlockContainer implements IToolable, INBTBlockTransformable { public Floodlight(Material mat) { super(mat); diff --git a/src/main/java/com/hbm/blocks/machine/MachineArcFurnace.java b/src/main/java/com/hbm/blocks/machine/MachineArcFurnace.java deleted file mode 100644 index 7b45594c8..000000000 --- a/src/main/java/com/hbm/blocks/machine/MachineArcFurnace.java +++ /dev/null @@ -1,288 +0,0 @@ -package com.hbm.blocks.machine; - -import java.util.Random; - -import com.hbm.blocks.ModBlocks; -import com.hbm.lib.RefStrings; -import com.hbm.main.MainRegistry; -import com.hbm.tileentity.machine.TileEntityMachineArcFurnace; - -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.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -public class MachineArcFurnace extends BlockContainer { - - private final Random field_149933_a = new Random(); - private final boolean isActive; - private static boolean keepInventory; - - @SideOnly(Side.CLIENT) - private IIcon iconFront; - @SideOnly(Side.CLIENT) - private IIcon iconTop; - @SideOnly(Side.CLIENT) - private IIcon iconBottom; - @SideOnly(Side.CLIENT) - private IIcon iconRods; - - public MachineArcFurnace(boolean blockState) { - super(Material.iron); - isActive = blockState; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconRegister) { - this.iconFront = iconRegister.registerIcon(RefStrings.MODID + (this.isActive ? ":machine_arc_furnace_front_on" : ":machine_arc_furnace_front_off")); - this.iconTop = iconRegister.registerIcon(RefStrings.MODID + (this.isActive ? ":machine_arc_furnace_top_on" : ":machine_arc_furnace_top")); - this.iconBottom = iconRegister.registerIcon(RefStrings.MODID + ":machine_arc_furnace_bottom"); - this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":machine_arc_furnace_side"); - this.iconRods = iconRegister.registerIcon(RefStrings.MODID + ":machine_arc_furnace_top_rods"); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int metadata) { - - if(this == ModBlocks.machine_arc_furnace_off) { - - if(side == 1 && metadata > 5) { - return iconRods; - } - } - - if(metadata > 5) - metadata -= 4; - - if(side == 0) - return this.iconBottom; - if(side == 1) - return this.iconTop; - - return metadata == 0 && side == 3 ? this.iconFront : (side == metadata ? this.iconFront : this.blockIcon); - } - - @Override - public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) - { - return Item.getItemFromBlock(ModBlocks.machine_arc_furnace_off); - } - - @Override - public void onBlockAdded(World world, int x, int y, int z) { - super.onBlockAdded(world, x, y, z); - this.setDefaultDirection(world, x, y, z); - } - - private void setDefaultDirection(World world, int x, int y, int z) { - if(!world.isRemote) - { - Block block1 = world.getBlock(x, y, z - 1); - Block block2 = world.getBlock(x, y, z + 1); - Block block3 = world.getBlock(x - 1, y, z); - Block block4 = world.getBlock(x + 1, y, z); - - byte b0 = 3; - - if(block1.func_149730_j() && !block2.func_149730_j()) - { - b0 = 3; - } - if(block2.func_149730_j() && !block1.func_149730_j()) - { - b0 = 2; - } - if(block3.func_149730_j() && !block4.func_149730_j()) - { - b0 = 5; - } - if(block4.func_149730_j() && !block3.func_149730_j()) - { - b0 = 4; - } - - world.setBlockMetadataWithNotify(x, y, z, b0, 2); - } - } - - @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); - } - - if(itemStack.hasDisplayName()) - { - ((TileEntityMachineArcFurnace)world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName()); - } - } - - @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()) - { - TileEntityMachineArcFurnace entity = (TileEntityMachineArcFurnace) world.getTileEntity(x, y, z); - if(entity != null) - { - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); - } - return true; - } else { - return false; - } - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityMachineArcFurnace(); - } - - public static void updateBlockState(boolean isProcessing, World world, int x, int y, int z) { - int i = world.getBlockMetadata(x, y, z); - TileEntity entity = world.getTileEntity(x, y, z); - keepInventory = true; - - if(isProcessing) - { - world.setBlock(x, y, z, ModBlocks.machine_arc_furnace_on); - }else{ - world.setBlock(x, y, z, ModBlocks.machine_arc_furnace_off); - } - - keepInventory = false; - world.setBlockMetadataWithNotify(x, y, z, i, 2); - - if(entity != null) { - entity.validate(); - world.setTileEntity(x, y, z, entity); - } - } - - @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) - { - TileEntityMachineArcFurnace tileentityfurnace = (TileEntityMachineArcFurnace)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_); - } - - @Override - @SideOnly(Side.CLIENT) - public void randomDisplayTick(World p_149734_1_, int x, int y, int z, Random rand) - { - if (isActive) - { - int l = p_149734_1_.getBlockMetadata(x, y, z); - float f = x + 0.5F; - float f1 = y + 0.0F + rand.nextFloat() * 6.0F / 16.0F; - float f2 = z + 0.5F; - float f3 = 0.52F; - float f4 = rand.nextFloat() * 0.6F - 0.3F; - - if (l == 4) - { - p_149734_1_.spawnParticle("smoke", f - f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D); - p_149734_1_.spawnParticle("flame", f - f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D); - } - else if (l == 5) - { - p_149734_1_.spawnParticle("smoke", f + f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D); - p_149734_1_.spawnParticle("flame", f + f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D); - } - else if (l == 2) - { - p_149734_1_.spawnParticle("smoke", f + f4, f1, f2 - f3, 0.0D, 0.0D, 0.0D); - p_149734_1_.spawnParticle("flame", f + f4, f1, f2 - f3, 0.0D, 0.0D, 0.0D); - } - else if (l == 3) - { - p_149734_1_.spawnParticle("smoke", f + f4, f1, f2 + f3, 0.0D, 0.0D, 0.0D); - p_149734_1_.spawnParticle("flame", f + f4, f1, f2 + f3, 0.0D, 0.0D, 0.0D); - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public Item getItem(World p_149694_1_, int p_149694_2_, int p_149694_3_, int p_149694_4_) - { - return Item.getItemFromBlock(ModBlocks.machine_arc_furnace_off); - } -} diff --git a/src/main/java/com/hbm/blocks/machine/MachineAssemblyMachine.java b/src/main/java/com/hbm/blocks/machine/MachineAssemblyMachine.java new file mode 100644 index 000000000..b7cbceafe --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachineAssemblyMachine.java @@ -0,0 +1,45 @@ +package com.hbm.blocks.machine; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.TileEntityMachineAssemblyMachine; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class MachineAssemblyMachine extends BlockDummyable { + + public MachineAssemblyMachine(Material mat) { + super(mat); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityMachineAssemblyMachine(); + if(meta >= 6) return new TileEntityProxyCombo().inventory().power().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) { + return this.standardOpenBehavior(world, x, y, z, player, 0); + } + + @Override public int[] getDimensions() { return new int[] {2, 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 -= dir.offsetX; + z -= dir.offsetZ; + + for(int i = -1; i <= 1; i++) for(int j = -1; j <= 1; j++) { + if(i != 0 || j != 0) this.makeExtra(world, x + i, y, z + j); + } + } +} diff --git a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java index 22a60d7b1..5bb2c3933 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java @@ -3,6 +3,12 @@ package com.hbm.blocks.machine; import java.util.ArrayList; import java.util.List; +import com.hbm.handler.CompatHandler; +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; import org.lwjgl.input.Keyboard; import com.hbm.blocks.ILookOverlay; @@ -149,13 +155,15 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); player.addExhaustion(0.025F); } - - public static class TileEntityCapacitor extends TileEntityLoadedBase implements IEnergyProviderMK2, IEnergyReceiverMK2, IPersistentNBT, IRORValueProvider { + @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) + public static class TileEntityCapacitor extends TileEntityLoadedBase implements IEnergyProviderMK2, IEnergyReceiverMK2, IPersistentNBT, IRORValueProvider, SimpleComponent, CompatHandler.OCComponent { public long power; protected long maxPower; public long powerReceived; public long powerSent; + public long lastPowerReceived; + public long lastPowerSent; public TileEntityCapacitor() { } @@ -198,6 +206,8 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP networkPackNT(15); + this.lastPowerSent = powerSent; + this.lastPowerReceived = powerReceived; this.powerSent = 0; this.powerReceived = 0; } @@ -315,5 +325,69 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP if((PREFIX_VALUE + "fillpercent").equals(name)) return "" + this.power * 100 / this.maxPower; return null; } + + // opencomputer + @Override + @Optional.Method(modid = "OpenComputers") + public String getComponentName() { + return "capacitor"; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getEnergy(Context context, Arguments args) { + return new Object[] {power}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getMaxEnergy(Context context, Arguments args) { + return new Object[] {maxPower}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getEnergySent(Context context, Arguments args) { + return new Object[] {lastPowerReceived}; + } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getEnergyReceived(Context context, Arguments args) { return new Object[] {lastPowerSent}; } + + @Callback(direct = true) + @Optional.Method(modid = "OpenComputers") + public Object[] getInfo(Context context, Arguments args) { + return new Object[] {power, maxPower, lastPowerReceived, lastPowerSent}; + } + + @Override + @Optional.Method(modid = "OpenComputers") + public String[] methods() { + return new String[] { + "getEnergy", + "getMaxEnergy", + "getEnergySent", + "getEnergyReceived", + "getInfo" + }; + } + @Override + @Optional.Method(modid = "OpenComputers") + public Object[] invoke(String method, Context context, Arguments args) throws Exception { + switch(method) { + case ("getEnergy"): + return getEnergy(context, args); + case ("getMaxEnergy"): + return getMaxEnergy(context, args); + case ("getEnergySent"): + return getEnergySent(context, args); + case ("getEnergyReceived"): + return getEnergyReceived(context, args); + case ("getInfo"): + return getEnergyReceived(context, args); + } + throw new NoSuchMethodException(); + } } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index 465ea6c69..82eb6d89f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -1,129 +1,80 @@ package com.hbm.blocks.machine; -import java.util.Random; - -import com.hbm.main.MainRegistry; +import com.hbm.blocks.BlockDummyable; +import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineEPress; -import com.hbm.world.gen.INBTTransformable; -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; +import api.hbm.block.IToolable; 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.tileentity.TileEntity; -import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class MachineEPress extends BlockContainer implements INBTTransformable { +public class MachineEPress extends BlockDummyable implements IToolable { - private final Random field_149933_a = new Random(); - private static boolean keepInventory; - - public MachineEPress(Material p_i45386_1_) { - super(p_i45386_1_); + public MachineEPress(Material mat) { + super(mat); } @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityMachineEPress(); + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityMachineEPress(); + if(meta >= 6) return new TileEntityProxyCombo(true, false, false); + return null; } @Override - public int getRenderType() { - return -1; + public int[] getDimensions() { + return new int[] {2, 0, 0, 0, 0, 0}; } @Override - public boolean isOpaqueCube() { - return false; + public int getOffset() { + return 0; } @Override - public boolean renderAsNormalBlock() { - return false; - } - - @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) { - ISidedInventory tileentityfurnace = (ISidedInventory) 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_); + protected boolean isLegacyMonoblock(World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + return te != null && te instanceof TileEntityMachineEPress; } @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.onBlockPlacedBy(world, x, y, z, player, itemStack); if(itemStack.hasDisplayName()) { - ((TileEntityMachineEPress) world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName()); + int[] pos = this.findCore(world, x, y, z); + if(pos != null) { + TileEntityMachineEPress entity = (TileEntityMachineEPress) world.getTileEntity(pos[0], pos[1], pos[2]); + if(entity != null) { + entity.setCustomName(itemStack.getDisplayName()); + } + } } } @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()) { - TileEntityMachineEPress entity = (TileEntityMachineEPress) world.getTileEntity(x, y, z); - if(entity != null) { - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); - } - return true; - } else { - return false; - } + return this.standardOpenBehavior(world, x, y, z, player, 0); } + // Un-multiblickable with a hand drill for schenanigans @Override - public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + 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.HAND_DRILL) + return false; + + int meta = world.getBlockMetadata(x, y, z); + if (meta >= 12) + return false; + + safeRem = true; + world.setBlockToAir(x, y, z); + safeRem = false; + return true; } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java b/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java index ab91cbb43..ec787564a 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java +++ b/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java @@ -35,7 +35,7 @@ public class MachineElectrolyser extends BlockDummyable { @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - return this.standardOpenBehavior(world, x, y, z, player, 0); + return this.standardOpenBehavior(world, x, y, z, player, -1); } @Override diff --git a/src/main/java/com/hbm/blocks/machine/MachinePUREX.java b/src/main/java/com/hbm/blocks/machine/MachinePUREX.java new file mode 100644 index 000000000..461509da8 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachinePUREX.java @@ -0,0 +1,54 @@ +package com.hbm.blocks.machine; + +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.TileEntityMachinePUREX; + +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 MachinePUREX extends BlockDummyable implements ITooltipProvider { + + public MachinePUREX(Material mat) { + super(mat); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityMachinePUREX(); + if(meta >= 6) return new TileEntityProxyCombo().inventory().power().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) { + return this.standardOpenBehavior(world, x, y, z, player, 0); + } + + @Override public int[] getDimensions() { return new int[] {4, 0, 2, 2, 2, 2}; } + @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); + + x += dir.offsetX * o; + z += dir.offsetZ * o; + + for(int i = -2; i <= 2; i++) for(int j = -2; j <= 2; j++) { + if(Math.abs(i) == 2 || Math.abs(j) == 2) this.makeExtra(world, x + i, y, z + j); + } + } + + @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/MachinePWRController.java b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java index 0d27ea490..68007db4d 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java @@ -4,6 +4,7 @@ import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; import com.hbm.handler.threading.PacketThreading; +import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.packet.toclient.AuxParticlePacketNT; @@ -55,7 +56,7 @@ public class MachinePWRController extends BlockContainer implements ITooltipProv @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { - return metadata == 0 && side == 3 ? this.iconFront : (side == metadata ? this.iconFront : this.blockIcon); + return metadata == 0 && side != 0 && side != 1 ? this.iconFront : (side == metadata ? this.iconFront : this.blockIcon); } @Override @@ -80,6 +81,7 @@ public class MachinePWRController extends BlockContainer implements ITooltipProv if(!controller.assembled) { assemble(world, x, y, z, player); } else { + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.pwr_printer) return false; FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); } diff --git a/src/main/java/com/hbm/blocks/machine/MachinePress.java b/src/main/java/com/hbm/blocks/machine/MachinePress.java index a28d22172..b02f3dab8 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePress.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePress.java @@ -1,105 +1,64 @@ package com.hbm.blocks.machine; -import java.util.Random; - -import com.hbm.main.MainRegistry; +import com.hbm.blocks.BlockDummyable; +import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachinePress; -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; + +import api.hbm.block.IToolable; 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.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -public class MachinePress extends BlockContainer { - - private final Random field_149933_a = new Random(); - private static boolean keepInventory; +public class MachinePress extends BlockDummyable implements IToolable { - public MachinePress(Material p_i45386_1_) { - super(p_i45386_1_); + public MachinePress(Material mat) { + super(mat); } @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityMachinePress(); + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityMachinePress(); + if(meta >= 6) return new TileEntityProxyCombo(true, false, false); + return null; } @Override - public int getRenderType() { - return -1; + public int[] getDimensions() { + return new int[] {2, 0, 0, 0, 0, 0}; } @Override - public boolean isOpaqueCube() { - return false; + public int getOffset() { + return 0; } @Override - public boolean renderAsNormalBlock() { - return false; - } - - @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) { - TileEntityMachinePress tileentityfurnace = (TileEntityMachinePress) 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_); + protected boolean isLegacyMonoblock(World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + return te != null && te instanceof TileEntityMachinePress; } @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()) { - TileEntityMachinePress entity = (TileEntityMachinePress) world.getTileEntity(x, y, z); - if(entity != null) { - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); - } - return true; - } else { - return false; - } + return this.standardOpenBehavior(world, x, y, z, player, 0); } + + // Un-multiblickable with a hand drill for schenanigans + @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.HAND_DRILL) + return false; + + int meta = world.getBlockMetadata(x, y, z); + if (meta >= 12) + return false; + + safeRem = true; + world.setBlockToAir(x, y, z); + safeRem = false; + return true; + } + } diff --git a/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java b/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java index 1f5e3d119..8dabf9e77 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java +++ b/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java @@ -1,15 +1,22 @@ package com.hbm.blocks.machine; import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ILookOverlay; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineRotaryFurnace; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.common.util.ForgeDirection; -public class MachineRotaryFurnace extends BlockDummyable { +import java.util.ArrayList; +import java.util.List; + +public class MachineRotaryFurnace extends BlockDummyable implements ILookOverlay { public MachineRotaryFurnace(Material mat) { super(mat); @@ -56,4 +63,54 @@ public class MachineRotaryFurnace extends BlockDummyable { //solid fuel this.makeExtra(world, x + dir.offsetX + rot.offsetX, y, z + dir.offsetZ + rot.offsetZ); } + + @Override + public void printHook(RenderGameOverlayEvent.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 TileEntityMachineRotaryFurnace)) return; + + TileEntityMachineRotaryFurnace furnace = (TileEntityMachineRotaryFurnace) te; + + ForgeDirection dir = ForgeDirection.getOrientation(furnace.getBlockMetadata() - offset); + + List text = new ArrayList<>(); + + //steam + if(hitCheck(dir, pos[0], pos[1], pos[2], -1, -1, 0, x, y, z) || hitCheck(dir, pos[0], pos[1], pos[2], -1, -2, 0, x, y, z)) { + text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + furnace.tanks[1].getTankType().getLocalizedName()); + text.add(EnumChatFormatting.RED + "<- " + EnumChatFormatting.RESET + furnace.tanks[2].getTankType().getLocalizedName()); + } + + //fluids + if(hitCheck(dir, pos[0], pos[1], pos[2], 1, 2, 0, x, y, z) || hitCheck(dir, pos[0], pos[1], pos[2], -1, 2, 0, x, y, z)) { + text.add(EnumChatFormatting.GREEN + "-> " + EnumChatFormatting.RESET + furnace.tanks[0].getTankType().getLocalizedName()); + } + + if(hitCheck(dir, pos[0], pos[1], pos[2], 1, 1, 0, x, y, z)) { + text.add(EnumChatFormatting.YELLOW + "-> " + EnumChatFormatting.RESET + "Fuel"); + } + + + if(!text.isEmpty()) { + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + } + + protected boolean hitCheck(ForgeDirection dir, int coreX, int coreY, int coreZ, int exDir, int exRot, int exY, int hitX, int hitY, int hitZ) { + + ForgeDirection turn = dir.getRotation(ForgeDirection.DOWN); + + int iX = coreX + dir.offsetX * exDir + turn.offsetX * exRot; + int iY = coreY + exY; + int iZ = coreZ + dir.offsetZ * exDir + turn.offsetZ * exRot; + + return iX == hitX && iZ == hitZ && iY == hitY; + } + } diff --git a/src/main/java/com/hbm/blocks/machine/PistonInserter.java b/src/main/java/com/hbm/blocks/machine/PistonInserter.java index bb33d205d..4683f1ec6 100644 --- a/src/main/java/com/hbm/blocks/machine/PistonInserter.java +++ b/src/main/java/com/hbm/blocks/machine/PistonInserter.java @@ -282,8 +282,6 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid if(this.slot != null) { BufferUtil.writeNBT(buf, slot.stackTagCompound); } - - this.turnProgress = 2; } @Override diff --git a/src/main/java/com/hbm/blocks/machine/Spotlight.java b/src/main/java/com/hbm/blocks/machine/Spotlight.java index 8c1c57663..a72f81db2 100644 --- a/src/main/java/com/hbm/blocks/machine/Spotlight.java +++ b/src/main/java/com/hbm/blocks/machine/Spotlight.java @@ -7,13 +7,14 @@ import java.util.Random; import com.hbm.blocks.BlockEnums.LightType; import com.hbm.blocks.ISpotlight; import com.hbm.main.ResourceManager; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; 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.BlockSlab; +import net.minecraft.block.material.MapColor; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -25,7 +26,7 @@ import net.minecraft.world.World; import net.minecraftforge.client.model.obj.WavefrontObject; import net.minecraftforge.common.util.ForgeDirection; -public class Spotlight extends Block implements ISpotlight, INBTTransformable { +public class Spotlight extends Block implements ISpotlight, INBTBlockTransformable { public static boolean disableOnGeneration = true; @@ -44,7 +45,7 @@ public class Spotlight extends Block implements ISpotlight, INBTTransformable { this.type = type; this.isOn = isOn; - this.setHardness(1F); + this.setHardness(0.5F); if(isOn) setLightLevel(1.0F); } @@ -81,6 +82,17 @@ public class Spotlight extends Block implements ISpotlight, INBTTransformable { return false; } + @Override + // Ah yes, I love methods named the literal opposite of what they do + public boolean getBlocksMovement(IBlockAccess world, int x, int y, int z) { + return true; + } + + @Override + public MapColor getMapColor(int meta) { + return MapColor.airColor; + } + @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World p_149668_1_, int p_149668_2_, int p_149668_3_, int p_149668_4_) { return null; @@ -355,7 +367,7 @@ public class Spotlight extends Block implements ISpotlight, INBTTransformable { public int transformMeta(int meta, int coordBaseMode) { // +1 to set as broken, won't turn on until broken and replaced int disabled = disableOnGeneration ? 1 : 0; - return (INBTTransformable.transformMetaDeco(meta >> 1, coordBaseMode) << 1) + disabled; + return (INBTBlockTransformable.transformMetaDeco(meta >> 1, coordBaseMode) << 1) + disabled; } @Override diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKAutoloader.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKAutoloader.java new file mode 100644 index 000000000..9eb8f58dc --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKAutoloader.java @@ -0,0 +1,42 @@ +package com.hbm.blocks.machine.rbmk; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKAutoloader; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +public class RBMKAutoloader extends BlockDummyable { + + public RBMKAutoloader() { + super(Material.iron); + + this.bounding.add(AxisAlignedBB.getBoundingBox(-0.125, 0, -0.125, 0.125, 4, 0.125)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-0.5, 4, -0.5, 0.5, 9, 0.5)); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityRBMKAutoloader(); + return new TileEntityProxyCombo().inventory(); + } + + @Override + public int[] getDimensions() { + return new int[] {8, 0, 0, 0, 0, 0}; + } + + @Override + public int getOffset() { + return 0; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + return this.standardOpenBehavior(world, x, y, z, player, 0); + } +} diff --git a/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java new file mode 100644 index 000000000..d40d81595 --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java @@ -0,0 +1,344 @@ +package com.hbm.blocks.network; + +import api.hbm.block.IToolable; +import com.hbm.blocks.IBlockMultiPass; +import com.hbm.interfaces.ICopiable; +import com.hbm.lib.RefStrings; +import com.hbm.render.block.RenderBlockMultipass; +import com.hbm.tileentity.TileEntityLoadedBase; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import li.cil.oc.api.network.Environment; +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.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +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.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import li.cil.oc.api.network.Message; +import li.cil.oc.api.network.Node; +import li.cil.oc.api.Network; +import li.cil.oc.api.network.Visibility; +import cpw.mods.fml.common.Optional; +import li.cil.oc.api.network.SidedEnvironment; +import net.minecraftforge.common.util.ForgeDirection; +import li.cil.oc.api.internal.Colored; +import com.hbm.handler.CompatHandler.OCColors; +import net.minecraftforge.oredict.OreDictionary; + +public class BlockOpenComputersCablePaintable extends BlockContainer implements IToolable, IBlockMultiPass { + + @SideOnly(Side.CLIENT) protected IIcon overlay; + @SideOnly(Side.CLIENT) protected IIcon overlayColor; + + public BlockOpenComputersCablePaintable() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityOpenComputersCablePaintable(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + this.blockIcon = reg.registerIcon(RefStrings.MODID + ":oc_cable_base"); + this.overlay = reg.registerIcon(RefStrings.MODID + ":oc_cable_overlay"); + this.overlayColor = reg.registerIcon(RefStrings.MODID + ":oc_cable_color"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityOpenComputersCablePaintable) { + TileEntityOpenComputersCablePaintable pipe = (TileEntityOpenComputersCablePaintable) tile; + + if(pipe.block != null) { + if(RenderBlockMultipass.currentPass == 1) { + return this.overlay; + } else if(RenderBlockMultipass.currentPass == 2) { + return this.overlayColor; + } else { + return pipe.block.getIcon(side, pipe.meta); + } + } + } + + return RenderBlockMultipass.currentPass == 1 ? this.overlay : RenderBlockMultipass.currentPass == 2 ? this.overlayColor : this.blockIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public int colorMultiplier(IBlockAccess world, int x, int y, int z) { + if (RenderBlockMultipass.currentPass == 2) { + TileEntityOpenComputersCablePaintable tile = (TileEntityOpenComputersCablePaintable) world.getTileEntity(x, y, z); + if (tile == null) + return 0xffffff; + + return tile.getColor(); + } + + return 0xffffff; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { + + ItemStack stack = player.getHeldItem(); + + if (stack == null) + return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); + + if (stack.getItem() instanceof ItemBlock) { + ItemBlock ib = (ItemBlock) stack.getItem(); + Block block = ib.field_150939_a; + + if(block.renderAsNormalBlock() && block != this) { + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityOpenComputersCablePaintable) { + TileEntityOpenComputersCablePaintable pipe = (TileEntityOpenComputersCablePaintable) tile; + + if(pipe.block == null) { + pipe.block = block; + pipe.meta = stack.getItemDamage() & 15; + world.markBlockForUpdate(x, y, z); + pipe.markDirty(); + return true; + } + } + } + } else { + boolean isDye = false; + int[] dicts = OreDictionary.getOreIDs(stack); + for (int dict : dicts) { + String dictName = OreDictionary.getOreName(dict); + if (dictName.equals("dye")) + isDye = true; + } + + if (isDye) { + TileEntityOpenComputersCablePaintable tile = (TileEntityOpenComputersCablePaintable) world.getTileEntity(x, y, z); + tile.setColor(OCColors.fromDye(stack).getColor()); + world.markBlockForUpdate(x, y, z); + tile.markDirty(); + } + } + + return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); + } + + @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; + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityOpenComputersCablePaintable) { + TileEntityOpenComputersCablePaintable pipe = (TileEntityOpenComputersCablePaintable) tile; + + if(pipe.block != null) { + pipe.block = null; + world.markBlockForUpdate(x, y, z); + pipe.markDirty(); + return true; + } + } + + return false; + } + + @Override + public int getPasses() { + return 3; + } + + @Override + public int getRenderType(){ + return IBlockMultiPass.getRenderType(); + } + + @Optional.InterfaceList({ + @Optional.Interface(iface = "li.cil.oc.api.network.Environment", modid = "OpenComputers"), + @Optional.Interface(iface = "li.cil.oc.api.network.SidedEnvironment", modid = "OpenComputers"), + @Optional.Interface(iface = "li.cil.oc.api.network.Colored", modid = "OpenComputers") + }) + public static class TileEntityOpenComputersCablePaintable extends TileEntityLoadedBase implements Environment, SidedEnvironment, Colored, ICopiable { + + protected Node node; + protected boolean addedToNetwork = false; + + private Block block; + private int meta; + private Block lastBlock; + private int lastMeta; + private OCColors color = OCColors.LIGHTGRAY; + + public TileEntityOpenComputersCablePaintable() { + node = Network.newNode(this, Visibility.None).create(); + } + + @Override + public void updateEntity() { + super.updateEntity(); + + if(worldObj.isRemote && (lastBlock != block || lastMeta != meta)) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + lastBlock = block; + lastMeta = meta; + } + + if(!this.getWorldObj().isRemote && !addedToNetwork) { + addedToNetwork = true; + Network.joinOrCreateNetwork(this); + } + + } + + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + this.writeToNBT(nbt); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + } + + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + this.readFromNBT(pkt.func_148857_g()); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + int id = nbt.getInteger("block"); + this.block = id == 0 ? null : Block.getBlockById(id); + this.meta = nbt.getInteger("meta"); + + this.color = OCColors.fromInt(nbt.getInteger("dyeColor")); + + if (node != null && node.host() == this) { + node.load(nbt.getCompoundTag("oc:node")); + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + if(block != null) nbt.setInteger("block", Block.getIdFromBlock(block)); + nbt.setInteger("meta", meta); + + nbt.setInteger("dyeColor", color.getColor()); + + if (node != null && node.host() == this) { + final NBTTagCompound nodeNbt = new NBTTagCompound(); + node.save(nodeNbt); + nbt.setTag("oc:node", nodeNbt); + } + } + + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound nbt = new NBTTagCompound(); + if(block != null) { + nbt.setInteger("paintblock", Block.getIdFromBlock(block)); + nbt.setInteger("paintmeta", meta); + } + return nbt; + } + + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + if(nbt.hasKey("paintblock")) { + this.block = Block.getBlockById(nbt.getInteger("paintblock")); + this.meta = nbt.getInteger("paintmeta"); + this.color = OCColors.fromInt(nbt.getInteger("dyeColor")); + } + } + + // OC Cable Things + @Override + public Node node() { + return node; + } + + public Node sidedNode(ForgeDirection side) { + if (side == ForgeDirection.UNKNOWN) + return null; + + int neighborX = super.xCoord + side.offsetX; + int neighborY = super.yCoord + side.offsetY; + int neighborZ = super.zCoord + side.offsetZ; + TileEntity neighbor = worldObj.getTileEntity(neighborX, neighborY, neighborZ); + + // If a cable does not support colors but is a valid cable block, allow it to connect regardless of color. + if (!(neighbor instanceof Colored)) { + if (neighbor instanceof Environment) + return node; + else + return null; + } + + Colored cable = (Colored) neighbor; + if (cable.getColor() == color.getColor()) + return node; + else + return null; + } + + @Override + public void onConnect(Node node) {} + + @Override + public void onDisconnect(Node node) {} + + @Override + public void onMessage(Message message) {} + + @Override + public void onChunkUnload() { + super.onChunkUnload(); + if (node != null) node.remove(); + } + + public void invalidate() { + super.invalidate(); + if (node != null) node.remove(); + } + + public boolean canConnect(net.minecraftforge.common.util.ForgeDirection side) { + if (side == ForgeDirection.UNKNOWN) + return false; + + int neighborX = super.xCoord + side.offsetX; + int neighborY = super.yCoord + side.offsetY; + int neighborZ = super.zCoord + side.offsetZ; + TileEntity neighbor = worldObj.getTileEntity(neighborX, neighborY, neighborZ); + + // If a cable does not support colors but is a valid cable block, allow it to connect regardless of color. + if (!(neighbor instanceof Colored)) { + return neighbor instanceof Environment; + } + + Colored cable = (Colored) neighbor; + return cable.getColor() == color.getColor(); + } + + public void setColor(int newColor) { + color = OCColors.fromInt(newColor); + } + + public int getColor() { + return color.getColor(); + } + } +} diff --git a/src/main/java/com/hbm/blocks/network/CraneInserter.java b/src/main/java/com/hbm/blocks/network/CraneInserter.java index b83da5278..e4cb74967 100644 --- a/src/main/java/com/hbm/blocks/network/CraneInserter.java +++ b/src/main/java/com/hbm/blocks/network/CraneInserter.java @@ -68,17 +68,19 @@ public class CraneInserter extends BlockCraneBase implements IEnterableBlock { ItemStack toAdd = entity.getItemStack().copy(); - int[] access = null; + if (!world.isBlockIndirectlyGettingPowered(x, y, z)) { + int[] access = null; - if(te instanceof ISidedInventory) { - ISidedInventory sided = (ISidedInventory) te; - access = InventoryUtil.masquerade(sided, outputDirection.getOpposite().ordinal()); - } + if(te instanceof ISidedInventory) { + ISidedInventory sided = (ISidedInventory) te; + access = InventoryUtil.masquerade(sided, outputDirection.getOpposite().ordinal()); + } - if(te instanceof IInventory) { - IInventory inv = (IInventory) te; + if(te instanceof IInventory) { + IInventory inv = (IInventory) te; - addToInventory(inv, access, toAdd, outputDirection.getOpposite().ordinal()); + addToInventory(inv, access, toAdd, outputDirection.getOpposite().ordinal()); + } } TileEntityCraneInserter inserter = null; diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java b/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java new file mode 100644 index 000000000..382c79c8b --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/FluidDuctPaintableBlockExhaust.java @@ -0,0 +1,208 @@ +package com.hbm.blocks.network; + +import api.hbm.block.IToolable; + +import com.hbm.blocks.IBlockMultiPass; +import com.hbm.blocks.ILookOverlay; +import com.hbm.interfaces.ICopiable; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.lib.RefStrings; +import com.hbm.render.block.RenderBlockMultipass; +import com.hbm.tileentity.network.TileEntityPipeExhaust; +import com.hbm.util.i18n.I18nUtil; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +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.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; + +import java.util.ArrayList; +import java.util.List; + +public class FluidDuctPaintableBlockExhaust extends FluidDuctBase implements IToolable, IBlockMultiPass, ILookOverlay { + + @SideOnly(Side.CLIENT) protected IIcon overlay; + + public FluidDuctPaintableBlockExhaust() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityPipeExhaustPaintable(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + this.blockIcon = reg.registerIcon(RefStrings.MODID + ":fluid_duct_paintable_block_exhaust"); + this.overlay = reg.registerIcon(RefStrings.MODID + ":fluid_duct_paintable_overlay"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityPipeExhaustPaintable) { + TileEntityPipeExhaustPaintable pipe = (TileEntityPipeExhaustPaintable) tile; + + if(pipe.block != null) { + if(RenderBlockMultipass.currentPass == 1) { + return this.overlay; + } else { + return pipe.block.getIcon(side, pipe.meta); + } + } + } + + return this.blockIcon; + } + + @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; + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityPipeExhaustPaintable) { + TileEntityPipeExhaustPaintable pipe = (TileEntityPipeExhaustPaintable) tile; + + if(pipe.block != null) { + pipe.block = null; + world.markBlockForUpdate(x, y, z); + pipe.markDirty(); + return true; + } + } + + return false; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { + + ItemStack stack = player.getHeldItem(); + + if(stack != null && stack.getItem() instanceof ItemBlock) { + ItemBlock ib = (ItemBlock) stack.getItem(); + Block block = ib.field_150939_a; + + if(block.renderAsNormalBlock() && block != this) { + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityPipeExhaustPaintable) { + TileEntityPipeExhaustPaintable pipe = (TileEntityPipeExhaustPaintable) tile; + + if(pipe.block == null) { + pipe.block = block; + pipe.meta = stack.getItemDamage() & 15; + world.markBlockForUpdate(x, y, z); + pipe.markDirty(); + return true; + } + } + } + } + + return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); + } + + @Override + public int getPasses() { + return 2; + } + + @Override + public int getRenderType(){ + return IBlockMultiPass.getRenderType(); + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + List text = new ArrayList(); + text.add(Fluids.SMOKE.getLocalizedName()); + text.add(Fluids.SMOKE_LEADED.getLocalizedName()); + text.add(Fluids.SMOKE_POISON.getLocalizedName()); + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + + public static class TileEntityPipeExhaustPaintable extends TileEntityPipeExhaust implements ICopiable { + + private Block block; + private int meta; + private Block lastBlock; + private int lastMeta; + + @Override + public void updateEntity() { + super.updateEntity(); + + if(worldObj.isRemote && (lastBlock != block || lastMeta != meta)) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + lastBlock = block; + lastMeta = meta; + } + } + + @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); + int id = nbt.getInteger("block"); + this.block = id == 0 ? null : Block.getBlockById(id); + this.meta = nbt.getInteger("meta"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + if(block != null) nbt.setInteger("block", Block.getIdFromBlock(block)); + nbt.setInteger("meta", meta); + } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound nbt = new NBTTagCompound(); + if(block != null) { + nbt.setInteger("paintblock", Block.getIdFromBlock(block)); + nbt.setInteger("paintmeta", meta); + } + return nbt; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + if(nbt.hasKey("paintblock")) { + this.block = Block.getBlockById(nbt.getInteger("paintblock")); + this.meta = nbt.getInteger("paintmeta"); + } + } + } +} diff --git a/src/main/java/com/hbm/blocks/network/FluidPump.java b/src/main/java/com/hbm/blocks/network/FluidPump.java index 416b1c579..9ce059fb4 100644 --- a/src/main/java/com/hbm/blocks/network/FluidPump.java +++ b/src/main/java/com/hbm/blocks/network/FluidPump.java @@ -3,6 +3,12 @@ package com.hbm.blocks.network; import java.util.ArrayList; import java.util.List; +import com.hbm.handler.CompatHandler; +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; import org.lwjgl.input.Keyboard; import com.hbm.blocks.ILookOverlay; @@ -19,7 +25,7 @@ import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BobMathUtil; import com.hbm.util.EnumUtil; import com.hbm.util.i18n.I18nUtil; -import com.hbm.world.gen.INBTTransformable; +import com.hbm.world.gen.nbt.INBTBlockTransformable; import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; @@ -49,7 +55,7 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.ForgeDirection; -public class FluidPump extends BlockContainer implements INBTTransformable, ILookOverlay, IGUIProvider { +public class FluidPump extends BlockContainer implements INBTBlockTransformable, ILookOverlay, IGUIProvider { public FluidPump(Material mat) { super(mat); @@ -93,7 +99,7 @@ public class FluidPump extends BlockContainer implements INBTTransformable, ILoo return true; } } - + if(world.isRemote) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); return true; } @@ -121,42 +127,43 @@ public class FluidPump extends BlockContainer implements INBTTransformable, ILoo @Override public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + return INBTBlockTransformable.transformMetaDeco(meta, coordBaseMode); } - - public static class TileEntityFluidPump extends TileEntityLoadedBase implements IFluidStandardTransceiverMK2, IControlReceiver { - + + @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) + public static class TileEntityFluidPump extends TileEntityLoadedBase implements IFluidStandardTransceiverMK2, IControlReceiver, SimpleComponent, CompatHandler.OCComponent { + public int bufferSize = 100; public FluidTank[] tank; public ConnectionPriority priority = ConnectionPriority.NORMAL; public boolean redstone = false; - + public TileEntityFluidPump() { this.tank = new FluidTank[1]; this.tank[0] = new FluidTank(Fluids.NONE, bufferSize); } - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + // if the capacity were changed directly, any excess buffered fluid would be destroyed // when running a closed loop or handling hard to get fluids, that's quite bad if(this.bufferSize != this.tank[0].getMaxFill()) { int nextBuffer = Math.max(this.tank[0].getFill(), this.bufferSize); this.tank[0].changeTankSize(nextBuffer); } - + this.redstone = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()); ForgeDirection in = dir.getRotation(ForgeDirection.UP); ForgeDirection out = in.getOpposite(); - + this.trySubscribe(tank[0].getTankType(), worldObj, xCoord + in.offsetX, yCoord, zCoord + in.offsetZ, in); if(!redstone) this.tryProvide(tank[0], worldObj, xCoord + out.offsetX, yCoord, zCoord + out.offsetZ, out); - + this.networkPackNT(15); } } @@ -192,7 +199,7 @@ public class FluidPump extends BlockContainer implements INBTTransformable, ILoo priority = EnumUtil.grabEnumSafely(ConnectionPriority.class, buf.readByte()); bufferSize = buf.readInt(); } - + @Override public ConnectionPriority getFluidPriority() { return priority; } @Override public FluidTank[] getSendingTanks() { return redstone ? new FluidTank[0] : tank; } @Override public FluidTank[] getReceivingTanks() { return this.bufferSize < this.tank[0].getFill() ? new FluidTank[0] : tank; } @@ -214,9 +221,130 @@ public class FluidPump extends BlockContainer implements INBTTransformable, ILoo if(data.hasKey("priority")) { priority = EnumUtil.grabEnumSafely(ConnectionPriority.class, data.getByte("priority")); } - + this.markDirty(); } + + @Override + @Optional.Method(modid = "OpenComputers") + public String getComponentName() { + return "ntm_fluid_pump"; + } + + @Callback(direct = true, limit = 4) + @Optional.Method(modid = "OpenComputers") + public Object[] getFluid(Context context, Arguments args) { + return new Object[] { + tank[0].getTankType().getUnlocalizedName() + }; + } + + @Callback(direct = true, limit = 4) + @Optional.Method(modid = "OpenComputers") + public Object[] getPressure(Context context, Arguments args) { + return new Object[] { + tank[0].getPressure() + }; + } + + @Callback(direct = true, limit = 4) + @Optional.Method(modid = "OpenComputers") + public Object[] getFlow(Context context, Arguments args) { + return new Object[] { + bufferSize + }; + } + + @Callback(direct = true, limit = 4) + @Optional.Method(modid = "OpenComputers") + public Object[] getPriority(Context context, Arguments args) { + return new Object[] { + getFluidPriority() + }; + } + + @Callback(direct = true, limit = 4) + @Optional.Method(modid = "OpenComputers") + public Object[] getInfo(Context context, Arguments args) { + return new Object[] { + tank[0].getTankType().getUnlocalizedName(), + tank[0].getPressure(), + bufferSize, + getFluidPriority() + }; + } + + @Callback(direct = true, limit = 4) + @Optional.Method(modid = "OpenComputers") + public Object[] setPriority(Context context, Arguments args) { + int num = args.checkInteger(0); + switch (num) { + case 0: + priority = ConnectionPriority.LOWEST; + break; + case 1: + priority = ConnectionPriority.LOW; + break; + case 2: + priority = ConnectionPriority.NORMAL; + break; + case 3: + priority = ConnectionPriority.HIGH; + break; + case 4: + priority = ConnectionPriority.HIGHEST; + break; + default: + return new Object[] {null, "Not a valid Priority."}; + } + return new Object[] {true}; + } + + @Callback(direct = true, limit = 4) + @Optional.Method(modid = "OpenComputers") + public Object[] setFlow(Context context, Arguments args) { + int input = args.checkInteger(0); + if (input > 10000 || input < 0) + return new Object[] {null, "Number outside of bounds."}; + bufferSize = input; + return new Object[] {true}; + } + + @Override + @Optional.Method(modid = "OpenComputers") + public String[] methods() { + return new String[] { + "getPriority", + "getPressure", + "getFluid", + "getFlow", + "getInfo", + "setPriority", + "setFlow" + }; + } + + @Override + @Optional.Method(modid = "OpenComputers") + public Object[] invoke(String method, Context context, Arguments args) throws Exception { + switch (method) { + case ("getPriority"): + return getPriority(context, args); + case ("getPressure"): + return getPressure(context, args); + case ("getFluid"): + return getFluid(context, args); + case ("getFlow"): + return getFlow(context, args); + case ("getInfo"): + return getInfo(context, args); + case ("setPriority"): + return setPriority(context, args); + case ("setFlow"): + return setFlow(context, args); + } + throw new NoSuchMethodException(); + } } public static class GUIPump extends GuiScreen { @@ -261,7 +389,7 @@ public class FluidPump extends BlockContainer implements INBTTransformable, ILoo drawString(fontRendererObj, "Priority:", this.width / 2 + 50, 80, 0xA0A0A0); buttonPriority.drawButton(mc, mouseX, mouseY); - + super.drawScreen(mouseX, mouseY, partialTicks); } diff --git a/src/main/java/com/hbm/blocks/network/PneumoTubePaintableBlock.java b/src/main/java/com/hbm/blocks/network/PneumoTubePaintableBlock.java new file mode 100644 index 000000000..cb2d368aa --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/PneumoTubePaintableBlock.java @@ -0,0 +1,234 @@ +package com.hbm.blocks.network; + +import api.hbm.block.IToolable; +import com.hbm.blocks.IBlockMultiPass; +import com.hbm.interfaces.ICopiable; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.render.block.RenderBlockMultipass; +import com.hbm.tileentity.network.TileEntityPneumoTube; +import com.hbm.util.Compat; +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.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +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.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.util.ForgeDirection; + +public class PneumoTubePaintableBlock extends BlockContainer implements IToolable, IBlockMultiPass { + + @SideOnly(Side.CLIENT) public IIcon overlay; + @SideOnly(Side.CLIENT) public IIcon overlayIn; + @SideOnly(Side.CLIENT) public IIcon overlayOut; + + public PneumoTubePaintableBlock() {super(Material.iron);} + + @Override + public TileEntity createNewTileEntity(World world, int meta) {return new TileEntityPneumoTubePaintable();} + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + this.blockIcon = reg.registerIcon(RefStrings.MODID + ":pneumatic_tube_paintable"); + this.overlay = reg.registerIcon(RefStrings.MODID + ":pneumatic_tube_paintable_overlay"); + this.overlayIn = reg.registerIcon(RefStrings.MODID + ":pneumatic_tube_paintable_overlay_in"); + this.overlayOut = reg.registerIcon(RefStrings.MODID + ":pneumatic_tube_paintable_overlay_out"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + + if (tile instanceof TileEntityPneumoTubePaintable) { + TileEntityPneumoTubePaintable tube = (TileEntityPneumoTubePaintable) tile; + + if (RenderBlockMultipass.currentPass == 0) { + if (tube.block != null) { + return tube.block.getIcon(side, tube.meta); + } else { + return this.blockIcon; + } + } else if (tube.ejectionDir.ordinal() == side) { + return this.overlayIn; + } else if (tube.insertionDir.ordinal() == side) { + return this.overlayOut; + } else { + return this.overlay; + } + } + return this.blockIcon; + } + + @Override + public int getPasses() {return 2;}; + + @Override + public int getRenderType() {return IBlockMultiPass.getRenderType();} + + @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.HAND_DRILL) { + + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof TileEntityPneumoTubePaintable) { + TileEntityPneumoTubePaintable tube = (TileEntityPneumoTubePaintable) tile; + + if (tube.block != null) { + tube.block = null; + world.markBlockForUpdate(x, y, z); + tube.markDirty(); + } + } + } else if (tool == ToolType.SCREWDRIVER) { + + if (world.isRemote) return true; + TileEntityPneumoTube tube = (TileEntityPneumoTube) world.getTileEntity(x, y, z); + + ForgeDirection rot = player.isSneaking() ? tube.ejectionDir : tube.insertionDir; + ForgeDirection oth = player.isSneaking() ? tube.insertionDir : tube.ejectionDir; + + for (int i = 0; i < 7; i++) { + rot = ForgeDirection.getOrientation((rot.ordinal() + 1) % 7); + if (rot == ForgeDirection.UNKNOWN) break; //unknown is always valid, simply disables this part + if (rot == oth) continue; //skip if both positions collide + TileEntity tile = Compat.getTileStandard(world, x + rot.offsetX, y + rot.offsetY, z + rot.offsetZ); + if (tile instanceof TileEntityPneumoTube) continue; + if (tile instanceof IInventory) break; //valid if connected to an IInventory + } + + if(player.isSneaking()) tube.ejectionDir = rot; else tube.insertionDir = rot; + + tube.markDirty(); + if(world instanceof WorldServer) ((WorldServer) world).getPlayerManager().markBlockForUpdate(x, y, z); + + return true; + } + return false; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { + + ItemStack stack = player.getHeldItem(); + if (stack != null && stack.getItem() instanceof ItemBlock) { + ItemBlock ib = (ItemBlock) stack.getItem(); + Block block = ib.field_150939_a; + + if (block.renderAsNormalBlock() && block != this) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof TileEntityPneumoTubePaintable) { + TileEntityPneumoTubePaintable tube = (TileEntityPneumoTubePaintable) tile; + + if (tube.block == null) { + tube.block = block; + tube.meta = stack.getItemDamage() & 15; + world.markBlockForUpdate(x, y, z); + tube.markDirty(); + return true; + } + } + } + } else if (ToolType.getType(stack) == ToolType.SCREWDRIVER || ToolType.getType(stack) == ToolType.HAND_DRILL) return false; + if (!player.isSneaking()) { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof TileEntityPneumoTube) { + TileEntityPneumoTube tube = (TileEntityPneumoTube) tile; + if (tube.isCompressor()) { + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + return true; + } + } + } + return false; + } + + public static class TileEntityPneumoTubePaintable extends TileEntityPneumoTube implements ICopiable { + + private Block block; + private int meta; + private Block lastBlock; + private int lastMeta; + + @Override + public void updateEntity() { + super.updateEntity(); + + if (worldObj.isRemote && (lastMeta != meta || lastBlock != block )) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + lastBlock = block; + lastMeta = meta; + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + int id = nbt.getInteger("block"); + this.block = id == 0 ? null : Block.getBlockById(id); + this.meta = nbt.getInteger("meta"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + if(block != null) nbt.setInteger("block", Block.getIdFromBlock(block)); + nbt.setInteger("meta", meta); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound nbt = pkt.func_148857_g(); + + int id = nbt.getInteger("block"); + this.block = id == 0 ? null : Block.getBlockById(id); + this.meta = nbt.getInteger("meta"); + super.onDataPacket(net, pkt); + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + + if(block != null) nbt.setInteger("block", Block.getIdFromBlock(block)); + nbt.setInteger("meta", meta); + nbt.setByte("insertionDir", (byte) insertionDir.ordinal()); + nbt.setByte("ejectionDir", (byte) ejectionDir.ordinal()); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound nbt = new NBTTagCompound(); + if(block != null) { + nbt.setInteger("paintblock", Block.getIdFromBlock(block)); + nbt.setInteger("paintmeta", meta); + } + return nbt; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + if(nbt.hasKey("paintblock")) { + this.block = Block.getBlockById(nbt.getInteger("paintblock")); + this.meta = nbt.getInteger("paintmeta"); + } + } + } +} diff --git a/src/main/java/com/hbm/blocks/rail/IRenderBlock.java b/src/main/java/com/hbm/blocks/rail/IRenderBlock.java index 7cf90e9fd..f8b75055e 100644 --- a/src/main/java/com/hbm/blocks/rail/IRenderBlock.java +++ b/src/main/java/com/hbm/blocks/rail/IRenderBlock.java @@ -7,6 +7,7 @@ import net.minecraft.block.Block; import net.minecraft.client.renderer.Tessellator; import net.minecraft.world.IBlockAccess; +@Deprecated public interface IRenderBlock { public static int renderID = RenderingRegistry.getNextAvailableRenderId(); diff --git a/src/main/java/com/hbm/calc/EasyLocation.java b/src/main/java/com/hbm/calc/EasyLocation.java deleted file mode 100644 index 8e4755c1b..000000000 --- a/src/main/java/com/hbm/calc/EasyLocation.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.hbm.calc; - -public class EasyLocation { - - public double posX; - public double posY; - public double posZ; - - public EasyLocation(double x, double y, double z) { - posX = x; - posY = y; - posZ = z; - } -} diff --git a/src/main/java/com/hbm/calc/Location.java b/src/main/java/com/hbm/calc/Location.java deleted file mode 100644 index 6c1d7235d..000000000 --- a/src/main/java/com/hbm/calc/Location.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.hbm.calc; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -public class Location { - - public int x; - public int y; - public int z; - public World world; - - public Location(World world, int x, int y, int z) { - this.world = world; - this.x = x; - this.y = y; - this.z = z; - } - - public Location add(int xa, int ya, int za) { - return new Location(world, x + xa, y + ya, z + za); - } - - public Location add(ForgeDirection dir) { - return add(dir.offsetX, dir.offsetY, dir.offsetZ); - } - - public TileEntity getTileEntity() { - return world.getTileEntity(x, y, z); - } - -} diff --git a/src/main/java/com/hbm/commands/CommandCustomize.java b/src/main/java/com/hbm/commands/CommandCustomize.java new file mode 100644 index 000000000..a217eb56a --- /dev/null +++ b/src/main/java/com/hbm/commands/CommandCustomize.java @@ -0,0 +1,51 @@ +package com.hbm.commands; + +import com.hbm.items.ICustomizable; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatStyle; +import net.minecraft.util.EnumChatFormatting; + +public class CommandCustomize extends CommandBase { + + @Override + public String getCommandName() { + return "ntmcustomize"; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return "/ntmcustomize"; + } + + @Override + public int getRequiredPermissionLevel() { + return 0; + } + + @Override + public boolean canCommandSenderUseCommand(ICommandSender sender) { + return true; + } + + @Override + public void processCommand(ICommandSender sender, String[] args) { + if(!(sender instanceof EntityPlayer)) { + sender.addChatMessage(new ChatComponentText("Customization is only available to players!").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); + return; + } + + EntityPlayer player = (EntityPlayer) sender; + + if(player.getHeldItem() == null || !(player.getHeldItem().getItem() instanceof ICustomizable)) { + sender.addChatMessage(new ChatComponentText("You have to hold a customizable item to use this command!").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); + return; + } + + ICustomizable item = (ICustomizable) player.getHeldItem().getItem(); + item.customize(player, player.getHeldItem(), args); + } +} diff --git a/src/main/java/com/hbm/commands/CommandLocate.java b/src/main/java/com/hbm/commands/CommandLocate.java new file mode 100644 index 000000000..ec646c817 --- /dev/null +++ b/src/main/java/com/hbm/commands/CommandLocate.java @@ -0,0 +1,118 @@ +package com.hbm.commands; + +import java.util.Collections; +import java.util.List; +import java.util.Locale; + +import com.hbm.lib.HbmWorld; +import com.hbm.world.gen.nbt.NBTStructure; +import com.hbm.world.gen.nbt.SpawnCondition; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommandSender; +import net.minecraft.command.PlayerNotFoundException; +import net.minecraft.command.WrongUsageException; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; + +public class CommandLocate extends CommandBase { + + private static final int MAX_DISTANCE = 256; + + @Override + public String getCommandName() { + return "ntmlocate"; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return String.format(Locale.US, + "%s/%s structure %s- Locates the nearest structure with a given name.", + EnumChatFormatting.GREEN, getCommandName(), EnumChatFormatting.LIGHT_PURPLE + ); + } + + @Override + public void processCommand(ICommandSender sender, String[] args) { + if(!(sender instanceof EntityPlayer)) + throw new PlayerNotFoundException(); + + if(args.length == 0) + throw new WrongUsageException(getCommandUsage(sender), new Object[0]); + + if(args[0].equals("structure")) { + EntityPlayer player = (EntityPlayer) sender; + + SpawnCondition structure = NBTStructure.getStructure(args[1]); + + if(structure == null) { + ChatComponentTranslation message = new ChatComponentTranslation("commands.locate.no_match"); + message.getChatStyle().setColor(EnumChatFormatting.RED); + sender.addChatMessage(message); + return; + } + + int chunkX = MathHelper.floor_double(player.posX) / 16; + int chunkZ = MathHelper.floor_double(player.posZ) / 16; + + ChunkCoordIntPair pos = getNearestLocationTo(structure, player.worldObj, chunkX, chunkZ); + + if(pos == null) { + ChatComponentTranslation message = new ChatComponentTranslation("commands.locate.none_found"); + message.getChatStyle().setColor(EnumChatFormatting.RED); + sender.addChatMessage(message); + return; + } + + ChatComponentTranslation message = new ChatComponentTranslation("commands.locate.success.coordinates", structure.name, pos.chunkXPos * 16, pos.chunkZPos * 16); + message.getChatStyle().setColor(EnumChatFormatting.GREEN); + sender.addChatMessage(message); + } else { + throw new WrongUsageException(getCommandUsage(sender), new Object[0]); + } + } + + private ChunkCoordIntPair getNearestLocationTo(SpawnCondition spawn, World world, int chunkX, int chunkZ) { + if(HbmWorld.worldGenerator.getStructureAt(world, chunkX, chunkZ) == spawn) + return new ChunkCoordIntPair(chunkX, chunkZ); + + for(int radius = 1; radius < MAX_DISTANCE; radius++) { + for(int x = chunkX - radius; x <= chunkX + radius; x++) { + if(HbmWorld.worldGenerator.getStructureAt(world, x, chunkZ - radius) == spawn) + return new ChunkCoordIntPair(x, chunkZ - radius); + if(HbmWorld.worldGenerator.getStructureAt(world, x, chunkZ + radius) == spawn) + return new ChunkCoordIntPair(x, chunkZ + radius); + } + for(int z = chunkZ - radius; z <= chunkZ + radius; z++) { + if(HbmWorld.worldGenerator.getStructureAt(world, chunkX - radius, z) == spawn) + return new ChunkCoordIntPair(chunkX - radius, z); + if(HbmWorld.worldGenerator.getStructureAt(world, chunkX + radius, z) == spawn) + return new ChunkCoordIntPair(chunkX + radius, z); + } + } + + return null; + } + + @SuppressWarnings("unchecked") + @Override + public List addTabCompletionOptions(ICommandSender sender, String[] args) { + if(args.length < 1) + return Collections.emptyList(); + + if(args.length == 1) + return getListOfStringsMatchingLastWord(args, "structure"); + + if(args.length == 2) { + List structures = NBTStructure.listStructures(); + return getListOfStringsMatchingLastWord(args, structures.toArray(new String[structures.size()])); + } + + return Collections.emptyList(); + } + +} diff --git a/src/main/java/com/hbm/commands/CommandReloadRecipes.java b/src/main/java/com/hbm/commands/CommandReloadRecipes.java index 7b1942c2c..a07b43848 100644 --- a/src/main/java/com/hbm/commands/CommandReloadRecipes.java +++ b/src/main/java/com/hbm/commands/CommandReloadRecipes.java @@ -1,6 +1,7 @@ package com.hbm.commands; import com.hbm.config.ItemPoolConfigJSON; +import com.hbm.inventory.FluidContainerRegistry; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.particle.helper.SkeletonCreator; @@ -27,7 +28,9 @@ public class CommandReloadRecipes extends CommandBase { @Override public void processCommand(ICommandSender sender, String[] args) { try { + FluidContainerRegistry.clearRegistry(); // we do this first so IFluidRegisterListener can go wild with the registry Fluids.reloadFluids(); + FluidContainerRegistry.register(); SerializableRecipe.initialize(); ItemPoolConfigJSON.initialize(); DamageResistanceHandler.init(); diff --git a/src/main/java/com/hbm/config/ClientConfig.java b/src/main/java/com/hbm/config/ClientConfig.java index 1ddd4cf21..0dc370790 100644 --- a/src/main/java/com/hbm/config/ClientConfig.java +++ b/src/main/java/com/hbm/config/ClientConfig.java @@ -32,6 +32,7 @@ public class ClientConfig extends RunningConfig { public static ConfigWrapper RENDER_REEDS = new ConfigWrapper(!Compat.isModLoaded(Compat.MOD_ANG)); public static ConfigWrapper NEI_HIDE_SECRETS = new ConfigWrapper(true); public static ConfigWrapper COOLING_TOWER_PARTICLES = new ConfigWrapper(true); + public static ConfigWrapper RENDER_REBAR_SIMPLE = new ConfigWrapper(false); private static void initDefaults() { configMap.put("GEIGER_OFFSET_HORIZONTAL", GEIGER_OFFSET_HORIZONTAL); @@ -53,6 +54,7 @@ public class ClientConfig extends RunningConfig { configMap.put("RENDER_REEDS", RENDER_REEDS); configMap.put("NEI_HIDE_SECRETS", NEI_HIDE_SECRETS); configMap.put("COOLING_TOWER_PARTICLES", COOLING_TOWER_PARTICLES); + configMap.put("RENDER_REBAR_SIMPLE", RENDER_REBAR_SIMPLE); } /** Initializes defaults, then reads the config file if it exists, then writes the config file. */ diff --git a/src/main/java/com/hbm/config/CommonConfig.java b/src/main/java/com/hbm/config/CommonConfig.java index 7fce253e8..d6ead8f95 100644 --- a/src/main/java/com/hbm/config/CommonConfig.java +++ b/src/main/java/com/hbm/config/CommonConfig.java @@ -81,8 +81,8 @@ public class CommonConfig { prop.comment = comment; return prop.getIntList(); } - public static String[] createConfigStringList(Configuration config, String category, String name, String comment) { - Property prop = config.get(category, name, new String[] { "PLACEHOLDER" }); + public static String[] createConfigStringList(Configuration config, String category, String name, String comment, String[] def) { + Property prop = config.get(category, name, def); prop.comment = comment; return prop.getStringList(); } diff --git a/src/main/java/com/hbm/config/CustomMachineConfigJSON.java b/src/main/java/com/hbm/config/CustomMachineConfigJSON.java index 87c67dfd3..7d67aba78 100644 --- a/src/main/java/com/hbm/config/CustomMachineConfigJSON.java +++ b/src/main/java/com/hbm/config/CustomMachineConfigJSON.java @@ -1,9 +1,8 @@ package com.hbm.config; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -148,7 +147,7 @@ public class CustomMachineConfigJSON { public static void readConfig(File config) { try { - JsonObject json = gson.fromJson(new FileReader(config), JsonObject.class); + JsonObject json = gson.fromJson(new InputStreamReader(Files.newInputStream(config.toPath()), StandardCharsets.UTF_8), JsonObject.class); JsonArray machines = json.get("machines").getAsJsonArray(); for(int i = 0; i < machines.size(); i++) { @@ -182,32 +181,32 @@ public class CustomMachineConfigJSON { try { JsonArray recipeShape = machineObject.get("recipeShape").getAsJsonArray(); JsonArray recipeParts = machineObject.get("recipeParts").getAsJsonArray(); - + Object[] parts = new Object[recipeShape.size() + recipeParts.size()]; - + for(int j = 0; j < recipeShape.size(); j++) { parts[j] = recipeShape.get(j).getAsString(); } - + for(int j = 0; j < recipeParts.size(); j++) { Object o = null; - + if(j % 2 == 0) { o = recipeParts.get(j).getAsString().charAt(0); //god is dead and we killed him } else { AStack a = SerializableRecipe.readAStack(recipeParts.get(j).getAsJsonArray()); - + if(a instanceof ComparableStack) o = ((ComparableStack) a).toStack(); if(a instanceof OreDictStack) o = ((OreDictStack) a).name; } - + parts[j + recipeShape.size()] = o; } - + ItemStack stack = new ItemStack(ModBlocks.custom_machine, 1, i + 100); stack.stackTagCompound = new NBTTagCompound(); stack.stackTagCompound.setString("machineType", configuration.unlocalizedName); - + CraftingManager.addRecipeAuto(stack, parts); } catch(Exception ex) { MainRegistry.logger.error("Caught exception trying to parse core recipe for custom machine " + configuration.unlocalizedName); diff --git a/src/main/java/com/hbm/config/GeneralConfig.java b/src/main/java/com/hbm/config/GeneralConfig.java index 09900f007..b52f58073 100644 --- a/src/main/java/com/hbm/config/GeneralConfig.java +++ b/src/main/java/com/hbm/config/GeneralConfig.java @@ -1,7 +1,7 @@ package com.hbm.config; import net.minecraftforge.common.config.Configuration; - +import com.hbm.lib.RefStrings; public class GeneralConfig { public static boolean enableThermosPreventer = true; @@ -39,6 +39,7 @@ public class GeneralConfig { public static boolean enableSoundExtension = true; public static boolean enableMekanismChanges = true; public static boolean enableServerRecipeSync = false; + public static boolean enableLoadScreenReplacement = true; public static int normalSoundChannels = 200; public static boolean enableExpensiveMode = false; @@ -70,6 +71,7 @@ public class GeneralConfig { public static boolean enableLBSMSafeMEDrives = true; public static boolean enableLBSMIGen = true; public static int schrabRate = 20; + public static String[] preferredOutputMod = new String[] {RefStrings.MODID}; public static void loadFromConfig(Configuration config) { @@ -117,7 +119,9 @@ public class GeneralConfig { normalSoundChannels = CommonConfig.createConfigInt(config, CATEGORY_GENERAL, "1.41_normalSoundChannels", "The amount of channels to create while 1.39_enableSoundExtension is enabled.\n" + "Note that a value below 28 or above 200 can cause buggy sounds and issues with other mods running out of sound memory.", 100); - + preferredOutputMod = CommonConfig.createConfigStringList(config,CATEGORY_GENERAL,"1.42_preferredOutputMod", + "The mod which is preferred as output when certain machines autogenerate recipes. Currently used for the shredder", new String[] {RefStrings.MODID}); + enableLoadScreenReplacement = config.get(CATEGORY_GENERAL, "1.43_enableLoadScreenReplacement", true, "Tries to replace the vanilla load screen with the 'tip of the day' one, may clash with other mods trying to do the same.").getBoolean(true); enableExpensiveMode = config.get(CATEGORY_GENERAL, "1.99_enableExpensiveMode", false, "It does what the name implies.").getBoolean(false); 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 index 2f6bb9bf9..5ce4c6d51 100644 --- a/src/main/java/com/hbm/config/StructureConfig.java +++ b/src/main/java/com/hbm/config/StructureConfig.java @@ -10,8 +10,8 @@ public class StructureConfig { public static int enableStructures = 2; - public static int structureMinChunks = 8; - public static int structureMaxChunks = 24; + public static int structureMinChunks = 4; + public static int structureMaxChunks = 12; public static double lootAmountFactor = 1D; @@ -25,15 +25,15 @@ public class StructureConfig { enableStructures = CommonConfig.parseStructureFlag(unparsedStructureFlag); - 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); + structureMinChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.01_structureMinChunks", "Minimum non-zero distance between structures in chunks (Settings lower than 8 may be problematic).", 4); + structureMaxChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.02_structureMaxChunks", "Maximum non-zero distance between structures in chunks.", 16); lootAmountFactor = CommonConfig.createConfigDouble(config, CATEGORY_STRUCTURES, "5.03_lootAmountFactor", "General factor for loot spawns. Applies to spawned IInventories, not loot blocks.", 1D); debugStructures = CommonConfig.createConfigBool(config, CATEGORY_STRUCTURES, "5.04_debugStructures", "If enabled, special structure blocks like jigsaw blocks will not be transformed after generating", false); - structureMinChunks = CommonConfig.setDef(structureMinChunks, 8); - structureMaxChunks = CommonConfig.setDef(structureMaxChunks, 24); + structureMinChunks = CommonConfig.setDef(structureMinChunks, 4); + structureMaxChunks = CommonConfig.setDef(structureMaxChunks, 12); if(structureMinChunks > structureMaxChunks) { MainRegistry.logger.error("Fatal error config: Minimum value has been set higher than the maximum value!"); diff --git a/src/main/java/com/hbm/config/WorldConfig.java b/src/main/java/com/hbm/config/WorldConfig.java index 0eb14c026..f6faf2856 100644 --- a/src/main/java/com/hbm/config/WorldConfig.java +++ b/src/main/java/com/hbm/config/WorldConfig.java @@ -81,7 +81,7 @@ public class WorldConfig { public static boolean enableSulfurCave = true; public static boolean enableAsbestosCave = true; - public static int radioStructure = 500; +// public static int radioStructure = 500; public static int antennaStructure = 250; public static int atomStructure = 500; public static int dungeonStructure = 64; @@ -204,7 +204,7 @@ public class WorldConfig { enableAsbestosCave = CommonConfig.createConfigBool(config, CATEGORY_OREGEN, "2.C01_enableAsbestosCave", "Toggles asbestos caves", true); final String CATEGORY_DUNGEON = CommonConfig.CATEGORY_DUNGEONS; - radioStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.00_radioSpawn", "Spawn radio station on every nTH chunk", 500); +// radioStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.00_radioSpawn", "Spawn radio station on every nTH chunk", 500); antennaStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.01_antennaSpawn", "Spawn antenna on every nTH chunk", 250); atomStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.02_atomSpawn", "Spawn power plant on every nTH chunk", 500); dungeonStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.04_dungeonSpawn", "Spawn library dungeon on every nTH chunk", 64); @@ -245,7 +245,7 @@ public class WorldConfig { craterBiomeOuterRad = (float) CommonConfig.createConfigDouble(config, CATEGORY_BIOMES, "17.R02_craterBiomeOuterRad", "RAD/s for the outer crater biome", 0.5D); craterBiomeWaterMult = (float) CommonConfig.createConfigDouble(config, CATEGORY_BIOMES, "17.R03_craterBiomeWaterMult", "Multiplier for RAD/s in crater biomes when in water", 5D); - radioStructure = CommonConfig.setDefZero(radioStructure, 1000); +// radioStructure = CommonConfig.setDefZero(radioStructure, 1000); antennaStructure = CommonConfig.setDefZero(antennaStructure, 1000); atomStructure = CommonConfig.setDefZero(atomStructure, 1000); dungeonStructure = CommonConfig.setDefZero(dungeonStructure, 1000); diff --git a/src/main/java/com/hbm/crafting/ConsumableRecipes.java b/src/main/java/com/hbm/crafting/ConsumableRecipes.java index a64f9759c..6c3e6f3b3 100644 --- a/src/main/java/com/hbm/crafting/ConsumableRecipes.java +++ b/src/main/java/com/hbm/crafting/ConsumableRecipes.java @@ -27,11 +27,11 @@ public class ConsumableRecipes { public static void register() { //Airstikes - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 0), new Object[] { "TTT", "TRT", "TTT", 'T', Blocks.tnt, 'R', ModItems.detonator_laser }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 1), new Object[] { "TTT", "TRT", "TTT", 'T', ModItems.grenade_gascan, 'R', ModItems.detonator_laser }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 2), new Object[] { "TTT", "TRT", "TTT", 'T', ModItems.pellet_gas, 'R', ModItems.detonator_laser }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 3), new Object[] { "TRT", 'T', ModItems.grenade_cloud, 'R', ModItems.detonator_laser }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 4), new Object[] { "TR", 'T', DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.NUKE_HIGH), 'R', ModItems.detonator_laser }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 0), new Object[] { "TTT", "TRT", "TTT", 'T', Blocks.tnt, 'R', ModItems.rangefinder }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 1), new Object[] { "TTT", "TRT", "TTT", 'T', ModItems.grenade_gascan, 'R', ModItems.rangefinder }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 2), new Object[] { "TTT", "TRT", "TTT", 'T', ModItems.pellet_gas, 'R', ModItems.rangefinder }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 3), new Object[] { "TRT", 'T', ModItems.grenade_cloud, 'R', ModItems.rangefinder }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 4), new Object[] { "TRC", 'T', DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.NUKE_HIGH), 'R', ModItems.rangefinder, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.CONTROLLER) }); //Food CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_waffle, 1), new Object[] { "WEW", "MPM", "WEW", 'W', Items.wheat, 'E', Items.egg, 'M', Items.milk_bucket, 'P', ModItems.man_core }); @@ -89,8 +89,6 @@ public class ConsumableRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.bottle2_empty, 6), new Object[] { " G ", "G G", "G G", 'G', KEY_ANYPANE }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.bottle2_korl, 1), new Object[] { ModItems.bottle2_empty, Items.potionitem, Items.sugar, CU.dust() }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.bottle2_fritz, 1), new Object[] { ModItems.bottle2_empty, Items.potionitem, Items.sugar, W.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.bottle2_korl_special, 1), new Object[] { ModItems.bottle2_empty, Items.potionitem, Items.sugar, CU.dust(), ST.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.bottle2_fritz_special, 1), new Object[] { ModItems.bottle2_empty, Items.potionitem, Items.sugar, W.dust(), TH232.dust() }); //Syringes CraftingManager.addRecipeAuto(new ItemStack(ModItems.syringe_empty, 6), new Object[] { "P", "C", "B", 'B', Item.getItemFromBlock(Blocks.iron_bars), 'C', ModItems.cell_empty, 'P', IRON.plate() }); diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index 26a04b5fe..45ad0922c 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -112,10 +112,11 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.ullapool_caber, 1), new Object[] { "ITI", " S ", " S ", 'I', IRON.plate(), 'T', Blocks.tnt, 'S', KEY_STICK }); //Utility - CraftingManager.addRecipeAuto(new ItemStack(ModItems.designator, 1), new Object[] { " A", "#B#", "#B#", '#', IRON.plate(), 'A', STEEL.plate(), 'B', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.designator_range, 1), new Object[] { "RRD", "PIC", " P", 'P', STEEL.plate(), 'R', Items.redstone, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'D', ModItems.designator, 'I', STEEL.ingot() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.rangefinder, 1), new Object[] { "GRC", " S", 'G', KEY_ANYPANE, 'R', REDSTONE.dust(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'S' ,STEEL.plate() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.designator, 1), new Object[] { " A", "#B#", "#B#", '#', ANY_PLASTIC.ingot(), 'A', STEEL.plate(), 'B', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC) }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.designator_range, 1), new Object[] { ModItems.rangefinder, ModItems.designator, ANY_PLASTIC.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.designator_manual, 1), new Object[] { " A", "#C#", "#B#", '#', ANY_PLASTIC.ingot(), 'A', PB.plate(), 'B', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'C', ModItems.designator }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.designator_arty_range, 1), new Object[] { "M", "C", "P", 'M', ModItems.magnetron, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'P', ANY_PLASTIC.ingot() }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.designator_arty_range, 1), new Object[] { ModItems.rangefinder, DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), ANY_PLASTIC.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.linker, 1), new Object[] { "I I", "ICI", "GGG", 'I', IRON.plate(), 'G', GOLD.plate(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.oil_detector, 1), new Object[] { "W I", "WCI", "PPP", 'W', GOLD.wireFine(), 'I', CU.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ANALOG), 'P', STEEL.plate528() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.turret_chip, 1), new Object[] { "WWW", "CPC", "WWW", 'W', GOLD.wireFine(), 'P', ANY_PLASTIC.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), }); @@ -155,10 +156,15 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(ItemBlowtorch.getEmptyTool(ModItems.blowtorch), new Object[] { "CC ", " I ", "CCC", 'C', CU.plate528(), 'I', IRON.ingot() }); CraftingManager.addRecipeAuto(ItemBlowtorch.getEmptyTool(ModItems.acetylene_torch), new Object[] { "SS ", " PS", " T ", 'S', STEEL.plate528(), 'P', ANY_PLASTIC.ingot(), 'T', ModItems.tank_steel }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.boltgun), new Object[] { "DPS", " RD", " D ", 'D', DURA.ingot(), 'P', DictFrame.fromOne(ModItems.part_generic, EnumPartType.PISTON_PNEUMATIC), 'R', RUBBER.ingot(), 'S', STEEL.shell() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.rebar_placer), new Object[] { "RDR", "DWD", "RDR", 'R', ModBlocks.rebar, 'D', ModItems.ducttape, 'W', ModItems.wrench }); //Bobmazon CraftingManager.addShapelessAuto(new ItemStack(ModItems.bobmazon), new Object[] { Items.book, Items.gold_nugget, Items.string, KEY_BLUE }); - + + //Blueprints + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.blueprint_folder, 1, 0), new Object[] { ModItems.blueprints, ModItems.blueprints, ModItems.blueprints }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.blueprint_folder, 1, 1), new Object[] { ModItems.blueprints, ModItems.blueprints, ModItems.blueprints, ModItems.blueprints, ModItems.blueprints, ModItems.fragment_meteorite }); + //Carts CraftingManager.addRecipeAuto(ItemModMinecart.createCartItem(EnumCartBase.WOOD, EnumMinecart.EMPTY), new Object[] { "P P", "WPW", 'P',KEY_SLAB, 'W', KEY_PLANKS }); CraftingManager.addRecipeAuto(ItemModMinecart.createCartItem(EnumCartBase.STEEL, EnumMinecart.EMPTY), new Object[] { "P P", "IPI", 'P', STEEL.plate(), 'I', STEEL.ingot() }); diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index 238de0e25..8696b2599 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -207,7 +207,7 @@ public class WeaponRecipes { //Ammo assemblies - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_nuke, 1), new Object[] { " WP", "SEP", " WP", 'W', GOLD.wireFine(), 'P', STEEL.plate(), 'S', STEEL.shell(), 'E', ModItems.ball_tatb }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_nuke, 1), new Object[] { " WP", "SEP", " WP", 'W', GOLD.wireFine(), 'P', WEAPONSTEEL.plate(), 'S', WEAPONSTEEL.shell(), 'E', ModItems.ball_tatb }); //240mm Shells CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_shell, 4), new Object[] { " T ", "GHG", "CCC", 'T', ModBlocks.tnt, 'G', Items.gunpowder, 'H', STEEL.shell(), 'C', CU.ingot() }); diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index 18ca656e5..5f50d8f1a 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -31,6 +31,7 @@ import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EnumCreatureType; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.biome.BiomeGenBase.SpawnListEntry; +import net.minecraft.world.biome.BiomeGenMushroomIsland; import net.minecraftforge.common.BiomeDictionary; import net.minecraftforge.common.BiomeDictionary.Type; @@ -204,6 +205,7 @@ public class EntityMappings { addEntity(EntityFallingBlockNT.class, "entity_falling_block_nt", 1000); addEntity(EntityBoatRubber.class, "entity_rubber_boat", 250, false); addEntity(EntityMissileStealth.class, "entity_missile_stealth", 1000); + addEntity(EntityCoin.class, "entity_coin", 1000); addEntity(EntityItemWaste.class, "entity_item_waste", 100); addEntity(EntityItemBuoyant.class, "entity_item_buoyant", 100); @@ -279,6 +281,7 @@ public class EntityMappings { for(BiomeGenBase biome : biomes) { if(biome == null) continue; + if(biome instanceof BiomeGenMushroomIsland) continue; List spawns = biome.getSpawnableList(typeOfCreature); diff --git a/src/main/java/com/hbm/entity/effect/EntityFireLingering.java b/src/main/java/com/hbm/entity/effect/EntityFireLingering.java index 1aef970e4..4eb1eac76 100644 --- a/src/main/java/com/hbm/entity/effect/EntityFireLingering.java +++ b/src/main/java/com/hbm/entity/effect/EntityFireLingering.java @@ -20,6 +20,8 @@ public class EntityFireLingering extends Entity { public static int TYPE_DIESEL = 0; public static int TYPE_BALEFIRE = 1; public static int TYPE_PHOSPHORUS = 2; + public static int TYPE_OXY = 3; + public static int TYPE_BLACK = 4; public int maxAge = 150; public EntityFireLingering(World world) { @@ -75,6 +77,7 @@ public class EntityFireLingering extends Entity { if(this.getType() == this.TYPE_DIESEL) if(props.fire < 60) props.fire = 60; if(this.getType() == this.TYPE_PHOSPHORUS) if(props.fire < 300) props.fire = 300; if(this.getType() == this.TYPE_BALEFIRE) if(props.balefire < 100) props.balefire = 100; + if(this.getType() == this.TYPE_BLACK) if(props.blackFire < 200) props.blackFire = 200; else props.blackFire += 5; } else { e.setFire(4); } @@ -92,6 +95,7 @@ public class EntityFireLingering extends Entity { if(this.getType() == this.TYPE_DIESEL) FlameCreator.composeEffectClient(worldObj, x, down.yCoord, z, FlameCreator.META_FIRE); if(this.getType() == this.TYPE_PHOSPHORUS) FlameCreator.composeEffectClient(worldObj, x, down.yCoord, z, FlameCreator.META_FIRE); if(this.getType() == this.TYPE_BALEFIRE) FlameCreator.composeEffectClient(worldObj, x, down.yCoord, z, FlameCreator.META_BALEFIRE); + if(this.getType() == this.TYPE_BLACK) FlameCreator.composeEffectClient(worldObj, x, down.yCoord, z, FlameCreator.META_BLACK); } } } diff --git a/src/main/java/com/hbm/entity/item/EntityDeliveryDrone.java b/src/main/java/com/hbm/entity/item/EntityDeliveryDrone.java index db9e90da3..78ec2e81f 100644 --- a/src/main/java/com/hbm/entity/item/EntityDeliveryDrone.java +++ b/src/main/java/com/hbm/entity/item/EntityDeliveryDrone.java @@ -200,7 +200,7 @@ public class EntityDeliveryDrone extends EntityDroneBase implements IInventory, } // This is the lowest padding that worked with my drone waypoint path. if they stop getting loaded crank up paddingSize - for (ChunkCoordIntPair chunk : ChunkShapeHelper.getChunksAlongLineSegment((int) this.posX, (int) this.posZ, (int) (this.posX + this.motionX), (int) (this.posZ + this.motionZ), 4)){ + for (ChunkCoordIntPair chunk : ChunkShapeHelper.getChunksAlongLineSegment((int) Math.floor(this.posX), (int) Math.floor(this.posZ), (int) Math.floor(this.posX + this.motionX), (int) Math.floor(this.posZ + this.motionZ), 8)){ ForgeChunkManager.forceChunk(loaderTicket, chunk); } } diff --git a/src/main/java/com/hbm/entity/logic/EntityBalefire.java b/src/main/java/com/hbm/entity/logic/EntityBalefire.java index b368e171d..369a4aba9 100644 --- a/src/main/java/com/hbm/entity/logic/EntityBalefire.java +++ b/src/main/java/com/hbm/entity/logic/EntityBalefire.java @@ -10,8 +10,8 @@ import com.hbm.main.MainRegistry; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class EntityBalefire extends EntityExplosionChunkloading { - +public class EntityBalefire extends EntityExplosionChunkloading { + public int age = 0; public int destructionRange = 0; public ExplosionBalefire exp; @@ -24,13 +24,11 @@ public class EntityBalefire extends EntityExplosionChunkloading { destructionRange = nbt.getInteger("destructionRange"); speed = nbt.getInteger("speed"); did = nbt.getBoolean("did"); - - - exp = new ExplosionBalefire((int)this.posX, (int)this.posY, (int)this.posZ, this.worldObj, this.destructionRange); + + exp = new ExplosionBalefire((int) this.posX, (int) this.posY, (int) this.posZ, this.worldObj, this.destructionRange); exp.readFromNbt(nbt, "exp_"); - - this.did = true; - + + this.did = true; } @Override @@ -39,10 +37,10 @@ public class EntityBalefire extends EntityExplosionChunkloading { nbt.setInteger("destructionRange", destructionRange); nbt.setInteger("speed", speed); nbt.setBoolean("did", did); - + if(exp != null) exp.saveToNbt(nbt, "exp_"); - + } public EntityBalefire(World p_i1582_1_) { @@ -53,7 +51,8 @@ public class EntityBalefire extends EntityExplosionChunkloading { public void onUpdate() { super.onUpdate(); - if(!worldObj.isRemote) loadChunk((int) Math.floor(posX / 16D), (int) Math.floor(posZ / 16D)); + if(!worldObj.isRemote) + loadChunk((int) Math.floor(posX / 16D), (int) Math.floor(posZ / 16D)); if(!this.did) { if(GeneralConfig.enableExtendedLogging && !worldObj.isRemote) diff --git a/src/main/java/com/hbm/entity/logic/EntityExplosionChunkloading.java b/src/main/java/com/hbm/entity/logic/EntityExplosionChunkloading.java index 91b4e4eb9..eae135e54 100644 --- a/src/main/java/com/hbm/entity/logic/EntityExplosionChunkloading.java +++ b/src/main/java/com/hbm/entity/logic/EntityExplosionChunkloading.java @@ -44,7 +44,7 @@ public abstract class EntityExplosionChunkloading extends Entity implements IChu } public void clearChunkLoader() { - if(!worldObj.isRemote && loaderTicket != null && loadedChunk != null) { + if(!worldObj.isRemote && loaderTicket != null) { ForgeChunkManager.releaseTicket(loaderTicket); this.loaderTicket = null; } diff --git a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK3.java b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK3.java index df4eae71d..1f2e64316 100644 --- a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK3.java +++ b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK3.java @@ -259,6 +259,10 @@ public class EntityNukeExplosionMK3 extends EntityExplosionChunkloading { break; } } + + if(!entity.isDead) { + entity.loadChunk((int) Math.floor(x / 16D), (int) Math.floor(z / 16D)); + } return entity; } diff --git a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java index dac30b1db..cabe50118 100644 --- a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java +++ b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java @@ -10,7 +10,6 @@ import com.hbm.config.GeneralConfig; import com.hbm.entity.effect.EntityFalloutRain; import com.hbm.explosion.ExplosionNukeGeneric; import com.hbm.explosion.ExplosionNukeRayBatched; -import com.hbm.explosion.ExplosionNukeRayParallelized; import com.hbm.main.MainRegistry; import com.hbm.util.ContaminationUtil; import com.hbm.util.ContaminationUtil.ContaminationType; @@ -70,13 +69,11 @@ public class EntityNukeExplosionMK5 extends EntityExplosionChunkloading { if(explosion == null) { explosionStart = System.currentTimeMillis(); - if (BombConfig.explosionAlgorithm == 1 || BombConfig.explosionAlgorithm == 2) { - explosion = new ExplosionNukeRayParallelized(worldObj, posX, posY, posZ, - strength, speed, length); - } else { - explosion = new ExplosionNukeRayBatched(worldObj, (int) posX, (int) posY, (int) posZ, - strength, speed, length); - } + //if(BombConfig.explosionAlgorithm == 1 || BombConfig.explosionAlgorithm == 2) { + // explosion = new ExplosionNukeRayParallelized(worldObj, posX, posY, posZ, strength, speed, length); + //} else { + explosion = new ExplosionNukeRayBatched(worldObj, (int) posX, (int) posY, (int) posZ, strength, speed, length); + //} } if(!explosion.isComplete()) { @@ -162,6 +159,7 @@ public class EntityNukeExplosionMK5 extends EntityExplosionChunkloading { mk5.speed = (int)Math.ceil(100000 / mk5.strength); mk5.setPosition(x, y, z); mk5.length = mk5.strength / 2; + mk5.loadChunk((int) Math.floor(x / 16D), (int) Math.floor(z / 16D)); return mk5; } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java b/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java index c35497bce..6da5ec5a8 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileBaseNT.java @@ -281,12 +281,12 @@ public abstract class EntityMissileBaseNT extends EntityThrowableInterp implemen @Override protected void onImpact(MovingObjectPosition mop) { if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK) { - this.onImpact(); + this.onMissileImpact(mop); this.setDead(); } } - public abstract void onImpact(); + public abstract void onMissileImpact(MovingObjectPosition mop); public abstract List getDebris(); public abstract ItemStack getDebrisRareDrop(); public void cluster() { } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java b/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java index 0bfe4efb6..70546d978 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java @@ -25,6 +25,7 @@ import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; @@ -161,7 +162,7 @@ public class EntityMissileCustom extends EntityMissileBaseNT implements IChunkLo } @Override - public void onImpact() { //TODO: demolish this steaming pile of shit + public void onMissileImpact(MovingObjectPosition mop) { //TODO: demolish this steaming pile of shit ItemCustomMissilePart part = (ItemCustomMissilePart) Item.getItemById(this.dataWatcher.getWatchableObjectInt(9)); diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java b/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java index 0205a13f2..5cfea36a6 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java @@ -15,6 +15,7 @@ import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; public class EntityMissileShuttle extends EntityMissileBaseNT { @@ -28,7 +29,7 @@ public class EntityMissileShuttle extends EntityMissileBaseNT { } @Override - public void onImpact() { + public void onMissileImpact(MovingObjectPosition mop) { ExplosionNT explosion = new ExplosionNT(worldObj, null, this.posX + 0.5F, this.posY + 0.5F, this.posZ + 0.5F, 20.0F).overrideResolution(64); explosion.atttributes.add(ExAttrib.NOSOUND); explosion.atttributes.add(ExAttrib.NOPARTICLE); diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileStealth.java b/src/main/java/com/hbm/entity/missile/EntityMissileStealth.java index 0dc2528aa..7827c3ad9 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileStealth.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileStealth.java @@ -10,6 +10,7 @@ import com.hbm.particle.helper.ExplosionCreator; import com.hbm.items.ModItems; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; public class EntityMissileStealth extends EntityMissileBaseNT { @@ -27,7 +28,7 @@ public class EntityMissileStealth extends EntityMissileBaseNT { @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_stealth); } @Override public boolean canBeSeenBy(Object radar) { return false; } - @Override public void onImpact() { this.explodeStandard(20F, 24, false); ExplosionCreator.composeEffectStandard(worldObj, posX, posY, posZ); } + @Override public void onMissileImpact(MovingObjectPosition mop) { this.explodeStandard(20F, 24, false); ExplosionCreator.composeEffectStandard(worldObj, posX, posY, posZ); } @Override public ItemStack getDebrisRareDrop() { return DictFrame.fromOne(ModItems.powder_ash, EnumAshType.MISC); } } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java index 315f7c30b..f1ce3a4bb 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java @@ -16,11 +16,13 @@ import com.hbm.inventory.material.Mats; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; +import com.hbm.world.WorldUtil; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; public abstract class EntityMissileTier0 extends EntityMissileBaseNT { @@ -49,7 +51,7 @@ public abstract class EntityMissileTier0 extends EntityMissileBaseNT { @Override public ItemStack getDebrisRareDrop() { return null; } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_test); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { int x = (int) Math.floor(posX); int y = (int) Math.floor(posY); int z = (int) Math.floor(posZ); @@ -80,7 +82,7 @@ public abstract class EntityMissileTier0 extends EntityMissileBaseNT { public static class EntityMissileMicro extends EntityMissileTier0 { public EntityMissileMicro(World world) { super(world); } public EntityMissileMicro(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { ExplosionNukeSmall.explode(worldObj, posX, posY + 0.5, posZ, ExplosionNukeSmall.PARAMS_HIGH); } + @Override public void onMissileImpact(MovingObjectPosition mop) { ExplosionNukeSmall.explode(worldObj, posX, posY + 0.5, posZ, ExplosionNukeSmall.PARAMS_HIGH); } @Override public ItemStack getDebrisRareDrop() { return DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.NUKE_HIGH); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_micro); } } @@ -88,10 +90,10 @@ public abstract class EntityMissileTier0 extends EntityMissileBaseNT { public static class EntityMissileSchrabidium extends EntityMissileTier0 { public EntityMissileSchrabidium(World world) { super(world); } public EntityMissileSchrabidium(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { EntityNukeExplosionMK3 ex = EntityNukeExplosionMK3.statFacFleija(worldObj, posX, posY, posZ, BombConfig.aSchrabRadius); if(!ex.isDead) { - worldObj.spawnEntityInWorld(ex); + WorldUtil.loadAndSpawnEntityInWorld(ex); EntityCloudFleija cloud = new EntityCloudFleija(this.worldObj, BombConfig.aSchrabRadius); cloud.posX = this.posX; cloud.posY = this.posY; @@ -106,7 +108,7 @@ public abstract class EntityMissileTier0 extends EntityMissileBaseNT { public static class EntityMissileBHole extends EntityMissileTier0 { public EntityMissileBHole(World world) { super(world); } public EntityMissileBHole(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 1.5F, true); EntityBlackHole bl = new EntityBlackHole(this.worldObj, 1.5F); bl.posX = this.posX; @@ -121,15 +123,15 @@ public abstract class EntityMissileTier0 extends EntityMissileBaseNT { public static class EntityMissileTaint extends EntityMissileTier0 { public EntityMissileTaint(World world) { super(world); } public EntityMissileTaint(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 10.0F, true); + @Override public void onMissileImpact(MovingObjectPosition mop) { + this.worldObj.createExplosion(this, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, 5.0F, true); for(int i = 0; i < 100; i++) { - int a = rand.nextInt(11) + (int) this.posX - 5; - int b = rand.nextInt(11) + (int) this.posY - 5; - int c = rand.nextInt(11) + (int) this.posZ - 5; + int a = rand.nextInt(11) + (int) mop.blockX - 5; + int b = rand.nextInt(11) + (int) mop.blockY - 5; + int c = rand.nextInt(11) + (int) mop.blockZ - 5; Block block = worldObj.getBlock(a, b, c); if(block.isNormalCube() && !block.isAir(worldObj, a, b, c)) { - worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(3) + 4, 2); + worldObj.setBlock(a, b, c, ModBlocks.taint, 0, 2); } } } @@ -140,7 +142,7 @@ public abstract class EntityMissileTier0 extends EntityMissileBaseNT { public static class EntityMissileEMP extends EntityMissileTier0 { public EntityMissileEMP(World world) { super(world); } public EntityMissileEMP(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { ExplosionNukeGeneric.empBlast(worldObj, (int)posX, (int)posY, (int)posZ, 50); EntityEMPBlast wave = new EntityEMPBlast(worldObj, 50); wave.posX = posX; diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java index 538eb439e..f140d1f26 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java @@ -10,6 +10,7 @@ import com.hbm.particle.helper.ExplosionCreator; import api.hbm.entity.IRadarDetectableNT; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; public abstract class EntityMissileTier1 extends EntityMissileBaseNT { @@ -33,7 +34,7 @@ public abstract class EntityMissileTier1 extends EntityMissileBaseNT { public static class EntityMissileGeneric extends EntityMissileTier1 { public EntityMissileGeneric(World world) { super(world); } public EntityMissileGeneric(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { this.explodeStandard(15F, 24, false); ExplosionCreator.composeEffectSmall(worldObj, posX, posY, posZ); } + @Override public void onMissileImpact(MovingObjectPosition mop) { this.explodeStandard(15F, 24, false); ExplosionCreator.composeEffectSmall(worldObj, posX, posY, posZ); } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_generic_small); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_generic); } } @@ -41,7 +42,7 @@ public abstract class EntityMissileTier1 extends EntityMissileBaseNT { public static class EntityMissileDecoy extends EntityMissileTier1 { public EntityMissileDecoy(World world) { super(world); } public EntityMissileDecoy(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { worldObj.newExplosion(this, posX, posY, posZ, 4F, false, false); } + @Override public void onMissileImpact(MovingObjectPosition mop) { worldObj.newExplosion(this, posX, posY, posZ, 4F, false, false); } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.ingot_steel); } @Override public String getUnlocalizedName() { return "radar.target.tier4"; } @Override public int getBlipLevel() { return IRadarDetectableNT.TIER4; } @@ -51,7 +52,7 @@ public abstract class EntityMissileTier1 extends EntityMissileBaseNT { public static class EntityMissileIncendiary extends EntityMissileTier1 { public EntityMissileIncendiary(World world) { super(world); } public EntityMissileIncendiary(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { this.explodeStandard(15F, 24, true); ExplosionCreator.composeEffectSmall(worldObj, posX, posY, posZ); } + @Override public void onMissileImpact(MovingObjectPosition mop) { this.explodeStandard(15F, 24, true); ExplosionCreator.composeEffectSmall(worldObj, posX, posY, posZ); } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_incendiary_small); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_incendiary); } } @@ -59,11 +60,11 @@ public abstract class EntityMissileTier1 extends EntityMissileBaseNT { public static class EntityMissileCluster extends EntityMissileTier1 { public EntityMissileCluster(World world) { super(world); } public EntityMissileCluster(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); this.isCluster = true; } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 5F, true); ExplosionChaos.cluster(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 25, 100); } - @Override public void cluster() { this.onImpact(); } + @Override public void cluster() { this.onMissileImpact(null); } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_cluster_small); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_cluster); } } @@ -71,7 +72,7 @@ public abstract class EntityMissileTier1 extends EntityMissileBaseNT { public static class EntityMissileBunkerBuster extends EntityMissileTier1 { public EntityMissileBunkerBuster(World world) { super(world); } public EntityMissileBunkerBuster(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { for(int i = 0; i < 15; i++) this.worldObj.createExplosion(this, this.posX, this.posY - i, this.posZ, 5F, true); ExplosionLarge.spawnParticles(worldObj, this.posX, this.posY, this.posZ, 5); ExplosionLarge.spawnShrapnels(worldObj, this.posX, this.posY, this.posZ, 5); diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier2.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier2.java index c2b752e5d..25b1d2fda 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier2.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier2.java @@ -11,6 +11,7 @@ import com.hbm.particle.helper.ExplosionCreator; import api.hbm.entity.IRadarDetectableNT; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; public abstract class EntityMissileTier2 extends EntityMissileBaseNT { @@ -42,7 +43,7 @@ public abstract class EntityMissileTier2 extends EntityMissileBaseNT { public static class EntityMissileStrong extends EntityMissileTier2 { public EntityMissileStrong(World world) { super(world); } public EntityMissileStrong(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { this.explodeStandard(30F, 32, false); ExplosionCreator.composeEffectStandard(worldObj, posX, posY, posZ); } + @Override public void onMissileImpact(MovingObjectPosition mop) { this.explodeStandard(30F, 32, false); ExplosionCreator.composeEffectStandard(worldObj, posX, posY, posZ); } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_generic_medium); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_strong); } } @@ -50,7 +51,7 @@ public abstract class EntityMissileTier2 extends EntityMissileBaseNT { public static class EntityMissileIncendiaryStrong extends EntityMissileTier2 { public EntityMissileIncendiaryStrong(World world) { super(world); } public EntityMissileIncendiaryStrong(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { this.explodeStandard(30F, 32, true); ExplosionCreator.composeEffectStandard(worldObj, posX, posY, posZ); ExplosionChaos.flameDeath(this.worldObj, (int)((float)this.posX + 0.5F), (int)((float)this.posY + 0.5F), (int)((float)this.posZ + 0.5F), 25); @@ -62,11 +63,11 @@ public abstract class EntityMissileTier2 extends EntityMissileBaseNT { public static class EntityMissileClusterStrong extends EntityMissileTier2 { public EntityMissileClusterStrong(World world) { super(world); } public EntityMissileClusterStrong(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); this.isCluster = true; } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 15F, true); ExplosionChaos.cluster(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 50, 100); } - @Override public void cluster() { this.onImpact(); } + @Override public void cluster() { this.onMissileImpact(null); } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_cluster_medium); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_cluster_strong); } } @@ -74,7 +75,7 @@ public abstract class EntityMissileTier2 extends EntityMissileBaseNT { public static class EntityMissileBusterStrong extends EntityMissileTier2 { public EntityMissileBusterStrong(World world) { super(world); } public EntityMissileBusterStrong(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { for(int i = 0; i < 20; i++) this.worldObj.createExplosion(this, this.posX, this.posY - i, this.posZ, 7.5F, true); ExplosionLarge.spawnParticles(worldObj, this.posX, this.posY, this.posZ, 8); ExplosionLarge.spawnShrapnels(worldObj, this.posX, this.posY, this.posZ, 8); @@ -87,7 +88,7 @@ public abstract class EntityMissileTier2 extends EntityMissileBaseNT { public static class EntityMissileEMPStrong extends EntityMissileTier2 { public EntityMissileEMPStrong(World world) { super(world); } public EntityMissileEMPStrong(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { EntityEMP emp = new EntityEMP(worldObj); emp.posX = posX; emp.posY = posY; diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java index de02e1aa2..fcff48108 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier3.java @@ -12,6 +12,7 @@ import com.hbm.particle.helper.ExplosionCreator; import api.hbm.entity.IRadarDetectableNT; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; @@ -58,7 +59,7 @@ public abstract class EntityMissileTier3 extends EntityMissileBaseNT { public static class EntityMissileBurst extends EntityMissileTier3 { public EntityMissileBurst(World world) { super(world); } public EntityMissileBurst(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { this.explodeStandard(50F, 48, false); ExplosionCreator.composeEffectLarge(worldObj, posX, posY, posZ); } @@ -69,7 +70,7 @@ public abstract class EntityMissileTier3 extends EntityMissileBaseNT { public static class EntityMissileInferno extends EntityMissileTier3 { public EntityMissileInferno(World world) { super(world); } public EntityMissileInferno(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { this.explodeStandard(50F, 48, true); ExplosionCreator.composeEffectLarge(worldObj, posX, posY, posZ); ExplosionChaos.burn(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 10); @@ -82,11 +83,11 @@ public abstract class EntityMissileTier3 extends EntityMissileBaseNT { public static class EntityMissileRain extends EntityMissileTier3 { public EntityMissileRain(World world) { super(world); } public EntityMissileRain(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); this.isCluster = true; } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 25F, true); ExplosionChaos.cluster(this.worldObj, (int)this.posX, (int)this.posY, (int)this.posZ, 100, 100); } - @Override public void cluster() { this.onImpact(); } + @Override public void cluster() { this.onMissileImpact(null); } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_cluster_large); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_rain); } } @@ -94,7 +95,7 @@ public abstract class EntityMissileTier3 extends EntityMissileBaseNT { public static class EntityMissileDrill extends EntityMissileTier3 { public EntityMissileDrill(World world) { super(world); } public EntityMissileDrill(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { for(int i = 0; i < 30; i++) { ExplosionNT explosion = new ExplosionNT(worldObj, this, this.posX, this.posY - i, this.posZ, 10F); explosion.addAllAttrib(ExAttrib.ERRODE); diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java index dfdfe9b8e..7d8b1c91b 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier4.java @@ -9,9 +9,11 @@ import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.entity.logic.EntityNukeExplosionMK5; import com.hbm.explosion.ExplosionLarge; import com.hbm.items.ModItems; +import com.hbm.world.WorldUtil; import api.hbm.entity.IRadarDetectableNT; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; @@ -63,8 +65,8 @@ public abstract class EntityMissileTier4 extends EntityMissileBaseNT { public static class EntityMissileNuclear extends EntityMissileTier4 { public EntityMissileNuclear(World world) { super(world); } public EntityMissileNuclear(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { - this.worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius, posX, posY, posZ)); + @Override public void onMissileImpact(MovingObjectPosition mop) { + WorldUtil.loadAndSpawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius, posX, posY, posZ)); EntityNukeTorex.statFacStandard(worldObj, posX, posY, posZ, BombConfig.missileRadius); } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.warhead_nuclear); } @@ -74,8 +76,8 @@ public abstract class EntityMissileTier4 extends EntityMissileBaseNT { public static class EntityMissileMirv extends EntityMissileTier4 { public EntityMissileMirv(World world) { super(world); } public EntityMissileMirv(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { - worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius * 2, posX, posY, posZ)); + @Override public void onMissileImpact(MovingObjectPosition mop) { + WorldUtil.loadAndSpawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius * 2, posX, posY, posZ)); EntityNukeTorex.statFacStandard(worldObj, posX, posY, posZ, BombConfig.missileRadius * 2); } @Override public List getDebris() { @@ -93,7 +95,7 @@ public abstract class EntityMissileTier4 extends EntityMissileBaseNT { public static class EntityMissileVolcano extends EntityMissileTier4 { public EntityMissileVolcano(World world) { super(world); } public EntityMissileVolcano(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { + @Override public void onMissileImpact(MovingObjectPosition mop) { ExplosionLarge.explode(worldObj, posX, posY, posZ, 10.0F, true, true, true); for(int x = -1; x <= 1; x++) for(int y = -1; y <= 1; y++) for(int z = -1; z <= 1; z++) worldObj.setBlock((int)Math.floor(posX + x), (int)Math.floor(posY + y), (int)Math.floor(posZ + z), ModBlocks.volcanic_lava_block); worldObj.setBlock((int)Math.floor(posX), (int)Math.floor(posY), (int)Math.floor(posZ), ModBlocks.volcano_core); @@ -105,8 +107,8 @@ public abstract class EntityMissileTier4 extends EntityMissileBaseNT { public static class EntityMissileDoomsday extends EntityMissileTier4 { public EntityMissileDoomsday(World world) { super(world); } public EntityMissileDoomsday(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { - this.worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius * 2, posX, posY, posZ).moreFallout(100)); + @Override public void onMissileImpact(MovingObjectPosition mop) { + WorldUtil.loadAndSpawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius * 2, posX, posY, posZ).moreFallout(100)); EntityNukeTorex.statFacStandard(worldObj, posX, posY, posZ, BombConfig.missileRadius * 2); } @Override public List getDebris() { return null; } @@ -118,8 +120,8 @@ public abstract class EntityMissileTier4 extends EntityMissileBaseNT { public static class EntityMissileDoomsdayRusted extends EntityMissileDoomsday { public EntityMissileDoomsdayRusted(World world) { super(world); } public EntityMissileDoomsdayRusted(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } - @Override public void onImpact() { - this.worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius, posX, posY, posZ).moreFallout(100)); + @Override public void onMissileImpact(MovingObjectPosition mop) { + WorldUtil.loadAndSpawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, BombConfig.missileRadius, posX, posY, posZ).moreFallout(100)); EntityNukeTorex.statFacStandard(worldObj, posX, posY, posZ, BombConfig.missileRadius); } @Override public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_doomsday_rusted); } diff --git a/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java b/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java index 91b544fdc..647348883 100644 --- a/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java +++ b/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java @@ -3,6 +3,7 @@ package com.hbm.entity.mob; import com.hbm.entity.projectile.EntityBullet; import com.hbm.entity.projectile.EntityChopperMine; import com.hbm.handler.threading.PacketThreading; +import com.hbm.interfaces.Spaghetti; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.lib.ModDamageSource; @@ -26,6 +27,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; +@Spaghetti("this sucks complete donkey shit") public class EntityHunterChopper extends EntityFlying implements IMob, IBossDisplayData, IRadiationImmune { public int courseChangeCooldown; @@ -335,20 +337,6 @@ public class EntityHunterChopper extends EntityFlying implements IMob, IBossDisp * kill this mob. */ protected void dropItems() { - - if(rand.nextInt(2) == 0) - this.dropItem(ModItems.chopper_head, 1); - if(rand.nextInt(2) == 0) - this.dropItem(ModItems.chopper_torso, 1); - if(rand.nextInt(2) == 0) - this.dropItem(ModItems.chopper_wing, 1); - if(rand.nextInt(3) == 0) - this.dropItem(ModItems.chopper_tail, 1); - if(rand.nextInt(3) == 0) - this.dropItem(ModItems.chopper_gun, 1); - if(rand.nextInt(3) == 0) - this.dropItem(ModItems.chopper_blades, 1); - this.dropItem(ModItems.combine_scrap, rand.nextInt(8) + 1); this.dropItem(ModItems.plate_combine_steel, rand.nextInt(5) + 1); } diff --git a/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java b/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java index 1a18c36c7..f2b042085 100644 --- a/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java +++ b/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java @@ -16,10 +16,11 @@ import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.passive.EntityVillager; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; public class EntityUndeadSoldier extends EntityMob { - + public static final int DW_TYPE = 12; public static final byte TYPE_ZOMBIE = 0; public static final byte TYPE_SKELETON = 1; @@ -66,7 +67,7 @@ public class EntityUndeadSoldier extends EntityMob { this.setCurrentItemOrArmor(3, new ItemStack(ModItems.taurun_plate)); this.setCurrentItemOrArmor(2, new ItemStack(ModItems.taurun_legs)); this.setCurrentItemOrArmor(1, new ItemStack(ModItems.taurun_boots)); - + int gun = rand.nextInt(5); if(gun == 0) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_heavy_revolver)); if(gun == 1) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_light_revolver)); @@ -74,7 +75,7 @@ public class EntityUndeadSoldier extends EntityMob { if(gun == 3) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_maresleg)); if(gun == 4) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_greasegun)); } - + @Override protected String getLivingSound() { byte type = this.dataWatcher.getWatchableObjectByte(DW_TYPE); @@ -110,7 +111,12 @@ public class EntityUndeadSoldier extends EntityMob { public EnumCreatureAttribute getCreatureAttribute() { return EnumCreatureAttribute.UNDEAD; } - + + @Override + public boolean getCanSpawnHere() { + return this.worldObj.difficultySetting != EnumDifficulty.PEACEFUL && this.worldObj.checkNoEntityCollision(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty() && !this.worldObj.isAnyLiquid(this.boundingBox); + } + @Override protected void dropFewItems(boolean player, int loot) { } @Override protected void dropEquipment(boolean player, int loot) { } } diff --git a/src/main/java/com/hbm/entity/particle/EntityModFX.java b/src/main/java/com/hbm/entity/particle/EntityModFX.java index e416965d4..16efa997f 100644 --- a/src/main/java/com/hbm/entity/particle/EntityModFX.java +++ b/src/main/java/com/hbm/entity/particle/EntityModFX.java @@ -31,7 +31,6 @@ public class EntityModFX extends Entity public static double interpPosX; public static double interpPosY; public static double interpPosZ; - public static final String __OBFID = "CL_00000914"; float smokeParticleScale; public int particleAge; public int maxAge; @@ -39,7 +38,7 @@ public class EntityModFX extends Entity public EntityModFX(World world) { super(world); } - + protected EntityModFX(World p_i1218_1_, double p_i1218_2_, double p_i1218_4_, double p_i1218_6_) { super(p_i1218_1_); @@ -257,7 +256,7 @@ public class EntityModFX extends Entity { return this.getClass().getSimpleName() + ", Pos (" + this.posX + "," + this.posY + "," + this.posZ + "), RGBA (" + this.particleRed + "," + this.particleGreen + "," + this.particleBlue + "," + this.particleAlpha + "), Age " + this.particleAge; } - + @Override @SideOnly(Side.CLIENT) public boolean isInRangeToRenderDist(double distance) diff --git a/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java b/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java index 036971822..b14a5f80b 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java +++ b/src/main/java/com/hbm/entity/projectile/EntityBulletBeamBase.java @@ -2,14 +2,19 @@ package com.hbm.entity.projectile; import java.util.List; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.weapon.sedna.BulletConfig; +import com.hbm.packet.toclient.AuxParticlePacketNT; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; @@ -144,9 +149,30 @@ public class EntityBulletBeamBase extends Entity implements IEntityAdditionalSpa if(!this.worldObj.isRemote && this.doesImpactEntities()) { Entity hitEntity = null; - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.headingX, this.headingY, this.headingZ).expand(1.0D, 1.0D, 1.0D)); + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.headingX, this.headingY, this.headingZ).expand(1.0D, 1.0D, 1.0D)); double nearest = 0.0D; MovingObjectPosition nonPenImpact = null; + MovingObjectPosition coinHit = null; + + double closestCoin = 0; + EntityCoin hitCoin = null; + + for(Entity entity : list) { + if(entity.isDead) continue; + if(entity instanceof EntityCoin) { + 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(closestCoin == 0 || dist < closestCoin) { + closestCoin = dist; + hitCoin = (EntityCoin) entity; + coinHit = hitMop; + } + } + } + } for(int j = 0; j < list.size(); ++j) { Entity entity = (Entity) list.get(j); @@ -158,13 +184,14 @@ public class EntityBulletBeamBase extends Entity implements IEntityAdditionalSpa if(hitMop != null) { + double dist = pos.distanceTo(hitMop.hitVec); + // if penetration is enabled, run impact for all intersecting entities if(this.doesPenetrate()) { - this.onImpact(new MovingObjectPosition(entity, hitMop.hitVec)); + if(hitCoin == null || dist < closestCoin) { + this.onImpact(new MovingObjectPosition(entity, hitMop.hitVec)); + } } else { - - double dist = pos.distanceTo(hitMop.hitVec); - if(dist < nearest || nearest == 0.0D) { hitEntity = entity; nearest = dist; @@ -179,6 +206,86 @@ public class EntityBulletBeamBase extends Entity implements IEntityAdditionalSpa if(!this.doesPenetrate() && hitEntity != null) { mop = new MovingObjectPosition(hitEntity, nonPenImpact.hitVec); } + + if(hitCoin != null) { + Vec3 vec = Vec3.createVectorHelper(coinHit.hitVec.xCoord - posX, coinHit.hitVec.yCoord - posY, coinHit.hitVec.zCoord - posZ); + this.beamLength = vec.lengthVector(); + + double range = 50; + List targets = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord, coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord).expand(range, range, range)); + Entity nearestCoin = null; + Entity nearestPlayer = null; + Entity nearestMob = null; + Entity nearestOther = null; + double coinDist = 0; + double playerDist = 0; + double mobDist = 0; + double otherDist = 0; + + hitCoin.setDead(); + + // well i mean we could just uuse a single var for all variants and then overwrite stuff + // when we run into things with higher priority. however i can't be assed fuck off + for(Entity entity : targets) { + if(entity == this.getThrower()) continue; + if(entity.isDead) continue; + double dist = entity.getDistanceToEntity(hitCoin); + if(dist > range) continue; + + if(entity instanceof EntityCoin) { + if(coinDist == 0 || dist < coinDist) { + coinDist = dist; + nearestCoin = entity; + } + } else if(entity instanceof EntityPlayer) { + if(playerDist == 0 || dist < playerDist) { + playerDist = dist; + nearestPlayer = entity; + } + } else if(entity instanceof EntityMob) { + if(mobDist == 0 || dist < mobDist) { + mobDist = dist; + nearestMob = entity; + } + } else if(entity instanceof EntityLivingBase) { + if(otherDist == 0 || dist < otherDist) { + otherDist = dist; + nearestOther = entity; + } + } + } + + // ternary of shame + Entity target = nearestCoin != null ? nearestCoin : + nearestPlayer != null ? nearestPlayer : + nearestMob != null ? nearestMob : + nearestOther != null ? nearestOther : null; + + if(target != null) { + EntityBulletBeamBase newBeam = new EntityBulletBeamBase(hitCoin.getThrower() != null ? hitCoin.getThrower() : this.thrower, this.config, this.damage * 1.25F); + newBeam.setPosition(coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord); + Vec3 delta = Vec3.createVectorHelper(target.posX - newBeam.posX, (target.posY + target.height / 2D) - newBeam.posY, target.posZ - newBeam.posZ); + newBeam.setRotationsFromVector(delta); + newBeam.performHitscanExternal(delta.lengthVector()); + worldObj.spawnEntityInWorld(newBeam); + } else { + EntityBulletBeamBase newBeam = new EntityBulletBeamBase(hitCoin.getThrower() != null ? hitCoin.getThrower() : this.thrower, this.config, this.damage * 1.25F); + newBeam.setPosition(coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord); + newBeam.setRotationsFromVector(Vec3.createVectorHelper(rand.nextGaussian() * 0.5, -1, rand.nextGaussian() * 0.5)); + newBeam.performHitscanExternal(100); + worldObj.spawnEntityInWorld(newBeam); + } + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "vanillaExt"); + data.setString("mode", "largeexplode"); + data.setFloat("size", 1.5F); + data.setByte("count", (byte)1); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord), new TargetPoint(worldObj.provider.dimensionId, coinHit.hitVec.xCoord, coinHit.hitVec.yCoord, coinHit.hitVec.zCoord, 100)); + + + return; + } } if(mop != null) { diff --git a/src/main/java/com/hbm/entity/projectile/EntityCoin.java b/src/main/java/com/hbm/entity/projectile/EntityCoin.java new file mode 100644 index 000000000..15b1c6a33 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/EntityCoin.java @@ -0,0 +1,51 @@ +package com.hbm.entity.projectile; + +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public class EntityCoin extends EntityThrowableInterp { + + public EntityCoin(World world) { + super(world); + this.setSize(1F, 1F); + this.yOffset = 0.5F; + } + + @Override + public void onUpdate() { + super.onUpdate(); + } + + public void setPosition(double x, double y, double z) { + this.posX = x; + this.posY = y; + this.posZ = z; + float f = this.width / 2.0F; + this.boundingBox.setBounds(x - f, y - this.yOffset + this.ySize, z - f, x + f, y - this.yOffset + this.ySize + this.height, z + f); + } + + @Override + protected void onImpact(MovingObjectPosition mop) { + if(mop.typeOfHit == mop.typeOfHit.BLOCK) this.setDead(); + } + + @Override + protected float getAirDrag() { + return 1F; + } + + @Override + public double getGravityVelocity() { + return 0.02D; + } + + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + public boolean canAttackWithItem() { + return true; + } +} diff --git a/src/main/java/com/hbm/explosion/ExplosionFleija.java b/src/main/java/com/hbm/explosion/ExplosionFleija.java index 5a478fe14..8c06d708a 100644 --- a/src/main/java/com/hbm/explosion/ExplosionFleija.java +++ b/src/main/java/com/hbm/explosion/ExplosionFleija.java @@ -6,8 +6,8 @@ import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class ExplosionFleija -{ +public class ExplosionFleija { + public int posX; public int posY; public int posZ; @@ -23,7 +23,7 @@ public class ExplosionFleija private int element; public float explosionCoefficient = 1.0F; public float explosionCoefficient2 = 1.0F; - + public void saveToNbt(NBTTagCompound nbt, String name) { nbt.setInteger(name + "posX", posX); nbt.setInteger(name + "posY", posY); @@ -40,7 +40,7 @@ public class ExplosionFleija nbt.setFloat(name + "explosionCoefficient", explosionCoefficient); nbt.setFloat(name + "explosionCoefficient2", explosionCoefficient2); } - + public void readFromNbt(NBTTagCompound nbt, String name) { posX = nbt.getInteger(name + "posX"); posY = nbt.getInteger(name + "posY"); @@ -57,29 +57,28 @@ public class ExplosionFleija explosionCoefficient = nbt.getFloat(name + "explosionCoefficient"); explosionCoefficient2 = nbt.getFloat(name + "explosionCoefficient2"); } - - public ExplosionFleija(int x, int y, int z, World world, int rad, float coefficient, float coefficient2) - { + + public ExplosionFleija(int x, int y, int z, World world, int rad, float coefficient, float coefficient2) { this.posX = x; this.posY = y; this.posZ = z; - + this.worldObj = world; - + this.radius = rad; this.radius2 = this.radius * this.radius; this.explosionCoefficient = coefficient; this.explosionCoefficient2 = coefficient2; - + this.nlimit = this.radius2 * 4; } - - public boolean update() - { + + public boolean update() { 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; // end explosion if the shell size is 0 to prevent division by zero crash 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; @@ -88,15 +87,13 @@ public class ExplosionFleija return this.n > this.nlimit; } - private void breakColumn(int x, int z) - { + private void breakColumn(int x, int z) { int dist = this.radius2 - (x * x + z * z); - if (dist > 0) - { + if(dist > 0) { dist = (int) Math.sqrt(dist); - for (int y = (int)(dist / this.explosionCoefficient2); y > -dist / this.explosionCoefficient; y--) - { - if(this.posY + y > 0 && !(this.worldObj.getBlock(this.posX+x, this.posY+y, this.posZ+z) instanceof DecoBlockAlt))this.worldObj.setBlock(this.posX+x, this.posY+y, this.posZ+z, Blocks.air); + for(int y = (int) (dist / this.explosionCoefficient2); y > -dist / this.explosionCoefficient; y--) { + if(this.posY + y > 0 && !(this.worldObj.getBlock(this.posX + x, this.posY + y, this.posZ + z) instanceof DecoBlockAlt)) + this.worldObj.setBlock(this.posX + x, this.posY + y, this.posZ + z, Blocks.air); } } } diff --git a/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java b/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java index 0d405dba7..c1c35ceac 100644 --- a/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java +++ b/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java @@ -7,6 +7,7 @@ import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.handler.threading.PacketThreading; import com.hbm.main.MainRegistry; import com.hbm.packet.toclient.AuxParticlePacketNT; +import com.hbm.world.WorldUtil; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.nbt.NBTTagCompound; @@ -33,7 +34,7 @@ import net.minecraft.world.World; if(params.shrapnelCount > 0) ExplosionLarge.spawnShrapnels(world, posX, posY, posZ, params.shrapnelCount); if(params.miniNuke && !params.safe) new ExplosionNT(world, null, posX, posY, posZ, params.blastRadius).addAllAttrib(params.explosionAttribs).overrideResolution(params.resolution).explode(); if(params.killRadius > 0) ExplosionNukeGeneric.dealDamage(world, posX, posY, posZ, params.killRadius); - if(!params.miniNuke) world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, (int) params.blastRadius, posX, posY, posZ)); + if(!params.miniNuke) WorldUtil.loadAndSpawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, (int) params.blastRadius, posX, posY, posZ)); if(params.miniNuke) { float radMod = params.radiationLevel / 3F; diff --git a/src/main/java/com/hbm/extprop/HbmLivingProps.java b/src/main/java/com/hbm/extprop/HbmLivingProps.java index 9201c7181..aa6356078 100644 --- a/src/main/java/com/hbm/extprop/HbmLivingProps.java +++ b/src/main/java/com/hbm/extprop/HbmLivingProps.java @@ -51,6 +51,7 @@ public class HbmLivingProps implements IExtendedEntityProperties { public int fire; public int phosphorus; public int balefire; + public int blackFire; private List contamination = new ArrayList(); public HbmLivingProps(EntityLivingBase entity) { @@ -320,6 +321,7 @@ public class HbmLivingProps implements IExtendedEntityProperties { props.setInteger("hfr_fire", fire); props.setInteger("hfr_phosphorus", phosphorus); props.setInteger("hfr_balefire", balefire); + props.setInteger("hfr_blackfire", blackFire); props.setInteger("hfr_cont_count", this.contamination.size()); @@ -347,6 +349,7 @@ public class HbmLivingProps implements IExtendedEntityProperties { fire = props.getInteger("hfr_fire"); phosphorus = props.getInteger("hfr_phosphorus"); balefire = props.getInteger("hfr_balefire"); + blackFire = props.getInteger("hfr_blackfire"); int cont = props.getInteger("hfr_cont_count"); diff --git a/src/main/java/com/hbm/handler/BobmazonOfferFactory.java b/src/main/java/com/hbm/handler/BobmazonOfferFactory.java index e0b3c4560..e53b5f603 100644 --- a/src/main/java/com/hbm/handler/BobmazonOfferFactory.java +++ b/src/main/java/com/hbm/handler/BobmazonOfferFactory.java @@ -39,6 +39,9 @@ public class BobmazonOfferFactory { standard.add(new Offer(new ItemStack(ModItems.gun_kit_1, 1), Requirement.ASSEMBLY, 16)); standard.add(new Offer(new ItemStack(ModItems.geiger_counter, 1), Requirement.NONE, 16)); standard.add(new Offer(new ItemStack(ModItems.matchstick, 16), Requirement.STEEL, 2)); + //blueprints + standard.add(new Offer(new ItemStack(ModItems.blueprint_folder, 1, 0), Requirement.ASSEMBLY, 64)); + standard.add(new Offer(new ItemStack(ModItems.blueprint_folder, 1, 1), Requirement.OIL, 256)); //plants standard.add(new Offer(new ItemStack(Blocks.sapling, 1, 3), Requirement.STEEL, 12, 9)); standard.add(new Offer(new ItemStack(ModBlocks.plant_flower, 1, EnumFlowerType.FOXGLOVE.ordinal()), Requirement.STEEL, 16, 5)); diff --git a/src/main/java/com/hbm/handler/BulletConfigSyncingUtil.java b/src/main/java/com/hbm/handler/BulletConfigSyncingUtil.java index 3deab1d17..bf9cddaa0 100644 --- a/src/main/java/com/hbm/handler/BulletConfigSyncingUtil.java +++ b/src/main/java/com/hbm/handler/BulletConfigSyncingUtil.java @@ -5,6 +5,7 @@ import java.util.Map.Entry; import com.hbm.handler.guncfg.*; +@Deprecated public class BulletConfigSyncingUtil { private static HashMap configSet = new HashMap(); diff --git a/src/main/java/com/hbm/handler/CompatHandler.java b/src/main/java/com/hbm/handler/CompatHandler.java index 46ce74fc0..feb113b7a 100644 --- a/src/main/java/com/hbm/handler/CompatHandler.java +++ b/src/main/java/com/hbm/handler/CompatHandler.java @@ -6,6 +6,7 @@ import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; +import com.hbm.util.ItemStackUtil; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.Optional; import li.cil.oc.api.Items; @@ -108,27 +109,66 @@ public class CompatHandler { } } - /** - * Simple enum for mapping OC color ordinals to a nicer format for adding new disks. - */ - public enum OCColors { - BLACK, //0x444444 - RED, //0xB3312C - GREEN, //0x339911 - BROWN, //0x51301A - BLUE, //0x6666FF - PURPLE, //0x7B2FBE - CYAN, //0x66FFFF - LIGHTGRAY, //0xABABAB - GRAY, //0x666666 - PINK, //0xD88198 - LIME, //0x66FF66 - YELLOW, //0xFFFF66 - LIGHTBLUE, //0xAAAAFF - MAGENTA, //0xC354CD - ORANGE, //0xEB8844 - WHITE //0xF0F0F0 - } + /** + * Simple enum for mapping OC color ordinals to a nicer format for adding new disks. + */ + public enum OCColors { + BLACK(0x444444, "dyeBlack"), + RED(0xB3312C, "dyeRed"), + GREEN(0x339911, "dyeGreen"), + BROWN(0x51301A, "dyeBrown"), + BLUE(0x6666FF, "dyeBlue"), + PURPLE(0x7B2FBE, "dyePurple"), + CYAN(0x66FFFF, "dyeCyan"), + LIGHTGRAY(0xABABAB, "dyeLightGray"), + GRAY(0x666666, "dyeGray"), + PINK(0xD88198, "dyePink"), + LIME(0x66FF66, "dyeLime"), + YELLOW(0xFFFF66, "dyeYellow"), + LIGHTBLUE(0xAAAAFF, "dyeLightBlue"), + MAGENTA(0xC354CD, "dyeMagenta"), + ORANGE(0xEB8844, "dyeOrange"), + WHITE(0xF0F0F0, "dyeWhite"), + NONE(0x0, ""); + + private final int color; + private final String dictName; + + OCColors(int color, String dictName) { + this.color = color; + this.dictName = dictName; + } + + public int getColor() { + return color; + } + + public static OCColors fromInt(int intColor) { + for (OCColors iColor : OCColors.values()) { + if (intColor == iColor.getColor()) + return iColor; + } + return OCColors.NONE; + } + + public static OCColors fromDye(ItemStack stack) { + List oreNames = ItemStackUtil.getOreDictNames(stack); + + for(String dict : oreNames) { + if(!(dict.length() > 3) || !dict.startsWith("dye")) + continue; + + for (OCColors color : OCColors.values()) { + if(!color.dictName.equals(dict)) + continue; + + return color; + } + } + + return OCColors.NONE; + } + } // Where all disks are stored with their name and `FloppyDisk` class. public static HashMap disks = new HashMap<>(); diff --git a/src/main/java/com/hbm/handler/DispenserBehaviorHandler.java b/src/main/java/com/hbm/handler/DispenserBehaviorHandler.java new file mode 100644 index 000000000..b6fba216b --- /dev/null +++ b/src/main/java/com/hbm/handler/DispenserBehaviorHandler.java @@ -0,0 +1,313 @@ +package com.hbm.handler; + +import com.hbm.entity.grenade.EntityGrenadeASchrab; +import com.hbm.entity.grenade.EntityGrenadeBlackHole; +import com.hbm.entity.grenade.EntityGrenadeBreach; +import com.hbm.entity.grenade.EntityGrenadeBurst; +import com.hbm.entity.grenade.EntityGrenadeCloud; +import com.hbm.entity.grenade.EntityGrenadeCluster; +import com.hbm.entity.grenade.EntityGrenadeDynamite; +import com.hbm.entity.grenade.EntityGrenadeElectric; +import com.hbm.entity.grenade.EntityGrenadeFire; +import com.hbm.entity.grenade.EntityGrenadeFlare; +import com.hbm.entity.grenade.EntityGrenadeFrag; +import com.hbm.entity.grenade.EntityGrenadeGas; +import com.hbm.entity.grenade.EntityGrenadeGascan; +import com.hbm.entity.grenade.EntityGrenadeGeneric; +import com.hbm.entity.grenade.EntityGrenadeIFBouncy; +import com.hbm.entity.grenade.EntityGrenadeIFBrimstone; +import com.hbm.entity.grenade.EntityGrenadeIFConcussion; +import com.hbm.entity.grenade.EntityGrenadeIFGeneric; +import com.hbm.entity.grenade.EntityGrenadeIFHE; +import com.hbm.entity.grenade.EntityGrenadeIFHopwire; +import com.hbm.entity.grenade.EntityGrenadeIFImpact; +import com.hbm.entity.grenade.EntityGrenadeIFIncendiary; +import com.hbm.entity.grenade.EntityGrenadeIFMystery; +import com.hbm.entity.grenade.EntityGrenadeIFNull; +import com.hbm.entity.grenade.EntityGrenadeIFSpark; +import com.hbm.entity.grenade.EntityGrenadeIFSticky; +import com.hbm.entity.grenade.EntityGrenadeIFToxic; +import com.hbm.entity.grenade.EntityGrenadeImpactGeneric; +import com.hbm.entity.grenade.EntityGrenadeLemon; +import com.hbm.entity.grenade.EntityGrenadeMIRV; +import com.hbm.entity.grenade.EntityGrenadeMk2; +import com.hbm.entity.grenade.EntityGrenadeNuclear; +import com.hbm.entity.grenade.EntityGrenadeNuke; +import com.hbm.entity.grenade.EntityGrenadePC; +import com.hbm.entity.grenade.EntityGrenadePlasma; +import com.hbm.entity.grenade.EntityGrenadePoison; +import com.hbm.entity.grenade.EntityGrenadePulse; +import com.hbm.entity.grenade.EntityGrenadeSchrabidium; +import com.hbm.entity.grenade.EntityGrenadeShrapnel; +import com.hbm.entity.grenade.EntityGrenadeSmart; +import com.hbm.entity.grenade.EntityGrenadeStrong; +import com.hbm.entity.grenade.EntityGrenadeTau; +import com.hbm.entity.grenade.EntityGrenadeZOMG; +import com.hbm.entity.grenade.EntityWastePearl; +import com.hbm.items.ModItems; +import com.hbm.items.tool.ItemFertilizer; +import com.hbm.items.weapon.ItemGenericGrenade; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.BehaviorProjectileDispense; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.dispenser.IPosition; +import net.minecraft.entity.IProjectile; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; + +public class DispenserBehaviorHandler { + + public static void init() { + + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_generic, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeGeneric(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_strong, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeStrong(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_frag, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeFrag(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_fire, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeFire(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_cluster, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeCluster(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_flare, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeFlare(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_electric, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeElectric(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_poison, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadePoison(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_gas, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeGas(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_schrabidium, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeSchrabidium(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_nuke, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeNuke(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_nuclear, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeNuclear(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_pulse, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadePulse(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_plasma, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadePlasma(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_tau, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeTau(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_lemon, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeLemon(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_mk2, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeMk2(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_aschrab, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeASchrab(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_zomg, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeZOMG(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_shrapnel, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeShrapnel(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_black_hole, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeBlackHole(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_gascan, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeGascan(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_cloud, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeCloud(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_pink_cloud, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadePC(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_smart, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeSmart(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_mirv, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeMIRV(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_breach, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeBreach(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_burst, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeBurst(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_generic, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFGeneric(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_he, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFHE(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_bouncy, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFBouncy(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_sticky, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFSticky(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_impact, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFImpact(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_incendiary, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFIncendiary(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_toxic, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFToxic(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_concussion, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFConcussion(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_brimstone, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFBrimstone(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_mystery, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFMystery(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_spark, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFSpark(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_hopwire, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFHopwire(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_null, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeIFNull(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.nuclear_waste_pearl, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityWastePearl(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.stick_dynamite, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeDynamite(world, position.getX(), position.getY(), position.getZ()); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_kyiv, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeImpactGeneric(world, position.getX(), position.getY(), position.getZ()).setType((ItemGenericGrenade) ModItems.grenade_kyiv); + } + }); + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.stick_dynamite_fishing, new BehaviorProjectileDispense() { + protected IProjectile getProjectileEntity(World world, IPosition position) { + return new EntityGrenadeImpactGeneric(world, position.getX(), position.getY(), position.getZ()).setType((ItemGenericGrenade) ModItems.stick_dynamite_fishing); + } + }); + + BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.powder_fertilizer, new BehaviorDefaultDispenseItem() { + + private boolean dispenseSound = true; + @Override protected ItemStack dispenseStack(IBlockSource source, ItemStack stack) { + + EnumFacing facing = BlockDispenser.func_149937_b(source.getBlockMetadata()); + World world = source.getWorld(); + int x = source.getXInt() + facing.getFrontOffsetX(); + int y = source.getYInt() + facing.getFrontOffsetY(); + int z = source.getZInt() + facing.getFrontOffsetZ(); + this.dispenseSound = ItemFertilizer.useFertillizer(stack, world, x, y, z); + return stack; + } + @Override protected void playDispenseSound(IBlockSource source) { + if(this.dispenseSound) { + source.getWorld().playAuxSFX(1000, source.getXInt(), source.getYInt(), source.getZInt(), 0); + } else { + source.getWorld().playAuxSFX(1001, source.getXInt(), source.getYInt(), source.getZInt(), 0); + } + } + }); + } +} diff --git a/src/main/java/com/hbm/handler/EntityEffectHandler.java b/src/main/java/com/hbm/handler/EntityEffectHandler.java index 7ae2acaab..dcbfcb5b6 100644 --- a/src/main/java/com/hbm/handler/EntityEffectHandler.java +++ b/src/main/java/com/hbm/handler/EntityEffectHandler.java @@ -668,6 +668,14 @@ public class EntityEffectHandler { FlameCreator.composeEffect(entity.worldObj, x - living.width / 2 + living.width * rand.nextDouble(), y + rand.nextDouble() * living.height, z - living.width / 2 + living.width * rand.nextDouble(), FlameCreator.META_BALEFIRE); } + if(props.blackFire > 0) { + props.blackFire--; + if((living.ticksExisted + living.getEntityId()) % 10 == 0) living.worldObj.playSoundEffect(living.posX, living.posY + living.height / 2, living.posZ, "random.fizz", 1F, 1.5F + rand.nextFloat() * 0.5F); + ContaminationUtil.contaminate(living, HazardType.RADIATION, ContaminationType.CREATIVE, 5F); + if((living.ticksExisted + living.getEntityId()) % 10 == 0) living.attackEntityFrom(DamageSource.onFire, 10F); + FlameCreator.composeEffect(entity.worldObj, x - living.width / 2 + living.width * rand.nextDouble(), y + rand.nextDouble() * living.height, z - living.width / 2 + living.width * rand.nextDouble(), FlameCreator.META_BLACK); + } + if(props.fire > 0 || props.phosphorus > 0 || props.balefire > 0) if(!entity.isEntityAlive()) ConfettiUtil.decideConfetti(living, DamageSource.onFire); } diff --git a/src/main/java/com/hbm/handler/HTTPHandler.java b/src/main/java/com/hbm/handler/HTTPHandler.java index 4efc054f4..3af10a74b 100644 --- a/src/main/java/com/hbm/handler/HTTPHandler.java +++ b/src/main/java/com/hbm/handler/HTTPHandler.java @@ -13,6 +13,7 @@ import com.hbm.main.MainRegistry; public class HTTPHandler { public static List capsule = new ArrayList(); + public static List tipOfTheDay = new ArrayList(); public static boolean newVersion = false; public static String versionNumber = ""; @@ -25,6 +26,7 @@ public class HTTPHandler { try { loadVersion(); loadSoyuz(); + loadTips(); } catch(IOException e) { MainRegistry.logger.warn("Version checker failed!"); } @@ -69,12 +71,17 @@ public class HTTPHandler { BufferedReader in = new BufferedReader(new InputStreamReader(github.openStream())); String line; - - while((line = in.readLine()) != null) { - capsule.add(line); - } - + while((line = in.readLine()) != null) capsule.add(line); in.close(); } + private static void loadTips() throws IOException { + + URL github = new URL("https://gist.githubusercontent.com/HbmMods/a03c66ba160184e12f43de826b30c096/raw/tip_of_the_day"); + BufferedReader in = new BufferedReader(new InputStreamReader(github.openStream())); + + String line; + while((line = in.readLine()) != null) tipOfTheDay.add(line); + in.close(); + } } diff --git a/src/main/java/com/hbm/handler/HbmKeybinds.java b/src/main/java/com/hbm/handler/HbmKeybinds.java index 06a9c90a1..886f388b9 100644 --- a/src/main/java/com/hbm/handler/HbmKeybinds.java +++ b/src/main/java/com/hbm/handler/HbmKeybinds.java @@ -37,6 +37,8 @@ public class HbmKeybinds { public static KeyBinding hudKey = new KeyBinding(category + ".toggleHUD", Keyboard.KEY_V, category); public static KeyBinding dashKey = new KeyBinding(category + ".dash", Keyboard.KEY_LSHIFT, category); public static KeyBinding trainKey = new KeyBinding(category + ".trainInv", Keyboard.KEY_R, category); + + public static KeyBinding qmaw = new KeyBinding(category + ".qmaw", Keyboard.KEY_F1, category); public static KeyBinding abilityCycle = new KeyBinding(category + ".ability", -99, category); public static KeyBinding abilityAlt = new KeyBinding(category + ".abilityAlt", Keyboard.KEY_LMENU, category); @@ -61,6 +63,8 @@ public class HbmKeybinds { ClientRegistry.registerKeyBinding(hudKey); ClientRegistry.registerKeyBinding(dashKey); ClientRegistry.registerKeyBinding(trainKey); + + ClientRegistry.registerKeyBinding(qmaw); ClientRegistry.registerKeyBinding(reloadKey); ClientRegistry.registerKeyBinding(gunPrimaryKey); diff --git a/src/main/java/com/hbm/handler/ability/IToolAreaAbility.java b/src/main/java/com/hbm/handler/ability/IToolAreaAbility.java index 1d0bcf02b..ca28bca9c 100644 --- a/src/main/java/com/hbm/handler/ability/IToolAreaAbility.java +++ b/src/main/java/com/hbm/handler/ability/IToolAreaAbility.java @@ -14,7 +14,10 @@ import com.hbm.items.tool.ItemToolAbility; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; @@ -219,6 +222,104 @@ public interface IToolAreaAbility extends IBaseAbility { } }; + public static final IToolAreaAbility HAMMER_FLAT = new IToolAreaAbility() { + @Override + public String getName() { + return "tool.ability.hammer_flat"; + } + + @Override + public boolean isAllowed() { + return ToolConfig.abilityHammer; + } + + public final int[] rangeAtLevel = { 1, 2, 3, 4 }; + + @Override + public int levels() { + return rangeAtLevel.length; + } + + @Override + public String getExtension(int level) { + return " (" + rangeAtLevel[level] + ")"; + } + + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 3; + } + + @Override + public boolean onDig(int level, World world, int x, int y, int z, EntityPlayer player, ItemToolAbility tool) { + int range = rangeAtLevel[level]; + + MovingObjectPosition hit = raytraceFromEntity(world, player, false, 4.5d); + if(hit == null) return true; + int sideHit = hit.sideHit; + + // we successfully destroyed a block. time to do AOE! + int xRange = range; + int yRange = range; + int zRange = 0; + switch (sideHit) { + case 0: + case 1: + yRange = 0; + zRange = range; + break; + case 2: + case 3: + xRange = range; + zRange = 0; + break; + case 4: + case 5: + xRange = 0; + zRange = range; + break; + } + + for(int a = x - xRange; a <= x + xRange; a++) { + for(int b = y - yRange; b <= y + yRange; b++) { + for(int c = z - zRange; c <= z + zRange; c++) { + if(a == x && b == y && c == z) + continue; + + tool.breakExtraBlock(world, a, b, c, player, x, y, z); + } + } + } + + return false; + } + + // Taken from TConstruct, licensed under CC0 (public domain) + // https://github.com/SlimeKnights/TinkersConstruct/blob/9ea7a0e60fe180aff591701b12c89da21da99289/src/main/java/tconstruct/library/tools/AbilityHelper.java#L707-L731 + private MovingObjectPosition raytraceFromEntity(World world, EntityPlayer player, boolean par3, double range) { + float f = 1.0F; + float f1 = player.prevRotationPitch + (player.rotationPitch - player.prevRotationPitch) * f; + float f2 = player.prevRotationYaw + (player.rotationYaw - player.prevRotationYaw) * f; + double d0 = player.prevPosX + (player.posX - player.prevPosX) * (double) f; + double d1 = player.prevPosY + (player.posY - player.prevPosY) * (double) f + 1.62D; + double d2 = player.prevPosZ + (player.posZ - player.prevPosZ) * (double) f; + Vec3 vec3 = Vec3.createVectorHelper(d0, d1, d2); + float f3 = MathHelper.cos(-f2 * 0.017453292F - (float) Math.PI); + float f4 = MathHelper.sin(-f2 * 0.017453292F - (float) Math.PI); + float f5 = -MathHelper.cos(-f1 * 0.017453292F); + float f6 = MathHelper.sin(-f1 * 0.017453292F); + float f7 = f4 * f5; + float f8 = f3 * f5; + double d3 = range; + if (player instanceof EntityPlayerMP) + { + d3 = ((EntityPlayerMP) player).theItemInWorldManager.getBlockReachDistance(); + } + Vec3 vec31 = vec3.addVector((double) f7 * d3, (double) f6 * d3, (double) f8 * d3); + return world.func_147447_a(vec3, vec31, par3, !par3, par3); + } + }; + public static final IToolAreaAbility EXPLOSION = new IToolAreaAbility() { @Override public String getName() { @@ -249,7 +350,7 @@ public interface IToolAreaAbility extends IBaseAbility { @Override public int sortOrder() { - return SORT_ORDER_BASE + 3; + return SORT_ORDER_BASE + 4; } @Override @@ -270,7 +371,7 @@ public interface IToolAreaAbility extends IBaseAbility { }; // endregion handlers - static final IToolAreaAbility[] abilities = { NONE, RECURSION, HAMMER, EXPLOSION }; + static final IToolAreaAbility[] abilities = { NONE, RECURSION, HAMMER, HAMMER_FLAT, EXPLOSION }; static IToolAreaAbility getByName(String name) { for(IToolAreaAbility ability : abilities) { diff --git a/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java b/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java index 9f002bfbd..7fe16423e 100644 --- a/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java +++ b/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java @@ -37,7 +37,8 @@ public interface IToolHarvestAbility extends IBaseAbility { if(skipDefaultDrops) { // Emulate the block breaking without drops world.setBlockToAir(x, y, z); - player.getHeldItem().damageItem(1, player); + ItemStack stack = player.getHeldItem(); + if(stack != null) stack.damageItem(1, player); } else if(player instanceof EntityPlayerMP) { // Break the block conventionally ItemToolAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player); @@ -78,7 +79,7 @@ public interface IToolHarvestAbility extends IBaseAbility { @Override public void preHarvestAll(int level, World world, EntityPlayer player) { ItemStack stack = player.getHeldItem(); - EnchantmentUtil.addEnchantment(stack, Enchantment.silkTouch, 1); + if(stack != null) EnchantmentUtil.addEnchantment(stack, Enchantment.silkTouch, 1); } @Override @@ -88,7 +89,7 @@ public interface IToolHarvestAbility extends IBaseAbility { // Even if can be forced somehow, the player doesn't gain any // benefit from it. ItemStack stack = player.getHeldItem(); - EnchantmentUtil.removeEnchantment(stack, Enchantment.silkTouch); + if(stack != null) EnchantmentUtil.removeEnchantment(stack, Enchantment.silkTouch); } }; @@ -123,7 +124,7 @@ public interface IToolHarvestAbility extends IBaseAbility { @Override public void preHarvestAll(int level, World world, EntityPlayer player) { ItemStack stack = player.getHeldItem(); - EnchantmentUtil.addEnchantment(stack, Enchantment.fortune, powerAtLevel[level]); + if(stack != null) EnchantmentUtil.addEnchantment(stack, Enchantment.fortune, powerAtLevel[level]); } @Override @@ -133,7 +134,7 @@ public interface IToolHarvestAbility extends IBaseAbility { // Even if can be forced somehow, the player doesn't gain any // benefit from it. ItemStack stack = player.getHeldItem(); - EnchantmentUtil.removeEnchantment(stack, Enchantment.fortune); + if(stack != null) EnchantmentUtil.removeEnchantment(stack, Enchantment.fortune); } }; @@ -175,7 +176,7 @@ public interface IToolHarvestAbility extends IBaseAbility { if(doesSmelt) { for(ItemStack stack : drops) { - world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, stack.copy())); + world.spawnEntityInWorld(new EntityItem(world, ItemToolAbility.dropX + 0.5, ItemToolAbility.dropY + 0.5, ItemToolAbility.dropZ + 0.5, stack.copy())); } } } @@ -211,7 +212,7 @@ public interface IToolHarvestAbility extends IBaseAbility { harvestBlock(doesShred, world, x, y, z, player); if(doesShred) { - world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, result.copy())); + world.spawnEntityInWorld(new EntityItem(world, ItemToolAbility.dropX + 0.5, ItemToolAbility.dropY + 0.5, ItemToolAbility.dropZ + 0.5, result.copy())); } } }; @@ -248,7 +249,7 @@ public interface IToolHarvestAbility extends IBaseAbility { if(doesCentrifuge) { for(ItemStack st : result) { if(st != null) { - world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, st.copy())); + world.spawnEntityInWorld(new EntityItem(world, ItemToolAbility.dropX + 0.5, ItemToolAbility.dropY + 0.5, ItemToolAbility.dropZ + 0.5, st.copy())); } } } @@ -285,7 +286,7 @@ public interface IToolHarvestAbility extends IBaseAbility { harvestBlock(doesCrystallize, world, x, y, z, player); if(doesCrystallize) { - world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, result.output.copy())); + world.spawnEntityInWorld(new EntityItem(world, ItemToolAbility.dropX + 0.5, ItemToolAbility.dropY + 0.5, ItemToolAbility.dropZ + 0.5, result.output.copy())); } } }; @@ -324,7 +325,7 @@ public interface IToolHarvestAbility extends IBaseAbility { harvestBlock(doesConvert, world, x, y, z, player); if(doesConvert) { - world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.ingot_mercury, mercury))); + world.spawnEntityInWorld(new EntityItem(world, ItemToolAbility.dropX + 0.5, ItemToolAbility.dropY + 0.5, ItemToolAbility.dropZ + 0.5, new ItemStack(ModItems.ingot_mercury, mercury))); } } }; diff --git a/src/main/java/com/hbm/handler/ability/ToolPreset.java b/src/main/java/com/hbm/handler/ability/ToolPreset.java index 7cc065478..1875f456c 100644 --- a/src/main/java/com/hbm/handler/ability/ToolPreset.java +++ b/src/main/java/com/hbm/handler/ability/ToolPreset.java @@ -27,32 +27,32 @@ public class ToolPreset { this.harvestAbilityLevel = harvestAbilityLevel; } - public ChatComponentText getMessage() { - if (isNone()) { - return ChatBuilder.start("[Tool ability deactivated]").color(EnumChatFormatting.GOLD).flush(); - } + public ChatComponentText getMessage() { + if(isNone()) { + return ChatBuilder.start("[Tool ability deactivated]").color(EnumChatFormatting.GOLD).flush(); + } - boolean hasArea = areaAbility != IToolAreaAbility.NONE; - boolean hasHarvest = harvestAbility != IToolHarvestAbility.NONE; - - ChatBuilder builder = ChatBuilder.start("[Enabled "); + boolean hasArea = areaAbility != IToolAreaAbility.NONE; + boolean hasHarvest = harvestAbility != IToolHarvestAbility.NONE; - if (hasArea) { - builder.nextTranslation(areaAbility.getName()); - builder.next(areaAbility.getExtension(areaAbilityLevel)); - } + ChatBuilder builder = ChatBuilder.start("[Enabled "); - if (hasArea && hasHarvest) { - builder.next(" + "); - } + if(hasArea) { + builder.nextTranslation(areaAbility.getName()); + builder.next(areaAbility.getExtension(areaAbilityLevel)); + } - if (hasHarvest) { - builder.nextTranslation(harvestAbility.getName()); - builder.next(harvestAbility.getExtension(harvestAbilityLevel)); - } - - return builder.colorAll(EnumChatFormatting.YELLOW).flush(); - } + if(hasArea && hasHarvest) { + builder.next(" + "); + } + + if(hasHarvest) { + builder.nextTranslation(harvestAbility.getName()); + builder.next(harvestAbility.getExtension(harvestAbilityLevel)); + } + + return builder.colorAll(EnumChatFormatting.YELLOW).flush(); + } public boolean isNone() { return areaAbility == IToolAreaAbility.NONE && harvestAbility == IToolHarvestAbility.NONE; diff --git a/src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java b/src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java new file mode 100644 index 000000000..968899426 --- /dev/null +++ b/src/main/java/com/hbm/handler/ae2/AE2CompatHandler.java @@ -0,0 +1,19 @@ +package com.hbm.handler.ae2; + +import appeng.api.AEApi; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.Optional; + +public class AE2CompatHandler { + public static void init() { + if (Loader.isModLoaded("appliedenergistics2")) { + registerHandler(); + } + } + + @Optional.Method(modid = "appliedenergistics2") + private static void registerHandler() { + AEApi.instance().registries().externalStorage().addExternalStorageInterface(new MSUExternalStorageHandler()); + AEApi.instance().registries().externalStorage().addExternalStorageInterface(new AFLExternalStorageHandler()); + } +} diff --git a/src/main/java/com/hbm/handler/ae2/AFLExternalStorageHandler.java b/src/main/java/com/hbm/handler/ae2/AFLExternalStorageHandler.java new file mode 100644 index 000000000..37ff769e3 --- /dev/null +++ b/src/main/java/com/hbm/handler/ae2/AFLExternalStorageHandler.java @@ -0,0 +1,34 @@ +package com.hbm.handler.ae2; + +import com.hbm.tileentity.machine.TileEntityMachineArcFurnaceLarge; +import com.hbm.tileentity.TileEntityProxyCombo; +import cpw.mods.fml.common.Optional; + +import appeng.api.networking.security.BaseActionSource; +import appeng.api.storage.IExternalStorageHandler; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.StorageChannel; +import appeng.me.storage.MEMonitorIInventory; +import appeng.util.inv.IMEAdaptor; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +@Optional.InterfaceList({@Optional.Interface(iface = "appeng.api.storage.IExternalStorageHandler", modid = "appliedenergistics2")}) +public class AFLExternalStorageHandler implements IExternalStorageHandler { + + public AFLExternalStorageHandler() {} + + @Override + public boolean canHandle(TileEntity te, ForgeDirection d, StorageChannel channel, BaseActionSource mySrc) { + boolean coreProxy = te instanceof TileEntityProxyCombo && ((TileEntityProxyCombo) te).getTile() instanceof TileEntityMachineArcFurnaceLarge; + return channel == StorageChannel.ITEMS && (te instanceof TileEntityMachineArcFurnaceLarge || coreProxy); + } + + @Override + public IMEInventory getInventory(TileEntity te, ForgeDirection d, StorageChannel channel, BaseActionSource src) { + if (!canHandle(te, d, channel, src)) return null; + if (te instanceof TileEntityProxyCombo) return new MEMonitorIInventory(new IMEAdaptor(new ArcFurnaceLargeMEInventory((TileEntityMachineArcFurnaceLarge) ((TileEntityProxyCombo)te).getTile()), src)) {}; + return new MEMonitorIInventory(new IMEAdaptor(new ArcFurnaceLargeMEInventory((TileEntityMachineArcFurnaceLarge) te), src)) {}; + } + +} diff --git a/src/main/java/com/hbm/handler/ae2/ArcFurnaceLargeMEInventory.java b/src/main/java/com/hbm/handler/ae2/ArcFurnaceLargeMEInventory.java new file mode 100644 index 000000000..3245629e6 --- /dev/null +++ b/src/main/java/com/hbm/handler/ae2/ArcFurnaceLargeMEInventory.java @@ -0,0 +1,59 @@ +package com.hbm.handler.ae2; + +import com.hbm.tileentity.machine.TileEntityMachineArcFurnaceLarge; + +import cpw.mods.fml.common.Optional; + +import appeng.api.AEApi; +import appeng.api.config.Actionable; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; +import net.minecraft.item.ItemStack; + +@Optional.InterfaceList({ @Optional.Interface(iface = "appeng.api.storage.IMEInventory", modid = "appliedenergistics2") }) +public class ArcFurnaceLargeMEInventory implements IMEInventory { + + private TileEntityMachineArcFurnaceLarge afl; + + public ArcFurnaceLargeMEInventory(TileEntityMachineArcFurnaceLarge afl) { + this.afl = afl; + } + + @Override + public IAEItemStack injectItems(IAEItemStack input, Actionable type, BaseActionSource src) { + ItemStack is = input.getItemStack(); + is = afl.distributeInput(is, type == Actionable.MODULATE); + + if(is == null) return null; + return AEApi.instance().storage().createItemStack(is); + } + + @Override + public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { + ItemStack is = request.getItemStack(); + is = afl.collectRequested(is, mode == Actionable.MODULATE); + + if(is == null) return null; + return AEApi.instance().storage().createItemStack(is); + } + + @Override + public IItemList getAvailableItems(IItemList out) { + ItemStack is; + for(int i = 0; i < 25; i++) { + is = afl.getAvailableItemFromSlot(i); + if(is != null) + out.add(AEApi.instance().storage().createItemStack(is)); + } + + return out; + } + + @Override + public StorageChannel getChannel() { + return StorageChannel.ITEMS; + } +} diff --git a/src/main/java/com/hbm/handler/ae2/MSUExternalStorageHandler.java b/src/main/java/com/hbm/handler/ae2/MSUExternalStorageHandler.java new file mode 100644 index 000000000..fe82feb00 --- /dev/null +++ b/src/main/java/com/hbm/handler/ae2/MSUExternalStorageHandler.java @@ -0,0 +1,46 @@ +package com.hbm.handler.ae2; + +import com.hbm.tileentity.machine.storage.TileEntityMassStorage; +import com.hbm.util.ItemStackUtil; +import cpw.mods.fml.common.Optional; + +import appeng.api.networking.security.BaseActionSource; +import appeng.api.storage.IExternalStorageHandler; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEItemStack; +import appeng.me.storage.MEMonitorIInventory; +import appeng.util.inv.IMEAdaptor; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +@Optional.InterfaceList({@Optional.Interface(iface = "appeng.api.storage.IExternalStorageHandler", modid = "appliedenergistics2")}) +public class MSUExternalStorageHandler implements IExternalStorageHandler { + + public MSUExternalStorageHandler() {} + + @Override + public boolean canHandle(TileEntity te, ForgeDirection d, StorageChannel channel, BaseActionSource mySrc) { + return channel == StorageChannel.ITEMS && te instanceof TileEntityMassStorage; + } + + @Override + public IMEInventory getInventory(TileEntity te, ForgeDirection d, StorageChannel channel, BaseActionSource src) { + if (!canHandle(te, d, channel, src)) + return null; + + // Note: apparently I need this, though I'm not sure why. Storage drawers does it. + // Here's a relevant discussion, if anyone wants to dive into that rabbit hole: + // https://github.com/AppliedEnergistics/Applied-Energistics-2/issues/418 + return new MEMonitorIInventory(new IMEAdaptor(new MassStorageMEInventory((TileEntityMassStorage)te), src)) { + @Override + public boolean isPrioritized(IAEItemStack stack) { + ItemStack type = ((TileEntityMassStorage)te).getType(); + + return type != null && ItemStackUtil.areStacksCompatible(stack.getItemStack(), type); + } + }; + } + +} diff --git a/src/main/java/com/hbm/handler/ae2/MassStorageMEInventory.java b/src/main/java/com/hbm/handler/ae2/MassStorageMEInventory.java new file mode 100644 index 000000000..848e2c053 --- /dev/null +++ b/src/main/java/com/hbm/handler/ae2/MassStorageMEInventory.java @@ -0,0 +1,85 @@ +package com.hbm.handler.ae2; + +import com.hbm.tileentity.machine.storage.TileEntityMassStorage; +import com.hbm.util.ItemStackUtil; + +import cpw.mods.fml.common.Optional; + +import appeng.api.AEApi; +import appeng.api.config.Actionable; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; +import net.minecraft.item.ItemStack; + +@Optional.InterfaceList({@Optional.Interface(iface = "appeng.api.storage.IMEInventory", modid = "appliedenergistics2")}) +public class MassStorageMEInventory implements IMEInventory { + + private TileEntityMassStorage tile; + + public MassStorageMEInventory(TileEntityMassStorage tile) { + this.tile = tile; + } + + @Override + public IAEItemStack injectItems(IAEItemStack input, Actionable type, BaseActionSource src) { + ItemStack typeStack = tile.getType(); + + if (typeStack == null || !ItemStackUtil.areStacksCompatible(input.getItemStack(), typeStack)) + return input; + + // If you're working with amounts greater than MAX_INT, you shouldn't use MSUs in the first place + int remaining = tile.increaseTotalStockpile((int)input.getStackSize(), type == Actionable.MODULATE); + + if (remaining == 0) { + return null; + } + + return AEApi.instance().storage() + .createItemStack(typeStack) + .setStackSize(remaining); + } + + @Override + public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { + ItemStack typeStack = tile.getType(); + + if (typeStack == null || !ItemStackUtil.areStacksCompatible(request.getItemStack(), typeStack)) + return null; + + // If you're working with amounts greater than MAX_INT, you shouldn't use MSUs in the first place + int missing = tile.decreaseTotalStockpile((int)request.getStackSize(), mode == Actionable.MODULATE); + long fulfilled = request.getStackSize() - missing; + + if (fulfilled == 0) { + return null; + } + + return AEApi.instance().storage() + .createItemStack(typeStack) + .setStackSize(fulfilled); + } + + @Override + public IItemList getAvailableItems(IItemList out) { + ItemStack typeStack = tile.getType(); + + if (typeStack != null) { + out.add( + AEApi.instance().storage() + .createItemStack(typeStack) + .setStackSize(tile.getTotalStockpile()) + ); + } + + return out; + } + + @Override + public StorageChannel getChannel() { + return StorageChannel.ITEMS; + } + +} diff --git a/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java b/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java index d0e8e6bd7..dab6b35f3 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java @@ -4,6 +4,7 @@ import com.hbm.handler.BulletConfiguration; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.items.ModItems; +@Deprecated public class GunEnergyFactory { public static BulletConfiguration getTurbineConfig() { diff --git a/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java b/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java index 8b5cb54bb..aa33eba4f 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java @@ -23,6 +23,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.Vec3; +@Deprecated public class GunNPCFactory { public static BulletConfiguration getMaskmanOrb() { diff --git a/src/main/java/com/hbm/handler/imc/IMCBlastFurnace.java b/src/main/java/com/hbm/handler/imc/IMCBlastFurnace.java index 7a99d4349..d553587bf 100644 --- a/src/main/java/com/hbm/handler/imc/IMCBlastFurnace.java +++ b/src/main/java/com/hbm/handler/imc/IMCBlastFurnace.java @@ -14,6 +14,7 @@ import net.minecraft.nbt.NBTTagList; * @author UFFR */ +@Deprecated public class IMCBlastFurnace extends IMCHandler { public static final ArrayList> buffer = new ArrayList<>(); diff --git a/src/main/java/com/hbm/handler/imc/IMCCentrifuge.java b/src/main/java/com/hbm/handler/imc/IMCCentrifuge.java index 24456f70f..8fc5666cb 100644 --- a/src/main/java/com/hbm/handler/imc/IMCCentrifuge.java +++ b/src/main/java/com/hbm/handler/imc/IMCCentrifuge.java @@ -10,6 +10,7 @@ import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +@Deprecated public class IMCCentrifuge extends IMCHandler { public static HashMap buffer = new HashMap(); diff --git a/src/main/java/com/hbm/handler/imc/IMCCrystallizer.java b/src/main/java/com/hbm/handler/imc/IMCCrystallizer.java index 9230bb11c..8ca219536 100644 --- a/src/main/java/com/hbm/handler/imc/IMCCrystallizer.java +++ b/src/main/java/com/hbm/handler/imc/IMCCrystallizer.java @@ -13,6 +13,7 @@ import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +@Deprecated public class IMCCrystallizer extends IMCHandler { public static HashMap, CrystallizerRecipe> buffer = new HashMap(); diff --git a/src/main/java/com/hbm/handler/imc/IMCHandler.java b/src/main/java/com/hbm/handler/imc/IMCHandler.java index 22cd5a386..4aa650742 100644 --- a/src/main/java/com/hbm/handler/imc/IMCHandler.java +++ b/src/main/java/com/hbm/handler/imc/IMCHandler.java @@ -6,6 +6,13 @@ import com.hbm.main.MainRegistry; import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; +/** + * I'm not aware of anyone even using these, and for proper addon mods it's way easier to use direct calls instead of messages. + * Too cumbersome to implement and maintain, especially since the recipe register listeners exist now. Current implementation will break on recipe reload anyway. + * + * @author hbm + */ +@Deprecated public abstract class IMCHandler { private static final HashMap handlers = new HashMap(); diff --git a/src/main/java/com/hbm/handler/microblocks/MicroBlocksCompatHandler.java b/src/main/java/com/hbm/handler/microblocks/MicroBlocksCompatHandler.java new file mode 100644 index 000000000..3abe4eb0d --- /dev/null +++ b/src/main/java/com/hbm/handler/microblocks/MicroBlocksCompatHandler.java @@ -0,0 +1,77 @@ +package com.hbm.handler.microblocks; + +import com.hbm.blocks.ModBlocks; +import cpw.mods.fml.common.event.FMLInterModComms; +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; + +public class MicroBlocksCompatHandler { + public static void preInit() { + registerMicroBlockCompat(ModBlocks.basalt); + registerMicroBlockCompat(ModBlocks.basalt_smooth); + registerMicroBlockCompat(ModBlocks.basalt_brick); + registerMicroBlockCompat(ModBlocks.basalt_polished); + registerMicroBlockCompat(ModBlocks.basalt_tiles); + + registerMicroBlockCompat(ModBlocks.deco_titanium); + registerMicroBlockCompat(ModBlocks.deco_red_copper); + registerMicroBlockCompat(ModBlocks.deco_tungsten); + registerMicroBlockCompat(ModBlocks.deco_aluminium); + registerMicroBlockCompat(ModBlocks.deco_steel); + registerMicroBlockCompat(ModBlocks.deco_rusty_steel); + registerMicroBlockCompat(ModBlocks.deco_lead); + registerMicroBlockCompat(ModBlocks.deco_beryllium); + registerMicroBlockCompat(ModBlocks.deco_asbestos); + registerMicroBlockCompat(ModBlocks.deco_rbmk); + registerMicroBlockCompat(ModBlocks.deco_rbmk_smooth); + + registerMicroBlockCompat(ModBlocks.asphalt); + registerMicroBlockCompat(ModBlocks.asphalt_light); + + registerMicroBlockCompat(ModBlocks.reinforced_brick); + registerMicroBlockCompat(ModBlocks.reinforced_ducrete); + registerMicroBlockCompat(ModBlocks.reinforced_sand); + + registerMicroBlockCompat(ModBlocks.reinforced_stone); + registerMicroBlockCompat(ModBlocks.concrete_smooth); + registerMicroBlockCompat(ModBlocks.concrete_colored); + registerMicroBlockCompat(ModBlocks.concrete_colored_ext); + registerMicroBlockCompat(ModBlocks.concrete); + registerMicroBlockCompat(ModBlocks.concrete_asbestos); + registerMicroBlockCompat(ModBlocks.concrete_super); + registerMicroBlockCompat(ModBlocks.concrete_super_broken); + registerMicroBlockCompat(ModBlocks.ducrete_smooth); + registerMicroBlockCompat(ModBlocks.ducrete); + registerMicroBlockCompat(ModBlocks.concrete_pillar); + registerMicroBlockCompat(ModBlocks.brick_concrete); + registerMicroBlockCompat(ModBlocks.brick_concrete_mossy); + registerMicroBlockCompat(ModBlocks.brick_concrete_cracked); + registerMicroBlockCompat(ModBlocks.brick_concrete_broken); + registerMicroBlockCompat(ModBlocks.brick_concrete_marked); + registerMicroBlockCompat(ModBlocks.brick_ducrete); + registerMicroBlockCompat(ModBlocks.brick_obsidian); + registerMicroBlockCompat(ModBlocks.brick_light); + registerMicroBlockCompat(ModBlocks.brick_compound); + registerMicroBlockCompat(ModBlocks.brick_asbestos); + registerMicroBlockCompat(ModBlocks.brick_fire); + registerMicroBlockCompat(ModBlocks.lightstone); + + registerMicroBlockCompat(ModBlocks.cmb_brick); + registerMicroBlockCompat(ModBlocks.cmb_brick_reinforced); + registerMicroBlockCompat(ModBlocks.vinyl_tile); + + registerMicroBlockCompat(ModBlocks.tile_lab); + registerMicroBlockCompat(ModBlocks.tile_lab_cracked); + registerMicroBlockCompat(ModBlocks.tile_lab_broken); + } + + private static void registerMicroBlockCompat(Block block) { + for(int meta = 0; meta < 15; meta++) { + registerMicroBlockCompat(block, meta); + } + } + + private static void registerMicroBlockCompat(Block block, int meta) { + FMLInterModComms.sendMessage("ForgeMicroblock", "microMaterial", new ItemStack(block, 1, meta)); + } +} diff --git a/src/main/java/com/hbm/handler/nei/AssemblerRecipeHandler.java b/src/main/java/com/hbm/handler/nei/AssemblerRecipeHandler.java deleted file mode 100644 index d3ddb9df0..000000000 --- a/src/main/java/com/hbm/handler/nei/AssemblerRecipeHandler.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.hbm.handler.nei; - -import java.awt.Rectangle; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; -import com.hbm.inventory.RecipesCommon.ComparableStack; -import com.hbm.inventory.gui.GUIMachineAssembler; -import com.hbm.inventory.recipes.AssemblerRecipes; -import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemAssemblyTemplate; -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 AssemblerRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { - - public LinkedList transferRectsRec = new LinkedList(); - public LinkedList transferRectsGui = new LinkedList(); - public LinkedList> guiRec = new LinkedList>(); - public LinkedList> guiGui = new LinkedList>(); - - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_assembler), - new ItemStack(ModBlocks.machine_assemfac)}; - } - - @Override - public String getRecipeID() { - return "assembly"; - } - - public class SmeltingSet extends TemplateRecipeHandler.CachedRecipe { - - List input; - PositionedStack result; - - public SmeltingSet(List in, ItemStack result) { - - input = new ArrayList(); - - ComparableStack comp = new ComparableStack(result); - ItemStack template = ItemAssemblyTemplate.writeType(new ItemStack(ModItems.assembly_template), comp); - - for(int i = 0; i < Math.min(in.size(), 12); i++) { - input.add(new PositionedStack(in.get(i), 30 + (i % 4) * 18, 6 + (i / 4) * 18)); - } - - input.add(new PositionedStack(template, 66 + 45, 6)); - this.result = new PositionedStack(result, 138, 24); - } - - @Override - public List getIngredients() { - return getCycledIngredients(cycleticks / 48, input); - } - - @Override - public PositionedStack getResult() { - return result; - } - } - - @Override - public String getRecipeName() { - return "Assembly Machine"; - } - - @Override - public String getGuiTexture() { - return RefStrings.MODID + ":textures/gui/nei/gui_nei_assembler.png"; - } - - @Override - public void loadCraftingRecipes(String outputId, Object... results) { - - if ((outputId.equals("assembly")) && getClass() == AssemblerRecipeHandler.class) { - - Map> recipes = AssemblerRecipes.getRecipes(); - - for (Map.Entry> recipe : recipes.entrySet()) { - this.arecipes.add(new SmeltingSet(recipe.getValue(), recipe.getKey())); - } - } else { - super.loadCraftingRecipes(outputId, results); - } - } - - @Override - public void loadCraftingRecipes(ItemStack result) { - - Map> recipes = AssemblerRecipes.getRecipes(); - - for (Map.Entry> recipe : recipes.entrySet()) { - - if (NEIServerUtils.areStacksSameTypeCrafting(recipe.getKey(), result)) - this.arecipes.add(new SmeltingSet(recipe.getValue(), recipe.getKey())); - } - } - - @Override - public void loadUsageRecipes(String inputId, Object... ingredients) { - - if ((inputId.equals("assembly")) && getClass() == AssemblerRecipeHandler.class) { - loadCraftingRecipes("assembly", new Object[0]); - } else { - super.loadUsageRecipes(inputId, ingredients); - } - } - - @Override - public void loadUsageRecipes(ItemStack ingredient) { - - Map> recipes = AssemblerRecipes.getRecipes(); - - for (Map.Entry> recipe : recipes.entrySet()) { - - for(Object o : recipe.getValue()) { - - if(o instanceof ItemStack && NEIServerUtils.areStacksSameTypeCrafting((ItemStack)o, ingredient)) { - this.arecipes.add(new SmeltingSet(recipe.getValue(), recipe.getKey())); - - } else if(o instanceof List) { - - for(Object obj : (List)o) { - - if(obj instanceof ItemStack && NEIServerUtils.areStacksSameTypeCrafting((ItemStack)obj, ingredient)) { - this.arecipes.add(new SmeltingSet(recipe.getValue(), recipe.getKey())); - } - } - } - } - } - } - - @Override - public Class getGuiClass() { - return null; - } - - @Override - public void loadTransferRects() { - transferRectsGui = new LinkedList(); - guiGui = new LinkedList>(); - - transferRects.add(new RecipeTransferRect(new Rectangle(138 - 1 - 36, 23, 36, 18), "assembly")); - transferRectsGui.add(new RecipeTransferRect(new Rectangle(18 * 2 + 2, 89 - 7 - 11, 18 * 5 - 4, 18 + 16), "assembly")); - guiGui.add(GUIMachineAssembler.class); - RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); - RecipeTransferRectHandler.registerRectsToGuis(guiGui, transferRectsGui); - } - - @Override - public void drawExtras(int recipe) { - - drawProgressBar(83 - (18 * 4) - 9 + 1, 6, 0, 86, 16, 18 * 3 - 2, 480, 7); - - drawProgressBar(83 - 3 + 16 + 5, 5 + 18, 16, 86, 36, 18, 48, 0); - } - - @Override - public TemplateRecipeHandler newInstance() { - return super.newInstance(); - } - -} diff --git a/src/main/java/com/hbm/handler/nei/AssemblyMachineRecipeHandler.java b/src/main/java/com/hbm/handler/nei/AssemblyMachineRecipeHandler.java new file mode 100644 index 000000000..288b74db5 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/AssemblyMachineRecipeHandler.java @@ -0,0 +1,18 @@ +package com.hbm.handler.nei; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.recipes.AssemblyMachineRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; + +public class AssemblyMachineRecipeHandler extends NEIGenericRecipeHandler { + + public AssemblyMachineRecipeHandler() { + super(ModBlocks.machine_assembly_machine.getLocalizedName(), AssemblyMachineRecipes.INSTANCE, ModBlocks.machine_assembly_machine); + } + + @Override public String getRecipeID() { return "ntmAssemblyMachine"; } + + @Override public int getInputXOffset(GenericRecipe recipe, int inputCount) { return recipe.inputItem != null && recipe.inputItem.length > 9 ? 18 : 0; } + @Override public int getOutputXOffset(GenericRecipe recipe, int outputCount) { return recipe.inputItem != null && recipe.inputItem.length > 9 ? 18 : 0; } + @Override public int getMachineXOffset(GenericRecipe recipe) { return recipe.inputItem != null && recipe.inputItem.length > 9 ? 18 : 0; } +} diff --git a/src/main/java/com/hbm/handler/nei/ChemicalPlantRecipeHandler.java b/src/main/java/com/hbm/handler/nei/ChemicalPlantRecipeHandler.java index 47d77945b..8bca29e98 100644 --- a/src/main/java/com/hbm/handler/nei/ChemicalPlantRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/ChemicalPlantRecipeHandler.java @@ -3,14 +3,11 @@ package com.hbm.handler.nei; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.recipes.ChemicalPlantRecipes; -public class ChemicalPlantRecipeHandler extends NEIUniversalHandler { //TODO: make a new universal handler +public class ChemicalPlantRecipeHandler extends NEIGenericRecipeHandler { public ChemicalPlantRecipeHandler() { - super(ModBlocks.machine_chemical_plant.getLocalizedName(), ModBlocks.machine_chemical_plant, ChemicalPlantRecipes.getRecipes()); + super(ModBlocks.machine_chemical_plant.getLocalizedName(), ChemicalPlantRecipes.INSTANCE, ModBlocks.machine_chemical_plant, ModBlocks.machine_chemical_factory); } - @Override - public String getKey() { - return "ntmChemicalPlant"; - } + @Override public String getRecipeID() { return "ntmChemicalPlant"; } } diff --git a/src/main/java/com/hbm/handler/nei/ChemplantRecipeHandler.java b/src/main/java/com/hbm/handler/nei/ChemplantRecipeHandler.java deleted file mode 100644 index b0b5e19a4..000000000 --- a/src/main/java/com/hbm/handler/nei/ChemplantRecipeHandler.java +++ /dev/null @@ -1,236 +0,0 @@ -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.handler.imc.ICompatNHNEI; -import com.hbm.inventory.FluidStack; -import com.hbm.inventory.RecipesCommon.AStack; -import com.hbm.inventory.gui.GUIMachineChemplant; -import com.hbm.inventory.recipes.ChemplantRecipes; -import com.hbm.inventory.recipes.ChemplantRecipes.ChemRecipe; -import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemFluidIcon; -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 ChemplantRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { - - public LinkedList transferRectsRec = new LinkedList(); - public LinkedList transferRectsGui = new LinkedList(); - public LinkedList> guiRec = new LinkedList>(); - public LinkedList> guiGui = new LinkedList>(); - - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_chemplant), - new ItemStack(ModBlocks.machine_chemfac)}; - } - - @Override - public String getRecipeID() { - return "chemistry"; - } - public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { - - PositionedStack[] itemIn = new PositionedStack[4]; - PositionedStack[] fluidIn = new PositionedStack[2]; - PositionedStack[] itemOut = new PositionedStack[4]; - PositionedStack[] fluidOut = new PositionedStack[2]; - PositionedStack template; - - public RecipeSet(ChemRecipe recipe) { - - for(int i = 0; i < recipe.inputs.length; i++) { - AStack in = recipe.inputs[i]; - if(in == null) continue; - this.itemIn[i] = new PositionedStack(in.extractForNEI(), 30 + (i % 2) * 18, 24 + (i / 2) * 18); - } - - for(int i = 0; i < recipe.inputFluids.length; i++) { - FluidStack in = recipe.inputFluids[i]; - if(in == null) continue; - ItemStack drop = ItemFluidIcon.make(in); - this.fluidIn[i] = new PositionedStack(drop, 30 + (i % 2) * 18, 6); - } - - for(int i = 0; i < recipe.outputs.length; i++) { - ItemStack out = recipe.outputs[i]; - if(out == null) continue; - this.itemOut[i] = new PositionedStack(out, 120 + (i % 2) * 18, 24 + (i / 2) * 18); - } - - for(int i = 0; i < recipe.outputFluids.length; i++) { - FluidStack out = recipe.outputFluids[i]; - if(out == null) continue; - ItemStack drop = ItemFluidIcon.make(out); - this.fluidOut[i] = new PositionedStack(drop, 120 + (i % 2) * 18, 6); - } - - this.template = new PositionedStack(new ItemStack(ModItems.chemistry_template, 1, recipe.getId()), 84, 6); - } - - @Override - public List getIngredients() { - List stacks = new ArrayList(); - - for(PositionedStack stack : itemIn) if(stack != null) stacks.add(stack); - for(PositionedStack stack : fluidIn) if(stack != null) stacks.add(stack); - stacks.add(template); - - return getCycledIngredients(cycleticks / 20, stacks); - } - - @Override - public List getOtherStacks() { - List stacks = new ArrayList(); - - for(PositionedStack stack : itemOut) if(stack != null) stacks.add(stack); - for(PositionedStack stack : fluidOut) if(stack != null) stacks.add(stack); - stacks.add(template); - - return stacks; - } - - @Override - public PositionedStack getResult() { - return null; - } - } - - @Override - public String getRecipeName() { - return "Chemical Plant"; - } - - @Override - public String getGuiTexture() { - return RefStrings.MODID + ":textures/gui/nei/gui_nei_chemplant.png"; - } - - @Override - public void loadCraftingRecipes(String outputId, Object... results) { - - if((outputId.equals("chemistry")) && getClass() == ChemplantRecipeHandler.class) { - - for(ChemRecipe recipe : ChemplantRecipes.recipes) { - this.arecipes.add(new RecipeSet(recipe)); - } - } else { - super.loadCraftingRecipes(outputId, results); - } - } - - @Override - public void loadCraftingRecipes(ItemStack result) { - - outer: - for(ChemRecipe recipe : ChemplantRecipes.recipes) { - - for(ItemStack out : recipe.outputs) { - - if(out != null && NEIServerUtils.areStacksSameTypeCrafting(result, out)) { - this.arecipes.add(new RecipeSet(recipe)); - continue outer; - } - } - - for(FluidStack out : recipe.outputFluids) { - - if(out != null) { - ItemStack drop = ItemFluidIcon.make(out.type, out.fill); - - if(compareFluidStacks(result, drop)) { - this.arecipes.add(new RecipeSet(recipe)); - continue outer; - } - } - } - } - } - - @Override - public void loadUsageRecipes(String inputId, Object... ingredients) { - if((inputId.equals("chemistry")) && getClass() == ChemplantRecipeHandler.class) { - loadCraftingRecipes("chemistry", new Object[0]); - } else { - super.loadUsageRecipes(inputId, ingredients); - } - } - - @Override - public void loadUsageRecipes(ItemStack ingredient) { - - outer: - for(ChemRecipe recipe : ChemplantRecipes.recipes) { - - for(AStack in : recipe.inputs) { - - if(in != null) { - List stacks = in.extractForNEI(); - - for(ItemStack stack : stacks) { - if(NEIServerUtils.areStacksSameTypeCrafting(ingredient, stack)) { - this.arecipes.add(new RecipeSet(recipe)); - continue outer; - } - } - } - } - - for(FluidStack in : recipe.inputFluids) { - - if(in != null) { - ItemStack drop = ItemFluidIcon.make(in.type, in.fill); - - if(compareFluidStacks(ingredient, drop)) { - this.arecipes.add(new RecipeSet(recipe)); - continue outer; - } - } - } - } - } - - private boolean compareFluidStacks(ItemStack sta1, ItemStack sta2) { - return sta1.getItem() == sta2.getItem() && sta1.getItemDamage() == sta2.getItemDamage(); - } - - @Override - public Class getGuiClass() { - return null; - } - - @Override - public void loadTransferRects() { - transferRectsGui = new LinkedList(); - guiGui = new LinkedList>(); - - transferRects.add(new RecipeTransferRect(new Rectangle(138 - 1 - 72, 23, 18 * 3, 18), "chemistry")); - transferRectsGui.add(new RecipeTransferRect(new Rectangle(18 * 2 + 2, 89 - 7 - 11, 18 * 5 - 4, 18 + 16), "chemistry")); - guiGui.add(GUIMachineChemplant.class); - RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); - RecipeTransferRectHandler.registerRectsToGuis(guiGui, transferRectsGui); - } - - @Override - public void drawExtras(int recipe) { - - drawProgressBar(83 - (18 * 4) - 9 + 1, 6, 0, 86, 16, 18 * 3 - 2, 480, 7); - drawProgressBar(83 - 3 + 16 + 5 - 36, 5 + 18, 16, 86, 18 * 3, 18, 48, 0); - } - - @Override - public TemplateRecipeHandler newInstance() { - return super.newInstance(); - } -} diff --git a/src/main/java/com/hbm/handler/nei/NEIGenericRecipeHandler.java b/src/main/java/com/hbm/handler/nei/NEIGenericRecipeHandler.java new file mode 100644 index 000000000..becbbad76 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/NEIGenericRecipeHandler.java @@ -0,0 +1,321 @@ +package com.hbm.handler.nei; + +import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect; + +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import com.hbm.config.ClientConfig; +import com.hbm.handler.imc.ICompatNHNEI; +import com.hbm.inventory.FluidStack; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipes.IOutput; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemBlueprints; +import com.hbm.items.machine.ItemFluidIcon; +import com.hbm.lib.RefStrings; + +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import net.minecraft.block.Block; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; + +public abstract class NEIGenericRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { + + public LinkedList transferRectsRec = new LinkedList(); + public LinkedList transferRectsGui = new LinkedList(); + public LinkedList> guiRec = new LinkedList>(); + public LinkedList> guiGui = new LinkedList>(); + + public final String displayName; + public final GenericRecipes recipeSet; + public final ItemStack[] machines; + + public NEIGenericRecipeHandler(String displayName, GenericRecipes recipeSet, Block... machines) { + ItemStack[] machineStacks = new ItemStack[machines.length]; + for(int i = 0; i < machines.length; i++) machineStacks[i] = new ItemStack(machines[i]); + this.displayName = displayName; + this.recipeSet = recipeSet; + this.machines = machineStacks; + } + + public NEIGenericRecipeHandler(String displayName, GenericRecipes recipeSet, ItemStack... machines) { + this.displayName = displayName; + this.recipeSet = recipeSet; + this.machines = machines; + } + + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + + protected GenericRecipe recipe; + protected PositionedStack[] input; + protected PositionedStack[] output; + protected PositionedStack machine; + protected PositionedStack template; + + public RecipeSet(GenericRecipe recipe) { + this.recipe = recipe; + int inputSize = 0; + int outputSize = 0; + + if(recipe.inputItem != null) inputSize += recipe.inputItem.length; // sure a ternary is "less code" but is it more readable? no? thought so + if(recipe.inputFluid != null) inputSize += recipe.inputFluid.length; + if(recipe.outputItem != null) outputSize += recipe.outputItem.length; + if(recipe.outputFluid != null) outputSize += recipe.outputFluid.length; + + int inputOffset = getInputXOffset(recipe, inputSize); + int outputOffset = getOutputXOffset(recipe, outputSize); + int machineOffset = getMachineXOffset(recipe); + + this.input = new PositionedStack[inputSize]; + int[][] inPos = getInputSlotPositions(inputSize); + inputSize = 0; // just gonna reuse this because fuck it why not + + if(recipe.inputItem != null) for(int i = 0; i < recipe.inputItem.length; i++) { + this.input[i] = new PositionedStack(recipe.inputItem[i].extractForNEI(), inPos[i][0] + inputOffset, inPos[i][1]); + inputSize = i + 1; + } + if(recipe.inputFluid != null) for(int i = 0; i < recipe.inputFluid.length; i++) { + this.input[inputSize + i] = new PositionedStack(ItemFluidIcon.make(recipe.inputFluid[i]), inPos[inputSize + i][0] + inputOffset, inPos[inputSize + i][1]); + } + + int[][] outPos = getOutputSlotPositions(outputSize); + this.output = new PositionedStack[outputSize]; + outputSize = 0; + + if(recipe.outputItem != null) for(int i = 0; i < recipe.outputItem.length; i++) { + this.output[i] = new PositionedStack(recipe.outputItem[i].getAllPossibilities(), outPos[i][0] + outputOffset, outPos[i][1]); + outputSize = i + 1; + } + if(recipe.outputFluid != null) for(int i = 0; i < recipe.outputFluid.length; i++) { + this.output[outputSize + i] = new PositionedStack(ItemFluidIcon.make(recipe.outputFluid[i]), outPos[outputSize + i][0] + outputOffset, outPos[outputSize + i][1]); + } + + if(recipe.isPooled()) { + String[] pools = recipe.getPools(); + ItemStack[] blueprints = new ItemStack[pools.length]; + for(int i = 0; i < pools.length; i++) blueprints[i] = ItemBlueprints.make(pools[i]); + this.template = new PositionedStack(blueprints, 75 + machineOffset, 10); + } + + ItemStack[] machineStacks = getMachines(recipe); + this.machine = new PositionedStack(machineStacks, 75 + machineOffset, template == null ? 31 : 38); + } + + @Override public List getIngredients() { return getCycledIngredients(cycleticks / 20, Arrays.asList(this.input)); } + @Override public PositionedStack getResult() { return this.output[0]; } + + @Override + public List getOtherStacks() { + List other = new ArrayList(); + for(int i = 1; i < this.output.length; i++) other.add(this.output[i]); + other.add(this.machine); + if(this.template != null) other.add(this.template); + return getCycledIngredients(cycleticks / 20, other); + } + } + + @Override public String getRecipeName() { return this.displayName; } + @Override public ItemStack[] getMachinesForRecipe() { return machines; } + @Override public String getGuiTexture() { return RefStrings.MODID + ":textures/gui/nei/gui_nei.png"; } + + public int getInputXOffset(GenericRecipe recipe, int inputCount) { return 0; } + public int getOutputXOffset(GenericRecipe recipe, int outputCount) { return 0; } + public int getMachineXOffset(GenericRecipe recipe) { return 0; } + public ItemStack[] getMachines(GenericRecipe recipe) { return this.machines; } + + // ✨ magic number vomit land ✨ + public int[][] getInputSlotPositions(int count) { + + if(count == 1) return new int[][] { {48, 24} }; + if(count == 2) return new int[][] { {30, 24}, {48, 24} }; + if(count == 3) return new int[][] { {12, 24}, {30, 24}, {48, 24} }; + if(count == 4) return new int[][] { {30, 15}, {48, 15}, {30, 33}, {48, 33} }; + if(count == 5) return new int[][] { {12, 15}, {30, 15}, {48, 15}, {12, 33}, {30, 33} }; + if(count == 6) return new int[][] { {12, 15}, {30, 15}, {48, 15}, {12, 33}, {30, 33}, {48, 33} }; + + int[][] slots = new int[count][2]; + int cols = (count + 2) / 3; + + for(int i = 0; i < count; i++) { + slots[i][0] = 12 + (i % cols) * 18 - (cols == 4 ? 18 : 0); + slots[i][1] = 6 + (i / cols) * 18; + } + + return slots; + } + + public int[][] getOutputSlotPositions(int count) { + switch(count) { + case 1: return new int[][] { + {102, 24} + }; + case 2: return new int[][] { + {102, 24}, + {120, 24} + }; + case 3: return new int[][] { + {102, 24}, + {120, 24}, + {138, 24} + }; + case 4: return new int[][] { + {102, 24 - 9}, + {120, 24 - 9}, + {102, 24 + 9}, + {120, 24 + 9} + }; + case 5: return new int[][] { + {102, 24 - 9}, {120, 24 - 9}, + {102, 24 + 9}, {120, 24 + 9}, + {138, 24}, + }; + case 6: return new int[][] { + {102, 6}, {120, 6}, + {102, 24}, {120, 24}, + {102, 42}, {120, 42}, + }; + case 7: return new int[][] { + {102, 6}, {120, 6}, + {102, 24}, {120, 24}, + {102, 42}, {120, 42}, + {138, 24}, + }; + case 8: return new int[][] { + {102, 6}, {120, 6}, + {102, 24}, {120, 24}, + {102, 42}, {120, 42}, + {138, 24}, {138, 42}, + }; + } + return new int[count][2]; + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + + outer: for(Object o : this.recipeSet.recipeOrderedList) { + GenericRecipe recipe = (GenericRecipe) o; + boolean hasMatch = false; + boolean hide = ClientConfig.NEI_HIDE_SECRETS.get(); + + if(hide && recipe.isPooled()) { + String[] pools = recipe.getPools(); + for(String pool : pools) if(pool.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) continue outer; + } + + if(hide && recipe.inputItem != null) for(AStack astack : recipe.inputItem) for(ItemStack stack : astack.extractForNEI()) { + if(ModItems.excludeNEI.contains(stack.getItem())) continue outer; + } + if(recipe.outputItem != null) for(IOutput output : recipe.outputItem) for(ItemStack stack : output.getAllPossibilities()) { + if(hide && ModItems.excludeNEI.contains(stack.getItem())) continue outer; + if(NEIServerUtils.areStacksSameTypeCrafting(stack, result)) hasMatch = true; + } + if(recipe.outputFluid != null) for(FluidStack fluid : recipe.outputFluid) { + if(areItemsAndMetaEqual(ItemFluidIcon.make(fluid), result)) hasMatch = true; + } + + if(hasMatch) this.arecipes.add(new RecipeSet(recipe)); + } + } + + /** load all */ + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + + if(outputId.equals(getRecipeID())) { + + outer: for(Object o : this.recipeSet.recipeOrderedList) { + GenericRecipe recipe = (GenericRecipe) o; + boolean hide = ClientConfig.NEI_HIDE_SECRETS.get(); + + if(hide && recipe.isPooled()) { + String[] pools = recipe.getPools(); + for(String pool : pools) if(pool.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) continue outer; + } + + if(hide && recipe.inputItem != null) for(AStack astack : recipe.inputItem) for(ItemStack stack : astack.extractForNEI()) + if(ModItems.excludeNEI.contains(stack.getItem())) continue outer; + if(hide && recipe.outputItem != null) for(IOutput output : recipe.outputItem) for(ItemStack stack : output.getAllPossibilities()) + if(ModItems.excludeNEI.contains(stack.getItem())) continue outer; + + this.arecipes.add(new RecipeSet(recipe)); + } + + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadUsageRecipes(String inputId, Object... ingredients) { + if(inputId.equals(getRecipeID())) { + loadCraftingRecipes(getRecipeID(), new Object[0]); + } else { + super.loadUsageRecipes(inputId, ingredients); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + + outer: for(Object o : this.recipeSet.recipeOrderedList) { + GenericRecipe recipe = (GenericRecipe) o; + boolean hasMatch = false; + boolean hide = ClientConfig.NEI_HIDE_SECRETS.get(); + + if(hide && recipe.isPooled()) { + String[] pools = recipe.getPools(); + for(String pool : pools) if(pool.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) continue outer; + } + + if(recipe.inputItem != null) for(AStack astack : recipe.inputItem) for(ItemStack stack : astack.extractForNEI()) { + if(hide && ModItems.excludeNEI.contains(stack.getItem())) continue outer; + if(NEIServerUtils.areStacksSameTypeCrafting(stack, ingredient)) hasMatch = true; + } + if(recipe.inputFluid != null) for(FluidStack fluid : recipe.inputFluid) { + if(areItemsAndMetaEqual(ItemFluidIcon.make(fluid), ingredient)) hasMatch = true; + } + if(hide && recipe.outputItem != null) for(IOutput output : recipe.outputItem) for(ItemStack stack : output.getAllPossibilities()) { + if(ModItems.excludeNEI.contains(stack.getItem())) continue outer; + } + + if(hasMatch) this.arecipes.add(new RecipeSet(recipe)); + } + } + + public static boolean areItemsAndMetaEqual(ItemStack sta1, ItemStack sta2) { + return sta1.getItem() == sta2.getItem() && sta1.getItemDamage() == sta2.getItemDamage(); + } + + @Override + public void loadTransferRects() { + transferRectsGui = new LinkedList(); + guiGui = new LinkedList>(); + transferRects.add(new RecipeTransferRect(new Rectangle(147, 1, 18, 18), getRecipeID())); + RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); + } + + @Override + public void drawBackground(int recipe) { + super.drawBackground(recipe); + + RecipeSet rec = (RecipeSet) this.arecipes.get(recipe); + + for(PositionedStack pos : rec.input) drawTexturedModalRect(pos.relx - 1, pos.rely - 1, 5, 87, 18, 18); + for(PositionedStack pos : rec.output) drawTexturedModalRect(pos.relx - 1, pos.rely - 1, 5, 87, 18, 18); + + if(rec.template == null) { + drawTexturedModalRect(74 + this.getMachineXOffset(rec.recipe), 14, 59, 87, 18, 36); + } else { + drawTexturedModalRect(74 + this.getMachineXOffset(rec.recipe), 7, 77, 87, 18, 50); + } + } +} diff --git a/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java b/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java index d82303b6c..31274e626 100644 --- a/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java +++ b/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java @@ -25,11 +25,6 @@ import net.minecraft.item.ItemStack; public abstract class NEIUniversalHandler extends TemplateRecipeHandler implements ICompatNHNEI { - @Override - public ItemStack[] getMachinesForRecipe() { - return machine; - } - public LinkedList transferRectsRec = new LinkedList(); public LinkedList transferRectsGui = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); @@ -119,6 +114,11 @@ public abstract class NEIUniversalHandler extends TemplateRecipeHandler implemen return this.display; } + @Override + public ItemStack[] getMachinesForRecipe() { + return machine; + } + @Override public String getGuiTexture() { return RefStrings.MODID + ":textures/gui/nei/gui_nei.png"; diff --git a/src/main/java/com/hbm/handler/nei/PUREXRecipeHandler.java b/src/main/java/com/hbm/handler/nei/PUREXRecipeHandler.java new file mode 100644 index 000000000..c5405fbf0 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/PUREXRecipeHandler.java @@ -0,0 +1,13 @@ +package com.hbm.handler.nei; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.recipes.PUREXRecipes; + +public class PUREXRecipeHandler extends NEIGenericRecipeHandler { + + public PUREXRecipeHandler() { + super(ModBlocks.machine_purex.getLocalizedName(), PUREXRecipes.INSTANCE, ModBlocks.machine_purex); + } + + @Override public String getRecipeID() { return "ntmPUREX"; } +} diff --git a/src/main/java/com/hbm/interfaces/IAnimatedDoor.java b/src/main/java/com/hbm/interfaces/IAnimatedDoor.java deleted file mode 100644 index d097f6fe2..000000000 --- a/src/main/java/com/hbm/interfaces/IAnimatedDoor.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.hbm.interfaces; - -public interface IAnimatedDoor extends IDoor { - - public void handleNewState(byte state); -} diff --git a/src/main/java/com/hbm/interfaces/IDoor.java b/src/main/java/com/hbm/interfaces/IDoor.java deleted file mode 100644 index a0c539a28..000000000 --- a/src/main/java/com/hbm/interfaces/IDoor.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.hbm.interfaces; - -public interface IDoor { - - void open(); - void close(); - DoorState getState(); - void toggle(); - default boolean setTexture(String tex) { - return false; - } - default void setTextureState(byte tex) { } - - default boolean setSkinIndex(byte skinIndex) { - return false; - } - - enum DoorState { - CLOSED, - OPEN, - CLOSING, - OPENING - } -} diff --git a/src/main/java/com/hbm/inventory/FluidContainerRegistry.java b/src/main/java/com/hbm/inventory/FluidContainerRegistry.java index c3f0e4afc..4bc72d64a 100644 --- a/src/main/java/com/hbm/inventory/FluidContainerRegistry.java +++ b/src/main/java/com/hbm/inventory/FluidContainerRegistry.java @@ -18,12 +18,18 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; public class FluidContainerRegistry { - - //TODO: continue incorporating hashmaps into this + + // TODO: continue incorporating hashmaps into this public static List allContainers = new ArrayList(); private static HashMap> containerMap = new HashMap>(); + public static void clearRegistry() { + allContainers.clear(); + containerMap.clear(); + } + public static void register() { + FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(Items.water_bucket), new ItemStack(Items.bucket), Fluids.WATER, 1000)); FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(Items.potionitem), new ItemStack(Items.glass_bottle), Fluids.WATER, 250)); FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(Items.lava_bucket), new ItemStack(Items.bucket), Fluids.LAVA, 1000)); @@ -59,34 +65,34 @@ public class FluidContainerRegistry { FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(Items.experience_bottle), new ItemStack(Items.glass_bottle), Fluids.XPJUICE, 100)); FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.can_mug), new ItemStack(ModItems.can_empty), Fluids.MUG, 100)); - + FluidType[] fluids = Fluids.getAll(); for(int i = 1; i < fluids.length; i++) { - + FluidType type = fluids[i]; int id = type.getID(); - + if(type.getContainer(CD_Canister.class) != null) FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.canister_full, 1, id), new ItemStack(ModItems.canister_empty), type, 1000)); if(type.getContainer(CD_Gastank.class) != null) FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.gas_full, 1, id), new ItemStack(ModItems.gas_empty), type, 1000)); - + if(type.hasNoContainer()) continue; - - if(type.isDispersable()){ - FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.disperser_canister, 1 , i), new ItemStack(ModItems.disperser_canister_empty), Fluids.fromID(i), 2000)); - FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.glyphid_gland, 1 , i), new ItemStack(ModItems.glyphid_gland_empty), Fluids.fromID(i), 4000)); + + if(type.isDispersable()) { + FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.disperser_canister, 1, i), new ItemStack(ModItems.disperser_canister_empty), Fluids.fromID(i), 2000)); + FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.glyphid_gland, 1, i), new ItemStack(ModItems.glyphid_gland_empty), Fluids.fromID(i), 4000)); } FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.fluid_tank_lead_full, 1, id), new ItemStack(ModItems.fluid_tank_lead_empty), type, 1000)); if(type.needsLeadContainer()) continue; - + FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.fluid_tank_full, 1, id), new ItemStack(ModItems.fluid_tank_empty), type, 1000)); FluidContainerRegistry.registerContainer(new FluidContainer(new ItemStack(ModItems.fluid_barrel_full, 1, id), new ItemStack(ModItems.fluid_barrel_empty), type, 16000)); } - + Compat.registerCompatFluidContainers(); } - + public static void registerContainer(FluidContainer con) { allContainers.add(con); OreDictionary.registerOre(con.type.getDict(con.content), con.fullContainer); @@ -103,51 +109,48 @@ public class FluidContainerRegistry { } public static FluidContainer getContainer(FluidType type, ItemStack stack) { - if(stack == null) - return null; - + if(stack == null) return null; + ItemStack sta = stack.copy(); sta.stackSize = 1; - if (!containerMap.containsKey(type)) + if(!containerMap.containsKey(type)) return null; - for (FluidContainer container : getContainers(type)) { - if (ItemStack.areItemStacksEqual(container.emptyContainer, sta) && ItemStack.areItemStackTagsEqual(container.emptyContainer, sta)) { + for(FluidContainer container : getContainers(type)) { + if(ItemStack.areItemStacksEqual(container.emptyContainer, sta) && ItemStack.areItemStackTagsEqual(container.emptyContainer, sta)) { return container; } } return null; } - + public static int getFluidContent(ItemStack stack, FluidType type) { - + if(stack == null) return 0; - + ItemStack sta = stack.copy(); sta.stackSize = 1; - if (!containerMap.containsKey(type)) + if(!containerMap.containsKey(type)) return 0; - + for(FluidContainer container : containerMap.get(type)) { if(ItemStack.areItemStacksEqual(container.fullContainer, sta) && ItemStack.areItemStackTagsEqual(container.fullContainer, sta)) return container.content; } - + return 0; } - + public static FluidType getFluidType(ItemStack stack) { - - if(stack == null) - return Fluids.NONE; - + if(stack == null) return Fluids.NONE; + ItemStack sta = stack.copy(); sta.stackSize = 1; - + for(FluidContainer container : allContainers) { if(ItemStack.areItemStacksEqual(container.fullContainer, sta) && ItemStack.areItemStackTagsEqual(container.fullContainer, sta)) return container.type; @@ -155,29 +158,26 @@ public class FluidContainerRegistry { return Fluids.NONE; } - + public static ItemStack getFullContainer(ItemStack stack, FluidType type) { - if(stack == null) - return null; - + if(stack == null) return null; + ItemStack sta = stack.copy(); sta.stackSize = 1; - if (!containerMap.containsKey(type)) - return null; + if(!containerMap.containsKey(type)) return null; for(FluidContainer container : containerMap.get(type)) { - if(ItemStack.areItemStacksEqual(container.emptyContainer, sta) && ItemStack.areItemStackTagsEqual(container.emptyContainer, sta)) + if(ItemStack.areItemStacksEqual(container.emptyContainer, sta) && ItemStack.areItemStackTagsEqual(container.emptyContainer, sta)) return container.fullContainer.copy(); } - + return null; } - + public static ItemStack getEmptyContainer(ItemStack stack) { - if(stack == null) - return null; - + if(stack == null) return null; + ItemStack sta = stack.copy(); sta.stackSize = 1; @@ -185,8 +185,7 @@ public class FluidContainerRegistry { if(ItemStack.areItemStacksEqual(container.fullContainer, sta) && ItemStack.areItemStackTagsEqual(container.fullContainer, sta)) return container.emptyContainer == null ? null : container.emptyContainer.copy(); } - + return null; } - } diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index 7d4a9e0d2..b279bcfc2 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -454,7 +454,7 @@ public class OreDictManager { * HAZARDS, MISC */ LI .hydro(1F) .ingot(lithium) .dustSmall(powder_lithium_tiny) .dust(powder_lithium) .block(block_lithium) .ore(ore_gneiss_lithium); - NA .hydro(1F) .dust(powder_sodium); + NA .hydro(1F) .hazIngot() .dust(powder_sodium); /* * PHOSPHORUS @@ -494,7 +494,7 @@ public class OreDictManager { /* * FISSION FRAGMENTS */ - SR .hot(1F) .hydro(1F) .dust(powder_strontium); + SR .hot(1F) .hydro(1F) .hazIngot() .dust(powder_strontium); SR90 .rad(HazardRegistry.sr90) .hot(1F) .hydro(1F) .dustSmall(powder_sr90_tiny) .dust(powder_sr90) .ingot(ingot_sr90) .billet(billet_sr90) .nugget(nugget_sr90); I131 .rad(HazardRegistry.i131) .hot(1F) .dustSmall(powder_i131_tiny) .dust(powder_i131); XE135 .rad(HazardRegistry.xe135) .hot(10F) .dustSmall(powder_xe135_tiny) .dust(powder_xe135); @@ -552,7 +552,6 @@ public class OreDictManager { if(mat.smeltable == SmeltingBehavior.SMELTABLE) { if(mat.autogen.contains(MaterialShapes.CASTPLATE)) for(String name : mat.names) OreDictionary.registerOre(MaterialShapes.CASTPLATE.name() + name, new ItemStack(ModItems.plate_cast, 1, mat.id)); if(mat.autogen.contains(MaterialShapes.WELDEDPLATE)) for(String name : mat.names) OreDictionary.registerOre(MaterialShapes.WELDEDPLATE.name() + name, new ItemStack(ModItems.plate_welded, 1, mat.id)); - if(mat.autogen.contains(MaterialShapes.HEAVY_COMPONENT)) for(String name : mat.names) OreDictionary.registerOre(MaterialShapes.HEAVY_COMPONENT.name() + name, new ItemStack(ModItems.heavy_component, 1, mat.id)); if(mat.autogen.contains(MaterialShapes.DENSEWIRE)) for(String name : mat.names) OreDictionary.registerOre(MaterialShapes.DENSEWIRE.name() + name, new ItemStack(ModItems.wire_dense, 1, mat.id)); } if(mat.autogen.contains(MaterialShapes.BOLT)) for(String name : mat.names) OreDictionary.registerOre(MaterialShapes.BOLT.name() + name, new ItemStack(ModItems.bolt, 1, mat.id)); @@ -680,7 +679,7 @@ public class OreDictManager { ANY_RUBBER.addPrefix(INGOT, true); ANY_PLASTIC.addPrefix(INGOT, true).addPrefix(DUST, true).addPrefix(BLOCK, true).addPrefix(GRIP, true).addPrefix(STOCK, true); ANY_HARDPLASTIC.addPrefix(INGOT, true).addPrefix(STOCK, true).addPrefix(GRIP, true); - ANY_RESISTANTALLOY.addPrefix(INGOT, true).addPrefix(DUST, true).addPrefix(CASTPLATE, true).addPrefix(WELDEDPLATE, true).addPrefix(HEAVY_COMPONENT, true).addPrefix(BLOCK, true) + ANY_RESISTANTALLOY.addPrefix(INGOT, true).addPrefix(DUST, true).addPrefix(CASTPLATE, true).addPrefix(WELDEDPLATE, true).addPrefix(BLOCK, true) .addPrefix(LIGHTBARREL, true).addPrefix(HEAVYBARREL, true).addPrefix(LIGHTRECEIVER, true).addPrefix(HEAVYRECEIVER, true); ANY_BISMOIDBRONZE.addPrefix(INGOT, true).addPrefix(CASTPLATE, true).addPrefix(LIGHTBARREL, true).addPrefix(HEAVYBARREL, true).addPrefix(LIGHTRECEIVER, true).addPrefix(HEAVYRECEIVER, true); ANY_TAR.addPrefix(ANY, false); @@ -759,7 +758,7 @@ public class OreDictManager { public String plate() { return PLATE.name() + mats[0]; } public String plateCast() { return CASTPLATE.name() + mats[0]; } public String plateWelded() { return WELDEDPLATE.name() + mats[0]; } - public String heavyComp() { return HEAVY_COMPONENT.name() + mats[0]; } + @Deprecated public String heavyComp() { return WELDEDPLATE.name() + mats[0]; } public String wireFine() { return WIRE.name() + mats[0]; } public String wireDense() { return DENSEWIRE.name() + mats[0]; } public String shell() { return SHELL.name() + mats[0]; } @@ -913,6 +912,21 @@ public class OreDictManager { for(Block b : blocks) registerStack(tag, new ItemStack(b)); return this; } + + public DictFrame hazIngot() { + hazMult = HazardRegistry.ingot; + return autoRegHazard(INGOT); + } + + // TODO: rethink this. currently, keys are only registered on-demand if the dict frame has a valid entry, even though we can maximize compatibility + // by simply registereing all known shapes in the haz reg, whether it exists or not + public DictFrame autoRegHazard(MaterialShapes shape) { + String tag = shape.name(); + for(String mat : mats) { + registerHazards(hazards, hazMult, tag + mat); + } + return this; + } public static void registerHazards(List hazards, float hazMult, String dictKey) { @@ -1013,7 +1027,7 @@ public class OreDictManager { public String plate() { return PLATE.name() + groupName; } public String plateCast() { return CASTPLATE.name() + groupName; } public String plateWelded() { return WELDEDPLATE.name() + groupName; } - public String heavyComp() { return HEAVY_COMPONENT.name() + groupName; } + @Deprecated public String heavyComp() { return WELDEDPLATE.name() + groupName; } public String wireFine() { return WIRE.name() + groupName; } public String wireDense() { return DENSEWIRE.name() + groupName; } public String billet() { return BILLET.name() + groupName; } diff --git a/src/main/java/com/hbm/inventory/RecipesCommon.java b/src/main/java/com/hbm/inventory/RecipesCommon.java index c2b9116a5..fd7ed9d36 100644 --- a/src/main/java/com/hbm/inventory/RecipesCommon.java +++ b/src/main/java/com/hbm/inventory/RecipesCommon.java @@ -98,9 +98,9 @@ public class RecipesCommon { public ItemStack extractForCyclingDisplay(int cycle) { List list = extractForNEI(); - cycle *= 50; + if(list.isEmpty()) return new ItemStack(ModItems.nothing); return list.get((int)(System.currentTimeMillis() % (cycle * list.size()) / cycle)); } } diff --git a/src/main/java/com/hbm/inventory/UpgradeManagerNT.java b/src/main/java/com/hbm/inventory/UpgradeManagerNT.java index 3ae55ae72..fae7ac9ef 100644 --- a/src/main/java/com/hbm/inventory/UpgradeManagerNT.java +++ b/src/main/java/com/hbm/inventory/UpgradeManagerNT.java @@ -31,7 +31,7 @@ public class UpgradeManagerNT { public UpgradeManagerNT(TileEntity te) { this.owner = te; } @Deprecated public UpgradeManagerNT() { } - public void checkSlots(ItemStack[] slots, int start, int end) { checkSlots(owner, slots, start, end); } + public void checkSlots(ItemStack[] slots, int start, int end) { checkSlotsInternal(owner, slots, start, end); } @Deprecated public void checkSlots(TileEntity te, ItemStack[] slots, int start, int end) { checkSlotsInternal(te, slots, start, end); } private void checkSlotsInternal(TileEntity te, ItemStack[] slots, int start, int end) { diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java b/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java index 05b818a10..aaf4ca8a3 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java @@ -25,8 +25,10 @@ public class ContainerCrateBase extends ContainerBase { for(int i = 0; i < 9; i++) { this.addSlotToContainer( - invPlayer.currentItem == i ? new SlotPlayerCrateLocked(invPlayer, i, playerInvX + i * 18, playerHotbarY) : - new SlotNonRetarded(invPlayer, i, playerInvX + i * 18, playerHotbarY)); + (invPlayer.currentItem == i && this.tile instanceof ItemBlockStorageCrate.InventoryCrate) ? + new SlotPlayerCrateLocked(invPlayer, i, playerInvX + i * 18, playerHotbarY) : + new SlotNonRetarded(invPlayer, i, playerInvX + i * 18, playerHotbarY) + ); } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnace.java b/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnace.java deleted file mode 100644 index c3dd0c537..000000000 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnace.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.hbm.inventory.container; - -import com.hbm.inventory.SlotSmelting; -import com.hbm.items.ModItems; -import com.hbm.tileentity.machine.TileEntityMachineArcFurnace; - -import api.hbm.energymk2.IBatteryItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.ICrafting; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; - -public class ContainerMachineArcFurnace extends Container { - - private TileEntityMachineArcFurnace diFurnace; - - public ContainerMachineArcFurnace(InventoryPlayer invPlayer, TileEntityMachineArcFurnace tedf) { - - diFurnace = tedf; - - this.addSlotToContainer(new Slot(tedf, 0, 56, 17)); - this.addSlotToContainer(new SlotSmelting(invPlayer.player, tedf, 1, 116, 35)); - this.addSlotToContainer(new Slot(tedf, 2, 38, 53)); - this.addSlotToContainer(new Slot(tedf, 3, 56, 53)); - this.addSlotToContainer(new Slot(tedf, 4, 74, 53)); - this.addSlotToContainer(new Slot(tedf, 5, 8, 53)); - - for(int i = 0; i < 3; i++) { - for(int j = 0; j < 9; j++) { - this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); - } - } - - for(int i = 0; i < 9; i++) { - this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142)); - } - } - - @Override - public void addCraftingToCrafters(ICrafting crafting) { - super.addCraftingToCrafters(crafting); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - ItemStack rStack = null; - Slot slot = (Slot) this.inventorySlots.get(index); - - if(slot != null && slot.getHasStack()) { - ItemStack stack = slot.getStack(); - rStack = stack.copy(); - - if(index <= 5) { - if(!this.mergeItemStack(stack, 6, this.inventorySlots.size(), true)) { - return null; - } - - slot.onSlotChange(stack, rStack); - - } else { - - if(rStack.getItem() instanceof IBatteryItem || rStack.getItem() == ModItems.battery_creative) { - if(!this.mergeItemStack(stack, 5, 6, false)) - return null; - - } else if(rStack.getItem() == ModItems.arc_electrode) { - if(!this.mergeItemStack(stack, 2, 5, false)) - return null; - - } else if(!this.mergeItemStack(stack, 0, 1, false)) - return null; - } - - if(stack.stackSize == 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } - } - - return rStack; - } - - @Override - public boolean canInteractWith(EntityPlayer player) { - return diFurnace.isUseableByPlayer(player); - } -} diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnaceLarge.java b/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnaceLarge.java index 942f3cfcb..05109bac9 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnaceLarge.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnaceLarge.java @@ -61,15 +61,16 @@ public class ContainerMachineArcFurnaceLarge extends Container { if(rStack.getItem() instanceof IBatteryItem || rStack.getItem() == ModItems.battery_creative) { if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 3, 4, false)) return null; } else if(rStack.getItem() == ModItems.arc_electrode) { - if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 4, 5, false)) return null; - } else if(rStack.getItem() instanceof ItemMachineUpgrade) { if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 0, 3, false)) return null; + } else if(rStack.getItem() instanceof ItemMachineUpgrade) { + if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 4, 5, false)) return null; } else { - if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 5, 25, false)) return null; + stack = furnace.distributeInput(stack, true); + if(stack != null && stack.stackSize == rStack.stackSize) return null; } } - if(stack.stackSize == 0) { + if(stack == null || stack.stackSize == 0) { slot.putStack((ItemStack) null); } else { slot.onSlotChanged(); diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineAssemblyMachine.java b/src/main/java/com/hbm/inventory/container/ContainerMachineAssemblyMachine.java new file mode 100644 index 000000000..507d41e66 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineAssemblyMachine.java @@ -0,0 +1,73 @@ +package com.hbm.inventory.container; + +import com.hbm.inventory.SlotCraftingOutput; +import com.hbm.inventory.SlotNonRetarded; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemMachineUpgrade; +import com.hbm.util.InventoryUtil; + +import api.hbm.energymk2.IBatteryItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerMachineAssemblyMachine extends ContainerBase { + + public ContainerMachineAssemblyMachine(InventoryPlayer invPlayer, IInventory assembler) { + super(invPlayer, assembler); + + // Battery + this.addSlotToContainer(new SlotNonRetarded(assembler, 0, 152, 81)); + // Schematic + this.addSlotToContainer(new SlotNonRetarded(assembler, 1, 35, 126)); + // Upgrades + this.addSlots(assembler, 2, 152, 108, 2, 1); + // Input + this.addSlots(assembler, 4, 8, 18, 4, 3); + // Output + this.addSlotToContainer(new SlotCraftingOutput(invPlayer.player, assembler, 16, 98, 45)); + + this.playerInv(invPlayer, 8, 174); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack slotOriginal = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack slotStack = slot.getStack(); + slotOriginal = slotStack.copy(); + + if(index <= tile.getSizeInventory() - 1) { + SlotCraftingOutput.checkAchievements(player, slotStack); + if(!this.mergeItemStack(slotStack, tile.getSizeInventory(), this.inventorySlots.size(), true)) { + return null; + } + } else { + + if(slotOriginal.getItem() instanceof IBatteryItem || slotOriginal.getItem() == ModItems.battery_creative) { + if(!this.mergeItemStack(slotStack, 0, 1, false)) return null; + } else if(slotOriginal.getItem() == ModItems.blueprints) { + if(!this.mergeItemStack(slotStack, 1, 2, false)) return null; + } else if(slotOriginal.getItem() instanceof ItemMachineUpgrade) { + if(!this.mergeItemStack(slotStack, 2, 4, false)) return null; + } else { + if(!InventoryUtil.mergeItemStack(this.inventorySlots, slotStack, 4, 16, false)) return null; + } + } + + if(slotStack.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + slot.onPickupFromSlot(player, slotStack); + } + + return slotOriginal; + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineChemicalFactory.java b/src/main/java/com/hbm/inventory/container/ContainerMachineChemicalFactory.java index 484dcfc21..fbdcba7a1 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineChemicalFactory.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineChemicalFactory.java @@ -3,6 +3,7 @@ package com.hbm.inventory.container; import com.hbm.inventory.SlotCraftingOutput; import com.hbm.inventory.SlotNonRetarded; import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemBlueprints; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.util.InventoryUtil; @@ -53,6 +54,14 @@ public class ContainerMachineChemicalFactory extends ContainerBase { if(slotOriginal.getItem() instanceof IBatteryItem || slotOriginal.getItem() == ModItems.battery_creative) { if(!this.mergeItemStack(slotStack, 0, 1, false)) return null; + } else if(slotOriginal.getItem() instanceof ItemBlueprints) { + if(!this.mergeItemStack(slotStack, 4, 5, false)) return null; + } else if(slotOriginal.getItem() instanceof ItemBlueprints) { + if(!this.mergeItemStack(slotStack, 11, 12, false)) return null; + } else if(slotOriginal.getItem() instanceof ItemBlueprints) { + if(!this.mergeItemStack(slotStack, 18, 19, false)) return null; + } else if(slotOriginal.getItem() instanceof ItemBlueprints) { + if(!this.mergeItemStack(slotStack, 25, 26, false)) return null; } else if(slotOriginal.getItem() instanceof ItemMachineUpgrade) { if(!this.mergeItemStack(slotStack, 1, 4, false)) return null; } else { diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineChemicalPlant.java b/src/main/java/com/hbm/inventory/container/ContainerMachineChemicalPlant.java index 2c4f4052a..30f50de65 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineChemicalPlant.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineChemicalPlant.java @@ -3,7 +3,7 @@ package com.hbm.inventory.container; import com.hbm.inventory.SlotCraftingOutput; import com.hbm.inventory.SlotNonRetarded; import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemChemistryTemplate; +import com.hbm.items.machine.ItemBlueprints; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.util.InventoryUtil; @@ -57,7 +57,7 @@ public class ContainerMachineChemicalPlant extends ContainerBase { if(slotOriginal.getItem() instanceof IBatteryItem || slotOriginal.getItem() == ModItems.battery_creative) { if(!this.mergeItemStack(slotStack, 0, 1, false)) return null; - } else if(slotOriginal.getItem() instanceof ItemChemistryTemplate) { + } else if(slotOriginal.getItem() instanceof ItemBlueprints) { if(!this.mergeItemStack(slotStack, 1, 2, false)) return null; } else if(slotOriginal.getItem() instanceof ItemMachineUpgrade) { if(!this.mergeItemStack(slotStack, 2, 4, false)) return null; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachinePUREX.java b/src/main/java/com/hbm/inventory/container/ContainerMachinePUREX.java new file mode 100644 index 000000000..4b28d9da9 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerMachinePUREX.java @@ -0,0 +1,74 @@ +package com.hbm.inventory.container; + +import com.hbm.inventory.SlotCraftingOutput; +import com.hbm.inventory.SlotNonRetarded; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemBlueprints; +import com.hbm.items.machine.ItemMachineUpgrade; +import com.hbm.util.InventoryUtil; + +import api.hbm.energymk2.IBatteryItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerMachinePUREX extends ContainerBase { + + public ContainerMachinePUREX(InventoryPlayer invPlayer, IInventory chemicalPlant) { + super(invPlayer, chemicalPlant); + + // Battery + this.addSlotToContainer(new SlotNonRetarded(chemicalPlant, 0, 152, 81)); + // Schematic + this.addSlotToContainer(new SlotNonRetarded(chemicalPlant, 1, 35, 126)); + // Upgrades + this.addSlots(chemicalPlant, 2, 152, 108, 2, 1); + // Solid Input + this.addSlots(chemicalPlant, 4, 8, 90, 1, 3); + // Solid Output + this.addOutputSlots(invPlayer.player, chemicalPlant, 7, 80, 36, 3, 2); + + this.playerInv(invPlayer, 8, 174); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack slotOriginal = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack slotStack = slot.getStack(); + slotOriginal = slotStack.copy(); + + if(index <= tile.getSizeInventory() - 1) { + SlotCraftingOutput.checkAchievements(player, slotStack); + if(!this.mergeItemStack(slotStack, tile.getSizeInventory(), this.inventorySlots.size(), true)) { + return null; + } + } else { + + if(slotOriginal.getItem() instanceof IBatteryItem || slotOriginal.getItem() == ModItems.battery_creative) { + if(!this.mergeItemStack(slotStack, 0, 1, false)) return null; + } else if(slotOriginal.getItem() instanceof ItemBlueprints) { + if(!this.mergeItemStack(slotStack, 1, 2, false)) return null; + } else if(slotOriginal.getItem() instanceof ItemMachineUpgrade) { + if(!this.mergeItemStack(slotStack, 2, 4, false)) return null; + } else { + if(!InventoryUtil.mergeItemStack(this.inventorySlots, slotStack, 4, 7, false)) return null; + } + } + + if(slotStack.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + + slot.onPickupFromSlot(player, slotStack); + } + + return slotOriginal; + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineReactorBreeding.java b/src/main/java/com/hbm/inventory/container/ContainerMachineReactorBreeding.java index 331b69d1d..cab45d330 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineReactorBreeding.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineReactorBreeding.java @@ -43,8 +43,8 @@ public class ContainerMachineReactorBreeding extends Container { ItemStack stack = slot.getStack(); var3 = stack.copy(); - if(index <= 1) { - if(!this.mergeItemStack(stack, 1, this.inventorySlots.size(), true)) { + if(index <= 2) { + if(!this.mergeItemStack(stack, 2, this.inventorySlots.size(), true)) { return null; } diff --git a/src/main/java/com/hbm/inventory/container/ContainerRBMKAutoloader.java b/src/main/java/com/hbm/inventory/container/ContainerRBMKAutoloader.java new file mode 100644 index 000000000..de34fab6b --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerRBMKAutoloader.java @@ -0,0 +1,54 @@ +package com.hbm.inventory.container; + +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKAutoloader; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerRBMKAutoloader extends ContainerBase { + + public TileEntityRBMKAutoloader loader; + + public ContainerRBMKAutoloader(InventoryPlayer invPlayer, TileEntityRBMKAutoloader tedf) { + super(invPlayer, tedf); + loader = tedf; + + this.addSlots(loader, 0, 17, 18, 3, 3); + this.addTakeOnlySlots(loader, 9, 107, 18, 3, 3); + this.playerInv(invPlayer, 8, 100); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack rStack = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack stack = slot.getStack(); + rStack = stack.copy(); + + if(index <= 17) { + if(!this.mergeItemStack(stack, 18, this.inventorySlots.size(), true)) { + return null; + } + } else { + if(!this.mergeItemStack(stack, 0, 9, false)) return null; + } + + if(stack.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return rStack; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return loader.isUseableByPlayer(player); + } +} diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index cadd39969..3eb3f8886 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -1,9 +1,8 @@ package com.hbm.inventory.fluid; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -35,7 +34,7 @@ import net.minecraft.potion.PotionEffect; public class Fluids { public static final Gson gson = new Gson(); - + public static List additionalListeners = new ArrayList(); public static FluidType NONE; @@ -190,6 +189,7 @@ public class Fluids { public static FluidType SODIUM_ALUMINATE; public static FluidType BAUXITE_SOLUTION; public static FluidType ALUMINA; + public static FluidType CONCRETE; /* Lagacy names for compatibility purposes */ @Deprecated public static FluidType ACID; //JAOPCA uses this, apparently @@ -405,7 +405,8 @@ public class Fluids { SODIUM_ALUMINATE = new FluidType("SODIUM_ALUMINATE", 0xFFD191, 3, 0, 1, EnumSymbol.ACID).addTraits(new FT_Corrosive(30), LIQUID); BAUXITE_SOLUTION = new FluidType("BAUXITE_SOLUTION", 0xE2560F, 3, 0, 3, EnumSymbol.ACID).addTraits(new FT_Corrosive(40), LIQUID, VISCOUS); ALUMINA = new FluidType("ALUMINA", 0xDDFFFF, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); - AIR = new FluidType(151, "AIR", 0xE7EAEB, 0, 0, 0, EnumSymbol.NONE).addTraits(GASEOUS); + AIR = new FluidType("AIR", 0xE7EAEB, 0, 0, 0, EnumSymbol.NONE).addTraits(GASEOUS); + CONCRETE = new FluidType(152, "CONCRETE", 0xA2A2A2, 0, 0, 0, EnumSymbol.NONE).addTraits(LIQUID); // ^ ^ ^ ^ ^ ^ ^ ^ //ADD NEW FLUIDS HERE @@ -553,6 +554,7 @@ public class Fluids { metaOrder.add(SODIUM_ALUMINATE); metaOrder.add(BAUXITE_SOLUTION); metaOrder.add(ALUMINA); + metaOrder.add(CONCRETE); //solutions and working fluids metaOrder.add(FRACKSOL); metaOrder.add(LYE); @@ -794,7 +796,7 @@ public class Fluids { private static void readCustomFluids(File file) { try { - JsonObject json = gson.fromJson(new FileReader(file), JsonObject.class); + JsonObject json = gson.fromJson(new InputStreamReader(Files.newInputStream(file.toPath()), StandardCharsets.UTF_8), JsonObject.class); for(Entry entry : json.entrySet()) { @@ -876,12 +878,12 @@ public class Fluids { ex.printStackTrace(); } } - + public static void reloadFluids(){ File folder = MainRegistry.configHbmDir; File customTypes = new File(folder.getAbsolutePath() + File.separatorChar + "hbmFluidTypes.json"); if(!customTypes.exists()) initDefaultFluids(customTypes); - + for(FluidType type : customFluids){ idMapping.remove(type.getID()); registerOrder.remove(type); @@ -889,7 +891,7 @@ public class Fluids { metaOrder.remove(type); } customFluids.clear(); - + for(FluidType type : foreignFluids){ idMapping.remove(type.getID()); registerOrder.remove(type); @@ -897,7 +899,7 @@ public class Fluids { metaOrder.remove(type); } foreignFluids.clear(); - + readCustomFluids(customTypes); for(FluidType custom : customFluids) metaOrder.add(custom); File config = new File(MainRegistry.configHbmDir.getAbsolutePath() + File.separatorChar + "hbmFluidTraits.json"); @@ -908,7 +910,7 @@ public class Fluids { } else { readTraits(config); } - + for(IFluidRegisterListener listener : additionalListeners) listener.onFluidsLoad(); } private static void registerCalculatedFuel(FluidType type, double base, double combustMult, FuelGrade grade) { diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineArcFurnace.java b/src/main/java/com/hbm/inventory/gui/GUIMachineArcFurnace.java deleted file mode 100644 index 5f6e04fdf..000000000 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineArcFurnace.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.hbm.inventory.gui; - -import org.lwjgl.opengl.GL11; - -import com.hbm.inventory.container.ContainerMachineArcFurnace; -import com.hbm.lib.RefStrings; -import com.hbm.tileentity.machine.TileEntityMachineArcFurnace; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.util.ResourceLocation; - -public class GUIMachineArcFurnace extends GuiInfoContainer { - - private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_arc.png"); - private TileEntityMachineArcFurnace diFurnace; - - public GUIMachineArcFurnace(InventoryPlayer invPlayer, TileEntityMachineArcFurnace tedf) { - super(new ContainerMachineArcFurnace(invPlayer, tedf)); - diFurnace = tedf; - - this.xSize = 176; - this.ySize = 166; - } - - @Override - public void drawScreen(int mouseX, int mouseY, float f) { - super.drawScreen(mouseX, mouseY, f); - - this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 51 - 34, 16, 34, diFurnace.power, diFurnace.maxPower); - } - - @Override - protected void drawGuiContainerForegroundLayer(int i, int j) { - String name = this.diFurnace.hasCustomInventoryName() ? this.diFurnace.getInventoryName() : I18n.format(this.diFurnace.getInventoryName()); - - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); - this.fontRendererObj.drawString(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); - - if(diFurnace.isInvalid() && diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord) instanceof TileEntityMachineArcFurnace) - diFurnace = (TileEntityMachineArcFurnace) diFurnace.getWorldObj().getTileEntity(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord); - - if(diFurnace.hasPower()) { - int i = (int)diFurnace.getPowerRemainingScaled(34); - drawTexturedModalRect(guiLeft + 8, guiTop + 51 - i, 176, 67 - i, 16, i); - } - - if(diFurnace.canProcess() && diFurnace.hasPower()) - { - drawTexturedModalRect(guiLeft + 55, guiTop + 35, 176, 0, 15, 16); - } - - int j1 = diFurnace.getDiFurnaceProgressScaled(24); - drawTexturedModalRect(guiLeft + 79, guiTop + 34, 176, 16, j1 + 1, 17); - } -} diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java new file mode 100644 index 000000000..5104850ca --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java @@ -0,0 +1,123 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerMachineAssemblyMachine; +import com.hbm.inventory.recipes.AssemblyMachineRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.machine.ItemBlueprints; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityMachineAssemblyMachine; +import com.hbm.util.i18n.I18nUtil; + +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.inventory.Slot; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +public class GUIMachineAssemblyMachine extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_assembler.png"); + private TileEntityMachineAssemblyMachine assembler; + + public GUIMachineAssemblyMachine(InventoryPlayer invPlayer, TileEntityMachineAssemblyMachine tedf) { + super(new ContainerMachineAssemblyMachine(invPlayer, tedf)); + assembler = tedf; + + this.xSize = 176; + this.ySize = 256; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + assembler.inputTank.renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 99, 52, 16); + assembler.outputTank.renderTankInfo(this, mouseX, mouseY, guiLeft + 80, guiTop + 99, 52, 16); + + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 18, 16, 61, assembler.power, assembler.maxPower); + + if(guiLeft + 7 <= mouseX && guiLeft + 7 + 18 > mouseX && guiTop + 125 < mouseY && guiTop + 125 + 18 >= mouseY) { + if(this.assembler.assemblerModule.recipe != null && AssemblyMachineRecipes.INSTANCE.recipeNameMap.containsKey(this.assembler.assemblerModule.recipe)) { + GenericRecipe recipe = (GenericRecipe) AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(this.assembler.assemblerModule.recipe); + this.func_146283_a(recipe.print(), mouseX, mouseY); + } else { + this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.recipe.setRecipe"), mouseX, mouseY); + } + } + } + + @Override + protected void mouseClicked(int x, int y, int button) { + super.mouseClicked(x, y, button); + + if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(AssemblyMachineRecipes.INSTANCE, assembler, assembler.assemblerModule.recipe, 0, ItemBlueprints.grabPool(assembler.slots[1]), this); + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.assembler.hasCustomInventoryName() ? this.assembler.getInventoryName() : I18n.format(this.assembler.getInventoryName()); + + this.fontRendererObj.drawString(name, 70 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float 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 p = (int) (assembler.power * 61 / assembler.maxPower); + drawTexturedModalRect(guiLeft + 152, guiTop + 79 - p, 176, 61 - p, 16, p); + + if(assembler.assemblerModule.progress > 0) { + int j = (int) Math.ceil(70 * assembler.assemblerModule.progress); + drawTexturedModalRect(guiLeft + 62, guiTop + 126, 176, 61, j, 16); + } + + GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assembler.assemblerModule.recipe); + + /// LEFT LED + if(assembler.didProcess) { + drawTexturedModalRect(guiLeft + 51, guiTop + 121, 195, 0, 3, 6); + } else if(recipe != null) { + drawTexturedModalRect(guiLeft + 51, guiTop + 121, 192, 0, 3, 6); + } + + /// RIGHT LED + if(assembler.didProcess) { + drawTexturedModalRect(guiLeft + 56, guiTop + 121, 195, 0, 3, 6); + } else if(recipe != null && assembler.power >= recipe.power) { + drawTexturedModalRect(guiLeft + 56, guiTop + 121, 192, 0, 3, 6); + } + + this.renderItem(recipe != null ? recipe.getIcon() : TEMPLATE_FOLDER, 8, 126); + + if(recipe != null && recipe.inputItem != null) { + for(int i = 0; i < recipe.inputItem.length; i++) { + Slot slot = (Slot) this.inventorySlots.inventorySlots.get(assembler.assemblerModule.inputSlots[i]); + if(!slot.getHasStack()) this.renderItem(recipe.inputItem[i].extractForCyclingDisplay(20), slot.xDisplayPosition, slot.yDisplayPosition, 10F); + } + + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glColor4f(1F, 1F, 1F, 0.5F); + GL11.glEnable(GL11.GL_BLEND); + this.zLevel = 300F; + for(int i = 0; i < recipe.inputItem.length; i++) { + Slot slot = (Slot) this.inventorySlots.inventorySlots.get(assembler.assemblerModule.inputSlots[i]); + if(!slot.getHasStack()) drawTexturedModalRect(guiLeft + slot.xDisplayPosition, guiTop + slot.yDisplayPosition, slot.xDisplayPosition, slot.yDisplayPosition, 16, 16); + } + this.zLevel = 0F; + GL11.glColor4f(1F, 1F, 1F, 1F); + GL11.glDisable(GL11.GL_BLEND); + } + + assembler.inputTank.renderTank(guiLeft + 8, guiTop + 115, this.zLevel, 52, 16, 1); + assembler.outputTank.renderTank(guiLeft + 80, guiTop + 115, this.zLevel, 52, 16, 1); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalFactory.java b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalFactory.java index a31917752..567b2e256 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalFactory.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalFactory.java @@ -5,6 +5,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineChemicalFactory; import com.hbm.inventory.recipes.ChemicalPlantRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.machine.ItemBlueprints; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineChemicalFactory; @@ -57,7 +58,7 @@ public class GUIMachineChemicalFactory extends GuiInfoContainer { protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - for(int i = 0; i < 4; i++) if(this.checkClick(x, y, 74, 19 + i * 22, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule[i].recipe, i, this); + for(int i = 0; i < 4; i++) if(this.checkClick(x, y, 74, 19 + i * 22, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule[i].recipe, i, ItemBlueprints.grabPool(chemplant.slots[4 + i * 7]), this); } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java index 9f02d0adf..50838b3a8 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java @@ -5,8 +5,10 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineChemicalPlant; import com.hbm.inventory.recipes.ChemicalPlantRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.machine.ItemBlueprints; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineChemicalPlant; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.OpenGlHelper; @@ -20,15 +22,15 @@ public class GUIMachineChemicalPlant extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_chemplant.png"); private TileEntityMachineChemicalPlant chemplant; - + public GUIMachineChemicalPlant(InventoryPlayer invPlayer, TileEntityMachineChemicalPlant tedf) { super(new ContainerMachineChemicalPlant(invPlayer, tedf)); chemplant = tedf; - + this.xSize = 176; this.ySize = 256; } - + @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); @@ -37,7 +39,7 @@ public class GUIMachineChemicalPlant extends GuiInfoContainer { chemplant.inputTanks[i].renderTankInfo(this, mouseX, mouseY, guiLeft + 8 + i * 18, guiTop + 18, 16, 34); chemplant.outputTanks[i].renderTankInfo(this, mouseX, mouseY, guiLeft + 80 + i * 18, guiTop + 18, 16, 34); } - + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 18, 16, 61, chemplant.power, chemplant.maxPower); if(guiLeft + 7 <= mouseX && guiLeft + 7 + 18 > mouseX && guiTop + 125 < mouseY && guiTop + 125 + 18 >= mouseY) { @@ -45,32 +47,32 @@ public class GUIMachineChemicalPlant extends GuiInfoContainer { GenericRecipe recipe = (GenericRecipe) ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(this.chemplant.chemplantModule.recipe); this.func_146283_a(recipe.print(), mouseX, mouseY); } else { - this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + "Click to set recipe", mouseX, mouseY); + this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.recipe.setRecipe"), mouseX, mouseY); } } } - + @Override protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - - if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule.recipe, 0, this); + + if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule.recipe, 0, ItemBlueprints.grabPool(chemplant.slots[1]), this); } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { - String name = this.chemplant.hasCustomInventoryName() ? this.chemplant.getInventoryName() : I18n.format(this.chemplant.getInventoryName()); - + String name = this.chemplant.hasCustomInventoryName() ? this.chemplant.getInventoryName() : I18nUtil.resolveKey(this.chemplant.getInventoryName()); + this.fontRendererObj.drawString(name, 70 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); - this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + this.fontRendererObj.drawString(I18nUtil.resolveKey("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 p = (int) (chemplant.power * 61 / chemplant.maxPower); drawTexturedModalRect(guiLeft + 152, guiTop + 79 - p, 176, 61 - p, 16, p); @@ -78,25 +80,25 @@ public class GUIMachineChemicalPlant extends GuiInfoContainer { int j = (int) Math.ceil(70 * chemplant.chemplantModule.progress); drawTexturedModalRect(guiLeft + 62, guiTop + 126, 176, 61, j, 16); } - + GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(chemplant.chemplantModule.recipe); - + /// LEFT LED if(chemplant.didProcess) { drawTexturedModalRect(guiLeft + 51, guiTop + 121, 195, 0, 3, 6); } else if(recipe != null) { drawTexturedModalRect(guiLeft + 51, guiTop + 121, 192, 0, 3, 6); } - + /// RIGHT LED if(chemplant.didProcess) { drawTexturedModalRect(guiLeft + 56, guiTop + 121, 195, 0, 3, 6); } else if(recipe != null && chemplant.power >= recipe.power) { drawTexturedModalRect(guiLeft + 56, guiTop + 121, 192, 0, 3, 6); } - + this.renderItem(recipe != null ? recipe.getIcon() : TEMPLATE_FOLDER, 8, 126); - + if(recipe != null && recipe.inputItem != null) { for(int i = 0; i < recipe.inputItem.length; i++) { Slot slot = (Slot) this.inventorySlots.inventorySlots.get(chemplant.chemplantModule.inputSlots[i]); diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachinePUREX.java b/src/main/java/com/hbm/inventory/gui/GUIMachinePUREX.java new file mode 100644 index 000000000..8d746cf11 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIMachinePUREX.java @@ -0,0 +1,127 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerMachinePUREX; +import com.hbm.inventory.recipes.PUREXRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.machine.ItemBlueprints; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityMachinePUREX; +import com.hbm.util.i18n.I18nUtil; + +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.inventory.Slot; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +public class GUIMachinePUREX extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_purex.png"); + private TileEntityMachinePUREX purex; + + public GUIMachinePUREX(InventoryPlayer invPlayer, TileEntityMachinePUREX tedf) { + super(new ContainerMachinePUREX(invPlayer, tedf)); + purex = tedf; + + this.xSize = 176; + this.ySize = 256; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + for(int i = 0; i < 3; i++) { + purex.inputTanks[i].renderTankInfo(this, mouseX, mouseY, guiLeft + 8 + i * 18, guiTop + 18, 16, 52); + } + purex.outputTanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 116, guiTop + 36, 16, 52); + + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 18, 16, 61, purex.power, purex.maxPower); + + if(guiLeft + 7 <= mouseX && guiLeft + 7 + 18 > mouseX && guiTop + 125 < mouseY && guiTop + 125 + 18 >= mouseY) { + if(this.purex.purexModule.recipe != null && PUREXRecipes.INSTANCE.recipeNameMap.containsKey(this.purex.purexModule.recipe)) { + GenericRecipe recipe = (GenericRecipe) PUREXRecipes.INSTANCE.recipeNameMap.get(this.purex.purexModule.recipe); + this.func_146283_a(recipe.print(), mouseX, mouseY); + } else { + this.drawCreativeTabHoveringText(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.recipe.setRecipe"), mouseX, mouseY); + } + } + } + + @Override + protected void mouseClicked(int x, int y, int button) { + super.mouseClicked(x, y, button); + + if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(PUREXRecipes.INSTANCE, purex, purex.purexModule.recipe, 0, ItemBlueprints.grabPool(purex.slots[1]), this); + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.purex.hasCustomInventoryName() ? this.purex.getInventoryName() : I18n.format(this.purex.getInventoryName()); + + this.fontRendererObj.drawString(name, 70 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float 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 p = (int) (purex.power * 61 / purex.maxPower); + drawTexturedModalRect(guiLeft + 152, guiTop + 79 - p, 176, 61 - p, 16, p); + + if(purex.purexModule.progress > 0) { + int j = (int) Math.ceil(70 * purex.purexModule.progress); + drawTexturedModalRect(guiLeft + 62, guiTop + 126, 176, 61, j, 16); + } + + GenericRecipe recipe = PUREXRecipes.INSTANCE.recipeNameMap.get(purex.purexModule.recipe); + + /// LEFT LED + if(purex.didProcess) { + drawTexturedModalRect(guiLeft + 51, guiTop + 121, 195, 0, 3, 6); + } else if(recipe != null) { + drawTexturedModalRect(guiLeft + 51, guiTop + 121, 192, 0, 3, 6); + } + + /// RIGHT LED + if(purex.didProcess) { + drawTexturedModalRect(guiLeft + 56, guiTop + 121, 195, 0, 3, 6); + } else if(recipe != null && purex.power >= recipe.power) { + drawTexturedModalRect(guiLeft + 56, guiTop + 121, 192, 0, 3, 6); + } + + this.renderItem(recipe != null ? recipe.getIcon() : TEMPLATE_FOLDER, 8, 126); + + if(recipe != null && recipe.inputItem != null) { + for(int i = 0; i < recipe.inputItem.length; i++) { + Slot slot = (Slot) this.inventorySlots.inventorySlots.get(purex.purexModule.inputSlots[i]); + if(!slot.getHasStack()) this.renderItem(recipe.inputItem[i].extractForCyclingDisplay(20), slot.xDisplayPosition, slot.yDisplayPosition, 10F); + } + + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glColor4f(1F, 1F, 1F, 0.5F); + GL11.glEnable(GL11.GL_BLEND); + this.zLevel = 300F; + for(int i = 0; i < recipe.inputItem.length; i++) { + Slot slot = (Slot) this.inventorySlots.inventorySlots.get(purex.purexModule.inputSlots[i]); + if(!slot.getHasStack()) drawTexturedModalRect(guiLeft + slot.xDisplayPosition, guiTop + slot.yDisplayPosition, slot.xDisplayPosition, slot.yDisplayPosition, 16, 16); + } + this.zLevel = 0F; + GL11.glColor4f(1F, 1F, 1F, 1F); + GL11.glDisable(GL11.GL_BLEND); + } + + for(int i = 0; i < 3; i++) { + purex.inputTanks[i].renderTank(guiLeft + 8 + i * 18, guiTop + 70, this.zLevel, 16, 52); + } + purex.outputTanks[0].renderTank(guiLeft + 116, guiTop + 88, this.zLevel, 16, 52); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineSolderingStation.java b/src/main/java/com/hbm/inventory/gui/GUIMachineSolderingStation.java index 7e718b9f9..e2283b312 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineSolderingStation.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineSolderingStation.java @@ -69,6 +69,10 @@ public class GUIMachineSolderingStation extends GuiInfoContainer { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + if(solderer.collisionPrevention) { + drawTexturedModalRect(guiLeft + 5, guiTop + 66, 192, 14, 10, 10); + } int p = (int) (solderer.power * 52 / Math.max(solderer.maxPower, 1)); drawTexturedModalRect(guiLeft + 152, guiTop + 70 - p, 176, 52 - p, 16, p); diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java index eee3c7fad..66a3b7152 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java @@ -115,10 +115,13 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 26, guiTop + 108, 142, 16, turbinegas.power, turbinegas.getMaxPower()); - if(turbinegas.powerSliderPos == 0) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Turbine idle"}); - else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {(turbinegas.powerSliderPos) * 100 / 60 + "% power"}); + if(turbinegas.state == 1) { + double consumption = turbinegas.fuelMaxCons.containsKey(turbinegas.tanks[0].getTankType()) ? turbinegas.fuelMaxCons.get(turbinegas.tanks[0].getTankType()) : 5D; + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Fuel consumption: " + 20 * (consumption * 0.05D + consumption * turbinegas.throttle / 100) + " mb/s"}); + } + else { + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Generator offline"}); + } if(turbinegas.temp >= 20) this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "°C"}); @@ -146,6 +149,7 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { if(turbinegas.tanks[0].getFill() < 5000 || turbinegas.tanks[1].getFill() < 1000) this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 34 + 32, 16, 16, guiLeft - 8, guiTop + 44 + 16, warning); } + @Override protected void drawGuiContainerBackgroundLayer(float iinterpolation, int x, int y) { diff --git a/src/main/java/com/hbm/inventory/gui/GUIRBMKAutoloader.java b/src/main/java/com/hbm/inventory/gui/GUIRBMKAutoloader.java new file mode 100644 index 000000000..2805437f6 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIRBMKAutoloader.java @@ -0,0 +1,72 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerRBMKAutoloader; +import com.hbm.lib.RefStrings; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKAutoloader; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; + +public class GUIRBMKAutoloader extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/machine/gui_autoloader.png"); + private TileEntityRBMKAutoloader loader; + + public GUIRBMKAutoloader(InventoryPlayer invPlayer, TileEntityRBMKAutoloader tile) { + super(new ContainerRBMKAutoloader(invPlayer, tile)); + loader = tile; + + this.xSize = 176; + this.ySize = 182; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + } + + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + if(guiLeft + 74 <= x && guiLeft + 74 + 12 > x && guiTop + 36 < y && guiTop + 36 + 12 >= y) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("minus", true); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, loader.xCoord, loader.yCoord, loader.zCoord)); + } + + if(guiLeft + 90 <= x && guiLeft + 90 + 12 > x && guiTop + 36 < y && guiTop + 36 + 12 >= y) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("plus", true); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, loader.xCoord, loader.yCoord, loader.zCoord)); + } + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.loader.hasCustomInventoryName() ? this.loader.getInventoryName() : I18n.format(this.loader.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); + + String percent = loader.cycle + "%"; + this.fontRendererObj.drawString(percent, this.xSize / 2 - this.fontRendererObj.getStringWidth(percent) / 2, 23, 0x00FF00); + } + + @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); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRecipeSelector.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRecipeSelector.java index 6f101ef29..244a2549b 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRecipeSelector.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRecipeSelector.java @@ -50,16 +50,18 @@ public class GUIScreenRecipeSelector extends GuiScreen { protected int index; protected IControlReceiver tile; protected GuiScreen previousScreen; + protected String installedPool; - public static void openSelector(GenericRecipes recipeSet, IControlReceiver tile, String selection, int index, GuiScreen previousScreen) { - FMLCommonHandler.instance().showGuiScreen(new GUIScreenRecipeSelector(recipeSet, tile, selection, index, previousScreen)); + public static void openSelector(GenericRecipes recipeSet, IControlReceiver tile, String selection, int index, String installedPool, GuiScreen previousScreen) { + FMLCommonHandler.instance().showGuiScreen(new GUIScreenRecipeSelector(recipeSet, tile, selection, index, installedPool, previousScreen)); } - public GUIScreenRecipeSelector(GenericRecipes recipeSet, IControlReceiver tile, String selection, int index, GuiScreen previousScreen) { + public GUIScreenRecipeSelector(GenericRecipes recipeSet, IControlReceiver tile, String selection, int index, String installedPool, GuiScreen previousScreen) { this.recipeSet = recipeSet; this.tile = tile; this.selection = selection; this.index = index; + this.installedPool = installedPool; this.previousScreen = previousScreen; if(this.selection == null) this.selection = NULL_SELECTION; @@ -83,7 +85,11 @@ public class GUIScreenRecipeSelector extends GuiScreen { private void regenerateRecipes() { this.recipes.clear(); - this.recipes.addAll(recipeSet.recipeOrderedList); + + for(Object o : recipeSet.recipeOrderedList) { + GenericRecipe recipe = (GenericRecipe) o; + if(!recipe.isPooled() || (this.installedPool != null && recipe.isPartOfPool(installedPool))) this.recipes.add(recipe); + } resetPaging(); } @@ -92,15 +98,17 @@ public class GUIScreenRecipeSelector extends GuiScreen { this.recipes.clear(); if(search.isEmpty()) { - this.recipes.addAll(recipeSet.recipeOrderedList); + regenerateRecipes(); } else { for(Object o : recipeSet.recipeOrderedList) { GenericRecipe recipe = (GenericRecipe) o; - if(recipe.matchesSearch(search)) this.recipes.add(recipe); + if(recipe.matchesSearch(search)) { + if(!recipe.isPooled() || (this.installedPool != null && recipe.isPartOfPool(installedPool))) this.recipes.add(recipe); + } } + + resetPaging(); } - - resetPaging(); } private void resetPaging() { @@ -127,7 +135,7 @@ public class GUIScreenRecipeSelector extends GuiScreen { if(guiLeft + ix <= mouseX && guiLeft + ix + 18 > mouseX && guiTop + iy < mouseY && guiTop + iy + 18 >= mouseY) { GenericRecipe recipe = recipes.get(i); - this.func_146283_a(recipe.print(), mouseX, mouseY); + this.func_146283_a(recipe.print(), 0, 900); } } } @@ -135,7 +143,7 @@ public class GUIScreenRecipeSelector extends GuiScreen { if(guiLeft + 151 <= mouseX && guiLeft + 151 + 18 > mouseX && guiTop + 71 < mouseY && guiTop + 71 + 18 >= mouseY) { if(this.selection != null && this.recipeSet.recipeNameMap.containsKey(selection)) { GenericRecipe recipe = (GenericRecipe) this.recipeSet.recipeNameMap.get(selection); - this.func_146283_a(recipe.print(), mouseX, mouseY); + this.func_146283_a(recipe.print(), 0, 900); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java b/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java new file mode 100644 index 000000000..915f99b1c --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenSlicePrinter.java @@ -0,0 +1,144 @@ +package com.hbm.inventory.gui; + +import java.io.File; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashSet; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.machine.BlockPWR; +import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; + +import net.minecraft.block.Block; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraftforge.common.util.ForgeDirection; + +public class GUIScreenSlicePrinter extends GuiScreen { + + private final int x1, y1, z1; + private final int x2, y2, z2; + private final int sizeX, sizeY, sizeZ; + private final ForgeDirection dir; + + private HashSet whitelist; + + private int yIndex; + + private RenderBlocks renderer; + + private String dirname; + private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); + + public GUIScreenSlicePrinter(int x1, int y1, int z1, int x2, int y2, int z2, ForgeDirection dir) { + this.x1 = Math.min(x1, x2); + this.y1 = Math.min(y1, y2); + this.z1 = Math.min(z1, z2); + this.x2 = Math.max(x1, x2); + this.y2 = Math.max(y1, y2); + this.z2 = Math.max(z1, z2); + + this.dir = dir; + + this.sizeX = this.x2 - this.x1 + 1; + this.sizeY = this.y2 - this.y1 + 1; + this.sizeZ = this.z2 - this.z1 + 1; + + dirname = dateFormat.format(new Date()).toString(); + } + + public GUIScreenSlicePrinter(int x1, int y1, int z1, int x2, int y2, int z2, ForgeDirection dir, HashSet whitelist) { + this(x1, y1, z1, x2, y2, z2, dir); + this.whitelist = whitelist; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + if(renderer == null) { + this.renderer = new RenderBlocks(mc.theWorld); + } + + GuiScreen.drawRect(0, 0, width, height, 0xFFFF00FF); + + // Once we've reached the top slice, close the GUI + if(yIndex >= sizeY) { + mc.thePlayer.addChatMessage(new ChatComponentText("Slices saved to: .minecraft/printer/" + dirname)); + mc.thePlayer.closeScreen(); + return; + } + + GL11.glPushMatrix(); + { + + setupRotation(); + + mc.getTextureManager().bindTexture(TextureMap.locationBlocksTexture); + GL11.glShadeModel(GL11.GL_SMOOTH); + Tessellator.instance.startDrawingQuads(); + + for(int x = 0; x < sizeX; x++) { + for(int z = 0; z < sizeZ; z++) { + Block block = mc.theWorld.getBlock(x1 + x, y1 + yIndex, z1 + z); + if(whitelist != null && !whitelist.contains(block)) continue; + + // Revert PWR blocks to originals for slice rendering + if(block instanceof BlockPWR) { + TileEntity tile = mc.theWorld.getTileEntity(x1 + x, y1 + yIndex, z1 + z); + if(tile instanceof TileEntityBlockPWR) { + TileEntityBlockPWR pwr = (TileEntityBlockPWR) tile; + if(pwr.block != null) { + block = pwr.block; + } + } + } + + renderer.renderBlockByRenderType(block, x, 0, z); + } + } + + Tessellator.instance.draw(); + GL11.glShadeModel(GL11.GL_FLAT); + + } + GL11.glPopMatrix(); + + File printerDir = new File(mc.mcDataDir, "printer"); + printerDir.mkdir(); + + GUIScreenWikiRender.saveScreenshot(printerDir, dirname, "slice_" + yIndex + ".png", 0, 0, mc.displayWidth, mc.displayHeight, 0xFFFF00FF); + + yIndex++; + } + + private void setupRotation() { + double scale = -24; + + GL11.glTranslated(width / 2, height / 2 - 36, 400); + GL11.glScaled(scale, scale, scale); + GL11.glScaled(1, 1, 0.5); //incredible flattening power + + GL11.glRotated(-30, 1, 0, 0); + GL11.glRotated(-45, 0, 1, 0); + + if(dir == ForgeDirection.WEST) { + GL11.glRotated(180, 0, 1, 0); + } else if(dir == ForgeDirection.NORTH) { + GL11.glRotated(-90, 0, 1, 0); + } else if(dir == ForgeDirection.SOUTH) { + GL11.glRotated(90, 0, 1, 0); + } + + if(dir == ForgeDirection.WEST || dir == ForgeDirection.EAST) { + GL11.glTranslated(sizeX / -2D, -sizeY / 2D, sizeZ / -2D); + } else { + GL11.glTranslated(sizeZ / -2D, -sizeY / 2D, sizeX / -2D); + } + } + +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java index 134b83c75..aebfa05ee 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java @@ -10,16 +10,11 @@ import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; -import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.recipes.AssemblerRecipes; -import com.hbm.inventory.recipes.AssemblerRecipes.AssemblerRecipe; -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; @@ -83,22 +78,8 @@ public class GUIScreenTemplateFolder extends GuiScreen { } } } - - // Assembly Templates - for(int i = 0; i < AssemblerRecipes.recipeList.size(); i++) { - ComparableStack comp = AssemblerRecipes.recipeList.get(i); - AssemblerRecipe recipe = AssemblerRecipes.recipes.get(comp); - if(recipe != null && recipe.folders.contains(item)) { - allStacks.add(ItemAssemblyTemplate.writeType(new ItemStack(ModItems.assembly_template, 1, i), comp)); - } - } if(!this.isJournal) { - // Chemistry Templates - for(int i = 0; i < ChemplantRecipes.recipes.size(); i++) { - 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++) { diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenToolAbility.java b/src/main/java/com/hbm/inventory/gui/GUIScreenToolAbility.java index 18db58099..9b31e5675 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenToolAbility.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenToolAbility.java @@ -52,7 +52,8 @@ public class GUIScreenToolAbility extends GuiScreen { abilitiesArea.add(new AbilityInfo(IToolAreaAbility.NONE, 0, 91)); abilitiesArea.add(new AbilityInfo(IToolAreaAbility.RECURSION, 32, 91)); abilitiesArea.add(new AbilityInfo(IToolAreaAbility.HAMMER, 64, 91)); - abilitiesArea.add(new AbilityInfo(IToolAreaAbility.EXPLOSION, 96, 91)); + abilitiesArea.add(new AbilityInfo(IToolAreaAbility.HAMMER_FLAT, 96, 91)); + abilitiesArea.add(new AbilityInfo(IToolAreaAbility.EXPLOSION, 128, 91)); abilitiesHarvest.add(new AbilityInfo(IToolHarvestAbility.NONE, 0, 107)); abilitiesHarvest.add(new AbilityInfo(IToolHarvestAbility.SILK, 32, 107)); diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java b/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java index 900e4e9b6..576f3bdf7 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenWikiRender.java @@ -19,19 +19,18 @@ import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.TextureUtil; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; public class GUIScreenWikiRender extends GuiScreen { - // Basically the same thing as GUIScreenPreview, but will iterate through all provided preview stacks - // taking a screenshot of each, as fast as the game can render them + // Basically the same thing as GUIScreenPreview, but will iterate through all provided preview stacks + // taking a screenshot of each, as fast as the game can render them protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/nei/gui_nei.png"); protected ItemStack[] preview; - protected int index = 0; + protected int index = 0; protected int scale = 1; protected String saveLocation = "wiki-screenshots"; protected String prefix = ""; @@ -52,65 +51,38 @@ public class GUIScreenWikiRender extends GuiScreen { this.getStackName = getStackName; } - @Override + @Override public void drawScreen(int mouseX, int mouseY, float f) { - if(this.mc.theWorld != null) { - GuiScreen.drawRect(0, 0, this.width, this.height, 0xFFC6C6C6); - } else { - this.drawBackground(0); + GuiScreen.drawRect(0, 0, this.width, this.height, 0xFFFF00FF); + + // Once we've reached the end of the array, immedaitely close this GUI + if(index >= preview.length) { + this.mc.thePlayer.closeScreen(); + return; } - // Once we've reached the end of the array, immedaitely close this GUI - if(index >= preview.length) { - this.mc.thePlayer.closeScreen(); - return; - } - - this.drawGuiContainerBackgroundLayer(); GL11.glDisable(GL11.GL_LIGHTING); this.drawGuiContainerForegroundLayer(preview[index]); GL11.glEnable(GL11.GL_LIGHTING); - + ScaledResolution res = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); int zoom = scale * res.getScaleFactor(); - try { - String slotName = getStackName.apply(preview[index]).replaceAll("§.", "").replaceAll("[^\\w ().-]+", ""); - if(!slotName.endsWith(".name")) { - saveScreenshot(Minecraft.getMinecraft().mcDataDir, saveLocation, prefix + slotName + ".png", zoom, zoom, zoom * 16, zoom * 16, 0xFF8B8B8B); - } - } catch (Exception ex) { - // Just skip any failures caused by display name or rendering - } + try { + String slotName = getStackName.apply(preview[index]).replaceAll("§.", "").replaceAll("[^\\w ().-]+", ""); + if(!slotName.endsWith(".name")) { + saveScreenshot(Minecraft.getMinecraft().mcDataDir, saveLocation, prefix + slotName + ".png", zoom, zoom, zoom * 16, zoom * 16, 0xFFFF00FF); + } + } catch (Exception ex) { + // Just skip any failures caused by display name or rendering + } - index++; - } - - protected void drawGuiContainerBackgroundLayer() { - GL11.glPushMatrix(); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(texture); - ScaledResolution res = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); - GL11.glScaled(scale, scale, scale); - this.drawTexturedModalRect(0, res.getScaledHeight_double() / scale - 18D, 5, 87, 18, 18); - GL11.glPopMatrix(); - } - - public void drawTexturedModalRect(double x, double y, int sourceX, int sourceY, int sizeX, int sizeY) { - double f = 0.00390625D; - double f1 = 0.00390625D; - Tessellator tessellator = Tessellator.instance; - tessellator.startDrawingQuads(); - tessellator.addVertexWithUV((double) (x + 0), (double) (y + sizeY), (double) this.zLevel, (double) ((float) (sourceX + 0) * f), (double) ((float) (sourceY + sizeY) * f1)); - tessellator.addVertexWithUV((double) (x + sizeX), (double) (y + sizeY), (double) this.zLevel, (double) ((float) (sourceX + sizeX) * f), (double) ((float) (sourceY + sizeY) * f1)); - tessellator.addVertexWithUV((double) (x + sizeX), (double) (y + 0), (double) this.zLevel, (double) ((float) (sourceX + sizeX) * f), (double) ((float) (sourceY + 0) * f1)); - tessellator.addVertexWithUV((double) (x + 0), (double) (y + 0), (double) this.zLevel, (double) ((float) (sourceX + 0) * f), (double) ((float) (sourceY + 0) * f1)); - tessellator.draw(); + index++; } protected void drawGuiContainerForegroundLayer(ItemStack preview) { if(preview == null) return; - + GL11.glPushMatrix(); RenderHelper.enableGUIStandardItemLighting(); OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); @@ -119,11 +91,11 @@ public class GUIScreenWikiRender extends GuiScreen { GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_DEPTH_TEST); - + GL11.glScaled(scale, scale, scale); - + ScaledResolution res = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); - GL11.glTranslated(9D, res.getScaledHeight_double() / scale - 9D, -200); + GL11.glTranslated(9D, res.getScaledHeight_double() / scale - 9D, -200); this.zLevel = 200.0F; itemRender.zLevel = 200.0F; @@ -134,7 +106,7 @@ public class GUIScreenWikiRender extends GuiScreen { itemRender.zLevel = 0.0F; this.zLevel = 0.0F; - + GL11.glPopMatrix(); } @@ -144,7 +116,7 @@ public class GUIScreenWikiRender extends GuiScreen { // This implementation is based directly on ScreenShotHelper.saveScreenshot() // But allows for defining a rect where you want to sample pixels from - private static void saveScreenshot(File dataDir, String ssDir, String fileName, int x, int y, int width, int height, int transparentColor) { + public static void saveScreenshot(File dataDir, String ssDir, String fileName, int x, int y, int width, int height, int transparentColor) { try { File screenshotDirectory = new File(dataDir, ssDir); screenshotDirectory.mkdir(); diff --git a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java index d3f151798..7c57a4dab 100644 --- a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java +++ b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java @@ -292,6 +292,8 @@ public abstract class GuiInfoContainer extends GuiContainer implements INEIGuiHa this.drawGradientRect(minX + indent, minY, minX + indent + 16, minY + 16, 0xffb0b0b0, 0xffb0b0b0); } GL11.glEnable(GL11.GL_DEPTH_TEST); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); 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/gui/LoadingScreenRendererNT.java b/src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java new file mode 100644 index 000000000..10c4624ee --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java @@ -0,0 +1,189 @@ +package com.hbm.inventory.gui; + +import java.util.Random; + +import org.lwjgl.opengl.GL11; + +import com.hbm.handler.HTTPHandler; + +import cpw.mods.fml.client.FMLClientHandler; +import net.minecraft.client.LoadingScreenRenderer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.shader.Framebuffer; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MinecraftError; + +public class LoadingScreenRendererNT extends LoadingScreenRenderer { + + private String message = ""; + private Minecraft mc; + private String currentlyDisplayedText = ""; + private long time = Minecraft.getSystemTime(); + private boolean doesProgress; + private ScaledResolution resolution; + private Framebuffer frameBuffer; + public String tipOfTheDay = "Tip of the day: " + chooseTip(); + + public LoadingScreenRendererNT(Minecraft mc) { + super(mc); + this.mc = mc; + this.resolution = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); + this.frameBuffer = new Framebuffer(mc.displayWidth, mc.displayHeight, false); + this.frameBuffer.setFramebufferFilter(9728); + } + + private String chooseTip() { + if(HTTPHandler.tipOfTheDay.isEmpty()) return "Explore! There's tons of free stuff to find."; + return HTTPHandler.tipOfTheDay.get(new Random().nextInt(HTTPHandler.tipOfTheDay.size())); + } + + @Override + public void resetProgressAndMessage(String message) { + this.doesProgress = false; + this.func_73722_d(message); + } + + @Override + public void displayProgressMessage(String message) { + this.doesProgress = true; + this.func_73722_d(message); + } + + @Override + public void func_73722_d(String message) { + this.currentlyDisplayedText = message; + + if(!this.mc.running) { + if(!this.doesProgress) { + throw new MinecraftError(); + } + } else { + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + + if(OpenGlHelper.isFramebufferEnabled()) { + int scale = this.resolution.getScaleFactor(); + GL11.glOrtho(0.0D, (this.resolution.getScaledWidth() * scale), (this.resolution.getScaledHeight() * scale), 0.0D, 100.0D, 300.0D); + } else { + ScaledResolution scaledresolution = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); + GL11.glOrtho(0.0D, scaledresolution.getScaledWidth_double(), scaledresolution.getScaledHeight_double(), 0.0D, 100.0D, 300.0D); + } + + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -200.0F); + } + } + + @Override + public void resetProgresAndWorkingMessage(String message) { + if(!this.mc.running) { + if(!this.doesProgress) { + throw new MinecraftError(); + } + } else { + this.time = 0L; + this.message = message; + this.setLoadingProgress(-1); + this.time = 0L; + } + } + + @Override + public void setLoadingProgress(int p_73718_1_) { + if(!this.mc.running) { + if(!this.doesProgress) { + throw new MinecraftError(); + } + } else { + long time = Minecraft.getSystemTime(); + + if(time - this.time >= 100L) { + this.time = time; + ScaledResolution scaledresolution = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); + int scaleFactor = scaledresolution.getScaleFactor(); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + if(OpenGlHelper.isFramebufferEnabled()) { + this.frameBuffer.framebufferClear(); + } else { + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + } + + this.frameBuffer.bindFramebuffer(false); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(0.0D, scaledresolution.getScaledWidth_double(), scaledresolution.getScaledHeight_double(), 0.0D, 100.0D, 300.0D); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -200.0F); + + if(!OpenGlHelper.isFramebufferEnabled()) { + GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + } + + if(!FMLClientHandler.instance().handleLoadingScreen(scaledresolution)) { + Tessellator tessellator = Tessellator.instance; + this.mc.getTextureManager().bindTexture(Gui.optionsBackground); + float f = 32.0F; + tessellator.startDrawingQuads(); + tessellator.setColorOpaque_I(4210752); + tessellator.addVertexWithUV(0.0D, height, 0.0D, 0.0D, height / f); + tessellator.addVertexWithUV(width, height, 0.0D, width / f, height / f); + tessellator.addVertexWithUV(width, 0.0D, 0.0D, width / f, 0.0D); + tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 0.0D); + tessellator.draw(); + + if(p_73718_1_ >= 0) { + byte b0 = 100; + byte b1 = 2; + int j1 = width / 2 - b0 / 2; + int k1 = height / 2 + 16; + GL11.glDisable(GL11.GL_TEXTURE_2D); + tessellator.startDrawingQuads(); + tessellator.setColorOpaque_I(8421504); + tessellator.addVertex(j1, k1, 0.0D); + tessellator.addVertex(j1, k1 + b1, 0.0D); + tessellator.addVertex(j1 + b0, k1 + b1, 0.0D); + tessellator.addVertex(j1 + b0, k1, 0.0D); + tessellator.setColorOpaque_I(8454016); + tessellator.addVertex(j1, k1, 0.0D); + tessellator.addVertex(j1, (k1 + b1), 0.0D); + tessellator.addVertex(j1 + p_73718_1_, k1 + b1, 0.0D); + tessellator.addVertex(j1 + p_73718_1_, k1, 0.0D); + tessellator.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + this.mc.fontRenderer.drawStringWithShadow(this.currentlyDisplayedText, (width - this.mc.fontRenderer.getStringWidth(this.currentlyDisplayedText)) / 2, height / 2 - 4 - 16, 16777215); + this.mc.fontRenderer.drawStringWithShadow(this.message, (width - this.mc.fontRenderer.getStringWidth(this.message)) / 2, height / 2 - 4 + 8, 16777215); + + String[] frags = this.tipOfTheDay.split("\\$"); + for(int i = 0; i < frags.length; i++) { + String frag = frags[i]; + this.mc.fontRenderer.drawStringWithShadow(EnumChatFormatting.YELLOW + frag, (width - this.mc.fontRenderer.getStringWidth(frag)) / 2, height / 2 - 4 - 60 + i * 10, 16777215); + } + } + this.frameBuffer.unbindFramebuffer(); + + if(OpenGlHelper.isFramebufferEnabled()) { + this.frameBuffer.framebufferRender(width * scaleFactor, height * scaleFactor); + } + + this.mc.func_147120_f(); + + try { Thread.yield(); } catch(Exception exception) { } + } + } + } + + @Override public void func_146586_a() { } +} diff --git a/src/main/java/com/hbm/inventory/material/MaterialShapes.java b/src/main/java/com/hbm/inventory/material/MaterialShapes.java index 2f7de0461..ef44dd613 100644 --- a/src/main/java/com/hbm/inventory/material/MaterialShapes.java +++ b/src/main/java/com/hbm/inventory/material/MaterialShapes.java @@ -34,7 +34,6 @@ public class MaterialShapes { public static final MaterialShapes PIPE = new MaterialShapes(INGOT.quantity * 3, "ntmpipe"); public static final MaterialShapes QUART = new MaterialShapes(162); public static final MaterialShapes BLOCK = new MaterialShapes(INGOT.quantity * 9, "block"); - public static final MaterialShapes HEAVY_COMPONENT = new MaterialShapes(CASTPLATE.quantity * 256, "componentHeavy"); public static final MaterialShapes LIGHTBARREL = new MaterialShapes(INGOT.quantity * 3, "barrelLight"); public static final MaterialShapes HEAVYBARREL = new MaterialShapes(INGOT.quantity * 6, "barrelHeavy"); diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index 6e810bbcc..3d923dd47 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -100,11 +100,11 @@ public class Mats { public static final NTMMaterial MAT_GHIORSIUM = makeSmeltable(12836, GH336, 0xF4EFE1, 0x2A3306, 0xC6C6A1).setAutogen(NUGGET, BILLET, BLOCK).m(); //Base metals - public static final NTMMaterial MAT_TITANIUM = makeSmeltable(2200, TI, 0xF7F3F2, 0x4F4C4B, 0xA99E79).setAutogen(FRAGMENT, DUST, PLATE, DENSEWIRE, CASTPLATE, WELDEDPLATE, SHELL, BLOCK, HEAVY_COMPONENT).m(); - public static final NTMMaterial MAT_COPPER = makeSmeltable(2900, CU, 0xFDCA88, 0x601E0D, 0xC18336).setAutogen(FRAGMENT, WIRE, DUST, PLATE, DENSEWIRE, CASTPLATE, WELDEDPLATE, SHELL, PIPE, BLOCK, HEAVY_COMPONENT).m(); - public static final NTMMaterial MAT_TUNGSTEN = makeSmeltable(7400, W, 0x868686, 0x000000, 0x977474).setAutogen(FRAGMENT, WIRE, BOLT, DUST, DENSEWIRE, CASTPLATE, WELDEDPLATE, BLOCK, HEAVY_COMPONENT).m(); - public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(1300, AL, 0xFFFFFF, 0x344550, 0xD0B8EB).setAutogen(FRAGMENT, WIRE, DUST, PLATE, CASTPLATE, WELDEDPLATE, SHELL, PIPE, BLOCK, HEAVY_COMPONENT).m(); - public static final NTMMaterial MAT_LEAD = makeSmeltable(8200, PB, 0xA6A6B2, 0x03030F, 0x646470).setAutogen(FRAGMENT, NUGGET, WIRE, BOLT, DUST, PLATE, CASTPLATE, PIPE, BLOCK, HEAVY_COMPONENT).m(); + public static final NTMMaterial MAT_TITANIUM = makeSmeltable(2200, TI, 0xF7F3F2, 0x4F4C4B, 0xA99E79).setAutogen(FRAGMENT, DUST, PLATE, DENSEWIRE, CASTPLATE, WELDEDPLATE, SHELL, BLOCK).m(); + public static final NTMMaterial MAT_COPPER = makeSmeltable(2900, CU, 0xFDCA88, 0x601E0D, 0xC18336).setAutogen(FRAGMENT, WIRE, DUST, PLATE, DENSEWIRE, CASTPLATE, WELDEDPLATE, SHELL, PIPE, BLOCK).m(); + public static final NTMMaterial MAT_TUNGSTEN = makeSmeltable(7400, W, 0x868686, 0x000000, 0x977474).setAutogen(FRAGMENT, WIRE, BOLT, DUST, DENSEWIRE, CASTPLATE, WELDEDPLATE, BLOCK).m(); + public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(1300, AL, 0xFFFFFF, 0x344550, 0xD0B8EB).setAutogen(FRAGMENT, WIRE, DUST, PLATE, CASTPLATE, WELDEDPLATE, SHELL, PIPE, BLOCK).m(); + public static final NTMMaterial MAT_LEAD = makeSmeltable(8200, PB, 0xA6A6B2, 0x03030F, 0x646470).setAutogen(FRAGMENT, NUGGET, WIRE, BOLT, DUST, PLATE, CASTPLATE, PIPE, BLOCK).m(); public static final NTMMaterial MAT_BISMUTH = makeSmeltable(8300, BI, 0xB200FF, 0xB200FF, 0xB200FF).setAutogen(FRAGMENT, NUGGET, BILLET, DUST, BLOCK).m(); public static final NTMMaterial MAT_ARSENIC = makeSmeltable(3300, AS, 0x6CBABA, 0x242525, 0x558080).setAutogen(NUGGET).m(); public static final NTMMaterial MAT_TANTALIUM = makeSmeltable(7300, TA, 0xFFFFFF, 0x1D1D36, 0xA89B74).setAutogen(NUGGET, DUST, BLOCK).m(); @@ -135,15 +135,15 @@ public class Mats { public static final NTMMaterial MAT_OSMIRIDIUM = makeSmeltable(7699, OSMIRIDIUM, 0xDBE3EF, 0x7891BE, 0xACBDD9).setAutogen(NUGGET, CASTPLATE, WELDEDPLATE).m(); //Alloys - public static final NTMMaterial MAT_STEEL = makeSmeltable(_AS + 0, STEEL, 0xAFAFAF, 0x0F0F0F, 0x4A4A4A).setAutogen(DUSTTINY, BOLT, WIRE, DUST, PLATE, CASTPLATE, WELDEDPLATE, SHELL, PIPE, BLOCK, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, GRIP).m(); - public static final NTMMaterial MAT_MINGRADE = makeSmeltable(_AS + 1, MINGRADE, 0xFFBA7D, 0xAF1700, 0xE44C0F).setAutogen(WIRE, DUST, BLOCK).m(); - public static final NTMMaterial MAT_ALLOY = makeSmeltable(_AS + 2, ALLOY, 0xFF8330, 0x700000, 0xFF7318).setAutogen(WIRE, DUST, DENSEWIRE, PLATE, CASTPLATE, BLOCK, HEAVY_COMPONENT).m(); + public static final NTMMaterial MAT_STEEL = makeSmeltable(_AS + 0, STEEL, 0xAFAFAF, 0x0F0F0F, 0x4A4A4A).setAutogen(DUSTTINY, BOLT, WIRE, DUST, PLATE, CASTPLATE, WELDEDPLATE, SHELL, PIPE, BLOCK, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, GRIP).m(); + public static final NTMMaterial MAT_MINGRADE = makeSmeltable(_AS + 1, MINGRADE, 0xFFBA7D, 0xAF1700, 0xE44C0F).setAutogen(WIRE, DUST, DENSEWIRE, BLOCK).m(); + public static final NTMMaterial MAT_ALLOY = makeSmeltable(_AS + 2, ALLOY, 0xFF8330, 0x700000, 0xFF7318).setAutogen(WIRE, DUST, DENSEWIRE, PLATE, CASTPLATE, BLOCK).m(); public static final NTMMaterial MAT_DURA = makeSmeltable(_AS + 3, DURA, 0x82A59C, 0x06281E, 0x42665C).setAutogen(BOLT, DUST, PLATE, CASTPLATE, PIPE, BLOCK, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER, GRIP).m(); - public static final NTMMaterial MAT_DESH = makeSmeltable(_AS + 12, DESH, 0xFF6D6D, 0x720000, 0xF22929).setAutogen(DUST, CASTPLATE, BLOCK, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, STOCK, GRIP).m(); + public static final NTMMaterial MAT_DESH = makeSmeltable(_AS + 12, DESH, 0xFF6D6D, 0x720000, 0xF22929).setAutogen(DUST, CASTPLATE, BLOCK, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, STOCK, GRIP).m(); public static final NTMMaterial MAT_STAR = makeSmeltable(_AS + 5, STAR, 0xCCCCEA, 0x11111A, 0xA5A5D3).setAutogen(DUST, DENSEWIRE, BLOCK).m(); public static final NTMMaterial MAT_FERRO = makeSmeltable(_AS + 7, FERRO, 0xB7B7C9, 0x101022, 0x6B6B8B).setAutogen(CASTPLATE, HEAVYBARREL, HEAVYRECEIVER).m(); - public static final NTMMaterial MAT_TCALLOY = makeSmeltable(_AS + 6, TCALLOY, 0xD4D6D6, 0x323D3D, 0x9CA6A6).setAutogen(DUST, CASTPLATE, WELDEDPLATE, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER).m(); - public static final NTMMaterial MAT_CDALLOY = makeSmeltable(_AS + 13, CDALLOY, 0xF7DF8F, 0x604308, 0xFBD368).setAutogen(CASTPLATE, WELDEDPLATE, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER).m(); + public static final NTMMaterial MAT_TCALLOY = makeSmeltable(_AS + 6, TCALLOY, 0xD4D6D6, 0x323D3D, 0x9CA6A6).setAutogen(DUST, CASTPLATE, WELDEDPLATE, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER).m(); + public static final NTMMaterial MAT_CDALLOY = makeSmeltable(_AS + 13, CDALLOY, 0xF7DF8F, 0x604308, 0xFBD368).setAutogen(CASTPLATE, WELDEDPLATE, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER).m(); public static final NTMMaterial MAT_BBRONZE = makeSmeltable(_AS + 16, BBRONZE, 0xE19A69, 0x485353, 0x987D65).setAutogen(CASTPLATE, LIGHTBARREL, LIGHTRECEIVER, HEAVYRECEIVER).m(); public static final NTMMaterial MAT_ABRONZE = makeSmeltable(_AS + 17, ABRONZE, 0xDB9462, 0x203331, 0x77644D).setAutogen(CASTPLATE, LIGHTBARREL, LIGHTRECEIVER, HEAVYRECEIVER).m(); public static final NTMMaterial MAT_BSCCO = makeSmeltable(_AS + 18, BSCCO, 0x767BF1, 0x000000, 0x5E62C0).setAutogen(DENSEWIRE).m(); diff --git a/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java b/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java index c5a96c458..1327ae459 100644 --- a/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java @@ -431,6 +431,10 @@ public class AmmoPressRecipes extends SerializableRecipe { null, he.copy(8), null, null, sBig.copy(2), null, null, sPlate.copy(4), null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.NUKE_BALEFIRE, 1), + null, new ComparableStack(ModItems.egg_balefire_shard), null, + null, shell, null, + null, null , null)); recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.CT_HOOK, 16), null, steel, null, diff --git a/src/main/java/com/hbm/inventory/recipes/ArcFurnaceRecipes.java b/src/main/java/com/hbm/inventory/recipes/ArcFurnaceRecipes.java index 35b202158..fae8f617f 100644 --- a/src/main/java/com/hbm/inventory/recipes/ArcFurnaceRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ArcFurnaceRecipes.java @@ -111,6 +111,10 @@ public class ArcFurnaceRecipes extends SerializableRecipe { } // Autogen for furnace recipes + registerFurnaceSmeltables(); + } + + public static void registerFurnaceSmeltables() { for(Object o : FurnaceRecipes.smelting().getSmeltingList().entrySet()) { Entry entry = (Entry) o; ItemStack input = (ItemStack) entry.getKey(); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index e1efbf9db..f3a8f3f2e 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -23,13 +23,9 @@ import com.hbm.config.GeneralConfig; import com.hbm.inventory.OreDictManager; import com.hbm.inventory.RecipesCommon.*; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.material.MaterialShapes; import com.hbm.inventory.material.Mats; -import com.hbm.inventory.material.NTMMaterial; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; -import com.hbm.items.ItemEnums.EnumCasingType; -import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ItemGenericPart.EnumPartType; import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; @@ -38,7 +34,6 @@ import com.hbm.items.machine.ItemPACoil.EnumCoilType; import com.hbm.items.machine.ItemPistons.EnumPistonType; import com.hbm.items.weapon.ItemAmmoHIMARS; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; -import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; import com.hbm.main.MainRegistry; import cpw.mods.fml.common.Loader; @@ -48,7 +43,7 @@ import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -public class AssemblerRecipes extends SerializableRecipe { +@Deprecated public class AssemblerRecipes extends SerializableRecipe { public static HashMap recipes = new HashMap(); public static List recipeList = new ArrayList(); @@ -59,7 +54,7 @@ public class AssemblerRecipes extends SerializableRecipe { @Override public void registerDefaults() { - boolean exp = GeneralConfig.enableExpensiveMode; + boolean exp = false;//GeneralConfig.enableExpensiveMode; makeRecipe(new ComparableStack(ModItems.plate_iron, 2), new AStack[] {new OreDictStack(IRON.ingot(), 3), },30); makeRecipe(new ComparableStack(ModItems.plate_gold, 2), new AStack[] {new OreDictStack(GOLD.ingot(), 3), },30); @@ -79,7 +74,6 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModItems.centrifuge_element, 1), new AStack[] {new OreDictStack(STEEL.plate528(), 4), new OreDictStack(TI.plate528(), 4), new ComparableStack(ModItems.motor, 1), }, 100); makeRecipe(new ComparableStack(ModItems.reactor_core, 1), new AStack[] {new OreDictStack(PB.ingot(), 8), new OreDictStack(BE.ingot(), 6), new OreDictStack(STEEL.plate(), 16), new OreDictStack(OreDictManager.getReflector(), 8), new OreDictStack(FIBER.ingot(), 2) },100); makeRecipe(new ComparableStack(ModItems.rtg_unit, 1), new AStack[] {new ComparableStack(ModItems.thermo_element, 2), new OreDictStack(CU.plateCast(), 1), new OreDictStack(PB.ingot(), 2), new OreDictStack(STEEL.plate(), 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CAPACITOR.ordinal()), },100); - makeRecipe(new ComparableStack(ModItems.levitation_unit, 1), new AStack[] {new ComparableStack(ModItems.coil_copper, 4), new ComparableStack(ModItems.coil_tungsten, 2), new OreDictStack(TI.plate(), 6), new ComparableStack(ModItems.nugget_schrabidium, 2), },100); makeRecipe(new ComparableStack(ModItems.drill_titanium, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 2), new OreDictStack(DURA.ingot(), 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack(TI.plate(), 6), },100); makeRecipe(new ComparableStack(ModItems.entanglement_kit, 1), new AStack[] {new OreDictStack(STEEL.plate(), 8), new OreDictStack(DURA.ingot(), 4), new OreDictStack(CU.plate(), 24), new OreDictStack(GOLD.wireDense(), 16), new OreDictStack(Fluids.XENON.getDict(1_000))},200); makeRecipe(new ComparableStack(ModItems.dysfunctional_reactor, 1), new AStack[] {new OreDictStack(STEEL.plate(), 15), new OreDictStack(PB.ingot(), 5), new ComparableStack(ModItems.rod_quad_empty, 10), new OreDictStack("dyeBrown", 3), },200); @@ -101,13 +95,6 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModItems.warhead_volcano, 1), new AStack[] {new OreDictStack(TI.plate(), 24), new OreDictStack(STEEL.plate(), 16), new ComparableStack(ModBlocks.det_nuke, 3), new OreDictStack(U238.block(), 24), new ComparableStack(ModItems.circuit, 5, EnumCircuitType.CAPACITOR_BOARD.ordinal()) }, 600); makeRecipe(new ComparableStack(ModItems.missile_stealth, 1), new AStack[] { new OreDictStack(TI.plate(), 20), new OreDictStack(AL.plate(), 20), new OreDictStack(CU.plate(), 10), new OreDictStack(KEY_BLACK, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(STEEL.bolt(), 32) },1200); makeRecipe(new ComparableStack(ModItems.thruster_nuclear, 1), new AStack[] {new OreDictStack(DURA.ingot(), 32), new OreDictStack(B.ingot(), 8), new OreDictStack(PB.plate(), 16), new ComparableStack(ModItems.pipes_steel) },600); - makeRecipe(new ComparableStack(ModItems.chopper_head, 1), new AStack[] {new ComparableStack(ModBlocks.reinforced_glass, 2), new OreDictStack(CMB.ingot(), 22), new OreDictStack(MAGTUNG.wireFine(), 4), },300); - makeRecipe(new ComparableStack(ModItems.chopper_gun, 1), new AStack[] {new OreDictStack(CMB.plate(), 4), new OreDictStack(CMB.ingot(), 2), new OreDictStack(W.wireFine(), 6), new ComparableStack(ModItems.coil_magnetized_tungsten, 1), new ComparableStack(ModItems.motor, 1), },150); - makeRecipe(new ComparableStack(ModItems.chopper_torso, 1), new AStack[] {new OreDictStack(CMB.ingot(), 26), new OreDictStack(MAGTUNG.wireFine(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.chopper_blades, 2), },350); - makeRecipe(new ComparableStack(ModItems.chopper_tail, 1), new AStack[] {new OreDictStack(CMB.plate(), 8), new OreDictStack(CMB.ingot(), 5), new OreDictStack(MAGTUNG.wireFine(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.chopper_blades, 2), },200); - makeRecipe(new ComparableStack(ModItems.chopper_wing, 1), new AStack[] {new OreDictStack(CMB.plate(), 6), new OreDictStack(CMB.ingot(), 3), new OreDictStack(MAGTUNG.wireFine(), 2), },150); - makeRecipe(new ComparableStack(ModItems.chopper_blades, 1), new AStack[] {new OreDictStack(CMB.plate(), 8), new OreDictStack(STEEL.plate(), 2), new OreDictStack(CMB.ingot(), 2), },200); - makeRecipe(new ComparableStack(ModItems.tritium_deuterium_cake, 1), new AStack[] {new ComparableStack(ModItems.cell_deuterium, 6), new ComparableStack(ModItems.cell_tritium, 2), new OreDictStack(LI.ingot(), 4), },150); makeRecipe(new ComparableStack(ModItems.pellet_cluster, 1), new AStack[] {new OreDictStack(STEEL.plate(), 4), new ComparableStack(Blocks.tnt, 1), }, 50); makeRecipe(new ComparableStack(ModItems.pellet_buckshot, 1), new AStack[] {new OreDictStack(PB.nugget(), 6), }, 50); makeRecipe(new ComparableStack(ModItems.magnetron, 1), new AStack[] {new OreDictStack(CU.plate(), 3), new OreDictStack(W.wireFine(), 4), }, 40); @@ -166,12 +153,10 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModBlocks.nuke_fleija, 1), new AStack[] {new OreDictStack(AL.shell(), 1), new ComparableStack(ModItems.fins_quad_titanium, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER), new OreDictStack("dyeWhite", 4), },400); makeRecipe(new ComparableStack(ModBlocks.nuke_solinium, 1), new AStack[] {new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_quad_titanium, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER), new OreDictStack("dyeGray", 8), },400); makeRecipe(new ComparableStack(ModBlocks.nuke_n2, 1), new AStack[] {new OreDictStack(STEEL.shell(), 6), new OreDictStack(MAGTUNG.wireFine(), 12), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER), new OreDictStack("dyeBlack", 8), },300); - makeRecipe(new ComparableStack(ModBlocks.nuke_fstbmb, 1), new AStack[] {new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(TI.shell(), 6), new ComparableStack(ModItems.fins_big_steel, 1), new ComparableStack(ModItems.powder_magic, 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack("dyeGray", 8), },600, ModItems.journal_pip, ModItems.journal_bj); makeRecipe(new ComparableStack(ModBlocks.nuke_custom, 1), new AStack[] {new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_small_steel, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack("dyeGray", 4), },300); - makeRecipe(new ComparableStack(ModBlocks.float_bomb, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.levitation_unit, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(GOLD.wireFine(), 6), },250); + makeRecipe(new ComparableStack(ModBlocks.float_bomb, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new OreDictStack(GOLD.wireDense(), 8), },250); makeRecipe(new ComparableStack(ModBlocks.therm_endo, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.powder_ice, 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4), },250); makeRecipe(new ComparableStack(ModBlocks.therm_exo, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new OreDictStack(P_RED.dust(), 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4), },250); - makeRecipe(new ComparableStack(ModItems.spawn_chopper, 1), new AStack[] {new ComparableStack(ModItems.chopper_blades, 5), new ComparableStack(ModItems.chopper_gun, 1), new ComparableStack(ModItems.chopper_head, 1), new ComparableStack(ModItems.chopper_tail, 1), new ComparableStack(ModItems.chopper_torso, 1), new ComparableStack(ModItems.chopper_wing, 2), },300); makeRecipe(new ComparableStack(ModItems.grenade_fire, 1), new AStack[] {new ComparableStack(ModItems.grenade_frag, 1), new OreDictStack(P_RED.dust(), 1), new OreDictStack(CU.plate(), 2), },150); makeRecipe(new ComparableStack(ModItems.grenade_shrapnel, 1), new AStack[] {new ComparableStack(ModItems.grenade_frag, 1), new ComparableStack(ModItems.pellet_buckshot, 1), new OreDictStack(STEEL.plate(), 2), },150); makeRecipe(new ComparableStack(ModItems.grenade_cluster, 1), new AStack[] {new ComparableStack(ModItems.grenade_frag, 1), new ComparableStack(ModItems.pellet_cluster, 1), new OreDictStack(STEEL.plate(), 2), },200); @@ -205,7 +190,6 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModItems.solinium_core, 1), new AStack[] {new OreDictStack(SA327.nugget(), 9), new OreDictStack(EUPH.nugget(), 1), },400); makeRecipe(new ComparableStack(ModItems.solinium_propellant, 1), new AStack[] {new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 3), new OreDictStack(OreDictManager.getReflector(), 2), new ComparableStack(ModItems.plate_polymer, 6), new OreDictStack(W.wireFine(), 6), new ComparableStack(ModItems.biomass_compressed, 4), },350); makeRecipe(new ComparableStack(ModItems.schrabidium_hammer, 1), new AStack[] {new OreDictStack(SA326.block(), 35), new ComparableStack(ModItems.billet_yharonite, 128), new ComparableStack(Items.nether_star, 3), new ComparableStack(ModItems.fragment_meteorite, 512), },1000); - makeRecipe(new ComparableStack(ModItems.component_emitter, 1), new AStack[] {new OreDictStack(STEEL.shell(), 3), new OreDictStack(AL.shell(), 2), new OreDictStack(STEEL.plate(), 32), new OreDictStack(PB.plate(), 24), new ComparableStack(ModItems.plate_desh, 24), new ComparableStack(ModItems.pipes_steel, 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new OreDictStack(STAR.ingot(), 26), new ComparableStack(ModItems.powder_magic, 48), new ComparableStack(ModItems.crystal_xen, 1), },2500); makeRecipe(new ComparableStack(ModBlocks.machine_radar, 1), new AStack[] {new OreDictStack(STEEL.plate528(), 8), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(ANY_RUBBER.ingot(), 8), new ComparableStack(ModItems.magnetron, 3), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BASIC.ordinal()), new ComparableStack(ModItems.coil_copper, 12), new ComparableStack(ModItems.crt_display, 4), },300); makeRecipe(new ComparableStack(ModBlocks.machine_radar_large, 1), new AStack[] {new OreDictStack(STEEL.plateWelded(), 6), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 16), new OreDictStack(ANY_RUBBER.ingot(), 16), new ComparableStack(ModItems.magnetron, 12), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_copper, 32), new ComparableStack(ModItems.crt_display, 4), },600); makeRecipe(new ComparableStack(ModBlocks.machine_forcefield, 1), new AStack[] {new OreDictStack(ALLOY.plate528(), 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, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModBlocks.machine_transformer, 1), },1000); @@ -248,13 +232,13 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModItems.mp_warhead_10_buster, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(TI.plate(), 4), new ComparableStack(ModBlocks.det_charge, 1), new ComparableStack(ModBlocks.det_cord, 4), new OreDictStack(CU.plateCast(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC), },100); makeRecipe(new ComparableStack(ModItems.mp_warhead_10_nuclear, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 6), new OreDictStack(PU239.ingot(), 1), new OreDictStack(OreDictManager.getReflector(), 2), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), },200); makeRecipe(new ComparableStack(ModItems.mp_warhead_10_nuclear_large, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 8), new OreDictStack(AL.plate(), 4), new OreDictStack(PU239.ingot(), 2), new ComparableStack(ModBlocks.det_charge, 4), new ComparableStack(ModItems.circuit,3, EnumCircuitType.ADVANCED), },300); - makeRecipe(new ComparableStack(ModItems.mp_warhead_10_taint, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.det_cord, 2), new ComparableStack(ModItems.powder_magic, 12), new ComparableStack(ModItems.bucket_mud, 1), },100, ModItems.journal_pip); - makeRecipe(new ComparableStack(ModItems.mp_warhead_10_cloud, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.det_cord, 2), new ComparableStack(ModItems.grenade_pink_cloud, 2), },100, ModItems.journal_pip); + makeRecipe(new ComparableStack(ModItems.mp_warhead_10_taint, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.det_cord, 2), new ComparableStack(ModItems.powder_magic, 12), new ComparableStack(ModItems.bucket_mud, 1), },100); + makeRecipe(new ComparableStack(ModItems.mp_warhead_10_cloud, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.det_cord, 2), new ComparableStack(ModItems.grenade_pink_cloud, 2), },100); makeRecipe(new ComparableStack(ModItems.mp_warhead_15_he, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.plate(), 16), new ComparableStack(ModBlocks.det_charge, 4), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC), },200); makeRecipe(new ComparableStack(ModItems.mp_warhead_15_incendiary, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.plate(), 16), new ComparableStack(ModBlocks.det_charge, 2), new OreDictStack(P_RED.dust(), 8), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC), },200); makeRecipe(new ComparableStack(ModItems.mp_warhead_15_nuclear, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.plate(), 24), new OreDictStack(TI.plate(), 12), new OreDictStack(PU239.ingot(), 3), new ComparableStack(ModBlocks.det_charge, 6), new ComparableStack(ModItems.circuit, 5, EnumCircuitType.ADVANCED), },500); makeRecipe(new ComparableStack(ModItems.mp_warhead_15_n2, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.plate(), 8), new OreDictStack(TI.plate(), 20), new ComparableStack(ModBlocks.det_charge, 24), new ComparableStack(Blocks.redstone_block, 12), new OreDictStack(MAGTUNG.dust(), 6), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), },400); - makeRecipe(new ComparableStack(ModItems.mp_warhead_15_balefire, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(OreDictManager.getReflector(), 16), new ComparableStack(ModItems.powder_magic, 6), new ComparableStack(ModItems.egg_balefire_shard, 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 8), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED), }, 60, ModItems.journal_bj); + makeRecipe(new ComparableStack(ModItems.mp_warhead_15_balefire, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(OreDictManager.getReflector(), 16), new ComparableStack(ModItems.powder_magic, 6), new ComparableStack(ModItems.egg_balefire_shard, 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 8), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED), }, 60); makeRecipe(new ComparableStack(ModItems.fusion_shield_tungsten, 1), new AStack[] {new OreDictStack(W.block(), 32), new OreDictStack(OreDictManager.getReflector(), 96)}, 600); makeRecipe(new ComparableStack(ModItems.fusion_shield_desh, 1), new AStack[] {new OreDictStack(DESH.block(), 16), new OreDictStack(CO.block(), 16), new OreDictStack(BIGMT.plate(), 96)}, 600); makeRecipe(new ComparableStack(ModItems.fusion_shield_chlorophyte, 1), new AStack[] {new OreDictStack(W.block(), 16), new OreDictStack(DURA.block(), 16), new OreDictStack(OreDictManager.getReflector(), 48), new ComparableStack(ModItems.powder_chlorophyte, 48)}, 600); @@ -269,15 +253,6 @@ public class AssemblerRecipes extends SerializableRecipe { new ComparableStack(ModItems.part_generic, 32, EnumPartType.LDE) },600); - makeRecipe(new ComparableStack(ModItems.missile_soyuz_lander, 1), new AStack[] { - new OreDictStack(AL.shell(), 4), - new OreDictStack(RUBBER.ingot(), 16), - new ComparableStack(ModItems.rocket_fuel, 16), - new ComparableStack(ModItems.thruster_small, 3), - new ComparableStack(ModItems.circuit, 3, EnumCircuitType.CONTROLLER_ADVANCED), - new ComparableStack(ModItems.part_generic, 12, EnumPartType.LDE) - },600, ModItems.journal_bj); - makeRecipe(new ComparableStack(ModItems.sat_base, 1), new AStack[] { new OreDictStack(RUBBER.ingot(), 12), new OreDictStack(TI.shell(), 3), @@ -408,7 +383,7 @@ public class AssemblerRecipes extends SerializableRecipe { new OreDictStack(STEEL.plate528(), 16), new OreDictStack(CU.ingot(), 12), new OreDictStack(GOLD.wireDense(), 8), - new ComparableStack(ModItems.tank_steel, 4), + new OreDictStack(STEEL.shell(), 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC) }, 300); @@ -416,7 +391,7 @@ public class AssemblerRecipes extends SerializableRecipe { new ComparableStack(ModItems.ingot_firebrick, 12), new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(CU.plateWelded(), 2), - new ComparableStack(ModItems.tank_steel, 2), + new OreDictStack(STEEL.shell(), 2), new OreDictStack(ANY_CONCRETE.any(), 8) }, 100); @@ -584,15 +559,6 @@ public class AssemblerRecipes extends SerializableRecipe { new ComparableStack(ModItems.coin_worm, 1) }, 1200); - makeRecipe(new ComparableStack(ModItems.sat_gerald, 1), new AStack[] { - new OreDictStack(SBD.plateCast(), 128), - new OreDictStack(BSCCO.wireDense(), 128), - new ComparableStack(ModBlocks.det_nuke, 64), - new ComparableStack(ModItems.part_generic, 256, EnumPartType.HDE), - new ComparableStack(ModItems.circuit, 64, EnumCircuitType.CONTROLLER_QUANTUM), - new ComparableStack(ModItems.coin_ufo, 1), - }, 1200, ModItems.journal_bj); - makeRecipe(new ComparableStack(ModBlocks.vault_door, 1), new AStack[] { new OreDictStack(STEEL.ingot(), 32), new OreDictStack(W.ingot(), 32), @@ -796,18 +762,6 @@ public class AssemblerRecipes extends SerializableRecipe { new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), }, 100); - makeRecipe(new ComparableStack(ModItems.ammo_standard, 6, EnumAmmo.BMG50_SM), new AStack[] { - new ComparableStack(ModItems.casing, 1, EnumCasingType.LARGE_STEEL), - new OreDictStack(ANY_SMOKELESS.dust(), 6), - new OreDictStack(STAR.ingot(), 3), - }, 100, ModItems.journal_silver); - makeRecipe(new ComparableStack(ModItems.ammo_secret, 12, EnumAmmoSecret.BMG50_BLACK), new AStack[] { - new ComparableStack(ModItems.casing, 2, EnumCasingType.LARGE_STEEL), - new OreDictStack(ANY_SMOKELESS.dust(), 24), - new ComparableStack(ModItems.item_secret, 1, EnumSecretType.SELENIUM_STEEL), - new ComparableStack(ModItems.black_diamond), - }, 1200, ModItems.journal_silver); - makeRecipe(new ComparableStack(ModBlocks.machine_silex, 1), new AStack[] { new ComparableStack(ModBlocks.glass_quartz, 16), !exp ? new OreDictStack(STEEL.plateCast(), 8) : new OreDictStack(STEEL.heavyComp(), 1), @@ -851,19 +805,6 @@ public class AssemblerRecipes extends SerializableRecipe { new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC) }, 400); - makeRecipe(new ComparableStack(ModBlocks.machine_chemfac, 1), new AStack[] { - !exp ? new OreDictStack(STEEL.ingot(), 48) : new OreDictStack(STEEL.heavyComp(), 2), - new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), - new OreDictStack(NB.ingot(), 4), - new OreDictStack(RUBBER.ingot(), 16), - new OreDictStack(STEEL.shell(), 12), - new ComparableStack(ModItems.tank_steel, 8), - new ComparableStack(ModItems.motor_desh, 4), - new ComparableStack(ModItems.coil_tungsten, 24), - new OreDictStack(STEEL.pipe(), 8), - new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC) - }, 400); - makeRecipe(new ComparableStack(ModBlocks.machine_chemical_factory, 1), new AStack[] { new OreDictStack(DURA.ingot(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), @@ -953,8 +894,8 @@ public class AssemblerRecipes extends SerializableRecipe { !exp ? new OreDictStack(STEEL.plateCast(), 8) : new OreDictStack(STEEL.heavyComp(), 2), !exp ? new OreDictStack(CU.plate528(), 16) : new OreDictStack(CU.heavyComp(), 1), new OreDictStack(RUBBER.ingot(), 8), + new OreDictStack(STEEL.shell(), 3), new ComparableStack(ModItems.ingot_firebrick, 16), - new ComparableStack(ModItems.tank_steel, 3), new ComparableStack(ModItems.coil_copper, 16), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BASIC) }, 200); @@ -1136,7 +1077,6 @@ public class AssemblerRecipes extends SerializableRecipe { if(!GeneralConfig.enable528) { makeRecipe(new ComparableStack(ModBlocks.machine_hephaestus, 1), new AStack[] { new OreDictStack(STEEL.pipe(), 12), !exp ? new OreDictStack(STEEL.ingot(), 24) : new OreDictStack(STEEL.heavyComp(), 2), !exp ? new OreDictStack(CU.plate(), 24) : new OreDictStack(CU.heavyComp(), 2), new OreDictStack(NB.ingot(), 4), new OreDictStack(RUBBER.ingot(), 12), new ComparableStack(ModBlocks.glass_quartz, 16) }, 150); - makeRecipe(new ComparableStack(ModBlocks.machine_radgen, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 8), new OreDictStack(STEEL.plate(), 32), new ComparableStack(ModItems.coil_magnetized_tungsten, 6), new OreDictStack(MAGTUNG.wireFine(), 24), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC), new ComparableStack(ModItems.reactor_core, 3), new OreDictStack(STAR.ingot(), 1), new OreDictStack("dyeRed", 1), }, 400, ModItems.journal_pip); makeRecipe(new ComparableStack(ModBlocks.machine_reactor_breeding, 1), new AStack[] {new ComparableStack(ModItems.reactor_core, 1), new OreDictStack(STEEL.ingot(), 12), new OreDictStack(PB.plate(), 16), new ComparableStack(ModBlocks.reinforced_glass, 4), new OreDictStack(ASBESTOS.ingot(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.crt_display, 1)},150); makeRecipe(new ComparableStack(ModBlocks.reactor_research, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.motor_desh, 2), new OreDictStack(B.ingot(), 5), new OreDictStack(PB.plate(), 8), new ComparableStack(ModItems.crt_display, 3), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC), },300); @@ -1230,8 +1170,8 @@ public class AssemblerRecipes extends SerializableRecipe { new ComparableStack(ModItems.motor_desh, 2), !exp ? new ComparableStack(ModItems.plate_desh, 6) : new OreDictStack(DESH.heavyComp()), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR), - new ComparableStack(ModItems.tank_steel, 24), - new ComparableStack(ModItems.pipes_steel, 2) + new OreDictStack(STEEL.shell(), 16), + new OreDictStack(STEEL.pipe(), 12) }, 600); makeRecipe(new ComparableStack(ModBlocks.machine_catalytic_cracker), new AStack[] { @@ -1267,8 +1207,8 @@ public class AssemblerRecipes extends SerializableRecipe { new OreDictStack(RUBBER.ingot(), 8), new OreDictStack(PB.plate528(), 12), new OreDictStack(CU.plateCast(), 4), - new ComparableStack(ModItems.thermo_element, 8), - new ComparableStack(ModItems.tank_steel, 3) + new OreDictStack(STEEL.shell(), 2), + new ComparableStack(ModItems.thermo_element, 8) }, 200); makeRecipe(new ComparableStack(ModBlocks.transition_seal, 1), new AStack[]{ @@ -1319,12 +1259,6 @@ public class AssemblerRecipes extends SerializableRecipe { } } - for(NTMMaterial mat : Mats.orderedList) { - if(mat.autogen.contains(MaterialShapes.CASTPLATE) && mat.autogen.contains(MaterialShapes.HEAVY_COMPONENT)) { - makeRecipe(new ComparableStack(ModItems.heavy_component, 1, mat.id), new AStack[] { new OreDictStack(MaterialShapes.CASTPLATE.name() + mat.names[0], 256) }, 12_000); - } - } - // WarTec compatibility code try { Class wartecmodAssemblerRecipes = ClassLoader.getSystemClassLoader().loadClass("com.wartec.wartecmod.inventory.wartecmodAssemblerRecipes"); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java new file mode 100644 index 000000000..73890a546 --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -0,0 +1,1048 @@ +package com.hbm.inventory.recipes; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import static com.hbm.inventory.OreDictManager.*; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockCap.EnumCapBlock; +import com.hbm.blocks.machine.BlockICFLaserComponent.EnumICFPart; +import com.hbm.config.GeneralConfig; +import com.hbm.inventory.FluidStack; +import com.hbm.inventory.OreDictManager; +import com.hbm.inventory.OreDictManager.DictFrame; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; +import com.hbm.items.ModItems; +import com.hbm.items.ItemEnums.EnumCasingType; +import com.hbm.items.ItemEnums.EnumExpensiveType; +import com.hbm.items.ItemEnums.EnumSecretType; +import com.hbm.items.ItemGenericPart.EnumPartType; +import com.hbm.items.machine.ItemFluidIcon; +import com.hbm.items.machine.ItemCircuit.EnumCircuitType; +import com.hbm.items.machine.ItemDrillbit.EnumDrillType; +import com.hbm.items.machine.ItemPACoil.EnumCoilType; +import com.hbm.items.machine.ItemPistons.EnumPistonType; +import com.hbm.items.weapon.ItemAmmoHIMARS; +import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; +import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; + +import cpw.mods.fml.common.Loader; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; + +public class AssemblyMachineRecipes extends GenericRecipes { + + public static final AssemblyMachineRecipes INSTANCE = new AssemblyMachineRecipes(); + + @Override public int inputItemLimit() { return 12; } + @Override public int inputFluidLimit() { return 1; } + @Override public int outputItemLimit() { return 1; } + @Override public int outputFluidLimit() { return 1; } + + @Override public String getFileName() { return "hbmAssemblyMachine.json"; } + @Override public GenericRecipe instantiateRecipe(String name) { return new GenericRecipe(name); } + + @Override + public void registerDefaults() { + + // plates and ingots + String autoPlate = "autoswitch.plates"; + this.register(new GenericRecipe("ass.plateiron").setup(60, 100).outputItems(new ItemStack(ModItems.plate_iron, 1)).inputItems(new OreDictStack(IRON.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.plategold").setup(60, 100).outputItems(new ItemStack(ModItems.plate_gold, 1)).inputItems(new OreDictStack(GOLD.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platetitanium").setup(60, 100).outputItems(new ItemStack(ModItems.plate_titanium, 1)).inputItems(new OreDictStack(TI.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platealu").setup(60, 100).outputItems(new ItemStack(ModItems.plate_aluminium, 1)).inputItems(new OreDictStack(AL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platesteel").setup(60, 100).outputItems(new ItemStack(ModItems.plate_steel, 1)).inputItems(new OreDictStack(STEEL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platelead").setup(60, 100).outputItems(new ItemStack(ModItems.plate_lead, 1)).inputItems(new OreDictStack(PB.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platecopper").setup(60, 100).outputItems(new ItemStack(ModItems.plate_copper, 1)).inputItems(new OreDictStack(CU.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platealloy").setup(60, 100).outputItems(new ItemStack(ModItems.plate_advanced_alloy, 1)).inputItems(new OreDictStack(ALLOY.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.plateschrab").setup(60, 100).outputItems(new ItemStack(ModItems.plate_schrabidium, 1)).inputItems(new OreDictStack(SA326.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platecmb").setup(60, 100).outputItems(new ItemStack(ModItems.plate_combine_steel, 1)).inputItems(new OreDictStack(CMB.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.plategunmetal").setup(60, 100).outputItems(new ItemStack(ModItems.plate_gunmetal, 1)).inputItems(new OreDictStack(GUNMETAL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.plateweaponsteel").setup(60, 100).outputItems(new ItemStack(ModItems.plate_weaponsteel, 1)).inputItems(new OreDictStack(WEAPONSTEEL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platesaturnite").setup(60, 100).outputItems(new ItemStack(ModItems.plate_saturnite, 1)).inputItems(new OreDictStack(BIGMT.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platedura").setup(60, 100).outputItems(new ItemStack(ModItems.plate_dura_steel, 1)).inputItems(new OreDictStack(DURA.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); + this.register(new GenericRecipe("ass.platemixed").setup(50, 100).outputItems(new ItemStack(ModItems.plate_mixed, 4)) + .inputItems(new OreDictStack(ALLOY.plate(), 2), new OreDictStack(OreDictManager.getReflector(), 1), new OreDictStack(BIGMT.plate(), 1))); + this.register(new GenericRecipe("ass.dalekanium").setup(200, 100).outputItems(new ItemStack(ModItems.plate_dalekanium, 1)) + .inputItems(new ComparableStack(ModBlocks.block_meteor, 1))); + this.register(new GenericRecipe("ass.platedesh").setup(200, 100).outputItems(new ItemStack(ModItems.plate_desh, 4)) + .inputItems(new OreDictStack(DESH.ingot(), 4), new OreDictStack(ANY_PLASTIC.dust(), 2), new OreDictStack(DURA.ingot(), 1))); + this.register(new GenericRecipe("ass.platebismuth").setup(200, 100).outputItems(new ItemStack(ModItems.plate_bismuth, 1)) + .inputItems(new ComparableStack(ModItems.nugget_bismuth, 2), new OreDictStack(U238.billet(), 2), new OreDictStack(NB.dust(), 1))); + this.register(new GenericRecipe("ass.plateeuphemium").setup(600, 100).outputItems(new ItemStack(ModItems.plate_euphemium, 1)) + .inputItems(new OreDictStack(EUPH.ingot(), 4), new OreDictStack(AT.dust(), 3), new OreDictStack(BI.dust(), 1), new OreDictStack(VOLCANIC.gem(), 1), new ComparableStack(ModItems.ingot_osmiridium))); + this.register(new GenericRecipe("ass.platednt").setup(600, 100).outputItems(new ItemStack(ModItems.plate_dineutronium, 4)) + .inputItems(new OreDictStack(DNT.ingot(), 4), new ComparableStack(ModItems.powder_spark_mix, 2), new OreDictStack(DESH.ingot(), 1))); + + // expensive parts + this.register(new GenericRecipe("ass.exsteelplating").setup(200, 400).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.STEEL_PLATING.ordinal())) + .inputItems(new OreDictStack(STEEL.plateCast(), 4), new OreDictStack(TI.plate(), 4), new OreDictStack(STEEL.bolt(), 16))); + this.register(new GenericRecipe("ass.exheavyframe").setup(600, 800).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME.ordinal())) + .inputItems(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.STEEL_PLATING), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(CU.plateWelded(), 4), new OreDictStack(DESH.ingot(), 1), new OreDictStack(DURA.bolt(), 32))); + this.register(new GenericRecipe("ass.excircuit").setup(400, 4_000).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.CIRCUIT.ordinal())) + .inputItems(new ComparableStack(ModItems.circuit, 12, EnumCircuitType.BASIC), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CAPACITOR), new OreDictStack(GOLD.wireFine(), 32)) + .inputFluids(new FluidStack(Fluids.SULFURIC_ACID, 1_000))); + this.register(new GenericRecipe("ass.exleadplating").setup(400, 4_000).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.LEAD_PLATING.ordinal())) + .inputItems(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.STEEL_PLATING), new OreDictStack(PB.plateCast(), 8), new OreDictStack(B.ingot(), 2), new OreDictStack(W.bolt(), 32)) + .inputFluids(new FluidStack(Fluids.LUBRICANT, 1_000))); + this.register(new GenericRecipe("ass.exferroplating").setup(1_200, 10_000).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.FERRO_PLATING.ordinal())) + .inputItems(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.LEAD_PLATING), new OreDictStack(FERRO.plateCast(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4)) + .inputFluids(new FluidStack(Fluids.UNSATURATEDS, 1_000))); + this.register(new GenericRecipe("ass.excomputer").setup(1_200, 16_000).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.COMPUTER.ordinal())) + .inputItems(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.CIRCUIT), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CONTROLLER), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CAPACITOR_BOARD), new ComparableStack(ModBlocks.glass_quartz, 8)) + .inputFluids(new FluidStack(Fluids.PERFLUOROMETHYL, 2_000))); + this.register(new GenericRecipe("ass.bronzetubes").setup(3_000, 250_000).outputItems(new ItemStack(ModItems.item_expensive, 1, EnumExpensiveType.BRONZE_TUBES.ordinal())) + .inputItems(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.FERRO_PLATING), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new OreDictStack(ZR.plateWelded(), 1)) + .inputFluids(new FluidStack(Fluids.PERFLUOROMETHYL_COLD, 4_000)) + .outputFluids(new FluidStack(Fluids.PERFLUOROMETHYL, 4_000))); + + // cloth + this.register(new GenericRecipe("ass.hazcloth").setup(50, 100).outputItems(new ItemStack(ModItems.hazmat_cloth, 4)) + .inputItems(new OreDictStack(PB.dust(), 4), new ComparableStack(Items.string, 8))); + this.register(new GenericRecipe("ass.firecloth").setup(50, 100).outputItems(new ItemStack(ModItems.asbestos_cloth, 4)) + .inputItems(new OreDictStack(ASBESTOS.ingot(), 1), new ComparableStack(Items.string, 8))); + this.register(new GenericRecipe("ass.filtercoal").setup(50, 100).outputItems(new ItemStack(ModItems.filter_coal, 1)) + .inputItems(new OreDictStack(COAL.dust(), 4), new ComparableStack(Items.string, 2), new ComparableStack(Items.paper, 1))); + + // machine parts + this.register(new GenericRecipe("ass.centrifugetower").setup(100, 100).outputItems(new ItemStack(ModItems.centrifuge_element, 1)) + .inputItems(new OreDictStack(DURA.plate528(), 4), new OreDictStack(TI.plate528(), 4), new ComparableStack(ModItems.motor, 1))); + this.register(new GenericRecipe("ass.reactorcore").setup(100, 100).outputItems(new ItemStack(ModItems.reactor_core, 1)) + .inputItems(new OreDictStack(PB.plateCast(), 4), new OreDictStack(BE.ingot(), 8), new OreDictStack(OreDictManager.getReflector(), 8), new OreDictStack(ASBESTOS.ingot(), 4))); + this.register(new GenericRecipe("ass.thermoelement").setup(60, 100).outputItems(new ItemStack(ModItems.thermo_element, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 1), new OreDictStack(MINGRADE.wireFine(), 2), new OreDictStack(NETHERQUARTZ.dust(), 2))); + this.register(new GenericRecipe("ass.thermoelementsilicon").setup(60, 100).outputItems(new ItemStack(ModItems.thermo_element, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 1), new OreDictStack(GOLD.wireFine(), 2), new OreDictStack(SI.billet(), 1))); + this.register(new GenericRecipe("ass.rtgunit").setup(100, 100).outputItems(new ItemStack(ModItems.rtg_unit, 1)) + .inputItems(new OreDictStack(PB.plateCast(), 2), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.thermo_element, 2))); + this.register(new GenericRecipe("ass.magnetron").setup(40, 100).outputItems(new ItemStack(ModItems.magnetron, 1)) + .inputItems(new OreDictStack(CU.plate(), 3), new OreDictStack(W.wireFine(), 4))); + this.register(new GenericRecipe("ass.titaniumdrill").setup(100, 100).outputItems(new ItemStack(ModItems.drill_titanium, 1)) + .inputItems(new OreDictStack(DURA.plateCast(), 1), new OreDictStack(TI.plate(), 8))); + this.register(new GenericRecipe("ass.entanglementkit").setup(200, 100).outputItems(new ItemStack(ModItems.entanglement_kit, 1)) + .inputItems(new OreDictStack(DURA.plateCast(), 4), new OreDictStack(CU.plate(), 24), new OreDictStack(GOLD.wireDense(), 16)) + .inputFluids(new FluidStack(Fluids.XENON, 8_000))); + this.register(new GenericRecipe("ass.protoreactor").setup(200, 100).outputItems(new ItemStack(ModItems.dysfunctional_reactor, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(PB.plateCast(), 4), new ComparableStack(ModItems.rod_quad_empty, 10), new OreDictStack(KEY_BROWN, 3))); + + // powders + this.register(new GenericRecipe("ass.partlith").setup(40, 100).outputItems(new ItemStack(ModItems.part_lithium, 8)) + .inputItems(new OreDictStack(LI.dust(), 1))); + this.register(new GenericRecipe("ass.partberyl").setup(40, 100).outputItems(new ItemStack(ModItems.part_beryllium, 8)) + .inputItems(new OreDictStack(BE.dust(), 1))); + this.register(new GenericRecipe("ass.partcoal").setup(40, 100).outputItems(new ItemStack(ModItems.part_carbon, 8)) + .inputItems(new OreDictStack(COAL.dust(), 1))); + this.register(new GenericRecipe("ass.partcop").setup(40, 100).outputItems(new ItemStack(ModItems.part_copper, 8)) + .inputItems(new OreDictStack(CU.dust(), 1))); + this.register(new GenericRecipe("ass.partplut").setup(40, 100).outputItems(new ItemStack(ModItems.part_plutonium, 8)) + .inputItems(new OreDictStack(PU.dust(), 1))); + + // bunker blocks + this.register(new GenericRecipe("ass.cmbtile").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick, 8)) + .inputItems(new OreDictStack(ANY_CONCRETE.any(), 4), new OreDictStack(CMB.plate(), 4))); + this.register(new GenericRecipe("ass.cmbbrick").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick_reinforced, 8)) + .inputItems(new OreDictStack(MAGTUNG.ingot(), 8), new ComparableStack(ModBlocks.ducrete, 4), new ComparableStack(ModBlocks.cmb_brick, 8))); + this.register(new GenericRecipe("ass.sealframe").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_frame, 1)) + .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(MINGRADE.wireDense(), 1))); + this.register(new GenericRecipe("ass.sealcontroller").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_controller, 1)) + .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(MINGRADE.wireDense(), 4))); + + // blocks + this.register(new GenericRecipe("ass.yellowbarrel").setup(400, 400).outputItems(new ItemStack(ModBlocks.yellow_barrel, 1)) + .inputItems(new ComparableStack(ModItems.tank_steel, 1), new OreDictStack(PB.plate(), 2), new ComparableStack(ModItems.nuclear_waste, 10))); + this.register(new GenericRecipe("ass.vitrifiedbarrel").setup(400, 400).outputItems(new ItemStack(ModBlocks.vitrified_barrel, 1)) + .inputItems(new ComparableStack(ModItems.tank_steel, 1), new OreDictStack(PB.plate(), 2), new ComparableStack(ModItems.nuclear_waste_vitrified, 10))); + + // nuclear door mod + this.register(new GenericRecipe("ass.vaultdoor").setup(600, 100).outputItems(new ItemStack(ModBlocks.vault_door, 1)) + .inputItems(new OreDictStack(STEEL.ingot(), 32), new OreDictStack(DURA.ingot(), 32), new OreDictStack(PB.plateCast(), 8), new OreDictStack(ANY_RUBBER.ingot(), 12), new OreDictStack(DURA.bolt(), 32), new ComparableStack(ModItems.motor, 3))); + this.register(new GenericRecipe("ass.blastdoor").setup(200, 100).outputItems(new ItemStack(ModBlocks.blast_door, 1)) + .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(PB.plate(), 6), new OreDictStack(ALLOY.plate(), 6), new OreDictStack(ANY_RUBBER.ingot(), 2), new OreDictStack(DURA.bolt(), 8), new ComparableStack(ModItems.motor, 1))); + this.register(new GenericRecipe("ass.firedoor").setup(300, 100).outputItems(new ItemStack(ModBlocks.fire_door, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 16), new OreDictStack(ALLOY.plate(), 8), new OreDictStack(DURA.bolt(), 8), new ComparableStack(ModItems.motor, 2))); + this.register(new GenericRecipe("ass.seal").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.transition_seal, 1)) + .inputItems(new ComparableStack(ModBlocks.cmb_brick_reinforced, 16), new OreDictStack(STEEL.plate(), 64), new OreDictStack(ALLOY.plate(), 40), new OreDictStack(ANY_RUBBER.ingot(), 36), new OreDictStack(STEEL.block(), 24), new ComparableStack(ModItems.motor_desh, 16), new OreDictStack(DURA.bolt(), 16), new OreDictStack(KEY_YELLOW, 4))); + this.register(new GenericRecipe("ass.slidingdoor").setup(200, 100).outputItems(new ItemStack(ModBlocks.sliding_blast_door, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 16), new OreDictStack(W.ingot(), 8), new ComparableStack(ModBlocks.reinforced_glass, 4), new OreDictStack(ANY_RUBBER.ingot(), 4), new OreDictStack(DURA.bolt(), 16), new ComparableStack(ModItems.motor, 2))); + this.register(new GenericRecipe("ass.vehicledoor").setup(400, 100).outputItems(new ItemStack(ModBlocks.large_vehicle_door, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 16), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 16), new OreDictStack(KEY_GREEN, 4))); + this.register(new GenericRecipe("ass.waterdoor").setup(200, 100).outputItems(new ItemStack(ModBlocks.water_door, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 16), new OreDictStack(DURA.bolt(), 4), new OreDictStack(KEY_RED, 1))); + this.register(new GenericRecipe("ass.qedoor").setup(400, 100).outputItems(new ItemStack(ModBlocks.qe_containment, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 4), new OreDictStack(ALLOY.plate(), 4), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 2), new OreDictStack(DURA.bolt(), 32), new OreDictStack(KEY_BLACK, 4))); + this.register(new GenericRecipe("ass.queslidingdoor").setup(200, 100).outputItems(new ItemStack(ModBlocks.qe_sliding_door, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 4), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack(KEY_WHITE, 4), new ComparableStack(Blocks.glass, 4))); + this.register(new GenericRecipe("ass.roundairlock").setup(400, 100).outputItems(new ItemStack(ModBlocks.round_airlock_door, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ALLOY.plate(), 8), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 16), new OreDictStack(KEY_GREEN, 4))); + this.register(new GenericRecipe("ass.secureaccess").setup(400, 100).outputItems(new ItemStack(ModBlocks.secure_access_door, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ALLOY.plate(), 16), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 32), new OreDictStack(KEY_RED, 8))); + this.register(new GenericRecipe("ass.slidingseal").setup(200, 100).outputItems(new ItemStack(ModBlocks.sliding_seal_door, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack(KEY_WHITE, 2))); + this.register(new GenericRecipe("ass.silohatch").setup(200, 100).outputItems(new ItemStack(ModBlocks.silo_hatch, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 4), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(STEEL.bolt(), 16), new OreDictStack(KEY_GREEN, 4))); + this.register(new GenericRecipe("ass.silohatchlarge").setup(300, 100).outputItems(new ItemStack(ModBlocks.silo_hatch_large, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 6), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 2), new OreDictStack(STEEL.bolt(), 16), new OreDictStack(KEY_GREEN, 8))); + + // decoration + this.register(new GenericRecipe("ass.capnuka").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.NUKA)) + .inputItems(new ComparableStack(ModItems.cap_nuka, 64), new ComparableStack(ModItems.cap_nuka, 64))); + this.register(new GenericRecipe("ass.capquantum").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.QUANTUM)) + .inputItems(new ComparableStack(ModItems.cap_quantum, 64), new ComparableStack(ModItems.cap_quantum, 64))); + this.register(new GenericRecipe("ass.capsparkle").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.SPARKLE)) + .inputItems(new ComparableStack(ModItems.cap_sparkle, 64), new ComparableStack(ModItems.cap_sparkle, 64))); + this.register(new GenericRecipe("ass.caprad").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.RAD)) + .inputItems(new ComparableStack(ModItems.cap_rad, 64), new ComparableStack(ModItems.cap_rad, 64))); + this.register(new GenericRecipe("ass.capfritz").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.FRITZ)) + .inputItems(new ComparableStack(ModItems.cap_fritz, 64), new ComparableStack(ModItems.cap_fritz, 64))); + this.register(new GenericRecipe("ass.capkorl").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.KORL)) + .inputItems(new ComparableStack(ModItems.cap_korl, 64), new ComparableStack(ModItems.cap_korl, 64))); + /* + this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) + .inputItems()); + */ + + // machines + this.register(new GenericRecipe("ass.shredder").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_shredder, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2))); + this.register(new GenericRecipe("ass.chemplant").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_plant, 1)) + .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.coil_tungsten, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.coil_tungsten, 2), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.purex").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_purex, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(RUBBER.pipe(), 8), new OreDictStack(PB.plateCast(), 4), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.LEAD_PLATING), new OreDictStack(STEEL.shell(), 4), new OreDictStack(RUBBER.pipe(), 12), new ComparableStack(ModItems.motor_desh, 3), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.CIRCUIT))); + this.register(new GenericRecipe("ass.centrifuge").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_centrifuge, 1)) + .inputItems(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG)) + .inputItemsEx(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.plateCast(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.gascent").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_gascent, 1)) + .inputItems(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(DESH.ingot(), 2), new OreDictStack(STEEL.plate528(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal())) + .inputItemsEx(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(STEEL.plateWelded(), 4), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.CIRCUIT))); + this.register(new GenericRecipe("ass.arcfurnace").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_arc_furnace, 1)) + .inputItems(new OreDictStack(ANY_CONCRETE.any(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.ingot_firebrick, 16),new OreDictStack(STEEL.plateCast(), 8), new ComparableStack(ModBlocks.machine_transformer, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG.ordinal())) + .inputItemsEx(new OreDictStack(ANY_CONCRETE.any(), 12), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.ingot_firebrick, 16), new ComparableStack(ModBlocks.machine_transformer, 1), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG.ordinal()))); + this.register(new GenericRecipe("ass.acidizer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_crystallizer, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(TI.shell(), 3), new OreDictStack(DESH.ingot(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(TI.shell(), 3), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.CIRCUIT))); + this.register(new GenericRecipe("ass.electrolyzer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_electrolyser, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(CU.plate528(), 16), new OreDictStack(TI.shell(), 3), new OreDictStack(RUBBER.ingot(), 8), new ComparableStack(ModItems.ingot_firebrick, 16), new ComparableStack(ModItems.coil_copper, 16), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(TI.shell(), 3), new OreDictStack(RUBBER.ingot(), 8), new ComparableStack(ModItems.ingot_firebrick, 16), new ComparableStack(ModItems.coil_copper, 16), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.CIRCUIT))); + this.register(new GenericRecipe("ass.rtg").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_rtg_grey, 1)) + .inputItems(new ComparableStack(ModItems.rtg_unit, 3), new OreDictStack(STEEL.plate528(), 4), new OreDictStack(MINGRADE.wireFine(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 4))); + this.register(new GenericRecipe("ass.derrick").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_well, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(CU.plateCast(), 2), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.drill_titanium, 1)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.STEEL_PLATING), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.drill_titanium, 1))); + this.register(new GenericRecipe("ass.pumpjack").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_pumpjack, 1)) + .inputItems(new OreDictStack(DURA.plate(), 8), new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.motor_desh), new ComparableStack(ModItems.drill_titanium, 1)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.motor_desh, 3), new ComparableStack(ModItems.drill_titanium, 1))); + this.register(new GenericRecipe("ass.fracker").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_fracking_tower, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 24), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModBlocks.concrete_smooth, 64), new ComparableStack(ModItems.drill_titanium), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.plate_desh, 24), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.FERRO_PLATING), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModBlocks.concrete_smooth, 64), new ComparableStack(ModItems.drill_titanium), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.CIRCUIT))); + this.register(new GenericRecipe("ass.flarestack").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_flare, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 12), new OreDictStack(CU.plate528(), 4), new OreDictStack(STEEL.shell(), 4), new ComparableStack(ModItems.thermo_element, 3)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.plate528(), 4), new ComparableStack(ModItems.thermo_element, 3))); + this.register(new GenericRecipe("ass.refinery").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_refinery, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 3), new OreDictStack(CU.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.STEEL_PLATING), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.circuit, 5, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.crackingtower").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_catalytic_cracker, 1)) + .inputItems(new ComparableStack(ModBlocks.steel_scaffold, 16), new OreDictStack(STEEL.shell(), 6), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(NB.ingot(), 2), new ComparableStack(ModItems.catalyst_clay, 12)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 6, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_PLASTIC.ingot(), 16), new OreDictStack(NB.ingot(), 4))); + this.register(new GenericRecipe("ass.radiolysis").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_radiolysis, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(PB.plate528(), 12), new OreDictStack(CU.plateCast(), 4), new OreDictStack(RUBBER.ingot(), 8), new ComparableStack(ModItems.thermo_element, 8)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.LEAD_PLATING), new OreDictStack(CU.plateCast(), 4), new OreDictStack(RUBBER.ingot(), 16), new ComparableStack(ModItems.thermo_element, 8))); + this.register(new GenericRecipe("ass.coker").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_coker, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(CU.plate528(), 8), new OreDictStack(RUBBER.ingot(), 4), new OreDictStack(NB.ingot(), 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(NB.ingot(), 4))); + this.register(new GenericRecipe("ass.vaccumrefinery").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_vacuum_distill, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(CU.plate528(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.motor_desh, 3), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CHIP_BISMOID)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.BRONZE_TUBES), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.FERRO_PLATING), new OreDictStack(DURA.pipe(), 16), new ComparableStack(ModItems.motor_desh, 3), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CHIP_BISMOID), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.COMPUTER))); + this.register(new GenericRecipe("ass.reformer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_catalytic_reformer, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(CU.plate528(), 8), new OreDictStack(NB.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(STEEL.shell(), 3), new OreDictStack(STEEL.pipe(), 8), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.BRONZE_TUBES), new OreDictStack(NB.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(DURA.pipe(), 16), new ComparableStack(ModItems.motor, 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.COMPUTER))); + this.register(new GenericRecipe("ass.hydrotreater").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_hydrotreater, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(CU.plateCast(), 4), new OreDictStack(NB.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(STEEL.shell(), 2), new OreDictStack(STEEL.pipe(), 8), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.BRONZE_TUBES), new OreDictStack(NB.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(DURA.pipe(), 16), new ComparableStack(ModItems.motor_desh, 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.COMPUTER))); + this.register(new GenericRecipe("ass.pyrooven").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_pyrooven, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.ingot_cft, 4), new OreDictStack(CU.pipe(), 12), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 6, EnumExpensiveType.BRONZE_TUBES), new OreDictStack(ANY_HARDPLASTIC.ingot(), 32), new ComparableStack(ModItems.ingot_cft, 4), new ComparableStack(ModItems.motor_bismuth, 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.COMPUTER))); + this.register(new GenericRecipe("ass.liquefactor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_liquefactor, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(CU.plate528(), 12), new OreDictStack(ANY_TAR.any(), 4), new ComparableStack(ModItems.circuit, 12, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.coil_tungsten, 8)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_TAR.any(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR))); + this.register(new GenericRecipe("ass.solidifier").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_solidifier, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(AL.plate528(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 4), new ComparableStack(ModItems.circuit, 12, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.coil_copper, 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR))); + this.register(new GenericRecipe("ass.compressor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_compressor, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(CU.plate528(), 4), new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.STEEL_PLATING), new OreDictStack(STEEL.shell(), 4), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.compactcompressor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_compressor_compact, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(TI.shell(), 4), new OreDictStack(CU.pipe(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.pipe(), 16), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.CIRCUIT))); + this.register(new GenericRecipe("ass.epress").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_epress, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(ANY_RUBBER.ingot(), 4), new ComparableStack(ModItems.part_generic, 2, EnumPartType.PISTON_HYDRAULIC.ordinal()), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.part_generic, 4, EnumPartType.PISTON_HYDRAULIC.ordinal()), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.fel").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_fel, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 1), new OreDictStack(ALLOY.wireDense(), 64), new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.part_generic, 4, EnumPartType.GLASS_POLARIZED), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.FERRO_PLATING), new OreDictStack(ALLOY.wireDense(), 64), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.part_generic, 4, EnumPartType.GLASS_POLARIZED), new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.CIRCUIT))); + this.register(new GenericRecipe("ass.silex").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_silex, 1)) + .inputItems(new ComparableStack(ModBlocks.glass_quartz, 16), new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(DESH.ingot(), 4), new OreDictStack(RUBBER.ingot(), 8), new OreDictStack(STEEL.pipe(), 8)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.FERRO_PLATING), new ComparableStack(ModBlocks.glass_quartz, 16), new OreDictStack(RUBBER.ingot(), 16))); + this.register(new GenericRecipe("ass.excavator").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_excavator, 1)) + .inputItems(new ComparableStack(Blocks.stonebrick, 8), new OreDictStack(STEEL.ingot(), 8), new OreDictStack(IRON.ingot(), 8), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.drillsteel").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.STEEL.ordinal())) + .inputItems(new OreDictStack(STEEL.ingot(), 12), new OreDictStack(W.ingot(), 4))); + this.register(new GenericRecipe("ass.drillsteeldiamond").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.STEEL_DIAMOND.ordinal())) + .inputItems(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.STEEL.ordinal()), new OreDictStack(DIAMOND.dust(), 16))); + this.register(new GenericRecipe("ass.drilldura").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.HSS.ordinal())) + .inputItems(new OreDictStack(DURA.ingot(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 12), new OreDictStack(TI.ingot(), 8))); + this.register(new GenericRecipe("ass.drillduradiamond").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.HSS_DIAMOND.ordinal())) + .inputItems(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.HSS.ordinal()), new OreDictStack(DIAMOND.dust(), 24))); + this.register(new GenericRecipe("ass.drilldesh").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.DESH.ordinal())) + .inputItems(new OreDictStack(DESH.ingot(), 16), new OreDictStack(RUBBER.ingot(), 12), new OreDictStack(NB.ingot(), 4))); + this.register(new GenericRecipe("ass.drilldeshdiamond").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.DESH_DIAMOND.ordinal())) + .inputItems(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.DESH.ordinal()), new OreDictStack(DIAMOND.dust(), 32))); + this.register(new GenericRecipe("ass.drilltc").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.TCALLOY.ordinal())) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.ingot(), 20), new OreDictStack(DESH.ingot(), 12), new OreDictStack(RUBBER.ingot(), 8))); + this.register(new GenericRecipe("ass.drilltcdiamond").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.TCALLOY_DIAMOND.ordinal())) + .inputItems(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.TCALLOY.ordinal()), new OreDictStack(DIAMOND.dust(), 48))); + this.register(new GenericRecipe("ass.drillferro").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.FERRO.ordinal())) + .inputItems(new OreDictStack(FERRO.ingot(), 24), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 12), new OreDictStack(BI.ingot(), 4))); + this.register(new GenericRecipe("ass.drillferrodiamond").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.FERRO_DIAMOND.ordinal())) + .inputItems(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.FERRO.ordinal()), new OreDictStack(DIAMOND.dust(), 56))); + this.register(new GenericRecipe("ass.slopper").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_ore_slopper, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(TI.plate(), 8), new OreDictStack(CU.pipe(), 3), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.mininglaser").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_mining_laser, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(TI.shell(), 4), new OreDictStack(DURA.plate(), 4), new ComparableStack(ModItems.crystal_redstone, 3), new ComparableStack(Items.diamond, 3), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.motor, 3)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(DURA.plate(), 4), new ComparableStack(ModItems.crystal_redstone, 12), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.motor_desh, 3))); + this.register(new GenericRecipe("ass.teleporter").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_teleporter, 1)) + .inputItems(new OreDictStack(TI.plate(), 12), new OreDictStack(ALLOY.plate528(), 12), new OreDictStack(GOLD.wireFine(), 32), new ComparableStack(ModItems.entanglement_kit, 1), new ComparableStack(ModBlocks.machine_battery, 1))); + this.register(new GenericRecipe("ass.radar").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_radar, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 12), new OreDictStack(ANY_RUBBER.ingot(), 12), new ComparableStack(ModItems.magnetron, 5), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BASIC.ordinal()), new ComparableStack(ModItems.crt_display, 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.CIRCUIT), new ComparableStack(ModItems.crt_display, 4))); + this.register(new GenericRecipe("ass.radarlarge").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_radar_large, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 6), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_RUBBER.ingot(), 24), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.crt_display, 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(ANY_RUBBER.ingot(), 24), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.motor_desh, 3), new ComparableStack(ModItems.item_expensive, 6, EnumExpensiveType.CIRCUIT), new ComparableStack(ModItems.crt_display, 4))); + this.register(new GenericRecipe("ass.forcefield").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_forcefield, 1)) + .inputItems(new OreDictStack(ALLOY.plate528(), 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, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModBlocks.machine_transformer, 1))); + this.register(new GenericRecipe("ass.difurnacertg").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_difurnace_rtg_off, 1)) + .inputItems(new ComparableStack(ModItems.rtg_unit, 3), new OreDictStack(DESH.ingot(), 4), new OreDictStack(PB.plate528(), 6), new OreDictStack(OreDictManager.getReflector(), 8), new OreDictStack(CU.plate(), 12))); + this.register(new GenericRecipe("ass.strandcaster").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_strand_caster, 1)) + .inputItems(new ComparableStack(ModItems.ingot_firebrick, 16), new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(CU.plateWelded(), 2), new OreDictStack(STEEL.shell(), 2), new OreDictStack(ANY_CONCRETE.any(), 8)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.ingot_firebrick, 16), new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_CONCRETE.any(), 8))); + this.register(new GenericRecipe("ass.chemfac").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_factory, 1)) + .inputItems(new OreDictStack(DURA.ingot(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(STEEL.shell(), 12), new OreDictStack(CU.pipe(), 8), new ComparableStack(ModItems.motor_desh, 4), new ComparableStack(ModItems.coil_tungsten, 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(STEEL.shell(), 12), new OreDictStack(CU.pipe(), 16), new ComparableStack(ModItems.motor_desh, 16), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.CIRCUIT))); + + // generators + this.register(new GenericRecipe("ass.dieselgen").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_diesel, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 1), new OreDictStack(CU.plateCast(), 2), new ComparableStack(ModItems.coil_copper, 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.coil_copper, 4))); + this.register(new GenericRecipe("ass.combustiongen").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_combustion_engine, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(CU.ingot(), 12), new OreDictStack(GOLD.wireDense(), 8), new ComparableStack(ModItems.canister_empty, 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(GOLD.wireDense(), 16), new ComparableStack(ModItems.canister_empty, 4), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.CIRCUIT))); + this.register(new GenericRecipe("ass.pistonsetsteel").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.STEEL.ordinal())) + .inputItems(new OreDictStack(STEEL.plate(), 16), new OreDictStack(CU.plate(), 4), new OreDictStack(W.ingot(), 8), new OreDictStack(W.bolt(), 16))); + this.register(new GenericRecipe("ass.pistonsetdura").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.DURA.ordinal())) + .inputItems(new OreDictStack(DURA.ingot(), 24), new OreDictStack(TI.plate(), 8), new OreDictStack(W.ingot(), 8), new OreDictStack(DURA.bolt(), 16))); + this.register(new GenericRecipe("ass.pistonsetdesh").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.DESH.ordinal())) + .inputItems(new OreDictStack(DESH.ingot(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 12), new OreDictStack(CU.plate(), 24), new OreDictStack(W.ingot(), 16), new OreDictStack(DURA.pipe(), 4))); + this.register(new GenericRecipe("ass.pistonsetstar").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.STARMETAL.ordinal())) + .inputItems(new OreDictStack(STAR.ingot(), 24), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(BIGMT.plate(), 24), new OreDictStack(NB.ingot(), 16), new OreDictStack(DURA.pipe(), 4))); + this.register(new GenericRecipe("ass.turbofan").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_turbofan, 1)) + .inputItems(new OreDictStack(TI.shell(), 8), new OreDictStack(DURA.pipe(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 12), new ComparableStack(ModItems.turbine_tungsten, 1), new OreDictStack(GOLD.wireDense(), 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal())) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.turbine_tungsten, 3), new OreDictStack(GOLD.wireDense(), 16), new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.CIRCUIT))); + this.register(new GenericRecipe("ass.gasturbine").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_turbinegas, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 10), new OreDictStack(GOLD.wireDense(), 12), new OreDictStack(DURA.pipe(), 4),new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.turbine_tungsten, 1), new ComparableStack(ModItems.ingot_rubber, 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal())) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.FERRO_PLATING), new OreDictStack(GOLD.wireDense(), 16), new OreDictStack(DURA.pipe(), 16), new ComparableStack(ModItems.turbine_tungsten, 2), new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.CIRCUIT))); + this.register(new GenericRecipe("ass.hephaestus").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_hephaestus, 1)) + .inputItems(new OreDictStack(STEEL.pipe(), 12), new OreDictStack(STEEL.ingot(), 24), new OreDictStack(CU.plate(), 24), new OreDictStack(NB.ingot(), 4), new OreDictStack(RUBBER.ingot(), 12), new ComparableStack(ModBlocks.glass_quartz, 16)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(NB.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new ComparableStack(ModBlocks.glass_quartz, 16))); + this.register(new GenericRecipe("ass.iturbine").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_large_turbine, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 12), new OreDictStack(RUBBER.ingot(), 4), new ComparableStack(ModItems.turbine_titanium, 3), new OreDictStack(GOLD.wireDense(), 6), new OreDictStack(DURA.pipe(), 3), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.turbine_titanium, 3), new OreDictStack(GOLD.wireDense(), 16), new OreDictStack(DURA.pipe(), 16), new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.CIRCUIT))); + this.register(new GenericRecipe("ass.leviturbine").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_chungus, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 6), new OreDictStack(STEEL.plateWelded(), 16), new OreDictStack(TI.plate528(), 12), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 16), new ComparableStack(ModItems.turbine_tungsten, 5), new ComparableStack(ModItems.turbine_titanium, 3), new ComparableStack(ModItems.flywheel_beryllium, 1), new OreDictStack(GOLD.wireDense(), 48), new OreDictStack(DURA.pipe(), 16), new OreDictStack(STEEL.pipe(), 16)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.FERRO_PLATING), new ComparableStack(ModItems.turbine_tungsten, 5), new ComparableStack(ModItems.turbine_titanium, 12), new ComparableStack(ModItems.flywheel_beryllium, 1), new OreDictStack(GOLD.wireDense(), 64))); + this.register(new GenericRecipe("ass.radgen").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_radgen, 1)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "radgen") + .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(STEEL.plate(), 32), new ComparableStack(ModItems.coil_magnetized_tungsten, 6), new OreDictStack(MAGTUNG.wireFine(), 24), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC), new ComparableStack(ModItems.reactor_core, 3), new OreDictStack(STAR.ingot(), 1), new OreDictStack(KEY_RED, 1)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new ComparableStack(ModItems.coil_magnetized_tungsten, 16), new ComparableStack(ModItems.reactor_core, 3), new OreDictStack(STAR.ingot(), 1), new OreDictStack(KEY_RED, 1), new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.CIRCUIT))); + + // condensers + this.register(new GenericRecipe("ass.hpcondenser").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_condenser_powered, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 4), new OreDictStack(CU.plate528(), 16), new ComparableStack(ModItems.motor_desh, 3), new OreDictStack(STEEL.pipe(), 24), new OreDictStack(Fluids.LUBRICANT.getDict(1_000), 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.FERRO_PLATING), new ComparableStack(ModItems.motor_desh, 5), new OreDictStack(STEEL.pipe(), 24), new OreDictStack(Fluids.LUBRICANT.getDict(1_000), 16))); + + // batteries + this.register(new GenericRecipe("ass.battery").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 1), new OreDictStack(S.dust(), 12), new OreDictStack(PB.dust(), 12))); + this.register(new GenericRecipe("ass.batterylithium").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_lithium_battery, 1)) + .inputItems(new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(CO.dust(), 12), new OreDictStack(LI.dust(), 12))); + this.register(new GenericRecipe("ass.batteryschrabidium").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_schrabidium_battery, 1)) + .inputItems(new OreDictStack(DESH.ingot(), 16), new OreDictStack(NP237.dust(), 12), new OreDictStack(SA326.dust(), 12))); + this.register(new GenericRecipe("ass.batterydnt").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_dineutronium_battery, 1)) + .inputItems(new OreDictStack(DNT.ingot(), 24), new ComparableStack(ModItems.powder_spark_mix, 12), new ComparableStack(ModItems.battery_spark_cell_1000, 1), new OreDictStack(CMB.ingot(), 32))); + this.register(new GenericRecipe("ass.fensusan").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.machine_fensu, 1)) + .inputItems(new ComparableStack(ModItems.ingot_electronium, 32), + new ComparableStack(ModBlocks.machine_dineutronium_battery, 16), + new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 64), + new OreDictStack(DURA.block(), 16), + new OreDictStack(STAR.block(), 64), + new ComparableStack(ModBlocks.machine_transformer_dnt, 8), + new ComparableStack(ModItems.coil_magnetized_tungsten, 24), + new ComparableStack(ModItems.powder_magic, 64), + new ComparableStack(ModItems.plate_dineutronium, 24), + new ComparableStack(ModItems.ingot_u238m2), + new ComparableStack(ModItems.ingot_cft, 64), + new ComparableStack(ModItems.ingot_cft, 64)) + .inputItemsEx(new ComparableStack(ModItems.ingot_electronium, 64), + new ComparableStack(ModBlocks.machine_dineutronium_battery, 16), + new ComparableStack(ModItems.item_expensive, 64, EnumExpensiveType.BRONZE_TUBES), + new ComparableStack(ModItems.item_expensive, 64, EnumExpensiveType.FERRO_PLATING), + new OreDictStack(STAR.block(), 64), + new ComparableStack(ModBlocks.machine_transformer_dnt, 8), + new ComparableStack(ModItems.coil_magnetized_tungsten, 24), + new ComparableStack(ModItems.powder_magic, 64), + new ComparableStack(ModItems.plate_dineutronium, 24), + new ComparableStack(ModItems.ingot_u238m2), + new ComparableStack(ModItems.ingot_cft, 64), + new ComparableStack(ModItems.ingot_cft, 64))); + + // fluid tanks + this.register(new GenericRecipe("ass.tank").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_fluidtank, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_TAR.any(), 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.STEEL_PLATING), new OreDictStack(ANY_TAR.any(), 4))); + this.register(new GenericRecipe("ass.bat9k").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_bat9000, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 2), new ComparableStack(ModBlocks.steel_scaffold, 16), new OreDictStack(ANY_TAR.any(), 16)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.FERRO_PLATING), new ComparableStack(ModBlocks.steel_scaffold, 16), new OreDictStack(ANY_TAR.any(), 16))); + this.register(new GenericRecipe("ass.orbus").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_orbus, 1)) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 8), new OreDictStack(BIGMT.plateCast(), 4), new ComparableStack(ModItems.coil_advanced_alloy, 12), new ComparableStack(ModItems.battery_sc_polonium, 1)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.FERRO_PLATING), new OreDictStack(BIGMT.plateCast(), 16), new ComparableStack(ModItems.coil_advanced_alloy, 24), new ComparableStack(ModItems.battery_sc_polonium, 1))); + + // accelerators + this.register(new GenericRecipe("ass.cyclotron").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_cyclotron, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 3), new OreDictStack(ND.wireDense(), 32), new OreDictStack(STEEL.ingot(), 16), new OreDictStack(STEEL.plate528(), 32), new OreDictStack(AL.plate528(), 32), new OreDictStack(ANY_PLASTIC.ingot(), 24), new OreDictStack(RUBBER.ingot(), 24), new OreDictStack(CU.plateCast(), 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.FERRO_PLATING), new OreDictStack(ND.wireDense(), 32), new OreDictStack(AL.plateWelded(), 16), new OreDictStack(RUBBER.ingot(), 32), new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.CIRCUIT))); + this.register(new GenericRecipe("ass.beamline").setup(200, 100).outputItems(new ItemStack(ModBlocks.pa_beamline, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(CU.plate(), 16), new OreDictStack(GOLD.wireDense(), 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.STEEL_PLATING), new OreDictStack(CU.plate(), 16), new OreDictStack(GOLD.wireDense(), 4))); + this.register(new GenericRecipe("ass.rfc").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_rfc, 1)) + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(CU.plate(), 64), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.magnetron, 16)) + .inputItemsEx(new ComparableStack(ModBlocks.pa_beamline, 3), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.LEAD_PLATING), new OreDictStack(CU.plate(), 64), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.magnetron, 16))); + this.register(new GenericRecipe("ass.quadrupole").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_quadrupole, 1)) + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 1), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID)) + .inputItemsEx(new ComparableStack(ModBlocks.pa_beamline, 1), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.COMPUTER))); + this.register(new GenericRecipe("ass.dipole").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_dipole, 1)) + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 2), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 32), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID)) + .inputItemsEx(new ComparableStack(ModBlocks.pa_beamline, 2), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_HARDPLASTIC.ingot(), 32), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.COMPUTER))); + this.register(new GenericRecipe("ass.source").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_source, 1)) + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.QUANTUM)) + .inputItemsEx(new ComparableStack(ModBlocks.pa_beamline, 3), new ComparableStack(ModItems.item_expensive, 16, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.QUANTUM), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.COMPUTER))); + this.register(new GenericRecipe("ass.detector").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_detector, 1)) + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 24), new OreDictStack(GOLD.wireDense(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.QUANTUM)) + .inputItemsEx(new ComparableStack(ModBlocks.pa_beamline, 3), new ComparableStack(ModItems.item_expensive, 32, EnumExpensiveType.LEAD_PLATING), new OreDictStack(GOLD.wireDense(), 64), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.QUANTUM), new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.COMPUTER))); + this.register(new GenericRecipe("ass.pagold").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.GOLD.ordinal())).inputItems(new OreDictStack(GOLD.wireDense(), 64), new OreDictStack(GOLD.wireDense(), 64))); + this.register(new GenericRecipe("ass.panbti").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.NIOBIUM.ordinal())).inputItems(new OreDictStack(NB.wireDense(), 64), new OreDictStack(TI.wireDense(), 64))); + this.register(new GenericRecipe("ass.pabscco").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.BSCCO.ordinal())).inputItems(new OreDictStack(BSCCO.wireDense(), 64), new OreDictStack(ANY_PLASTIC.ingot(), 64))); + this.register(new GenericRecipe("ass.pachlorophyte").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.CHLOROPHYTE.ordinal())).inputItems(new OreDictStack(CU.wireDense(), 64), new OreDictStack(CU.wireDense(), 64), new ComparableStack(ModItems.powder_chlorophyte, 16))); + this.register(new GenericRecipe("ass.exposurechamber").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_exposure_chamber, 1)) + .inputItems(new OreDictStack(AL.plateCast(), 12), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new OreDictStack(ALLOY.wireDense(), 32), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModBlocks.capacitor_tantalium, 1), new ComparableStack(ModBlocks.glass_quartz, 16)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_HARDPLASTIC.ingot(), 24), new OreDictStack(ALLOY.wireDense(), 32), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.COMPUTER))); + + // reactors + this.register(new GenericRecipe("ass.breedingreactor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_reactor_breeding, 1)) + .inputItems(new ComparableStack(ModItems.reactor_core, 1), new OreDictStack(STEEL.ingot(), 12), new OreDictStack(PB.plate(), 16), new ComparableStack(ModBlocks.reinforced_glass, 4), new OreDictStack(ASBESTOS.ingot(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.crt_display, 1)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.LEAD_PLATING), new ComparableStack(ModItems.reactor_core, 1), new OreDictStack(ASBESTOS.ingot(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.researchreactor").setup(200, 100).outputItems(new ItemStack(ModBlocks.reactor_research, 1)) + .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.motor_desh, 2), new OreDictStack(B.ingot(), 5), new OreDictStack(PB.plate(), 8), new ComparableStack(ModItems.crt_display, 3), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.FERRO_PLATING), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.crt_display, 3), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.CIRCUIT))); + this.register(new GenericRecipe("ass.cirnox").setup(600, 100).outputItems(new ItemStack(ModBlocks.reactor_zirnox, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(STEEL.pipe(), 8), new OreDictStack(B.ingot(), 8), new OreDictStack(GRAPHITE.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(ANY_CONCRETE.any(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.LEAD_PLATING), new OreDictStack(GRAPHITE.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(ANY_CONCRETE.any(), 16), new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.CIRCUIT))); + this.register(new GenericRecipe("ass.rbmk").setup(100, 100).outputItems(new ItemStack(ModBlocks.rbmk_blank, 1)) + .inputItems(new ComparableStack(ModBlocks.concrete_asbestos, 4), new OreDictStack(STEEL.plateCast(), 4), new OreDictStack(CU.plate(), 8), new ComparableStack(ModItems.plate_polymer, 4)) + .inputItemsEx(new ComparableStack(ModBlocks.concrete_asbestos, 4), new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.FERRO_PLATING), new OreDictStack(CU.plate(), 16))); + this.register(new GenericRecipe("ass.rbmkautoloader").setup(100, 100).outputItems(new ItemStack(ModBlocks.rbmk_autoloader, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 4), new OreDictStack(PB.plateCast(), 4), new OreDictStack(B.ingot(), 4), new ComparableStack(ModItems.motor, 3)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.FERRO_PLATING), new ComparableStack(ModItems.motor_desh, 3))); + + // fusion reactor + this.register(new GenericRecipe("ass.fusioncore").setup(600, 100).outputItems(new ItemStack(ModBlocks.struct_iter_core, 1)) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 6), new OreDictStack(W.plateWelded(), 6), new OreDictStack(OreDictManager.getReflector(), 12), new ComparableStack(ModItems.coil_advanced_alloy, 12), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.FERRO_PLATING), new OreDictStack(W.plateWelded(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.COMPUTER))); + this.register(new GenericRecipe("ass.fusionconductor").setup(100, 100).outputItems(new ItemStack(ModBlocks.fusion_conductor, 1)) + .inputItems(new ComparableStack(ModItems.coil_advanced_alloy, 5))); + this.register(new GenericRecipe("ass.fusioncenter").setup(200, 100).outputItems(new ItemStack(ModBlocks.fusion_center, 1)) + .inputItems(new OreDictStack(ANY_HARDPLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 6), new OreDictStack(ALLOY.wireFine(), 24)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.STEEL_PLATING), new OreDictStack(ANY_HARDPLASTIC.ingot(), 4), new OreDictStack(ALLOY.wireFine(), 24))); + this.register(new GenericRecipe("ass.fusionmotor").setup(400, 100).outputItems(new ItemStack(ModBlocks.fusion_motor, 1)) + .inputItems(new OreDictStack(TI.ingot(), 4), new OreDictStack(STEEL.ingot(), 2), new ComparableStack(ModItems.motor, 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.STEEL_PLATING), new ComparableStack(ModItems.motor, 4))); + this.register(new GenericRecipe("ass.fusionheater").setup(200, 100).outputItems(new ItemStack(ModBlocks.fusion_heater, 4)) + .inputItems(new OreDictStack(W.plateWelded(), 2), new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(OreDictManager.getReflector(), 2), new ComparableStack(ModItems.magnetron, 2)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.HEAVY_FRAME), new OreDictStack(W.plateWelded(), 4), new ComparableStack(ModItems.magnetron, 2))); + this.register(new GenericRecipe("ass.blankettungsten").setup(600, 100).outputItems(new ItemStack(ModItems.fusion_shield_tungsten, 1)) + .inputItems(new OreDictStack(W.block(), 32), new OreDictStack(OreDictManager.getReflector(), 64))); + this.register(new GenericRecipe("ass.blanketdesh").setup(600, 100).outputItems(new ItemStack(ModItems.fusion_shield_desh, 1)) + .inputItems(new OreDictStack(DESH.block(), 16), new OreDictStack(CO.block(), 16), new OreDictStack(BIGMT.plate(), 64))); + this.register(new GenericRecipe("ass.blanketchlorophyte").setup(600, 100).outputItems(new ItemStack(ModItems.fusion_shield_chlorophyte, 1)) + .inputItems(new OreDictStack(W.block(), 16), new OreDictStack(DURA.block(), 16), new OreDictStack(OreDictManager.getReflector(), 48), new ComparableStack(ModItems.powder_chlorophyte, 48))); + + // watz + this.register(new GenericRecipe("ass.watzrod").setup(200, 100).outputItems(new ItemStack(ModBlocks.watz_element, 3)) + .inputItems(new OreDictStack(STEEL.plateCast(), 2), new OreDictStack(ZR.ingot(), 2), new OreDictStack(BIGMT.ingot(), 2), new OreDictStack(ANY_HARDPLASTIC.ingot(), 4)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.FERRO_PLATING), new OreDictStack(BIGMT.ingot(), 6), new OreDictStack(ANY_HARDPLASTIC.ingot(), 4))); + this.register(new GenericRecipe("ass.watzcooler").setup(200, 100).outputItems(new ItemStack(ModBlocks.watz_cooler, 3)) + .inputItems(new OreDictStack(STEEL.plateCast(), 2), new OreDictStack(CU.plateCast(), 4), new OreDictStack(RUBBER.ingot(), 2)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.FERRO_PLATING), new OreDictStack(RUBBER.ingot(), 8))); + this.register(new GenericRecipe("ass.watzcasing").setup(100, 100).outputItems(new ItemStack(ModBlocks.watz_end, 3)) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded()), new OreDictStack(B.ingot(), 3), new OreDictStack(STEEL.plateWelded(), 2)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 6, EnumExpensiveType.LEAD_PLATING), new OreDictStack(ANY_RESISTANTALLOY.plateWelded()))); + + // ICF + this.register(new GenericRecipe("ass.icfcell").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.CELL.ordinal())) + .inputItems(new ComparableStack(ModItems.ingot_cft, 2), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new ComparableStack(ModBlocks.glass_quartz, 16)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 2, EnumExpensiveType.BRONZE_TUBES), new ComparableStack(ModItems.ingot_cft, 8), new ComparableStack(ModBlocks.glass_quartz, 16))); + this.register(new GenericRecipe("ass.icfemitter").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.EMITTER.ordinal())) + .inputItems(new OreDictStack(W.plateWelded(), 4), new OreDictStack(MAGTUNG.wireDense(), 16)) + .inputItemsEx(new OreDictStack(W.plateWelded(), 8), new OreDictStack(MAGTUNG.wireDense(), 16)) + .inputFluids(new FluidStack(Fluids.XENON, 16_000))); + this.register(new GenericRecipe("ass.icfcapacitor").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.CAPACITOR.ordinal())) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 1), new OreDictStack(ND.wireDense(), 16), new OreDictStack(SBD.wireDense(), 2)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 3, EnumExpensiveType.FERRO_PLATING), new OreDictStack(ND.wireDense(), 16), new OreDictStack(SBD.wireDense(), 2))); + this.register(new GenericRecipe("ass.icfturbo").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.TURBO.ordinal())) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 2), new OreDictStack(DNT.wireDense(), 4), new OreDictStack(SBD.wireDense(), 4)) + .inputItemsEx(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 8), new OreDictStack(DNT.wireDense(), 8), new OreDictStack(SBD.wireDense(), 4))); + this.register(new GenericRecipe("ass.icfcasing").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.CASING.ordinal())) + .inputItems(new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new OreDictStack(BIGMT.plateCast(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.BRONZE_TUBES), new OreDictStack(BIGMT.plateCast(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16))); + this.register(new GenericRecipe("ass.icfport").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.PORT.ordinal())) + .inputItems(new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ND.wireDense(), 16)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.BRONZE_TUBES), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ND.wireDense(), 16))); + this.register(new GenericRecipe("ass.icfcontroller").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_controller, 1)) + .inputItems(new ComparableStack(ModItems.ingot_cft, 16), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BISMOID)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.BRONZE_TUBES), new ComparableStack(ModItems.ingot_cft, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 32, EnumCircuitType.BISMOID), new ComparableStack(ModItems.item_expensive, 4, EnumExpensiveType.COMPUTER))); + this.register(new GenericRecipe("ass.icfscaffold").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_component, 1, 0)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 4), new OreDictStack(TI.plateWelded(), 2)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 8, EnumExpensiveType.STEEL_PLATING))); + this.register(new GenericRecipe("ass.icfvessel").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_component, 1, 1)) + .inputItems(new ComparableStack(ModItems.ingot_cft, 1), new OreDictStack(CMB.plateCast(), 1), new OreDictStack(W.plateWelded(), 2))); + this.register(new GenericRecipe("ass.icfstructural").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_component, 1, 3)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(CU.plateWelded(), 2), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 1)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 1, EnumExpensiveType.BRONZE_TUBES), new OreDictStack(STEEL.plateWelded(), 8))); + this.register(new GenericRecipe("ass.icfcore").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.struct_icf_core, 1)) + .inputItems(new OreDictStack(CMB.plateWelded(), 16), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 16), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 16), new OreDictStack(SBD.wireDense(), 32), new ComparableStack(ModItems.circuit, 32, EnumCircuitType.BISMOID), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.QUANTUM)) + .inputItemsEx(new ComparableStack(ModItems.item_expensive, 16, EnumExpensiveType.BRONZE_TUBES), new OreDictStack(CMB.plateWelded(), 16), new OreDictStack(SBD.wireDense(), 32), new ComparableStack(ModItems.circuit, 32, EnumCircuitType.QUANTUM), new ComparableStack(ModItems.item_expensive, 16, EnumExpensiveType.COMPUTER))); + this.register(new GenericRecipe("ass.icfpress").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_icf_press, 1)) + .inputItems(new OreDictStack(GOLD.plateCast(), 8), new ComparableStack(ModItems.motor, 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); + + // upgrades + this.register(new GenericRecipe("ass.overdrive1").setup(200, 100).outputItems(new ItemStack(ModItems.upgrade_overdrive_1, 1)) + .inputItems(new ComparableStack(ModItems.upgrade_speed_3, 1), new ComparableStack(ModItems.upgrade_effect_3, 1), new OreDictStack(BIGMT.ingot(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.overdrive2").setup(600, 100).outputItems(new ItemStack(ModItems.upgrade_overdrive_2, 1)) + .inputItems(new ComparableStack(ModItems.upgrade_overdrive_1, 1), new ComparableStack(ModItems.upgrade_speed_3, 1), new ComparableStack(ModItems.upgrade_effect_3, 1), new OreDictStack(BIGMT.ingot(), 16), new ComparableStack(ModItems.ingot_cft, 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR_BOARD))); + this.register(new GenericRecipe("ass.overdrive3").setup(1_200, 100).outputItems(new ItemStack(ModItems.upgrade_overdrive_3, 1)) + .inputItems(new ComparableStack(ModItems.upgrade_overdrive_2, 1), new ComparableStack(ModItems.upgrade_speed_3, 1), new ComparableStack(ModItems.upgrade_effect_3, 1), new OreDictStack(ANY_BISMOIDBRONZE.ingot(), 16), new ComparableStack(ModItems.ingot_cft, 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BISMOID))); + /* + this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) + .inputItems()); + */ + + // rancid shit mob spawners + this.register(new GenericRecipe("ass.chopper").setup(1_200, 100).outputItems(new ItemStack(ModItems.spawn_chopper, 8)) + .inputItems(new OreDictStack(CMB.plateCast(), 24), new OreDictStack(STEEL.plate(), 32), new OreDictStack(MAGTUNG.wireFine(), 48), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER_ADVANCED))); + this.register(new GenericRecipe("ass.ballsotron").setup(1_200, 100).outputItems(new ItemStack(ModItems.spawn_worm, 1)) + .inputItems(new OreDictStack(TI.plateWelded(), 32), new OreDictStack(RUBBER.ingot(), 64), new ComparableStack(ModItems.motor, 64), new OreDictStack(GOLD.wireDense(), 64), new OreDictStack(U238.block(), 10), new ComparableStack(ModItems.mech_key, 1))); + + // weapon parts + this.register(new GenericRecipe("ass.clusterpellets").setup(50, 100).outputItems(new ItemStack(ModItems.pellet_cluster, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 1))); + this.register(new GenericRecipe("ass.buckshot").setup(50, 100).outputItems(new ItemStack(ModItems.pellet_buckshot, 1)) + .inputItems(new OreDictStack(PB.nugget(), 6))); + + // bombs + this.register(new GenericRecipe("ass.minenaval").setup(300, 100).outputItems(new ItemStack(ModBlocks.mine_naval, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(STEEL.pipe(), 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(ANY_PLASTICEXPLOSIVE.ingot(), 24))); + this.register(new GenericRecipe("ass.gadget").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_gadget, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new ComparableStack(ModItems.fins_flat, 2), new ComparableStack(ModItems.pedestal_steel, 1), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_GRAY, 8))); + this.register(new GenericRecipe("ass.littleboy").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_boy, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_small_steel, 1), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_BLUE, 4))); + this.register(new GenericRecipe("ass.fatman").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_man, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_big_steel, 1), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_YELLOW, 6))); + this.register(new GenericRecipe("ass.ivymike").setup(600, 100).outputItems(new ItemStack(ModBlocks.nuke_mike, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(AL.shell(), 4), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack(KEY_LIGHTGRAY, 16))); + this.register(new GenericRecipe("ass.tsarbomba").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.nuke_tsar, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(TI.shell(), 6), new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_tri_steel, 1), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack(KEY_BLACK, 8))); + this.register(new GenericRecipe("ass.ninadidnothingwrong").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_prototype, 1)) + .inputItems(new ComparableStack(ModItems.dysfunctional_reactor, 1), new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.ingot_euphemium, 3), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED))); + this.register(new GenericRecipe("ass.fleija").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_fleija, 1)) + .inputItems(new OreDictStack(AL.shell(), 1), new ComparableStack(ModItems.fins_quad_titanium, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_WHITE, 4))); + this.register(new GenericRecipe("ass.solinium").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_solinium, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_quad_titanium, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_GRAY, 8))); + this.register(new GenericRecipe("ass.n2mine").setup(200, 100).outputItems(new ItemStack(ModBlocks.nuke_n2, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 6), new OreDictStack(MAGTUNG.wireFine(), 12), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_GREEN, 8))); + this.register(new GenericRecipe("ass.balefirebomb").setup(400, 100).outputItems(new ItemStack(ModBlocks.nuke_fstbmb, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(TI.shell(), 6), new ComparableStack(ModItems.fins_big_steel, 1), new ComparableStack(ModItems.powder_magic, 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack(KEY_GRAY, 8))); + this.register(new GenericRecipe("ass.customnuke").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_custom, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_small_steel, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack(KEY_GRAY, 4))); + this.register(new GenericRecipe("ass.levibomb").setup(200, 100).outputItems(new ItemStack(ModBlocks.float_bomb, 1)) + .inputItems(new OreDictStack(TI.plate(), 12), new OreDictStack(SA326.nugget(), 3), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new OreDictStack(GOLD.wireDense(), 8))); + this.register(new GenericRecipe("ass.endobomb").setup(200, 100).outputItems(new ItemStack(ModBlocks.therm_endo, 1)) + .inputItems(new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.powder_ice, 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4))); + this.register(new GenericRecipe("ass.exobomb").setup(200, 100).outputItems(new ItemStack(ModBlocks.therm_exo, 1)) + .inputItems(new OreDictStack(TI.plate(), 12), new OreDictStack(P_RED.dust(), 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4))); + + /* + this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModItems., 1)) + .inputItems()); + */ + + // bomb parts + this.register(new GenericRecipe("ass.explosivelenses1").setup(400, 100).outputItems(new ItemStack(ModItems.early_explosive_lenses, 1)) + .inputItems(new OreDictStack(AL.plate(), 8), new OreDictStack(GOLD.wireFine(), 16), new ComparableStack(ModBlocks.det_cord, 8), new OreDictStack(CU.plate(), 2), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 20), new OreDictStack(ANY_PLASTIC.ingot(), 4))); + this.register(new GenericRecipe("ass.explosivelenses2").setup(400, 100).outputItems(new ItemStack(ModItems.explosive_lenses, 1)) + .inputItems(new OreDictStack(AL.plate(), 8), new OreDictStack(MINGRADE.wireFine(), 16), new OreDictStack(ANY_PLASTICEXPLOSIVE.ingot(), 4), new OreDictStack(CU.plate(), 2), new ComparableStack(ModItems.ball_tatb, 16), new OreDictStack(RUBBER.ingot(), 2))); + this.register(new GenericRecipe("ass.wiring").setup(200, 100).outputItems(new ItemStack(ModItems.gadget_wireing, 1)) + .inputItems(new OreDictStack(IRON.plate(), 1), new OreDictStack(GOLD.wireFine(), 12))); + this.register(new GenericRecipe("ass.core1").setup(1_200, 100).outputItems(new ItemStack(ModItems.gadget_core, 1)) + .inputItems(new OreDictStack(PU239.nugget(), 7), new OreDictStack(U238.nugget(), 3))); + this.register(new GenericRecipe("ass.boyshield").setup(200, 100).outputItems(new ItemStack(ModItems.boy_shielding, 1)) + .inputItems(new OreDictStack(OreDictManager.getReflector(), 12), new OreDictStack(STEEL.plate528(), 4))); + this.register(new GenericRecipe("ass.boytarget").setup(200, 100).outputItems(new ItemStack(ModItems.boy_target, 1)) + .inputItems(new OreDictStack(U235.nugget(), 18))); + this.register(new GenericRecipe("ass.boybullet").setup(200, 100).outputItems(new ItemStack(ModItems.boy_bullet, 1)) + .inputItems(new OreDictStack(U235.nugget(), 9))); + this.register(new GenericRecipe("ass.boypropellant").setup(200, 100).outputItems(new ItemStack(ModItems.boy_propellant, 1)) + .inputItems(new ComparableStack(ModItems.cordite, 8), new OreDictStack(IRON.plate528(), 8), new OreDictStack(AL.plate528(), 4), new OreDictStack(MINGRADE.wireFine(), 4))); + this.register(new GenericRecipe("ass.boyigniter").setup(200, 100).outputItems(new ItemStack(ModItems.boy_igniter, 1)) + .inputItems(new OreDictStack(AL.shell(), 3), new OreDictStack(DURA.plateCast(), 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(MINGRADE.wireFine(), 16))); + this.register(new GenericRecipe("ass.manigniter").setup(200, 100).outputItems(new ItemStack(ModItems.man_igniter, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 6), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(MINGRADE.wireFine(), 9))); + this.register(new GenericRecipe("ass.mancore").setup(1_200, 100).outputItems(new ItemStack(ModItems.man_core, 1)) + .inputItems(new OreDictStack(PU239.nugget(), 8), new OreDictStack(BE.nugget(), 2))); + this.register(new GenericRecipe("ass.mikecore").setup(1_200, 100).outputItems(new ItemStack(ModItems.mike_core, 1)) + .inputItems(new OreDictStack(U238.nugget(), 24), new OreDictStack(PB.ingot(), 6))); + this.register(new GenericRecipe("ass.mikedeut").setup(600, 100).outputItems(new ItemStack(ModItems.mike_deut, 1)) + .inputItems(new OreDictStack(IRON.plate528(), 12), new OreDictStack(STEEL.plate528(), 16)) + .inputFluids(new FluidStack(Fluids.DEUTERIUM, 10_000))); + this.register(new GenericRecipe("ass.mikecooler").setup(300, 100).outputItems(new ItemStack(ModItems.mike_cooling_unit, 1)) + .inputItems(new OreDictStack(IRON.plate528(), 8), new ComparableStack(ModItems.coil_copper, 5), new ComparableStack(ModItems.coil_tungsten, 5), new ComparableStack(ModItems.motor, 2))); + this.register(new GenericRecipe("ass.fleijaigniter").setup(200, 100).outputItems(new ItemStack(ModItems.fleija_igniter, 1)) + .inputItems(new OreDictStack(TI.plate528(), 6), new OreDictStack(SA326.wireFine(), 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()))); + this.register(new GenericRecipe("ass.fleijacore").setup(600, 100).outputItems(new ItemStack(ModItems.fleija_core, 1)) + .inputItems(new OreDictStack(U235.nugget(), 8), new OreDictStack(NP237.nugget(), 2), new OreDictStack(BE.nugget(), 4), new ComparableStack(ModItems.coil_copper, 2))); + this.register(new GenericRecipe("ass.fleijacharge").setup(300, 100).outputItems(new ItemStack(ModItems.fleija_propellant, 1)) + .inputItems(new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 3), new OreDictStack(SA326.plate(), 8))); + this.register(new GenericRecipe("ass.soliniumigniter").setup(200, 100).outputItems(new ItemStack(ModItems.solinium_igniter, 1)) + .inputItems(new OreDictStack(TI.plate528(), 4), new OreDictStack(ALLOY.wireFine(), 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()), new ComparableStack(ModItems.coil_gold, 1))); + this.register(new GenericRecipe("ass.soliniumcore").setup(600, 100).outputItems(new ItemStack(ModItems.solinium_core, 1)) + .inputItems(new OreDictStack(SA327.nugget(), 9), new OreDictStack(EUPH.nugget(), 1))); + this.register(new GenericRecipe("ass.soliniumcharge").setup(300, 100).outputItems(new ItemStack(ModItems.solinium_propellant, 1)) + .inputItems(new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 3), new OreDictStack(OreDictManager.getReflector(), 2), new ComparableStack(ModItems.plate_polymer, 6), new OreDictStack(W.wireFine(), 6), new ComparableStack(ModItems.biomass_compressed, 4))); + + // grenades + this.register(new GenericRecipe("ass.incgrenade").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_fire, 1)) + .inputItems(new ComparableStack(ModItems.grenade_frag, 1), new OreDictStack(P_RED.dust(), 1), new OreDictStack(CU.plate(), 2))); + this.register(new GenericRecipe("ass.shrapgrenade").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_shrapnel, 1)) + .inputItems(new ComparableStack(ModItems.grenade_frag, 1), new ComparableStack(ModItems.pellet_buckshot, 1), new OreDictStack(STEEL.plate(), 2))); + this.register(new GenericRecipe("ass.clustergrenade").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_cluster, 1)) + .inputItems(new ComparableStack(ModItems.grenade_frag, 1), new ComparableStack(ModItems.pellet_cluster, 1), new OreDictStack(STEEL.plate(), 2))); + this.register(new GenericRecipe("ass.signalflare").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_flare, 1)) + .inputItems(new ComparableStack(ModItems.grenade_generic, 1), new ComparableStack(Items.glowstone_dust, 1), new OreDictStack(AL.plate(), 2))); + this.register(new GenericRecipe("ass.electricgrenade").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_electric, 1)) + .inputItems(new ComparableStack(ModItems.grenade_generic, 1), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.CAPACITOR.ordinal()), new OreDictStack(GOLD.plate(), 2))); + this.register(new GenericRecipe("ass.pulsegrenade").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_pulse, 4)) + .inputItems(new OreDictStack(STEEL.plate(), 1), new OreDictStack(IRON.plate(), 3), new OreDictStack(MINGRADE.wireFine(), 6), new ComparableStack(Items.diamond, 1))); + this.register(new GenericRecipe("ass.plasmagrenade").setup(200, 100).outputItems(new ItemStack(ModItems.grenade_plasma, 2)) + .inputItems(new OreDictStack(STEEL.plate(), 3), new OreDictStack(ALLOY.plate(), 1), new ComparableStack(ModItems.coil_advanced_torus, 1), new ComparableStack(ModItems.cell_deuterium, 1), new ComparableStack(ModItems.cell_tritium, 1))); + this.register(new GenericRecipe("ass.taugrenade").setup(200, 100).outputItems(new ItemStack(ModItems.grenade_tau, 2)) + .inputItems(new OreDictStack(PB.plate(), 3), new OreDictStack(ALLOY.plate(), 1), new ComparableStack(ModItems.coil_advanced_torus, 1), new ComparableStack(ModItems.ammo_standard, 1, EnumAmmo.TAU_URANIUM))); + this.register(new GenericRecipe("ass.schrabgrenade").setup(200, 100).outputItems(new ItemStack(ModItems.grenade_schrabidium, 1)) + .inputItems(new ComparableStack(ModItems.grenade_flare, 1), new OreDictStack(SA326.dust(), 1), new OreDictStack(OreDictManager.getReflector(), 2))); + this.register(new GenericRecipe("ass.nukagrenade").setup(600, 100).outputItems(new ItemStack(ModItems.grenade_nuclear, 1)) + .inputItems(new OreDictStack(IRON.plate(), 1), new OreDictStack(STEEL.plate(), 1), new OreDictStack(PU239.nugget(), 2), new OreDictStack(MINGRADE.wireFine(), 2))); + this.register(new GenericRecipe("ass.zomggrenade").setup(600, 100).outputItems(new ItemStack(ModItems.grenade_zomg, 1)) + .inputItems(new ComparableStack(ModItems.plate_paa, 3), new OreDictStack(OreDictManager.getReflector(), 1), new ComparableStack(ModItems.coil_magnetized_tungsten, 3), new ComparableStack(ModItems.powder_power, 3))); + this.register(new GenericRecipe("ass.bholegrenade").setup(1_200, 100).outputItems(new ItemStack(ModItems.grenade_black_hole, 1)) + .inputItems(new OreDictStack(ANY_PLASTIC.ingot(), 6), new OreDictStack(OreDictManager.getReflector(), 3), new ComparableStack(ModItems.coil_magnetized_tungsten, 2), new ComparableStack(ModItems.black_hole, 1))); + + /* + this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) + .inputItems()); + */ + + // turrets + this.register(new GenericRecipe("ass.turretchekhov").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_chekhov, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 3), new OreDictStack(GUNMETAL.mechanism(), 3), new ComparableStack(ModBlocks.crate_iron, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.turretfriendly").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_friendly, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC), new OreDictStack(STEEL.pipe(), 3), new OreDictStack(GUNMETAL.mechanism(), 1), new ComparableStack(ModBlocks.crate_iron, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.turretjeremy").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_jeremy, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.motor_desh, 1), new OreDictStack(STEEL.shell(), 3), new OreDictStack(WEAPONSTEEL.mechanism(), 3), new ComparableStack(ModBlocks.crate_steel, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.turrettauon").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_tauon, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 1), new OreDictStack(STEEL.ingot(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.motor_desh, 1), new OreDictStack(CU.ingot(), 32), new OreDictStack(BIGMT.mechanism(), 3), new ComparableStack(ModItems.battery_lithium, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.turretrichard").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_richard, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(ANY_PLASTIC.ingot(), 2), new OreDictStack(STEEL.shell(), 8), new OreDictStack(WEAPONSTEEL.mechanism(), 3), new ComparableStack(ModBlocks.crate_steel, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.turrethoward").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_howard, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 24), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 10), new OreDictStack(WEAPONSTEEL.mechanism(), 3), new ComparableStack(ModBlocks.crate_steel, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.maxwell").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_maxwell, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 1), new OreDictStack(STEEL.ingot(), 24), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 4), new OreDictStack(BIGMT.mechanism(), 3), new ComparableStack(ModItems.magnetron, 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.fritz").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_fritz, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 8), new OreDictStack(GUNMETAL.mechanism(), 3), new ComparableStack(ModBlocks.barrel_steel))); + this.register(new GenericRecipe("ass.arty").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.turret_arty, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 64), new OreDictStack(STEEL.ingot(), 64), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 12), new OreDictStack(WEAPONSTEEL.mechanism(), 16), new ComparableStack(ModBlocks.machine_radar, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.himars").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.turret_himars, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 64), new OreDictStack(STEEL.ingot(), 64), new OreDictStack(ANY_PLASTIC.ingot(), 64), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED), new OreDictStack(BIGMT.mechanism(), 8), new ComparableStack(ModBlocks.machine_radar, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.himarssmall").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 12), new ComparableStack(ModItems.rocket_fuel, 48), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 48), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarssmallhe").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL_HE)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 24), new ComparableStack(ModItems.rocket_fuel, 48), new OreDictStack(ANY_PLASTICEXPLOSIVE.ingot(), 18), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 48), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarssmallwp").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL_WP)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 24), new ComparableStack(ModItems.rocket_fuel, 48), new OreDictStack(P_WHITE.ingot(), 18), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 48), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarssmalltb").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL_TB)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 24), new ComparableStack(ModItems.rocket_fuel, 48), new ComparableStack(ModItems.ball_tatb, 32), new OreDictStack(Fluids.KEROSENE_REFORM.getDict(1_000), 12), new OreDictStack(Fluids.PEROXIDE.getDict(1_000), 12), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarssmallnuke").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL_MINI_NUKE)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 24), new ComparableStack(ModItems.rocket_fuel, 48), new ComparableStack(ModItems.ball_tatb, 6), new OreDictStack(PU239.nugget(), 12), new OreDictStack(OreDictManager.getReflector(), 12), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarssmalllava").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL_LAVA)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new ComparableStack(ModItems.rocket_fuel, 32), new ComparableStack(ModItems.ball_tatb, 4), new OreDictStack(VOLCANIC.gem(), 1), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarslarge").setup(200, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.LARGE)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new ComparableStack(ModItems.rocket_fuel, 36), new ComparableStack(ModItems.ball_tatb, 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.himarslargetb").setup(200, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.LARGE_TB)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new ComparableStack(ModItems.rocket_fuel, 36), new ComparableStack(ModItems.ball_tatb, 24), new OreDictStack(Fluids.KEROSENE_REFORM.getDict(1_000), 16), new OreDictStack(Fluids.PEROXIDE.getDict(1_000), 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED))); + + // missile parts + this.register(new GenericRecipe("ass.missileassembly").setup(200, 100).outputItems(new ItemStack(ModItems.missile_assembly, 1)) + .inputItems(new OreDictStack(AL.shell(), 2), new OreDictStack(TI.shell(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.rocket_fuel, 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.warheadhe1").setup(100, 100).outputItems(new ItemStack(ModItems.warhead_generic_small, 1)) + .inputItems(new OreDictStack(TI.plate(), 4), new ComparableStack(ModItems.ball_dynamite, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CHIP))); + this.register(new GenericRecipe("ass.warheadhe2").setup(200, 100).outputItems(new ItemStack(ModItems.warhead_generic_medium, 1)) + .inputItems(new OreDictStack(TI.plate(), 8), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.warheadhe3").setup(400, 100).outputItems(new ItemStack(ModItems.warhead_generic_large, 1)) + .inputItems(new OreDictStack(TI.plate(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.warheadinc1").setup(100, 100).outputItems(new ItemStack(ModItems.warhead_incendiary_small, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_small, 1), new OreDictStack(P_RED.dust(), 2))); + this.register(new GenericRecipe("ass.warheadinc2").setup(200, 100).outputItems(new ItemStack(ModItems.warhead_incendiary_medium, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_medium, 1), new OreDictStack(P_RED.dust(), 4))); + this.register(new GenericRecipe("ass.warheadinc3").setup(400, 100).outputItems(new ItemStack(ModItems.warhead_incendiary_large, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_large, 1), new OreDictStack(P_RED.dust(), 8))); + this.register(new GenericRecipe("ass.warheadcl1").setup(100, 100).outputItems(new ItemStack(ModItems.warhead_cluster_small, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_small, 1), new ComparableStack(ModItems.pellet_cluster, 2))); + this.register(new GenericRecipe("ass.warheadcl2").setup(200, 100).outputItems(new ItemStack(ModItems.warhead_cluster_medium, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_medium, 1), new ComparableStack(ModItems.pellet_cluster, 4))); + this.register(new GenericRecipe("ass.warheadcl3").setup(400, 100).outputItems(new ItemStack(ModItems.warhead_cluster_large, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_large, 1), new ComparableStack(ModItems.pellet_cluster, 8))); + this.register(new GenericRecipe("ass.warheadbb1").setup(100, 100).outputItems(new ItemStack(ModItems.warhead_buster_small, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_small, 1), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 2))); + this.register(new GenericRecipe("ass.warheadbb2").setup(200, 100).outputItems(new ItemStack(ModItems.warhead_buster_medium, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_medium, 1), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4))); + this.register(new GenericRecipe("ass.warheadbb3").setup(400, 100).outputItems(new ItemStack(ModItems.warhead_buster_large, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_large, 1), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 8))); + this.register(new GenericRecipe("ass.warheadnuke").setup(400, 100).outputItems(new ItemStack(ModItems.warhead_nuclear, 1)) + .inputItems(new OreDictStack(TI.plateCast(), 12), new OreDictStack(PB.plateCast(), 6), new OreDictStack(U235.billet(), 6), new ComparableStack(ModItems.cordite, 12), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER))); + this.register(new GenericRecipe("ass.warheadthermonuke").setup(600, 100).outputItems(new ItemStack(ModItems.warhead_mirv, 1)) + .inputItems(new OreDictStack(TI.plateCast(), 12), new OreDictStack(PB.plateCast(), 6), new OreDictStack(PU239.billet(), 8), new ComparableStack(ModItems.ball_tatb, 12), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER_ADVANCED)) + .inputFluids(new FluidStack(Fluids.DEUTERIUM, 4_000))); + this.register(new GenericRecipe("ass.warheadvolcano").setup(600, 100).outputItems(new ItemStack(ModItems.warhead_volcano, 1)) + .inputItems(new OreDictStack(TI.plateCast(), 12), new OreDictStack(STEEL.plateCast(), 6), new ComparableStack(ModBlocks.det_nuke, 3), new OreDictStack(U238.block(), 24), new ComparableStack(ModItems.circuit, 5, EnumCircuitType.CAPACITOR_BOARD.ordinal()))); + this.register(new GenericRecipe("ass.thrusternerva").setup(600, 100).outputItems(new ItemStack(ModItems.thruster_nuclear, 1)) + .inputItems(new OreDictStack(DURA.ingot(), 32), new OreDictStack(B.ingot(), 8), new OreDictStack(PB.plate(), 16), new OreDictStack(STEEL.pipe(), 4))); + this.register(new GenericRecipe("ass.stealthmissile").setup(1_200, 100).outputItems(new ItemStack(ModItems.missile_stealth, 1)) + .inputItems(new OreDictStack(TI.plate(), 20), new OreDictStack(AL.plate(), 20), new OreDictStack(KEY_BLACK, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(STEEL.bolt(), 32))); + this.register(new GenericRecipe("ass.shuttlemissile").setup(200, 100).outputItems(new ItemStack(ModItems.missile_shuttle, 1)) + .inputItems(new ComparableStack(ModItems.missile_generic, 2), new ComparableStack(ModItems.missile_strong, 1), new OreDictStack(KEY_ORANGE, 5), new ComparableStack(ModItems.canister_full, 24, Fluids.GASOLINE_LEADED.getID()), new OreDictStack(FIBER.ingot(), 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC), new OreDictStack(ANY_PLASTICEXPLOSIVE.ingot(), 8), new OreDictStack(KEY_ANYPANE, 6), new OreDictStack(STEEL.plate(), 4))); + this.register(new GenericRecipe("ass.launchpad").setup(200, 100).outputItems(new ItemStack(ModBlocks.launch_pad_large, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(ANY_CONCRETE.any(), 64), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModBlocks.steel_scaffold, 24), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.launchpadsilo").setup(200, 100).outputItems(new ItemStack(ModBlocks.launch_pad, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(ANY_CONCRETE.any(), 8), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED))); + + // custom missile thrusters + this.register(new GenericRecipe("ass.mpt10kero").setup(100, 100).outputItems(new ItemStack(ModItems.mp_thruster_10_kerosene, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.pipe(), 1), new OreDictStack(W.ingot(), 4), new OreDictStack(STEEL.plate(), 4))); + this.register(new GenericRecipe("ass.mpt10solid").setup(100, 100).outputItems(new ItemStack(ModItems.mp_thruster_10_solid, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(DURA.pipe(), 1), new OreDictStack(W.ingot(), 4), new OreDictStack(STEEL.plate(), 4))); + this.register(new GenericRecipe("ass.mpt10xenon").setup(100, 100).outputItems(new ItemStack(ModItems.mp_thruster_10_xenon, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(DURA.plate(), 4), new ComparableStack(ModItems.arc_electrode, 1))); + this.register(new GenericRecipe("ass.mpt15kero").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_kerosene, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.pipe(), 3), new OreDictStack(W.ingot(), 8), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpt15kerodual").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_kerosene_dual, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.pipe(), 3), new OreDictStack(W.ingot(), 8), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpt15kerotriple").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_kerosene_triple, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.pipe(), 3), new OreDictStack(W.ingot(), 8), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpt15solid").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_solid, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(DURA.pipe(), 3), new OreDictStack(W.ingot(), 8), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpt15solid16").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_solid_hexdecuple, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(DURA.pipe(), 3), new OreDictStack(W.ingot(), 8), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpt15hydro").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_hydrogen, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(DURA.pipe(), 3), new OreDictStack(W.ingot(), 8), new OreDictStack(DESH.ingot(), 4))); + this.register(new GenericRecipe("ass.mpt15hydrodual").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_hydrogen_dual, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(DURA.pipe(), 3), new OreDictStack(W.ingot(), 8), new OreDictStack(DESH.ingot(), 4))); + this.register(new GenericRecipe("ass.mpt15bfshort").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_balefire_short, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(DURA.pipe(), 5), new OreDictStack(W.plateCast(), 8), new OreDictStack(BIGMT.plate(), 8))); + this.register(new GenericRecipe("ass.mpt15bf").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_balefire_short, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(DURA.pipe(), 5), new OreDictStack(W.plateCast(), 16), new OreDictStack(BIGMT.plate(), 16))); + this.register(new GenericRecipe("ass.mpt15bflarge").setup(200, 100).outputItems(new ItemStack(ModItems.mp_thruster_15_balefire_large, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(DURA.pipe(), 10), new OreDictStack(W.plateCast(), 16), new OreDictStack(BIGMT.plate(), 24))); + this.register(new GenericRecipe("ass.mpt20kero").setup(400, 100).outputItems(new ItemStack(ModItems.mp_thruster_20_kerosene, 1)) + .inputItems(new ComparableStack(ModItems.seg_20, 1), new OreDictStack(STEEL.pipe(), 6), new OreDictStack(W.ingot(), 16), new OreDictStack(STEEL.plate(), 16))); + this.register(new GenericRecipe("ass.mpt20kerodual").setup(400, 100).outputItems(new ItemStack(ModItems.mp_thruster_20_kerosene_dual, 1)) + .inputItems(new ComparableStack(ModItems.seg_20, 1), new OreDictStack(STEEL.pipe(), 6), new OreDictStack(W.ingot(), 16), new OreDictStack(STEEL.plate(), 16))); + this.register(new GenericRecipe("ass.mpt20kerotriple").setup(400, 100).outputItems(new ItemStack(ModItems.mp_thruster_20_kerosene_triple, 1)) + .inputItems(new ComparableStack(ModItems.seg_20, 1), new OreDictStack(STEEL.pipe(), 6), new OreDictStack(W.ingot(), 16), new OreDictStack(STEEL.plate(), 16))); + this.register(new GenericRecipe("ass.mpt20solid").setup(400, 100).outputItems(new ItemStack(ModItems.mp_thruster_20_solid, 1)) + .inputItems(new ComparableStack(ModItems.seg_20, 1), new OreDictStack(DURA.pipe(), 6), new OreDictStack(W.ingot(), 16), new OreDictStack(STEEL.plate(), 16))); + this.register(new GenericRecipe("ass.mpt20solidmulti").setup(400, 100).outputItems(new ItemStack(ModItems.mp_thruster_20_solid_multi, 1)) + .inputItems(new ComparableStack(ModItems.seg_20, 1), new OreDictStack(DURA.pipe(), 6), new OreDictStack(W.ingot(), 16), new OreDictStack(STEEL.plate(), 16))); + this.register(new GenericRecipe("ass.mpt20solidmultier").setup(400, 100).outputItems(new ItemStack(ModItems.mp_thruster_20_solid_multier, 1)) + .inputItems(new ComparableStack(ModItems.seg_20, 1), new OreDictStack(DURA.pipe(), 6), new OreDictStack(W.ingot(), 16), new OreDictStack(STEEL.plate(), 16))); + + // custom missile fuselages + this.register(new GenericRecipe("ass.mpf10kero").setup(100, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_kerosene, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 2), new OreDictStack(AL.plate(), 12), new OreDictStack(STEEL.plate(), 3))); + this.register(new GenericRecipe("ass.mpf10kerolong").setup(100, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_kerosene, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 2), new OreDictStack(AL.plate(), 16), new OreDictStack(STEEL.plate(), 6))); + this.register(new GenericRecipe("ass.mpf10solid").setup(100, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_solid, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 2), new OreDictStack(TI.plate(), 12), new OreDictStack(STEEL.plate(), 3))); + this.register(new GenericRecipe("ass.mpf10solidlong").setup(100, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_solid, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 2), new OreDictStack(TI.plate(), 16), new OreDictStack(STEEL.plate(), 6))); + this.register(new GenericRecipe("ass.mpf10xenon").setup(100, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_xenon, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 2), new OreDictStack(CU.plate(), 12), new OreDictStack(STEEL.plate(), 3))); + this.register(new GenericRecipe("ass.mpf1015kero").setup(200, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_15_kerosene, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new ComparableStack(ModItems.seg_15, 1), new OreDictStack(AL.plate(), 24), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpf1015solid").setup(200, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_15_solid, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new ComparableStack(ModItems.seg_15, 1), new OreDictStack(TI.plate(), 24), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpf1015hydro").setup(200, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_15_hydrogen, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new ComparableStack(ModItems.seg_15, 1), new OreDictStack(CU.plate(), 24), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpf1015bf").setup(200, 100).outputItems(new ItemStack(ModItems.mp_fuselage_10_15_balefire, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new ComparableStack(ModItems.seg_15, 1), new OreDictStack(BIGMT.plate(), 24), new OreDictStack(STEEL.plate(), 8))); + this.register(new GenericRecipe("ass.mpf15kero").setup(200, 100).outputItems(new ItemStack(ModItems.mp_fuselage_15_kerosene, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 2), new OreDictStack(AL.plate(), 32), new OreDictStack(STEEL.plate(), 12))); + this.register(new GenericRecipe("ass.mpf15solid").setup(200, 100).outputItems(new ItemStack(ModItems.mp_fuselage_15_solid, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 2), new OreDictStack(TI.plate(), 32), new OreDictStack(STEEL.plate(), 12))); + this.register(new GenericRecipe("ass.mpf15hydro").setup(200, 100).outputItems(new ItemStack(ModItems.mp_fuselage_15_hydrogen, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 2), new OreDictStack(CU.plate(), 32), new OreDictStack(STEEL.plate(), 12))); + this.register(new GenericRecipe("ass.mpf1520kero").setup(400, 100).outputItems(new ItemStack(ModItems.mp_fuselage_15_20_kerosene, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new ComparableStack(ModItems.seg_20, 1), new OreDictStack(AL.plate(), 48), new OreDictStack(STEEL.plate(), 16))); + this.register(new GenericRecipe("ass.mpf1520solid").setup(400, 100).outputItems(new ItemStack(ModItems.mp_fuselage_15_20_solid, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new ComparableStack(ModItems.seg_20, 1), new OreDictStack(TI.plate(), 48), new OreDictStack(STEEL.plate(), 16))); + + // custom missile warheads + this.register(new GenericRecipe("ass.mpw10he").setup(100, 100).outputItems(new ItemStack(ModItems.mp_warhead_10_he, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 6), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.mpw10inc").setup(100, 100).outputItems(new ItemStack(ModItems.mp_warhead_10_incendiary, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 6), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 2), new OreDictStack(P_RED.dust(), 6), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.mpw10bus").setup(100, 100).outputItems(new ItemStack(ModItems.mp_warhead_10_buster, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(WEAPONSTEEL.plate(), 6), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 6), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.mpw10nukesmall").setup(200, 100).outputItems(new ItemStack(ModItems.mp_warhead_10_nuclear, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(WEAPONSTEEL.plate(), 16), new OreDictStack(PU239.billet(), 2), new OreDictStack(OreDictManager.getReflector(), 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER))); + this.register(new GenericRecipe("ass.mpw10nukelarge").setup(200, 100).outputItems(new ItemStack(ModItems.mp_warhead_10_nuclear_large, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(WEAPONSTEEL.plate(), 16), new OreDictStack(PU239.billet(), 6), new OreDictStack(OreDictManager.getReflector(), 8), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 12), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER))); + this.register(new GenericRecipe("ass.mpw10taint").setup(100, 100).outputItems(new ItemStack(ModItems.mp_warhead_10_taint, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.det_cord, 2), new ComparableStack(ModItems.powder_magic, 12), new OreDictStack(Fluids.WATZ.getDict(1_000), 1))); + this.register(new GenericRecipe("ass.mpw10cloud").setup(100, 100).outputItems(new ItemStack(ModItems.mp_warhead_10_cloud, 1)) + .inputItems(new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.det_cord, 2), new ComparableStack(ModItems.grenade_pink_cloud, 2))); + this.register(new GenericRecipe("ass.mpw15he").setup(200, 100).outputItems(new ItemStack(ModItems.mp_warhead_15_he, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.plate(), 12), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.mpw15inc").setup(200, 100).outputItems(new ItemStack(ModItems.mp_warhead_15_incendiary, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.plate(), 12), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 8), new OreDictStack(P_RED.dust(), 16), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.mpw15nuke").setup(400, 100).outputItems(new ItemStack(ModItems.mp_warhead_15_nuclear, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(WEAPONSTEEL.plate(), 32), new OreDictStack(PU239.billet(), 12), new OreDictStack(OreDictManager.getReflector(), 12), new ComparableStack(ModItems.ball_tatb, 24), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.CONTROLLER))); + this.register(new GenericRecipe("ass.mpw15n2").setup(400, 100).outputItems(new ItemStack(ModItems.mp_warhead_15_n2, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(WEAPONSTEEL.plate(), 32), new ComparableStack(ModItems.ball_tatb, 32), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.mpw15bf").setup(400, 100).outputItems(new ItemStack(ModItems.mp_warhead_15_balefire, 1)) + .inputItems(new ComparableStack(ModItems.seg_15, 1), new OreDictStack(WEAPONSTEEL.plate(), 32), new OreDictStack(OreDictManager.getReflector(), 16), new ComparableStack(ModItems.powder_magic, 8), new ComparableStack(ModItems.egg_balefire_shard, 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 16), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER))); + + /* + this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModItems., 1)) + .inputItems()); + */ + + // weapons + this.register(new GenericRecipe("ass.schrabhammer").setup(6_000, 100).outputItems(new ItemStack(ModItems.schrabidium_hammer, 1)) + .inputItems( + new OreDictStack(SA326.block(), 35), + new ComparableStack(ModItems.billet_yharonite, 64), + new ComparableStack(ModItems.billet_yharonite, 64), + new ComparableStack(ModItems.coin_ufo, 1), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64))); + + // ammo + this.register(new GenericRecipe("ass.50bmgsm").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_standard, 6, EnumAmmo.BMG50_SM.ordinal())) + .inputItems(new ComparableStack(ModItems.casing, 1, EnumCasingType.LARGE_STEEL), new OreDictStack(ANY_SMOKELESS.dust(), 6), new OreDictStack(STAR.ingot(), 3)) + .setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "silverstorm")); + this.register(new GenericRecipe("ass.50bmgbypass").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_secret, 12, EnumAmmoSecret.BMG50_BLACK.ordinal())) + .inputItems(new ComparableStack(ModItems.casing, 2, EnumCasingType.LARGE_STEEL), new OreDictStack(ANY_SMOKELESS.dust(), 24), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.SELENIUM_STEEL), new ComparableStack(ModItems.black_diamond)) + .setPools(GenericRecipes.POOL_PREFIX_SECRET + "psalm")); + this.register(new GenericRecipe("chem.shellchlorine").setup(100, 1_000).outputItems(new ItemStack(ModItems.ammo_arty, 1, 9)) + .inputItems(new ComparableStack(ModItems.ammo_arty, 1, 0), new OreDictStack(ANY_PLASTIC.ingot(), 1)) + .inputFluids(new FluidStack(Fluids.CHLORINE, 4_000))); + this.register(new GenericRecipe("ass.shellphosgene").setup(100, 1_000).outputItems(new ItemStack(ModItems.ammo_arty, 1, 10)) + .inputItems(new ComparableStack(ModItems.ammo_arty, 1, 0), new OreDictStack(ANY_PLASTIC.ingot(), 1)) + .inputFluids(new FluidStack(Fluids.PHOSGENE, 4_000))); + this.register(new GenericRecipe("ass.shellmustard").setup(100, 1_000).outputItems(new ItemStack(ModItems.ammo_arty, 1, 11)) + .inputItems(new ComparableStack(ModItems.ammo_arty, 1, 0), new OreDictStack(ANY_PLASTIC.ingot(), 1)) + .inputFluids(new FluidStack(Fluids.MUSTARDGAS, 4_000))); + + // tools + this.register(new GenericRecipe("ass.multitool").setup(100, 100).outputItems(new ItemStack(ModItems.multitool_hit, 1)) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(STEEL.plate(), 4), new OreDictStack(GOLD.wireFine(), 12), new ComparableStack(ModItems.motor, 4), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR_BOARD))); + + // space + this.register(new GenericRecipe("ass.soyuz").setup(6_000, 100).outputItems(new ItemStack(ModItems.missile_soyuz, 1)) + .inputItems(new OreDictStack(TI.shell(), 32), + new OreDictStack(RUBBER.ingot(), 64), + new ComparableStack(ModItems.rocket_fuel, 64), + new ComparableStack(ModItems.thruster_small, 12), + new ComparableStack(ModItems.thruster_medium, 12), + new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CONTROLLER), + new ComparableStack(ModItems.part_generic, 32, EnumPartType.LDE)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "soyuz")); + this.register(new GenericRecipe("ass.lander").setup(2_400, 100).outputItems(new ItemStack(ModItems.missile_soyuz_lander, 1)) + .inputItems(new OreDictStack(AL.shell(), 4), + new OreDictStack(RUBBER.ingot(), 16), + new ComparableStack(ModItems.rocket_fuel, 16), + new ComparableStack(ModItems.thruster_small, 3), + new ComparableStack(ModItems.circuit, 3, EnumCircuitType.CONTROLLER_ADVANCED), + new ComparableStack(ModItems.part_generic, 12, EnumPartType.LDE)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "soyuz")); + this.register(new GenericRecipe("ass.satellitebase").setup(600, 100).outputItems(new ItemStack(ModItems.sat_base, 1)) + .inputItems(new OreDictStack(RUBBER.ingot(), 12), + new OreDictStack(TI.shell(), 3), + new ComparableStack(ModItems.thruster_large, 1), + new ComparableStack(ModItems.part_generic, 8, EnumPartType.LDE), + new ComparableStack(ModItems.plate_desh, 4), + new ComparableStack(ModItems.fluid_barrel_full, 1, Fluids.KEROSENE.getID()), + new ComparableStack(ModItems.photo_panel, 24), + new ComparableStack(ModItems.circuit, 12, EnumCircuitType.BASIC), + new ComparableStack(ModBlocks.machine_lithium_battery, 1))); + this.register(new GenericRecipe("ass.satellitemapper").setup(600, 100).outputItems(new ItemStack(ModItems.sat_head_mapper, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 3), + new ComparableStack(ModItems.plate_desh, 4), + new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), + new ComparableStack(ModBlocks.glass_quartz, 8))); + this.register(new GenericRecipe("ass.satellitescanner").setup(600, 100).outputItems(new ItemStack(ModItems.sat_head_scanner, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 3), + new OreDictStack(TI.plateCast(), 8), + new ComparableStack(ModItems.plate_desh, 4), + new ComparableStack(ModItems.magnetron, 8), + new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED.ordinal()))); + this.register(new GenericRecipe("ass.satelliteradar").setup(600, 100).outputItems(new ItemStack(ModItems.sat_head_radar, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 3), + new OreDictStack(TI.plateCast(), 12), + new ComparableStack(ModItems.magnetron, 12), + new ComparableStack(ModItems.coil_gold, 16), + new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()))); + this.register(new GenericRecipe("ass.satellitelaser").setup(600, 100).outputItems(new ItemStack(ModItems.sat_head_laser, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 6), + new OreDictStack(CU.plateCast(), 24), + new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), + new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED), + new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR_BOARD), + new ComparableStack(ModItems.crystal_diamond, 8), + new ComparableStack(ModBlocks.glass_quartz, 8))); + this.register(new GenericRecipe("ass.satelliteresonator").setup(600, 100).outputItems(new ItemStack(ModItems.sat_head_resonator, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 6), + new OreDictStack(STAR.ingot(), 12), + new OreDictStack(ANY_PLASTIC.ingot(), 48), + new ComparableStack(ModItems.crystal_xen, 1), + new ComparableStack(ModItems.circuit, 16, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.satelliterelay").setup(600, 100).outputItems(new ItemStack(ModItems.sat_foeq, 1)) + .inputItems(new OreDictStack(TI.shell(), 3), + new ComparableStack(ModItems.plate_desh, 8), + new ComparableStack(ModItems.fluid_barrel_full, 1, Fluids.HYDROGEN.getID()), + new ComparableStack(ModItems.photo_panel, 16), + new ComparableStack(ModItems.thruster_nuclear, 1), + new ComparableStack(ModItems.ingot_uranium_fuel, 6), + new ComparableStack(ModItems.circuit, 24, EnumCircuitType.BASIC), + new ComparableStack(ModItems.magnetron, 3), + new ComparableStack(ModBlocks.machine_lithium_battery, 1))); + this.register(new GenericRecipe("ass.satelliteasteroidminer").setup(600, 100).outputItems(new ItemStack(ModItems.sat_miner, 1)) + .inputItems(new OreDictStack(BIGMT.plate(), 24), + new ComparableStack(ModItems.motor_desh, 2), + new ComparableStack(ModItems.drill_titanium, 2), + new ComparableStack(ModItems.circuit, 12, EnumCircuitType.ADVANCED), + new ComparableStack(ModItems.fluid_barrel_full, 1, Fluids.KEROSENE.getID()), + new ComparableStack(ModItems.thruster_small, 1), + new ComparableStack(ModItems.photo_panel, 12), + new ComparableStack(ModItems.centrifuge_element, 4), + new ComparableStack(ModBlocks.machine_lithium_battery, 1))); + this.register(new GenericRecipe("ass.satellitelunarminer").setup(600, 100).outputItems(new ItemStack(ModItems.sat_lunar_miner, 1)) + .inputItems(new ComparableStack(ModItems.ingot_meteorite, 4), + new ComparableStack(ModItems.plate_desh, 4), + new ComparableStack(ModItems.motor, 2), + new ComparableStack(ModItems.drill_titanium, 2), + new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED), + new ComparableStack(ModItems.fluid_barrel_full, 1, Fluids.KEROSENE.getID()), + new ComparableStack(ModItems.thruster_small, 1), + new ComparableStack(ModItems.photo_panel, 12), + new ComparableStack(ModBlocks.machine_lithium_battery, 1))); + this.register(new GenericRecipe("ass.gerald").setup(6_000, 100).outputItems(new ItemStack(ModItems.sat_gerald, 1)) + .inputItems(new OreDictStack(SBD.plateCast(), 64), + new OreDictStack(SBD.plateCast(), 64), + new OreDictStack(BSCCO.wireDense(), 64), + new OreDictStack(BSCCO.wireDense(), 64), + new ComparableStack(ModBlocks.det_nuke, 64), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.circuit, 64, EnumCircuitType.CONTROLLER_QUANTUM), + new ComparableStack(ModItems.coin_ufo, 1)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "gerald")); + + this.register(new GenericRecipe("ass.emptypackage").setup(40, 100).outputItems(new ItemStack(ModItems.fluid_pack_empty, 1)) + .inputItems(new OreDictStack(TI.plate(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 2))); + + FluidType[] order = Fluids.getInNiceOrder(); + for(int i = 1; i < order.length; ++i) { + FluidType type = order[i]; + if(type.hasNoContainer()) continue; + this.register(new GenericRecipe("ass.package" + type.getUnlocalizedName()).setup(40, 100).outputItems(new ItemStack(ModItems.fluid_pack_full, 1, type.getID())) + .inputItems(new ComparableStack(ModItems.fluid_pack_empty)).inputFluids(new FluidStack(type, 32_000))); + this.register(new GenericRecipe("ass.unpackage" + type.getUnlocalizedName()).setup(40, 100).setIcon(ItemFluidIcon.make(type, 32_000)).outputItems(new ItemStack(ModItems.fluid_pack_empty)) + .inputItems(new ComparableStack(ModItems.fluid_pack_full, 1, type.getID())).outputFluids(new FluidStack(type, 32_000))); + } + + if(GeneralConfig.enableMekanismChanges && Loader.isModLoaded("Mekanism")) { + Block mb = (Block) Block.blockRegistry.getObject("Mekanism:MachineBlock"); + if(mb != null) { + + this.register(new GenericRecipe("ass.digimemer").setup(1_200, 100).outputItems(new ItemStack(mb, 1, 4)) + .inputItems(new OreDictStack(BIGMT.plateCast(), 16), + new OreDictStack(CU.plateWelded(), 12), + new OreDictStack("alloyUltimate", 32), + new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BISMOID), + new ComparableStack(ModItems.circuit, 32, EnumCircuitType.CAPACITOR_BOARD), + new ComparableStack(ModItems.wire_dense, 32, Mats.MAT_GOLD.id), + new ComparableStack(ModItems.motor_bismuth, 3))); + } + } + + } + + public static HashMap getRecipes() { + HashMap recipes = new HashMap(); + + for(GenericRecipe recipe : INSTANCE.recipeOrderedList) { + List input = new ArrayList(); + if(recipe.inputItem != null) for(AStack stack : recipe.inputItem) input.add(stack); + if(recipe.inputFluid != null) for(FluidStack stack : recipe.inputFluid) input.add(ItemFluidIcon.make(stack)); + List output = new ArrayList(); + if(recipe.outputItem != null) for(IOutput stack : recipe.outputItem) output.add(stack.getAllPossibilities()); + if(recipe.outputFluid != null) for(FluidStack stack : recipe.outputFluid) output.add(ItemFluidIcon.make(stack)); + recipes.put(input.toArray(), output.toArray()); + } + + return recipes; + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java index 1a7599b5d..455456499 100644 --- a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java @@ -16,7 +16,6 @@ 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.IMCBlastFurnace; import com.hbm.inventory.RecipesCommon.AStack; @@ -59,10 +58,9 @@ public class BlastFurnaceRecipes extends SerializableRecipe { 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(BIGMT, ModItems.ingot_meteorite, new ItemStack(ModItems.ingot_starmetal, 2)); + addRecipe(CO, ModItems.powder_meteorite, 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.enableLBSM && GeneralConfig.enableLBSMSimpleChemsitry) { addRecipe(ModItems.canister_empty, COAL, new ItemStack(ModItems.canister_full, 1, Fluids.OIL.getID())); diff --git a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java index 027efb67d..2a48a04f7 100644 --- a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java @@ -1,7 +1,6 @@ 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; @@ -26,8 +25,6 @@ import com.hbm.items.ItemEnums; import com.hbm.items.ItemEnums.EnumAshType; import com.hbm.items.ItemEnums.EnumChunkType; import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; -import com.hbm.items.machine.ItemWatzPellet.EnumWatzType; import com.hbm.items.special.ItemBedrockOreNew; import com.hbm.items.special.ItemBedrockOre.EnumBedrockOre; import com.hbm.items.special.ItemBedrockOreNew.BedrockOreGrade; @@ -50,258 +47,12 @@ public class CentrifugeRecipes extends SerializableRecipe { boolean lbs = GeneralConfig.enableLBSM && GeneralConfig.enableLBSMSimpleCentrifuge; - recipes.put(new ComparableStack(ModItems.waste_natural_uranium), new ItemStack[] { - new ItemStack(ModItems.nugget_u238, 1), - new ItemStack(ModItems.nugget_pu_mix, 2), - new ItemStack(ModItems.nugget_pu239, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 2) }); - - recipes.put(new ComparableStack(ModItems.waste_uranium), new ItemStack[] { - new ItemStack(ModItems.nugget_pu_mix, 2), - new ItemStack(ModItems.nugget_plutonium, 1), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 2) }); - - recipes.put(new ComparableStack(ModItems.waste_thorium), new ItemStack[] { - new ItemStack(ModItems.nugget_u238, 1), - new ItemStack(ModItems.nugget_th232, 1), - new ItemStack(ModItems.nugget_u233, 2), - new ItemStack(ModItems.nuclear_waste_tiny, 2) }); - - recipes.put(new ComparableStack(ModItems.waste_mox), new ItemStack[] { - new ItemStack(ModItems.nugget_pu_mix, 1), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nugget_u238, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 3) }); - - recipes.put(new ComparableStack(ModItems.waste_plutonium), new ItemStack[] { - new ItemStack(ModItems.nugget_pu_mix, 1), - new ItemStack(ModItems.nugget_pu_mix, 1), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 3) }); - - recipes.put(new ComparableStack(ModItems.waste_u233), new ItemStack[] { - new ItemStack(ModItems.nugget_u235, 1), - new ItemStack(ModItems.nugget_neptunium, 1), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 3) }); - - recipes.put(new ComparableStack(ModItems.waste_u235), new ItemStack[] { - new ItemStack(ModItems.nugget_pu238, 1), - new ItemStack(ModItems.nugget_neptunium, 1), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 3) }); - - recipes.put(new ComparableStack(ModItems.waste_schrabidium), new ItemStack[] { - new ItemStack(ModItems.nugget_beryllium, 2), - new ItemStack(ModItems.nugget_pu239, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 2) }); - - recipes.put(new ComparableStack(ModItems.waste_zfb_mox), new ItemStack[] { - new ItemStack(ModItems.nugget_zirconium, 3), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nugget_pu_mix, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 1) }); - - recipes.put(new ComparableStack(ModItems.waste_plate_mox), new ItemStack[] { - new ItemStack(ModItems.powder_sr90_tiny, 1), - new ItemStack(ModItems.nugget_pu_mix, 3), - new ItemStack(ModItems.powder_cs137_tiny, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 4) }); - - recipes.put(new ComparableStack(ModItems.waste_plate_pu238be), new ItemStack[] { - new ItemStack(ModItems.nugget_beryllium, 1), - new ItemStack(ModItems.nugget_pu238, 1), - new ItemStack(ModItems.powder_coal_tiny, 2), - new ItemStack(ModItems.nugget_lead, 2) }); - - recipes.put(new ComparableStack(ModItems.waste_plate_pu239), new ItemStack[] { - new ItemStack(ModItems.nugget_pu240, 2), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.powder_cs137_tiny, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 5) }); - - recipes.put(new ComparableStack(ModItems.waste_plate_ra226be), new ItemStack[] { - new ItemStack(ModItems.nugget_beryllium, 2), - new ItemStack(ModItems.nugget_polonium, 2), - new ItemStack(ModItems.powder_coal_tiny, 1), - new ItemStack(ModItems.nugget_lead, 1) }); - - recipes.put(new ComparableStack(ModItems.waste_plate_sa326), new ItemStack[] { - new ItemStack(ModItems.nugget_solinium, 1), - new ItemStack(ModItems.powder_neodymium_tiny, 1), - new ItemStack(ModItems.nugget_tantalium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 6) }); - - recipes.put(new ComparableStack(ModItems.waste_plate_u233), new ItemStack[] { - new ItemStack(ModItems.nugget_u235, 1), - new ItemStack(ModItems.powder_i131_tiny, 1), - new ItemStack(ModItems.powder_sr90_tiny, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 6) }); - - recipes.put(new ComparableStack(ModItems.waste_plate_u235), new ItemStack[] { - new ItemStack(ModItems.nugget_neptunium, 1), - new ItemStack(ModItems.nugget_pu238, 1), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 6) }); - - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.SCHRABIDIUM)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_solinium, 15), - new ItemStack(ModItems.nugget_euphemium, 3), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.HES)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_solinium, 17), - new ItemStack(ModItems.nugget_euphemium, 1), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.MES)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_solinium, 12), - new ItemStack(ModItems.nugget_tantalium, 6), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.LES)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_solinium, 9), - new ItemStack(ModItems.nugget_tantalium, 9), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.HEN)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_pu239, 12), - new ItemStack(ModItems.nugget_technetium, 6), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.MEU)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_pu239, 12), - new ItemStack(ModItems.nugget_bismuth, 6), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.MEP)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_pu241, 12), - new ItemStack(ModItems.nugget_bismuth, 6), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.LEAD)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_lead, 6), - new ItemStack(ModItems.nugget_bismuth, 12), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.BORON)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.powder_coal_tiny, 12), - new ItemStack(ModItems.nugget_co60, 6), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.DU)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_polonium, 12), - new ItemStack(ModItems.nugget_pu238, 6), - new ItemStack(ModItems.nuclear_waste, 2) }); - - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.MEU)), new ItemStack[] { - new ItemStack(ModItems.nugget_u238, 3), - new ItemStack(ModItems.nugget_plutonium, 4), - new ItemStack(ModItems.nugget_technetium, 2), - new ItemStack(ModItems.nuclear_waste_tiny, 3) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.HEU233)), new ItemStack[] { - new ItemStack(ModItems.nugget_u235, 3), - new ItemStack(ModItems.nugget_pu238, 3), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 5) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.HEU235)), new ItemStack[] { - new ItemStack(ModItems.nugget_neptunium, 3), - new ItemStack(ModItems.nugget_pu238, 3), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 5) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.MEN)), new ItemStack[] { - new ItemStack(ModItems.nugget_u238, 3), - new ItemStack(ModItems.nugget_pu239, 4), - new ItemStack(ModItems.nugget_technetium, 2), - new ItemStack(ModItems.nuclear_waste_tiny, 3) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.HEN237)), new ItemStack[] { - new ItemStack(ModItems.nugget_pu238, 2), - new ItemStack(ModItems.nugget_pu239, 4), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 5) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.MOX)), new ItemStack[] { - new ItemStack(ModItems.nugget_u238, 3), - new ItemStack(ModItems.nugget_pu240, 4), - new ItemStack(ModItems.nugget_technetium, 2), - new ItemStack(ModItems.nuclear_waste_tiny, 3) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.MEP)), new ItemStack[] { - new ItemStack(ModItems.nugget_lead, 2), - new ItemStack(ModItems.nugget_pu_mix, 4), - new ItemStack(ModItems.nugget_technetium, 2), - new ItemStack(ModItems.nuclear_waste_tiny, 3) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.HEP239)), new ItemStack[] { - new ItemStack(ModItems.nugget_pu_mix, 2), - new ItemStack(ModItems.nugget_pu240, 4), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 5) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.HEP241)), new ItemStack[] { - new ItemStack(ModItems.nugget_lead, 3), - new ItemStack(ModItems.nugget_zirconium, 2), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 6) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.MEA)), new ItemStack[] { - new ItemStack(ModItems.nugget_lead, 3), - new ItemStack(ModItems.nugget_zirconium, 2), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 6) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.HEA242)), new ItemStack[] { - new ItemStack(ModItems.nugget_lead, 3), - new ItemStack(ModItems.nugget_zirconium, 2), - new ItemStack(ModItems.nugget_technetium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 6) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.HES326)), new ItemStack[] { - new ItemStack(ModItems.nugget_solinium, 3), - new ItemStack(ModItems.nugget_lead, 2), - new ItemStack(ModItems.nugget_euphemium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 6) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.HES327)), new ItemStack[] { - new ItemStack(ModItems.nugget_australium, 4), - new ItemStack(ModItems.nugget_lead, 1), - new ItemStack(ModItems.nugget_euphemium, 1), - new ItemStack(ModItems.nuclear_waste_tiny, 6) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.BFB_AM_MIX)), new ItemStack[] { - new ItemStack(ModItems.nugget_am_mix, 9), - new ItemStack(ModItems.nugget_pu_mix, 2), - new ItemStack(ModItems.nugget_bismuth, 6), - new ItemStack(ModItems.nuclear_waste_tiny, 1) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.pwr_fuel_depleted, EnumPWRFuel.BFB_PU241)), new ItemStack[] { - new ItemStack(ModItems.nugget_pu241, 9), - new ItemStack(ModItems.nugget_pu_mix, 2), - new ItemStack(ModItems.nugget_bismuth, 6), - new ItemStack(ModItems.nuclear_waste_tiny, 1) }); - - recipes.put(new ComparableStack(ModItems.icf_pellet_depleted), new ItemStack[] { - new ItemStack(ModItems.icf_pellet_empty, 1), - new ItemStack(ModItems.pellet_charged, 1), - new ItemStack(ModItems.pellet_charged, 1), - new ItemStack(ModItems.powder_iron, 1) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.chunk_ore, EnumChunkType.RARE)), new ItemStack[] { new ItemStack(ModItems.powder_cobalt_tiny, 2), new ItemStack(ModItems.powder_boron_tiny, 2), new ItemStack(ModItems.powder_niobium_tiny, 2), new ItemStack(ModItems.nugget_zirconium, 3) }); - ArrayList naquadriaNuggets = OreDictionary.getOres("nuggetNaquadria"); - if(naquadriaNuggets.size() != 0) { - ItemStack nuggetNQR = naquadriaNuggets.get(0); - ItemStack copy = nuggetNQR.copy(); - copy.stackSize = 12; - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.NQD)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - copy, - new ItemStack(ModItems.nugget_euphemium, 6), - new ItemStack(ModItems.nuclear_waste, 2) }); - recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.NQR)), new ItemStack[] { - new ItemStack(ModItems.ingot_mud, 1), - new ItemStack(ModItems.nugget_co60, 12), - new ItemStack(ModItems.nugget_euphemium, 6), - new ItemStack(ModItems.nuclear_waste, 2) }); - } - recipes.put(new OreDictStack(COAL.ore()), new ItemStack[] { new ItemStack(ModItems.powder_coal, 2), new ItemStack(ModItems.powder_coal, 2), @@ -553,8 +304,6 @@ public class CentrifugeRecipes extends SerializableRecipe { recipes.put(new ComparableStack(Items.blaze_rod), new ItemStack[] {new ItemStack(Items.blaze_powder, 1), new ItemStack(Items.blaze_powder, 1), new ItemStack(ModItems.powder_fire, 1), new ItemStack(ModItems.powder_fire, 1) }); - recipes.put(new ComparableStack(ModItems.ingot_schraranium), new ItemStack[] { new ItemStack(ModItems.nugget_schrabidium, 2), new ItemStack(ModItems.nugget_schrabidium, 1), new ItemStack(ModItems.nugget_uranium, 3), new ItemStack(ModItems.nugget_neptunium, 2) }); - recipes.put(new ComparableStack(ModItems.crystal_coal), new ItemStack[] { new ItemStack(ModItems.powder_coal, 3), new ItemStack(ModItems.powder_coal, 3), new ItemStack(ModItems.powder_coal, 3), new ItemStack(ModItems.powder_lithium_tiny, 1) }); recipes.put(new ComparableStack(ModItems.crystal_iron), new ItemStack[] { new ItemStack(ModItems.powder_iron, 2), new ItemStack(ModItems.powder_iron, 2), new ItemStack(ModItems.powder_titanium, 1), new ItemStack(ModItems.powder_lithium_tiny, 1) }); recipes.put(new ComparableStack(ModItems.crystal_gold), new ItemStack[] { new ItemStack(ModItems.powder_gold, 2), new ItemStack(ModItems.powder_gold, 2), new ItemStack(ModItems.ingot_mercury, 1), new ItemStack(ModItems.powder_lithium_tiny, 1) }); diff --git a/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java b/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java index ca4bcc193..a5f5736b0 100644 --- a/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ChemicalPlantRecipes.java @@ -60,7 +60,7 @@ public class ChemicalPlantRecipes extends GenericRecipes { this.register(new GenericRecipe("chem.xenonoxy").setupNamed(20, 1_000).setIcon(ModItems.gas_full, Fluids.XENON.getID()) .inputFluids(new FluidStack(Fluids.AIR, 8_000), new FluidStack(Fluids.OXYGEN, 250)) - .outputFluids(new FluidStack(Fluids.XENON, 50))); + .outputFluids(new FluidStack(Fluids.XENON, 50)).setPools(GenericRecipes.POOL_PREFIX_ALT + ".xenonoxy")); this.register(new GenericRecipe("chem.helium3").setupNamed(200, 2_000).setIcon(ModItems.gas_full, Fluids.HELIUM3.getID()) .inputItems(new ComparableStack(ModBlocks.moon_turf, 8)) @@ -116,6 +116,12 @@ public class ChemicalPlantRecipes extends GenericRecipes { .outputItems(DictFrame.fromOne(ModItems.fuel_additive, EnumFuelAdditive.DEICER))); /// THE CONC AND ASPHALE /// + this.register(new GenericRecipe("chem.cobble").setup(20, 100) + .inputFluids(new FluidStack(Fluids.WATER, 1_000), new FluidStack(Fluids.LAVA, 25)) + .outputItems(new ItemStack(Blocks.cobblestone))); + this.register(new GenericRecipe("chem.stone").setup(60, 500).setPools(GenericRecipes.POOL_PREFIX_DISCOVER) + .inputFluids(new FluidStack(Fluids.WATER, 1_000), new FluidStack(Fluids.LAVA, 25), new FluidStack(Fluids.AIR, 4_000)) + .outputItems(new ItemStack(Blocks.stone))); this.register(new GenericRecipe("chem.concrete").setup(100, 100) .inputItems(new ComparableStack(ModItems.powder_cement, 1), new ComparableStack(Blocks.gravel, 8), new OreDictStack(KEY_SAND, 8)) .inputFluids(new FluidStack(Fluids.WATER, 2_000)) @@ -131,6 +137,11 @@ public class ChemicalPlantRecipes extends GenericRecipes { .inputFluids(new FluidStack(Fluids.WATER, 2_000)) .outputItems(new ItemStack(ModBlocks.ducrete_smooth, 8))); + this.register(new GenericRecipe("chem.liquidconk").setup(100, 100) + .inputItems(new ComparableStack(ModItems.powder_cement, 1), new ComparableStack(Blocks.gravel, 8), new OreDictStack(KEY_SAND, 8)) + .inputFluids(new FluidStack(Fluids.WATER, 2_000)) + .outputFluids(new FluidStack(Fluids.CONCRETE, 16_000))); + this.register(new GenericRecipe("chem.asphalt").setup(100, 100) .inputItems(new ComparableStack(Blocks.gravel, 2), new OreDictStack(KEY_SAND, 6)) .inputFluids(new FluidStack(Fluids.BITUMEN, 1_000)) @@ -209,7 +220,7 @@ public class ChemicalPlantRecipes extends GenericRecipes { this.register(new GenericRecipe("chem.birkeland").setupNamed(200, 5_000) .inputFluids(new FluidStack(Fluids.AIR, 8_000), new FluidStack(Fluids.WATER, 2_000)) - .outputFluids(new FluidStack(Fluids.NITRIC_ACID, 1_000))); + .outputFluids(new FluidStack(Fluids.NITRIC_ACID, 1_000)).setPools(GenericRecipes.POOL_PREFIX_ALT + ".birkeland")); this.register(new GenericRecipe("chem.schrabidic").setup(100, 5_000) .inputItems(new ComparableStack(ModItems.pellet_charged)) @@ -268,21 +279,6 @@ public class ChemicalPlantRecipes extends GenericRecipes { .inputFluids(new FluidStack(Fluids.UNSATURATEDS, 500, GeneralConfig.enable528 ? 1 : 0)) .outputItems(new ItemStack(ModItems.ingot_c4, 4))); - this.register(new GenericRecipe("chem.shellchlorine").setup(100, 1_000) - .inputItems(new ComparableStack(ModItems.ammo_arty, 1, 0), new OreDictStack(ANY_PLASTIC.ingot(), 1)) - .inputFluids(new FluidStack(Fluids.CHLORINE, 4_000)) - .outputItems(new ItemStack(ModItems.ammo_arty, 1, 9))); - - this.register(new GenericRecipe("chem.shellphosgene").setup(100, 1_000) - .inputItems(new ComparableStack(ModItems.ammo_arty, 1, 0), new OreDictStack(ANY_PLASTIC.ingot(), 1)) - .inputFluids(new FluidStack(Fluids.PHOSGENE, 4_000)) - .outputItems(new ItemStack(ModItems.ammo_arty, 1, 10))); - - this.register(new GenericRecipe("chem.shellmustard").setup(100, 1_000) - .inputItems(new ComparableStack(ModItems.ammo_arty, 1, 0), new OreDictStack(ANY_PLASTIC.ingot(), 1)) - .inputFluids(new FluidStack(Fluids.MUSTARDGAS, 4_000)) - .outputItems(new ItemStack(ModItems.ammo_arty, 1, 11))); - /// GLASS /// this.register(new GenericRecipe("chem.laminate").setup(20, 100) .inputFluids(new FluidStack(Fluids.XYLENE, 50), new FluidStack(Fluids.PHOSGENE, 50)) @@ -321,29 +317,6 @@ public class ChemicalPlantRecipes extends GenericRecipes { .inputFluids(new FluidStack(Fluids.KEROSENE, 6_000)) .outputItems(new ItemStack(ModItems.powder_balefire)) .outputFluids(new FluidStack(Fluids.BALEFIRE, 8_000))); - - this.register(new GenericRecipe("chem.thoriumsalt").setup(100, 10_000).setIcon(ModItems.fluid_icon, Fluids.THORIUM_SALT.getID()) - .inputFluids(new FluidStack(Fluids.THORIUM_SALT_DEPLETED, 16_000)) - .inputItems(new OreDictStack(TH232.nugget(), 2)) - .outputFluids(new FluidStack(Fluids.THORIUM_SALT, 16_000)) - .outputItems( - new ChanceOutput(new ItemStack(ModItems.nugget_u233, 1), 0.5F), - new ChanceOutput(new ItemStack(ModItems.nuclear_waste_tiny, 1), 0.25F))); - - /// VITRIFICATION /// - this.register(new GenericRecipe("chem.vitliquid").setup(100, 1_000) - .inputItems(new ComparableStack(ModBlocks.sand_lead)) - .inputFluids(new FluidStack(Fluids.WASTEFLUID, 1_000)) - .outputItems(new ItemStack(ModItems.nuclear_waste_vitrified))); - - this.register(new GenericRecipe("chem.vitgaseous").setup(100, 1_000) - .inputItems(new ComparableStack(ModBlocks.sand_lead)) - .inputFluids(new FluidStack(Fluids.WASTEGAS, 1_000)) - .outputItems(new ItemStack(ModItems.nuclear_waste_vitrified))); - - this.register(new GenericRecipe("chem.vitsolid").setup(300, 1_000) - .inputItems(new ComparableStack(ModBlocks.sand_lead), new ComparableStack(ModItems.nuclear_waste, 4)) - .outputItems(new ItemStack(ModItems.nuclear_waste_vitrified, 4))); /// OSMIRIDIUM /// this.register(new GenericRecipe("chem.osmiridiumdeath").setup(240, 1_000) diff --git a/src/main/java/com/hbm/inventory/recipes/CrackingRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrackingRecipes.java index b66cf903d..d7c8cd0fd 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrackingRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrackingRecipes.java @@ -51,6 +51,7 @@ public class CrackingRecipes extends SerializableRecipe { cracking.put(Fluids.XYLENE, new Pair(new FluidStack(Fluids.AROMATICS, xyl_crack_aroma), new FluidStack(Fluids.PETROLEUM, xyl_crack_petro))); cracking.put(Fluids.HEATINGOIL_VACUUM, new Pair(new FluidStack(Fluids.HEATINGOIL, 80), new FluidStack(Fluids.REFORMGAS, 20))); cracking.put(Fluids.REFORMATE, new Pair(new FluidStack(Fluids.UNSATURATEDS, 40), new FluidStack(Fluids.REFORMGAS, 60))); + cracking.put(Fluids.BIOGAS, new Pair(new FluidStack(Fluids.PETROLEUM, 20), new FluidStack(Fluids.AROMATICS, 20))); } public static Pair getCracking(FluidType oil) { diff --git a/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java index e4b8907ba..4902d2f06 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java @@ -24,6 +24,7 @@ import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ItemEnums.EnumAshType; +import com.hbm.items.ItemEnums.EnumChunkType; import com.hbm.items.ItemEnums.EnumPlantType; import com.hbm.items.ItemEnums.EnumTarType; import com.hbm.items.ModItems; @@ -240,6 +241,8 @@ public class CrystallizerRecipes extends SerializableRecipe { if(dustCinnabar != null && !dustCinnabar.isEmpty()) { registerRecipe(CINNABAR.dust(), new CrystallizerRecipe(new ItemStack(ModItems.cinnebar), utilityTime), new FluidStack(Fluids.PEROXIDE, 50)); } + + registerRecipe(new ComparableStack(ModBlocks.moon_turf, 16), new CrystallizerRecipe(new ItemStack(ModItems.chunk_ore, 1, EnumChunkType.MOONSTONE.ordinal()), 1200)); if(!IMCCrystallizer.buffer.isEmpty()) { recipes.putAll(IMCCrystallizer.buffer); diff --git a/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java b/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java new file mode 100644 index 000000000..76cdc088c --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/PUREXRecipes.java @@ -0,0 +1,509 @@ +package com.hbm.inventory.recipes; + +import static com.hbm.inventory.OreDictManager.*; + +import java.util.ArrayList; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.FluidStack; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; +import com.hbm.items.machine.ItemWatzPellet.EnumWatzType; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +public class PUREXRecipes extends GenericRecipes { + + public static final PUREXRecipes INSTANCE = new PUREXRecipes(); + + @Override public int inputItemLimit() { return 3; } + @Override public int inputFluidLimit() { return 3; } + @Override public int outputItemLimit() { return 6; } + @Override public int outputFluidLimit() { return 1; } + + @Override public String getFileName() { return "hbmPUREX.json"; } + @Override public GenericRecipe instantiateRecipe(String name) { return new GenericRecipe(name); } + + @Override + public void registerDefaults() { + + long zirnoxPower = 1_000; + long platePower = 1_500; + long pwrPower = 2_500; + long watzPower = 10_000; + long vitrification = 1_000; + + // ZIRNOX + String autoZirnox = "autoswitch.zirnox"; + this.register(new GenericRecipe("purex.zirnoxnu").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) + .inputItems(new ComparableStack(ModItems.waste_natural_uranium)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u238, 1), + new ItemStack(ModItems.nugget_pu_mix, 2), + new ItemStack(ModItems.nugget_pu239, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 2)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.zirnoxmeu").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) + .inputItems(new ComparableStack(ModItems.waste_uranium)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u238, 1), + new ItemStack(ModItems.nugget_pu_mix, 2), + new ItemStack(ModItems.nugget_pu239, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 2)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.zirnoxthmeu").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) + .inputItems(new ComparableStack(ModItems.waste_thorium)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u238, 1), + new ItemStack(ModItems.nugget_th232, 1), + new ItemStack(ModItems.nugget_u233, 2), + new ItemStack(ModItems.nuclear_waste_tiny, 2)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.zirnoxmox").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) + .inputItems(new ComparableStack(ModItems.waste_mox)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu_mix, 1), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nugget_u238, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 3)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.zirnoxmep").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) + .inputItems(new ComparableStack(ModItems.waste_plutonium)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu_mix, 1), + new ItemStack(ModItems.nugget_pu_mix, 1), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 3)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.zirnoxheu233").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) + .inputItems(new ComparableStack(ModItems.waste_u233)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u235, 1), + new ItemStack(ModItems.nugget_neptunium, 1), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 3)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.zirnoxheu235").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) + .inputItems(new ComparableStack(ModItems.waste_u235)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu238, 1), + new ItemStack(ModItems.nugget_neptunium, 1), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 3)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.zirnoxles").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) + .inputItems(new ComparableStack(ModItems.waste_schrabidium)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_beryllium, 2), + new ItemStack(ModItems.nugget_pu239, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 2)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.zirnoxzfbmox").setup(100, zirnoxPower).setNameWrapper("purex.recycle").setGroup(autoZirnox, this) + .inputItems(new ComparableStack(ModItems.waste_zfb_mox)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_zirconium, 3), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nugget_pu_mix, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 1)) + .setIconToFirstIngredient()); + + // Plate Fuel + String autoPlate = "autoswitch.plate"; + this.register(new GenericRecipe("purex.platemox").setup(100, platePower).setNameWrapper("purex.recycle").setGroup(autoPlate, this) + .inputItems(new ComparableStack(ModItems.waste_plate_mox)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.powder_sr90_tiny, 1), + new ItemStack(ModItems.nugget_pu_mix, 3), + new ItemStack(ModItems.powder_cs137_tiny, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 4)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.platepu238be").setup(100, platePower).setNameWrapper("purex.recycle").setGroup(autoPlate, this) + .inputItems(new ComparableStack(ModItems.waste_plate_pu238be)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_beryllium, 1), + new ItemStack(ModItems.nugget_pu238, 1), + new ItemStack(ModItems.powder_coal_tiny, 2), + new ItemStack(ModItems.nugget_lead, 2)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.platepu239").setup(100, platePower).setNameWrapper("purex.recycle").setGroup(autoPlate, this) + .inputItems(new ComparableStack(ModItems.waste_plate_pu239)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu240, 2), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.powder_cs137_tiny, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 5)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.platera226be").setup(100, platePower).setNameWrapper("purex.recycle").setGroup(autoPlate, this) + .inputItems(new ComparableStack(ModItems.waste_plate_ra226be)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_beryllium, 2), + new ItemStack(ModItems.nugget_polonium, 2), + new ItemStack(ModItems.powder_coal_tiny, 1), + new ItemStack(ModItems.nugget_lead, 1)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.platesa326").setup(100, platePower).setNameWrapper("purex.recycle").setGroup(autoPlate, this) + .inputItems(new ComparableStack(ModItems.waste_plate_sa326)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_solinium, 1), + new ItemStack(ModItems.powder_neodymium_tiny, 1), + new ItemStack(ModItems.nugget_tantalium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 6)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.plateu233").setup(100, platePower).setNameWrapper("purex.recycle").setGroup(autoPlate, this) + .inputItems(new ComparableStack(ModItems.waste_plate_u233)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u235, 1), + new ItemStack(ModItems.powder_i131_tiny, 1), + new ItemStack(ModItems.powder_sr90_tiny, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 6)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.plateu235").setup(100, platePower).setNameWrapper("purex.recycle").setGroup(autoPlate, this) + .inputItems(new ComparableStack(ModItems.waste_plate_u235)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_neptunium, 1), + new ItemStack(ModItems.nugget_pu238, 1), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 6)) + .setIconToFirstIngredient()); + + // PWR + String autoPWR = "autoswitch.pwr"; + this.register(new GenericRecipe("purex.pwrmeu").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MEU)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u238, 3), + new ItemStack(ModItems.nugget_plutonium, 4), + new ItemStack(ModItems.nugget_technetium, 2), + new ItemStack(ModItems.nuclear_waste_tiny, 3)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrheu233").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEU233)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u235, 3), + new ItemStack(ModItems.nugget_pu238, 3), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 5)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrheu235").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEU235)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_neptunium, 3), + new ItemStack(ModItems.nugget_pu238, 3), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 5)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrmen").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MEN)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u238, 3), + new ItemStack(ModItems.nugget_pu239, 4), + new ItemStack(ModItems.nugget_technetium, 2), + new ItemStack(ModItems.nuclear_waste_tiny, 3)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrhen237").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEN237)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu238, 2), + new ItemStack(ModItems.nugget_pu239, 4), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 5)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrmox").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MOX)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_u238, 3), + new ItemStack(ModItems.nugget_pu240, 4), + new ItemStack(ModItems.nugget_technetium, 2), + new ItemStack(ModItems.nuclear_waste_tiny, 3)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrmep").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MEP)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_lead, 2), + new ItemStack(ModItems.nugget_pu_mix, 4), + new ItemStack(ModItems.nugget_technetium, 2), + new ItemStack(ModItems.nuclear_waste_tiny, 3)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrhep239").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEP239)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu_mix, 2), + new ItemStack(ModItems.nugget_pu240, 4), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 5)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrhep241").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEP241)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_lead, 3), + new ItemStack(ModItems.nugget_zirconium, 2), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 6)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrmea").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MEA)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_lead, 3), + new ItemStack(ModItems.nugget_zirconium, 2), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 6)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrhea242").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HEA242)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_lead, 3), + new ItemStack(ModItems.nugget_zirconium, 2), + new ItemStack(ModItems.nugget_technetium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 6)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrhes326").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HES326)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_solinium, 3), + new ItemStack(ModItems.nugget_lead, 2), + new ItemStack(ModItems.nugget_euphemium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 6)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrhes327").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.HES327)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_australium, 4), + new ItemStack(ModItems.nugget_lead, 1), + new ItemStack(ModItems.nugget_euphemium, 1), + new ItemStack(ModItems.nuclear_waste_tiny, 6)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrbfbam").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.BFB_AM_MIX)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_am_mix, 9), + new ItemStack(ModItems.nugget_pu_mix, 2), + new ItemStack(ModItems.nugget_bismuth, 6), + new ItemStack(ModItems.nuclear_waste_tiny, 1)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.pwrbfpu241").setup(100, pwrPower).setNameWrapper("purex.recycle").setGroup(autoPWR, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.BFB_PU241)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu241, 9), + new ItemStack(ModItems.nugget_pu_mix, 2), + new ItemStack(ModItems.nugget_bismuth, 6), + new ItemStack(ModItems.nuclear_waste_tiny, 1)) + .setIconToFirstIngredient()); + + // Molten Salt + this.register(new GenericRecipe("purex.thoriumsalt").setup(100, 10_000).setIcon(ModItems.fluid_icon, Fluids.THORIUM_SALT.getID()) + .inputFluids(new FluidStack(Fluids.THORIUM_SALT_DEPLETED, 16_000)) + .inputItems(new OreDictStack(TH232.nugget(), 2)) + .outputFluids(new FluidStack(Fluids.THORIUM_SALT, 16_000)) + .outputItems( + new ChanceOutput(new ItemStack(ModItems.nugget_u233, 1), 0.5F), + new ChanceOutput(new ItemStack(ModItems.nuclear_waste_tiny, 1), 0.25F))); + + // Watz + String autoWatz = "autoswitch.watz"; + this.register(new GenericRecipe("purex.watzschrab").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.SCHRABIDIUM)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_solinium, 15), + new ItemStack(ModItems.nugget_euphemium, 3), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzhes").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.HES)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_solinium, 17), + new ItemStack(ModItems.nugget_euphemium, 1), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzmes").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.MES)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_solinium, 12), + new ItemStack(ModItems.nugget_tantalium, 6), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzles").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.LES)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_solinium, 9), + new ItemStack(ModItems.nugget_tantalium, 9), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzhen").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.HEN)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu239, 12), + new ItemStack(ModItems.nugget_technetium, 6), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzmeu").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.MEU)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu239, 12), + new ItemStack(ModItems.nugget_bismuth, 6), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzmep").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.MEP)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_pu241, 12), + new ItemStack(ModItems.nugget_bismuth, 6), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzlead").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.LEAD)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_lead, 6), + new ItemStack(ModItems.nugget_bismuth, 12), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzboron").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.BORON)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.powder_coal_tiny, 12), + new ItemStack(ModItems.nugget_co60, 6), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watzdu").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.DU)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_polonium, 12), + new ItemStack(ModItems.nugget_pu238, 6), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + ArrayList naquadriaNuggets = OreDictionary.getOres("nuggetNaquadria"); + if(naquadriaNuggets.size() != 0) { + ItemStack nuggetNQR = naquadriaNuggets.get(0); + ItemStack copy = nuggetNQR.copy(); + copy.stackSize = 12; + + this.register(new GenericRecipe("purex.watznaqadah").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.NQD)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(copy, + new ItemStack(ModItems.nugget_euphemium, 6), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + + this.register(new GenericRecipe("purex.watznaqadria").setup(60, watzPower).setNameWrapper("purex.recycle").setGroup(autoWatz, this) + .inputItems(new ComparableStack(ModItems.watz_pellet_depleted, 1, EnumWatzType.NQR)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 500), new FluidStack(Fluids.NITRIC_ACID, 250)) + .outputItems(new ItemStack(ModItems.nugget_co60, 12), + new ItemStack(ModItems.nugget_euphemium, 6), + new ItemStack(ModItems.nuclear_waste, 2)) + .outputFluids(new FluidStack(Fluids.WATZ, 1_000)) + .setIconToFirstIngredient()); + } + + //ICF + this.register(new GenericRecipe("purex.icf").setup(300, 10_000).setNameWrapper("purex.recycle") + .inputItems(new ComparableStack(ModItems.icf_pellet_depleted)) + .outputItems(new ItemStack(ModItems.icf_pellet_empty, 1), + new ItemStack(ModItems.pellet_charged, 1), + new ItemStack(ModItems.pellet_charged, 1), + new ItemStack(ModItems.powder_iron, 1)) + .setIconToFirstIngredient()); + + /// Vitrification + this.register(new GenericRecipe("purex.vitliquid").setup(100, vitrification) + .inputItems(new ComparableStack(ModBlocks.sand_lead)) + .inputFluids(new FluidStack(Fluids.WASTEFLUID, 1_000)) + .outputItems(new ItemStack(ModItems.nuclear_waste_vitrified))); + + this.register(new GenericRecipe("purex.vitgaseous").setup(100, vitrification) + .inputItems(new ComparableStack(ModBlocks.sand_lead)) + .inputFluids(new FluidStack(Fluids.WASTEGAS, 1_000)) + .outputItems(new ItemStack(ModItems.nuclear_waste_vitrified))); + + this.register(new GenericRecipe("purex.vitsolid").setup(300, vitrification) + .inputItems(new ComparableStack(ModBlocks.sand_lead), new ComparableStack(ModItems.nuclear_waste, 4)) + .outputItems(new ItemStack(ModItems.nuclear_waste_vitrified, 4))); + + // Schrabidium + this.register(new GenericRecipe("purex.schraranium").setup(200, 1_000).setNameWrapper("purex.schrab") + .inputItems(new ComparableStack(ModItems.ingot_schraranium)) + .inputFluids(new FluidStack(Fluids.KEROSENE, 2_000), new FluidStack(Fluids.NITRIC_ACID, 1_000)) + .outputItems(new ItemStack(ModItems.nugget_schrabidium, 3), + new ItemStack(ModItems.nugget_uranium, 3), + new ItemStack(ModItems.nugget_neptunium, 2)) + .setIconToFirstIngredient()); + + String autoSchrab = "autoswitch.schrab"; + this.register(new GenericRecipe("purex.schrabzirnox").setup(200, 50_000).setNameWrapper("purex.schrab").setGroup(autoSchrab, this) + .inputItems(new ComparableStack(ModItems.waste_plutonium)) + .inputFluids(new FluidStack(Fluids.SOLVENT, 4_000), new FluidStack(Fluids.SCHRABIDIC, 500)) + .outputItems(new ItemStack(ModItems.powder_schrabidium, 1), + new ItemStack(ModItems.nugget_technetium, 3), + new ItemStack(ModItems.nuclear_waste_tiny, 4)) + .setIconToFirstIngredient()); + this.register(new GenericRecipe("purex.schrabpwr").setup(200, 50_000).setNameWrapper("purex.schrab").setGroup(autoSchrab, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MEP)) + .inputFluids(new FluidStack(Fluids.SOLVENT, 4_000), new FluidStack(Fluids.SCHRABIDIC, 500)) + .outputItems(new ItemStack(ModItems.powder_schrabidium, 1), + new ItemStack(ModItems.nugget_technetium, 3), + new ItemStack(ModItems.nuclear_waste_tiny, 4)) + .setIconToFirstIngredient()); + this.register(new GenericRecipe("purex.schrabmen").setup(200, 50_000).setNameWrapper("purex.schrab").setGroup(autoSchrab, this) + .inputItems(new ComparableStack(ModItems.pwr_fuel_depleted, 1, EnumPWRFuel.MEN)) + .inputFluids(new FluidStack(Fluids.SOLVENT, 4_000), new FluidStack(Fluids.SCHRABIDIC, 500)) + .outputItems(new ItemStack(ModItems.powder_schrabidium, 1), + new ItemStack(ModItems.nugget_technetium, 3), + new ItemStack(ModItems.nuclear_waste_tiny, 4)) + .setIconToFirstIngredient()); + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java b/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java index 8554afafc..b643ac3b7 100644 --- a/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java @@ -15,6 +15,7 @@ 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.ItemEnums.EnumChunkType; import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.food.ItemConserve.EnumFoodType; import com.hbm.items.ModItems; @@ -62,9 +63,9 @@ public class PedestalRecipes extends SerializableRecipe { .extra(PedestalExtraCondition.SUN)); register(new PedestalRecipe(new ItemStack(ModItems.gun_autoshotgun_sexy), - new ComparableStack(ModItems.bolt_spike, 16), new OreDictStack(STAR.ingot(), 4), new ComparableStack(ModItems.bolt_spike, 16), + new ComparableStack(ModItems.bolt_spike, 16), new ComparableStack(ModItems.wild_p), new ComparableStack(ModItems.bolt_spike, 16), new ComparableStack(ModItems.card_qos), new ComparableStack(ModItems.gun_autoshotgun), new ComparableStack(ModItems.card_aos), - new ComparableStack(ModItems.bolt_spike, 16), new OreDictStack(STAR.ingot(), 4), new ComparableStack(ModItems.bolt_spike, 16))); + new ComparableStack(ModItems.bolt_spike, 16), new OreDictStack(STAR.ingot(), 16), new ComparableStack(ModItems.bolt_spike, 16))); register(new PedestalRecipe(new ItemStack(ModItems.gun_minigun_lacunae), null, new ComparableStack(ModItems.powder_magic, 4), null, @@ -94,9 +95,9 @@ public class PedestalRecipes extends SerializableRecipe { .extra(PedestalExtraCondition.GOOD_KARMA).set(1)); register(new PedestalRecipe(new ItemStack(ModItems.ammo_secret, 1, EnumAmmoSecret.FOLLY_SM.ordinal()), - new OreDictStack(STAR.ingot(), 1), new ComparableStack(ModItems.powder_magic), new OreDictStack(STAR.ingot(), 1), - new ComparableStack(ModItems.powder_magic), new ComparableStack(ModBlocks.moon_turf), new ComparableStack(ModItems.powder_magic), - new OreDictStack(STAR.ingot(), 1), new ComparableStack(ModItems.powder_magic), new OreDictStack(STAR.ingot(), 1)) + new OreDictStack(STAR.ingot(), 1), new ComparableStack(ModItems.powder_magic), new OreDictStack(STAR.ingot(), 1), + new ComparableStack(ModItems.powder_magic), new ComparableStack(ModItems.chunk_ore, 1, EnumChunkType.MOONSTONE), new ComparableStack(ModItems.powder_magic), + new OreDictStack(STAR.ingot(), 1), new ComparableStack(ModItems.powder_magic), new OreDictStack(STAR.ingot(), 1)) .extra(PedestalExtraCondition.FULL_MOON).set(1)); register(new PedestalRecipe(new ItemStack(ModItems.ammo_secret, 1, EnumAmmoSecret.FOLLY_NUKE.ordinal()), new OreDictStack(STAR.ingot(), 1), new ComparableStack(ModItems.powder_magic), new OreDictStack(STAR.ingot(), 1), @@ -107,6 +108,10 @@ public class PedestalRecipes extends SerializableRecipe { null, null, null, null, new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), null, null, null, null).set(1)); + register(new PedestalRecipe(new ItemStack(ModItems.ammo_secret, 10, EnumAmmoSecret.P35_800_BL.ordinal()), + null, null, null, + null, new ComparableStack(ModItems.item_secret, 3, EnumSecretType.ABERRATOR), null, + null, null, null).set(1)); } public static void register(PedestalRecipe recipe) { diff --git a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java index efd778696..967fa3ace 100644 --- a/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ShredderRecipes.java @@ -205,7 +205,6 @@ public class ShredderRecipes extends SerializableRecipe { ShredderRecipes.setRecipe(Items.apple, new ItemStack(Items.sugar, 1)); ShredderRecipes.setRecipe(Items.carrot, new ItemStack(Items.sugar, 1)); ShredderRecipes.setRecipe(ModItems.can_empty, new ItemStack(ModItems.powder_aluminium, 2)); - ShredderRecipes.setRecipe(ModBlocks.machine_well, new ItemStack(ModItems.powder_steel, 32)); ShredderRecipes.setRecipe(DictFrame.fromOne(ModItems.chunk_ore, EnumChunkType.RARE), new ItemStack(ModItems.powder_desh_mix)); ShredderRecipes.setRecipe(Blocks.sand, new ItemStack(ModItems.dust, 2)); ShredderRecipes.setRecipe(ModBlocks.block_slag, new ItemStack(ModItems.powder_cement, 4)); @@ -264,12 +263,12 @@ public class ShredderRecipes extends SerializableRecipe { ShredderRecipes.setRecipe(ModItems.crystal_cobalt, new ItemStack(ModItems.powder_cobalt, 3)); /* Misc recycling */ - ShredderRecipes.setRecipe(ModBlocks.steel_poles, new ItemStack(ModItems.powder_steel_tiny, 3)); - ShredderRecipes.setRecipe(ModBlocks.steel_roof, new ItemStack(ModItems.powder_steel_tiny, 13)); - ShredderRecipes.setRecipe(ModBlocks.steel_wall, new ItemStack(ModItems.powder_steel_tiny, 13)); - ShredderRecipes.setRecipe(ModBlocks.steel_corner, new ItemStack(ModItems.powder_steel_tiny, 26)); + ShredderRecipes.setRecipe(ModBlocks.steel_poles, new ItemStack(ModItems.powder_steel_tiny, 2)); + ShredderRecipes.setRecipe(ModBlocks.steel_roof, new ItemStack(ModItems.powder_steel_tiny, 9)); + ShredderRecipes.setRecipe(ModBlocks.steel_wall, new ItemStack(ModItems.powder_steel_tiny, 9)); + ShredderRecipes.setRecipe(ModBlocks.steel_corner, new ItemStack(ModItems.powder_steel_tiny, 18)); ShredderRecipes.setRecipe(ModBlocks.steel_beam, new ItemStack(ModItems.powder_steel_tiny, 3)); - ShredderRecipes.setRecipe(new ItemStack(ModBlocks.steel_scaffold, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.powder_steel_tiny, 7)); + ShredderRecipes.setRecipe(new ItemStack(ModBlocks.steel_scaffold, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(ModItems.powder_steel_tiny, 4)); ShredderRecipes.setRecipe(ModItems.coil_copper, new ItemStack(ModItems.powder_red_copper, 1)); ShredderRecipes.setRecipe(ModItems.coil_copper_torus, new ItemStack(ModItems.powder_red_copper, 2)); ShredderRecipes.setRecipe(ModItems.coil_advanced_alloy, new ItemStack(ModItems.powder_advanced_alloy, 1)); @@ -285,7 +284,6 @@ public class ShredderRecipes extends SerializableRecipe { ShredderRecipes.setRecipe(ModBlocks.chain, new ItemStack(ModItems.powder_steel_tiny, 1)); ShredderRecipes.setRecipe(ModBlocks.steel_grate, new ItemStack(ModItems.powder_steel_tiny, 3)); ShredderRecipes.setRecipe(ModItems.pipes_steel, new ItemStack(ModItems.powder_steel, 27)); - ShredderRecipes.setRecipe(ModBlocks.machine_fluidtank, new ItemStack(ModItems.powder_steel, 16)); ShredderRecipes.setRecipe(new ItemStack(ModItems.bedrock_ore, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(Blocks.gravel)); /* Sellafite scrapping */ @@ -360,9 +358,9 @@ public class ShredderRecipes extends SerializableRecipe { /* AR COMPAT */ Block arMoonTurf = Compat.tryLoadBlock(Compat.MOD_AR, "turf"); - if(arMoonTurf != null && gcMoonBlock != Blocks.air) ShredderRecipes.setRecipe(arMoonTurf, new ItemStack(ModBlocks.moon_turf)); //i assume it's moon turf + if(arMoonTurf != null && arMoonTurf != Blocks.air) ShredderRecipes.setRecipe(arMoonTurf, new ItemStack(ModBlocks.moon_turf)); //i assume it's moon turf Block arMoonTurfDark = Compat.tryLoadBlock(Compat.MOD_AR, "turfDark"); - if(arMoonTurfDark != null && gcMoonBlock != Blocks.air) ShredderRecipes.setRecipe(arMoonTurfDark, new ItemStack(ModBlocks.moon_turf)); //probably moon dirt? would have helped if i had ever played AR for more than 5 seconds + if(arMoonTurfDark != null && arMoonTurfDark != Blocks.air) ShredderRecipes.setRecipe(arMoonTurfDark, new ItemStack(ModBlocks.moon_turf)); //probably moon dirt? would have helped if i had ever played AR for more than 5 seconds } /** @@ -374,8 +372,9 @@ public class ShredderRecipes extends SerializableRecipe { List matches = OreDictionary.getOres("dust" + name); - if(matches != null && !matches.isEmpty()) - return matches.get(0).copy(); + if(matches != null && !matches.isEmpty()) { + return Compat.getPreferredOreOutput(matches); + } return new ItemStack(ModItems.scrap); } 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 fca1efb87..291cc2341 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -215,9 +215,6 @@ public class AnvilRecipes extends SerializableRecipe { new AStack[] {new ComparableStack(ModItems.motor), new OreDictStack(ANY_PLASTIC.ingot(), 2), new OreDictStack(DESH.ingot(), 2), new ComparableStack(ModItems.coil_gold_torus)}, new AnvilOutput(new ItemStack(ModItems.motor_desh, 1))).setTier(3)); - pullFromAssembler(new ComparableStack(ModItems.filter_coal), 2); - pullFromAssembler(new ComparableStack(ModItems.thermo_element), 2); - constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new ComparableStack(Blocks.stonebrick, 4), @@ -226,15 +223,15 @@ public class AnvilRecipes extends SerializableRecipe { }, new AnvilOutput(new ItemStack(ModBlocks.machine_difurnace_off))).setTier(1)); - int ukModifier = 1; + boolean exp = GeneralConfig.enableExpensiveMode; + constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { - new OreDictStack(KEY_CLEARGLASS, 4 * ukModifier), - new OreDictStack(STEEL.ingot(), 8 * ukModifier), - new OreDictStack(CU.ingot(), 8 * ukModifier), - new ComparableStack(ModItems.motor, 2 * ukModifier), - new ComparableStack(ModItems.circuit, 4 * ukModifier, EnumCircuitType.VACUUM_TUBE.ordinal()) - }, new AnvilOutput(new ItemStack(ModBlocks.machine_assembler))).setTier(2)); + new OreDictStack(STEEL.ingot(), 8), + new OreDictStack(CU.plate(), 4), + new ComparableStack(ModItems.motor, 2), + exp ? new ComparableStack(ModItems.circuit, 2, EnumCircuitType.ANALOG) : new ComparableStack(ModItems.circuit, 4, EnumCircuitType.VACUUM_TUBE) + }, new AnvilOutput(new ItemStack(ModBlocks.machine_assembly_machine))).setTier(2)); constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { @@ -406,8 +403,6 @@ public class AnvilRecipes extends SerializableRecipe { new ComparableStack(ModItems.sawblade) }, new AnvilOutput(new ItemStack(ModBlocks.machine_autosaw))).setTier(2)); - pullFromAssembler(new ComparableStack(ModBlocks.machine_diesel), 2); - /*constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new OreDictStack(STEEL.ingot(), 6), @@ -547,8 +542,6 @@ public class AnvilRecipes extends SerializableRecipe { new AStack[] {new ComparableStack(ModItems.plate_dineutronium, 4), new ComparableStack(ModItems.particle_sparkticle, 1), new ComparableStack(ModItems.plate_armor_fau, 6)}, new AnvilOutput(new ItemStack(ModItems.plate_armor_dnt))).setTier(7)); - pullFromAssembler(new ComparableStack(ModItems.plate_mixed, 4), 3); - constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { new ComparableStack(ModItems.missile_doomsday_rusted, 1), @@ -595,37 +588,9 @@ public class AnvilRecipes extends SerializableRecipe { constructionRecipes.add(new AnvilConstructionRecipe(new AStack[]{new ComparableStack(ModItems.mold_base), new OreDictStack(STEEL.ingot(), 4)}, new AnvilOutput(new ItemStack(ModItems.mold, 1, 26))).setTier(2)); constructionRecipes.add(new AnvilConstructionRecipe(new AStack[]{new ComparableStack(ModItems.mold_base), new OreDictStack(STEEL.ingot(), 4)}, new AnvilOutput(new ItemStack(ModItems.mold, 1, 27))).setTier(2)); constructionRecipes.add(new AnvilConstructionRecipe(new AStack[]{new ComparableStack(ModItems.mold_base), new OreDictStack(STEEL.ingot(), 4)}, new AnvilOutput(new ItemStack(ModItems.mold, 1, 28))).setTier(2)); - - pullFromAssembler(new ComparableStack(ModItems.pellet_buckshot), 1); } - public static void registerConstructionUpgrades() { - pullFromAssembler(new ComparableStack(ModItems.upgrade_template), 2); - pullFromAssembler(new ComparableStack(ModItems.upgrade_speed_1), 2); - pullFromAssembler(new ComparableStack(ModItems.upgrade_speed_2), 3); - pullFromAssembler(new ComparableStack(ModItems.upgrade_speed_3), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_power_1), 2); - pullFromAssembler(new ComparableStack(ModItems.upgrade_power_2), 3); - pullFromAssembler(new ComparableStack(ModItems.upgrade_power_3), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_effect_1), 2); - pullFromAssembler(new ComparableStack(ModItems.upgrade_effect_2), 3); - pullFromAssembler(new ComparableStack(ModItems.upgrade_effect_3), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_fortune_1), 2); - pullFromAssembler(new ComparableStack(ModItems.upgrade_fortune_2), 3); - pullFromAssembler(new ComparableStack(ModItems.upgrade_fortune_3), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_afterburn_1), 2); - pullFromAssembler(new ComparableStack(ModItems.upgrade_afterburn_2), 3); - pullFromAssembler(new ComparableStack(ModItems.upgrade_afterburn_3), 4); - - pullFromAssembler(new ComparableStack(ModItems.upgrade_radius), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_health), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_smelter), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_shredder), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_centrifuge), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_crystallizer), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_nullifier), 4); - pullFromAssembler(new ComparableStack(ModItems.upgrade_screm), 4); - } + public static void registerConstructionUpgrades() { } public static void registerConstructionRecycling() { diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java index f2c8dfd42..53a0bb7a2 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; +import com.hbm.config.GeneralConfig; import com.hbm.inventory.FluidStack; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.recipes.loader.GenericRecipes.ChanceOutput; @@ -20,8 +21,9 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; public class GenericRecipe { - + protected final String name; + public String nameWrapper; public AStack[] inputItem; public FluidStack[] inputFluid; public IOutput[] outputItem; @@ -31,34 +33,58 @@ public class GenericRecipe { protected ItemStack icon; public boolean writeIcon = false; public boolean customLocalization = false; - + protected String[] blueprintPools = null; + public String autoSwitchGroup = null; + public GenericRecipe(String name) { this.name = name; } - + + public boolean isPooled() { return blueprintPools != null; } + public String[] getPools() { return this.blueprintPools; } + + public boolean isPartOfPool(String lookingFor) { + if(!isPooled()) return false; + for(String pool : blueprintPools) if (pool.equals(lookingFor)) return true; + return false; + } + public GenericRecipe setDuration(int duration) { this.duration = duration; return this; } public GenericRecipe setPower(long power) { this.power = power; return this; } public GenericRecipe setup(int duration, long power) { return this.setDuration(duration).setPower(power); } public GenericRecipe setupNamed(int duration, long power) { return this.setDuration(duration).setPower(power).setNamed(); } + public GenericRecipe setNameWrapper(String wrapper) { this.nameWrapper = wrapper; return this; } public GenericRecipe setIcon(ItemStack icon) { this.icon = icon; this.writeIcon = true; return this; } public GenericRecipe setIcon(Item item, int meta) { return this.setIcon(new ItemStack(item, 1, meta)); } public GenericRecipe setIcon(Item item) { return this.setIcon(new ItemStack(item)); } public GenericRecipe setIcon(Block block) { return this.setIcon(new ItemStack(block)); } public GenericRecipe setNamed() { this.customLocalization = true; return this; } + public GenericRecipe setPools(String... pools) { this.blueprintPools = pools; for(String pool : pools) GenericRecipes.addToPool(pool, this); return this; } + public GenericRecipe setGroup(String autoSwitch, GenericRecipes set) { this.autoSwitchGroup = autoSwitch; set.addToGroup(autoSwitch, this); return this; } - public GenericRecipe inputItems(AStack... input) { this.inputItem = input; return this; } + public GenericRecipe inputItems(AStack... input) { this.inputItem = input; for(AStack stack : this.inputItem) if(stack.stacksize > 64) throw new IllegalArgumentException("AStack in " + this.name + " exceeds stack limit!"); return this; } + public GenericRecipe inputItemsEx(AStack... input) { if(!GeneralConfig.enableExpensiveMode) return this; this.inputItem = input; for(AStack stack : this.inputItem) if(stack.stacksize > 64) throw new IllegalArgumentException("AStack in " + this.name + " exceeds stack limit!"); return this; } public GenericRecipe inputFluids(FluidStack... input) { this.inputFluid = input; return this; } + public GenericRecipe inputFluidsEx(FluidStack... input) { if(!GeneralConfig.enableExpensiveMode) return this; this.inputFluid = input; return this; } public GenericRecipe outputItems(IOutput... output) { this.outputItem = output; return this; } public GenericRecipe outputFluids(FluidStack... output) { this.outputFluid = output; return this; } - + public GenericRecipe outputItems(ItemStack... output) { this.outputItem = new IOutput[output.length]; for(int i = 0; i < outputItem.length; i++) this.outputItem[i] = new ChanceOutput(output[i]); return this; } - + + public GenericRecipe setIconToFirstIngredient() { + if(this.inputItem != null) { + List stacks = this.inputItem[0].extractForNEI(); + if(!stacks.isEmpty()) this.icon = stacks.get(0); + } + return this; + } + public ItemStack getIcon() { - + if(icon == null) { if(outputItem != null) { if(outputItem[0] instanceof ChanceOutput) icon = ((ChanceOutput) outputItem[0]).stack.copy(); @@ -69,37 +95,67 @@ public class GenericRecipe { icon = ItemFluidIcon.make(outputFluid[0]); } } - + if(icon == null) icon = new ItemStack(ModItems.nothing); return icon; } - + public String getInternalName() { return this.name; } - + public String getLocalizedName() { - if(customLocalization) return I18nUtil.resolveKey(name); - return this.getIcon().getDisplayName(); + String name = null; + if(customLocalization) name = I18nUtil.resolveKey(this.name); + if(name == null) name = this.getIcon().getDisplayName(); + if(this.nameWrapper != null) name = I18nUtil.resolveKey(this.nameWrapper, name); + return name; } - + public List print() { List list = new ArrayList(); list.add(EnumChatFormatting.YELLOW + this.getLocalizedName()); - if(duration > 0) list.add(EnumChatFormatting.RED + "Duration: " + this.duration / 20D + "s"); - if(power > 0) list.add(EnumChatFormatting.RED + "Consumption: " + BobMathUtil.getShortNumber(power) + "HE/t"); - list.add(EnumChatFormatting.BOLD + "Input:"); + + // autoswitch group (two lines: label + "Enabled for") + if(this.autoSwitchGroup != null) { + String[] lines = I18nUtil.resolveKeyArray("autoswitch", I18nUtil.resolveKey(this.autoSwitchGroup)); + for(String line : lines) list.add(EnumChatFormatting.GOLD + line); + } + + // duration (seconds) + if(duration > 0) { + double seconds = this.duration / 20D; + list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("gui.recipe.duration") + ": " + seconds + "s"); + } + + // power / consumption + if(power > 0) { + list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("gui.recipe.consumption") + ": " + BobMathUtil.getShortNumber(power) + "HE/t"); + } + + // input label + items + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.recipe.input") + ":"); if(inputItem != null) for(AStack stack : inputItem) { ItemStack display = stack.extractForCyclingDisplay(20); list.add(" " + EnumChatFormatting.GRAY + display.stackSize + "x " + display.getDisplayName()); } - if(inputFluid != null) for(FluidStack fluid : inputFluid) list.add(" " + EnumChatFormatting.BLUE + fluid.fill + "mB " + fluid.type.getLocalizedName() + (fluid.pressure == 0 ? "" : " at " + EnumChatFormatting.RED + fluid.pressure + " PU")); - list.add(EnumChatFormatting.BOLD + "Output:"); - if(outputItem != null) for(IOutput output : outputItem) for(String line : output.getLabel()) list.add(" " + line); - if(outputFluid != null) for(FluidStack fluid : outputFluid) list.add(" " + EnumChatFormatting.BLUE + fluid.fill + "mB " + fluid.type.getLocalizedName() + (fluid.pressure == 0 ? "" : " at " + EnumChatFormatting.RED + fluid.pressure + " PU")); + if (inputFluid != null) for (FluidStack fluid : inputFluid) list.add(" " + EnumChatFormatting.BLUE + fluid.fill + "mB " + fluid.type.getLocalizedName() + (fluid.pressure == 0 ? "" : " " + I18nUtil.resolveKey("gui.recipe.atPressure") + " " + EnumChatFormatting.RED + fluid.pressure + " PU")); + + // output label + items + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.recipe.output") + ":"); + if(outputItem != null) for(IOutput output : outputItem) + for(String line : output.getLabel()) list.add(" " + line); + if(outputFluid != null) for(FluidStack fluid : outputFluid) { + String mB = I18nUtil.resolveKey("gui.recipe.mB"); + String pressurePart = fluid.pressure == 0 ? "" : + " " + I18nUtil.resolveKey("gui.recipe.atPressure") + " " + EnumChatFormatting.RED + fluid.pressure + " PU"; + list.add(" " + EnumChatFormatting.BLUE + fluid.fill + mB + " " + fluid.type.getLocalizedName() + pressurePart); + } + return list; } - + + /** Default impl only matches localized name substring, can be extended to include ingredients as well */ public boolean matchesSearch(String substring) { return getLocalizedName().toLowerCase(Locale.US).contains(substring.toLowerCase(Locale.US)); diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java index 027bb8bb3..0bee0728a 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java @@ -32,8 +32,23 @@ public abstract class GenericRecipes extends Serializab public static final Random RNG = new Random(); + /** Alternate recipes, i.e. obtainable otherwise */ + public static final String POOL_PREFIX_ALT = "alt."; + /** Discoverable recipes, i.e. not obtainable otherwise */ + public static final String POOL_PREFIX_DISCOVER = "discover."; + /** Secret recipes, self-explantory. Why even have this comment? */ + public static final String POOL_PREFIX_SECRET = "secret."; + public List recipeOrderedList = new ArrayList(); public HashMap recipeNameMap = new HashMap(); + + /** Blueprint pool name to list of recipe names that are part of this pool */ + public static HashMap> blueprintPools = new HashMap(); + /** Name to recipe map for all recipes that are part of pools for lookup */ + public static HashMap pooledBlueprints = new HashMap(); + + /** Groups for auto switch functionality (changes recipe automatically based on first solid input) */ + public HashMap> autoSwitchGroups = new HashMap(); public abstract int inputItemLimit(); public abstract int inputFluidLimit(); @@ -41,6 +56,30 @@ public abstract class GenericRecipes extends Serializab public abstract int outputFluidLimit(); public boolean hasDuration() { return true; } public boolean hasPower() { return true; } + + /** Adds a recipe to a blueprint pool (i.e. a blueprint item's recipe list) */ + public static void addToPool(String pool, GenericRecipe recipe) { + List list = blueprintPools.get(pool); + if(list == null) { + list = new ArrayList(); + blueprintPools.put(pool, list); + } + list.add(recipe.name); + pooledBlueprints.put(recipe.name, recipe); + } + + /** Adds a recipe to an auto switch group (recipe can switch based on first solid input) */ + public void addToGroup(String group, GenericRecipe recipe) { + List list = autoSwitchGroups.get(group); + if(list == null) list = new ArrayList(); + list.add(recipe); + autoSwitchGroups.put(group, list); + } + + public static void clearPools() { + blueprintPools.clear(); + pooledBlueprints.clear(); + } @Override public Object getRecipeObject() { @@ -51,11 +90,12 @@ public abstract class GenericRecipes extends Serializab public void deleteRecipes() { this.recipeOrderedList.clear(); this.recipeNameMap.clear(); + this.autoSwitchGroups.clear(); } public void register(T recipe) { this.recipeOrderedList.add(recipe); - if(recipeNameMap.containsKey(recipe.name)) throw new IllegalStateException("Recipe " + recipe.name + " has been reciped with a duplicate ID!"); + if(recipeNameMap.containsKey(recipe.name)) throw new IllegalStateException("Recipe " + recipe.name + " has been registered with a duplicate ID!"); this.recipeNameMap.put(recipe.name, recipe); } @@ -75,6 +115,9 @@ public abstract class GenericRecipes extends Serializab if(obj.has("icon")) recipe.setIcon(this.readItemStack(obj.get("icon").getAsJsonArray())); if(obj.has("named") && obj.get("named").getAsBoolean()) recipe.setNamed(); + if(obj.has("blueprintpool")) recipe.setPools(obj.get("blueprintpool").getAsString().split(":")); + if(obj.has("nameWrapper")) recipe.setNameWrapper(obj.get("nameWrapper").getAsString()); + if(obj.has("autoSwitchGroup")) recipe.setGroup(obj.get("autoSwitchGroup").getAsString(), this); readExtraData(element, recipe); @@ -121,8 +164,11 @@ public abstract class GenericRecipes extends Serializab writer.name("icon"); this.writeItemStack(recipe.icon, writer); } - + if(recipe.customLocalization) writer.name("named").value(true); + if(recipe.nameWrapper != null) writer.name("nameWrapper").value(recipe.nameWrapper); + if(recipe.blueprintPools != null && recipe.blueprintPools.length > 0) writer.name("blueprintpool").value(String.join(":", recipe.blueprintPools)); + if(recipe.autoSwitchGroup != null) writer.name("autoSwitchGroup").value(recipe.autoSwitchGroup); writeExtraData(recipe, writer); } @@ -175,7 +221,7 @@ public abstract class GenericRecipes extends Serializab // a weight of 0 means this output is not part of a weighted output public ItemStack stack; - public float chance; + public float chance = 1F; public ChanceOutput() { super(0); } // for deserialization public ChanceOutput(ItemStack stack) { this(stack, 1F, 0); } 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 a89e19b26..2770da7c7 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -83,7 +83,9 @@ public abstract class SerializableRecipe { recipeHandlers.add(new PedestalRecipes()); //GENERIC + recipeHandlers.add(AssemblyMachineRecipes.INSTANCE); recipeHandlers.add(ChemicalPlantRecipes.INSTANCE); + recipeHandlers.add(PUREXRecipes.INSTANCE); recipeHandlers.add(new MatDistribution()); recipeHandlers.add(new CustomMachineRecipes()); @@ -105,6 +107,8 @@ public abstract class SerializableRecipe { MainRegistry.logger.info("Starting recipe init!"); + GenericRecipes.clearPools(); + for(SerializableRecipe recipe : recipeHandlers) { recipe.deleteRecipes(); @@ -119,7 +123,7 @@ public abstract class SerializableRecipe { Reader reader = new InputStreamReader(stream); recipe.readRecipeStream(reader); recipe.modified = true; - } catch(IOException ex) { + } catch(Throwable ex) { MainRegistry.logger.error("Failed to reset synced recipe stream", ex); } } else if(recFile.exists() && recFile.isFile()) { @@ -237,7 +241,7 @@ public abstract class SerializableRecipe { JsonObject json = gson.fromJson(reader, JsonObject.class); JsonArray recipes = json.get("recipes").getAsJsonArray(); for(JsonElement recipe : recipes) { - this.readRecipe(recipe); + if(recipe != null) this.readRecipe(recipe); } } diff --git a/src/main/java/com/hbm/itempool/ItemPoolsComponent.java b/src/main/java/com/hbm/itempool/ItemPoolsComponent.java index 7bbeea0e0..1e4600988 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsComponent.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsComponent.java @@ -50,7 +50,8 @@ public class ItemPoolsComponent { weighted(ModItems.circuit, EnumCircuitType.VACUUM_TUBE.ordinal(), 1, 2, 4), weighted(ModItems.circuit, EnumCircuitType.PCB.ordinal(), 1, 3, 5), weighted(ModItems.circuit, EnumCircuitType.CAPACITOR.ordinal(), 1, 1, 3), - weighted(ModItems.blade_titanium, 0, 1, 8, 1) + weighted(ModItems.blade_titanium, 0, 1, 8, 1), + weighted(ModItems.blueprint_folder, 0, 1, 1, 1) }; }}; @@ -108,7 +109,8 @@ public class ItemPoolsComponent { weighted(ModItems.can_mrsugar, 0, 1, 2, 2), weighted(ModItems.cap_nuka, 0, 1, 16, 2), weighted(ModItems.book_guide, 3, 1, 1, 1), - weighted(ModBlocks.deco_computer, 0, 1, 1, 1) + weighted(ModBlocks.deco_computer, 0, 1, 1, 1), + weighted(ModItems.blueprint_folder, 0, 1, 1, 1) }; }}; @@ -123,7 +125,8 @@ public class ItemPoolsComponent { weighted(ModItems.toothpicks, 0, 1, 16, 10), weighted(ModItems.dust, 0, 1, 1, 40), weighted(ModItems.dust_tiny, 0, 1, 3, 75), - weighted(ModItems.ink, 0, 1, 1, 1) + weighted(ModItems.ink, 0, 1, 1, 1), + weighted(ModItems.blueprint_folder, 0, 1, 1, 5) }; }}; @@ -156,7 +159,8 @@ public class ItemPoolsComponent { weighted(ModItems.powder_bromine, 0, 1, 1, 1), weighted(ModItems.powder_cobalt, 0, 1, 1, 1), weighted(ModItems.powder_neodymium, 0, 1, 1, 1), - weighted(ModItems.powder_boron, 0, 1, 1, 1) + weighted(ModItems.powder_boron, 0, 1, 1, 1), + weighted(ModItems.blueprint_folder, 1, 1, 1, 1) }; }}; @@ -184,7 +188,9 @@ public class ItemPoolsComponent { weighted(Items.paper, 0, 1, 6, 7), weighted(Items.clock, 0, 1, 1, 3), weighted(Items.book, 0, 1, 5, 10), - weighted(Items.experience_bottle, 0, 1, 3, 1) + weighted(Items.experience_bottle, 0, 1, 3, 1), + weighted(ModItems.blueprint_folder, 0, 1, 1, 1), + weighted(ModItems.blueprint_folder, 1, 1, 1, 1) }; }}; @@ -220,7 +226,7 @@ public class ItemPoolsComponent { weighted(ModItems.pellet_rtg_weak,0, 0, 1, 1), }; }}; - + new ItemPool(POOL_REPAIR_MATERIALS) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.ingot_aluminium, 0, 2, 8, 3), diff --git a/src/main/java/com/hbm/itempool/ItemPoolsLegacy.java b/src/main/java/com/hbm/itempool/ItemPoolsLegacy.java index ef3bc5569..31d43ed4f 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsLegacy.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsLegacy.java @@ -64,7 +64,8 @@ public class ItemPoolsLegacy { weighted(ModItems.canister_full, Fluids.DIESEL.getID(), 1, 2, 2), weighted(ModItems.canister_full, Fluids.BIOFUEL.getID(), 1, 2, 3), weighted(ModItems.gas_mask_m65, 60, 1, 1, 2), - weighted(ModItems.gas_mask_filter, 0, 1, 1, 3) + weighted(ModItems.gas_mask_filter, 0, 1, 1, 3), + weighted(ModItems.blueprint_folder, 0, 1, 1, 1) }; }}; @@ -130,10 +131,9 @@ public class ItemPoolsLegacy { weighted(ModItems.bomb_caller, 1, 1, 1, 1), weighted(ModItems.bomb_caller, 2, 1, 1, 1), weighted(ModItems.gas_mask_filter, 0, 1, 1, 4), - weighted(ModItems.journal_pip, 0, 1, 1, 1), - weighted(ModItems.journal_bj, 0, 1, 1, 1), weighted(ModItems.launch_code_piece, 0, 1, 1, 1), weighted(ModItems.gun_double_barrel, 0, 1, 1, 1), + weighted(ModItems.blueprint_folder, 1, 1, 1, 1) }; }}; diff --git a/src/main/java/com/hbm/itempool/ItemPoolsPile.java b/src/main/java/com/hbm/itempool/ItemPoolsPile.java index ad2a7f3ae..0a4378211 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsPile.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsPile.java @@ -21,9 +21,10 @@ public class ItemPoolsPile { public static final String POOL_PILE_MAKESHIFT_PLATES = "POOL_PILE_MAKESHIFT_PLATES"; public static final String POOL_PILE_MAKESHIFT_WIRE = "POOL_PILE_MAKESHIFT_WIRE"; public static final String POOL_PILE_NUKE_STORAGE = "POOL_PILE_NUKE_STORAGE"; - + public static final String POOL_PILE_OF_GARBAGE = "POOL_PILE_OF_GARBAGE"; + public static void init() { - + //items found in glyphid hives new ItemPool(POOL_PILE_HIVE) {{ this.pool = new WeightedRandomChestContent[] { @@ -56,7 +57,7 @@ public class ItemPoolsPile { weighted(Items.experience_bottle, 0, 1, 3, 5), }; }}; - + //items found in glyphid bone piles new ItemPool(POOL_PILE_BONES) {{ this.pool = new WeightedRandomChestContent[] { @@ -65,7 +66,7 @@ public class ItemPoolsPile { weighted(ModItems.biomass, 0, 1, 1, 2) }; }}; - + //bottlecap stashess new ItemPool(POOL_PILE_CAPS) {{ this.pool = new WeightedRandomChestContent[] { @@ -74,7 +75,7 @@ public class ItemPoolsPile { weighted(ModItems.cap_sparkle, 0, 4, 4, 1), }; }}; - + //medicine stashes new ItemPool(POOL_PILE_MED_SYRINGE) {{ this.pool = new WeightedRandomChestContent[] { @@ -91,13 +92,13 @@ public class ItemPoolsPile { weighted(ModItems.siox, 0, 1, 1, 5), }; }}; - + //makeshift gun new ItemPool(POOL_PILE_MAKESHIFT_GUN) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.gun_maresleg, 0, 1, 1, 10) }; }}; new ItemPool(POOL_PILE_MAKESHIFT_WRENCH) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.wrench, 0, 1, 1, 10) }; }}; new ItemPool(POOL_PILE_MAKESHIFT_PLATES) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.plate_steel, 0, 1, 1, 10) }; }}; new ItemPool(POOL_PILE_MAKESHIFT_WIRE) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.wire_fine, Mats.MAT_ALUMINIUM.id, 1, 1, 10) }; }}; - + new ItemPool(POOL_PILE_NUKE_STORAGE) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.ammo_standard, EnumAmmo.NUKE_STANDARD.ordinal(), 1, 1, 50), @@ -106,5 +107,34 @@ public class ItemPoolsPile { }; }}; + + new ItemPool(POOL_PILE_OF_GARBAGE) {{ + this.pool = new WeightedRandomChestContent[] { + weighted(ModItems.pipe, 2600, 0, 2, 20), + weighted(ModItems.scrap, 0, 1, 5, 20), + weighted(ModItems.wire_fine, 8200, 1, 2, 20), + weighted(ModItems.dust, 0, 1, 3, 40), + weighted(ModItems.dust_tiny, 0, 1, 7, 40), + weighted(ModItems.powder_cement, 0, 1, 6, 40), + weighted(ModItems.nugget_lead, 0, 0, 3, 20), + weighted(ModItems.wire_fine, 0, 0, 3, 20), + weighted(ModItems.powder_ash, 0, 0, 1, 15), + weighted(ModItems.plate_lead, 0, 0, 1, 15), + weighted(Items.string, 0, 0, 1, 15), + weighted(ModItems.bolt, 8200, 0, 2, 15), + weighted(ModItems.pin, 0, 0, 2, 15), + weighted(ModItems.cap_nuka, 0, 0, 8, 15), + weighted(ModItems.plate_iron, 0, 0, 2, 15), + weighted(ModItems.fallout, 0, 0, 2, 15), + weighted(ModItems.coil_tungsten, 0, 0, 2, 15), + weighted(ModItems.can_empty, 0, 0, 1, 15), + weighted(ModItems.ingot_asbestos, 0, 0, 1, 15), + weighted(ModItems.syringe_metal_empty, 0, 0, 1, 15), + weighted(ModItems.syringe_empty, 0, 0, 1, 15), + weighted(ModItems.pipe_lead, 0, 0, 1, 5), + weighted(ModItems.motor, 0, 0, 1, 5), + weighted(ModItems.canned_conserve, 2, 0, 1, 5), + }; + }}; } } diff --git a/src/main/java/com/hbm/itempool/ItemPoolsRedRoom.java b/src/main/java/com/hbm/itempool/ItemPoolsRedRoom.java index 4b1c88353..e4a85d34a 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsRedRoom.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsRedRoom.java @@ -43,6 +43,7 @@ public class ItemPoolsRedRoom { weighted(ModItems.gun_hangman, 0, 1, 1, 1), weighted(ModItems.gun_mas36, 0, 1, 1, 1), + weighted(ModItems.item_secret, EnumSecretType.FOLLY.ordinal(), 1, 1, 1), }; }}; @@ -59,6 +60,7 @@ public class ItemPoolsRedRoom { weighted(ModItems.item_secret, EnumSecretType.SELENIUM_STEEL.ordinal(), 4, 4, 10), weighted(ModItems.item_secret, EnumSecretType.CONTROLLER.ordinal(), 1, 1, 10), weighted(ModItems.item_secret, EnumSecretType.CANISTER.ordinal(), 1, 1, 10), + weighted(ModItems.blueprint_folder, 2, 1, 1, 1), }; }}; } diff --git a/src/main/java/com/hbm/itempool/ItemPoolsSingle.java b/src/main/java/com/hbm/itempool/ItemPoolsSingle.java index 47c0a9c17..f8dd79f0a 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsSingle.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsSingle.java @@ -124,6 +124,7 @@ public class ItemPoolsSingle { weighted(ModItems.launch_code_piece, 0, 1, 1, 5), weighted(ModItems.egg_glyphid, 0, 1, 1, 5), weighted(ModItems.gem_alexandrite, 0, 1, 1, 1), + weighted(ModItems.blueprint_folder, 1, 1, 1, 1) }; }}; } diff --git a/src/main/java/com/hbm/items/ICustomizable.java b/src/main/java/com/hbm/items/ICustomizable.java new file mode 100644 index 000000000..74b82506f --- /dev/null +++ b/src/main/java/com/hbm/items/ICustomizable.java @@ -0,0 +1,9 @@ +package com.hbm.items; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +public interface ICustomizable { + + public void customize(EntityPlayer player, ItemStack stack, String... args); +} diff --git a/src/main/java/com/hbm/items/ItemEnums.java b/src/main/java/com/hbm/items/ItemEnums.java index 18878469c..560823508 100644 --- a/src/main/java/com/hbm/items/ItemEnums.java +++ b/src/main/java/com/hbm/items/ItemEnums.java @@ -53,7 +53,8 @@ public class ItemEnums { public static enum EnumChunkType { RARE, MALACHITE, - CRYOLITE + CRYOLITE, + MOONSTONE } public static enum EnumAchievementType { @@ -87,6 +88,10 @@ public class ItemEnums { } public static enum EnumIngotMetal { - INGOT, COUNTER, KEY, BEACON, CASING, CLOCKWORK, BAR, DETECTOR + SCRAP, INGOT, COUNTER, KEY, BEACON, CASING, CLOCKWORK, BAR, DETECTOR + } + + public static enum EnumExpensiveType { + STEEL_PLATING, HEAVY_FRAME, CIRCUIT, LEAD_PLATING, FERRO_PLATING, COMPUTER, BRONZE_TUBES } } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index b27e20e3e..df8387936 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1,5 +1,7 @@ package com.hbm.items; +import java.util.HashSet; + import com.hbm.blocks.ModBlocks; import com.hbm.config.VersatileConfig; import com.hbm.handler.BucketHandler; @@ -63,6 +65,8 @@ import net.minecraftforge.fluids.FluidStack; public class ModItems { + public static HashSet excludeNEI = new HashSet(); + public static void mainRegistry() { initializeItem(); registerItem(); @@ -322,7 +326,7 @@ public class ModItems { public static Item plate_combine_steel; public static Item plate_mixed; public static Item plate_paa; - public static Item pipes_steel; + @Deprecated public static Item pipes_steel; public static Item drill_titanium; public static Item plate_dalekanium; public static Item plate_euphemium; @@ -338,6 +342,7 @@ public class ModItems { public static Item thruster_nuclear; public static Item safety_fuse; public static Item part_generic; + public static Item item_expensive; public static Item item_secret; public static Item ingot_metal; public static Item chemical_dye; @@ -553,22 +558,19 @@ public class ModItems { public static Item coil_copper; public static Item coil_copper_torus; public static Item coil_tungsten; - public static Item tank_steel; + @Deprecated public static Item tank_steel; public static Item motor; public static Item motor_desh; public static Item motor_bismuth; public static Item centrifuge_element; public static Item reactor_core; public static Item rtg_unit; - public static Item levitation_unit; public static Item coil_advanced_alloy; public static Item coil_advanced_torus; public static Item coil_magnetized_tungsten; public static Item coil_gold; public static Item coil_gold_torus; - public static Item component_limiter; - public static Item component_emitter; public static Item chlorine_pinwheel; public static Item deuterium_filter; @@ -644,12 +646,6 @@ public class ModItems { public static Item seg_15; public static Item seg_20; - public static Item chopper_head; - public static Item chopper_gun; - public static Item chopper_torso; - public static Item chopper_tail; - public static Item chopper_wing; - public static Item chopper_blades; public static Item combine_scrap; public static Item shimmer_head; @@ -706,7 +702,6 @@ public class ModItems { public static Item ingot_raw; public static Item plate_cast; public static Item plate_welded; - public static Item heavy_component; public static Item wire_fine; public static Item wire_dense; public static Item part_barrel_light; @@ -747,15 +742,12 @@ public class ModItems { public static Item pellet_rtg_gold; public static Item pellet_rtg_lead; - public static Item tritium_deuterium_cake; + @Deprecated public static Item tritium_deuterium_cake; public static Item piston_selenium; public static Item piston_set; public static Item drillbit; - //public static Item crystal_energy; - //public static Item pellet_coolant; - public static Item rune_blank; public static Item rune_isa; public static Item rune_dagaz; @@ -856,6 +848,8 @@ public class ModItems { public static Item fluid_barrel_full; public static Item fluid_barrel_empty; public static Item fluid_barrel_infinite; + public static Item fluid_pack_full; + public static Item fluid_pack_empty; public static Item pipette; public static Item pipette_boron; public static Item pipette_laboratory; @@ -926,8 +920,6 @@ public class ModItems { public static Item bottle2_empty; public static Item bottle2_korl; public static Item bottle2_fritz; - public static Item bottle2_korl_special; - public static Item bottle2_fritz_special; public static Item flask_empty; public static Item flask_infusion; public static Item chocolate_milk; @@ -1043,6 +1035,7 @@ public class ModItems { public static Item pwr_fuel; public static Item pwr_fuel_hot; public static Item pwr_fuel_depleted; + public static Item pwr_printer; public static Item rbmk_lid; public static Item rbmk_lid_glass; @@ -1169,6 +1162,7 @@ public class ModItems { public static Item pellet_buckshot; public static Item pellet_charged; + public static Item rangefinder; public static Item designator; public static Item designator_range; public static Item designator_manual; @@ -1192,13 +1186,12 @@ public class ModItems { public static Item radar_linker; public static Item settings_tool; + public static Item blueprints; + public static Item blueprint_folder; public static Item template_folder; - public static Item journal_pip; - public static Item journal_bj; - public static Item journal_silver; - public static Item assembly_template; - public static Item chemistry_template; - public static Item chemistry_icon; + @Deprecated public static Item assembly_template; + @Deprecated public static Item chemistry_template; + @Deprecated public static Item chemistry_icon; public static Item crucible_template; public static Item fluid_identifier; public static Item fluid_identifier_multi; @@ -1244,11 +1237,9 @@ public class ModItems { public static Item missile_test; public static Item mp_thruster_10_kerosene; - public static Item mp_thruster_10_kerosene_tec; public static Item mp_thruster_10_solid; public static Item mp_thruster_10_xenon; public static Item mp_thruster_15_kerosene; - public static Item mp_thruster_15_kerosene_tec; public static Item mp_thruster_15_kerosene_dual; public static Item mp_thruster_15_kerosene_triple; public static Item mp_thruster_15_solid; @@ -1359,8 +1350,6 @@ public class ModItems { public static Item mp_fuselage_15_20_kerosene_magnusson; public static Item mp_fuselage_15_20_solid; - public static Item mp_fuselage_20_kerosene; - public static Item mp_warhead_10_he; public static Item mp_warhead_10_incendiary; public static Item mp_warhead_10_buster; @@ -1377,7 +1366,6 @@ public class ModItems { public static Item mp_warhead_15_n2; public static Item mp_warhead_15_balefire; public static Item mp_warhead_15_turbine; - public static Item mp_warhead_20_he; public static Item mp_chip_1; public static Item mp_chip_2; @@ -1465,6 +1453,7 @@ public class ModItems { public static Item gun_autoshotgun; public static Item gun_autoshotgun_shredder; public static Item gun_autoshotgun_sexy; + public static Item gun_autoshotgun_heretic; public static Item gun_quadro; public static Item gun_lag; public static Item gun_minigun; @@ -1488,7 +1477,7 @@ public class ModItems { public static Item gun_aberrator_eott; public static Item gun_double_barrel; public static Item gun_double_barrel_sacred_dragon; - + public static Item gun_n_i_4_n_i; public static Item gun_charge_thrower; public static Item ammo_standard; @@ -2083,6 +2072,8 @@ public class ModItems { public static Item hazmat_paa_legs; public static Item hazmat_paa_boots; + public static Item rebar_placer; + public static Item wand; public static Item wand_s; public static Item wand_d; @@ -2191,7 +2182,6 @@ public class ModItems { public static Item polaroid; public static Item glitch; - public static Item letter; public static Item book_secret; public static Item book_of_; public static Item page_of_; @@ -2245,7 +2235,7 @@ public class ModItems { public static Item conveyor_wand; public static void initializeItem() { - + redstone_sword = new RedstoneSword(ToolMaterial.STONE).setUnlocalizedName("redstone_sword").setCreativeTab(CreativeTabs.tabCombat).setTextureName(RefStrings.MODID + ":redstone_sword"); big_sword = new BigSword(ToolMaterial.EMERALD).setUnlocalizedName("big_sword").setCreativeTab(CreativeTabs.tabCombat).setTextureName(RefStrings.MODID + ":big_sword"); @@ -2352,6 +2342,7 @@ public class ModItems { thruster_nuclear = new Item().setUnlocalizedName("thruster_nuclear").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":thruster_nuclear"); safety_fuse = new Item().setUnlocalizedName("safety_fuse").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":safety_fuse"); part_generic = new ItemGenericPart().setUnlocalizedName("part_generic").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":part_generic"); + item_expensive = new ItemExpensive().setUnlocalizedName("item_expensive").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":item_expensive"); item_secret = new ItemEnumMulti(EnumSecretType.class, true, true).setUnlocalizedName("item_secret").setCreativeTab(null).setTextureName(RefStrings.MODID + ":item_secret"); ingot_metal = new ItemEnumMulti(EnumIngotMetal.class, true, true).setUnlocalizedName("ingot_metal").setCreativeTab(null).setTextureName(RefStrings.MODID + ":ingot_metal"); chemical_dye = new ItemChemicalDye().setUnlocalizedName("chemical_dye").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chemical_dye"); @@ -2723,12 +2714,9 @@ public class ModItems { centrifuge_element = new Item().setUnlocalizedName("centrifuge_element").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":centrifuge_element"); reactor_core = new Item().setUnlocalizedName("reactor_core").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":reactor_core"); rtg_unit = new Item().setUnlocalizedName("rtg_unit").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":rtg_unit"); - levitation_unit = new Item().setUnlocalizedName("levitation_unit").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":levitation_unit"); coil_magnetized_tungsten = new Item().setUnlocalizedName("coil_magnetized_tungsten").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_magnetized_tungsten"); coil_gold = new Item().setUnlocalizedName("coil_gold").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_gold"); coil_gold_torus = new Item().setUnlocalizedName("coil_gold_torus").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_gold_torus"); - component_limiter = new Item().setUnlocalizedName("component_limiter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":component_limiter"); - component_emitter = new Item().setUnlocalizedName("component_emitter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":component_emitter"); chlorine_pinwheel = new ItemInfiniteFluid(Fluids.CHLORINE, 1, 2).setUnlocalizedName("chlorine_pinwheel").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chlorine_pinwheel"); FluidTank.noDualUnload.add(chlorine_pinwheel); ring_starmetal = new Item().setUnlocalizedName("ring_starmetal").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ring_starmetal"); @@ -2792,12 +2780,6 @@ public class ModItems { seg_15 = new Item().setUnlocalizedName("seg_15").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":seg_15"); seg_20 = new Item().setUnlocalizedName("seg_20").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":seg_20"); - chopper_head = new Item().setUnlocalizedName("chopper_head").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_head"); - chopper_gun = new Item().setUnlocalizedName("chopper_gun").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_gun"); - chopper_torso = new Item().setUnlocalizedName("chopper_torso").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_torso"); - chopper_tail = new Item().setUnlocalizedName("chopper_tail").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_tail"); - chopper_wing = new Item().setUnlocalizedName("chopper_wing").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_wing"); - chopper_blades = new Item().setUnlocalizedName("chopper_blades").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_blades"); combine_scrap = new Item().setUnlocalizedName("combine_scrap").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":combine_scrap"); shimmer_head = new Item().setUnlocalizedName("shimmer_head").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":shimmer_head_original"); @@ -2945,7 +2927,6 @@ public class ModItems { ingot_raw = new ItemAutogen(MaterialShapes.INGOT).setUnlocalizedName("ingot_raw").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_raw"); plate_cast = new ItemAutogen(MaterialShapes.CASTPLATE).aot(Mats.MAT_BISMUTH, "plate_cast_bismuth").setUnlocalizedName("plate_cast").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":plate_cast"); plate_welded = new ItemAutogen(MaterialShapes.WELDEDPLATE).setUnlocalizedName("plate_welded").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":plate_welded"); - heavy_component = new ItemAutogen(MaterialShapes.HEAVY_COMPONENT).setUnlocalizedName("heavy_component").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":heavy_component"); wire_fine = new ItemAutogen(MaterialShapes.WIRE) .aot(Mats.MAT_ALUMINIUM, "wire_aluminium").aot(Mats.MAT_COPPER, "wire_copper") .aot(Mats.MAT_MINGRADE, "wire_red_copper").aot(Mats.MAT_GOLD, "wire_gold") @@ -2986,7 +2967,7 @@ public class ModItems { gas_full = new ItemGasTank().setUnlocalizedName("gas_full").setCreativeTab(MainRegistry.controlTab).setContainerItem(ModItems.gas_empty).setTextureName(RefStrings.MODID + ":gas_empty"); ItemSimpleConsumable.init(); - + //TODO: move all this crap to ItemSimpleConsumable syringe_empty = new Item().setUnlocalizedName("syringe_empty").setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":syringe_empty"); syringe_metal_empty = new Item().setUnlocalizedName("syringe_metal_empty").setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":syringe_metal_empty"); @@ -2996,7 +2977,7 @@ public class ModItems { syringe_metal_super = new ItemSyringe().setUnlocalizedName("syringe_metal_super").setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":syringe_metal_super"); syringe_taint = new ItemSyringe().setUnlocalizedName("syringe_taint").setFull3D().setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":syringe_taint"); syringe_mkunicorn = new ItemSyringe().setUnlocalizedName("syringe_mkunicorn").setFull3D().setCreativeTab(null).setTextureName(RefStrings.MODID + ":syringe_mkunicorn"); - + 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"); @@ -3113,8 +3094,6 @@ public class ModItems { bottle2_empty = new Item().setUnlocalizedName("bottle2_empty").setTextureName(RefStrings.MODID + ":bottle2_empty"); bottle2_korl = new ItemEnergy().makeBottle(bottle2_empty, cap_korl).setUnlocalizedName("bottle2_korl").setContainerItem(ModItems.bottle2_empty).setTextureName(RefStrings.MODID + ":bottle2_korl"); bottle2_fritz = new ItemEnergy().makeBottle(bottle2_empty, cap_fritz).setUnlocalizedName("bottle2_fritz").setContainerItem(ModItems.bottle2_empty).setTextureName(RefStrings.MODID + ":bottle2_fritz"); - bottle2_korl_special = new ItemEnergy().makeBottle(bottle2_empty, cap_korl).setUnlocalizedName("bottle2_korl_special").setContainerItem(ModItems.bottle2_empty).setTextureName(RefStrings.MODID + ":bottle2_korl"); - bottle2_fritz_special = new ItemEnergy().makeBottle(bottle2_empty, cap_fritz).setUnlocalizedName("bottle2_fritz_special").setContainerItem(ModItems.bottle2_empty).setTextureName(RefStrings.MODID + ":bottle2_fritz"); flask_infusion = new ItemFlask().setUnlocalizedName("flask_infusion").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":flask"); chocolate_milk = new ItemEnergy().setUnlocalizedName("chocolate_milk").setTextureName(RefStrings.MODID + ":chocolate_milk"); coffee = new ItemEnergy().setUnlocalizedName("coffee").setTextureName(RefStrings.MODID + ":coffee"); @@ -3203,6 +3182,7 @@ public class ModItems { pwr_fuel = new ItemPWRFuel().setUnlocalizedName("pwr_fuel").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pwr_fuel"); pwr_fuel_hot = new ItemEnumMulti(EnumPWRFuel.class, true, false).setUnlocalizedName("pwr_fuel_hot").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pwr_fuel_hot"); pwr_fuel_depleted = new ItemEnumMulti(EnumPWRFuel.class, true, false).setUnlocalizedName("pwr_fuel_depleted").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pwr_fuel_depleted"); + pwr_printer = new ItemPWRPrinter().setUnlocalizedName("pwr_printer").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pwr_printer"); rbmk_lid = new ItemRBMKLid().setUnlocalizedName("rbmk_lid").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":rbmk_lid"); rbmk_lid_glass = new ItemRBMKLid().setUnlocalizedName("rbmk_lid_glass").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":rbmk_lid_glass"); @@ -3553,6 +3533,7 @@ public class ModItems { pellet_buckshot = new Item().setUnlocalizedName("pellet_buckshot").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":pellets_lead"); pellet_charged = new Item().setUnlocalizedName("pellet_charged").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":pellets_charged"); + rangefinder = new ItemRangefinder().setUnlocalizedName("rangefinder").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":rangefinder"); designator = new ItemDesingator().setUnlocalizedName("designator").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":designator"); designator_range = new ItemDesingatorRange().setUnlocalizedName("designator_range").setFull3D().setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":designator_range_alt"); designator_manual = new ItemDesingatorManual().setUnlocalizedName("designator_manual").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":designator_manual"); @@ -3608,11 +3589,9 @@ public class ModItems { sat_relay = new ItemSatChip().setUnlocalizedName("sat_relay").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":sat_relay"); mp_thruster_10_kerosene = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 1.5F, PartSize.SIZE_10).setHealth(10F) .setUnlocalizedName("mp_thruster_10_kerosene"); - mp_thruster_10_kerosene_tec = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 1.5F, PartSize.SIZE_10).setHealth(15F).setRarity(Rarity.COMMON).setUnlocalizedName("mp_thruster_10_kerosene_tec"); mp_thruster_10_solid = new ItemCustomMissilePart().makeThruster(FuelType.SOLID, 1F, 1.5F, PartSize.SIZE_10).setHealth(15F) .setUnlocalizedName("mp_thruster_10_solid"); mp_thruster_10_xenon = new ItemCustomMissilePart().makeThruster(FuelType.XENON, 1F, 1.5F, PartSize.SIZE_10).setHealth(5F) .setUnlocalizedName("mp_thruster_10_xenon"); mp_thruster_15_kerosene = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 7.5F, PartSize.SIZE_15).setHealth(15F) .setUnlocalizedName("mp_thruster_15_kerosene"); - mp_thruster_15_kerosene_tec = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 7.5F, PartSize.SIZE_15).setHealth(20F).setRarity(Rarity.COMMON).setUnlocalizedName("mp_thruster_15_kerosene_tec"); mp_thruster_15_kerosene_dual = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 2.5F, PartSize.SIZE_15).setHealth(15F) .setUnlocalizedName("mp_thruster_15_kerosene_dual"); mp_thruster_15_kerosene_triple = new ItemCustomMissilePart().makeThruster(FuelType.KEROSENE, 1F, 5F, PartSize.SIZE_15).setHealth(15F) .setUnlocalizedName("mp_thruster_15_kerosene_triple"); mp_thruster_15_solid = new ItemCustomMissilePart().makeThruster(FuelType.SOLID, 1F, 5F, PartSize.SIZE_15).setHealth(20F) .setUnlocalizedName("mp_thruster_15_solid"); @@ -3723,8 +3702,6 @@ public class ModItems { mp_fuselage_15_20_kerosene_magnusson = ((ItemCustomMissilePart)mp_fuselage_15_20_kerosene).copy().setRarity(Rarity.RARE).setAuthor("VT-6/24").setTitle("White Forest Rocket").setWittyText("And get your cranio-conjugal parasite away from my nose cone!").setUnlocalizedName("mp_fuselage_15_20_kerosene_magnusson"); mp_fuselage_15_20_solid = new ItemCustomMissilePart().makeFuselage(FuelType.SOLID, 20000, PartSize.SIZE_15, PartSize.SIZE_20).setHealth(70F).setUnlocalizedName("mp_fuselage_15_20_solid").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_fuselage"); - mp_fuselage_20_kerosene = new ItemCustomMissilePart().makeFuselage(FuelType.KEROSENE, 1000F, PartSize.SIZE_20, PartSize.SIZE_20) .setUnlocalizedName("mp_f_20").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_fuselage"); - mp_warhead_10_he = new ItemCustomMissilePart().makeWarhead(WarheadType.HE, 15F, 1.5F, PartSize.SIZE_10).setHealth(5F) .setUnlocalizedName("mp_warhead_10_he").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead"); mp_warhead_10_incendiary = new ItemCustomMissilePart().makeWarhead(WarheadType.INC, 15F, 1.5F, PartSize.SIZE_10).setHealth(5F) .setUnlocalizedName("mp_warhead_10_incendiary").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead"); mp_warhead_10_buster = new ItemCustomMissilePart().makeWarhead(WarheadType.BUSTER, 5F, 1.5F, PartSize.SIZE_10).setHealth(5F) .setUnlocalizedName("mp_warhead_10_buster").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead"); @@ -3741,7 +3718,6 @@ public class ModItems { mp_warhead_15_n2 = new ItemCustomMissilePart().makeWarhead(WarheadType.N2, 100F, 5F, PartSize.SIZE_15).setWittyText("[screams geometrically]").setHealth(20F).setRarity(Rarity.RARE).setUnlocalizedName("mp_warhead_15_n2").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead"); mp_warhead_15_balefire = new ItemCustomMissilePart().makeWarhead(WarheadType.BALEFIRE, 100F, 7.5F, PartSize.SIZE_15).setRarity(Rarity.LEGENDARY).setAuthor("VT-6/24").setHealth(15F).setWittyText("Hightower, never forgetti.").setUnlocalizedName("mp_warhead_15_balefire").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead"); mp_warhead_15_turbine = new ItemCustomMissilePart().makeWarhead(WarheadType.TURBINE, 200F, 5F, PartSize.SIZE_15).setRarity(Rarity.SEWS_CLOTHES_AND_SUCKS_HORSE_COCK).setHealth(250F).setUnlocalizedName("mp_warhead_15_turbine").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead"); - mp_warhead_20_he = new ItemCustomMissilePart().makeWarhead(WarheadType.HE, 15F, 1F, PartSize.SIZE_20) .setUnlocalizedName("mp_w_20").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_warhead"); mp_chip_1 = new ItemCustomMissilePart().makeChip(0.1F) .setUnlocalizedName("mp_c_1").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_c_1"); mp_chip_2 = new ItemCustomMissilePart().makeChip(0.05F) .setUnlocalizedName("mp_c_2").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_c_2"); @@ -4022,6 +3998,7 @@ public class ModItems { upgrade_stack = new ItemMetaUpgrade(3).setUnlocalizedName("upgrade_stack").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":upgrade_stack"); upgrade_ejector = new ItemMetaUpgrade(3).setUnlocalizedName("upgrade_ejector").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":upgrade_ejector"); + rebar_placer = new ItemRebarPlacer().setUnlocalizedName("rebar_placer").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":rebar_placer"); 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"); @@ -4119,10 +4096,9 @@ public class ModItems { mech_key = new ItemCustomLore().setUnlocalizedName("mech_key").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":mech_key"); + blueprints = new ItemBlueprints().setUnlocalizedName("blueprints").setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":blueprints"); + blueprint_folder = new ItemBlueprintFolder().setUnlocalizedName("blueprint_folder").setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":blueprint_folder"); template_folder = new ItemTemplateFolder().setUnlocalizedName("template_folder").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":template_folder"); - journal_pip = new ItemTemplateFolder().setUnlocalizedName("journal_pip").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":journal_pip"); - journal_bj = new ItemTemplateFolder().setUnlocalizedName("journal_bj").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":journal_bj"); - journal_silver = new ItemTemplateFolder().setUnlocalizedName("journal_silver").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":journal_silver"); 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); @@ -4137,6 +4113,8 @@ public class ModItems { fluid_barrel_empty = new Item().setUnlocalizedName("fluid_barrel_empty").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_barrel"); fluid_barrel_full = new ItemFluidTank().setUnlocalizedName("fluid_barrel_full").setContainerItem(ModItems.fluid_barrel_empty).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_barrel"); fluid_barrel_infinite = new ItemInfiniteFluid(null, 1_000_000_000).setUnlocalizedName("fluid_barrel_infinite").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_barrel_infinite"); + fluid_pack_empty = new Item().setUnlocalizedName("fluid_pack_empty").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_pack"); + fluid_pack_full = new ItemFluidTank().setUnlocalizedName("fluid_pack_full").setContainerItem(ModItems.fluid_pack_empty).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":fluid_pack"); pipette = new ItemPipette().setUnlocalizedName("pipette").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette"); pipette_boron = new ItemPipette().setUnlocalizedName("pipette_boron").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette_boron"); pipette_laboratory = new ItemPipette().setUnlocalizedName("pipette_laboratory").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pipette_laboratory"); @@ -4466,6 +4444,7 @@ public class ModItems { schrabidium_pickaxe = new ItemToolAbility(20, 0, MainRegistry.tMatSchrab, EnumToolType.PICKAXE) .addAbility(IWeaponAbility.RADIATION, 0) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 6) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 4) @@ -4476,6 +4455,7 @@ public class ModItems { schrabidium_axe = new ItemToolAbility(25, 0, MainRegistry.tMatSchrab, EnumToolType.AXE) .addAbility(IWeaponAbility.RADIATION, 0) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 6) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 4) @@ -4487,6 +4467,7 @@ public class ModItems { schrabidium_shovel = new ItemToolAbility(15, 0, MainRegistry.tMatSchrab, EnumToolType.SHOVEL) .addAbility(IWeaponAbility.RADIATION, 0) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 6) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 4) @@ -4533,7 +4514,7 @@ public class ModItems { .addAbility(IToolHarvestAbility.SMELTER, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 2).setUnlocalizedName("cmb_pickaxe").setTextureName(RefStrings.MODID + ":cmb_pickaxe"); - + cmb_axe = new ItemToolAbility(30F, 0, MainRegistry.tMatCMB, EnumToolType.AXE) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SMELTER, 0) @@ -4554,35 +4535,40 @@ public class ModItems { elec_pickaxe = new ItemToolAbilityPower(6F, 0, MainRegistry.tMatElec, EnumToolType.PICKAXE, 500000, 1000, 100) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("elec_pickaxe").setTextureName(RefStrings.MODID + ":elec_drill_anim"); - + elec_axe = new ItemToolAbilityPower(10F, 0, MainRegistry.tMatElec, EnumToolType.AXE, 500000, 1000, 100) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1) .addAbility(IWeaponAbility.CHAINSAW, 0) .addAbility(IWeaponAbility.BEHEADER, 0).setShears().setUnlocalizedName("elec_axe").setTextureName(RefStrings.MODID + ":elec_chainsaw_anim"); - + elec_shovel = new ItemToolAbilityPower(5F, 0, MainRegistry.tMatElec, EnumToolType.SHOVEL, 500000, 1000, 100) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("elec_shovel").setTextureName(RefStrings.MODID + ":elec_shovel_anim"); - + desh_sword = new ItemSwordAbility(12.5F, 0, MainRegistry.tMatDesh) .addAbility(IWeaponAbility.STUN, 0).setUnlocalizedName("desh_sword").setTextureName(RefStrings.MODID + ":desh_sword"); desh_pickaxe = new ItemToolAbility(5F, -0.05, MainRegistry.tMatDesh, EnumToolType.PICKAXE) .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) .addAbility(IToolAreaAbility.RECURSION, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("desh_pickaxe").setTextureName(RefStrings.MODID + ":desh_pickaxe"); - + desh_axe = new ItemToolAbility(7.5F, -0.05, MainRegistry.tMatDesh, EnumToolType.AXE) .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) .addAbility(IToolAreaAbility.RECURSION, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1) @@ -4590,6 +4576,7 @@ public class ModItems { desh_shovel = new ItemToolAbility(4F, -0.05, MainRegistry.tMatDesh, EnumToolType.SHOVEL) .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) .addAbility(IToolAreaAbility.RECURSION, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("desh_shovel").setTextureName(RefStrings.MODID + ":desh_shovel"); @@ -4618,17 +4605,20 @@ public class ModItems { cobalt_decorated_pickaxe = new ItemToolAbility(6F, 0, matDecCobalt, EnumToolType.PICKAXE) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 2).setUnlocalizedName("cobalt_decorated_pickaxe").setTextureName(RefStrings.MODID + ":cobalt_decorated_pickaxe"); cobalt_decorated_axe = new ItemToolAbility(8F, 0, matDecCobalt, EnumToolType.AXE) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 2) .addAbility(IWeaponAbility.BEHEADER, 0).setUnlocalizedName("cobalt_decorated_axe").setTextureName(RefStrings.MODID + ":cobalt_decorated_axe"); cobalt_decorated_shovel = new ItemToolAbility(5F, 0, matDecCobalt, EnumToolType.SHOVEL) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 2).setUnlocalizedName("cobalt_decorated_shovel").setTextureName(RefStrings.MODID + ":cobalt_decorated_shovel"); cobalt_decorated_hoe = new ModHoe(matDecCobalt).setUnlocalizedName("cobalt_decorated_hoe").setTextureName(RefStrings.MODID + ":cobalt_decorated_hoe"); @@ -4641,12 +4631,14 @@ public class ModItems { starmetal_pickaxe = new ItemToolAbility(8F, 0, matStarmetal, EnumToolType.PICKAXE) .addAbility(IToolAreaAbility.RECURSION, 3) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 4) .addAbility(IWeaponAbility.STUN, 1).setUnlocalizedName("starmetal_pickaxe").setTextureName(RefStrings.MODID + ":starmetal_pickaxe"); starmetal_axe = new ItemToolAbility(12F, 0, matStarmetal, EnumToolType.AXE) .addAbility(IToolAreaAbility.RECURSION, 3) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 4) .addAbility(IWeaponAbility.BEHEADER, 0) @@ -4654,6 +4646,7 @@ public class ModItems { starmetal_shovel = new ItemToolAbility(7F, 0, matStarmetal, EnumToolType.SHOVEL) .addAbility(IToolAreaAbility.RECURSION, 3) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 4) .addAbility(IWeaponAbility.STUN, 1).setUnlocalizedName("starmetal_shovel").setTextureName(RefStrings.MODID + ":starmetal_shovel"); @@ -4668,6 +4661,7 @@ public class ModItems { .addAbility(IToolHarvestAbility.SHREDDER, 0) .addAbility(IToolHarvestAbility.LUCK, 1) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 2).setUnlocalizedName("drax").setTextureName(RefStrings.MODID + ":drax"); drax_mk2 = new ItemToolAbilityPower(15F, -0.05, MainRegistry.tMatElec, EnumToolType.MINER, 1000000000, 250000, 7500) .addAbility(IToolHarvestAbility.SMELTER, 0) @@ -4675,6 +4669,7 @@ public class ModItems { .addAbility(IToolHarvestAbility.CENTRIFUGE, 0) .addAbility(IToolHarvestAbility.LUCK, 2) .addAbility(IToolAreaAbility.HAMMER, 2) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 2) .addAbility(IToolAreaAbility.RECURSION, 4).setUnlocalizedName("drax_mk2").setTextureName(RefStrings.MODID + ":drax_mk2"); drax_mk3 = new ItemToolAbilityPower(20F, -0.05, MainRegistry.tMatElec, EnumToolType.MINER, 2500000000L, 500000, 10000) .addAbility(IToolHarvestAbility.SMELTER, 0) @@ -4684,11 +4679,13 @@ public class ModItems { .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 3) .addAbility(IToolAreaAbility.HAMMER, 3) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 3) .addAbility(IToolAreaAbility.RECURSION, 5).setUnlocalizedName("drax_mk3").setTextureName(RefStrings.MODID + ":drax_mk3"); ToolMaterial matBismuth = EnumHelper.addToolMaterial("HBM_BISMUTH", 4, 0, 50F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.ingot_bismuth)); bismuth_pickaxe = new ItemToolAbility(15F, 0, matBismuth, EnumToolType.MINER) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolHarvestAbility.SHREDDER, 0) .addAbility(IToolHarvestAbility.LUCK, 1) @@ -4699,6 +4696,7 @@ public class ModItems { .setDepthRockBreaker().setUnlocalizedName("bismuth_pickaxe").setTextureName(RefStrings.MODID + ":bismuth_pickaxe"); bismuth_axe = new ItemToolAbility(25F, 0, matBismuth, EnumToolType.AXE) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolHarvestAbility.SHREDDER, 0) .addAbility(IToolHarvestAbility.LUCK, 1) @@ -4711,6 +4709,7 @@ public class ModItems { ToolMaterial matVolcano = EnumHelper.addToolMaterial("HBM_VOLCANIC", 4, 0, 50F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.ingot_bismuth)); volcanic_pickaxe = new ItemToolAbility(15F, 0, matVolcano, EnumToolType.MINER) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolHarvestAbility.SMELTER, 0) .addAbility(IToolHarvestAbility.LUCK, 2) @@ -4721,6 +4720,7 @@ public class ModItems { .setDepthRockBreaker().setUnlocalizedName("volcanic_pickaxe").setTextureName(RefStrings.MODID + ":volcanic_pickaxe"); volcanic_axe = new ItemToolAbility(25F, 0, matVolcano, EnumToolType.AXE) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolHarvestAbility.SMELTER, 0) .addAbility(IToolHarvestAbility.LUCK, 2) @@ -4732,6 +4732,7 @@ public class ModItems { ToolMaterial matChlorophyte = EnumHelper.addToolMaterial("HBM_CHLOROPHYTE", 4, 0, 75F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.powder_chlorophyte)); chlorophyte_pickaxe = new ItemToolAbility(20F, 0, matChlorophyte, EnumToolType.MINER) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolHarvestAbility.LUCK, 3) .addAbility(IToolHarvestAbility.CENTRIFUGE, 0) @@ -4742,6 +4743,7 @@ public class ModItems { .setDepthRockBreaker().setUnlocalizedName("chlorophyte_pickaxe").setTextureName(RefStrings.MODID + ":chlorophyte_pickaxe"); chlorophyte_axe = new ItemToolAbility(50F, 0, matChlorophyte, EnumToolType.AXE) .addAbility(IToolAreaAbility.HAMMER, 1) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 1) .addAbility(IToolAreaAbility.RECURSION, 1) .addAbility(IToolHarvestAbility.LUCK, 3) .addAbility(IWeaponAbility.STUN, 4) @@ -4751,6 +4753,7 @@ public class ModItems { ToolMaterial matMese = EnumHelper.addToolMaterial("HBM_MESE", 4, 0, 100F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.plate_paa)); mese_pickaxe = new ItemToolAbility(35F, 0, matMese, EnumToolType.MINER) .addAbility(IToolAreaAbility.HAMMER, 2) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 2) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.CRYSTALLIZER, 0) .addAbility(IToolHarvestAbility.SILK, 0) @@ -4762,6 +4765,7 @@ public class ModItems { .setDepthRockBreaker().setUnlocalizedName("mese_pickaxe").setTextureName(RefStrings.MODID + ":mese_pickaxe"); mese_axe = new ItemToolAbility(75F, 0, matMese, EnumToolType.AXE) .addAbility(IToolAreaAbility.HAMMER, 2) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 2) .addAbility(IToolAreaAbility.RECURSION, 2) .addAbility(IToolHarvestAbility.SILK, 0) .addAbility(IToolHarvestAbility.LUCK, 5) @@ -4774,7 +4778,8 @@ public class ModItems { ToolMaterial matDwarf = EnumHelper.addToolMaterial("HBM_DWARVEN", 2, 0, 4F, 0.0F, 10).setRepairItem(new ItemStack(ModItems.ingot_copper)); dwarven_pickaxe = new ItemToolAbility(5F, -0.1, matDwarf, EnumToolType.MINER) - .addAbility(IToolAreaAbility.HAMMER, 0).setUnlocalizedName("dwarven_pickaxe").setMaxDamage(250).setTextureName(RefStrings.MODID + ":dwarven_pickaxe"); + .addAbility(IToolAreaAbility.HAMMER, 0) + .addAbility(IToolAreaAbility.HAMMER_FLAT, 0).setUnlocalizedName("dwarven_pickaxe").setMaxDamage(250).setTextureName(RefStrings.MODID + ":dwarven_pickaxe"); ToolMaterial matMeteorite = EnumHelper.addToolMaterial("HBM_METEORITE", 4, 0, 50F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.plate_paa)); meteorite_sword = new ItemSwordMeteorite(9F, 0, matMeteorite).setUnlocalizedName("meteorite_sword").setTextureName(RefStrings.MODID + ":meteorite_sword"); @@ -4906,7 +4911,6 @@ public class ModItems { polaroid = new ItemPolaroid().setUnlocalizedName("polaroid").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":polaroid_" + MainRegistry.polaroidID); glitch = new ItemGlitch().setUnlocalizedName("glitch").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":glitch_" + MainRegistry.polaroidID); - letter = new ItemStarterKit().setUnlocalizedName("letter").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":letter"); book_secret = new ItemCustomLore().setUnlocalizedName("book_secret").setCreativeTab(MainRegistry.polaroidID == 11 ? MainRegistry.consumableTab : null).setTextureName(RefStrings.MODID + ":book_secret"); book_of_ = new ItemBook().setUnlocalizedName("book_of_").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":book_of_"); page_of_ = new ItemEnumMulti(ItemEnums.EnumPages.class, true, false).setUnlocalizedName("page_of_").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":page_of_"); @@ -4976,6 +4980,9 @@ public class ModItems { } private static void registerItem() { + + excludeNEI.add(item_secret); + //Weapons GameRegistry.registerItem(redstone_sword, redstone_sword.getUnlocalizedName()); GameRegistry.registerItem(big_sword, big_sword.getUnlocalizedName()); @@ -5445,7 +5452,6 @@ public class ModItems { GameRegistry.registerItem(plate_welded, plate_welded.getUnlocalizedName()); GameRegistry.registerItem(shell, shell.getUnlocalizedName()); GameRegistry.registerItem(pipe, pipe.getUnlocalizedName()); - GameRegistry.registerItem(heavy_component, heavy_component.getUnlocalizedName()); //Bolts GameRegistry.registerItem(bolt, bolt.getUnlocalizedName()); @@ -5482,7 +5488,6 @@ public class ModItems { GameRegistry.registerItem(centrifuge_element, centrifuge_element.getUnlocalizedName()); GameRegistry.registerItem(reactor_core, reactor_core.getUnlocalizedName()); GameRegistry.registerItem(rtg_unit, rtg_unit.getUnlocalizedName()); - GameRegistry.registerItem(levitation_unit, levitation_unit.getUnlocalizedName()); GameRegistry.registerItem(pipes_steel, pipes_steel.getUnlocalizedName()); GameRegistry.registerItem(drill_titanium, drill_titanium.getUnlocalizedName()); GameRegistry.registerItem(photo_panel, photo_panel.getUnlocalizedName()); @@ -5492,6 +5497,7 @@ public class ModItems { GameRegistry.registerItem(chemical_dye, chemical_dye.getUnlocalizedName()); GameRegistry.registerItem(crayon, crayon.getUnlocalizedName()); GameRegistry.registerItem(part_generic, part_generic.getUnlocalizedName()); + GameRegistry.registerItem(item_expensive, item_expensive.getUnlocalizedName()); GameRegistry.registerItem(item_secret, item_secret.getUnlocalizedName()); GameRegistry.registerItem(ingot_metal, ingot_metal.getUnlocalizedName()); GameRegistry.registerItem(parts_legendary, parts_legendary.getUnlocalizedName()); @@ -5512,10 +5518,6 @@ public class ModItems { //GameRegistry.registerItem(telepad, telepad.getUnlocalizedName()); GameRegistry.registerItem(entanglement_kit, entanglement_kit.getUnlocalizedName()); - //AMS Parts - GameRegistry.registerItem(component_limiter, component_limiter.getUnlocalizedName()); - GameRegistry.registerItem(component_emitter, component_emitter.getUnlocalizedName()); - //Bomb Parts GameRegistry.registerItem(fins_flat, fins_flat.getUnlocalizedName()); GameRegistry.registerItem(fins_small_steel, fins_small_steel.getUnlocalizedName()); @@ -5567,12 +5569,6 @@ public class ModItems { GameRegistry.registerItem(seg_20, seg_20.getUnlocalizedName()); //Chopper parts - GameRegistry.registerItem(chopper_head, chopper_head.getUnlocalizedName()); - GameRegistry.registerItem(chopper_gun, chopper_gun.getUnlocalizedName()); - GameRegistry.registerItem(chopper_torso, chopper_torso.getUnlocalizedName()); - GameRegistry.registerItem(chopper_tail, chopper_tail.getUnlocalizedName()); - GameRegistry.registerItem(chopper_wing, chopper_wing.getUnlocalizedName()); - GameRegistry.registerItem(chopper_blades, chopper_blades.getUnlocalizedName()); GameRegistry.registerItem(combine_scrap, combine_scrap.getUnlocalizedName()); //Hammer Parts @@ -5694,6 +5690,10 @@ public class ModItems { GameRegistry.registerItem(fluid_barrel_full, fluid_barrel_full.getUnlocalizedName()); GameRegistry.registerItem(fluid_barrel_infinite, fluid_barrel_infinite.getUnlocalizedName()); + //Packaged fluids + GameRegistry.registerItem(fluid_pack_empty, fluid_pack_empty.getUnlocalizedName()); + GameRegistry.registerItem(fluid_pack_full, fluid_pack_full.getUnlocalizedName()); + //Pipette GameRegistry.registerItem(pipette, pipette.getUnlocalizedName()); GameRegistry.registerItem(pipette_boron, pipette_boron.getUnlocalizedName()); @@ -5745,10 +5745,9 @@ public class ModItems { GameRegistry.registerItem(fusion_core_infinite, fusion_core_infinite.getUnlocalizedName()); //Folders + GameRegistry.registerItem(blueprints, blueprints.getUnlocalizedName()); + GameRegistry.registerItem(blueprint_folder, blueprint_folder.getUnlocalizedName()); GameRegistry.registerItem(template_folder, template_folder.getUnlocalizedName()); - GameRegistry.registerItem(journal_pip, journal_pip.getUnlocalizedName()); - GameRegistry.registerItem(journal_bj, journal_bj.getUnlocalizedName()); - GameRegistry.registerItem(journal_silver, journal_silver.getUnlocalizedName()); GameRegistry.registerItem(bobmazon, bobmazon.getUnlocalizedName()); GameRegistry.registerItem(bobmazon_hidden, bobmazon_hidden.getUnlocalizedName()); @@ -5997,6 +5996,7 @@ public class ModItems { GameRegistry.registerItem(pwr_fuel, pwr_fuel.getUnlocalizedName()); GameRegistry.registerItem(pwr_fuel_hot, pwr_fuel_hot.getUnlocalizedName()); GameRegistry.registerItem(pwr_fuel_depleted, pwr_fuel_depleted.getUnlocalizedName()); + GameRegistry.registerItem(pwr_printer, pwr_printer.getUnlocalizedName()); //RBMK parts GameRegistry.registerItem(rbmk_lid, rbmk_lid.getUnlocalizedName()); @@ -6109,6 +6109,7 @@ public class ModItems { GameRegistry.registerItem(spawn_duck, spawn_duck.getUnlocalizedName()); //Computer Tools + GameRegistry.registerItem(rangefinder, rangefinder.getUnlocalizedName()); GameRegistry.registerItem(designator, designator.getUnlocalizedName()); GameRegistry.registerItem(designator_range, designator_range.getUnlocalizedName()); GameRegistry.registerItem(designator_manual, designator_manual.getUnlocalizedName()); @@ -6196,11 +6197,9 @@ public class ModItems { //Missile Parts GameRegistry.registerItem(mp_thruster_10_kerosene, mp_thruster_10_kerosene.getUnlocalizedName()); - GameRegistry.registerItem(mp_thruster_10_kerosene_tec, mp_thruster_10_kerosene_tec.getUnlocalizedName()); GameRegistry.registerItem(mp_thruster_10_solid, mp_thruster_10_solid.getUnlocalizedName()); GameRegistry.registerItem(mp_thruster_10_xenon, mp_thruster_10_xenon.getUnlocalizedName()); GameRegistry.registerItem(mp_thruster_15_kerosene, mp_thruster_15_kerosene.getUnlocalizedName()); - GameRegistry.registerItem(mp_thruster_15_kerosene_tec, mp_thruster_15_kerosene_tec.getUnlocalizedName()); GameRegistry.registerItem(mp_thruster_15_kerosene_dual, mp_thruster_15_kerosene_dual.getUnlocalizedName()); GameRegistry.registerItem(mp_thruster_15_kerosene_triple, mp_thruster_15_kerosene_triple.getUnlocalizedName()); GameRegistry.registerItem(mp_thruster_15_solid, mp_thruster_15_solid.getUnlocalizedName()); @@ -6298,7 +6297,6 @@ public class ModItems { GameRegistry.registerItem(mp_fuselage_15_20_kerosene, mp_fuselage_15_20_kerosene.getUnlocalizedName()); GameRegistry.registerItem(mp_fuselage_15_20_kerosene_magnusson, mp_fuselage_15_20_kerosene_magnusson.getUnlocalizedName()); GameRegistry.registerItem(mp_fuselage_15_20_solid, mp_fuselage_15_20_solid.getUnlocalizedName()); - GameRegistry.registerItem(mp_fuselage_20_kerosene, mp_fuselage_20_kerosene.getUnlocalizedName()); GameRegistry.registerItem(mp_warhead_10_he, mp_warhead_10_he.getUnlocalizedName()); GameRegistry.registerItem(mp_warhead_10_incendiary, mp_warhead_10_incendiary.getUnlocalizedName()); GameRegistry.registerItem(mp_warhead_10_buster, mp_warhead_10_buster.getUnlocalizedName()); @@ -6315,7 +6313,6 @@ public class ModItems { GameRegistry.registerItem(mp_warhead_15_n2, mp_warhead_15_n2.getUnlocalizedName()); GameRegistry.registerItem(mp_warhead_15_balefire, mp_warhead_15_balefire.getUnlocalizedName()); GameRegistry.registerItem(mp_warhead_15_turbine, mp_warhead_15_turbine.getUnlocalizedName()); - GameRegistry.registerItem(mp_warhead_20_he, mp_warhead_20_he.getUnlocalizedName()); GameRegistry.registerItem(mp_chip_1, mp_chip_1.getUnlocalizedName()); GameRegistry.registerItem(mp_chip_2, mp_chip_2.getUnlocalizedName()); GameRegistry.registerItem(mp_chip_3, mp_chip_3.getUnlocalizedName()); @@ -6381,6 +6378,7 @@ public class ModItems { GameRegistry.registerItem(gun_autoshotgun, gun_autoshotgun.getUnlocalizedName()); GameRegistry.registerItem(gun_autoshotgun_shredder, gun_autoshotgun_shredder.getUnlocalizedName()); GameRegistry.registerItem(gun_autoshotgun_sexy, gun_autoshotgun_sexy.getUnlocalizedName()); + GameRegistry.registerItem(gun_autoshotgun_heretic, gun_autoshotgun_heretic.getUnlocalizedName()); GameRegistry.registerItem(gun_quadro, gun_quadro.getUnlocalizedName()); GameRegistry.registerItem(gun_lag, gun_lag.getUnlocalizedName()); GameRegistry.registerItem(gun_minigun, gun_minigun.getUnlocalizedName()); @@ -6404,6 +6402,7 @@ public class ModItems { GameRegistry.registerItem(gun_aberrator_eott, gun_aberrator_eott.getUnlocalizedName()); GameRegistry.registerItem(gun_double_barrel, gun_double_barrel.getUnlocalizedName()); GameRegistry.registerItem(gun_double_barrel_sacred_dragon, gun_double_barrel_sacred_dragon.getUnlocalizedName()); + GameRegistry.registerItem(gun_n_i_4_n_i, gun_n_i_4_n_i.getUnlocalizedName()); GameRegistry.registerItem(gun_fireext, gun_fireext.getUnlocalizedName()); GameRegistry.registerItem(gun_charge_thrower, gun_charge_thrower.getUnlocalizedName()); @@ -6706,8 +6705,6 @@ public class ModItems { GameRegistry.registerItem(bottle2_empty, bottle2_empty.getUnlocalizedName()); GameRegistry.registerItem(bottle2_korl, bottle2_korl.getUnlocalizedName()); GameRegistry.registerItem(bottle2_fritz, bottle2_fritz.getUnlocalizedName()); - GameRegistry.registerItem(bottle2_korl_special, bottle2_korl_special.getUnlocalizedName()); - GameRegistry.registerItem(bottle2_fritz_special, bottle2_fritz_special.getUnlocalizedName()); GameRegistry.registerItem(bottle_opener, bottle_opener.getUnlocalizedName()); //Flasks @@ -7045,7 +7042,8 @@ public class ModItems { GameRegistry.registerItem(crystal_horn, crystal_horn.getUnlocalizedName()); GameRegistry.registerItem(crystal_charred, crystal_charred.getUnlocalizedName()); - //OP Tools + //Wands, Tools, Other Crap + GameRegistry.registerItem(rebar_placer, rebar_placer.getUnlocalizedName()); GameRegistry.registerItem(wand, wand.getUnlocalizedName()); GameRegistry.registerItem(wand_s, wand_s.getUnlocalizedName()); GameRegistry.registerItem(wand_d, wand_d.getUnlocalizedName()); @@ -7089,7 +7087,6 @@ public class ModItems { GameRegistry.registerItem(euphemium_kit, euphemium_kit.getUnlocalizedName()); GameRegistry.registerItem(legacy_toolbox, legacy_toolbox.getUnlocalizedName()); GameRegistry.registerItem(toolbox, toolbox.getUnlocalizedName()); - GameRegistry.registerItem(letter, letter.getUnlocalizedName()); //Misile Loot Boxes GameRegistry.registerItem(loot_10, loot_10.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/armor/WingsMurk.java b/src/main/java/com/hbm/items/armor/WingsMurk.java index daec63319..c76c42fda 100644 --- a/src/main/java/com/hbm/items/armor/WingsMurk.java +++ b/src/main/java/com/hbm/items/armor/WingsMurk.java @@ -51,13 +51,12 @@ public class WingsMurk extends JetpackBase { if(player.fallDistance > 0) player.fallDistance = 0; - if(player.motionY < -0.4D) - player.motionY = -0.4D; - if(this == ModItems.wings_limp) { + + if(player.motionY < -0.4D) + player.motionY = -0.4D; - if(player.isSneaking()) { - + if(player.isSneaking()) { if(player.motionY < -0.08) { double mo = player.motionY * -0.2; @@ -81,10 +80,26 @@ public class WingsMurk extends JetpackBase { if(props.isJetpackActive()) { - if(player.motionY < 0.6D) - player.motionY += 0.2D; - else - player.motionY = 0.8D; + if(player.isSneaking()) { + if(player.motionY < -1) + player.motionY += 0.4D; + else if(player.motionY < -0.1) + player.motionY += 0.2D; + else if(player.motionY < 0) + player.motionY = 0; + else if(player.motionY > 1) + player.motionY -= 0.4D; + else if(player.motionY > 0.1) + player.motionY -= 0.2D; + else if(player.motionY > 0) + player.motionY = 0; + + } else { + if(player.motionY < 0.6D) + player.motionY += 0.2D; + else + player.motionY = 0.8D; + } } else if(props.enableBackpack && !player.isSneaking()) { @@ -100,7 +115,7 @@ public class WingsMurk extends JetpackBase { Vec3 orig = player.getLookVec(); Vec3 look = Vec3.createVectorHelper(orig.xCoord, 0, orig.zCoord).normalize(); - double mod = player.isSneaking() ? 0.25D : 1D; + double mod = player.isSprinting() ? 1D : 0.25D; if(player.moveForward != 0) { player.motionX += look.xCoord * 0.35 * player.moveForward * mod; diff --git a/src/main/java/com/hbm/items/bomb/ItemFleija.java b/src/main/java/com/hbm/items/bomb/ItemFleija.java index d9424f67e..06b8c0d68 100644 --- a/src/main/java/com/hbm/items/bomb/ItemFleija.java +++ b/src/main/java/com/hbm/items/bomb/ItemFleija.java @@ -2,7 +2,9 @@ package com.hbm.items.bomb; import java.util.List; +import com.hbm.blocks.ModBlocks; import com.hbm.items.ModItems; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; @@ -12,22 +14,17 @@ import net.minecraft.item.ItemStack; public class ItemFleija extends Item { @Override - public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) - { - list.add("Used in:"); - list.add("F.L.E.I.J.A."); + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + list.add(I18nUtil.resolveKey("item.bomb_part.used_in")); + list.add(ModBlocks.nuke_fleija.getLocalizedName()); super.addInformation(itemstack, player, list, bool); } - @Override - public EnumRarity getRarity(ItemStack p_77613_1_) { - - if(this == ModItems.fleija_propellant) - { - return EnumRarity.rare; - } - - return EnumRarity.common; - } - + @Override + public EnumRarity getRarity(ItemStack itemstack) { + if (this == ModItems.fleija_propellant) { + return EnumRarity.rare; + } + return EnumRarity.common; + } } diff --git a/src/main/java/com/hbm/items/bomb/ItemN2.java b/src/main/java/com/hbm/items/bomb/ItemN2.java index c837fee78..da909b8d3 100644 --- a/src/main/java/com/hbm/items/bomb/ItemN2.java +++ b/src/main/java/com/hbm/items/bomb/ItemN2.java @@ -2,17 +2,18 @@ package com.hbm.items.bomb; import java.util.List; +import com.hbm.blocks.ModBlocks; +import com.hbm.util.i18n.I18nUtil; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; public class ItemN2 extends Item { - - @Override - public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) - { - list.add("Used in:"); - list.add("N² Mine"); - } + @Override + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + list.add(I18nUtil.resolveKey("item.bomb_part.used_in")); + list.add(ModBlocks.nuke_n2.getLocalizedName()); + } } diff --git a/src/main/java/com/hbm/items/bomb/ItemSolinium.java b/src/main/java/com/hbm/items/bomb/ItemSolinium.java index a04321ecb..9951a7111 100644 --- a/src/main/java/com/hbm/items/bomb/ItemSolinium.java +++ b/src/main/java/com/hbm/items/bomb/ItemSolinium.java @@ -2,6 +2,9 @@ package com.hbm.items.bomb; import java.util.List; +import com.hbm.blocks.ModBlocks; +import com.hbm.util.i18n.I18nUtil; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -9,10 +12,9 @@ import net.minecraft.item.ItemStack; public class ItemSolinium extends Item { @Override - public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) - { - list.add("Used in:"); - list.add("Solinium Bomb"); + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + list.add(I18nUtil.resolveKey("item.bomb_part.used_in")); + list.add(ModBlocks.nuke_solinium.getLocalizedName() + " name"); super.addInformation(itemstack, player, list, bool); } } diff --git a/src/main/java/com/hbm/items/food/ItemEnergy.java b/src/main/java/com/hbm/items/food/ItemEnergy.java index b01195ad9..caa47fc5c 100644 --- a/src/main/java/com/hbm/items/food/ItemEnergy.java +++ b/src/main/java/com/hbm/items/food/ItemEnergy.java @@ -23,6 +23,7 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; import net.minecraftforge.common.util.FakePlayer; +@Spaghetti("wtf is this shit") public class ItemEnergy extends Item { private Item container = null; @@ -142,18 +143,6 @@ public class ItemEnergy extends Item { player.addPotionEffect(new PotionEffect(Potion.resistance.id, 30 * 20, 2)); player.addPotionEffect(new PotionEffect(Potion.jump.id, 30 * 20, 2)); } - if(this == ModItems.bottle2_korl_special) { - player.heal(16); - player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 120 * 20, 1)); - player.addPotionEffect(new PotionEffect(Potion.digSpeed.id, 120 * 20, 2)); - player.addPotionEffect(new PotionEffect(Potion.damageBoost.id, 120 * 20, 2)); - } - if(this == ModItems.bottle2_fritz_special) { - player.heal(16); - player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 120 * 20, 1)); - player.addPotionEffect(new PotionEffect(Potion.resistance.id, 120 * 20, 2)); - player.addPotionEffect(new PotionEffect(Potion.jump.id, 120 * 20, 2)); - } if(this == ModItems.bottle_sparkle) { player.heal(10F); player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 120 * 20, 1)); @@ -202,28 +191,24 @@ public class ItemEnergy extends Item { } @Override - public int getMaxItemUseDuration(ItemStack p_77626_1_) { + public int getMaxItemUseDuration(ItemStack stack) { return 32; } @Override - public EnumAction getItemUseAction(ItemStack p_77661_1_) { + public EnumAction getItemUseAction(ItemStack stack) { return EnumAction.drink; } @Spaghetti("cover yourself in oil") @Override - public ItemStack onItemRightClick(ItemStack p_77659_1_, World p_77659_2_, EntityPlayer p_77659_3_) { + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if(VersatileConfig.hasPotionSickness(player)) return stack; + if(this.requiresOpener && !player.inventory.hasItem(ModItems.bottle_opener)) return stack; - if(VersatileConfig.hasPotionSickness(p_77659_3_)) - return p_77659_1_; - - if(this.requiresOpener && !p_77659_3_.inventory.hasItem(ModItems.bottle_opener)) - return p_77659_1_; + player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); - p_77659_3_.setItemInUse(p_77659_1_, this.getMaxItemUseDuration(p_77659_1_)); - - return p_77659_1_; + return stack; } @Override @@ -260,51 +245,32 @@ public class ItemEnergy extends Item { } if(this == ModItems.bottle_nuka) { list.add("Contains about 210 kcal and 1500 mSv."); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle_cherry) { list.add("Now with severe radiation poisoning in every seventh bottle!"); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle_quantum) { list.add("Comes with a colorful mix of over 70 isotopes!"); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle2_korl) { list.add("Contains actual orange juice!"); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle2_fritz) { list.add("moremore caffeine"); - list.add("[Requires bottle opener]"); - } - if(this == ModItems.bottle2_korl_special) { - if(MainRegistry.polaroidID == 11) - list.add("shgehgev u rguer"); - else - list.add("Contains actual orange juice!"); - list.add("[Requires bottle opener]"); - } - if(this == ModItems.bottle2_fritz_special) { - if(MainRegistry.polaroidID == 11) - list.add("ygrogr fgrof bf"); - else - list.add("moremore caffeine"); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle_sparkle) { if(MainRegistry.polaroidID == 11) list.add("Contains trace amounts of taint."); else list.add("The most delicious beverage in the wasteland!"); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle_rad) { if(MainRegistry.polaroidID == 11) list.add("Now with 400% more radiation!"); else list.add("Tastes like radish and radiation."); - list.add("[Requires bottle opener]"); } + + if(this.requiresOpener) list.add("[Requires bottle opener]"); } } diff --git a/src/main/java/com/hbm/items/food/ItemLemon.java b/src/main/java/com/hbm/items/food/ItemLemon.java index b331b799e..2d211ff2f 100644 --- a/src/main/java/com/hbm/items/food/ItemLemon.java +++ b/src/main/java/com/hbm/items/food/ItemLemon.java @@ -2,6 +2,8 @@ package com.hbm.items.food; import java.util.List; +import com.hbm.util.i18n.I18nUtil; + import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; import com.hbm.packet.toclient.AuxParticlePacketNT; @@ -29,70 +31,68 @@ public class ItemLemon extends ItemFood { public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { if(this == ModItems.lemon) { - list.add("Eh, good enough."); + list.add(I18nUtil.resolveKey("item.lemon.desc")); } if(this == ModItems.med_ipecac) { - list.add("Bitter juice that will cause your stomach"); - list.add("to forcefully eject its contents."); + String[] lines = I18nUtil.resolveKeyArray("item.med_ipecac.desc"); + for (String line : lines) { + list.add(line); + } } if(this == ModItems.med_ptsd) { - list.add("This isn't even PTSD mediaction, it's just"); - list.add("Ipecac in a different bottle!"); + String[] lines = I18nUtil.resolveKeyArray("item.med_ptsd.desc"); + for (String line : lines) { + list.add(line); + } } if(this == ModItems.med_schizophrenia) { - list.add("Makes the voices go away. Just for a while."); - list.add(""); - list.add("..."); - list.add("Better not take it."); - } - - if(this == ModItems.med_schizophrenia) { - list.add("Makes the voices go away. Just for a while."); - list.add(""); - list.add("..."); - list.add("Better not take it."); + String[] lines = I18nUtil.resolveKeyArray("item.med_schizophrenia.desc"); + for (String line : lines) { + list.add(line); + } } if(this == ModItems.loops) { - list.add("Brøther, may I have some lööps?"); + list.add(I18nUtil.resolveKey("item.loops.desc")); } if(this == ModItems.loop_stew) { - list.add("A very, very healthy breakfast."); + list.add(I18nUtil.resolveKey("item.loop_stew.desc")); } if(this == ModItems.twinkie) { - list.add("Expired 600 years ago!"); + list.add(I18nUtil.resolveKey("item.twinkie.desc")); } if(this == ModItems.pudding) { - list.add("What if he did?"); - list.add("What if he didn't?"); - list.add("What if the world was made of pudding?"); + String[] lines = I18nUtil.resolveKeyArray("item.pudding.desc"); + for (String line : lines) { + list.add(line); + } } if(this == ModItems.ingot_semtex) { - list.add("Semtex H Plastic Explosive"); - list.add("Performant explosive for many applications."); - list.add("Edible"); + String[] lines = I18nUtil.resolveKeyArray("item.ingot_semtex.desc"); + for (String line : lines) { + list.add(line); + } } if(this == ModItems.peas) { - list.add("He accepts your offering."); + list.add(I18nUtil.resolveKey("item.peas.desc")); } if(this == ModItems.quesadilla) { - list.add("That's what a 50 year old yeast infection does to you."); + list.add(I18nUtil.resolveKey("item.cheese_quesadilla.desc")); } } - - @Override + @Override protected void onFoodEaten(ItemStack stack, World world, EntityPlayer player) - { + { if(this == ModItems.med_ipecac || this == ModItems.med_ptsd) { player.addPotionEffect(new PotionEffect(Potion.hunger.id, 50, 49)); diff --git a/src/main/java/com/hbm/items/machine/ItemAssemblyTemplate.java b/src/main/java/com/hbm/items/machine/ItemAssemblyTemplate.java index 7a1c26a0b..76f38f7d6 100644 --- a/src/main/java/com/hbm/items/machine/ItemAssemblyTemplate.java +++ b/src/main/java/com/hbm/items/machine/ItemAssemblyTemplate.java @@ -24,6 +24,7 @@ import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; import net.minecraftforge.oredict.OreDictionary; +@Deprecated public class ItemAssemblyTemplate extends Item { @SideOnly(Side.CLIENT) @@ -157,6 +158,7 @@ public class ItemAssemblyTemplate extends Item { @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + list.add(EnumChatFormatting.RED + "Deprecated"); if(!(stack.getItem() instanceof ItemAssemblyTemplate)) return; @@ -198,9 +200,6 @@ public class ItemAssemblyTemplate extends Item { a++; } - list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("info.templatefolder", String.join(" / ", names))); - list.add(""); - if(out == null) { list.add("I AM ERROR"); return; diff --git a/src/main/java/com/hbm/items/machine/ItemBlueprintFolder.java b/src/main/java/com/hbm/items/machine/ItemBlueprintFolder.java new file mode 100644 index 000000000..a6fe26c04 --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemBlueprintFolder.java @@ -0,0 +1,72 @@ +package com.hbm.items.machine; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.inventory.recipes.loader.GenericRecipes; + +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.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class ItemBlueprintFolder extends Item { + + @SideOnly(Side.CLIENT) protected IIcon iconDiscover; + @SideOnly(Side.CLIENT) protected IIcon iconSecret; + + public ItemBlueprintFolder() { + this.setHasSubtypes(true); + this.setMaxStackSize(1); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + super.registerIcons(reg); + this.iconDiscover = reg.registerIcon(this.getIconString() + "_discover"); + this.iconSecret = reg.registerIcon(this.getIconString() + "_secret"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int meta) { + return meta == 1 ? iconDiscover : meta == 2 ? iconSecret : itemIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + for(int i = 0; i < 2; i++) list.add(new ItemStack(item, 1, i)); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if(world.isRemote) return stack; + + List pools = new ArrayList(); + + for(String pool : GenericRecipes.blueprintPools.keySet()) { + if(stack.getItemDamage() == 0 && pool.startsWith(GenericRecipes.POOL_PREFIX_ALT)) pools.add(pool); + if(stack.getItemDamage() == 1 && pool.startsWith(GenericRecipes.POOL_PREFIX_DISCOVER)) pools.add(pool); + if(stack.getItemDamage() == 2 && pool.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) pools.add(pool); + } + + if(!pools.isEmpty()) { + stack.stackSize--; + + String chosen = pools.get(player.getRNG().nextInt(pools.size())); + ItemStack blueprint = ItemBlueprints.make(chosen); + + if(!player.inventory.addItemStackToInventory(blueprint)) + player.dropPlayerItemWithRandomChoice(blueprint, false); + } + + return stack; + } +} diff --git a/src/main/java/com/hbm/items/machine/ItemBlueprints.java b/src/main/java/com/hbm/items/machine/ItemBlueprints.java new file mode 100644 index 000000000..13254d6de --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemBlueprints.java @@ -0,0 +1,142 @@ +package com.hbm.items.machine; + +import java.util.List; +import java.util.Map.Entry; + +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; +import com.hbm.items.ModItems; + +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.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class ItemBlueprints extends Item { + + @SideOnly(Side.CLIENT) protected IIcon iconDiscover; + @SideOnly(Side.CLIENT) protected IIcon iconSecret; + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + super.registerIcons(reg); + this.iconDiscover = reg.registerIcon(this.getIconString() + "_discover"); + this.iconSecret = reg.registerIcon(this.getIconString() + "_secret"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconIndex(ItemStack stack) { + return this.getIcon(stack, 0); + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + + if(stack.hasTagCompound()) { + String poolName = stack.stackTagCompound.getString("pool"); + if(poolName == null) return this.itemIcon; + if(poolName.startsWith(GenericRecipes.POOL_PREFIX_DISCOVER)) return this.iconDiscover; + if(poolName.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) return this.iconSecret; + } + + return this.itemIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + for(Entry> pool : GenericRecipes.blueprintPools.entrySet()) { + String poolName = pool.getKey(); + if(!poolName.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) list.add(make(poolName)); + } + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if(world.isRemote) return stack; + if(!stack.hasTagCompound()) return stack; + + String poolName = stack.stackTagCompound.getString("pool"); + + if(poolName.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) return stack; + if(!player.inventory.hasItem(Items.paper)) return stack; + + player.inventory.consumeInventoryItem(Items.paper); + player.swingItem(); + + ItemStack copy = stack.copy(); + copy.stackSize = 1; + + if(!player.capabilities.isCreativeMode) { + if(stack.stackSize < stack.getMaxStackSize()) { + stack.stackSize++; + return stack; + } + + if(!player.inventory.addItemStackToInventory(copy)) { + copy = stack.copy(); + copy.stackSize = 1; + player.dropPlayerItemWithRandomChoice(copy, false); + } + + player.inventoryContainer.detectAndSendChanges(); + } else { + player.dropPlayerItemWithRandomChoice(copy, false); + } + + return stack; + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + + if(!stack.hasTagCompound()) { + return; + } + + String poolName = stack.stackTagCompound.getString("pool"); + List pool = GenericRecipes.blueprintPools.get(poolName); + + if(pool == null || pool.isEmpty()) { + return; + } + if(poolName.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) { + list.add(EnumChatFormatting.RED + "Cannot be copied!"); + } else { + list.add(EnumChatFormatting.YELLOW + "Right-click to copy (requires paper)"); + } + + for(String name : pool) { + GenericRecipe recipe = GenericRecipes.pooledBlueprints.get(name); + if(recipe != null) { + list.add(recipe.getLocalizedName()); + } + } + } + + public static String grabPool(ItemStack stack) { + if(stack == null) return null; + if(stack.getItem() != ModItems.blueprints) return null; + if(!stack.hasTagCompound()) return null; + if(!stack.stackTagCompound.hasKey("pool")) return null; + return stack.stackTagCompound.getString("pool"); + } + + public static ItemStack make(String pool) { + ItemStack stack = new ItemStack(ModItems.blueprints); + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setString("pool", pool); + return stack; + } +} diff --git a/src/main/java/com/hbm/items/machine/ItemCatalyst.java b/src/main/java/com/hbm/items/machine/ItemCatalyst.java index 99ffe4a11..25dae2545 100644 --- a/src/main/java/com/hbm/items/machine/ItemCatalyst.java +++ b/src/main/java/com/hbm/items/machine/ItemCatalyst.java @@ -37,12 +37,6 @@ public class ItemCatalyst extends Item { @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { - /*list.add("Absolute Energy Bonus: " + powerAbs + "HE"); - list.add("Energy Modifier: " + (powerMod >= 1 ? "+" : "") + (Math.round(powerMod * 1000) * .10 - 100) + "%"); - list.add("Heat Modifier: " + (heatMod >= 1 ? "+" : "") + (Math.round(heatMod * 1000) * .10 - 100) + "%"); - list.add("Fuel Modifier: " + (fuelMod >= 1 ? "+" : "") + (Math.round(fuelMod * 1000) * .10 - 100) + "%");*/ - //TODO: do something useful with this - list.add("Adds spice to the core."); list.add("Look at all those colors!"); } diff --git a/src/main/java/com/hbm/items/machine/ItemChemistryIcon.java b/src/main/java/com/hbm/items/machine/ItemChemistryIcon.java index f3e190dc5..41cd901c9 100644 --- a/src/main/java/com/hbm/items/machine/ItemChemistryIcon.java +++ b/src/main/java/com/hbm/items/machine/ItemChemistryIcon.java @@ -15,6 +15,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; +@Deprecated public class ItemChemistryIcon extends Item { @SideOnly(Side.CLIENT) diff --git a/src/main/java/com/hbm/items/machine/ItemChemistryTemplate.java b/src/main/java/com/hbm/items/machine/ItemChemistryTemplate.java index d644a4515..49db2a232 100644 --- a/src/main/java/com/hbm/items/machine/ItemChemistryTemplate.java +++ b/src/main/java/com/hbm/items/machine/ItemChemistryTemplate.java @@ -4,7 +4,6 @@ import java.util.List; import com.hbm.inventory.recipes.ChemplantRecipes; import com.hbm.inventory.recipes.ChemplantRecipes.ChemRecipe; -import com.hbm.items.ModItems; import com.hbm.util.i18n.I18nUtil; import cpw.mods.fml.relauncher.Side; @@ -16,6 +15,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; +@Deprecated public class ItemChemistryTemplate extends Item { public ItemChemistryTemplate() { @@ -51,6 +51,7 @@ public class ItemChemistryTemplate extends Item { @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + list.add(EnumChatFormatting.RED + "Deprecated"); if(!(stack.getItem() instanceof ItemChemistryTemplate)) return; @@ -61,9 +62,6 @@ public class ItemChemistryTemplate extends Item { return; } - list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("info.templatefolder", I18nUtil.resolveKey(ModItems.template_folder.getUnlocalizedName() + ".name"))); - list.add(""); - try { list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("info.template_out_p")); for(int i = 0; i < 4; i++) { diff --git a/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java b/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java index 2a7fc95ce..ecf9797e6 100644 --- a/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java +++ b/src/main/java/com/hbm/items/machine/ItemFluidSiphon.java @@ -10,8 +10,7 @@ import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Unsiphonable; import com.hbm.items.ModItems; import com.hbm.items.tool.ItemPipette; -import api.hbm.fluid.IFluidStandardReceiver; -import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.fluidmk2.IFluidStandardReceiverMK2; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -19,78 +18,82 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class ItemFluidSiphon extends Item { - + @Override public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int i, float f0, float f1, float f2) { TileEntity te = CompatExternal.getCoreFromPos(world, x, y, z); - if(te != null && (te instanceof IFluidStandardReceiver || te instanceof IFluidStandardTransceiver)) { - FluidTank[] tanks; - if (te instanceof IFluidStandardReceiver) { - tanks = ((IFluidStandardReceiver) te).getReceivingTanks(); - } else { - tanks = ((IFluidStandardTransceiver) te).getReceivingTanks(); - } + if(te != null && te instanceof IFluidStandardReceiverMK2) { + FluidTank[] tanks = ((IFluidStandardReceiverMK2) te).getReceivingTanks(); - boolean hasDrainedTank = false; - - // We need to iterate through the inventory for _each_ siphonable tank, so we can handle fluids that can only go into certain containers - // After we successfully siphon any fluid from a tank, we stop further processing, multiple fluid types require multiple clicks - for (FluidTank tank : tanks) { - if (tank.getFill() <= 0) continue; + boolean hasDrainedTank = false; - ItemStack availablePipette = null; - FluidType tankType = tank.getTankType(); + // We need to iterate through the inventory for _each_ siphonable + // tank, so we can handle fluids that can only go into certain containers + // After we successfully siphon any fluid from a tank, we stop + // further processing, multiple fluid types require multiple clicks + for(FluidTank tank : tanks) { + if(tank.getFill() <= 0) + continue; - if (tankType.hasTrait(FT_Unsiphonable.class)) continue; + ItemStack availablePipette = null; + FluidType tankType = tank.getTankType(); - for (int j = 0; j < player.inventory.mainInventory.length; j++) { - ItemStack inventoryStack = player.inventory.mainInventory[j]; - if (inventoryStack == null) continue; + if(tankType.hasTrait(FT_Unsiphonable.class)) + continue; - FluidContainer container = FluidContainerRegistry.getContainer(tankType, inventoryStack); + for(int j = 0; j < player.inventory.mainInventory.length; j++) { + ItemStack inventoryStack = player.inventory.mainInventory[j]; + if(inventoryStack == null) + continue; - if (availablePipette == null && inventoryStack.getItem() instanceof ItemPipette) { - ItemPipette pipette = (ItemPipette) inventoryStack.getItem(); - if (!pipette.willFizzle(tankType) && pipette != ModItems.pipette_laboratory) { // Ignoring laboratory pipettes for now - availablePipette = inventoryStack; - } - } + FluidContainer container = FluidContainerRegistry.getContainer(tankType, inventoryStack); - if (container == null) continue; + if(availablePipette == null && inventoryStack.getItem() instanceof ItemPipette) { + ItemPipette pipette = (ItemPipette) inventoryStack.getItem(); + if(!pipette.willFizzle(tankType) && pipette != ModItems.pipette_laboratory) { // Ignoring laboratory pipettes for now + availablePipette = inventoryStack; + } + } - ItemStack full = FluidContainerRegistry.getFullContainer(inventoryStack, tankType); + if(container == null) + continue; - while (tank.getFill() >= container.content && inventoryStack.stackSize > 0) { - hasDrainedTank = true; + ItemStack full = FluidContainerRegistry.getFullContainer(inventoryStack, tankType); - inventoryStack.stackSize--; - if (inventoryStack.stackSize <= 0) { - player.inventory.mainInventory[j] = null; - } + while(tank.getFill() >= container.content && inventoryStack.stackSize > 0) { + hasDrainedTank = true; - ItemStack filledContainer = full.copy(); - tank.setFill(tank.getFill() - container.content); - player.inventory.addItemStackToInventory(filledContainer); - } - } + inventoryStack.stackSize--; + if(inventoryStack.stackSize <= 0) { + player.inventory.mainInventory[j] = null; + } - // If the remainder of the tank can only fit into a pipette, fill a pipette with the remainder - // Will not auto-fill fizzlable pipettes, there is no feedback for the fizzle in this case, and that's a touch too unfair - if (availablePipette != null && tank.getFill() < 1000) { - ItemPipette pipette = (ItemPipette) availablePipette.getItem(); - - if (pipette.acceptsFluid(tankType, availablePipette)) { - hasDrainedTank = true; - tank.setFill(pipette.tryFill(tankType, tank.getFill(), availablePipette)); - } - } + ItemStack filledContainer = full.copy(); + tank.setFill(tank.getFill() - container.content); + player.inventory.addItemStackToInventory(filledContainer); + } + } - if (hasDrainedTank) return true; - } + // If the remainder of the tank can only fit into a pipette, + // fill a pipette with the remainder + // Will not auto-fill fizzlable pipettes, there is no feedback + // for the fizzle in this case, and that's a touch too unfair + if(availablePipette != null && tank.getFill() < 1000) { + ItemPipette pipette = (ItemPipette) availablePipette.getItem(); + + if(pipette.acceptsFluid(tankType, availablePipette)) { + hasDrainedTank = true; + tank.setFill(pipette.tryFill(tankType, tank.getFill(), availablePipette)); + } + } + + if(hasDrainedTank) + return true; + } } return false; } - + } diff --git a/src/main/java/com/hbm/items/machine/ItemFluidTank.java b/src/main/java/com/hbm/items/machine/ItemFluidTank.java index ce7a2cd0d..a8642652a 100644 --- a/src/main/java/com/hbm/items/machine/ItemFluidTank.java +++ b/src/main/java/com/hbm/items/machine/ItemFluidTank.java @@ -30,9 +30,7 @@ public class ItemFluidTank extends Item { for(int i = 1; i < order.length; ++i) { FluidType type = order[i]; - if(type.hasNoContainer()) - continue; - + if(type.hasNoContainer()) continue; int id = type.getID(); if(type.needsLeadContainer()) { @@ -46,14 +44,10 @@ public class ItemFluidTank extends Item { } } + @Override public String getItemStackDisplayName(ItemStack stack) { - String s = ("" + StatCollector.translateToLocal(this.getUnlocalizedName() + ".name")).trim(); String s1 = ("" + StatCollector.translateToLocal(Fluids.fromID(stack.getItemDamage()).getConditionalName())).trim(); - - if(s1 != null) { - s = s + " " + s1; - } - + String s = ("" + StatCollector.translateToLocalFormatted(this.getUnlocalizedName() + ".name", s1)).trim(); return s; } @@ -68,12 +62,10 @@ public class ItemFluidTank extends Item { public void registerIcons(IIconRegister p_94581_1_) { super.registerIcons(p_94581_1_); - if(this == ModItems.fluid_tank_full) - this.overlayIcon = p_94581_1_.registerIcon("hbm:fluid_tank_overlay"); - if(this == ModItems.fluid_tank_lead_full) - this.overlayIcon = p_94581_1_.registerIcon("hbm:fluid_tank_lead_overlay"); - if(this == ModItems.fluid_barrel_full) - this.overlayIcon = p_94581_1_.registerIcon("hbm:fluid_barrel_overlay"); + if(this == ModItems.fluid_tank_full) this.overlayIcon = p_94581_1_.registerIcon("hbm:fluid_tank_overlay"); + if(this == ModItems.fluid_tank_lead_full) this.overlayIcon = p_94581_1_.registerIcon("hbm:fluid_tank_lead_overlay"); + if(this == ModItems.fluid_barrel_full) this.overlayIcon = p_94581_1_.registerIcon("hbm:fluid_barrel_overlay"); + if(this == ModItems.fluid_pack_full) this.overlayIcon = p_94581_1_.registerIcon("hbm:fluid_pack_overlay"); } @Override @@ -84,18 +76,13 @@ public class ItemFluidTank extends Item { @Override @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack stack, int p_82790_2_) { - if(p_82790_2_ == 0) { + public int getColorFromItemStack(ItemStack stack, int pass) { + if(pass == 0) { return 16777215; } else { int j = Fluids.fromID(stack.getItemDamage()).getColor(); - - if(j < 0) { - j = 16777215; - } - + if(j < 0) j = 16777215; return j; } } - } diff --git a/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java b/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java new file mode 100644 index 000000000..1ef5ec736 --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemPWRPrinter.java @@ -0,0 +1,176 @@ +package com.hbm.items.machine; + +import java.util.HashSet; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.machine.BlockPWR; +import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; +import com.hbm.inventory.gui.GUIScreenSlicePrinter; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.machine.TileEntityPWRController; +import com.hbm.util.fauxpointtwelve.BlockPos; + +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class ItemPWRPrinter extends Item implements IGUIProvider { + + private static int x1, y1, z1; + private static int x2, y2, z2; + private static Block[] blockSync; + private static ForgeDirection dir; + + private HashSet fill = new HashSet<>(); + private static HashSet whitelist = new HashSet() {{ + add(ModBlocks.pwr_block); + add(ModBlocks.pwr_controller); + }}; + + // Piggybacking functions using the bytebuf TE sync + public static void serialize(World world, ByteBuf buf) { + buf.writeInt(x1); + buf.writeInt(y1); + buf.writeInt(z1); + buf.writeInt(x2); + buf.writeInt(y2); + buf.writeInt(z2); + buf.writeInt(dir.ordinal()); + + for(Block block : blockSync) { + buf.writeInt(Block.getIdFromBlock(block)); + } + + blockSync = null; + } + + public static void deserialize(World world, ByteBuf buf) { + x1 = buf.readInt(); + y1 = buf.readInt(); + z1 = buf.readInt(); + x2 = buf.readInt(); + y2 = buf.readInt(); + z2 = buf.readInt(); + dir = ForgeDirection.values()[buf.readInt()]; + + for(int x = x1; x <= x2; x++) { + for(int y = y1; y <= y2; y++) { + for(int z = z1; z <= z2; z++) { + Block block = Block.getBlockById(buf.readInt()); + + TileEntity tile = world.getTileEntity(x, y, z); + if(!(tile instanceof TileEntityBlockPWR)) continue; + ((TileEntityBlockPWR) tile).block = block; + } + } + } + + System.out.println("oh wow it synced and attempted to GUI!"); + + // Open the printer GUI on any client players holding the printer + // yeah it's a shit hack yay weee wooo + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + if(player != null && player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemPWRPrinter) { + FMLNetworkHandler.openGui(Minecraft.getMinecraft().thePlayer, MainRegistry.instance, 0, world, 0, 0, 0); + } + + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int i, float f0, float f1, float f2) { + TileEntity tile = world.getTileEntity(x, y, z); + if(!(tile instanceof TileEntityPWRController)) return false; + if(world.isRemote) return true; + + TileEntityPWRController pwr = (TileEntityPWRController) tile; + syncAndScreenshot(world, pwr); + + return true; + } + + public void syncAndScreenshot(World world, TileEntityPWRController pwr) { + findBounds(world, pwr); + + int sizeX = x2 - x1 + 1; + int sizeY = y2 - y1 + 1; + int sizeZ = z2 - z1 + 1; + + blockSync = new Block[sizeX * sizeY * sizeZ]; + int i = 0; + + for(int x = x1; x <= x2; x++) { + for(int y = y1; y <= y2; y++) { + for(int z = z1; z <= z2; z++) { + TileEntity tile = world.getTileEntity(x, y, z); + if(tile instanceof TileEntityBlockPWR) { + blockSync[i] = ((TileEntityBlockPWR) tile).block; + } + i++; + } + } + } + + pwr.isPrinting = true; + } + + public void findBounds(World world, TileEntityPWRController pwr) { + dir = ForgeDirection.getOrientation(world.getBlockMetadata(pwr.xCoord, pwr.yCoord, pwr.zCoord)).getOpposite(); + + fill.clear(); + fill.add(new BlockPos(pwr.xCoord, pwr.yCoord, pwr.zCoord)); + x1 = x2 = pwr.xCoord; + y1 = y2 = pwr.yCoord; + z1 = z2 = pwr.zCoord; + floodFill(world, pwr.xCoord + dir.offsetX, pwr.yCoord, pwr.zCoord + dir.offsetZ); + } + + public void floodFill(World world, int x, int y, int z) { + BlockPos pos = new BlockPos(x, y, z); + if(fill.contains(pos)) return; + + if(world.getBlock(x, y, z) instanceof BlockPWR) { + fill.add(pos); + + x1 = Math.min(x1, x); + y1 = Math.min(y1, y); + z1 = Math.min(z1, z); + x2 = Math.max(x2, x); + y2 = Math.max(y2, y); + z2 = Math.max(z2, z); + + floodFill(world, x + 1, y, z); + floodFill(world, x - 1, y, z); + floodFill(world, x, y + 1, z); + floodFill(world, x, y - 1, z); + floodFill(world, x, y, z + 1); + floodFill(world, x, y, z - 1); + } + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } + + @Override + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIScreenSlicePrinter(x1, y1, z1, x2, y2, z2, dir, whitelist); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + list.add("Use on a constructed PWR controller to generate construction diagrams"); + } + +} diff --git a/src/main/java/com/hbm/items/machine/ItemSatChip.java b/src/main/java/com/hbm/items/machine/ItemSatChip.java index b02dd36fa..164c6540c 100644 --- a/src/main/java/com/hbm/items/machine/ItemSatChip.java +++ b/src/main/java/com/hbm/items/machine/ItemSatChip.java @@ -4,6 +4,7 @@ import java.util.List; import com.hbm.items.ISatChip; import com.hbm.items.ModItems; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -14,36 +15,37 @@ public class ItemSatChip extends Item implements ISatChip { @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { - list.add("Satellite frequency: " + getFreq(itemstack)); - + list.add(I18nUtil.resolveKey("satchip.frequency") + ": " + getFreq(itemstack)); + if(this == ModItems.sat_foeq) - list.add("Gives you an achievement. That's it."); - - if(this == ModItems.sat_gerald) { - list.add("Single use."); - list.add("Requires orbital module."); - list.add("Melter of CPUs, bane of every server owner."); + list.add(I18nUtil.resolveKey("satchip.foeq")); + + if (this == ModItems.sat_gerald) { + String[] lines = I18nUtil.resolveKeyArray("satchip.gerald.desc"); + for (String line : lines) { + list.add(line); + } } - + if(this == ModItems.sat_laser) - list.add("Allows to summon lasers with a 15 second cooldown."); - + list.add(I18nUtil.resolveKey("satchip.laser")); + if(this == ModItems.sat_mapper) - list.add("Displays currently loaded chunks."); - + list.add(I18nUtil.resolveKey("satchip.mapper")); + if(this == ModItems.sat_miner) - list.add("Will deliver ore powders to a cargo landing pad."); - + list.add(I18nUtil.resolveKey("satchip.miner")); + if(this == ModItems.sat_lunar_miner) - list.add("Mines moon turf to deliver it to a cargo landing pad."); - + list.add(I18nUtil.resolveKey("satchip.lunar_miner")); + if(this == ModItems.sat_radar) - list.add("Shows a map of active entities."); - + list.add(I18nUtil.resolveKey("satchip.radar")); + if(this == ModItems.sat_resonator) - list.add("Allows for teleportation with no cooldown."); - + list.add(I18nUtil.resolveKey("satchip.resonator")); + if(this == ModItems.sat_scanner) - list.add("Creates a topdown map of underground ores."); + list.add(I18nUtil.resolveKey("satchip.scanner")); } } diff --git a/src/main/java/com/hbm/items/special/ItemDrop.java b/src/main/java/com/hbm/items/special/ItemDrop.java index 154785cf5..e1db9ab9e 100644 --- a/src/main/java/com/hbm/items/special/ItemDrop.java +++ b/src/main/java/com/hbm/items/special/ItemDrop.java @@ -202,7 +202,7 @@ public class ItemDrop extends Item { list.add("Continuously heats up matter by"); list.add("resonating every planck second."); list.add("Tends to catch fire or to create"); - list.add("small plamsa arcs. Not edible."); + list.add("small plasma arcs. Not edible."); } if (this == ModItems.black_hole) { list.add("Contains a regular singularity"); diff --git a/src/main/java/com/hbm/items/special/ItemExpensive.java b/src/main/java/com/hbm/items/special/ItemExpensive.java new file mode 100644 index 000000000..cde77e340 --- /dev/null +++ b/src/main/java/com/hbm/items/special/ItemExpensive.java @@ -0,0 +1,22 @@ +package com.hbm.items.special; + +import java.util.List; + +import com.hbm.items.ItemEnumMulti; +import com.hbm.items.ItemEnums.EnumExpensiveType; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +public class ItemExpensive extends ItemEnumMulti { + + public ItemExpensive() { + super(EnumExpensiveType.class, true, true); + } + + @Override + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + list.add(EnumChatFormatting.RED + "Expensive mode item"); + } +} diff --git a/src/main/java/com/hbm/items/special/ItemHotDusted.java b/src/main/java/com/hbm/items/special/ItemHotDusted.java index 64cee05ca..0c9f3f86d 100644 --- a/src/main/java/com/hbm/items/special/ItemHotDusted.java +++ b/src/main/java/com/hbm/items/special/ItemHotDusted.java @@ -1,4 +1,5 @@ package com.hbm.items.special; +import com.hbm.util.i18n.I18nUtil; import java.util.List; @@ -6,17 +7,16 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; public class ItemHotDusted extends ItemHot { - public ItemHotDusted(int heat) { super(heat); this.setHasSubtypes(true); } - + @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - list.add("Forged " + stack.getItemDamage() + " time(s)"); + list.add(String.format(I18nUtil.resolveKey("item.hot_dusted.forged"), stack.getItemDamage())); } - + public static int getMaxHeat(ItemStack stack) { return heat - stack.getItemDamage() * 10; } diff --git a/src/main/java/com/hbm/items/special/ItemRag.java b/src/main/java/com/hbm/items/special/ItemRag.java index bb883f6eb..44e606e57 100644 --- a/src/main/java/com/hbm/items/special/ItemRag.java +++ b/src/main/java/com/hbm/items/special/ItemRag.java @@ -2,6 +2,7 @@ package com.hbm.items.special; import java.util.List; +import com.hbm.util.i18n.I18nUtil; import com.hbm.items.ModItems; import net.minecraft.block.material.Material; @@ -15,31 +16,31 @@ public class ItemRag extends Item { @Override public boolean onEntityItemUpdate(EntityItem entityItem) { - + if(entityItem != null && !entityItem.worldObj.isRemote) { - - if(entityItem.worldObj.getBlock((int)Math.floor(entityItem.posX), (int)Math.floor(entityItem.posY), (int)Math.floor(entityItem.posZ)).getMaterial() == Material.water) { + + if (entityItem.worldObj.getBlock((int) Math.floor(entityItem.posX), (int) Math.floor(entityItem.posY), + (int) Math.floor(entityItem.posZ)).getMaterial() == Material.water) { ItemStack stack = entityItem.getEntityItem(); entityItem.setEntityItemStack(new ItemStack(ModItems.rag_damp, stack.stackSize)); return true; } } - return false; } - + @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - stack.stackSize--; player.inventory.addItemStackToInventory(new ItemStack(ModItems.rag_piss)); - return stack; } - + @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { - list.add("Drop into water to make damp cloth."); - list.add("Right-click to urinate on the cloth."); + String[] lines = I18nUtil.resolveKeyArray("item.rag.desc"); + for (String line : lines) { + list.add(line); + } } } diff --git a/src/main/java/com/hbm/items/special/ItemStarterKit.java b/src/main/java/com/hbm/items/special/ItemStarterKit.java index 4e70ed205..ba8bf97b4 100644 --- a/src/main/java/com/hbm/items/special/ItemStarterKit.java +++ b/src/main/java/com/hbm/items/special/ItemStarterKit.java @@ -10,7 +10,6 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemBattery; import com.hbm.items.machine.ItemBreedingRod.BreedingRodType; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; -import com.hbm.util.ShadyUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -22,10 +21,9 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; -import net.minecraft.util.ChatComponentText; import net.minecraft.world.World; -@Deprecated //not deprecated per se but please stop using it wherever possible +@Deprecated @Spaghetti("i do not care how much 'optimization' you want to throw at this dumpster fire but there's no saving grace here") public class ItemStarterKit extends Item { @@ -75,8 +73,8 @@ public class ItemStarterKit extends Item { player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_difurnace_off, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_gascent, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_reactor_breeding, 1)); - player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_assembler, 1)); - player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_chemplant, 1)); + player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_assembly_machine, 1)); + player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_chemical_plant, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.reactor_research, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_turbine, 2)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.radaway, 8)); @@ -95,7 +93,6 @@ public class ItemStarterKit extends Item { if(this == ModItems.nuke_advanced_kit) { - player.inventory.addItemStackToInventory(new ItemStack(ModItems.powder_yellowcake, 64)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.powder_plutonium, 64)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.ingot_steel, 64)); @@ -113,8 +110,8 @@ public class ItemStarterKit extends Item { player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_turbine, 4)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_radgen, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_rtg_grey, 1)); - player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_assembler, 3)); - player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_chemplant, 2)); + player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_assembly_machine, 3)); + player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_chemical_plant, 2)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_fluidtank, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.pellet_rtg, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.pellet_rtg, 1)); @@ -128,7 +125,6 @@ public class ItemStarterKit extends Item { player.inventory.addItemStackToInventory(new ItemStack(ModItems.radaway_strong, 4)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.radx, 4)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.pill_iodine, 1)); - player.inventory.addItemStackToInventory(new ItemStack(ModItems.tritium_deuterium_cake, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.geiger_counter, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.survey_scanner, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.gas_mask_m65, 1)); @@ -440,29 +436,17 @@ public class ItemStarterKit extends Item { player.inventory.addItemStackToInventory(new ItemStack(Item.getItemFromBlock(ModBlocks.statue_elb_f), 1)); } - if(this == ModItems.hazmat_kit) - { + if(this == ModItems.hazmat_kit) { giveHaz(world, player, 0); } - - if(this == ModItems.hazmat_red_kit) - { + + if(this == ModItems.hazmat_red_kit) { giveHaz(world, player, 1); } - - if(this == ModItems.hazmat_grey_kit) - { + + if(this == ModItems.hazmat_grey_kit) { giveHaz(world, player, 2); } - - if(this == ModItems.letter && world.isRemote) - { - if(player.getUniqueID().toString().equals(ShadyUtil.a20)) { - player.addChatMessage(new ChatComponentText("Error: null reference @ com.hbm.items.ItemStarterKit.class, please report this to the modder!")); - } else { - player.addChatMessage(new ChatComponentText("You rip the letter in half; nothing happens.")); - } - } world.playSoundAtEntity(player, "hbm:item.unpack", 1.0F, 1.0F); stack.stackSize--; @@ -470,42 +454,42 @@ public class ItemStarterKit extends Item { } - @SideOnly(Side.CLIENT) - @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean b) { + @SideOnly(Side.CLIENT) + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean b) { - if(this == ModItems.nuke_starter_kit || - this == ModItems.nuke_advanced_kit || - this == ModItems.nuke_commercially_kit || - this == ModItems.nuke_electric_kit || - this == ModItems.gadget_kit || - this == ModItems.boy_kit || - this == ModItems.man_kit || - this == ModItems.mike_kit || - this == ModItems.tsar_kit || - this == ModItems.prototype_kit || - this == ModItems.fleija_kit || - this == ModItems.solinium_kit || - this == ModItems.t45_kit || - this == ModItems.grenade_kit || - this == ModItems.missile_kit || - this == ModItems.multi_kit) { - list.add("Please empty inventory before opening!"); - } - if(this == ModItems.nuke_starter_kit || - this == ModItems.nuke_advanced_kit || - this == ModItems.nuke_commercially_kit || - this == ModItems.gadget_kit || - this == ModItems.boy_kit || - this == ModItems.man_kit || - this == ModItems.mike_kit || - this == ModItems.tsar_kit || - this == ModItems.prototype_kit || - this == ModItems.fleija_kit || - this == ModItems.solinium_kit || - this == ModItems.hazmat_kit) { - list.add("Armor will be displaced by hazmat suit."); - } - } + if(this == ModItems.nuke_starter_kit || + this == ModItems.nuke_advanced_kit || + this == ModItems.nuke_commercially_kit || + this == ModItems.nuke_electric_kit || + this == ModItems.gadget_kit || + this == ModItems.boy_kit || + this == ModItems.man_kit || + this == ModItems.mike_kit || + this == ModItems.tsar_kit || + this == ModItems.prototype_kit || + this == ModItems.fleija_kit || + this == ModItems.solinium_kit || + this == ModItems.t45_kit || + this == ModItems.grenade_kit || + this == ModItems.missile_kit || + this == ModItems.multi_kit) { + list.add("Please empty inventory before opening!"); + } + if(this == ModItems.nuke_starter_kit || + this == ModItems.nuke_advanced_kit || + this == ModItems.nuke_commercially_kit || + this == ModItems.gadget_kit || + this == ModItems.boy_kit || + this == ModItems.man_kit || + this == ModItems.mike_kit || + this == ModItems.tsar_kit || + this == ModItems.prototype_kit || + this == ModItems.fleija_kit || + this == ModItems.solinium_kit || + this == ModItems.hazmat_kit) { + list.add("Armor will be displaced by hazmat suit."); + } + } } diff --git a/src/main/java/com/hbm/items/tool/ItemRangefinder.java b/src/main/java/com/hbm/items/tool/ItemRangefinder.java new file mode 100644 index 000000000..9c1d5179f --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemRangefinder.java @@ -0,0 +1,47 @@ +package com.hbm.items.tool; + +import com.hbm.main.MainRegistry; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.PlayerInformPacket; +import com.hbm.util.ChatBuilder; +import com.hbm.util.Vec3NT; + +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.EnumChatFormatting; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public class ItemRangefinder extends Item { + + public static final int META_POLARIZED = 1; + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if(world.isRemote) return stack; + + Vec3NT start = new Vec3NT(player.posX, player.posY + player.eyeHeight, player.posZ); + Vec3NT startOriginal = new Vec3NT(start); // why the fuck + Vec3NT end = new Vec3NT(start).add(new Vec3NT(player.getLookVec()).multiply(300)); + + MovingObjectPosition mop = world.func_147447_a(start, end, false, true, false); + + if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK) { + double dist = startOriginal.distanceTo(mop.hitVec); + String msg = ((int)(dist * 10D)) / 10D + "m"; + if(stack.getItemDamage() == META_POLARIZED) msg = EnumChatFormatting.LIGHT_PURPLE + msg + EnumChatFormatting.RESET; + PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start(msg).flush(), MainRegistry.proxy.ID_DETONATOR, 5000), (EntityPlayerMP) player); + } + + return stack; + } + + @Override + public String getItemStackDisplayName(ItemStack stack) { + String name = super.getItemStackDisplayName(stack); + if(stack.getItemDamage() == META_POLARIZED) name = EnumChatFormatting.LIGHT_PURPLE + name + EnumChatFormatting.RESET; + return name; + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemRebarPlacer.java b/src/main/java/com/hbm/items/tool/ItemRebarPlacer.java new file mode 100644 index 000000000..d6d5715cd --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemRebarPlacer.java @@ -0,0 +1,340 @@ +package com.hbm.items.tool; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockConcreteColoredExt.EnumConcreteType; +import com.hbm.blocks.generic.BlockRebar.TileEntityRebar; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.SlotPattern; +import com.hbm.inventory.gui.GuiInfoContainer; +import com.hbm.items.ItemInventory; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.util.ChatBuilder; +import com.hbm.util.InventoryUtil; +import com.hbm.util.ItemStackUtil; +import com.hbm.util.Tuple.Pair; +import com.hbm.util.i18n.I18nUtil; + +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.resources.I18n; +import net.minecraft.entity.Entity; +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.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class ItemRebarPlacer extends Item implements IGUIProvider { + + public static List> acceptableConk = new ArrayList(); + + public ItemRebarPlacer() { + this.setMaxStackSize(1); + + acceptableConk.add(new Pair(ModBlocks.concrete, 0)); + acceptableConk.add(new Pair(ModBlocks.concrete_rebar, 0)); + acceptableConk.add(new Pair(ModBlocks.concrete_smooth, 0)); + acceptableConk.add(new Pair(ModBlocks.concrete_pillar, 0)); + + for(int i = 0; i < 16; i++) acceptableConk.add(new Pair(ModBlocks.concrete_colored, i)); + for(int i = 0; i < EnumConcreteType.values().length; i++) acceptableConk.add(new Pair(ModBlocks.concrete_colored_ext, i)); + } + + public static boolean isValidConk(Item item, int meta) { + + for(Pair conk : acceptableConk) { + if(item == Item.getItemFromBlock(conk.getKey()) && meta == conk.getValue()) return true; + } + return false; + } + + @Override + public int getMaxItemUseDuration(ItemStack stack) { + return 1; + } + + // if the placer isn't equipped or no concrete is loaded, forget the cached position + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean held) { + if(stack.hasTagCompound() && stack.stackTagCompound.hasKey("pos")) { + ItemStack theConk = ItemStackUtil.readStacksFromNBT(stack, 1)[0]; + + if(!held || theConk == null) { + stack.stackTagCompound.removeTag("pos"); + return; + } + + if(!isValidConk(theConk.getItem(), theConk.getItemDamage())) { + stack.stackTagCompound.removeTag("pos"); + return; + } + } + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if(!world.isRemote && player.isSneaking()) player.openGui(MainRegistry.instance, 0, world, 0, 0, 0); + return stack; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float fx, float fy, float fz) { + if(world.isRemote) return true; + if(!stack.hasTagCompound()) { + stack.stackTagCompound = new NBTTagCompound(); + ItemStackUtil.addStacksToNBT(stack, new ItemStack[] {new ItemStack(ModBlocks.concrete_rebar)}); + } + ItemStack theConk = ItemStackUtil.readStacksFromNBT(stack, 1)[0]; + + boolean hasConk = theConk != null && isValidConk(theConk.getItem(), theConk.getItemDamage()); + + if(!hasConk) { + player.addChatMessage(ChatBuilder.start("[").color(EnumChatFormatting.DARK_AQUA) + .nextTranslation(this.getUnlocalizedName() + ".name").color(EnumChatFormatting.DARK_AQUA) + .next("] ").color(EnumChatFormatting.DARK_AQUA) + .next("No valid concrete type set!").color(EnumChatFormatting.RED).flush()); + return true; + } + + ForgeDirection dir = ForgeDirection.getOrientation(side); + + if(!stack.stackTagCompound.hasKey("pos")) { + stack.stackTagCompound.setIntArray("pos", new int[] {x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ}); + } else { + int rebarLeft = InventoryUtil.countAStackMatches(player, new ComparableStack(ModBlocks.rebar), true); + if(rebarLeft <= 0) { + player.addChatMessage(ChatBuilder.start("[").color(EnumChatFormatting.DARK_AQUA) + .nextTranslation(this.getUnlocalizedName() + ".name").color(EnumChatFormatting.DARK_AQUA) + .next("] ").color(EnumChatFormatting.DARK_AQUA) + .next("Out of rebar!").color(EnumChatFormatting.RED).flush()); + stack.stackTagCompound.removeTag("pos"); + return true; + } + + int[] pos = stack.stackTagCompound.getIntArray("pos"); + int iX = x + dir.offsetX; + int iY = y + dir.offsetY; + int iZ = z + dir.offsetZ; + + int minX = Math.min(pos[0], iX); + int maxX = Math.max(pos[0], iX); + int minY = Math.min(pos[1], iY); + int maxY = Math.max(pos[1], iY); + int minZ = Math.min(pos[2], iZ); + int maxZ = Math.max(pos[2], iZ); + + int rebarUsed = 0; + + outer: for(int k = minY; k <= maxY; k++) { + for(int j = minZ; j <= maxZ; j++) { + for(int i = minX; i<= maxX; i++) { + if(rebarLeft <= 0) break outer; + + if(world.getBlock(i, k, j).isReplaceable(world, i, k, j) && player.canPlayerEdit(i, k, j, side, stack)) { + world.setBlock(i, k, j, ModBlocks.rebar); + TileEntity tile = world.getTileEntity(i, k, j); + if(tile instanceof TileEntityRebar) { + ((TileEntityRebar) tile).setup(Block.getBlockFromItem(theConk.getItem()), theConk.getItemDamage()); + } + rebarUsed++; + rebarLeft--; + } + } + } + } + + InventoryUtil.tryConsumeAStack(player.inventory.mainInventory, 0, player.inventory.mainInventory.length - 1, new ComparableStack(ModBlocks.rebar, rebarUsed)); + + player.addChatMessage(ChatBuilder.start("[").color(EnumChatFormatting.DARK_AQUA) + .nextTranslation(this.getUnlocalizedName() + ".name").color(EnumChatFormatting.DARK_AQUA) + .next("] ").color(EnumChatFormatting.DARK_AQUA) + .next("Placed " + rebarUsed + " rebar!").color(EnumChatFormatting.GREEN).flush()); + + stack.stackTagCompound.removeTag("pos"); + player.inventoryContainer.detectAndSendChanges(); + } + + return true; + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerRebar(player.inventory, new InventoryRebar(player, player.getHeldItem())); + } + + @Override + @SideOnly(Side.CLIENT) + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIRebar(player.inventory, new InventoryRebar(player, player.getHeldItem())); + } + + public static class InventoryRebar extends ItemInventory { + + public InventoryRebar(EntityPlayer player, ItemStack box) { + this.player = player; + this.target = box; + slots = new ItemStack[this.getSizeInventory()]; + + if(!box.hasTagCompound()) box.setTagCompound(new NBTTagCompound()); + + ItemStack[] fromNBT = ItemStackUtil.readStacksFromNBT(box, slots.length); + if(fromNBT != null) System.arraycopy(fromNBT, 0, slots, 0, slots.length); + } + + @Override public int getSizeInventory() { return 1; } + @Override public String getInventoryName() { return "container.rebar"; } + @Override public boolean hasCustomInventoryName() { return target.hasDisplayName(); } + @Override public int getInventoryStackLimit() { return 1; } + } + + public static class ContainerRebar extends Container { + + private InventoryRebar rebar; + + public ContainerRebar(InventoryPlayer invPlayer, InventoryRebar rebar) { + this.rebar = rebar; + + this.addSlotToContainer(new SlotPattern(rebar, 0, 53, 36)); + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 100 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 158)); + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + return null; + } + + @Override + public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { + + //L/R: 0 + //M3: 3 + //SHIFT: 1 + //DRAG: 5 + + // prevents the player from moving around the currently open box + if(mode == 2 && button == player.inventory.currentItem) return null; + if(index == player.inventory.currentItem + 47) return null; + + if(index != 0) 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(); + slot.putStack(held); + rebar.markDirty(); + + return ret; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return rebar.isUseableByPlayer(player); + } + + @Override + public void onContainerClosed(EntityPlayer player) { + super.onContainerClosed(player); + } + } + + public static class GUIRebar extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_rebar.png"); + private final InventoryRebar inventory; + + public GUIRebar(InventoryPlayer invPlayer, InventoryRebar box) { + super(new ContainerRebar(invPlayer, box)); + this.inventory = box; + + this.xSize = 176; + this.ySize = 182; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + if(this.isMouseOverSlot(this.inventorySlots.getSlot(0), mouseX, mouseY) && !this.inventorySlots.getSlot(0).getHasStack()) { + + List lines = new ArrayList(); + List list = new ArrayList(); + for(Pair conk : acceptableConk) list.add(new ItemStack(conk.getKey(), 1, conk.getValue())); + ItemStack selected = list.get(0); + + if(list.size() > 1) { + int cycle = (int) ((System.currentTimeMillis() % (1000 * list.size())) / 1000); + selected = ((ItemStack) list.get(cycle)).copy(); + selected.stackSize = 0; + list.set(cycle, selected); + } + + if(list.size() < 10) { + lines.add(list.toArray()); + } else if(list.size() < 24) { + lines.add(list.subList(0, list.size() / 2).toArray()); + lines.add(list.subList(list.size() / 2, list.size()).toArray()); + } else { + int bound0 = (int) Math.ceil(list.size() / 3D); + int bound1 = (int) Math.ceil(list.size() / 3D * 2D); + lines.add(list.subList(0, bound0).toArray()); + lines.add(list.subList(bound0, bound1).toArray()); + lines.add(list.subList(bound1, list.size()).toArray()); + } + + lines.add(new Object[] {I18nUtil.resolveKey(selected.getDisplayName())}); + this.drawStackText(lines, mouseX, mouseY, this.fontRendererObj); + } + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = I18n.format(this.inventory.getInventoryName()); + if(inventory.hasCustomInventoryName()) name = inventory.target.getDisplayName(); + 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); + } + + @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(inventory.slots[0] == null || !ItemRebarPlacer.isValidConk(inventory.slots[0].getItem(), inventory.slots[0].getItemDamage())) + drawTexturedModalRect(guiLeft + 87, guiTop + 17, 176, 0, 56, 56); + } + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemSwordMeteorite.java b/src/main/java/com/hbm/items/tool/ItemSwordMeteorite.java index eefbae55d..eda062796 100644 --- a/src/main/java/com/hbm/items/tool/ItemSwordMeteorite.java +++ b/src/main/java/com/hbm/items/tool/ItemSwordMeteorite.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import com.hbm.items.ModItems; +import com.hbm.util.i18n.I18nUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -25,64 +26,88 @@ public class ItemSwordMeteorite extends ItemSwordAbility { public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { super.addInformation(stack, player, list, ext); - if(this == ModItems.meteorite_sword) { - list.add(EnumChatFormatting.ITALIC + "Forged from a fallen star"); - list.add(EnumChatFormatting.ITALIC + "Sharper than most terrestrial blades"); + if (this == ModItems.meteorite_sword) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_seared) { - list.add(EnumChatFormatting.ITALIC + "Fire strengthens the blade"); - list.add(EnumChatFormatting.ITALIC + "Making it even more powerful"); + if (this == ModItems.meteorite_sword_seared) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.seared.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_reforged) { - list.add(EnumChatFormatting.ITALIC + "The sword has been reforged"); - list.add(EnumChatFormatting.ITALIC + "To rectify past imperfections"); + if (this == ModItems.meteorite_sword_reforged) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.reforged.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_hardened) { - list.add(EnumChatFormatting.ITALIC + "Extremely high pressure has been used"); - list.add(EnumChatFormatting.ITALIC + "To harden the blade further"); + if (this == ModItems.meteorite_sword_hardened) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.hardened.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_alloyed) { - list.add(EnumChatFormatting.ITALIC + "Cobalt fills the fissures"); - list.add(EnumChatFormatting.ITALIC + "Strengthening the sword"); + if (this == ModItems.meteorite_sword_alloyed) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.alloyed.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_machined) { - list.add(EnumChatFormatting.ITALIC + "Advanced machinery was used"); - list.add(EnumChatFormatting.ITALIC + "To refine the blade even more"); + if (this == ModItems.meteorite_sword_machined) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.machined.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_treated) { - list.add(EnumChatFormatting.ITALIC + "Chemicals have been applied"); - list.add(EnumChatFormatting.ITALIC + "Making the sword more powerful"); + if (this == ModItems.meteorite_sword_treated) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.treated.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_etched) { - list.add(EnumChatFormatting.ITALIC + "Acids clean the material"); - list.add(EnumChatFormatting.ITALIC + "To make this the perfect sword"); + if (this == ModItems.meteorite_sword_etched) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.etched.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_bred) { - list.add(EnumChatFormatting.ITALIC + "Immense heat and radiation"); - list.add(EnumChatFormatting.ITALIC + "Compress the material"); + if (this == ModItems.meteorite_sword_bred) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.bred.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_irradiated) { - list.add(EnumChatFormatting.ITALIC + "The power of the Atom"); - list.add(EnumChatFormatting.ITALIC + "Gives the sword might"); + if (this == ModItems.meteorite_sword_irradiated) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.irradiated.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_fused) { - list.add(EnumChatFormatting.ITALIC + "This blade has met"); - list.add(EnumChatFormatting.ITALIC + "With the forces of the stars"); + if (this == ModItems.meteorite_sword_fused) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.fused.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } - if(this == ModItems.meteorite_sword_baleful) { - list.add(EnumChatFormatting.ITALIC + "This sword has met temperatures"); - list.add(EnumChatFormatting.ITALIC + "Far beyond what normal material can endure"); + if (this == ModItems.meteorite_sword_baleful) { + String[] lines = I18nUtil.resolveKeyArray("item.meteorite_sword.baleful.desc"); + for (String line : lines) { + list.add(EnumChatFormatting.ITALIC + line); + } } /* diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbility.java b/src/main/java/com/hbm/items/tool/ItemToolAbility.java index e91283917..589938c88 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbility.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbility.java @@ -1,5 +1,7 @@ package com.hbm.items.tool; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Comparator; import java.util.HashSet; @@ -27,6 +29,7 @@ import com.hbm.packet.toclient.PlayerInformPacket; import com.hbm.tileentity.IGUIProvider; import api.hbm.item.IDepthRockTool; +import cpw.mods.fml.relauncher.ReflectionHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -151,6 +154,10 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro return true; } + // Should be safe, considering the AoE ability does a similar trick already. + // If not, wrap this in a ThreadLocal or something... + public static int dropX, dropY, dropZ; + @Override public boolean onBlockStartBreak(ItemStack stack, int x, int y, int z, EntityPlayer player) { @@ -173,6 +180,10 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro Configuration config = getConfiguration(stack); ToolPreset preset = config.getActivePreset(); + dropX = x; + dropY = y; + dropZ = z; + preset.harvestAbility.preHarvestAll(preset.harvestAbilityLevel, world, player); boolean skipRef = preset.areaAbility.onDig(preset.areaAbilityLevel, world, x, y, z, player, this); @@ -280,15 +291,21 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro Block block = world.getBlock(x, y, z); int meta = world.getBlockMetadata(x, y, z); - - if(!(canHarvestBlock(block, stack) || canShearBlock(block, stack, world, x, y, z)) || block == Blocks.bedrock || block == ModBlocks.stone_keyhole) - return; + + if(!(canHarvestBlock(block, stack) || + canShearBlock(block, stack, world, x, y, z)) || + (block.getBlockHardness(world, x, y, z) == -1.0F && block.getPlayerRelativeBlockHardness(player, world, x, y, z) == 0.0F) || + block == ModBlocks.stone_keyhole) return; Block refBlock = world.getBlock(refX, refY, refZ); float refStrength = ForgeHooks.blockStrength(refBlock, player, world, refX, refY, refZ); float strength = ForgeHooks.blockStrength(block, player, world, x, y, z); - if(!ForgeHooks.canHarvestBlock(block, player, meta) || refStrength / strength > 10f || refBlock.getPlayerRelativeBlockHardness(player, world, refX, refY, refZ) < 0) + if( + !ForgeHooks.canHarvestBlock(block, player, meta) || + refStrength / strength > 10f || + refBlock.getPlayerRelativeBlockHardness(player, world, refX, refY, refZ) < 0 + ) return; BlockEvent.BreakEvent event = ForgeHooks.onBlockBreakEvent(world, player.theItemInWorldManager.getGameType(), player, x, y, z); @@ -316,7 +333,7 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro double d = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; double d1 = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; double d2 = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D; - EntityItem entityitem = new EntityItem(player.worldObj, (double) x + d, (double) y + d1, (double) z + d2, stack); + EntityItem entityitem = new EntityItem(player.worldObj, (double) dropX + d, (double) dropY + d1, (double) dropZ + d2, stack); entityitem.delayBeforeCanPickup = 10; player.worldObj.spawnEntityInWorld(entityitem); } @@ -326,6 +343,9 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro } } + // Since it's added by forge, access transformers don't affect it (even wildcards), so we do it the old-fashioned way + private static Method blockCaptureDrops = ReflectionHelper.findMethod(Block.class, null, new String[] { "captureDrops" }, new Class[] { boolean.class }); + public static void standardDigPost(World world, int x, int y, int z, EntityPlayerMP player) { Block block = world.getBlock(x, y, z); @@ -351,7 +371,20 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro } if(removedByPlayer && canHarvest) { - block.harvestBlock(world, player, x, y, z, l); + try { + blockCaptureDrops.invoke(block, true); + block.harvestBlock(world, player, x, y, z, l); + List drops = (List)blockCaptureDrops.invoke(block, false); + for (ItemStack stack : drops) { + block.dropBlockAsItem(world, dropX, dropY, dropZ, stack); + } + } catch (IllegalAccessException e) { + // Shouldn't be possible with ReflectionHelper + MainRegistry.logger.error("Failed to capture drops for block " + block, e); + } catch (InvocationTargetException e) { + // Might be possible? Not in practice, though + MainRegistry.logger.error("Failed to capture drops for block " + block, e); + } } } diff --git a/src/main/java/com/hbm/items/tool/ItemWandS.java b/src/main/java/com/hbm/items/tool/ItemWandS.java index 2de5998fb..55de41e9a 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandS.java +++ b/src/main/java/com/hbm/items/tool/ItemWandS.java @@ -10,7 +10,7 @@ import java.text.SimpleDateFormat; import com.hbm.blocks.ModBlocks; import com.hbm.util.BobMathUtil; import com.hbm.util.Tuple.Pair; -import com.hbm.world.gen.NBTStructure; +import com.hbm.world.gen.nbt.NBTStructure; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/hbm/items/weapon/ItemCustomMissile.java b/src/main/java/com/hbm/items/weapon/ItemCustomMissile.java index a0bd103b3..6d428a401 100644 --- a/src/main/java/com/hbm/items/weapon/ItemCustomMissile.java +++ b/src/main/java/com/hbm/items/weapon/ItemCustomMissile.java @@ -6,6 +6,7 @@ import com.hbm.handler.MissileStruct; import com.hbm.items.ModItems; import com.hbm.items.weapon.ItemCustomMissilePart.FuelType; import com.hbm.items.weapon.ItemCustomMissilePart.WarheadType; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -15,35 +16,35 @@ import net.minecraft.util.EnumChatFormatting; public class ItemCustomMissile extends Item { public static ItemStack buildMissile(Item chip, Item warhead, Item fuselage, Item stability, Item thruster) { - + if(stability == null) { return buildMissile(new ItemStack(chip), new ItemStack(warhead), new ItemStack(fuselage), null, new ItemStack(thruster)); } else { return buildMissile(new ItemStack(chip), new ItemStack(warhead), new ItemStack(fuselage), new ItemStack(stability), new ItemStack(thruster)); } } - + public static ItemStack buildMissile(ItemStack chip, ItemStack warhead, ItemStack fuselage, ItemStack stability, ItemStack thruster) { - + ItemStack missile = new ItemStack(ModItems.missile_custom); writeToNBT(missile, "chip", Item.getIdFromItem(chip.getItem())); writeToNBT(missile, "warhead", Item.getIdFromItem(warhead.getItem())); writeToNBT(missile, "fuselage", Item.getIdFromItem(fuselage.getItem())); writeToNBT(missile, "thruster", Item.getIdFromItem(thruster.getItem())); - + if(stability != null) writeToNBT(missile, "stability", Item.getIdFromItem(stability.getItem())); - + return missile; } - + private static void writeToNBT(ItemStack stack, String key, int value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.stackTagCompound.setInteger(key, value); } - + public static int readFromNBT(ItemStack stack, String key) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); @@ -52,53 +53,63 @@ public class ItemCustomMissile extends Item { @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { - + if(!stack.hasTagCompound()) return; - + try { ItemCustomMissilePart chip = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "chip")); ItemCustomMissilePart warhead = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "warhead")); ItemCustomMissilePart fuselage = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "fuselage")); ItemCustomMissilePart stability = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "stability")); ItemCustomMissilePart thruster = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "thruster")); - - list.add(EnumChatFormatting.BOLD + "Warhead: " + EnumChatFormatting.GRAY + warhead.getWarhead((WarheadType)warhead.attributes[0])); - list.add(EnumChatFormatting.BOLD + "Strength: " + EnumChatFormatting.GRAY + (Float)warhead.attributes[1]); - list.add(EnumChatFormatting.BOLD + "Fuel Type: " + EnumChatFormatting.GRAY + fuselage.getFuel((FuelType)fuselage.attributes[0])); - list.add(EnumChatFormatting.BOLD + "Fuel amount: " + EnumChatFormatting.GRAY + (Float)fuselage.attributes[1] + "l"); - list.add(EnumChatFormatting.BOLD + "Chip inaccuracy: " + EnumChatFormatting.GRAY + (Float)chip.attributes[0] * 100 + "%"); - + + // warhead name + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.warhead") + ": " + EnumChatFormatting.GRAY + warhead.getWarhead((WarheadType)warhead.attributes[0])); + + // strength + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.strength") + ": " + EnumChatFormatting.GRAY + (Float)warhead.attributes[1]); + + // fuel type & amount + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.fuelType") + ": " + EnumChatFormatting.GRAY + fuselage.getFuel((FuelType)fuselage.attributes[0])); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.fuelAmount") + ": " + EnumChatFormatting.GRAY + (Float)fuselage.attributes[1] + "l"); + + // chip inaccuracy + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.chipInaccuracy") + ": " + EnumChatFormatting.GRAY + (Float)chip.attributes[0] * 100 + "%"); + + // fin inaccuracy if(stability != null) - list.add(EnumChatFormatting.BOLD + "Fin inaccuracy: " + EnumChatFormatting.GRAY + (Float)stability.attributes[0] * 100 + "%"); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.finInaccuracy") + ": " + EnumChatFormatting.GRAY + (Float)stability.attributes[0] * 100 + "%"); else - list.add(EnumChatFormatting.BOLD + "Fin inaccuracy: " + EnumChatFormatting.GRAY + "100%"); - - list.add(EnumChatFormatting.BOLD + "Size: " + EnumChatFormatting.GRAY + fuselage.getSize(fuselage.top) + "/" + fuselage.getSize(fuselage.bottom)); - + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.finInaccuracy") + ": " + EnumChatFormatting.GRAY + "100%"); + + // size + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.size") + ": " + EnumChatFormatting.GRAY + fuselage.getSize(fuselage.top) + "/" + fuselage.getSize(fuselage.bottom)); + + // health float health = warhead.health + fuselage.health + thruster.health; if(stability != null) health += stability.health; - - list.add(EnumChatFormatting.BOLD + "Health: " + EnumChatFormatting.GRAY + health + "HP"); - + + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("gui.missile.health") + ": " + EnumChatFormatting.GRAY + health + "HP"); + } catch(Exception ex) { - list.add(EnumChatFormatting.RED + "### I AM ERROR ###"); + list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("error.generic")); } } - + public static MissileStruct getStruct(ItemStack stack) { - + if(stack == null || !(stack.getItem() instanceof ItemCustomMissile)) return null; - + ItemCustomMissilePart warhead = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "warhead")); ItemCustomMissilePart fuselage = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "fuselage")); ItemCustomMissilePart stability = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "stability")); ItemCustomMissilePart thruster = (ItemCustomMissilePart) Item.getItemById(readFromNBT(stack, "thruster")); - + MissileStruct missile = new MissileStruct(warhead, fuselage, stability, thruster); - + return missile; } } diff --git a/src/main/java/com/hbm/items/weapon/ItemCustomMissilePart.java b/src/main/java/com/hbm/items/weapon/ItemCustomMissilePart.java index 26c459982..29b391eaf 100644 --- a/src/main/java/com/hbm/items/weapon/ItemCustomMissilePart.java +++ b/src/main/java/com/hbm/items/weapon/ItemCustomMissilePart.java @@ -8,6 +8,7 @@ import com.hbm.entity.missile.EntityMissileCustom; import com.hbm.items.special.ItemLootCrate; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -15,7 +16,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; public class ItemCustomMissilePart extends Item { - + public PartType type; public PartSize top; public PartSize bottom; @@ -24,37 +25,37 @@ public class ItemCustomMissilePart extends Item { private String title; private String author; private String witty; - + public ItemCustomMissilePart() { this.setMaxStackSize(1); this.setCreativeTab(MainRegistry.missileTab); } - + public static HashMap parts = new HashMap(); - + /** * == Chips == * [0]: inaccuracy - * + * * == Warheads == * [0]: type * [1]: strength/radius/cluster count * [2]: weight - * + * * == Fuselages == * [0]: type * [1]: tank size - * + * * == Stability == * [0]: inaccuracy mod - * + * * == Thrusters === * [0]: type * [1]: consumption * [2]: lift strength */ public Object[] attributes; - + public enum PartType { CHIP, WARHEAD, @@ -62,9 +63,9 @@ public class ItemCustomMissilePart extends Item { FINS, THRUSTER } - + public enum PartSize { - + //for chips ANY, //for missile tips and thrusters @@ -74,9 +75,9 @@ public class ItemCustomMissilePart extends Item { SIZE_15, SIZE_20 } - + public enum WarheadType { - + HE, INC, BUSTER, @@ -89,7 +90,7 @@ public class ItemCustomMissilePart extends Item { TAINT, CLOUD, TURBINE, - + //shit solution but it works. this allows traits to be attached to these empty dummy types, allowing for custom warheads CUSTOM0, CUSTOM1, CUSTOM2, CUSTOM3, CUSTOM4, CUSTOM5, CUSTOM6, CUSTOM7, CUSTOM8, CUSTOM9; @@ -100,44 +101,50 @@ public class ItemCustomMissilePart extends Item { /** Override for the warhead's name in the missile description */ public String labelCustom = null; } - + public enum FuelType { - + KEROSENE, SOLID, HYDROGEN, XENON, BALEFIRE } - + public enum Rarity { - - COMMON(EnumChatFormatting.GRAY + "Common"), - UNCOMMON(EnumChatFormatting.YELLOW + "Uncommon"), - RARE(EnumChatFormatting.AQUA + "Rare"), - EPIC(EnumChatFormatting.LIGHT_PURPLE + "Epic"), - LEGENDARY(EnumChatFormatting.DARK_GREEN + "Legendary"), - SEWS_CLOTHES_AND_SUCKS_HORSE_COCK(EnumChatFormatting.DARK_AQUA + "Strange"); - - String name; - - Rarity(String name) { - this.name = name; + + COMMON("item.missile.part.rarity.common", EnumChatFormatting.GRAY), + UNCOMMON("item.missile.part.rarity.uncommon", EnumChatFormatting.YELLOW), + RARE("item.missile.part.rarity.rare", EnumChatFormatting.AQUA), + EPIC("item.missile.part.rarity.epic", EnumChatFormatting.LIGHT_PURPLE), + LEGENDARY("item.missile.part.rarity.legendary", EnumChatFormatting.DARK_GREEN), + SEWS_CLOTHES_AND_SUCKS_HORSE_COCK("item.missile.part.rarity.strange", EnumChatFormatting.DARK_AQUA); + + private final String key; + private final EnumChatFormatting color; + + Rarity(String key, EnumChatFormatting color) { + this.key = key; + this.color = color; + } + + public String getDisplay() { + return color + I18nUtil.resolveKey(key); } } - + public ItemCustomMissilePart makeChip(float inaccuracy) { - + this.type = PartType.CHIP; this.top = PartSize.ANY; this.bottom = PartSize.ANY; this.attributes = new Object[] { inaccuracy }; - + parts.put(this.hashCode(), this); - + return this; } - + public ItemCustomMissilePart makeWarhead(WarheadType type, float punch, float weight, PartSize size) { this.type = PartType.WARHEAD; @@ -145,12 +152,12 @@ public class ItemCustomMissilePart extends Item { this.bottom = size; this.attributes = new Object[] { type, punch, weight }; setTextureName(RefStrings.MODID + ":mp_warhead"); - + parts.put(this.hashCode(), this); - + return this; } - + public ItemCustomMissilePart makeFuselage(FuelType type, float fuel, PartSize top, PartSize bottom) { this.type = PartType.FUSELAGE; @@ -158,12 +165,12 @@ public class ItemCustomMissilePart extends Item { this.bottom = bottom; attributes = new Object[] { type, fuel }; setTextureName(RefStrings.MODID + ":mp_fuselage"); - + parts.put(this.hashCode(), this); - + return this; } - + public ItemCustomMissilePart makeStability(float inaccuracy, PartSize size) { this.type = PartType.FINS; @@ -171,12 +178,12 @@ public class ItemCustomMissilePart extends Item { this.bottom = size; this.attributes = new Object[] { inaccuracy }; setTextureName(RefStrings.MODID + ":mp_stability"); - + parts.put(this.hashCode(), this); - + return this; } - + public ItemCustomMissilePart makeThruster(FuelType type, float consumption, float lift, PartSize size) { this.type = PartType.THRUSTER; @@ -184,9 +191,9 @@ public class ItemCustomMissilePart extends Item { this.bottom = PartSize.NONE; this.attributes = new Object[] { type, consumption, lift }; setTextureName(RefStrings.MODID + ":mp_thruster"); - + parts.put(this.hashCode(), this); - + return this; } @@ -196,122 +203,122 @@ public class ItemCustomMissilePart extends Item { if(title != null) list.add(EnumChatFormatting.DARK_PURPLE + "\"" + title + "\""); - + try { switch(type) { - case CHIP: - list.add(EnumChatFormatting.BOLD + "Inaccuracy: " + EnumChatFormatting.GRAY + (Float)attributes[0] * 100 + "%"); - break; - case WARHEAD: - list.add(EnumChatFormatting.BOLD + "Size: " + EnumChatFormatting.GRAY + getSize(bottom)); - list.add(EnumChatFormatting.BOLD + "Type: " + EnumChatFormatting.GRAY + getWarhead((WarheadType)attributes[0])); - list.add(EnumChatFormatting.BOLD + "Strength: " + EnumChatFormatting.GRAY + (Float)attributes[1]); - list.add(EnumChatFormatting.BOLD + "Weight: " + EnumChatFormatting.GRAY + (Float)attributes[2] + "t"); - break; - case FUSELAGE: - list.add(EnumChatFormatting.BOLD + "Top size: " + EnumChatFormatting.GRAY + getSize(top)); - list.add(EnumChatFormatting.BOLD + "Bottom size: " + EnumChatFormatting.GRAY + getSize(bottom)); - list.add(EnumChatFormatting.BOLD + "Fuel type: " + EnumChatFormatting.GRAY + getFuel((FuelType)attributes[0])); - list.add(EnumChatFormatting.BOLD + "Fuel amount: " + EnumChatFormatting.GRAY + (Float)attributes[1] + "l"); - break; - case FINS: - list.add(EnumChatFormatting.BOLD + "Size: " + EnumChatFormatting.GRAY + getSize(top)); - list.add(EnumChatFormatting.BOLD + "Inaccuracy: " + EnumChatFormatting.GRAY + (Float)attributes[0] * 100 + "%"); - break; - case THRUSTER: - list.add(EnumChatFormatting.BOLD + "Size: " + EnumChatFormatting.GRAY + getSize(top)); - list.add(EnumChatFormatting.BOLD + "Fuel type: " + EnumChatFormatting.GRAY + getFuel((FuelType)attributes[0])); - list.add(EnumChatFormatting.BOLD + "Fuel consumption: " + EnumChatFormatting.GRAY + (Float)attributes[1] + "l/tick"); - list.add(EnumChatFormatting.BOLD + "Max. payload: " + EnumChatFormatting.GRAY + (Float)attributes[2] + "t"); - break; + case CHIP: + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.inaccuracy") + ": " + EnumChatFormatting.GRAY + (Float)attributes[0] * 100 + "%"); + break; + case WARHEAD: + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.size") + ": " + EnumChatFormatting.GRAY + getSize(bottom)); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.type") + ": " + EnumChatFormatting.GRAY + getWarhead((WarheadType)attributes[0])); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.strength") + ": " + EnumChatFormatting.GRAY + (Float)attributes[1]); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.weight") + ": " + EnumChatFormatting.GRAY + (Float)attributes[2] + "t"); + break; + case FUSELAGE: + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.topSize") + ": " + EnumChatFormatting.GRAY + getSize(top)); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.bottomSize") + ": " + EnumChatFormatting.GRAY + getSize(bottom)); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.fuelType") + ": " + EnumChatFormatting.GRAY + getFuel((FuelType)attributes[0])); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.fuelAmount") + ": " + EnumChatFormatting.GRAY + (Float)attributes[1] + "l"); + break; + case FINS: + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.size") + ": " + EnumChatFormatting.GRAY + getSize(top)); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.inaccuracy") + ": " + EnumChatFormatting.GRAY + (Float)attributes[0] * 100 + "%"); + break; + case THRUSTER: + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.size") + ": " + EnumChatFormatting.GRAY + getSize(top)); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.fuelType") + ": " + EnumChatFormatting.GRAY + getFuel((FuelType)attributes[0])); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.fuelConsumption") + ": " + EnumChatFormatting.GRAY + (Float)attributes[1] + "l/tick"); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.maxPayload") + ": " + EnumChatFormatting.GRAY + (Float)attributes[2] + "t"); + break; } } catch(Exception ex) { - list.add("### I AM ERROR ###"); + list.add(I18nUtil.resolveKey("error.generic")); } - + if(type != PartType.CHIP) - list.add(EnumChatFormatting.BOLD + "Health: " + EnumChatFormatting.GRAY + health + "HP"); - + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.health") + ": " + EnumChatFormatting.GRAY + health + "HP"); + if(this.rarity != null) - list.add(EnumChatFormatting.BOLD + "Rarity: " + EnumChatFormatting.GRAY + this.rarity.name); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("item.missile.part.rarity") + ": " + EnumChatFormatting.GRAY + this.rarity.getDisplay()); if(author != null) - list.add(EnumChatFormatting.WHITE + " by " + author); + list.add(EnumChatFormatting.WHITE + " " + I18nUtil.resolveKey("item.missile.part.by") + " " + author); if(witty != null) list.add(EnumChatFormatting.GOLD + " " + EnumChatFormatting.ITALIC + "\"" + witty + "\""); } - + public String getSize(PartSize size) { - + switch(size) { - case ANY: - return "Any"; - case SIZE_10: - return "1.0m"; - case SIZE_15: - return "1.5m"; - case SIZE_20: - return "2.0m"; - default: - return "None"; + case ANY: + return I18nUtil.resolveKey("item.missile.part.size.any"); + case SIZE_10: + return "1.0m"; + case SIZE_15: + return "1.5m"; + case SIZE_20: + return "2.0m"; + default: + return I18nUtil.resolveKey("item.missile.part.size.none"); } } - + public String getWarhead(WarheadType type) { - + if(type.labelCustom != null) return type.labelCustom; - + switch(type) { - case HE: - return EnumChatFormatting.YELLOW + "HE"; - case INC: - return EnumChatFormatting.GOLD + "Incendiary"; - case CLUSTER: - return EnumChatFormatting.GRAY + "Cluster"; - case BUSTER: - return EnumChatFormatting.WHITE + "Bunker Buster"; - case NUCLEAR: - return EnumChatFormatting.DARK_GREEN + "Nuclear"; - case TX: - return EnumChatFormatting.DARK_PURPLE + "Thermonuclear (TX)"; - case N2: - return EnumChatFormatting.RED + "N²"; - case BALEFIRE: - return EnumChatFormatting.GREEN + "BF"; - case SCHRAB: - return EnumChatFormatting.AQUA + "Schrabidium"; - case TAINT: - return EnumChatFormatting.DARK_PURPLE + "Taint"; - case CLOUD: - return EnumChatFormatting.LIGHT_PURPLE + "Cloud"; - case TURBINE: - return (System.currentTimeMillis() % 1000 < 500 ? EnumChatFormatting.RED : EnumChatFormatting.LIGHT_PURPLE) + "Turbine"; - default: - return EnumChatFormatting.BOLD + "N/A"; + case HE: + return EnumChatFormatting.YELLOW + I18nUtil.resolveKey("item.warhead.desc.he"); + case INC: + return EnumChatFormatting.GOLD + I18nUtil.resolveKey("item.warhead.desc.incendiary"); + case CLUSTER: + return EnumChatFormatting.GRAY + I18nUtil.resolveKey("item.warhead.desc.cluster"); + case BUSTER: + return EnumChatFormatting.WHITE + I18nUtil.resolveKey("item.warhead.desc.bunker_buster"); + case NUCLEAR: + return EnumChatFormatting.DARK_GREEN + I18nUtil.resolveKey("item.warhead.desc.nuclear"); + case TX: + return EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("item.warhead.desc.thermonuclear"); + case N2: + return EnumChatFormatting.RED + I18nUtil.resolveKey("item.warhead.desc.n2"); + case BALEFIRE: + return EnumChatFormatting.GREEN + I18nUtil.resolveKey("item.warhead.desc.balefire"); + case SCHRAB: + return EnumChatFormatting.AQUA + I18nUtil.resolveKey("item.warhead.desc.schrabidium"); + case TAINT: + return EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("item.warhead.desc.taint"); + case CLOUD: + return EnumChatFormatting.LIGHT_PURPLE + I18nUtil.resolveKey("item.warhead.desc.cloud"); + case TURBINE: + return (System.currentTimeMillis() % 1000 < 500 ? EnumChatFormatting.RED : EnumChatFormatting.LIGHT_PURPLE) + I18nUtil.resolveKey("item.warhead.desc.turbine"); + default: + return EnumChatFormatting.BOLD + I18nUtil.resolveKey("general.na"); } } - + public String getFuel(FuelType type) { - + switch(type) { - case KEROSENE: - return EnumChatFormatting.LIGHT_PURPLE + "Kerosene / Peroxide"; - case SOLID: - return EnumChatFormatting.GOLD + "Solid Fuel"; - case HYDROGEN: - return EnumChatFormatting.DARK_AQUA + "Hydrogen / Oxygen"; - case XENON: - return EnumChatFormatting.DARK_PURPLE + "Xenon Gas"; - case BALEFIRE: - return EnumChatFormatting.GREEN + "BF Rocket Fuel / Peroxide"; - default: - return EnumChatFormatting.BOLD + "N/A"; + case KEROSENE: + return EnumChatFormatting.LIGHT_PURPLE + I18nUtil.resolveKey("item.missile.fuel.kerosene_peroxide"); // reuse missile fuel keys + case SOLID: + return EnumChatFormatting.GOLD + I18nUtil.resolveKey("item.missile.fuel.solid"); + case HYDROGEN: + return EnumChatFormatting.DARK_AQUA + I18nUtil.resolveKey("item.missile.fuel.ethanol_peroxide"); // closest match + case XENON: + return EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("item.missile.fuel.xenon"); + case BALEFIRE: + return EnumChatFormatting.GREEN + I18nUtil.resolveKey("item.missile.fuel.balefire"); + default: + return EnumChatFormatting.BOLD + I18nUtil.resolveKey("general.na"); } } - + //am i retarded? /* yes */ public ItemCustomMissilePart copy() { - + ItemCustomMissilePart part = new ItemCustomMissilePart(); part.type = this.type; part.top = this.top; @@ -320,33 +327,33 @@ public class ItemCustomMissilePart extends Item { part.attributes = this.attributes; part.health = this.health; part.setTextureName(this.iconString); - + return part; } - + public ItemCustomMissilePart setAuthor(String author) { this.author = author; return this; } - + public ItemCustomMissilePart setTitle(String title) { this.title = title; return this; } - + public ItemCustomMissilePart setWittyText(String witty) { this.witty = witty; return this; } - + public ItemCustomMissilePart setHealth(float health) { this.health = health; return this; } - + public ItemCustomMissilePart setRarity(Rarity rarity) { this.rarity = rarity; - + if(this.type == PartType.FUSELAGE) { if(this.top == PartSize.SIZE_10) ItemLootCrate.list10.add(this); diff --git a/src/main/java/com/hbm/items/weapon/ItemMissile.java b/src/main/java/com/hbm/items/weapon/ItemMissile.java index 692750516..dbd031944 100644 --- a/src/main/java/com/hbm/items/weapon/ItemMissile.java +++ b/src/main/java/com/hbm/items/weapon/ItemMissile.java @@ -3,53 +3,57 @@ package com.hbm.items.weapon; import java.util.List; import com.hbm.items.ItemCustomLore; +import com.hbm.util.i18n.I18nUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; public class ItemMissile extends ItemCustomLore { - + public final MissileFormFactor formFactor; public final MissileTier tier; public final MissileFuel fuel; public int fuelCap; public boolean launchable = true; - + public ItemMissile(MissileFormFactor form, MissileTier tier) { this(form, tier, form.defaultFuel); } - + public ItemMissile(MissileFormFactor form, MissileTier tier, MissileFuel fuel) { this.formFactor = form; this.tier = tier; this.fuel = fuel; this.setFuelCap(this.fuel.defaultCap); } - + public ItemMissile notLaunchable() { this.launchable = false; return this; } - + public ItemMissile setFuelCap(int fuelCap) { this.fuelCap = fuelCap; return this; } - + @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { - list.add(EnumChatFormatting.ITALIC + this.tier.display); - + // Tier localized: missile.tier.tier0, missile.tier.tier1, ... + String tierKey = "item.missile.tier." + this.tier.name().toLowerCase(); + list.add(EnumChatFormatting.ITALIC + I18nUtil.resolveKey(tierKey)); + if(!this.launchable) { - list.add(EnumChatFormatting.RED + "Not launchable!"); + list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("item.missile.desc.notLaunchable")); } else { - list.add("Fuel: " + this.fuel.display); - if(this.fuelCap > 0) list.add("Fuel capacity: " + this.fuelCap + "mB"); + // Fuel localized & colored via enum helper + list.add(I18nUtil.resolveKey("item.missile.desc.fuel") + ": " + this.fuel.getDisplay()); + if(this.fuelCap > 0) list.add(I18nUtil.resolveKey("item.missile.desc.fuelCapacity") + ": " + this.fuelCap + "mB"); super.addInformation(itemstack, player, list, bool); } } - + public enum MissileFormFactor { ABM(MissileFuel.SOLID), MICRO(MissileFuel.SOLID), @@ -58,41 +62,48 @@ public class ItemMissile extends ItemCustomLore { HUGE(MissileFuel.KEROSENE_LOXY), ATLAS(MissileFuel.JETFUEL_LOXY), OTHER(MissileFuel.KEROSENE_PEROXIDE); - + protected MissileFuel defaultFuel; - + private MissileFormFactor(MissileFuel defaultFuel) { this.defaultFuel = defaultFuel; } } - + public enum MissileTier { TIER0("Tier 0"), TIER1("Tier 1"), TIER2("Tier 2"), TIER3("Tier 3"), TIER4("Tier 4"); - + public String display; - + private MissileTier(String display) { this.display = display; } } - + public enum MissileFuel { - SOLID(EnumChatFormatting.GOLD + "Solid Fuel (pre-fueled)", 0), - ETHANOL_PEROXIDE(EnumChatFormatting.AQUA + "Ethanol / Hydrogen Peroxide", 4_000), - KEROSENE_PEROXIDE(EnumChatFormatting.BLUE + "Kerosene / Hydrogen Peroxide", 8_000), - KEROSENE_LOXY(EnumChatFormatting.LIGHT_PURPLE + "Kerosene / Liquid Oxygen", 12_000), - JETFUEL_LOXY(EnumChatFormatting.RED + "Jet Fuel / Liquid Oxygen", 16_000); - - public String display; - public int defaultCap; - - private MissileFuel(String display, int defaultCap) { - this.display = display; + SOLID("item.missile.fuel.solid.prefueled", EnumChatFormatting.GOLD, 0), + ETHANOL_PEROXIDE("item.missile.fuel.ethanol_peroxide", EnumChatFormatting.AQUA, 4_000), + KEROSENE_PEROXIDE("item.missile.fuel.kerosene_peroxide", EnumChatFormatting.BLUE, 8_000), + KEROSENE_LOXY("item.missile.fuel.kerosene_loxy", EnumChatFormatting.LIGHT_PURPLE, 12_000), + JETFUEL_LOXY("item.missile.fuel.jetfuel_loxy", EnumChatFormatting.RED, 16_000); + + private final String key; + public final EnumChatFormatting color; + public final int defaultCap; + + private MissileFuel(String key, EnumChatFormatting color, int defaultCap) { + this.key = key; + this.color = color; this.defaultCap = defaultCap; } + + /** Returns a color localized string for display */ + public String getDisplay() { + return color + I18nUtil.resolveKey(this.key); + } } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java index 3539a712b..f950c9590 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java +++ b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java @@ -19,6 +19,7 @@ import com.hbm.items.IKeybindReceiver; import com.hbm.items.armor.ArmorTrenchmaster; import com.hbm.items.weapon.sedna.hud.IHUDComponent; import com.hbm.items.weapon.sedna.mags.IMagazine; +import com.hbm.items.weapon.sedna.mags.MagazineInfinite; import com.hbm.items.weapon.sedna.mods.WeaponModManager; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; @@ -29,6 +30,7 @@ import com.hbm.render.util.RenderScreenOverlay; import com.hbm.sound.AudioWrapper; import com.hbm.util.BobMathUtil; import com.hbm.util.EnumUtil; +import com.hbm.util.i18n.I18nUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -55,10 +57,10 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I public long[] lastShot; /** [0;1] randomized every shot for various rendering applications */ public double shotRand = 0D; - + public static List secrets = new ArrayList(); public List recognizedMods = new ArrayList(); - + public static final DecimalFormatSymbols SYMBOLS_US = new DecimalFormatSymbols(Locale.US); public static final DecimalFormat FORMAT_DMG = new DecimalFormat("#.##", SYMBOLS_US); @@ -68,20 +70,20 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I public static float recoilRebound = 0.25F; public static float offsetVertical = 0; public static float offsetHorizontal = 0; - + public static void setupRecoil(float vertical, float horizontal, float decay, float rebound) { recoilVertical += vertical; recoilHorizontal += horizontal; recoilDecay = decay; recoilRebound = rebound; } - + public static void setupRecoil(float vertical, float horizontal) { setupRecoil(vertical, horizontal, 0.75F, 0.25F); } public static final String O_GUNCONFIG = "O_GUNCONFIG_"; - + public static final String KEY_DRAWN = "drawn"; public static final String KEY_AIMING = "aiming"; public static final String KEY_MODE = "mode_"; @@ -98,28 +100,28 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I public static final String KEY_LOCKEDON = "lockedon"; public static final String KEY_CANCELRELOAD = "cancel"; public static final String KEY_EQUIPPED = "eqipped"; - + public static ConcurrentHashMap loopedSounds = new ConcurrentHashMap(); public static float prevAimingProgress; public static float aimingProgress; - + /** NEVER ACCESS DIRECTLY - USE GETTER */ protected GunConfig[] configs_DNA; - + public Function LAMBDA_NAME_MUTATOR; public WeaponQuality quality; - + public GunConfig getConfig(ItemStack stack, int index) { GunConfig cfg = configs_DNA[index]; if(stack == null) return cfg; return WeaponModManager.eval(cfg, stack, O_GUNCONFIG + index, this, index); } - + public int getConfigCount() { return configs_DNA.length; } - + public ItemGunBaseNT(WeaponQuality quality, GunConfig... cfg) { this.setMaxStackSize(1); this.configs_DNA = cfg; @@ -130,7 +132,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I if(quality == WeaponQuality.LEGENDARY || quality == WeaponQuality.SECRET) this.secrets.add(this); this.setTextureName(RefStrings.MODID + ":gun_darter"); } - + public static enum WeaponQuality { A_SIDE, B_SIDE, @@ -148,71 +150,75 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I RELOADING, //forced delay after which a reload action happens, may be canceled (TBI) JAMMED, //forced delay due to jamming } - + public ItemGunBaseNT setNameMutator(Function lambda) { this.LAMBDA_NAME_MUTATOR = lambda; return this; } public String getItemStackDisplayName(ItemStack stack) { - + if(this.LAMBDA_NAME_MUTATOR != null) { String unloc = this.LAMBDA_NAME_MUTATOR.apply(stack); if(unloc != null) return (StatCollector.translateToLocal(unloc + ".name")).trim(); } - + return super.getItemStackDisplayName(stack); } - + @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - + int configs = this.configs_DNA.length; for(int i = 0; i < configs; i++) { GunConfig config = getConfig(stack, i); for(Receiver rec : config.getReceivers(stack)) { IMagazine mag = rec.getMagazine(stack); - list.add("Ammo: " + mag.getIconForHUD(stack, player).getDisplayName() + " " + mag.reportAmmoStateForHUD(stack, player)); + if(!(mag instanceof MagazineInfinite)) { + list.add(I18nUtil.resolveKey("gui.weapon.ammo") + ": " + mag.getIconForHUD(stack, player).getDisplayName() + " " + mag.reportAmmoStateForHUD(stack, player)); + } float dmg = rec.getBaseDamage(stack); - list.add("Base Damage: " + FORMAT_DMG.format(dmg)); + list.add(I18nUtil.resolveKey("gui.weapon.baseDamage") + ": " + FORMAT_DMG.format(dmg)); if(mag.getType(stack, player.inventory) instanceof BulletConfig) { BulletConfig bullet = (BulletConfig) mag.getType(stack, player.inventory); int min = (int) (bullet.projectilesMin * rec.getSplitProjectiles(stack)); int max = (int) (bullet.projectilesMax * rec.getSplitProjectiles(stack)); - list.add("Damage with current ammo: " + FORMAT_DMG.format(dmg * bullet.damageMult) + (min > 1 ? (" x" + (min != max ? (min + "-" + max) : min)) : "")); + list.add(I18nUtil.resolveKey("gui.weapon.damageWithAmmo") + ": " + FORMAT_DMG.format(dmg * bullet.damageMult) + (min > 1 ? (" x" + (min != max ? (min + "-" + max) : min)) : "")); } } - + float maxDura = config.getDurability(stack); - int dura = MathHelper.clamp_int((int)((maxDura - this.getWear(stack, i)) * 100 / maxDura), 0, 100); - list.add("Condition: " + dura + "%"); - + if(maxDura > 0) { + int dura = MathHelper.clamp_int((int)((maxDura - this.getWear(stack, i)) * 100 / maxDura), 0, 100); + list.add(I18nUtil.resolveKey("gui.weapon.condition") + ": " + dura + "%"); + } + for(ItemStack upgrade : WeaponModManager.getUpgradeItems(stack, i)) { list.add(EnumChatFormatting.YELLOW + upgrade.getDisplayName()); } } - + switch(this.quality) { - case A_SIDE: list.add(EnumChatFormatting.YELLOW + "Standard Arsenal"); break; - case B_SIDE: list.add(EnumChatFormatting.GOLD + "B-Side"); break; - case LEGENDARY: list.add(EnumChatFormatting.RED + "Legendary Weapon"); break; - case SPECIAL: list.add(EnumChatFormatting.AQUA + "Special Weapon"); break; - case UTILITY: list.add(EnumChatFormatting.GREEN + "Utility"); break; - case SECRET: list.add((BobMathUtil.getBlink() ? EnumChatFormatting.DARK_RED : EnumChatFormatting.RED) + "SECRET"); break; - case DEBUG: list.add((BobMathUtil.getBlink() ? EnumChatFormatting.YELLOW : EnumChatFormatting.GOLD) + "DEBUG"); break; + case A_SIDE: list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("gui.weapon.quality.aside")); break; + case B_SIDE: list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("gui.weapon.quality.bside")); break; + case LEGENDARY: list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("gui.weapon.quality.legendary")); break; + case SPECIAL: list.add(EnumChatFormatting.AQUA + I18nUtil.resolveKey("gui.weapon.quality.special")); break; + case UTILITY: list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("gui.weapon.quality.utility")); break; + case SECRET: list.add((BobMathUtil.getBlink() ? EnumChatFormatting.DARK_RED : EnumChatFormatting.RED) + I18nUtil.resolveKey("gui.weapon.quality.secret")); break; + case DEBUG: list.add((BobMathUtil.getBlink() ? EnumChatFormatting.YELLOW : EnumChatFormatting.GOLD) + I18nUtil.resolveKey("gui.weapon.quality.debug")); break; } - + if(Minecraft.getMinecraft().currentScreen instanceof GUIWeaponTable && !this.recognizedMods.isEmpty()) { - list.add(EnumChatFormatting.RED + "Accepts:"); + list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("gui.weapon.accepts" + ":")); for(ComparableStack comp : this.recognizedMods) list.add(EnumChatFormatting.RED + " " + comp.toStack().getDisplayName()); } } - + @Override public boolean canHandleKeybind(EntityPlayer player, ItemStack stack, EnumKeybind keybind) { return keybind == EnumKeybind.GUN_PRIMARY || keybind == EnumKeybind.GUN_SECONDARY || keybind == EnumKeybind.GUN_TERTIARY || keybind == EnumKeybind.RELOAD; } - + @Override public void handleKeybind(EntityPlayer player, ItemStack stack, EnumKeybind keybind, boolean newState) { handleKeybind(player, player.inventory, stack, keybind, newState); @@ -220,13 +226,13 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I public void handleKeybind(EntityLivingBase entity, IInventory inventory, ItemStack stack, EnumKeybind keybind, boolean newState) { if(!GeneralConfig.enableGuns) return; - + int configs = this.configs_DNA.length; - + for(int i = 0; i < configs; i++) { GunConfig config = getConfig(stack, i); LambdaContext ctx = new LambdaContext(config, entity, inventory, i); - + if(keybind == EnumKeybind.GUN_PRIMARY && newState && !getPrimary(stack, i)) { if(config.getPressPrimary(stack) != null) config.getPressPrimary(stack).accept(stack, ctx); this.setPrimary(stack, i, newState); continue; } if(keybind == EnumKeybind.GUN_PRIMARY && !newState && getPrimary(stack, i)) { if(config.getReleasePrimary(stack) != null) config.getReleasePrimary(stack).accept(stack, ctx); this.setPrimary(stack, i, newState); continue; } if(keybind == EnumKeybind.GUN_SECONDARY && newState && !getSecondary(stack, i)) { if(config.getPressSecondary(stack) != null) config.getPressSecondary(stack).accept(stack, ctx); this.setSecondary(stack, i, newState); continue; } @@ -241,7 +247,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I @Override public void onEquip(EntityPlayer player, ItemStack stack) { for(int i = 0; i < this.configs_DNA.length; i++) { - if(this.getLastAnim(stack, i) == AnimType.EQUIP && this.getAnimTimer(stack, i) < 5) continue; + if(this.getLastAnim(stack, i) == AnimType.EQUIP && this.getAnimTimer(stack, i) < 5) continue; playAnimation(player, stack, AnimType.EQUIP, i); this.setPrimary(stack, i, false); this.setSecondary(stack, i, false); @@ -249,7 +255,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I this.setReloadKey(stack, i, false); } } - + public static void playAnimation(EntityPlayer player, ItemStack stack, AnimType type, int index) { if(player instanceof EntityPlayerMP) { PacketDispatcher.wrapper.sendTo(new GunAnimationPacket(type.ordinal(), 0, index), (EntityPlayerMP) player); @@ -260,7 +266,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I @Override public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isHeld) { - + if(!(entity instanceof EntityLivingBase)) return; EntityPlayer player = entity instanceof EntityPlayer ? (EntityPlayer) entity : null; int confNo = this.configs_DNA.length; @@ -270,17 +276,17 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I configs[i] = this.getConfig(stack, i); ctx[i] = new LambdaContext(configs[i], (EntityLivingBase) entity, player != null ? player.inventory : null, i); } - + if(world.isRemote) { - + if(isHeld && player == MainRegistry.proxy.me()) { - + /// DEBUG /// /*Vec3 offset = Vec3.createVectorHelper(-0.2, -0.1, 0.75); offset.rotateAroundX(-entity.rotationPitch / 180F * (float) Math.PI); offset.rotateAroundY(-entity.rotationYaw / 180F * (float) Math.PI); world.spawnParticle("flame", entity.posX + offset.xCoord, entity.posY + entity.getEyeHeight() + offset.yCoord, entity.posZ + offset.zCoord, 0, 0, 0);*/ - + /// AIMING /// prevAimingProgress = aimingProgress; boolean aiming = this.getIsAiming(stack); @@ -288,12 +294,12 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I if(aiming && aimingProgress < 1F) aimingProgress += aimSpeed; if(!aiming && aimingProgress > 0F) aimingProgress -= aimSpeed; aimingProgress = MathHelper.clamp_float(aimingProgress, 0F, 1F); - + /// SMOKE NODES /// for(int i = 0; i < confNo; i++) if(configs[i].getSmokeHandler(stack) != null) { configs[i].getSmokeHandler(stack).accept(stack, ctx[i]); } - + for(int i = 0; i < confNo; i++) { BiConsumer orchestra = configs[i].getOrchestra(stack); if(orchestra != null) orchestra.accept(stack, ctx[i]); @@ -301,18 +307,18 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I } return; } - + /// ON EQUIP /// if(player != null) { boolean wasHeld = this.getIsEquipped(stack); - + if(!wasHeld && isHeld && player != null) { this.onEquip(player, stack); } } - + this.setIsEquipped(stack, isHeld); - + /// RESET WHEN NOT EQUIPPED /// if(!isHeld) { for(int i = 0; i < confNo; i++) { @@ -327,13 +333,13 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I this.setReloadCancel(stack, false); return; } - + for(int i = 0; i < confNo; i++) for(int k = 0; k == 0 || (k < 2 && ArmorTrenchmaster.isTrenchMaster(player) && this.getState(stack, i) == GunState.RELOADING); k++) { BiConsumer orchestra = configs[i].getOrchestra(stack); if(orchestra != null) orchestra.accept(stack, ctx[i]); - + setAnimTimer(stack, i, getAnimTimer(stack, i) + 1); - + /// STTATE MACHINE /// int timer = this.getTimer(stack, i); if(timer > 0) this.setTimer(stack, i, timer - 1); @@ -369,7 +375,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I public static void setLastAnim(ItemStack stack, int index, AnimType value) { setValueInt(stack, KEY_LASTANIM + index, value.ordinal()); } public static int getAnimTimer(ItemStack stack, int index) { return getValueInt(stack, KEY_ANIMTIMER + index); } public static void setAnimTimer(ItemStack stack, int index, int value) { setValueInt(stack, KEY_ANIMTIMER + index, value); } - + // BUTTON STATES // public static boolean getPrimary(ItemStack stack, int index) { return getValueBool(stack, KEY_PRIMARY + index); } public static void setPrimary(ItemStack stack, int index, boolean value) { setValueBool(stack, KEY_PRIMARY + index, value); } @@ -385,28 +391,28 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I // EQUIPPED // public static boolean getIsEquipped(ItemStack stack) { return getValueBool(stack, KEY_EQUIPPED); } public static void setIsEquipped(ItemStack stack, boolean value) { setValueBool(stack, KEY_EQUIPPED, value); } - - + + /// UTIL /// public static int getValueInt(ItemStack stack, String name) { if(stack.hasTagCompound()) return stack.getTagCompound().getInteger(name); return 0; } public static void setValueInt(ItemStack stack, String name, int value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.getTagCompound().setInteger(name, value); } - + public static float getValueFloat(ItemStack stack, String name) { if(stack.hasTagCompound()) return stack.getTagCompound().getFloat(name); return 0; } public static void setValueFloat(ItemStack stack, String name, float value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.getTagCompound().setFloat(name, value); } - + public static byte getValueByte(ItemStack stack, String name) { if(stack.hasTagCompound()) return stack.getTagCompound().getByte(name); return 0; } public static void setValueByte(ItemStack stack, String name, byte value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.getTagCompound().setByte(name, value); } - + public static boolean getValueBool(ItemStack stack, String name) { if(stack.hasTagCompound()) return stack.getTagCompound().getBoolean(name); return false; } public static void setValueBool(ItemStack stack, String name, boolean value) { if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); stack.getTagCompound().setBoolean(name, value); } - + /** Wrapper for extra context used in most Consumer lambdas which are part of the guncfg */ public static class LambdaContext { public final GunConfig config; public final EntityLivingBase entity; public final IInventory inventory; public final int configIndex; - + public LambdaContext(GunConfig config, EntityLivingBase player, IInventory inventory, int configIndex) { this.config = config; this.entity = player; @@ -423,39 +429,42 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I @Override @SideOnly(Side.CLIENT) public void renderHUD(Pre event, ElementType type, EntityPlayer player, ItemStack stack) { - + ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); - + if(type == ElementType.CROSSHAIRS) { event.setCanceled(true); GunConfig config = gun.getConfig(stack, 0); if(config.getHideCrosshair(stack) && aimingProgress >= 1F) return; RenderScreenOverlay.renderCustomCrosshairs(event.resolution, Minecraft.getMinecraft().ingameGUI, config.getCrosshair(stack)); } - + int confNo = this.configs_DNA.length; - + for(int i = 0; i < confNo; i++) { IHUDComponent[] components = gun.getConfig(stack, i).getHUDComponents(stack); - + if(components != null) for(IHUDComponent component : components) { int bottomOffset = 0; component.renderHUDComponent(event, type, player, stack, bottomOffset, i); bottomOffset += component.getComponentHeight(player, stack); } } - + Minecraft.getMinecraft().renderEngine.bindTexture(Gui.icons); } - + + /*@Override + public boolean getShareTag() { return false; }*/ // nbt sync dupe fix, didn't work + public static class SmokeNode { - + public double forward = 0D; public double side = 0D; public double lift = 0D; public double alpha; public double width = 1D; - + public SmokeNode(double alpha) { this.alpha = alpha; } } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java index f389b40a1..bbf976df7 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java @@ -139,7 +139,7 @@ public class GunFactory { public static enum EnumAmmoSecret { FOLLY_SM, FOLLY_NUKE, M44_EQUESTRIAN, G12_EQUESTRIAN, BMG50_EQUESTRIAN, - P35_800, BMG50_BLACK + P35_800, BMG50_BLACK, P35_800_BL } public static enum EnumModTest { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java index 8e9d40aa5..acca45ca7 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactoryClient.java @@ -76,7 +76,8 @@ public class GunFactoryClient { MinecraftForgeClient.registerItemRenderer(ModItems.gun_m2, new ItemRenderM2()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun, new ItemRenderShredder(ResourceManager.shredder_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun_shredder, new ItemRenderShredder(ResourceManager.shredder_orig_tex)); - MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun_sexy, new ItemRenderSexy()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun_sexy, new ItemRenderSexy(ResourceManager.sexy_tex)); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_autoshotgun_heretic, new ItemRenderSexy(ResourceManager.heretic_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_quadro, new ItemRenderQuadro()); MinecraftForgeClient.registerItemRenderer(ModItems.gun_minigun, new ItemRenderMinigun(ResourceManager.minigun_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_minigun_lacunae, new ItemRenderMinigun(ResourceManager.minigun_lacunae_tex)); @@ -100,6 +101,7 @@ public class GunFactoryClient { MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel_sacred_dragon, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_sacred_dragon_tex)); MinecraftForgeClient.registerItemRenderer(ModItems.gun_charge_thrower, new ItemRenderChargeThrower()); + MinecraftForgeClient.registerItemRenderer(ModItems.gun_n_i_4_n_i, new ItemRenderNI4NI()); //PROJECTILES ammo_debug.setRenderer(LegoClient.RENDER_STANDARD_BULLET); @@ -224,6 +226,9 @@ public class GunFactoryClient { folly_nuke.setRenderer(LegoClient.RENDER_BIG_NUKE); p35800.setRendererBeam(LegoClient.RENDER_CRACKLE); + p35800_bl.setRendererBeam(LegoClient.RENDER_BLACK_LIGHTNING); + + ni4ni_arc.setRendererBeam(LegoClient.RENDER_NI4NI_BOLT); ct_hook.setRenderer(LegoClient.RENDER_CT_HOOK); ct_mortar.setRenderer(LegoClient.RENDER_CT_MORTAR); @@ -266,6 +271,7 @@ public class GunFactoryClient { ((ItemGunBaseNT) ModItems.gun_autoshotgun) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_autoshotgun_shredder) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_autoshotgun_sexy) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); + ((ItemGunBaseNT) ModItems.gun_autoshotgun_heretic) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_quadro) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_lag) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); ((ItemGunBaseNT) ModItems.gun_minigun) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java index 11d4b4012..a2bf670d2 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java @@ -378,6 +378,44 @@ public class LegoClient { GL11.glPopMatrix(); RenderArcFurnace.fullbright(false); }; + + public static BiConsumer RENDER_BLACK_LIGHTNING = (bullet, interp) -> { + + RenderArcFurnace.fullbright(true); + double age = MathHelper.clamp_double(1D - ((double) bullet.ticksExisted - 2 + interp) / (double) bullet.getBulletConfig().expires, 0, 1); + + GL11.glPushMatrix(); + GL11.glRotatef(180 - bullet.rotationYaw, 0, 1F, 0); + GL11.glRotatef(-bullet.rotationPitch - 90, 1F, 0, 0); + + double scale = 5D; + GL11.glScaled(age * scale, 1, age * scale); + GL11.glTranslated(0, bullet.beamLength, 0); + GL11.glRotatef(-90, 0, 0, 1); + renderBulletStandard(Tessellator.instance, 0x4C3093, 0x000000, bullet.beamLength, true); + + GL11.glPopMatrix(); + RenderArcFurnace.fullbright(false); + }; + + public static BiConsumer RENDER_NI4NI_BOLT = (bullet, interp) -> { + + RenderArcFurnace.fullbright(true); + double age = MathHelper.clamp_double(1D - ((double) bullet.ticksExisted - 2 + interp) / (double) bullet.getBulletConfig().expires, 0, 1); + + GL11.glPushMatrix(); + GL11.glRotatef(180 - bullet.rotationYaw, 0, 1F, 0); + GL11.glRotatef(-bullet.rotationPitch - 90, 1F, 0, 0); + + double scale = 5D; + GL11.glScaled(age * scale, 1, age * scale); + GL11.glTranslated(0, bullet.beamLength, 0); + GL11.glRotatef(-90, 0, 0, 1); + renderBulletStandard(Tessellator.instance, 0xAAD2E5, 0xffffff, bullet.beamLength, true); + + GL11.glPopMatrix(); + RenderArcFurnace.fullbright(false); + }; public static BiConsumer RENDER_LASER_RED = (bullet, interp) -> { renderStandardLaser(bullet, interp, 0x80, 0x15, 0x15); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java index dddfbeda4..33c583b54 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java @@ -27,6 +27,8 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; import net.minecraft.util.MovingObjectPosition; @@ -942,7 +944,7 @@ public class Orchestras { if(timer == 2) { SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory); - if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, 0.375, -0.125, aiming ? -0.125 : -0.25D, 0, 0.18, -0.12, 0.01, -10F + (float)entity.getRNG().nextGaussian() * 2.5F, (float)entity.getRNG().nextGaussian() * -20F + 15F, casing.getName(), false, 60, 0.5D, 20); + if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, 0.375, aiming ? -0.0625 : -0.125, aiming ? -0.125 : -0.25D, 0, 0.18, -0.12, 0.01, -10F + (float)entity.getRNG().nextGaussian() * 2.5F, (float)entity.getRNG().nextGaussian() * -20F + 15F, casing.getName(), false, 60, 0.5D, 20); } } @@ -950,8 +952,31 @@ public class Orchestras { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 1F); } if(type == AnimType.RELOAD) { + if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverCock", 1F, 1F); + if(timer == 4) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 0.75F); + if(timer == 16) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallRemove", 1F, 1F); + if(timer == 30) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magRemove", 1F, 1F); + if(timer == 55) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.impact", 0.5F, 1F); + if(timer == 65) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magInsert", 1F, 1F); + if(timer == 74) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallInsert", 1F, 1F); + if(timer == 88) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 0.75F); + if(timer == 100) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverCock", 1F, 1F); + if(timer == 55) ctx.config.getReceivers(stack)[0].getMagazine(stack).reloadAction(stack, ctx.inventory); } + + if(type == AnimType.INSPECT) { + if(timer == 20) entity.worldObj.playSoundAtEntity(entity, "hbm:player.gulp", 1F, 1F); + if(timer == 25) entity.worldObj.playSoundAtEntity(entity, "hbm:player.gulp", 1F, 1F); + if(timer == 30) entity.worldObj.playSoundAtEntity(entity, "hbm:player.gulp", 1F, 1F); + if(timer == 35) entity.worldObj.playSoundAtEntity(entity, "hbm:player.gulp", 1F, 1F); + if(timer == 50) entity.worldObj.playSoundAtEntity(entity, "hbm:player.groan", 1F, 1F); + if(timer == 60) { + entity.addPotionEffect(new PotionEffect(Potion.damageBoost.id, 30 * 20, 2)); + entity.addPotionEffect(new PotionEffect(Potion.resistance.id, 30 * 20, 2)); + entity.addPotionEffect(new PotionEffect(Potion.confusion.id, 10 * 20, 0)); + } + } }; public static BiConsumer ORCHESTRA_QUADRO = (stack, ctx) -> { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java index 93c0e6913..cefcc4aad 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java @@ -67,6 +67,17 @@ public class XFactory10ga { .setupStandardConfiguration() .anim(LAMBDA_DOUBLE_BARREL_ANIMS).orchestra(Orchestras.ORCHESTRA_DOUBLE_BARREL) ).setUnlocalizedName("gun_double_barrel_sacred_dragon"); + + ModItems.gun_autoshotgun_heretic = new ItemGunBaseNT(WeaponQuality.DEBUG, new GunConfig() + .draw(20).inspect(65).reloadSequential(true).inspectCancel(false).crosshair(Crosshair.L_CIRCLE).hideCrosshair(false).smoke(Lego.LAMBDA_STANDARD_SMOKE) + .rec(new Receiver(0) + .dmg(100F).delay(3).auto(true).dryfireAfterAuto(true).reload(110).jam(19).sound("hbm:weapon.fire.shotgunAuto", 1.0F, 1.0F) + .mag(new MagazineFullReload(0, 250).addConfigs(g10, g10_shrapnel, g10_du, g10_slug, g10_explosive)) + .offset(0.75, -0.125, -0.25) + .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_NOWEAR_FIRE).recoil(XFactory12ga.LAMBDA_RECOIL_SEXY)) + .setupStandardConfiguration() + .anim(XFactory12ga.LAMBDA_SEXY_ANIMS).orchestra(Orchestras.ORCHESTRA_SHREDDER_SEXY) + ).setUnlocalizedName("gun_autoshotgun_heretic"); } public static BiConsumer LAMBDA_RECOIL_DOUBLE_BARREL = (stack, ctx) -> { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java index 777c2d4c4..c70d33501 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java @@ -271,8 +271,8 @@ public class XFactory12ga { g12_phosphorus = new BulletConfig().setItem(EnumAmmo.G12_PHOSPHORUS).setCasing(EnumCasingType.BUCKSHOT_ADVANCED, 6).setProjectiles(8).setDamage(1F/8F).setSpread(magnumSpread).setRicochetAngle(15).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(0x910001, SpentCasing.COLOR_CASE_12GA).setScale(0.75F).register("12GA_PHOSPHORUS")) .setOnImpact((bullet, mop) -> { if(mop.entityHit != null && mop.entityHit instanceof EntityLivingBase) { HbmLivingProps data = HbmLivingProps.getData((EntityLivingBase) mop.entityHit); if(data.phosphorus < 300) data.phosphorus = 300; } }); //g12_anthrax = new BulletConfig().setItem(EnumAmmo.G12_ANTHRAX).setProjectiles(8).setDamage(1F/8F).setSpread(0.015F).setRicochetAngle(15).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(0x749300, SpentCasing.COLOR_CASE_12GA).setScale(0.75F).register("12GA_ANTHRAX")); - g12_equestrian_bj = new BulletConfig().setItem(EnumAmmoSecret.G12_EQUESTRIAN).setDamage(0F).setOnImpact(LAMBDA_BOAT).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(SpentCasing.COLOR_CASE_EQUESTRIAN, SpentCasing.COLOR_CASE_12GA).setScale(0.75F).register("12gaEquestrianBJ")); - g12_equestrian_tkr = new BulletConfig().setItem(EnumAmmoSecret.G12_EQUESTRIAN).setDamage(0F).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(SpentCasing.COLOR_CASE_EQUESTRIAN, SpentCasing.COLOR_CASE_12GA).setScale(0.75F).register("12gaEquestrianTKR")); + g12_equestrian_bj = new BulletConfig().setItem(EnumAmmoSecret.G12_EQUESTRIAN).setDamage(0F).setOnImpact(LAMBDA_BOAT).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(0xB52B2B, SpentCasing.COLOR_CASE_EQUESTRIAN).setScale(0.75F).register("12gaEquestrianBJ")); + g12_equestrian_tkr = new BulletConfig().setItem(EnumAmmoSecret.G12_EQUESTRIAN).setDamage(0F).setCasing(new SpentCasing(CasingType.SHOTGUN).setColor(0xB52B2B, SpentCasing.COLOR_CASE_EQUESTRIAN).setScale(0.75F).register("12gaEquestrianTKR")); BulletConfig[] all = new BulletConfig[] {g12_bp, g12_bp_magnum, g12_bp_slug, g12, g12_slug, g12_flechette, g12_magnum, g12_explosive, g12_phosphorus}; @@ -375,7 +375,7 @@ public class XFactory12ga { ).setUnlocalizedName("gun_autoshotgun_shredder"); ModItems.gun_autoshotgun_sexy = new ItemGunBaseNT(WeaponQuality.LEGENDARY, new GunConfig() - .dura(5_000).draw(20).inspect(33).reloadSequential(true).crosshair(Crosshair.L_CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) + .dura(5_000).draw(20).inspect(65).reloadSequential(true).inspectCancel(false).crosshair(Crosshair.L_CIRCLE).hideCrosshair(false).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) .dmg(64F).delay(4).auto(true).dryfireAfterAuto(true).reload(110).jam(19).sound("hbm:weapon.fire.shotgunAuto", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 100).addConfigs(g12_equestrian_bj, g12_bp, g12_bp_magnum, g12_bp_slug, g12, g12_slug, g12_flechette, g12_magnum, g12_explosive, g12_phosphorus)) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory35800.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory35800.java index 588f54b0d..ddd435107 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory35800.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory35800.java @@ -3,6 +3,9 @@ package com.hbm.items.weapon.sedna.factory; import java.util.function.BiConsumer; import java.util.function.BiFunction; +import com.hbm.entity.effect.EntityFireLingering; +import com.hbm.entity.projectile.EntityBulletBeamBase; +import com.hbm.extprop.HbmLivingProps; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.Crosshair; @@ -20,22 +23,44 @@ import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.BusAnimationKeyframe.IType; import com.hbm.render.anim.HbmAnimations.AnimType; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; public class XFactory35800 { public static BulletConfig p35800; + public static BulletConfig p35800_bl; + + public static BiConsumer LAMBDA_BLACK_IMPACT = (bullet, mop) -> { + if(mop.typeOfHit == mop.typeOfHit.ENTITY) { + Entity hit = mop.entityHit; + if(hit instanceof EntityLivingBase) { + HbmLivingProps.getData((EntityLivingBase) hit).blackFire += 200; + } + } + if(mop.typeOfHit == mop.typeOfHit.BLOCK) { + EntityFireLingering fire = new EntityFireLingering(bullet.worldObj).setArea(7.5F, 2F).setDuration(200).setType(EntityFireLingering.TYPE_BLACK); + fire.setPosition(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); + bullet.worldObj.spawnEntityInWorld(fire); + } + + BulletConfig.LAMBDA_STANDARD_BEAM_HIT.accept(bullet, mop); + }; public static void init() { - + p35800 = new BulletConfig().setItem(EnumAmmoSecret.P35_800).setArmorPiercing(0.5F).setThresholdNegation(50F).setBeam().setSpread(0.0F).setLife(3).setRenderRotations(false) .setCasing(new SpentCasing(CasingType.STRAIGHT).setColor(0xCEB78E).register("35-800")).setOnBeamImpact(BulletConfig.LAMBDA_STANDARD_BEAM_HIT); + p35800_bl = new BulletConfig().setItem(EnumAmmoSecret.P35_800_BL).setArmorPiercing(0.5F).setThresholdNegation(50F).setBeam().setSpread(0.0F).setLife(3).setRenderRotations(false) + .setCasing(new SpentCasing(CasingType.STRAIGHT).setColor(0xCEB78E).register("35-800")).setOnBeamImpact(LAMBDA_BLACK_IMPACT); ModItems.gun_aberrator = new ItemGunBaseNT(WeaponQuality.SECRET, new GunConfig() .dura(2_000).draw(10).inspect(26).crosshair(Crosshair.CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) .dmg(100F).delay(13).dry(21).reload(51).sound("hbm:weapon.fire.aberrator", 1.0F, 1.0F) - .mag(new MagazineFullReload(0, 5).addConfigs(p35800)) + .mag(new MagazineFullReload(0, 5).addConfigs(p35800, p35800_bl)) .offset(0.75, -0.0625 * 1.5, -0.1875) .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_NOWEAR_FIRE).recoil(LAMBDA_RECOIL_ABERRATOR)) .setupStandardConfiguration() @@ -46,7 +71,7 @@ public class XFactory35800 { new GunConfig().dura(2_000).draw(10).inspect(26).crosshair(Crosshair.CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) .dmg(100F).spreadHipfire(0F).delay(13).dry(21).reload(51).sound("hbm:weapon.fire.aberrator", 1.0F, 1.0F) - .mag(new MagazineFullReload(0, 5).addConfigs(p35800)) + .mag(new MagazineFullReload(0, 5).addConfigs(p35800, p35800_bl)) .offset(0.75, -0.0625 * 1.5, 0.1875) .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_NOWEAR_FIRE).recoil(LAMBDA_RECOIL_ABERRATOR)) .pp(Lego.LAMBDA_STANDARD_CLICK_PRIMARY).pr(Lego.LAMBDA_STANDARD_RELOAD) @@ -55,7 +80,7 @@ public class XFactory35800 { new GunConfig().dura(2_000).draw(10).inspect(26).crosshair(Crosshair.CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) .dmg(100F).spreadHipfire(0F).delay(13).dry(21).reload(51).sound("hbm:weapon.fire.aberrator", 1.0F, 1.0F) - .mag(new MagazineFullReload(1, 5).addConfigs(p35800)) + .mag(new MagazineFullReload(1, 5).addConfigs(p35800, p35800_bl)) .offset(0.75, -0.0625 * 1.5, -0.1875) .canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_NOWEAR_FIRE).recoil(LAMBDA_RECOIL_ABERRATOR)) .ps(Lego.LAMBDA_STANDARD_CLICK_PRIMARY).pr(Lego.LAMBDA_STANDARD_RELOAD) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java index 9ed290110..85e0d1b47 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java @@ -157,7 +157,6 @@ public class XFactory762mm { @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_CARBINE_ANIMS = (stack, type) -> { int ammo = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, 0).getReceivers(stack)[0].getMagazine(stack).getAmount(stack, MainRegistry.proxy.me().inventory); - boolean empty = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, 0).getReceivers(stack)[0].getMagazine(stack).getAmount(stack, MainRegistry.proxy.me().inventory) <= ammo; switch(type) { case EQUIP: return new BusAnimation() .addBus("EQUIP", new BusAnimationSequence().addPos(45, 0, 0, 0).addPos(0, 0, 0, 500, IType.SIN_FULL)); @@ -170,7 +169,7 @@ public class XFactory762mm { case RELOAD: return new BusAnimation() .addBus("MAG", new BusAnimationSequence().addPos(0, -4, 0, 250, IType.SIN_UP).addPos(0, -4, 0, 750).addPos(0, 0, 0, 500, IType.SIN_DOWN)) .addBus("LIFT", new BusAnimationSequence().addPos(0, 0, 0, 500).addPos(-25, 0, 0, 250, IType.SIN_FULL).addPos(-25, 0, 0, 1000)) - .addBus("BULLET", new BusAnimationSequence().addPos(empty ? 1 : 0, 0, 0, 0).addPos(0, 0, 0, 1000)); + .addBus("BULLET", new BusAnimationSequence().addPos(ammo == 0 ? 1 : 0, 0, 0, 0).addPos(0, 0, 0, 1000)); case RELOAD_END: return new BusAnimation() .addBus("LIFT", new BusAnimationSequence().addPos(-25, 0, 0, 0).addPos(-25, 0, 0, 750).addPos(0, 0, 0, 500, IType.SIN_FULL)) .addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 250).addPos(0, 0, -1, 100, IType.SIN_DOWN).addPos(0, 0, -1, 50).addPos(0, 0, 0, 100, IType.SIN_UP)) @@ -182,7 +181,7 @@ public class XFactory762mm { case INSPECT: return new BusAnimation() .addBus("LIFT", new BusAnimationSequence().addPos(-25, 0, 0, 250, IType.SIN_FULL).addPos(-25, 0, 0, 1500).addPos(0, 0, 0, 500, IType.SIN_FULL)) .addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 500).addPos(0, 0, -0.75, 150, IType.SIN_DOWN).addPos(0, 0, -0.75, 1000).addPos(0, 0, 0, 100, IType.SIN_UP)) - .addBus(empty ? "NULL" : "REL", new BusAnimationSequence().addPos(0, 0.125, 1.25, 0).addPos(0, 0.125, 1.25, 500).addPos(0, 0.125, 0.5, 150, IType.SIN_DOWN).addPos(0, 0.125, 0.5, 1000).addPos(0, 0.125, 1.25, 100, IType.SIN_UP)); + .addBus(ammo == 0 ? "NULL" : "REL", new BusAnimationSequence().addPos(0, 0.125, 1.25, 0).addPos(0, 0.125, 1.25, 500).addPos(0, 0.125, 0.5, 150, IType.SIN_DOWN).addPos(0, 0.125, 0.5, 1000).addPos(0, 0.125, 1.25, 100, IType.SIN_UP)); } return null; diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryAccelerator.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryAccelerator.java index 7f8bfa5a9..86905b000 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryAccelerator.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryAccelerator.java @@ -5,6 +5,7 @@ import java.util.function.BiFunction; import java.util.function.Consumer; import com.hbm.entity.projectile.EntityBulletBeamBase; +import com.hbm.entity.projectile.EntityCoin; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.Crosshair; @@ -14,7 +15,9 @@ import com.hbm.items.weapon.sedna.Receiver; import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; import com.hbm.items.weapon.sedna.ItemGunBaseNT.WeaponQuality; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; +import com.hbm.items.weapon.sedna.impl.ItemGunNI4NI; import com.hbm.items.weapon.sedna.mags.MagazineBelt; +import com.hbm.items.weapon.sedna.mags.MagazineInfinite; import com.hbm.items.weapon.sedna.mags.MagazineSingleReload; import com.hbm.main.MainRegistry; import com.hbm.render.anim.BusAnimation; @@ -22,11 +25,13 @@ import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.BusAnimationKeyframe.IType; import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.util.DamageResistanceHandler.DamageClass; +import com.hbm.util.Vec3NT; import net.minecraft.block.Block; import net.minecraft.block.material.Material; 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.Vec3; @@ -41,6 +46,8 @@ public class XFactoryAccelerator { public static BulletConfig coil_tungsten; public static BulletConfig coil_ferrouranium; + public static BulletConfig ni4ni_arc; + public static Consumer LAMBDA_UPDATE_TUNGSTEN = (entity) -> {breakInPath(entity, 1.25F); }; public static Consumer LAMBDA_UPDATE_FERRO = (entity) -> { breakInPath(entity, 2.5F); }; @@ -89,6 +96,9 @@ public class XFactoryAccelerator { .setOnUpdate(LAMBDA_UPDATE_TUNGSTEN); coil_ferrouranium = new BulletConfig().setItem(EnumAmmo.COIL_FERROURANIUM).setVel(7.5F).setLife(50).setDoesPenetrate(true).setDamageFalloffByPen(false).setSpectral(true) .setOnUpdate(LAMBDA_UPDATE_FERRO); + + ni4ni_arc = new BulletConfig().setupDamageClass(DamageClass.PHYSICAL).setBeam().setLife(5).setThresholdNegation(10F).setArmorPiercing(0.2F).setRenderRotations(false).setDoesPenetrate(false) + .setOnBeamImpact(BulletConfig.LAMBDA_BEAM_HIT); tauChargeMag.addConfigs(tau_uranium_charge); @@ -118,6 +128,18 @@ public class XFactoryAccelerator { .setupStandardConfiguration() .anim(LAMBDA_COILGUN_ANIMS).orchestra(Orchestras.ORCHESTRA_COILGUN) ).setUnlocalizedName("gun_coilgun"); + + ModItems.gun_n_i_4_n_i = new ItemGunNI4NI(WeaponQuality.SPECIAL, new GunConfig() + .dura(0).draw(5).inspect(39).crosshair(Crosshair.CIRCLE) + .rec(new Receiver(0) + .dmg(35F).delay(10).sound("hbm:weapon.coilgunShoot", 1.0F, 1.0F) + .mag(new MagazineInfinite(ni4ni_arc)) + .offset(0.75, -0.0625, -0.1875D) + .setupStandardFire().fire(Lego.LAMBDA_NOWEAR_FIRE)) + .setupStandardConfiguration() + .ps(LAMBDA_NI4NI_SECONDARY_PRESS) + .anim(LAMBDA_NI4NI_ANIMS).orchestra(Orchestras.ORCHESTRA_COILGUN) + ).setUnlocalizedName("gun_n_i_4_n_i"); } public static BiConsumer LAMBDA_TAU_PRIMARY_RELEASE = (stack, ctx) -> { @@ -163,6 +185,27 @@ public class XFactoryAccelerator { } }; + public static BiConsumer LAMBDA_NI4NI_SECONDARY_PRESS = (stack, ctx) -> { + if(ctx.getPlayer() == null) return; + EntityPlayer player = ctx.getPlayer(); + + if(ItemGunNI4NI.getCoinCount(stack) > 0) { + Vec3NT vec = new Vec3NT(player.getLookVec()).multiply(0.8D); + EntityCoin coin = new EntityCoin(player.worldObj); + coin.setPosition(player.posX, player.posY + player.getEyeHeight() - coin.yOffset - 0.125, player.posZ); + coin.motionX = vec.xCoord; + coin.motionY = vec.yCoord + 0.5; + coin.motionZ = vec.zCoord; + coin.rotationYaw = player.rotationYaw; + coin.setThrower(player); + player.worldObj.spawnEntityInWorld(coin); + + player.worldObj.playSoundAtEntity(player, "random.orb", 1.0F, 1F + player.getRNG().nextFloat() * 0.25F); + + ItemGunNI4NI.setCoinCount(stack, ItemGunNI4NI.getCoinCount(stack) - 1); + } + }; + public static BiConsumer LAMBDA_RECOIL_TAU = (stack, ctx) -> { }; public static BiConsumer LAMBDA_RECOIL_COILGUN = (stack, ctx) -> { @@ -196,4 +239,20 @@ public class XFactoryAccelerator { if(type == AnimType.RELOAD) return new BusAnimation().addBus("RELOAD", new BusAnimationSequence().addPos(1, 0, 0, 250).addPos(1, 0, 0, 500).addPos(0, 0, 0, 250)); return null; }; + + @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_NI4NI_ANIMS = (stack, type) -> { + switch(type) { + case EQUIP: return new BusAnimation() + .addBus("EQUIP", new BusAnimationSequence().addPos(-360 * 2, 0, 0, 500)); + case CYCLE: + boolean aiming = ItemGunBaseNT.getIsAiming(stack); + return new BusAnimation() + .addBus("RECOIL", new BusAnimationSequence().addPos(aiming ? -5 : -30, 0, 0, 100, IType.SIN_DOWN).addPos(0, 0, 0, 150, IType.SIN_FULL)) + .addBus("DRUM", new BusAnimationSequence().hold(50).addPos(0, 0, 120, 300, IType.SIN_FULL)); + case INSPECT: return new BusAnimation() + .addBus("EQUIP", new BusAnimationSequence().addPos(-360 * 3, 0, 0, 750).hold(100).addPos(0, 0, 0, 750)); + } + + return null; + }; } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryTool.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryTool.java index 91cb0f688..6800ea13f 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryTool.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryTool.java @@ -242,7 +242,7 @@ public class XFactoryTool { .setOnUpdate(LAMBDA_FOAM_UPDATE) .setOnEntityHit((bulletEntity, target) -> { if(target.entityHit != null) target.entityHit.extinguish(); }) .setOnRicochet(LAMBDA_FOAM_HIT); - fext_sand = new BulletConfig().setItem(new ItemStack(ModItems.ammo_fireext, 1, 1)).setReloadCount(300).setLife(100).setVel(0.75F).setGrav(0.04D).setSpread(0.05F) + fext_sand = new BulletConfig().setItem(new ItemStack(ModItems.ammo_fireext, 1, 2)).setReloadCount(300).setLife(100).setVel(0.75F).setGrav(0.04D).setSpread(0.05F) .setOnUpdate(LAMBDA_SAND_UPDATE) .setOnEntityHit((bulletEntity, target) -> { if(target.entityHit != null) target.entityHit.extinguish(); }) .setOnRicochet(LAMBDA_SAND_HIT); diff --git a/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunNI4NI.java b/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunNI4NI.java new file mode 100644 index 000000000..71619f721 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunNI4NI.java @@ -0,0 +1,110 @@ +package com.hbm.items.weapon.sedna.impl; + +import java.util.List; + +import com.hbm.items.ICustomizable; +import com.hbm.items.weapon.sedna.GunConfig; +import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.util.ChatBuilder; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +public class ItemGunNI4NI extends ItemGunBaseNT implements ICustomizable { + + public ItemGunNI4NI(WeaponQuality quality, GunConfig... cfg) { + super(quality, cfg); + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isHeld) { + super.onUpdate(stack, world, entity, slot, isHeld); + + if(!world.isRemote) { + if(this.getCoinCount(stack) < 4) { + this.setCoinCharge(stack, this.getCoinCharge(stack) + 1); + + if(this.getCoinCharge(stack) >= 80) { + this.setCoinCharge(stack, 0); + int newCount = this.getCoinCount(stack) + 1; + this.setCoinCount(stack, newCount); + + if(isHeld) { + world.playSoundAtEntity(entity, "hbm:item.techBoop", 1.0F, 1.25F + newCount * 0.125F); + } + } + } + } + } + + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + list.add("Now, don't get the wrong idea."); + list.add("I " + EnumChatFormatting.RED + "fucking hate " + EnumChatFormatting.GRAY + "this game."); + list.add("I didn't do this for you, I did it for sea."); + super.addInformation(stack, player, list, ext); + } + + @Override + public void customize(EntityPlayer player, ItemStack stack, String... args) { + + if(args.length == 0) { + resetColors(stack); + player.addChatComponentMessage(ChatBuilder.start("Colors reset!").color(EnumChatFormatting.GREEN).flush()); + return; + } + + if(args.length != 3) { + resetColors(stack); + player.addChatComponentMessage(ChatBuilder.start("Requires three hexadecimal colors!").color(EnumChatFormatting.RED).flush()); + return; + } + + try { + int dark = Integer.parseInt(args[0], 16); + int light = Integer.parseInt(args[1], 16); + int grip = Integer.parseInt(args[2], 16); + + if(dark < 0 || dark > 0xffffff || light < 0 || light > 0xffffff || grip < 0 || grip > 0xffffff) { + player.addChatComponentMessage(ChatBuilder.start("Colors must range from 0 to FFFFFF!").color(EnumChatFormatting.RED).flush()); + return; + } + + setColors(stack, dark, light, grip); + player.addChatComponentMessage(ChatBuilder.start("Colors set!").color(EnumChatFormatting.GREEN).flush()); + + } catch(Throwable ex) { + player.addChatComponentMessage(ChatBuilder.start(ex.getLocalizedMessage()).color(EnumChatFormatting.RED).flush()); + } + } + + public static void resetColors(ItemStack stack) { + if(!stack.hasTagCompound()) return; + stack.stackTagCompound.removeTag("colors"); + } + + public static void setColors(ItemStack stack, int dark, int light, int grip) { + if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setIntArray("colors", new int[] {dark, light, grip}); + } + + public static int[] getColors(ItemStack stack) { + if(!stack.hasTagCompound() || !stack.stackTagCompound.hasKey("colors")) return null; + int[] colors = stack.stackTagCompound.getIntArray("colors"); + if(colors.length != 3) return null; + return colors; + } + + public static final String KEY_COIN_COUNT = "coincount"; + public static final String KEY_COIN_CHARGE = "coincharge"; + public static int getCoinCount(ItemStack stack) { return getValueInt(stack, KEY_COIN_COUNT); } + public static void setCoinCount(ItemStack stack, int value) { setValueInt(stack, KEY_COIN_COUNT, value); } + public static int getCoinCharge(ItemStack stack) { return getValueInt(stack, KEY_COIN_CHARGE); } + public static void setCoinCharge(ItemStack stack, int value) { setValueInt(stack, KEY_COIN_CHARGE, value); } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineInfinite.java b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineInfinite.java new file mode 100644 index 000000000..263d4134b --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineInfinite.java @@ -0,0 +1,39 @@ +package com.hbm.items.weapon.sedna.mags; + +import com.hbm.items.ModItems; +import com.hbm.items.weapon.sedna.BulletConfig; +import com.hbm.particle.SpentCasing; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +public class MagazineInfinite implements IMagazine { + + public BulletConfig type; + + public MagazineInfinite(BulletConfig type) { + this.type = type; + } + + @Override + public Object getType(ItemStack stack, IInventory inventory) { + return this.type; + } + + @Override public void setType(ItemStack stack, Object type) { } + @Override public int getCapacity(ItemStack stack) { return 9999; } + @Override public int getAmount(ItemStack stack, IInventory inventory) { return 9999; } + @Override public void setAmount(ItemStack stack, int amount) { } + @Override public void useUpAmmo(ItemStack stack, IInventory inventory, int amount) { } + @Override public boolean canReload(ItemStack stack, IInventory inventory) { return false; } + @Override public void initNewType(ItemStack stack, IInventory inventory) { } + @Override public void reloadAction(ItemStack stack, IInventory inventory) { } + @Override public ItemStack getIconForHUD(ItemStack stack, EntityPlayer player) { return new ItemStack(ModItems.nothing); } + @Override public String reportAmmoStateForHUD(ItemStack stack, EntityPlayer player) { return "∞"; } + @Override public SpentCasing getCasing(ItemStack stack, IInventory inventory) { return this.type.casing; } + @Override public void setAmountBeforeReload(ItemStack stack, int amount) { } + @Override public int getAmountBeforeReload(ItemStack stack) { return 9999; } + @Override public void setAmountAfterReload(ItemStack stack, int amount) { } + @Override public int getAmountAfterReload(ItemStack stack) { return 9999; } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java index d6958bc94..fbee99b2b 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java @@ -138,7 +138,7 @@ public class WeaponModManager { new WeaponModDefinition(EnumModSpecial.SPEEDUP) .addMod(new Item[] {ModItems.gun_minigun, ModItems.gun_minigun_dual}, new WeaponModMinigunSpeedup(ID_MINIGUN_SPEED)) .addMod(new Item[] {ModItems.gun_autoshotgun, ModItems.gun_autoshotgun_shredder}, new WeaponModShredderSpeedup(209)); - new WeaponModDefinition(EnumModSpecial.CHOKE).addMod(new Item[] {ModItems.gun_pepperbox, ModItems.gun_maresleg, ModItems.gun_double_barrel, ModItems.gun_liberator, ModItems.gun_spas12}, new WeaponModChoke(210)); + new WeaponModDefinition(EnumModSpecial.CHOKE).addMod(new Item[] {ModItems.gun_pepperbox, ModItems.gun_maresleg, ModItems.gun_double_barrel, ModItems.gun_liberator, ModItems.gun_spas12, ModItems.gun_autoshotgun_sexy, ModItems.gun_autoshotgun_heretic}, new WeaponModChoke(210)); new WeaponModDefinition(EnumModSpecial.FURNITURE_GREEN).addMod(ModItems.gun_g3, new WeaponModPolymerFurniture(ID_FURNITURE_GREEN)); new WeaponModDefinition(EnumModSpecial.FURNITURE_BLACK).addMod(ModItems.gun_g3, new WeaponModPolymerFurniture(ID_FURNITURE_BLACK)); new WeaponModDefinition(EnumModSpecial.BAYONET) diff --git a/src/main/java/com/hbm/lib/HbmWorld.java b/src/main/java/com/hbm/lib/HbmWorld.java index ed4ca9208..537309fb7 100644 --- a/src/main/java/com/hbm/lib/HbmWorld.java +++ b/src/main/java/com/hbm/lib/HbmWorld.java @@ -1,10 +1,11 @@ package com.hbm.lib; import com.hbm.world.gen.MapGenNTMFeatures; -import com.hbm.world.gen.NBTStructure; import com.hbm.world.gen.NTMWorldGenerator; import com.hbm.world.gen.component.*; import com.hbm.world.gen.component.BunkerComponents.BunkerStart; +import com.hbm.world.gen.nbt.NBTStructure; + import cpw.mods.fml.common.IWorldGenerator; import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.world.gen.structure.MapGenStructureIO; @@ -40,8 +41,8 @@ public class HbmWorld { private static void registerNTMFeatures() { CivilianFeatures.registerComponents(); OfficeFeatures.registerComponents(); - RuinFeatures.registerComponents(); +// RuinFeatures.registerComponents(); BunkerComponents.registerComponents(); MapGenStructureIO.func_143031_a(SiloComponent.class, "NTMSiloComponent"); } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/lib/HbmWorldGen.java b/src/main/java/com/hbm/lib/HbmWorldGen.java index 6bdbc7b8b..25d85495b 100644 --- a/src/main/java/com/hbm/lib/HbmWorldGen.java +++ b/src/main/java/com/hbm/lib/HbmWorldGen.java @@ -223,17 +223,17 @@ public class HbmWorldGen implements IWorldGenerator { } } - if(biome == BiomeGenBase.plains || biome == BiomeGenBase.desert) { - if(WorldConfig.radioStructure > 0 && rand.nextInt(WorldConfig.radioStructure) == 0) { - for(int a = 0; a < 1; a++) { - int x = i + rand.nextInt(16); - int z = j + rand.nextInt(16); - int y = world.getHeightValue(x, z); - - new Radio01().generate(world, rand, x, y, z); - } - } - } +// if(biome == BiomeGenBase.plains || biome == BiomeGenBase.desert) { +// if(WorldConfig.radioStructure > 0 && rand.nextInt(WorldConfig.radioStructure) == 0) { +// for(int a = 0; a < 1; a++) { +// int x = i + rand.nextInt(16); +// int z = j + rand.nextInt(16); +// int y = world.getHeightValue(x, z); +// +// new Radio01().generate(world, rand, x, y, z); +// } +// } +// } if(biome.temperature >= 0.4F && biome.rainfall <= 0.6F) { if(WorldConfig.antennaStructure > 0 && rand.nextInt(WorldConfig.antennaStructure) == 0) { diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 27fe4f45d..b5f8b7af2 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 (5357)"; + public static final String VERSION = "1.0.27 BETA (5426)"; //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 128a8f8b4..711e5cbd6 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -145,6 +145,8 @@ public class ClientProxy extends ServerProxy { @Override public void registerPreRenderInfo() { AdvancedModelLoader.registerModelHandler(new HmfModelLoader()); + + QMAWLoader.registerModFileURL(FMLCommonHandler.instance().findContainerFor(RefStrings.MODID).getSource()); } /** Runs right after item and block init */ @@ -267,11 +269,13 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityChimneyIndustrial.class, new RenderChimneyIndustrial()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineMiningLaser.class, new RenderLaserMiner()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineAssembler.class, new RenderAssembler()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineAssemblyMachine.class, new RenderAssemblyMachine()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineAssemfac.class, new RenderAssemfac()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemplant.class, new RenderChemplant()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemicalPlant.class, new RenderChemicalPlant()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemfac.class, new RenderChemfac()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineChemicalFactory.class, new RenderChemicalFactory()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachinePUREX.class, new RenderPUREX()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineFluidTank.class, new RenderFluidTank()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineBAT9000.class, new RenderBAT9000()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineOrbus.class, new RenderOrbus()); @@ -415,6 +419,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRBMKCooler.class, new RenderRBMKLid()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRBMKStorage.class, new RenderRBMKLid()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRBMKHeater.class, new RenderRBMKLid()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRBMKAutoloader.class, new RenderRBMKAutoloader()); //ITER ClientRegistry.bindTileEntitySpecialRenderer(TileEntityITER.class, new RenderITER()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachinePlasmaHeater.class, new RenderPlasmaHeater()); @@ -614,6 +619,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityArtilleryRocket.class, new RenderArtilleryRocket()); RenderingRegistry.registerEntityRenderingHandler(EntityCog.class, new RenderCog()); RenderingRegistry.registerEntityRenderingHandler(EntitySawblade.class, new RenderSawblade()); + RenderingRegistry.registerEntityRenderingHandler(EntityCoin.class, new RenderCoin()); RenderingRegistry.registerEntityRenderingHandler(EntityChemical.class, new RenderChemical()); RenderingRegistry.registerEntityRenderingHandler(EntityMist.class, new RenderMist()); RenderingRegistry.registerEntityRenderingHandler(EntityFireLingering.class, new RenderMist()); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 76646f307..2a51edc27 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -22,6 +22,7 @@ import com.hbm.inventory.material.NTMMaterial; import static com.hbm.inventory.OreDictManager.*; import com.hbm.items.ModItems; +import com.hbm.items.ItemEnums.EnumExpensiveType; import com.hbm.items.ItemEnums.EnumLegendaryType; import com.hbm.items.ItemEnums.EnumPages; import com.hbm.items.ItemEnums.EnumPlantType; @@ -237,6 +238,8 @@ public class CraftingManager { addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.machine_electric_furnace_off), 1), new Object[] { "BBB", "WFW", "RRR", 'B', BE.ingot(), 'R', ModItems.coil_tungsten, 'W', CU.plateCast(), 'F', Item.getItemFromBlock(Blocks.furnace) }); addRecipeAuto(new ItemStack(ModBlocks.red_wire_coated, 16), new Object[] { "WRW", "RIR", "WRW", 'W', ModItems.plate_polymer, 'I', MINGRADE.ingot(), 'R', MINGRADE.wireFine() }); addRecipeAuto(new ItemStack(ModBlocks.red_cable_paintable, 16), new Object[] { "WRW", "RIR", "WRW", 'W', STEEL.plate(), 'I', MINGRADE.ingot(), 'R', MINGRADE.wireFine() }); + if (ModBlocks.oc_cable_paintable != null) + addRecipeAuto(new ItemStack(ModBlocks.oc_cable_paintable, 16), new Object[] { "WRW", "RIR", "WRW", 'W', STEEL.plate(), 'I', REDSTONE.dust(), 'R', MINGRADE.wireFine() }); addRecipeAuto(new ItemStack(ModBlocks.cable_switch, 1), new Object[] { "S", "W", 'S', Blocks.lever, 'W', ModBlocks.red_wire_coated }); addRecipeAuto(new ItemStack(ModBlocks.cable_detector, 1), new Object[] { "S", "W", 'S', REDSTONE.dust(), 'W', ModBlocks.red_wire_coated }); addRecipeAuto(new ItemStack(ModBlocks.cable_diode, 1), new Object[] { " Q ", "CAC", " Q ", 'Q', SI.nugget(), 'C', ModBlocks.red_cable, 'A', AL.ingot() }); @@ -258,7 +261,6 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.capacitor_niobium, 1), new Object[] { "PPP", "ICI", "WWW", 'P', STEEL.plate(), 'I', RUBBER.ingot(), 'C', NB.block(), 'W', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.capacitor_tantalium, 1), new Object[] { "PPP", "ICI", "WWW", 'P', STEEL.plate(), 'I', ANY_RESISTANTALLOY.ingot(), 'C', TA.block(), 'W', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.capacitor_schrabidate, 1), new Object[] { "PPP", "ICI", "WWW", 'P', STEEL.plate(), 'I', ANY_RESISTANTALLOY.ingot(), 'C', SBD.block(), 'W', STEEL.ingot() }); - //addRecipeAuto(new ItemStack(ModBlocks.machine_coal_off, 1), new Object[] { "STS", "SCS", "SFS", 'S', STEEL.ingot(), 'T', ModItems.tank_steel, 'C', MINGRADE.ingot(), 'F', Blocks.furnace }); addRecipeAuto(new ItemStack(ModBlocks.machine_wood_burner, 1), new Object[] { "PPP", "CFC", "I I" , 'P', STEEL.plate528(), 'C', ModItems.coil_copper, 'I', IRON.ingot(), 'F', Blocks.furnace}); addRecipeAuto(new ItemStack(ModBlocks.machine_turbine, 1), new Object[] { "SMS", "PTP", "SMS", 'S', STEEL.ingot(), 'T', ModItems.turbine_titanium, 'M', ModItems.coil_copper, 'P', ANY_PLASTIC.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.machine_converter_he_rf, 1), new Object[] { "RRR", "WWW", "III", 'R', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.CAPACITOR), 'W', REDSTONE.dust(), 'I', STEEL.ingot() }); @@ -313,8 +315,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.detonator, 1), new Object[] { "C", "S", 'S', STEEL.plate(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), }); addShapelessAuto(new ItemStack(ModItems.detonator_multi, 1), new Object[] { ModItems.detonator, DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); - addRecipeAuto(new ItemStack(ModItems.detonator_laser, 1), new Object[] { "RRD", "PIC", " P", 'P', STEEL.plate(), 'R', REDSTONE.dust(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'D', DIAMOND.gem(), 'I', STEEL.ingot() }); - addRecipeAuto(new ItemStack(ModItems.detonator_laser, 1), new Object[] { "RRD", "PIC", " P", 'P', STEEL.plate(), 'R', REDSTONE.dust(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'D', EMERALD.gem(), 'I', STEEL.ingot() }); + addShapelessAuto(new ItemStack(ModItems.detonator_laser, 1), new Object[] { ModItems.rangefinder, DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), RUBBER.ingot(), GOLD.wireDense() }); addShapelessAuto(new ItemStack(ModItems.detonator_deadman, 1), new Object[] { ModItems.detonator, ModItems.defuser, ModItems.ducttape }); addRecipeAuto(new ItemStack(ModItems.detonator_de, 1), new Object[] { "T", "D", "T", 'T', Blocks.tnt, 'D', ModItems.detonator_deadman }); @@ -411,7 +412,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.basalt_polished, 4), new Object[] { "CC", "CC", 'C', ModBlocks.basalt_smooth }); addRecipeAuto(new ItemStack(ModBlocks.basalt_brick, 4), new Object[] { "CC", "CC", 'C', ModBlocks.basalt_polished }); addRecipeAuto(new ItemStack(ModBlocks.basalt_tiles, 4), new Object[] { "CC", "CC", 'C', ModBlocks.basalt_brick }); - + addShapelessAuto(new ItemStack(ModBlocks.lightstone, 4), new Object[] { Blocks.stone, Blocks.stone, Blocks.stone, ModItems.powder_limestone }); addRecipeAuto(new ItemStack(ModBlocks.lightstone, 4, LightstoneType.TILE.ordinal()), new Object[] { "CC", "CC", 'C', new ItemStack(ModBlocks.lightstone, 1, 0) }); addRecipeAuto(new ItemStack(ModBlocks.lightstone, 4, LightstoneType.BRICKS.ordinal()), new Object[] { "CC", "CC", 'C', new ItemStack(ModBlocks.lightstone, 1, LightstoneType.TILE.ordinal()) }); @@ -443,7 +444,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.barbed_wire_ultradeath, 4), new Object[] { "BCB", "CIC", "BCB", 'B', ModBlocks.barbed_wire, 'C', ModItems.powder_yellowcake, 'I', ModItems.nuclear_waste }); addShapelessAuto(new ItemStack(ModBlocks.sandbags, 4), new Object[] { ModItems.plate_polymer, KEY_SAND, KEY_SAND, KEY_SAND }); - + addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.tape_recorder), 4), new Object[] { "TST", "SSS", 'T', W.ingot(), 'S', STEEL.ingot() }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_poles), 16), new Object[] { "S S", "SSS", "S S", 'S', STEEL.ingot() }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.pole_top), 1), new Object[] { "T T", "TRT", "BBB", 'T', W.ingot(), 'B', BE.ingot(), 'R', MINGRADE.ingot() }); @@ -458,6 +459,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_grate), 4), new Object[] { "SS", "SS", 'S', ModBlocks.steel_beam }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_grate_wide), 4), new Object[] { "SS", 'S', ModBlocks.steel_grate }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_grate), 1), new Object[] { "SS", 'S', ModBlocks.steel_grate_wide }); + addRecipeAuto(new ItemStack(ModBlocks.rebar, 8), new Object[] { "BB", "BB", 'B', STEEL.bolt() }); addRecipeAuto(new ItemStack(ModBlocks.steel_scaffold, 8, 0), new Object[] { "SSS", "SDS", "SSS", 'S', ModBlocks.steel_scaffold, 'D', "dyeGray" }); addRecipeAuto(new ItemStack(ModBlocks.steel_scaffold, 8, 1), new Object[] { "SSS", "SDS", "SSS", 'S', ModBlocks.steel_scaffold, 'D', "dyeRed" }); @@ -604,13 +606,15 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.fluid_duct_neo, 8, 1), new Object[] { "IAI", " ", "IAI", 'I', IRON.plate(), 'A', AL.plate() }); addRecipeAuto(new ItemStack(ModBlocks.fluid_duct_neo, 8, 2), new Object[] { "ASA", " ", "ASA", 'S', STEEL.plate(), 'A', AL.plate() }); addRecipeAuto(new ItemStack(ModBlocks.fluid_duct_paintable, 8), new Object[] { "SAS", "A A", "SAS", 'S', STEEL.ingot(), 'A', AL.plate() }); + addRecipeAuto(new ItemStack(ModBlocks.fluid_duct_paintable_block_exhaust, 8), new Object[] { "SAS", "A A", "SAS", 'S', IRON.ingot(), 'A', ModItems.plate_polymer}); addShapelessAuto(new ItemStack(ModBlocks.fluid_duct_gauge), new Object[] { ModBlocks.fluid_duct_paintable, STEEL.ingot(), DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC) }); addRecipeAuto(new ItemStack(ModBlocks.fluid_valve, 1), new Object[] { "S", "W", 'S', Blocks.lever, 'W', ModBlocks.fluid_duct_paintable }); addRecipeAuto(new ItemStack(ModBlocks.fluid_switch, 1), new Object[] { "S", "W", 'S', REDSTONE.dust(), 'W', ModBlocks.fluid_duct_paintable }); addRecipeAuto(new ItemStack(ModBlocks.fluid_pump, 1), new Object[] { " S ", "PGP", "IMI", 'S', STEEL.shell(), 'P', STEEL.pipe(), 'G', GRAPHITE.ingot(), 'I', STEEL.ingot(), 'M', ModItems.motor }); addRecipeAuto(new ItemStack(ModBlocks.pneumatic_tube, 8), new Object[] { "CRC", 'C', CU.plateCast(), 'R', ANY_RUBBER.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.pneumatic_tube, 24), new Object[] { "CRC", 'C', CU.plateWelded(), 'R', ANY_RUBBER.ingot() }); - + addRecipeAuto(new ItemStack(ModBlocks.pneumatic_tube_paintable, 4), new Object[] { "SAS", "A A", "SAS", 'S', STEEL.plate(), 'A', ModBlocks.pneumatic_tube}); + addRecipeAuto(new ItemStack(ModItems.template_folder, 1), new Object[] { "LPL", "BPB", "LPL", 'P', Items.paper, 'L', "dye", 'B', "dye" }); addRecipeAuto(new ItemStack(ModItems.pellet_antimatter, 1), new Object[] { "###", "###", "###", '#', ModItems.cell_antimatter }); addRecipeAuto(new ItemStack(ModItems.fluid_tank_empty, 8), new Object[] { "121", "1G1", "121", '1', AL.plate(), '2', IRON.plate(), 'G', KEY_ANYPANE }); @@ -862,7 +866,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.pwr_heatsink, 4), new Object[] { "SCS", "CRC", "SCS", 'S', BIGMT.plateCast(), 'C', CU.plate(), 'R', RUBBER.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.pwr_reflector, 4), new Object[] { "RLR", "LSL", "RLR", 'R', OreDictManager.getReflector(), 'L', PB.plate528(), 'S', STEEL.plateCast() }); addRecipeAuto(new ItemStack(ModBlocks.pwr_casing, 4), new Object[] { "LCL", "CSC", "LCL", 'L', PB.plate528(), 'C', ANY_CONCRETE.any(), 'S', STEEL.plateCast() }); - addRecipeAuto(new ItemStack(ModBlocks.pwr_controller, 1), new Object[] { "CPC", "PSP", "CPC", 'C', ModBlocks.pwr_casing, 'P', ANY_PLASTIC.ingot(), 'S', !GeneralConfig.enableExpensiveMode ? DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC) : STEEL.heavyComp() }); + addRecipeAuto(new ItemStack(ModBlocks.pwr_controller, 1), new Object[] { "CPC", "PSP", "CPC", 'C', ModBlocks.pwr_casing, 'P', ANY_PLASTIC.ingot(), 'S', !GeneralConfig.enableExpensiveMode ? DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC) : DictFrame.fromOne(ModItems.item_expensive, EnumExpensiveType.CIRCUIT) }); addRecipeAuto(new ItemStack(ModBlocks.pwr_port, 1), new Object[] { "S", "C", "S", 'S', STEEL.plate(), 'C', ModBlocks.pwr_casing }); addRecipeAuto(new ItemStack(ModBlocks.pwr_neutron_source, 1), new Object[] { "LRL", "ZRZ", "LRL", 'L', PB.plate528(), 'R', ModItems.billet_ra226be, 'Z', ZR.plateCast() }); @@ -882,6 +886,8 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.ladder_steel, 8), new Object[] { "LLL", "L#L", "LLL", 'L', Blocks.ladder, '#', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.ladder_tungsten, 8), new Object[] { "LLL", "L#L", "LLL", 'L', Blocks.ladder, '#', W.ingot() }); + addShapelessAuto(new ItemStack(ModBlocks.trapdoor_steel, 1), new Object[] { Blocks.trapdoor, STEEL.ingot() }); + addRecipeAuto(new ItemStack(ModBlocks.machine_storage_drum), new Object[] { "LLL", "L#L", "LLL", 'L', PB.plate(), '#', ModItems.tank_steel }); addRecipeAuto(new ItemStack(ModBlocks.deco_pipe, 6), new Object[] { "PP", 'P', STEEL.pipe() }); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 0826c53bd..9f5366d6c 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -9,14 +9,12 @@ import com.hbm.config.*; import com.hbm.crafting.RodRecipes; import com.hbm.creativetabs.*; import com.hbm.entity.EntityMappings; -import com.hbm.entity.grenade.*; import com.hbm.entity.logic.IChunkLoader; import com.hbm.entity.mob.siege.SiegeTier; import com.hbm.handler.*; -import com.hbm.handler.imc.IMCBlastFurnace; -import com.hbm.handler.imc.IMCCentrifuge; -import com.hbm.handler.imc.IMCCrystallizer; -import com.hbm.handler.imc.IMCHandler; +import com.hbm.handler.ae2.AE2CompatHandler; +import com.hbm.handler.imc.*; +import com.hbm.handler.microblocks.MicroBlocksCompatHandler; import com.hbm.handler.neutron.NeutronHandler; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.radiation.ChunkRadiationManager; @@ -31,8 +29,6 @@ import com.hbm.inventory.recipes.anvil.AnvilRecipes; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ItemEnums.EnumAchievementType; import com.hbm.items.ModItems; -import com.hbm.items.tool.ItemFertilizer; -import com.hbm.items.weapon.ItemGenericGrenade; import com.hbm.items.weapon.sedna.mods.WeaponModManager; import com.hbm.lib.HbmWorld; import com.hbm.lib.RefStrings; @@ -61,13 +57,7 @@ import cpw.mods.fml.common.event.FMLMissingMappingsEvent.MissingMapping; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; -import net.minecraft.block.BlockDispenser; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.dispenser.BehaviorDefaultDispenseItem; -import net.minecraft.dispenser.BehaviorProjectileDispense; -import net.minecraft.dispenser.IBlockSource; -import net.minecraft.dispenser.IPosition; -import net.minecraft.entity.IProjectile; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.Item.ToolMaterial; @@ -78,7 +68,6 @@ import net.minecraft.stats.StatBase; import net.minecraft.stats.StatBasic; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.EnumFacing; import net.minecraft.util.WeightedRandomChestContent; import net.minecraft.world.World; import net.minecraftforge.common.AchievementPage; @@ -368,298 +357,9 @@ public class MainRegistry { } } }); - - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_generic, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeGeneric(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_strong, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeStrong(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_frag, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeFrag(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_fire, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeFire(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_cluster, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeCluster(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_flare, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeFlare(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_electric, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeElectric(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_poison, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadePoison(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_gas, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeGas(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_schrabidium, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeSchrabidium(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_nuke, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeNuke(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_nuclear, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeNuclear(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_pulse, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadePulse(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_plasma, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadePlasma(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_tau, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeTau(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_lemon, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeLemon(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_mk2, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeMk2(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_aschrab, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeASchrab(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_zomg, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeZOMG(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_shrapnel, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeShrapnel(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_black_hole, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeBlackHole(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_gascan, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeGascan(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_cloud, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeCloud(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_pink_cloud, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadePC(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_smart, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeSmart(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_mirv, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeMIRV(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_breach, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeBreach(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_burst, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeBurst(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_generic, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFGeneric(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_he, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFHE(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_bouncy, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFBouncy(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_sticky, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFSticky(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_impact, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFImpact(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_incendiary, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFIncendiary(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_toxic, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFToxic(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_concussion, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFConcussion(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_brimstone, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFBrimstone(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_mystery, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFMystery(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_spark, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFSpark(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_hopwire, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFHopwire(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_if_null, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World p_82499_1_, IPosition p_82499_2_) { - return new EntityGrenadeIFNull(p_82499_1_, p_82499_2_.getX(), p_82499_2_.getY(), p_82499_2_.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.nuclear_waste_pearl, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World world, IPosition position) { - return new EntityWastePearl(world, position.getX(), position.getY(), position.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.stick_dynamite, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World world, IPosition position) { - return new EntityGrenadeDynamite(world, position.getX(), position.getY(), position.getZ()); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.grenade_kyiv, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World world, IPosition position) { - return new EntityGrenadeImpactGeneric(world, position.getX(), position.getY(), position.getZ()).setType((ItemGenericGrenade) ModItems.grenade_kyiv); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.stick_dynamite_fishing, new BehaviorProjectileDispense() { - - protected IProjectile getProjectileEntity(World world, IPosition position) { - return new EntityGrenadeImpactGeneric(world, position.getX(), position.getY(), position.getZ()).setType((ItemGenericGrenade) ModItems.stick_dynamite_fishing); - } - }); - BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.powder_fertilizer, new BehaviorDefaultDispenseItem() { - - private boolean dispenseSound = true; - @Override protected ItemStack dispenseStack(IBlockSource source, ItemStack stack) { - - EnumFacing facing = BlockDispenser.func_149937_b(source.getBlockMetadata()); - World world = source.getWorld(); - int x = source.getXInt() + facing.getFrontOffsetX(); - int y = source.getYInt() + facing.getFrontOffsetY(); - int z = source.getZInt() + facing.getFrontOffsetZ(); - this.dispenseSound = ItemFertilizer.useFertillizer(stack, world, x, y, z); - return stack; - } - @Override protected void playDispenseSound(IBlockSource source) { - if(this.dispenseSound) { - source.getWorld().playAuxSFX(1000, source.getXInt(), source.getYInt(), source.getZInt(), 0); - } else { - source.getWorld().playAuxSFX(1001, source.getXInt(), source.getYInt(), source.getZInt(), 0); - } - } - }); + + DispenserBehaviorHandler.init(); + MicroBlocksCompatHandler.preInit(); } @EventHandler @@ -714,9 +414,9 @@ public class MainRegistry { //progression achieves achBurnerPress = new Achievement("achievement.burnerPress", "burnerPress", 0, 0, new ItemStack(ModBlocks.machine_press), null).initIndependentStat().registerStat(); achBlastFurnace = new Achievement("achievement.blastFurnace", "blastFurnace", 1, 3, new ItemStack(ModBlocks.machine_difurnace_off), achBurnerPress).initIndependentStat().registerStat(); - achAssembly = new Achievement("achievement.assembly", "assembly", 3, -1, new ItemStack(ModBlocks.machine_assembler), achBurnerPress).initIndependentStat().registerStat(); + achAssembly = new Achievement("achievement.assembly", "assembly", 3, -1, new ItemStack(ModBlocks.machine_assembly_machine), achBurnerPress).initIndependentStat().registerStat(); achSelenium = new Achievement("achievement.selenium", "selenium", 3, 2, ModItems.ingot_starmetal, achBurnerPress).initIndependentStat().setSpecial().registerStat(); - achChemplant = new Achievement("achievement.chemplant", "chemplant", 6, -1, new ItemStack(ModBlocks.machine_chemplant), achAssembly).initIndependentStat().registerStat(); + achChemplant = new Achievement("achievement.chemplant", "chemplant", 6, -1, new ItemStack(ModBlocks.machine_chemical_plant), achAssembly).initIndependentStat().registerStat(); achConcrete = new Achievement("achievement.concrete", "concrete", 6, -4, new ItemStack(ModBlocks.concrete), achChemplant).initIndependentStat().registerStat(); achPolymer = new Achievement("achievement.polymer", "polymer", 9, -1, ModItems.ingot_polymer, achChemplant).initIndependentStat().registerStat(); achDesh = new Achievement("achievement.desh", "desh", 9, 2, ModItems.ingot_desh, achChemplant).initIndependentStat().registerStat(); @@ -844,6 +544,12 @@ public class MainRegistry { @EventHandler public static void PostLoad(FMLPostInitializationEvent PostEvent) { + // to make sure that foreign registered fluids are accounted for, + // even when the reload listener is registered too late due to load order + // IMPORTANT: fluids have to load before recipes. weird shit happens if not. + Fluids.reloadFluids(); + FluidContainerRegistry.register(); + MagicRecipes.register(); LemegetonRecipes.register(); SILEXRecipes.register(); @@ -872,15 +578,19 @@ public class MainRegistry { ArmorUtil.register(); HazmatRegistry.registerHazmats(); DamageResistanceHandler.init(); - FluidContainerRegistry.register(); BlockToolConversion.registerRecipes(); AchievementHandler.register(); + MobUtil.intializeMobPools(); + proxy.registerMissileItems(); // Load compatibility for OC. CompatHandler.init(); + // Load compatibility for AE2. + AE2CompatHandler.init(); + //expand for the largest entity we have (currently Quackos who is 17.5m in diameter, that's one fat duck) World.MAX_ENTITY_RADIUS = Math.max(World.MAX_ENTITY_RADIUS, 8.75); @@ -899,14 +609,10 @@ public class MainRegistry { Compat.handleRailcraftNonsense(); SuicideThreadDump.register(); CommandReloadClient.register(); - - // to make sure that foreign registered fluids are accounted for, - // even when the reload listener is registered too late due to load order - Fluids.reloadFluids(); //ExplosionTests.runTest(); } - + @EventHandler public void preInit(FMLPreInitializationEvent event) { if(logger == null) @@ -958,6 +664,9 @@ public class MainRegistry { event.registerServerCommand(new CommandRadiation()); event.registerServerCommand(new CommandPacketInfo()); event.registerServerCommand(new CommandReloadServer()); + event.registerServerCommand(new CommandLocate()); + event.registerServerCommand(new CommandCustomize()); + ArcFurnaceRecipes.registerFurnaceSmeltables(); // because we have to wait for other mods to take their merry ass time to register recipes } @EventHandler @@ -1697,6 +1406,28 @@ public class MainRegistry { ignoreMappings.add("hbm:tile.hadron_cooler"); ignoreMappings.add("hbm:tile.machine_transformer_20"); ignoreMappings.add("hbm:tile.machine_transformer_dnt_20"); + ignoreMappings.add("hbm:item.levitation_unit"); + ignoreMappings.add("hbm:item.letter"); + ignoreMappings.add("hbm:item.chopper_head"); + ignoreMappings.add("hbm:item.chopper_gun"); + ignoreMappings.add("hbm:item.chopper_torso"); + ignoreMappings.add("hbm:item.chopper_tail"); + ignoreMappings.add("hbm:item.chopper_wing"); + ignoreMappings.add("hbm:item.chopper_blades"); + ignoreMappings.add("hbm:item.component_emitter"); + ignoreMappings.add("hbm:item.component_limiter"); + ignoreMappings.add("hbm:item.bottle2_korl_special"); + ignoreMappings.add("hbm:item.bottle2_fritz_special"); + ignoreMappings.add("hbm:item.journal_pip"); + ignoreMappings.add("hbm:item.journal_bj"); + ignoreMappings.add("hbm:item.journal_silver"); + ignoreMappings.add("hbm:tile.machine_arc_furnace_off"); + ignoreMappings.add("hbm:tile.machine_arc_furnace_on"); + ignoreMappings.add("hbm:item.heavy_component"); + ignoreMappings.add("hbm:item.mp_w_20"); + ignoreMappings.add("hbm:item.mp_f_20"); + ignoreMappings.add("hbm:item.mp_thruster_10_kerosene_tec"); + ignoreMappings.add("hbm:item.mp_thruster_15_kerosene_tec"); /// 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 cd368b165..7632100df 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -10,7 +10,6 @@ import com.hbm.config.MobConfig; import com.hbm.config.RadiationConfig; import com.hbm.config.ServerConfig; import com.hbm.entity.mob.*; -import com.hbm.entity.mob.ai.EntityAIFireGun; import com.hbm.entity.projectile.EntityBulletBaseMK4; import com.hbm.entity.projectile.EntityBurningFOEQ; import com.hbm.entity.train.EntityRailCarBase; @@ -76,7 +75,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAITasks; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.monster.*; @@ -387,74 +385,18 @@ public class ModEventHandler { if(entity instanceof EntityZombie) { if(world.rand.nextFloat() < 0.005F && soot > 2) { // full hazmat zombine - equipFullSet(entity, ModItems.hazmat_helmet, ModItems.hazmat_plate, ModItems.hazmat_legs, ModItems.hazmat_boots); + MobUtil.equipFullSet(entity, ModItems.hazmat_helmet, ModItems.hazmat_plate, ModItems.hazmat_legs, ModItems.hazmat_boots); return; } - - if(world.rand.nextFloat() < 0.005F && soot > 20) { // full security zombine - equipFullSet(entity, ModItems.security_helmet, ModItems.security_plate, ModItems.security_legs, ModItems.security_boots); - return; - } - - slotPools.put(4, createSlotPool(8000, new Object[][]{ //new slots, smooth, brushed, no wrinkles // old slots, wrinkled, rusty, not smooth - {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, - {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, - {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, - {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} - })); - slotPools.put(3, createSlotPool(7000, new Object[][]{ - {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.robes_plate, 32}, - {ModItems.jackt, 32}, {ModItems.jackt2, 32}, {ModItems.alloy_plate, 2}, - {ModItems.steel_plate, 2} - })); - slotPools.put(2, createSlotPool(7000, new Object[][]{ - {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, - {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2} - })); - slotPools.put(1, createSlotPool(7000, new Object[][]{ - {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2} - })); - slotPools.put(0, createSlotPool(10000, new Object[][]{ - {ModItems.pipe_lead, 30}, {ModItems.crowbar, 25}, {ModItems.geiger_counter, 20}, - {ModItems.reer_graar, 16}, {ModItems.steel_pickaxe, 12}, {ModItems.stopsign, 10}, - {ModItems.sopsign, 8}, {ModItems.chernobylsign, 6}, {ModItems.steel_sword, 15}, - {ModItems.alloy_axe, 5}, {ModItems.titanium_sword, 8}, {ModItems.lead_gavel, 4}, - {ModItems.wrench, 20}, {ModItems.cobalt_decorated_sword, 2}, {ModItems.detonator_de, 1} - })); + slotPools = MobUtil.slotPoolCommon; } else if(entity instanceof EntitySkeleton) { - - slotPools.put(4, createSlotPool(12000, new Object[][]{ - {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, - {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, - {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, - {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} - })); - slotPools.put(3, createSlotPool(10000, new Object[][]{ - {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.alloy_plate, 2}, //sadly they cant wear jackets bc it breaks it - {ModItems.steel_plate, 8}, {ModItems.titanium_plate, 4} - })); - slotPools.put(2, createSlotPool(10000, new Object[][]{ - {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, - {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2}, - })); - slotPools.put(1, createSlotPool(10000, new Object[][]{ - {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2}, - {ModItems.titanium_boots, 6} - })); - + slotPools = MobUtil.slotPoolRanged; ItemStack bowReplacement = getSkelegun(soot, world.rand); slotPools.put(0, createSlotPool(50, bowReplacement != null ? new Object[][]{{bowReplacement, 1}} : new Object[][]{})); } - assignItemsToEntity(entity, slotPools); - } - - private void equipFullSet(EntityLivingBase entity, Item helmet, Item chest, Item legs, Item boots) { //for brainlets (me) to add more armorsets later when i forget about how this works - entity.setCurrentItemOrArmor(4, new ItemStack(helmet)); //p_70062_1_ is the slot number - entity.setCurrentItemOrArmor(3, new ItemStack(chest)); - entity.setCurrentItemOrArmor(2, new ItemStack(legs)); - entity.setCurrentItemOrArmor(1, new ItemStack(boots)); + MobUtil.assignItemsToEntity(entity, slotPools, rand); } private List createSlotPool(int nullWeight, Object[][] items) { @@ -473,74 +415,30 @@ public class ModEventHandler { return pool; } - - public void assignItemsToEntity(EntityLivingBase entity, Map> slotPools) { - for (Map.Entry> entry : slotPools.entrySet()) { - int slot = entry.getKey(); - List pool = entry.getValue(); - - WeightedRandomObject choice = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); //NullPointerException sludge fix - if (choice == null) { - continue; - } - - ItemStack stack = choice.asStack(); - if (stack == null || stack.getItem() == null) { - continue; - } - - if (stack.getItem() == ModItems.gas_mask_m65 //eyesore - || stack.getItem() == ModItems.gas_mask_olde - || stack.getItem() == ModItems.gas_mask_mono) { - ArmorUtil.installGasMaskFilter(stack, new ItemStack(ModItems.gas_mask_filter)); - } - - entity.setCurrentItemOrArmor(slot, stack); - - //Give skeleton AI if it has a gun - if (slot == 0 && entity instanceof EntitySkeleton && pool == slotPools.get(0)) { - addFireTask((EntityLiving) entity); - } - } - } - private static ItemStack getSkelegun(float soot, Random rand) { - if(!MobConfig.enableMobWeapons) return null; - if(rand.nextDouble() > Math.log(soot) * 0.25) return null; + if (!MobConfig.enableMobWeapons) return null; + if (rand.nextDouble() > Math.log(soot) * 0.25) return null; - ArrayList pool = new ArrayList(); - pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_light_revolver), 12)); - pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_heavy_revolver), 8)); + ArrayList pool = new ArrayList<>(); - if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_pepperbox), 10)); - if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_henry), 8)); - if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_greasegun), 6)); - - if(soot > 4) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_maresleg), 4)); - if(soot > 4) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_uzi), 6)); - - if(soot > 8) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_spas12), 3)); - if(soot > 8) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_am180), 4)); - - if(soot > 12) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_congolake), 1)); + if(soot < 0.3){ + pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_pepperbox), 5)); + pool.add(new WeightedRandomObject(null, 20)); + } else if(soot > 0.3 && soot < 1) { + pool.addAll(MobUtil.slotPoolGuns.get(0.3)); + } else if (soot < 3) { + pool.addAll(MobUtil.slotPoolGuns.get(1D)); + } else if (soot < 5) { + pool.addAll(MobUtil.slotPoolGuns.get(3D)); + } else { + pool.addAll(MobUtil.slotPoolGuns.get(5D)); + } WeightedRandomObject selected = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); return selected.asStack(); } - // these fucking tasks keep stacking on top of themselves - private static void addFireTask(EntityLiving entity) { - entity.setEquipmentDropChance(0, 0); // Prevent dropping guns - - for(Object entry : entity.tasks.taskEntries) { - EntityAITasks.EntityAITaskEntry task = (EntityAITasks.EntityAITaskEntry) entry; - if(task.action instanceof EntityAIFireGun) return; - } - - entity.tasks.addTask(3, new EntityAIFireGun(entity)); - } - @SubscribeEvent public void addAITasks(EntityJoinWorldEvent event) { if(event.world.isRemote || !(event.entity instanceof EntityLiving)) return; @@ -549,7 +447,7 @@ public class ModEventHandler { ItemStack held = living.getHeldItem(); if(held != null && held.getItem() instanceof ItemGunBaseNT) { - addFireTask(living); + MobUtil.addFireTask(living); } } @@ -1090,6 +988,11 @@ public class ModEventHandler { player.worldObj.spawnParticle("townaura", player.posX + vec.xCoord, player.posY + 1 + vec.yCoord, player.posZ + vec.zCoord, 0.0, 0.0, 0.0); } } + + /*if(!player.worldObj.isRemote && event.phase == TickEvent.Phase.END && player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemGunBaseNT && player instanceof EntityPlayerMP) { + HeldItemNBTPacket packet = new HeldItemNBTPacket(player.getHeldItem()); + PacketDispatcher.wrapper.sendTo(packet, (EntityPlayerMP) player); + }*/ } @SubscribeEvent diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index e9e40dfe0..36081693c 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -3,6 +3,7 @@ package com.hbm.main; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockAshes; +import com.hbm.blocks.generic.BlockRebar; import com.hbm.config.ClientConfig; import com.hbm.config.GeneralConfig; import com.hbm.entity.mob.EntityHunterChopper; @@ -13,6 +14,7 @@ import com.hbm.extprop.HbmPlayerProps; import com.hbm.handler.ArmorModHandler; import com.hbm.handler.HTTPHandler; import com.hbm.handler.HazmatRegistry; +import com.hbm.handler.HbmKeybinds; import com.hbm.handler.ImpactWorldHandler; import com.hbm.hazard.HazardSystem; import com.hbm.interfaces.IHoldableWeapon; @@ -22,6 +24,7 @@ import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.gui.GUIArmorTable; import com.hbm.inventory.gui.GUIScreenPreview; import com.hbm.inventory.gui.GUIScreenWikiRender; +import com.hbm.inventory.gui.LoadingScreenRendererNT; import com.hbm.items.ItemCustomLore; import com.hbm.items.ModItems; import com.hbm.items.armor.*; @@ -34,6 +37,9 @@ import com.hbm.lib.Library; import com.hbm.lib.RefStrings; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toserver.AuxButtonPacket; +import com.hbm.qmaw.GuiQMAW; +import com.hbm.qmaw.QMAWLoader; +import com.hbm.qmaw.QuickManualAndWiki; import com.hbm.render.anim.HbmAnimations; import com.hbm.render.anim.HbmAnimations.Animation; import com.hbm.render.block.ct.CTStitchReceiver; @@ -108,6 +114,8 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.client.event.sound.PlaySoundEvent17; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.oredict.OreDictionary; + import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; @@ -745,6 +753,20 @@ public class ModEventHandlerClient { list.add(EnumChatFormatting.RED + "Error loading cannery: " + ex.getLocalizedMessage()); } + try { + QuickManualAndWiki qmaw = QMAWLoader.triggers.get(comp); + if(qmaw == null) { + qmaw = QMAWLoader.triggers.get(new ComparableStack(comp.item, 1, OreDictionary.WILDCARD_VALUE)); + } + if(qmaw != null) { + list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("qmaw.tab", Keyboard.getKeyName(HbmKeybinds.qmaw.getKeyCode()))); + lastQMAW = qmaw; + qmawTimestamp = Clock.get_ms(); + } + } catch(Exception ex) { + list.add(EnumChatFormatting.RED + "Error loading cannery: " + ex.getLocalizedMessage()); + } + /*ItemStack copy = stack.copy(); List materials = Mats.getMaterialsFromItem(copy); @@ -757,6 +779,8 @@ public class ModEventHandlerClient { private static long canneryTimestamp; private static ComparableStack lastCannery = null; + private static long qmawTimestamp; + private static QuickManualAndWiki lastQMAW = null; private ResourceLocation ashes = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_ash.png"); @@ -889,6 +913,16 @@ public class ModEventHandlerClient { } } + if(Keyboard.isKeyDown(HbmKeybinds.qmaw.getKeyCode()) && Minecraft.getMinecraft().currentScreen != null) { + + QuickManualAndWiki qmaw = qmawTimestamp > Clock.get_ms() - 100 ? lastQMAW : null; + + if(qmaw != null) { + Minecraft.getMinecraft().thePlayer.closeScreen(); + FMLCommonHandler.instance().showGuiScreen(new GuiQMAW(qmaw)); + } + } + if(Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) && Keyboard.isKeyDown(Keyboard.KEY_LMENU)) { ItemStack stack = getMouseOverStack(); @@ -922,9 +956,10 @@ public class ModEventHandlerClient { ItemFluidDuct.class ); - String prefix = "Slot "; - //int gunScale = 8; - int slotScale = 1; + String prefix = "Gun "; + //int gunScale = 16; + //int defaultScale = 1; + int slotScale = 16; boolean ignoreNonNTM = true; boolean onlyGuns = true; @@ -1028,14 +1063,26 @@ public class ModEventHandlerClient { public static boolean renderLodeStar = false; public static long lastStarCheck = 0L; + public static long lastLoadScreenReplacement = 0L; + public static int loadingScreenReplacementRetry = 0; @SideOnly(Side.CLIENT) @SubscribeEvent(priority = EventPriority.LOWEST) public void onClientTickLast(ClientTickEvent event) { + + Minecraft mc = Minecraft.getMinecraft(); + long millis = Clock.get_ms(); + if(millis == 0) millis = System.currentTimeMillis(); + + if(GeneralConfig.enableLoadScreenReplacement && loadingScreenReplacementRetry < 25 && !(mc.loadingScreen instanceof LoadingScreenRendererNT) && millis > lastLoadScreenReplacement + 5_000) { + mc.loadingScreen = new LoadingScreenRendererNT(mc); + lastLoadScreenReplacement = millis; + loadingScreenReplacementRetry++; // this might not do anything, but at least it should prevent a metric fuckton of framebuffers from being created + } if(event.phase == Phase.START && GeneralConfig.enableSkyboxes) { - World world = Minecraft.getMinecraft().theWorld; + World world = mc.theWorld; if(world == null) return; IRenderHandler sky = world.provider.getSkyRenderer(); @@ -1059,8 +1106,7 @@ public class ModEventHandlerClient { } } - EntityPlayer player = Minecraft.getMinecraft().thePlayer; - long millis = Clock.get_ms(); + EntityPlayer player = mc.thePlayer; if(lastStarCheck + 200 < millis) { renderLodeStar = false; @@ -1125,6 +1171,8 @@ public class ModEventHandlerClient { public void onRenderWorldLastEvent(RenderWorldLastEvent event) { Clock.update(); + + BlockRebar.renderRebar(Minecraft.getMinecraft().theWorld.loadedTileEntityList, event.partialTicks); GL11.glPushMatrix(); diff --git a/src/main/java/com/hbm/main/NEIRegistry.java b/src/main/java/com/hbm/main/NEIRegistry.java index 0ba8b15b4..efc36e201 100644 --- a/src/main/java/com/hbm/main/NEIRegistry.java +++ b/src/main/java/com/hbm/main/NEIRegistry.java @@ -24,15 +24,15 @@ public class NEIRegistry { handlers.add(new GasCentrifugeRecipeHandler()); handlers.add(new BreederRecipeHandler()); handlers.add(new CyclotronRecipeHandler()); - handlers.add(new AssemblerRecipeHandler()); + handlers.add(new AssemblyMachineRecipeHandler()); handlers.add(new RefineryRecipeHandler()); handlers.add(new VacuumRecipeHandler()); handlers.add(new CrackingHandler()); handlers.add(new RadiolysisRecipeHandler()); handlers.add(new ReformingHandler()); handlers.add(new HydrotreatingHandler()); - handlers.add(new ChemplantRecipeHandler()); handlers.add(new ChemicalPlantRecipeHandler()); + handlers.add(new PUREXRecipeHandler()); handlers.add(new OreSlopperHandler()); //before acidizing handlers.add(new CrystallizerRecipeHandler()); handlers.add(new BookRecipeHandler()); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 5ec3d90fc..8f51419f4 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -140,17 +140,19 @@ public class ResourceManager { public static final IModelCustom assembler_cog = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/assembler_new_cog.obj")); public static final IModelCustom assembler_slider = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/assembler_new_slider.obj")); public static final IModelCustom assembler_arm = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/assembler_new_arm.obj")); - public static final IModelCustom assemfac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/assemfac.obj")); + public static final IModelCustom assembly_machine = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/assembly_machine.obj")).asVBO(); + public static final IModelCustom assemfac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/assemfac.obj")).asVBO(); //Chemplant - public static final IModelCustom chemplant_body = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_body.obj")); + public static final IModelCustom chemplant_body = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_body.obj")).asVBO(); public static final IModelCustom chemplant_spinner = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_spinner.obj")); public static final IModelCustom chemplant_piston = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_piston.obj")); public static final IModelCustom chemplant_fluid = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_fluid.hmf")); public static final IModelCustom chemplant_fluidcap = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/chemplant_new_fluidcap.hmf")); - public static final IModelCustom chemical_plant = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chemical_plant.obj")); - public static final IModelCustom chemfac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chemfac.obj")); - public static final IModelCustom chemical_factory = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chemical_factory.obj")); + public static final IModelCustom chemical_plant = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chemical_plant.obj")).asVBO(); + public static final IModelCustom chemfac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chemfac.obj")).asVBO(); + public static final IModelCustom chemical_factory = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chemical_factory.obj")).asVBO(); + public static final IModelCustom purex = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/purex.obj")).asVBO(); //Mixer public static final IModelCustom mixer = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/mixer.obj")); @@ -574,6 +576,7 @@ public class ResourceManager { public static final ResourceLocation assembler_cog_tex = new ResourceLocation(RefStrings.MODID, "textures/models/assembler_cog_new.png"); public static final ResourceLocation assembler_slider_tex = new ResourceLocation(RefStrings.MODID, "textures/models/assembler_slider_new.png"); public static final ResourceLocation assembler_arm_tex = new ResourceLocation(RefStrings.MODID, "textures/models/assembler_arm_new.png"); + public static final ResourceLocation assembly_machine_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/assembly_machine.png"); public static final ResourceLocation assemfac_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/assemfac.png"); //Chemplant @@ -585,6 +588,7 @@ public class ResourceManager { public static final ResourceLocation chemical_plant_fluid_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/chemical_plant_fluid.png"); public static final ResourceLocation chemfac_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/chemfac.png"); public static final ResourceLocation chemical_factory_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/chemical_factory.png"); + public static final ResourceLocation purex_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/purex.png"); //Mixer public static final ResourceLocation mixer_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/mixer.png"); @@ -903,6 +907,7 @@ public class ResourceManager { public static final IModelCustom aberrator = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/aberrator.obj")).asVBO(); public static final IModelCustom mas36 = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/mas36.obj")).asVBO(); public static final IModelCustom charge_thrower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/charge_thrower.obj")).asVBO(); + public static final IModelCustom n_i_4_n_i = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/n_i_4_n_i.obj")).asVBO(); public static final HashMap spas_12_anim = AnimationLoader.load(new ResourceLocation(RefStrings.MODID, "models/weapons/animations/spas12.json")); public static final HashMap congolake_anim = AnimationLoader.load(new ResourceLocation(RefStrings.MODID, "models/weapons/animations/congolake.json")); @@ -1010,6 +1015,7 @@ public class ResourceManager { public static final ResourceLocation shredder_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/shredder.png"); public static final ResourceLocation shredder_orig_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/shredder_orig.png"); public static final ResourceLocation sexy_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/sexy_real_no_fake.png"); + public static final ResourceLocation heretic_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/sexy_heretic.png"); public static final ResourceLocation whiskey_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/whiskey.png"); public static final ResourceLocation quadro_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/quadro.png"); public static final ResourceLocation quadro_rocket_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/quadro_rocket.png"); @@ -1039,6 +1045,8 @@ public class ResourceManager { public static final ResourceLocation charge_thrower_hook_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/charge_thrower_hook.png"); public static final ResourceLocation charge_thrower_mortar_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/charge_thrower_mortar.png"); public static final ResourceLocation charge_thrower_rocket_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/charge_thrower_rocket.png"); + public static final ResourceLocation n_i_4_n_i_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/n_i_4_n_i.png"); + public static final ResourceLocation n_i_4_n_i_greyscale_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/n_i_4_n_i_greyscale.png"); public static final ResourceLocation lance_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lance.png"); @@ -1188,11 +1196,9 @@ public class ResourceManager { public static final IModelCustom launch_table_small_scaffold_empty = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/launch_table/launch_table_small_scaffold_empty.obj")); public static final IModelCustom mp_t_10_kerosene = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_10_kerosene.obj")); - public static final IModelCustom mp_t_10_kerosene_tec = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_10_kerosene_tec.obj")); public static final IModelCustom mp_t_10_solid = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_10_solid.obj")); public static final IModelCustom mp_t_10_xenon = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_10_xenon.obj")); public static final IModelCustom mp_t_15_kerosene = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_15_kerosene.obj")); - public static final IModelCustom mp_t_15_kerosene_tec = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_15_kerosene_tec.obj")); public static final IModelCustom mp_t_15_kerosene_dual = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_15_kerosene_dual.obj")); public static final IModelCustom mp_t_15_kerosene_triple = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_15_kerosene_triple.obj")); public static final IModelCustom mp_t_15_solid = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_t_15_solid.obj")); @@ -1220,7 +1226,6 @@ public class ResourceManager { public static final IModelCustom mp_f_15_kerosene = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_f_15_kerosene.obj")); public static final IModelCustom mp_f_15_hydrogen = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_f_15_hydrogen.obj")); public static final IModelCustom mp_f_15_20_kerosene = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_f_15_20_kerosene.obj")); - public static final IModelCustom mp_f_20 = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_f_20.obj")); public static final IModelCustom mp_w_10_he = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_10_he.obj")); public static final IModelCustom mp_w_10_incendiary = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_10_incendiary.obj")); @@ -1235,7 +1240,6 @@ public class ResourceManager { public static final IModelCustom mp_w_15_n2 = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_15_n2.obj")); public static final IModelCustom mp_w_15_balefire = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_15_balefire.obj")); public static final IModelCustom mp_w_15_turbine = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_15_turbine.obj")); - public static final IModelCustom mp_w_20 = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_parts/mp_w_20.obj")); //Carts public static final IModelCustom cart = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/vehicles/cart.obj")); @@ -1563,10 +1567,12 @@ public class ResourceManager { public static final IModelCustom rbmk_rods_vbo = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/rbmk/rbmk_rods.obj")).asVBO(); public static final IModelCustom rbmk_crane_console = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/rbmk/crane_console.obj")).asVBO(); public static final IModelCustom rbmk_crane = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/rbmk/crane.obj")).asVBO(); + public static final IModelCustom rbmk_autoloader = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/rbmk/autoloader.obj")).asVBO(); public static final IModelCustom rbmk_console = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/rbmk/rbmk_console.obj")).asVBO(); public static final IModelCustom rbmk_debris = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/rbmk/debris.obj")); public static final ResourceLocation rbmk_crane_console_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/crane_console.png"); public static final ResourceLocation rbmk_crane_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/rbmk_crane.png"); + public static final ResourceLocation rbmk_autoloader_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/rbmk_autoloader.png"); public static final ResourceLocation rbmk_console_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/rbmk_control.png"); public static final IModelCustom hev_battery = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/battery.obj")); public static final IModelCustom anvil = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/anvil.obj")); diff --git a/src/main/java/com/hbm/main/ServerProxy.java b/src/main/java/com/hbm/main/ServerProxy.java index 7ec6eaa23..271a21759 100644 --- a/src/main/java/com/hbm/main/ServerProxy.java +++ b/src/main/java/com/hbm/main/ServerProxy.java @@ -32,8 +32,7 @@ public class ServerProxy { public static final int ID_FLUID_ID = 9; public static final int ID_FAN_MODE = 10; public static final int ID_TOOLABILITY = 11; - public static final int ID_GUN_MODE = 12; - public static final int ID_GAS_HAZARD = 13; + public static final int ID_GAS_HAZARD = 12; public ITranslate getI18n() { return I18N; } diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index ca0cf2ad2..35ec8a792 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -1,7 +1,7 @@ package com.hbm.main; import com.hbm.lib.RefStrings; -import com.hbm.world.gen.NBTStructure; +import com.hbm.world.gen.nbt.NBTStructure; import net.minecraft.util.ResourceLocation; @@ -53,7 +53,6 @@ public class StructureManager { - public static final NBTStructure vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/vertibird.nbt")); public static final NBTStructure crashed_vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/crashed-vertibird.nbt")); public static final NBTStructure aircraft_carrier = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/aircraft_carrier.nbt")); @@ -61,6 +60,18 @@ public class StructureManager { public static final NBTStructure beached_patrol = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/beached_patrol.nbt")); public static final NBTStructure lighthouse = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/lighthouse.nbt")); public static final NBTStructure dish = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/dish.nbt")); + public static final NBTStructure radio_house = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/radio_house.nbt")); + + public static final NBTStructure ntmruinsA = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsA.nbt")); + public static final NBTStructure ntmruinsB = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsB.nbt")); + public static final NBTStructure ntmruinsC = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsC.nbt")); + public static final NBTStructure ntmruinsD = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsD.nbt")); + public static final NBTStructure ntmruinsE = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsE.nbt")); + public static final NBTStructure ntmruinsF = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsF.nbt")); + public static final NBTStructure ntmruinsG = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsG.nbt")); + public static final NBTStructure ntmruinsH = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsH.nbt")); + public static final NBTStructure ntmruinsI = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsI.nbt")); + public static final NBTStructure ntmruinsJ = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/ntmruinsJ.nbt")); public static final NBTStructure forest_post = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/forest_post.nbt")); @@ -70,5 +81,7 @@ public class StructureManager { // public static final NBTStructure test_jigsaw = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw.nbt")); // public static final NBTStructure test_jigsaw_core = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw-core.nbt")); // public static final NBTStructure test_jigsaw_hall = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw-hall.nbt")); + // public static final NBTStructure test_tandem_core = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-tandem-core.nbt")); + // public static final NBTStructure test_tandem = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-tandem.nbt")); } diff --git a/src/main/java/com/hbm/module/ModulePatternMatcher.java b/src/main/java/com/hbm/module/ModulePatternMatcher.java index ecde925fa..37004116d 100644 --- a/src/main/java/com/hbm/module/ModulePatternMatcher.java +++ b/src/main/java/com/hbm/module/ModulePatternMatcher.java @@ -139,8 +139,8 @@ public class ModulePatternMatcher { } switch(mode) { - case MODE_EXACT: return input.isItemEqual(filter) && ItemStack.areItemStackTagsEqual(input, filter); - case MODE_WILDCARD: return input.getItem() == filter.getItem() && ItemStack.areItemStackTagsEqual(input, filter); + case MODE_EXACT: return input.isItemEqual(filter)/* && ItemStack.areItemStackTagsEqual(input, filter)*/; + case MODE_WILDCARD: return input.getItem() == filter.getItem()/* && ItemStack.areItemStackTagsEqual(input, filter)*/; case MODE_BEDROCK: if(input.getItem() != filter.getItem()) return false; if(!(input.getItem() instanceof ItemBedrockOreNew)) return false; diff --git a/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java b/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java new file mode 100644 index 000000000..8b52114ee --- /dev/null +++ b/src/main/java/com/hbm/module/machine/ModuleMachineAssembler.java @@ -0,0 +1,39 @@ +package com.hbm.module.machine; + +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.recipes.AssemblyMachineRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; +import com.hbm.util.BobMathUtil; + +import api.hbm.energymk2.IEnergyHandlerMK2; +import net.minecraft.item.ItemStack; + +public class ModuleMachineAssembler extends ModuleMachineBase { + + public ModuleMachineAssembler(int index, IEnergyHandlerMK2 battery, ItemStack[] slots) { + super(index, battery, slots); + this.inputSlots = new int[12]; + this.outputSlots = new int[1]; + this.inputTanks = new FluidTank[1]; + this.outputTanks = new FluidTank[1]; + } + + @Override + public GenericRecipes getRecipeSet() { + return AssemblyMachineRecipes.INSTANCE; + } + + @Override + public void setupTanks(GenericRecipe recipe) { + super.setupTanks(recipe); + if(recipe == null) return; + for(int i = 0; i < inputTanks.length; i++) if(recipe.inputFluid != null && recipe.inputFluid.length > i) inputTanks[i].changeTankSize(BobMathUtil.max(inputTanks[i].getFill(), recipe.inputFluid[i].fill * 2, 4_000)); + for(int i = 0; i < outputTanks.length; i++) if(recipe.outputFluid != null && recipe.outputFluid.length > i) outputTanks[i].changeTankSize(BobMathUtil.max(outputTanks[i].getFill(), recipe.outputFluid[i].fill * 2, 4_000)); + } + + public ModuleMachineAssembler itemInput(int from) { for(int i = 0; i < inputSlots.length; i++) inputSlots[i] = from + i; return this; } + public ModuleMachineAssembler itemOutput(int a) { outputSlots[0] = a; return this; } + public ModuleMachineAssembler fluidInput(FluidTank a) { inputTanks[0] = a; return this; } + public ModuleMachineAssembler fluidOutput(FluidTank a) { outputTanks[0] = a; return this; } +} diff --git a/src/main/java/com/hbm/module/ModuleMachineChemplant.java b/src/main/java/com/hbm/module/machine/ModuleMachineBase.java similarity index 68% rename from src/main/java/com/hbm/module/ModuleMachineChemplant.java rename to src/main/java/com/hbm/module/machine/ModuleMachineBase.java index 4c6cbdbcd..0a27c56d6 100644 --- a/src/main/java/com/hbm/module/ModuleMachineChemplant.java +++ b/src/main/java/com/hbm/module/machine/ModuleMachineBase.java @@ -1,9 +1,12 @@ -package com.hbm.module; +package com.hbm.module.machine; + +import java.util.List; import com.hbm.inventory.fluid.tank.FluidTank; -import com.hbm.inventory.recipes.ChemicalPlantRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; import com.hbm.inventory.recipes.loader.GenericRecipes.IOutput; +import com.hbm.items.machine.ItemBlueprints; import api.hbm.energymk2.IEnergyHandlerMK2; import cpw.mods.fml.common.network.ByteBufUtils; @@ -11,22 +14,16 @@ import io.netty.buffer.ByteBuf; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -/** - * Option 1: Make a base class with weird arbitrary overrides to define shit like slots for multi machines like the chemfac - * Option 2: Make an easy to define module which can be used by whatever needs it, hypothetically allowing a mixed recipe machine. - * In the hudson bay, you know how we do it. - * @author hbm - */ -public class ModuleMachineChemplant { +public abstract class ModuleMachineBase { // setup public int index; public IEnergyHandlerMK2 battery; public ItemStack[] slots; - public int[] inputSlots = new int[3]; - public int[] outputSlots = new int[3]; - public FluidTank[] inputTanks = new FluidTank[3]; - public FluidTank[] outputTanks = new FluidTank[3]; + public int[] inputSlots; + public int[] outputSlots; + public FluidTank[] inputTanks; + public FluidTank[] outputTanks; // running vars public String recipe = "null"; public double progress; @@ -34,7 +31,7 @@ public class ModuleMachineChemplant { public boolean didProcess = false; public boolean markDirty = false; - public ModuleMachineChemplant(int index, IEnergyHandlerMK2 battery, ItemStack[] slots) { + public ModuleMachineBase(int index, IEnergyHandlerMK2 battery, ItemStack[] slots) { this.index = index; this.battery = battery; this.slots = slots; @@ -43,13 +40,28 @@ public class ModuleMachineChemplant { /** Chances tank type and pressure based on recipe */ public void setupTanks(GenericRecipe recipe) { if(recipe == null) return; - for(int i = 0; i < 3; i++) if(recipe.inputFluid != null && recipe.inputFluid.length > i) inputTanks[i].conform(recipe.inputFluid[i]); else inputTanks[i].resetTank(); - for(int i = 0; i < 3; i++) if(recipe.outputFluid != null && recipe.outputFluid.length > i) outputTanks[i].conform(recipe.outputFluid[i]); else outputTanks[i].resetTank(); + for(int i = 0; i < inputTanks.length; i++) if(recipe.inputFluid != null && recipe.inputFluid.length > i) inputTanks[i].conform(recipe.inputFluid[i]); else inputTanks[i].resetTank(); + for(int i = 0; i < outputTanks.length; i++) if(recipe.outputFluid != null && recipe.outputFluid.length > i) outputTanks[i].conform(recipe.outputFluid[i]); else outputTanks[i].resetTank(); } /** Expects the tanks to be set up correctly beforehand */ public boolean canProcess(GenericRecipe recipe, double speed, double power) { if(recipe == null) return false; + + // auto switch functionality + if(recipe.autoSwitchGroup != null && slots[inputSlots[0]] != null) { + ItemStack itemToSwitchBy = slots[inputSlots[0]]; + List recipes = (List) this.getRecipeSet().autoSwitchGroups.get(recipe.autoSwitchGroup); + if(recipes != null) for(GenericRecipe nextRec : recipes) { + if(nextRec.getInternalName().equals(this.recipe)) continue; + if(nextRec.inputItem == null) continue; + if(nextRec.inputItem[0].matchesRecipe(itemToSwitchBy, true)) { // perform the switch + this.recipe = nextRec.getInternalName(); + return false; // cancel the recipe this tick since we need to do the previous checking all over again + } + } + } + if(power != 1 && battery.getPower() < recipe.power * power) return false; // only check with floating point numbers if mult is not 1 if(power == 1 && battery.getPower() < recipe.power) return false; @@ -115,7 +127,7 @@ public class ModuleMachineChemplant { if(slots[outputSlots[i]] == null) { slots[outputSlots[i]] = collapse; } else { - slots[outputSlots[i]].stackSize += collapse.stackSize; // we can do this because we've already established that the result slot is not null if it's a single output + if(collapse != null) slots[outputSlots[i]].stackSize += collapse.stackSize; // we can do this because we've already established that the result slot is not null if it's a single output } } } @@ -134,9 +146,23 @@ public class ModuleMachineChemplant { this.progress = 0D; } } + + public GenericRecipe getRecipe() { + return (GenericRecipe) getRecipeSet().recipeNameMap.get(this.recipe); + } - public void update(double speed, double power, boolean extraCondition) { - GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(this.recipe); + public abstract GenericRecipes getRecipeSet(); + + public void update(double speed, double power, boolean extraCondition, ItemStack blueprint) { + GenericRecipe recipe = getRecipe(); + + if(recipe != null && recipe.isPooled() && !recipe.isPartOfPool(ItemBlueprints.grabPool(blueprint))) { + this.didProcess = false; + this.progress = 0F; + this.recipe = "null"; + return; + } + this.setupTanks(recipe); this.didProcess = false; @@ -152,7 +178,7 @@ public class ModuleMachineChemplant { /** For item IO, instead of the TE doing all the work it only has to handle non-recipe stuff, the module does the rest */ public boolean isItemValid(int slot, ItemStack stack) { - GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(this.recipe); + GenericRecipe recipe = getRecipe(); if(recipe == null) return false; if(recipe.inputItem == null) return false; @@ -160,13 +186,18 @@ public class ModuleMachineChemplant { if(inputSlots[i] == slot && recipe.inputItem[i].matchesRecipe(stack, true)) return true; } + if(recipe.autoSwitchGroup != null) { + List recipes = (List) this.getRecipeSet().autoSwitchGroups.get(recipe.autoSwitchGroup); // why the FUCK does this need a cast + if(recipes != null) for(GenericRecipe newRec : recipes) { + if(newRec.inputItem == null) continue; + if(inputSlots[0] == slot && newRec.inputItem[0].matchesRecipe(stack, true)) { + return true; + } + } + } + return false; } - - public ModuleMachineChemplant itemInput(int a, int b, int c) { inputSlots[0] = a; inputSlots[1] = b; inputSlots[2] = c; return this; } - public ModuleMachineChemplant itemOutput(int a, int b, int c) { outputSlots[0] = a; outputSlots[1] = b; outputSlots[2] = c; return this; } - public ModuleMachineChemplant fluidInput(FluidTank a, FluidTank b, FluidTank c) { inputTanks[0] = a; inputTanks[1] = b; inputTanks[2] = c; return this; } - public ModuleMachineChemplant fluidOutput(FluidTank a, FluidTank b, FluidTank c) { outputTanks[0] = a; outputTanks[1] = b; outputTanks[2] = c; return this; } public void serialize(ByteBuf buf) { buf.writeDouble(progress); diff --git a/src/main/java/com/hbm/module/machine/ModuleMachineChemplant.java b/src/main/java/com/hbm/module/machine/ModuleMachineChemplant.java new file mode 100644 index 000000000..facd2bfde --- /dev/null +++ b/src/main/java/com/hbm/module/machine/ModuleMachineChemplant.java @@ -0,0 +1,35 @@ +package com.hbm.module.machine; + +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.recipes.ChemicalPlantRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipes; + +import api.hbm.energymk2.IEnergyHandlerMK2; +import net.minecraft.item.ItemStack; + +/** + * Option 1: Make a base class with weird arbitrary overrides to define shit like slots for multi machines like the chemfac + * Option 2: Make an easy to define module which can be used by whatever needs it, hypothetically allowing a mixed recipe machine. + * In the hudson bay, you know how we do it. + * @author hbm + */ +public class ModuleMachineChemplant extends ModuleMachineBase { + + public ModuleMachineChemplant(int index, IEnergyHandlerMK2 battery, ItemStack[] slots) { + super(index, battery, slots); + this.inputSlots = new int[3]; + this.outputSlots = new int[3]; + this.inputTanks = new FluidTank[3]; + this.outputTanks = new FluidTank[3]; + } + + @Override + public GenericRecipes getRecipeSet() { + return ChemicalPlantRecipes.INSTANCE; + } + + public ModuleMachineChemplant itemInput(int a, int b, int c) { inputSlots[0] = a; inputSlots[1] = b; inputSlots[2] = c; return this; } + public ModuleMachineChemplant itemOutput(int a, int b, int c) { outputSlots[0] = a; outputSlots[1] = b; outputSlots[2] = c; return this; } + public ModuleMachineChemplant fluidInput(FluidTank a, FluidTank b, FluidTank c) { inputTanks[0] = a; inputTanks[1] = b; inputTanks[2] = c; return this; } + public ModuleMachineChemplant fluidOutput(FluidTank a, FluidTank b, FluidTank c) { outputTanks[0] = a; outputTanks[1] = b; outputTanks[2] = c; return this; } +} diff --git a/src/main/java/com/hbm/module/machine/ModuleMachinePUREX.java b/src/main/java/com/hbm/module/machine/ModuleMachinePUREX.java new file mode 100644 index 000000000..107a6d05e --- /dev/null +++ b/src/main/java/com/hbm/module/machine/ModuleMachinePUREX.java @@ -0,0 +1,29 @@ +package com.hbm.module.machine; + +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.recipes.PUREXRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipes; + +import api.hbm.energymk2.IEnergyHandlerMK2; +import net.minecraft.item.ItemStack; + +public class ModuleMachinePUREX extends ModuleMachineBase { + + public ModuleMachinePUREX(int index, IEnergyHandlerMK2 battery, ItemStack[] slots) { + super(index, battery, slots); + this.inputSlots = new int[3]; + this.outputSlots = new int[6]; + this.inputTanks = new FluidTank[3]; + this.outputTanks = new FluidTank[1]; + } + + @Override + public GenericRecipes getRecipeSet() { + return PUREXRecipes.INSTANCE; + } + + public ModuleMachinePUREX itemInput(int start) { for(int i = 0; i < inputSlots.length; i++) inputSlots[i] = start + i; return this; } + public ModuleMachinePUREX itemOutput(int start) { for(int i = 0; i < outputSlots.length; i++) outputSlots[i] = start + i; return this; } + public ModuleMachinePUREX fluidInput(FluidTank a, FluidTank b, FluidTank c) { inputTanks[0] = a; inputTanks[1] = b; inputTanks[2] = c; return this; } + public ModuleMachinePUREX fluidOutput(FluidTank a) { outputTanks[0] = a; return this; } +} diff --git a/src/main/java/com/hbm/packet/PacketDispatcher.java b/src/main/java/com/hbm/packet/PacketDispatcher.java index 21dd1fd2b..524319f01 100644 --- a/src/main/java/com/hbm/packet/PacketDispatcher.java +++ b/src/main/java/com/hbm/packet/PacketDispatcher.java @@ -53,8 +53,6 @@ public class PacketDispatcher { wrapper.registerMessage(NBTControlPacket.Handler.class, NBTControlPacket.class, i++, Side.SERVER); //Packet to send for anvil recipes to be crafted wrapper.registerMessage(AnvilCraftPacket.Handler.class, AnvilCraftPacket.class, i++, Side.SERVER); - //Sends a funi text to display like a music disc announcement - wrapper.registerMessage(TEDoorAnimationPacket.Handler.class, TEDoorAnimationPacket.class, i++, Side.CLIENT); //Does ExVNT standard player knockback wrapper.registerMessage(ExplosionKnockbackPacket.Handler.class, ExplosionKnockbackPacket.class, i++, Side.CLIENT); //just go fuck yourself already @@ -69,6 +67,8 @@ public class PacketDispatcher { wrapper.registerMessage(BufPacket.Handler.class, BufPacket.class, i++, Side.CLIENT); //Syncs server recipe configs to the client wrapper.registerMessage(SerializableRecipePacket.Handler.class, SerializableRecipePacket.class, i++, Side.CLIENT); + //Syncing of NBT for guns + wrapper.registerMessage(HeldItemNBTPacket.Handler.class, HeldItemNBTPacket.class, i++, Side.CLIENT); } } diff --git a/src/main/java/com/hbm/packet/toclient/HeldItemNBTPacket.java b/src/main/java/com/hbm/packet/toclient/HeldItemNBTPacket.java new file mode 100644 index 000000000..45bf21e45 --- /dev/null +++ b/src/main/java/com/hbm/packet/toclient/HeldItemNBTPacket.java @@ -0,0 +1,68 @@ +package com.hbm.packet.toclient; + +import com.hbm.util.BufferUtil; + +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 cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +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; + +public class HeldItemNBTPacket implements IMessage { + + private ItemStack stack; + + public HeldItemNBTPacket() { } + + public HeldItemNBTPacket(ItemStack stack) { + this.stack = stack; + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeShort(Item.getIdFromItem(stack.getItem())); + buf.writeByte(stack.stackSize); + buf.writeShort(stack.getItemDamage()); + NBTTagCompound nbtTagCompound = null; + nbtTagCompound = stack.stackTagCompound; + BufferUtil.writeNBT(buf, nbtTagCompound); + } + + @Override + public void fromBytes(ByteBuf buf) { + short id = buf.readShort(); + if(id >= 0) { + byte quantity = buf.readByte(); + short meta = buf.readShort(); + stack = new ItemStack(Item.getItemById(id), quantity, meta); + stack.stackTagCompound = BufferUtil.readNBT(buf); + } + } + + public static class Handler implements IMessageHandler { + + @Override + @SideOnly(Side.CLIENT) + public IMessage onMessage(HeldItemNBTPacket m, MessageContext ctx) { + try { + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + if(m.stack == null) return null; + + ItemStack held = player.getHeldItem(); + if(held == null) return null; + if(held.getItem() != m.stack.getItem()) return null; + if(held.getItemDamage() != m.stack.getItemDamage()) return null; + + held.stackTagCompound = m.stack.stackTagCompound; + + } catch(Exception x) { } finally { } + return null; + } + } +} diff --git a/src/main/java/com/hbm/packet/toclient/TEDoorAnimationPacket.java b/src/main/java/com/hbm/packet/toclient/TEDoorAnimationPacket.java deleted file mode 100644 index 3511f0d07..000000000 --- a/src/main/java/com/hbm/packet/toclient/TEDoorAnimationPacket.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.hbm.packet.toclient; - -import com.hbm.interfaces.IAnimatedDoor; - -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 cpw.mods.fml.relauncher.SideOnly; -import io.netty.buffer.ByteBuf; -import net.minecraft.client.Minecraft; -import net.minecraft.tileentity.TileEntity; - -public class TEDoorAnimationPacket implements IMessage { - - public int x, y, z; - public byte state; - public byte skinIndex; - public byte texture; - - public TEDoorAnimationPacket() { - } - - public TEDoorAnimationPacket(int x, int y, int z, byte state) { - this(x, y, z, state, (byte) 0, (byte) -1); - } - - public TEDoorAnimationPacket(int x, int y, int z, byte state, byte skinIndex, byte tex) { - this.x = x; - this.y = y; - this.z = z; - this.state = state; - this.skinIndex = skinIndex; - this.texture = tex; - } - - @Override - public void fromBytes(ByteBuf buf) { - x = buf.readInt(); - y = buf.readInt(); - z = buf.readInt(); - state = buf.readByte(); - skinIndex = buf.readByte(); - if(buf.readableBytes() == 1){ - texture = buf.readByte(); - } - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(x); - buf.writeInt(y); - buf.writeInt(z); - buf.writeByte(state); - buf.writeByte(skinIndex); - if(texture != -1){ - buf.writeByte(texture); - } - } - - public static class Handler implements IMessageHandler { - - @Override - @SideOnly(Side.CLIENT) - public IMessage onMessage(TEDoorAnimationPacket m, MessageContext ctx) { - - TileEntity te = Minecraft.getMinecraft().theWorld.getTileEntity(m.x, m.y, m.z); - if(te instanceof IAnimatedDoor){ - ((IAnimatedDoor) te).handleNewState(m.state); - ((IAnimatedDoor) te).setSkinIndex(m.skinIndex); - ((IAnimatedDoor) te).setTextureState(m.texture); - } - - return null; - } - } -} diff --git a/src/main/java/com/hbm/particle/ParticleFlamethrower.java b/src/main/java/com/hbm/particle/ParticleFlamethrower.java index 5477c95b7..2b665ef28 100644 --- a/src/main/java/com/hbm/particle/ParticleFlamethrower.java +++ b/src/main/java/com/hbm/particle/ParticleFlamethrower.java @@ -73,7 +73,7 @@ public class ParticleFlamethrower extends EntityFXRotating { tess.setColorRGBA_F(this.particleRed - add, this.particleGreen - add * 0.75F, this.particleBlue, this.particleAlpha); } else if(type == FlameCreator.META_BLACK) { this.particleAlpha = (float) (1 - ageScaled); - float add = (float) ageScaled * 4F - 1F; + float add = (float) ageScaled * 2F - 0.25F; tess.setColorRGBA_F(this.particleRed - add * 0.75F, this.particleGreen - add, this.particleBlue - add * 0.5F, this.particleAlpha); } else { this.particleAlpha = (float) Math.pow(1 - Math.min(ageScaled, 1), 0.5); diff --git a/src/main/java/com/hbm/qmaw/GuiQMAW.java b/src/main/java/com/hbm/qmaw/GuiQMAW.java index b579a846e..e98d4e476 100644 --- a/src/main/java/com/hbm/qmaw/GuiQMAW.java +++ b/src/main/java/com/hbm/qmaw/GuiQMAW.java @@ -1,5 +1,344 @@ package com.hbm.qmaw; -public class GuiQMAW { +import java.util.ArrayList; +import java.util.List; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; +import com.hbm.qmaw.components.*; + +import cpw.mods.fml.common.FMLCommonHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.resources.LanguageManager; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; + +public class GuiQMAW extends GuiScreen { + + protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_wiki.png"); + + public String title; + public String qmawID; + public ItemStack icon; + public List> lines = new ArrayList(); + /** History for returning via button */ + public List back = new ArrayList(); + public List forward = new ArrayList(); + + protected int xSize = 340; + protected int ySize = 224; + protected int guiLeft; + protected int guiTop; + + protected boolean isDragging = false; + protected int scrollProgress = 0; + protected int lastClickX = 0; + protected int lastClickY = 0; + + public static final String EN_US = "en_US"; + + public GuiQMAW(QuickManualAndWiki qmaw) { + qmawID = qmaw.name; + parseQMAW(qmaw); + } + + protected void parseQMAW(QuickManualAndWiki qmaw) { + LanguageManager lang = Minecraft.getMinecraft().getLanguageManager(); + + this.title = qmaw.title.get(lang.getCurrentLanguage().getLanguageCode()); + if(title == null) this.title = qmaw.title.get(EN_US); + if(title == null) this.title = "Missing Localization!"; + + this.icon = qmaw.icon; + + String toParse = qmaw.contents.get(lang.getCurrentLanguage().getLanguageCode()); + if(toParse == null) toParse = qmaw.contents.get(EN_US); + if(toParse == null) toParse = "Missing Localization!"; + toParse = "" + toParse; // strings are reference types, no? + + int maxLineLength = xSize - 29; + String prevToParse = "" + toParse; + int maxIterations = 1000; + int currentLineWidth = 0; + + while(!toParse.isEmpty() && maxIterations > 0) { + if(this.lines.isEmpty()) this.lines.add(new ArrayList()); + List currentLine = this.lines.get(this.lines.size() - 1); + + toParse = toParse.trim(); + + maxIterations--; + + if(toParse.startsWith("
")) { + toParse = toParse.substring(4); + currentLine = new ArrayList(); + this.lines.add(currentLine); + currentLineWidth = 0; + continue; + } + + // handle links + if(toParse.startsWith("[[")) { + int end = toParse.indexOf("]]"); + if(end != -1) { + String link = toParse.substring(2, end); + toParse = toParse.substring(end + 2); + + int pipe = link.indexOf("|"); + QComponentLink linkComponent; + + String suffix = toParse.startsWith(" ") ? " " : ""; + + if(pipe == -1) { + linkComponent = new QComponentLink(link, link + suffix); + } else { + linkComponent = new QComponentLink(link.substring(pipe + 1, link.length()), link.substring(0, pipe) + suffix); + } + + // append to current line + int width = linkComponent.getWidth(); + if(width + currentLineWidth <= maxLineLength) { + currentLine.add(linkComponent); + currentLineWidth += width; + // new line + } else { + currentLine = new ArrayList(); + this.lines.add(currentLine); + currentLine.add(linkComponent); + currentLineWidth = width; + } + + prevToParse = "" + toParse; + continue; + } + } + + // handle standard text + int delimit = toParse.length(); + + int spaceIndex = toParse.indexOf(" "); + if(spaceIndex != -1) delimit = Math.min(delimit, spaceIndex); + int linkIndex = toParse.indexOf("[["); + if(linkIndex != -1) delimit = Math.min(delimit, linkIndex); + int brIndex = toParse.indexOf("
"); + if(brIndex != -1) delimit = Math.min(delimit, brIndex); + + if(delimit > 0) { + QComponentText textComponent = new QComponentText(toParse.substring(0, delimit) + (spaceIndex == delimit ? " " : "")); + toParse = toParse.substring(delimit); + + // append to current line + int width = textComponent.getWidth(); + if(width + currentLineWidth <= maxLineLength) { + currentLine.add(textComponent); + currentLineWidth += width; + // new line + } else { + currentLine = new ArrayList(); + this.lines.add(currentLine); + currentLine.add(textComponent); + currentLineWidth = width; + } + + prevToParse = "" + toParse; + continue; + } + + if(toParse.equals(prevToParse)) break; + prevToParse = "" + toParse; + } + } + + @Override + public void initGui() { + super.initGui(); + this.guiLeft = (this.width - this.xSize) / 2; + this.guiTop = (this.height - this.ySize) / 2; + } + + @Override + protected void mouseClicked(int x, int y, int key) { + super.mouseClicked(x, y, key); + + if(key == 0) { + this.lastClickX = x; + this.lastClickY = y; + } + + if(guiLeft + 3 <= x && guiLeft + 3 + 18 > x && guiTop + 3 < y && guiTop + 3 + 18 >= y) back(); + if(guiLeft + 21 <= x && guiLeft + 21 + 18 > x && guiTop + 3 < y && guiTop + 3 + 18 >= y) forward(); + } + + public void back() { + if(this.back.isEmpty()) return; + + String prev = back.get(back.size() - 1); + + QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(prev); + if(qmaw != null) { + Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + GuiQMAW screen = new GuiQMAW(qmaw); + screen.back.addAll(back); + screen.back.remove(screen.back.size() - 1); + screen.forward.addAll(forward); + screen.forward.add(qmawID); + FMLCommonHandler.instance().showGuiScreen(screen); + } + } + + public void forward() { + if(this.forward.isEmpty()) return; + + String next = forward.get(forward.size() - 1); + + QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(next); + if(qmaw != null) { + Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + GuiQMAW screen = new GuiQMAW(qmaw); + screen.back.addAll(back); + screen.back.add(qmawID); + screen.forward.addAll(forward); + screen.forward.remove(screen.forward.size() - 1); + FMLCommonHandler.instance().showGuiScreen(screen); + } + } + + public int getSliderPosition() { + double progress = (double) scrollProgress / (double) (lines.size() - 1); + return 25 + (int) (progress * 180); + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + + if(Mouse.isButtonDown(0) && guiLeft + xSize - 15 <= mouseX && guiLeft + xSize - 15 + 12 > mouseX && guiTop + 25 < mouseY && guiTop + 25 + 191 >= mouseY) { + isDragging = true; + } + + if(!Mouse.isButtonDown(0)) isDragging = false; + + if(isDragging) { + int min = guiTop + 25 + 8; + int max = guiTop + 25 + 191 - 8; + int span = max - min; + + double progress = MathHelper.clamp_double((double) (mouseY - min) / span, 0D, 1D); + this.scrollProgress = MathHelper.clamp_int((int) Math.round((lines.size() - 1) * progress), 0, lines.size() - 1); + } + + handleScroll(); + + //this.drawRect(0, 0, this.width, this.height, 0x80919191); + this.drawRect(0, 0, this.width, this.height, 0xe0000000); + + this.drawGuiContainerBackgroundLayer(f, mouseX, mouseY); + GL11.glDisable(GL11.GL_LIGHTING); + this.drawGuiContainerForegroundLayer(mouseX, mouseY); + GL11.glEnable(GL11.GL_LIGHTING); + + this.lastClickX = 0; + this.lastClickY = 0; + } + + protected void handleScroll() { + + if(!Mouse.isButtonDown(0) && !Mouse.isButtonDown(1) && Mouse.next()) { + int scroll = Mouse.getEventDWheel(); + if(scroll > 0 && this.scrollProgress > 0) this.scrollProgress--; + if(scroll < 0 && this.scrollProgress < this.lines.size() - 1) this.scrollProgress++; + } + } + + private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { + + int x = 43; + int y = 4; + + if(this.icon != null) { + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_DEPTH_TEST); + Minecraft mc = Minecraft.getMinecraft(); + GL11.glRotated(180, 1, 0, 0); + RenderHelper.enableStandardItemLighting(); + GL11.glRotated(-180, 1, 0, 0); + itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, mc.renderEngine, this.icon, guiLeft + x, guiTop + y); + itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, mc.renderEngine, this.icon, guiLeft + x, guiTop + y, null); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glPopMatrix(); + + x += 18; + y += (16 - this.fontRendererObj.FONT_HEIGHT) / 2; + } + + y += 1; + + this.fontRendererObj.drawString(title, guiLeft + x, guiTop + y, 0xFFFFFF); + } + + private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, 170, ySize); + drawTexturedModalRect(guiLeft + 170, guiTop, 52, 0, 30, ySize); + drawTexturedModalRect(guiLeft + 200, guiTop, 52, 0, 140, ySize); + + if(!back.isEmpty()) drawTexturedModalRect(guiLeft + 3, guiTop + 3, 204, 0, 18, 18); + if(!forward.isEmpty()) drawTexturedModalRect(guiLeft + 21, guiTop + 3, 222, 0, 18, 18); + + // scroll bar + drawTexturedModalRect(guiLeft + xSize - 15, guiTop + getSliderPosition(), 192, 0, 12, 16); + + int x = guiLeft + 7; + int y = guiTop + 30; + int lineNum = 0; + + for(List line : lines) { + lineNum++; + + if(lineNum <= this.scrollProgress) continue; + + int maxHeight = 0; + int inset = 0; + + for(ManualElement element : line) { + maxHeight = Math.max(maxHeight, element.getHeight()); + } + + if(y + maxHeight > guiTop + 219) break; + + if(line.isEmpty()) y += this.fontRendererObj.FONT_HEIGHT; + + for(ManualElement element : line) { + int elementX = x + inset; + int elementY = y + (maxHeight - element.getHeight()) / 2; + boolean mouseOver = (elementX <= mouseX && elementX + element.getWidth() > mouseX && elementY < mouseY && elementY + element.getHeight() >= mouseY); + element.render(mouseOver, elementX, elementY, mouseX, mouseY); + if(elementX <= lastClickX && elementX + element.getWidth() > lastClickX && elementY < lastClickY && elementY + element.getHeight() >= lastClickY) + element.onClick(this); + inset += element.getWidth(); + } + + y += maxHeight + 2; + } + } + + @Override + protected void keyTyped(char typedChar, int keyCode) { + + if(keyCode == Keyboard.KEY_LEFT) back(); + if(keyCode == Keyboard.KEY_RIGHT) forward(); + + if(keyCode == 1 || keyCode == this.mc.gameSettings.keyBindInventory.getKeyCode()) { + this.mc.displayGuiScreen((GuiScreen) null); + this.mc.setIngameFocus(); + } + } } diff --git a/src/main/java/com/hbm/qmaw/ManualElement.java b/src/main/java/com/hbm/qmaw/ManualElement.java index f878bf8ae..92ab74a13 100644 --- a/src/main/java/com/hbm/qmaw/ManualElement.java +++ b/src/main/java/com/hbm/qmaw/ManualElement.java @@ -1,12 +1,9 @@ package com.hbm.qmaw; public abstract class ManualElement { - - public int x; - public int y; public abstract int getWidth(); public abstract int getHeight(); - public abstract void render(boolean isMouseOver, int mouseX, int mouseY); - public abstract void onClick(); + public abstract void render(boolean isMouseOver, int x, int y, int mouseX, int mouseY); + public abstract void onClick(GuiQMAW gui); } diff --git a/src/main/java/com/hbm/qmaw/QMAWLoader.java b/src/main/java/com/hbm/qmaw/QMAWLoader.java index 710511a4b..6e4aeec31 100644 --- a/src/main/java/com/hbm/qmaw/QMAWLoader.java +++ b/src/main/java/com/hbm/qmaw/QMAWLoader.java @@ -1,19 +1,24 @@ package com.hbm.qmaw; -import java.io.File; -import java.io.FileReader; -import java.io.InputStream; -import java.io.InputStreamReader; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; +import java.util.Map.Entry; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.hbm.interfaces.NotableComments; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.recipes.loader.SerializableRecipe; +import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import net.minecraft.client.Minecraft; @@ -23,6 +28,7 @@ import net.minecraft.client.resources.IResourceManager; import net.minecraft.client.resources.IResourceManagerReloadListener; import net.minecraft.client.resources.IResourcePack; import net.minecraft.client.resources.ResourcePackRepository; +import net.minecraft.item.ItemStack; @NotableComments public class QMAWLoader implements IResourceManagerReloadListener { @@ -31,6 +37,7 @@ public class QMAWLoader implements IResourceManagerReloadListener { public static final Gson gson = new Gson(); public static final JsonParser parser = new JsonParser(); public static HashMap qmaw = new HashMap(); + public static HashMap triggers = new HashMap(); @Override public void onResourceManagerReload(IResourceManager resMan) { @@ -39,8 +46,8 @@ public class QMAWLoader implements IResourceManagerReloadListener { init(); MainRegistry.logger.info("[QMAW] Loaded " + qmaw.size() + " manual entries! (" + (System.currentTimeMillis() - timestamp) + "ms)"); } - - /** For the like 2 people who might consider making an NTM addon and want to include manual pages */ + + /** For the like 2 people who might consider making an NTM addon and want to include manual pages. Requires the mod's actual JAR file as the parameter. */ public static void registerModFileURL(File file) { registeredModFiles.add(file); } @@ -48,66 +55,82 @@ public class QMAWLoader implements IResourceManagerReloadListener { /** Searches the asset folder for QMAW format JSON files and adds entries based on that */ public static void init() { - //the mod's file, assuming the mod is a file (not the case in a dev env, fuck!) + /*//the mod's file, assuming the mod is a file (not the case in a dev env, fuck!) //no fucking null check, if this fails then the entire game will sink along with the ship - registerModFileURL(new File(QMAWLoader.class.getProtectionDomain().getCodeSource().getLocation().getPath())); // i am going to shit myself - + String path = QMAWLoader.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + // exclude .class in the case of a dev env + MainRegistry.logger.info("[QMAW] Current running file: " + path); + if(!path.endsWith(".class")) registerModFileURL(new File(path)); // i am going to shit myself*/ // deactivated because it likely doesn't even fucking work + + // registering of the mod file now happens in the MainRegistry during preinit + qmaw.clear(); + triggers.clear(); agonyEngine(); } - - /** "digital equivalent to holywater" yielded few results on google, if only i had the answer i would drown this entire class in it */ + + /** "digital equivalent to holywater" yielded few results on google, if only i had the answer i would drown this entire class in it

+ * This affront to god can load QMAW definition files from four different sources:
+ * * Any mod's jar that has registered itself to include QMAW files
+ * * The dev environment, because "the mod file" would in this case be this very class file, and that's incorrect
+ * * ZIP-based resource packs
+ * * Folder-based resource packs + * */ public static void agonyEngine() { - - for(File modFile : registeredModFiles) dissectZip(modFile); - - File devEnvManualFolder = new File(Minecraft.getMinecraft().mcDataDir.getAbsolutePath().replace("/eclipse/.", "") + "/src/main/resources/assets/hbm/manual"); + + for(File modFile : registeredModFiles) { + logJarAttempt(modFile.getName()); + dissectZip(modFile); + } + + File devEnvManualFolder = new File(Minecraft.getMinecraft().mcDataDir.getAbsolutePath().replace("/eclipse/.".replace('/', File.separatorChar), "") + "/src/main/resources/assets/hbm/manual".replace('/', File.separatorChar)); if(devEnvManualFolder.exists() && devEnvManualFolder.isDirectory()) { MainRegistry.logger.info("[QMAW] Exploring " + devEnvManualFolder.getAbsolutePath()); dissectManualFolder(devEnvManualFolder); } ResourcePackRepository repo = Minecraft.getMinecraft().getResourcePackRepository(); - + for(Object o : repo.getRepositoryEntries()) { ResourcePackRepository.Entry entry = (ResourcePackRepository.Entry) o; IResourcePack pack = entry.getResourcePack(); logPackAttempt(pack.getPackName()); - + if(pack instanceof FileResourcePack) { dissectZip(((FileResourcePack) pack).resourcePackFile); } - + if(pack instanceof FolderResourcePack) { dissectFolder(((FolderResourcePack) pack).resourcePackFile); } } } + public static void logJarAttempt(String name) { MainRegistry.logger.info("[QMAW] Dissecting jar " + name); } public static void logPackAttempt(String name) { MainRegistry.logger.info("[QMAW] Dissecting resource " + name); } public static void logFoundManual(String name) { MainRegistry.logger.info("[QMAW] Found manual " + name); } - + /** You put your white gloves on, you get your hand in there, and then you iterate OVER THE ENTIRE FUCKING ZIP until we find things we deem usable */ public static void dissectZip(File zipFile) { - + if(zipFile == null) { MainRegistry.logger.info("[QMAW] Pack file does not exist!"); return; } - + ZipFile zip = null; - + try { zip = new ZipFile(zipFile); Enumeration enumerator = zip.entries(); - + while(enumerator.hasMoreElements()) { ZipEntry entry = enumerator.nextElement(); String name = entry.getName(); if(name.startsWith("assets/hbm/manual/") && name.endsWith(".json")) { InputStream fileStream = zip.getInputStream(entry); - InputStreamReader reader = new InputStreamReader(fileStream); + InputStreamReader reader = new InputStreamReader(fileStream, StandardCharsets.UTF_8); try { JsonObject obj = (JsonObject) parser.parse(reader); String manName = name.replace("assets/hbm/manual/", ""); @@ -119,7 +142,7 @@ public class QMAWLoader implements IResourceManagerReloadListener { } } } - + } catch(Exception ex) { MainRegistry.logger.info("[QMAW] Error dissecting zip " + zipFile.getName() + ": " + ex); } finally { @@ -128,13 +151,13 @@ public class QMAWLoader implements IResourceManagerReloadListener { } catch(Exception ex) { } } } - + /** Opens a resource pack folder, skips to the manual folder, then tries to dissect that */ public static void dissectFolder(File folder) { - File manualFolder = new File(folder, "/assets/manual"); + File manualFolder = new File(folder, "/assets/hbm/manual"); if(manualFolder.exists() && manualFolder.isDirectory()) dissectManualFolder(manualFolder); } - + /** Anal bleeding */ public static void dissectManualFolder(File folder) { @@ -143,18 +166,60 @@ public class QMAWLoader implements IResourceManagerReloadListener { String name = file.getName(); if(file.isFile() && name.endsWith(".json")) { try { - FileReader reader = new FileReader(file); + //FileReader reader = new FileReader(file); + InputStreamReader reader = new InputStreamReader(Files.newInputStream(file.toPath()), StandardCharsets.UTF_8); JsonObject obj = (JsonObject) parser.parse(reader); registerJson(name, obj); logFoundManual(name); } catch(Exception ex) { MainRegistry.logger.info("[QMAW] Error reading manual " + name + ": " + ex); } + } else if(file.isDirectory()) { + dissectManualFolder(file); // scrape subfolders too lmao } } } - - public static void registerJson(String name, JsonObject json) { - //TBI + + /** Extracts all the info from a json file's main object to add a QMAW to the system. Very barebones, only handles name, icon and the localized text. */ + public static void registerJson(String file, JsonObject json) { + + String name = json.get("name").getAsString(); + + if(QMAWLoader.qmaw.containsKey(name)) { + MainRegistry.logger.info("[QMAW] Skipping existing entry " + file); + return; + } + + QuickManualAndWiki qmaw = new QuickManualAndWiki(name); + + if(json.has("icon")) { + qmaw.setIcon(SerializableRecipe.readItemStack(json.get("icon").getAsJsonArray())); + } + + JsonObject title = json.get("title").getAsJsonObject(); + for(Entry part : title.entrySet()) { + qmaw.addTitle(part.getKey(), part.getValue().getAsString()); + } + + JsonObject content = json.get("content").getAsJsonObject(); + for(Entry part : content.entrySet()) { + qmaw.addLang(part.getKey(), part.getValue().getAsString()); + } + + JsonArray triggers = json.get("trigger").getAsJsonArray(); + + for(JsonElement element : triggers) { + ItemStack trigger = SerializableRecipe.readItemStack(element.getAsJsonArray()); + // items get renamed and removed all the time, so we add some more debug goodness for those cases + if(trigger == null || trigger.getItem() == ModItems.nothing) { + MainRegistry.logger.info("[QMAW] Manual " + file + " references nonexistant trigger " + element.toString()); + } else { + QMAWLoader.triggers.put(new ComparableStack(trigger).makeSingular(), qmaw); + } + } + + if(!qmaw.contents.isEmpty()) { + QMAWLoader.qmaw.put(name, qmaw); + } } } diff --git a/src/main/java/com/hbm/qmaw/QuickManualAndWiki.java b/src/main/java/com/hbm/qmaw/QuickManualAndWiki.java index 7f206bad6..f961cd2fe 100644 --- a/src/main/java/com/hbm/qmaw/QuickManualAndWiki.java +++ b/src/main/java/com/hbm/qmaw/QuickManualAndWiki.java @@ -1,5 +1,33 @@ package com.hbm.qmaw; +import java.util.HashMap; + +import net.minecraft.item.ItemStack; + public class QuickManualAndWiki { + public String name; + public ItemStack icon; + + public HashMap title = new HashMap(); + public HashMap contents = new HashMap(); + + public QuickManualAndWiki(String name) { + this.name = name; + } + + public QuickManualAndWiki setIcon(ItemStack stack) { + this.icon = stack; + return this; + } + + public QuickManualAndWiki addTitle(String lang, String title) { + this.title.put(lang, title); + return this; + } + + public QuickManualAndWiki addLang(String lang, String contents) { + this.contents.put(lang, contents); + return this; + } } diff --git a/src/main/java/com/hbm/qmaw/components/QComponentLink.java b/src/main/java/com/hbm/qmaw/components/QComponentLink.java new file mode 100644 index 000000000..acb4a4c9b --- /dev/null +++ b/src/main/java/com/hbm/qmaw/components/QComponentLink.java @@ -0,0 +1,94 @@ +package com.hbm.qmaw.components; + +import org.lwjgl.opengl.GL11; + +import com.hbm.qmaw.GuiQMAW; +import com.hbm.qmaw.ManualElement; +import com.hbm.qmaw.QMAWLoader; +import com.hbm.qmaw.QuickManualAndWiki; + +import cpw.mods.fml.common.FMLCommonHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +public class QComponentLink extends ManualElement { + + protected String link; + protected ItemStack icon; + protected String text; + protected FontRenderer font; + protected int color = 0x0094FF; + protected int hoverColor = 0xFFD800; + + protected static RenderItem itemRender = new RenderItem(); + + public QComponentLink(String link, String text) { + this.text = text; + this.link = link; + + QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(link); + if(qmaw == null) { + this.color = this.hoverColor = 0xFF7F7F; + } else { + this.icon = qmaw.icon; + } + + this.font = Minecraft.getMinecraft().fontRenderer; + } + + public QComponentLink setColor(int color, int hoverColor) { + this.color = color; + this.hoverColor = hoverColor; + return this; + } + + @Override + public int getWidth() { + return font.getStringWidth(text) + (icon != null ? 18 : 0); + } + + @Override + public int getHeight() { + return Math.max(font.FONT_HEIGHT, icon != null ? 16 : 0); + } + + @Override + public void render(boolean isMouseOver, int x, int y, int mouseX, int mouseY) { + + if(this.icon != null) { + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_DEPTH_TEST); + Minecraft mc = Minecraft.getMinecraft(); + GL11.glRotated(180, 1, 0, 0); + RenderHelper.enableStandardItemLighting(); + GL11.glRotated(-180, 1, 0, 0); + itemRender.renderItemAndEffectIntoGUI(this.font, mc.renderEngine, this.icon, x, y - 1); + itemRender.renderItemOverlayIntoGUI(this.font, mc.renderEngine, this.icon, x, y - 1, null); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glPopMatrix(); + + x += 18; + y += (16 - font.FONT_HEIGHT) / 2; + } + + font.drawString(text, x, y, isMouseOver ? hoverColor : color); + } + + @Override public void onClick(GuiQMAW gui) { + QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(link); + if(qmaw != null) { + Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + GuiQMAW screen = new GuiQMAW(qmaw); + screen.back.addAll(gui.back); + screen.back.add(gui.qmawID); + FMLCommonHandler.instance().showGuiScreen(screen); + } + } +} diff --git a/src/main/java/com/hbm/qmaw/components/QComponentText.java b/src/main/java/com/hbm/qmaw/components/QComponentText.java index fd06d1150..efcb0ffd8 100644 --- a/src/main/java/com/hbm/qmaw/components/QComponentText.java +++ b/src/main/java/com/hbm/qmaw/components/QComponentText.java @@ -1,5 +1,6 @@ package com.hbm.qmaw.components; +import com.hbm.qmaw.GuiQMAW; import com.hbm.qmaw.ManualElement; import net.minecraft.client.Minecraft; @@ -36,9 +37,9 @@ public class QComponentText extends ManualElement { } @Override - public void render(boolean isMouseOver, int mouseX, int mouseY) { + public void render(boolean isMouseOver, int x, int y, int mouseX, int mouseY) { font.drawString(text, x, y, color); } - @Override public void onClick() { } + @Override public void onClick(GuiQMAW gui) { } } diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderCoin.java b/src/main/java/com/hbm/render/entity/projectile/RenderCoin.java new file mode 100644 index 000000000..9948c3573 --- /dev/null +++ b/src/main/java/com/hbm/render/entity/projectile/RenderCoin.java @@ -0,0 +1,39 @@ +package com.hbm.render.entity.projectile; + +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.RefStrings; +import com.hbm.render.loader.HFRWavefrontObject; + +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.IModelCustom; + +public class RenderCoin extends Render { + + public static final IModelCustom coin = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/trinkets/chip.obj")).asVBO(); + public static final ResourceLocation coin_tex = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/chip_gold.png"); + + @Override + public void doRender(Entity coin, double x, double y, double z, float f0, float f1) { + + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + GL11.glRotatef(coin.prevRotationYaw + (coin.rotationYaw - coin.prevRotationYaw) * f1 - 90.0F, 0.0F, -1.0F, 0.0F); + GL11.glRotated((coin.ticksExisted + f1) * 45, 0, 0, 1); + + double scale = 0.125D; + GL11.glScaled(scale, scale, scale); + + this.bindEntityTexture(coin); + this.coin.renderAll(); + + GL11.glPopMatrix(); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + return coin_tex; + } +} diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderFlaregun.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderFlaregun.java index 3bcabc96b..d21439d5d 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderFlaregun.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderFlaregun.java @@ -112,6 +112,13 @@ public class ItemRenderFlaregun extends ItemRenderWeaponBase { GL11.glRotated(90, 0, 1, 0); } + @Override + public void setupEntity(ItemStack stack) { + super.setupEntity(stack); + double scale = 0.5D; + GL11.glScaled(scale, scale, scale); + } + @Override public void renderOther(ItemStack stack, ItemRenderType type) { GL11.glEnable(GL11.GL_LIGHTING); diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderNI4NI.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderNI4NI.java new file mode 100644 index 000000000..ce4f8a846 --- /dev/null +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderNI4NI.java @@ -0,0 +1,189 @@ +package com.hbm.render.item.weapon.sedna; + +import org.lwjgl.opengl.GL11; + +import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.items.weapon.sedna.impl.ItemGunNI4NI; +import com.hbm.main.ResourceManager; +import com.hbm.render.anim.HbmAnimations; +import com.hbm.render.tileentity.RenderArcFurnace; +import com.hbm.util.ColorUtil; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; + +public class ItemRenderNI4NI extends ItemRenderWeaponBase { + + @Override + protected float getTurnMagnitude(ItemStack stack) { return ItemGunBaseNT.getIsAiming(stack) ? 2.5F : -0.25F; } + + @Override + public float getViewFOV(ItemStack stack, float fov) { + float aimingProgress = ItemGunBaseNT.prevAimingProgress + (ItemGunBaseNT.aimingProgress - ItemGunBaseNT.prevAimingProgress) * interp; + return fov * (1 - aimingProgress * 0.33F); + } + + @Override + public void setupFirstPerson(ItemStack stack) { + GL11.glTranslated(0, 0, 1); + + float offset = 0.8F; + standardAimingTransform(stack, + -1.0F * offset, -1F * offset, 1F * offset, + 0, -5 / 8D, 0.125); + } + + @Override + public void renderFirstPerson(ItemStack stack) { + + ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); + + int[] color = ItemGunNI4NI.getColors(stack); + int dark = 0xffffff; + int light = 0xffffff; + int grip = 0xffffff; + if(color != null) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.n_i_4_n_i_greyscale_tex); + dark = color[0]; + light = color[1]; + grip = color[2]; + } else { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.n_i_4_n_i_tex); + } + + double scale = 0.3125D; + GL11.glScaled(scale, scale, scale); + + double[] equip = HbmAnimations.getRelevantTransformation("EQUIP"); + double[] recoil = HbmAnimations.getRelevantTransformation("RECOIL"); + double[] drum = HbmAnimations.getRelevantTransformation("DRUM"); + + GL11.glTranslated(0, 0, -2.25); + GL11.glRotated(equip[0], 1, 0, 0); + GL11.glTranslated(0, 0, 2.25); + + GL11.glTranslated(0, -1, -6); + GL11.glRotated(recoil[0], 1, 0, 0); + GL11.glTranslated(0, 1, 6); + + GL11.glShadeModel(GL11.GL_SMOOTH); + + GL11.glPushMatrix(); + + GL11.glColor3f(ColorUtil.fr(dark), ColorUtil.fg(dark), ColorUtil.fb(dark)); + ResourceManager.n_i_4_n_i.renderPart("FrameDark"); + + GL11.glColor3f(ColorUtil.fr(grip), ColorUtil.fg(grip), ColorUtil.fb(grip)); + ResourceManager.n_i_4_n_i.renderPart("Grip"); + + GL11.glColor3f(ColorUtil.fr(light), ColorUtil.fg(light), ColorUtil.fb(light)); + ResourceManager.n_i_4_n_i.renderPart("FrameLight"); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 1.1875D, 0); + GL11.glRotated(drum[2], 0, 0, 1); + GL11.glTranslated(0, -1.1875D, 0); + ResourceManager.n_i_4_n_i.renderPart("Cylinder"); + RenderArcFurnace.fullbright(true); + GL11.glColor3f(1F, 1F, 1F); + ResourceManager.n_i_4_n_i.renderPart("CylinderHighlights"); + RenderArcFurnace.fullbright(false); + GL11.glPopMatrix(); + + RenderArcFurnace.fullbright(true); + ResourceManager.n_i_4_n_i.renderPart("Barrel"); + + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glColor3f(0F, 1F, 0F); + int coinCount = ItemGunNI4NI.getCoinCount(stack); + if(coinCount > 3) ResourceManager.n_i_4_n_i.renderPart("Coin1"); + if(coinCount > 2) ResourceManager.n_i_4_n_i.renderPart("Coin2"); + if(coinCount > 1) ResourceManager.n_i_4_n_i.renderPart("Coin3"); + if(coinCount > 0) ResourceManager.n_i_4_n_i.renderPart("Coin4"); + GL11.glEnable(GL11.GL_TEXTURE_2D); + + RenderArcFurnace.fullbright(false); + + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 0.75, 4); + GL11.glRotated(90, 0, 1, 0); + GL11.glRotated(90 * gun.shotRand, 1, 0, 0); + GL11.glScaled(0.125, 0.125, 0.125); + this.renderLaserFlash(gun.lastShot[0], 75, 7.5, 0xFFFFFF); + GL11.glPopMatrix(); + + GL11.glPopMatrix(); + } + + @Override + public void setupThirdPerson(ItemStack stack) { + super.setupThirdPerson(stack); + GL11.glTranslated(0, 0.25, 3); + double scale = 1.5D; + GL11.glScaled(scale, scale, scale); + } + + @Override + public void setupInv(ItemStack stack) { + super.setupInv(stack); + double scale = 2.5D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(25, 1, 0, 0); + GL11.glRotated(45, 0, 1, 0); + GL11.glTranslated(0, 0, 0); + } + + @Override + public void setupModTable(ItemStack stack) { + double scale = -15D; + GL11.glScaled(scale, scale, scale); + GL11.glRotated(90, 0, 1, 0); + GL11.glTranslated(0, -0.5, 0); + } + + @Override + public void renderOther(ItemStack stack, ItemRenderType type) { + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glAlphaFunc(GL11.GL_GREATER, 0F); + GL11.glEnable(GL11.GL_ALPHA_TEST); + + int[] color = ItemGunNI4NI.getColors(stack); + int dark = 0xffffff; + int light = 0xffffff; + int grip = 0xffffff; + if(color != null) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.n_i_4_n_i_greyscale_tex); + dark = color[0]; + light = color[1]; + grip = color[2]; + } else { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.n_i_4_n_i_tex); + } + + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glColor3f(ColorUtil.fr(light), ColorUtil.fg(light), ColorUtil.fb(light)); + ResourceManager.n_i_4_n_i.renderPart("FrameLight"); + ResourceManager.n_i_4_n_i.renderPart("Cylinder"); + GL11.glColor3f(ColorUtil.fr(grip), ColorUtil.fg(grip), ColorUtil.fb(grip)); + ResourceManager.n_i_4_n_i.renderPart("Grip"); + GL11.glColor3f(ColorUtil.fr(dark), ColorUtil.fg(dark), ColorUtil.fb(dark)); + ResourceManager.n_i_4_n_i.renderPart("FrameDark"); + GL11.glColor3f(1F, 1F, 1F); + RenderArcFurnace.fullbright(true); + ResourceManager.n_i_4_n_i.renderPart("CylinderHighlights"); + ResourceManager.n_i_4_n_i.renderPart("Barrel"); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glColor3f(0F, 1F, 0F); + ResourceManager.n_i_4_n_i.renderPart("Coin1"); + ResourceManager.n_i_4_n_i.renderPart("Coin2"); + ResourceManager.n_i_4_n_i.renderPart("Coin3"); + ResourceManager.n_i_4_n_i.renderPart("Coin4"); + GL11.glColor3f(1F, 1F, 1F); + GL11.glEnable(GL11.GL_TEXTURE_2D); + RenderArcFurnace.fullbright(false); + GL11.glShadeModel(GL11.GL_FLAT); + } +} diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java index acd889ab4..7c961b43c 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderSexy.java @@ -11,9 +11,16 @@ import com.hbm.util.Vec3NT; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; @NotableComments public class ItemRenderSexy extends ItemRenderWeaponBase { + + protected ResourceLocation texture; + + public ItemRenderSexy(ResourceLocation texture) { + this.texture = texture; + } @Override protected float getTurnMagnitude(ItemStack stack) { return ItemGunBaseNT.getIsAiming(stack) ? 2.5F : -0.25F; } @@ -21,7 +28,7 @@ public class ItemRenderSexy extends ItemRenderWeaponBase { @Override public float getViewFOV(ItemStack stack, float fov) { float aimingProgress = ItemGunBaseNT.prevAimingProgress + (ItemGunBaseNT.aimingProgress - ItemGunBaseNT.prevAimingProgress) * interp; - return fov * (1 - aimingProgress * 0.66F); + return fov * (1 - aimingProgress * 0.33F); } @Override @@ -29,10 +36,6 @@ public class ItemRenderSexy extends ItemRenderWeaponBase { GL11.glTranslated(0, 0, 0.875); float offset = 0.8F; - - /*standardAimingTransform(stack, - -1.25F * offset, -0.75F * offset, 3.25F * offset, - 0, -5.25 / 8D, 1);*/ standardAimingTransform(stack, -1F * offset, -0.75F * offset, 3F * offset, @@ -45,6 +48,7 @@ public class ItemRenderSexy extends ItemRenderWeaponBase { double scale = 0.375D; GL11.glScaled(scale, scale, scale); + // i'm not going overboard with the animation boolean doesCycle = HbmAnimations.getRelevantAnim(0) != null && HbmAnimations.getRelevantAnim(0).animation.getBus("CYCLE") != null; boolean reloading = HbmAnimations.getRelevantAnim(0) != null && HbmAnimations.getRelevantAnim(0).animation.getBus("BELT") != null; boolean useShellCount = HbmAnimations.getRelevantAnim(0) != null && HbmAnimations.getRelevantAnim(0).animation.getBus("SHELLS") != null; @@ -79,7 +83,7 @@ public class ItemRenderSexy extends ItemRenderWeaponBase { GL11.glPopMatrix(); } - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.sexy_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(texture); GL11.glTranslated(0, -1, -8); GL11.glRotated(equip[0], 1, 0, 0); @@ -172,6 +176,13 @@ public class ItemRenderSexy extends ItemRenderWeaponBase { GL11.glPopMatrix(); GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPushMatrix(); + GL11.glTranslated(0, 0, 8); + GL11.glRotated(90, 0, 1, 0); + GL11.glRotated(90 * gun.shotRand, 1, 0, 0); + this.renderMuzzleFlash(gun.lastShot[0], 150, 7.5); + GL11.glPopMatrix(); } @Override @@ -205,7 +216,7 @@ public class ItemRenderSexy extends ItemRenderWeaponBase { GL11.glEnable(GL11.GL_LIGHTING); GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.sexy_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(texture); ResourceManager.sexy.renderPart("Gun"); ResourceManager.sexy.renderPart("Barrel"); ResourceManager.sexy.renderPart("RecoilSpring"); diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java index cc7ba4b30..3abb3a71c 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java @@ -344,6 +344,7 @@ public abstract class ItemRenderWeaponBase implements IItemRenderer { if(System.currentTimeMillis() - lastShot < flash) { GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glDepthMask(false); GL11.glPushMatrix(); double fire = (System.currentTimeMillis() - lastShot) / (double) flash; @@ -379,6 +380,7 @@ public abstract class ItemRenderWeaponBase implements IItemRenderer { tess.draw(); GL11.glPopMatrix(); + GL11.glDepthMask(true); GL11.glDisable(GL11.GL_BLEND); } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java b/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java new file mode 100644 index 000000000..5900c0f84 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java @@ -0,0 +1,162 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.recipes.AssemblyMachineRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.main.MainRegistry; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.TileEntityMachineAssemblyMachine; +import com.hbm.util.BobMathUtil; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +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.minecraftforge.client.IItemRenderer; + +public class RenderAssemblyMachine extends TileEntitySpecialRenderer implements IItemRendererProvider { + + public static EntityItem dummy; + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glRotated(90, 0, 1, 0); + GL11.glShadeModel(GL11.GL_SMOOTH); + + switch(tileEntity.getBlockMetadata() - BlockDummyable.offset) { + case 2: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + TileEntityMachineAssemblyMachine assembler = (TileEntityMachineAssemblyMachine) tileEntity; + + bindTexture(ResourceManager.assembly_machine_tex); + ResourceManager.assembly_machine.renderPart("Base"); + if(assembler.frame) ResourceManager.assembly_machine.renderPart("Frame"); + + GL11.glPushMatrix(); + + double spin = BobMathUtil.interp(assembler.prevRing, assembler.ring, interp); + double[] arm1 = assembler.arms[0].getPositions(interp); + double[] arm2 = assembler.arms[1].getPositions(interp); + + // arm1 = arm2 = new double[] {60, -15, 15, -0.25}; // heart + + GL11.glRotated(spin, 0, 1, 0); + ResourceManager.assembly_machine.renderPart("Ring"); + + GL11.glPushMatrix(); { + GL11.glTranslated(0, 1.625, 0.9375); + GL11.glRotated(arm1[0], 1, 0, 0); + GL11.glTranslated(0, -1.625, -0.9375); + ResourceManager.assembly_machine.renderPart("ArmLower1"); + + GL11.glTranslated(0, 2.375, 0.9375); + GL11.glRotated(arm1[1], 1, 0, 0); + GL11.glTranslated(0, -2.375, -0.9375); + ResourceManager.assembly_machine.renderPart("ArmUpper1"); + + GL11.glTranslated(0, 2.375, 0.4375); + GL11.glRotated(arm1[2], 1, 0, 0); + GL11.glTranslated(0, -2.375, -0.4375); + ResourceManager.assembly_machine.renderPart("Head1"); + GL11.glTranslated(0, arm1[3], 0); + ResourceManager.assembly_machine.renderPart("Spike1"); + } GL11.glPopMatrix(); + + GL11.glPushMatrix(); { + GL11.glTranslated(0, 1.625, -0.9375); + GL11.glRotated(-arm2[0], 1, 0, 0); + GL11.glTranslated(0, -1.625, 0.9375); + ResourceManager.assembly_machine.renderPart("ArmLower2"); + + GL11.glTranslated(0, 2.375, -0.9375); + GL11.glRotated(-arm2[1], 1, 0, 0); + GL11.glTranslated(0, -2.375, 0.9375); + ResourceManager.assembly_machine.renderPart("ArmUpper2"); + + GL11.glTranslated(0, 2.375, -0.4375); + GL11.glRotated(-arm2[2], 1, 0, 0); + GL11.glTranslated(0, -2.375, 0.4375); + ResourceManager.assembly_machine.renderPart("Head2"); + GL11.glTranslated(0, arm2[3], 0); + ResourceManager.assembly_machine.renderPart("Spike2"); + } GL11.glPopMatrix(); + + GL11.glPopMatrix(); + + GL11.glShadeModel(GL11.GL_FLAT); + + GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assembler.assemblerModule.recipe); + if(recipe != null && MainRegistry.proxy.me().getDistanceSq(tileEntity.xCoord + 0.5, tileEntity.yCoord + 1, tileEntity.zCoord + 0.5) < 35 * 35) { + + GL11.glRotated(90, 0, 1, 0); + GL11.glTranslated(0, 1.0625, 0); + + ItemStack stack = recipe.getIcon(); + stack.stackSize = 1; + + if(stack.getItemSpriteNumber() == 0 && stack.getItem() instanceof ItemBlock) { + if(RenderBlocks.renderItemIn3d(Block.getBlockFromItem(stack.getItem()).getRenderType())) { + GL11.glTranslated(0, -0.0625, 0); + } else { + GL11.glTranslated(0, -0.125, 0); + GL11.glScaled(0.5, 0.5, 0.5); + } + } else { + GL11.glRotated(-90, 1, 0, 0); + GL11.glTranslated(0, -0.25, 0); + } + + GL11.glScaled(1.25, 1.25, 1.25); + + if(dummy == null || dummy.worldObj != tileEntity.getWorldObj()) dummy = new EntityItem(tileEntity.getWorldObj(), 0, 0, 0, stack); + dummy.setEntityItemStack(stack); + dummy.hoverStart = 0.0F; + + RenderItem.renderInFrame = true; + RenderManager.instance.renderEntityWithPosYaw(dummy, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); + RenderItem.renderInFrame = false; + } + + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_assembly_machine); + } + + @Override + public IItemRenderer getRenderer() { + + return new ItemRenderBase() { + + public void renderInventory() { + GL11.glTranslated(0, -2.75, 0); + GL11.glScaled(4.5, 4.5, 4.5); + } + 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.assembly_machine_tex); + ResourceManager.assembly_machine.renderAll(); + GL11.glShadeModel(GL11.GL_FLAT); + }}; + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java b/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java index f25ef7f0e..87fc5309e 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java +++ b/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java @@ -22,12 +22,14 @@ public class RenderCraneConsole extends TileEntitySpecialRenderer { GL11.glDisable(GL11.GL_CULL_FACE); GL11.glEnable(GL11.GL_LIGHTING); + int teFacing = 0; switch(te.getBlockMetadata() - BlockDummyable.offset) { - case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; - case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; - case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; - case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 2: teFacing = 90; break; + case 4: teFacing = 180; break; + case 3: teFacing = 270; break; + case 5: teFacing = 0; break; } + GL11.glRotatef(teFacing, 0F, 1F, 0F); TileEntityCraneConsole console = (TileEntityCraneConsole) te; @@ -99,12 +101,7 @@ public class RenderCraneConsole extends TileEntitySpecialRenderer { double cranePosZ = (-te.zCoord + console.centerZ); GL11.glTranslated(cranePosX, cranePosY, cranePosZ); - switch(te.getBlockMetadata() - BlockDummyable.offset) { - case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; - case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; - case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; - case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; - } + GL11.glRotatef(teFacing, 0F, 1F, 0F); double posX = (console.lastPosFront + (console.posFront - console.lastPosFront) * interp); double posZ = (console.lastPosLeft + (console.posLeft - console.lastPosLeft) * interp); @@ -118,27 +115,27 @@ public class RenderCraneConsole extends TileEntitySpecialRenderer { GL11.glRotatef(-craneRotationOffset, 0F, 1F, 0F); switch(craneRotationOffset) { case 0: - girderSpan = console.spanL + console.spanR + 1; - GL11.glTranslated(posX - console.spanL, 0, 0); + girderSpan = console.spanF + console.spanB + 1; + GL11.glTranslated(posX + console.spanB, 0, 0); break; case 90: - girderSpan = console.spanF + console.spanB + 1; - GL11.glTranslated(0, 0, -posZ + console.spanB); + girderSpan = console.spanL + console.spanR + 1; + GL11.glTranslated(0, 0, -posZ - console.spanR); break; case 180: - girderSpan = console.spanL + console.spanR + 1; - GL11.glTranslated(posX + console.spanR, 0, 0); + girderSpan = console.spanF + console.spanB + 1; + GL11.glTranslated(posX - console.spanF, 0, 0); break; case 270: - girderSpan = console.spanF + console.spanB + 1; - GL11.glTranslated(0, 0, -posZ - console.spanF); + girderSpan = console.spanL + console.spanR + 1; + GL11.glTranslated(0, 0, -posZ + console.spanL); break; } GL11.glRotatef(craneRotationOffset, 0F, 1F, 0F); for(int i = 0; i < girderSpan; i++) { ResourceManager.rbmk_crane.renderPart("Girder"); - GL11.glTranslated(1, 0, 0); + GL11.glTranslated(-1, 0, 0); } GL11.glPopMatrix(); diff --git a/src/main/java/com/hbm/render/tileentity/RenderEPress.java b/src/main/java/com/hbm/render/tileentity/RenderEPress.java index 987ab9a0a..cf8915ef8 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderEPress.java +++ b/src/main/java/com/hbm/render/tileentity/RenderEPress.java @@ -2,6 +2,7 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; +import com.hbm.blocks.BlockDummyable; import com.hbm.main.ResourceManager; import com.hbm.render.util.RenderDecoItem; import com.hbm.tileentity.machine.TileEntityMachineEPress; @@ -28,7 +29,7 @@ public class RenderEPress extends TileEntitySpecialRenderer { GL11.glEnable(GL11.GL_LIGHTING); GL11.glRotatef(180, 0F, 1F, 0F); - switch(tileentity.getBlockMetadata()) { + switch(tileentity.getBlockMetadata() - BlockDummyable.offset) { case 2: GL11.glRotatef(270, 0F, 1F, 0F); break; case 4: GL11.glRotatef(0, 0F, 1F, 0F); break; case 3: GL11.glRotatef(90, 0F, 1F, 0F); break; @@ -50,7 +51,7 @@ public class RenderEPress extends TileEntitySpecialRenderer { GL11.glEnable(GL11.GL_LIGHTING); GL11.glRotatef(180, 0F, 1F, 0F); - switch(tileentity.getBlockMetadata()) { + switch(tileentity.getBlockMetadata() - BlockDummyable.offset) { case 2: GL11.glRotatef(270, 0F, 1F, 0F); break; case 4: GL11.glRotatef(0, 0F, 1F, 0F); break; case 3: GL11.glRotatef(90, 0F, 1F, 0F); break; @@ -78,7 +79,7 @@ public class RenderEPress extends TileEntitySpecialRenderer { GL11.glEnable(GL11.GL_LIGHTING); GL11.glRotatef(180, 0F, 1F, 0F); - switch(tileentity.getBlockMetadata()) { + switch(tileentity.getBlockMetadata() - BlockDummyable.offset) { case 2: GL11.glRotatef(270, 0F, 1F, 0F); break; case 4: diff --git a/src/main/java/com/hbm/render/tileentity/RenderNukeFstbmb.java b/src/main/java/com/hbm/render/tileentity/RenderNukeFstbmb.java index 82bf299b6..960f37f31 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderNukeFstbmb.java +++ b/src/main/java/com/hbm/render/tileentity/RenderNukeFstbmb.java @@ -15,50 +15,44 @@ import net.minecraft.util.ResourceLocation; public class RenderNukeFstbmb extends TileEntitySpecialRenderer { - @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()) - { - 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; + @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()) { + 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); - bindTexture(ResourceManager.fstbmb_tex); - ResourceManager.fstbmb.renderPart("Body"); - ResourceManager.fstbmb.renderPart("Balefire"); - - TileEntityNukeBalefire bf = (TileEntityNukeBalefire)tileEntity; - - if(bf.loaded) { - bindTexture(new ResourceLocation(RefStrings.MODID + ":textures/misc/glintBF.png")); - RenderMiscEffects.renderClassicGlint(tileEntity.getWorldObj(), f, ResourceManager.fstbmb, "Balefire", 0.0F, 0.8F, 0.15F, 5, 2F); - - FontRenderer font = Minecraft.getMinecraft().fontRenderer; - float f3 = 0.04F; - GL11.glTranslatef(0.815F, 0.9275F, 0.5F); - GL11.glScalef(f3, -f3, f3); - GL11.glNormal3f(0.0F, 0.0F, -1.0F * f3); - GL11.glRotatef(90, 0, 1, 0); - GL11.glDepthMask(false); - GL11.glTranslatef(0, 1, 0); - font.drawString(bf.getMinutes() + ":" + bf.getSeconds(), 0, 0, 0xff0000); - GL11.glDepthMask(true); - } - - GL11.glShadeModel(GL11.GL_FLAT); + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.fstbmb_tex); + ResourceManager.fstbmb.renderPart("Body"); + ResourceManager.fstbmb.renderPart("Balefire"); - GL11.glPopMatrix(); - } + TileEntityNukeBalefire bf = (TileEntityNukeBalefire) tileEntity; + + if(bf.loaded) { + bindTexture(new ResourceLocation(RefStrings.MODID + ":textures/misc/glintBF.png")); + RenderMiscEffects.renderClassicGlint(tileEntity.getWorldObj(), f, ResourceManager.fstbmb, "Balefire", 0.0F, 0.8F, 0.15F, 5, 2F); + + FontRenderer font = Minecraft.getMinecraft().fontRenderer; + float f3 = 0.04F; + GL11.glTranslatef(0.815F, 0.9275F, 0.5F); + GL11.glScalef(f3, -f3, f3); + GL11.glNormal3f(0.0F, 0.0F, -1.0F * f3); + GL11.glRotatef(90, 0, 1, 0); + GL11.glDepthMask(false); + GL11.glTranslatef(0, 1, 0); + font.drawString(bf.getMinutes() + ":" + bf.getSeconds(), 0, 0, 0xff0000); + GL11.glDepthMask(true); + } + + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glPopMatrix(); + } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderPUREX.java b/src/main/java/com/hbm/render/tileentity/RenderPUREX.java new file mode 100644 index 000000000..5116e53e7 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderPUREX.java @@ -0,0 +1,82 @@ +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.TileEntityMachinePUREX; +import com.hbm.util.BobMathUtil; + +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 RenderPUREX extends TileEntitySpecialRenderer implements IItemRendererProvider { + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glRotated(90, 0, 1, 0); + GL11.glShadeModel(GL11.GL_SMOOTH); + + switch(tileEntity.getBlockMetadata() - BlockDummyable.offset) { + case 2: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + TileEntityMachinePUREX purex = (TileEntityMachinePUREX) tileEntity; + float anim = purex.prevAnim + (purex.anim - purex.prevAnim) * interp; + + bindTexture(ResourceManager.purex_tex); + ResourceManager.purex.renderPart("Base"); + if(purex.frame)ResourceManager.purex.renderPart("Frame"); + + GL11.glPushMatrix(); + GL11.glTranslated(1.5, 1.25, 0); + GL11.glRotated(anim * 45, 0, 0, 1); + GL11.glTranslated(-1.5, -1.25, 0); + ResourceManager.purex.renderPart("Fan"); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslated(BobMathUtil.sps(anim * 0.25) * 0.5, 0, 0); + ResourceManager.purex.renderPart("Pump"); + GL11.glPopMatrix(); + + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_purex); + } + + @Override + public IItemRenderer getRenderer() { + + return new ItemRenderBase() { + + public void renderInventory() { + GL11.glTranslated(0, -2.5, 0); + GL11.glScaled(2.5, 2.5, 2.5); + } + public void renderCommonWithStack(ItemStack item) { + GL11.glScaled(0.75, 0.75, 0.75); + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.purex_tex); + ResourceManager.purex.renderPart("Base"); + ResourceManager.purex.renderPart("Frame"); + ResourceManager.purex.renderPart("Fan"); + ResourceManager.purex.renderPart("Pump"); + GL11.glShadeModel(GL11.GL_FLAT); + }}; + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderPlushie.java b/src/main/java/com/hbm/render/tileentity/RenderPlushie.java index 702817abe..a482eba91 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderPlushie.java +++ b/src/main/java/com/hbm/render/tileentity/RenderPlushie.java @@ -30,10 +30,10 @@ import net.minecraftforge.client.model.IModelCustom; public class RenderPlushie extends TileEntitySpecialRenderer implements IItemRendererProvider { public static final IModelCustom yomiModel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/trinkets/yomi.obj"), false).asVBO(); - public static final IModelCustom poohModel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/trinkets/pooh.obj"), false).asVBO(); + public static final IModelCustom hundunModel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/trinkets/hundun.obj"), false).asVBO(); public static final ResourceLocation yomiTex = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/yomi.png"); public static final ResourceLocation numbernineTex = new ResourceLocation(RefStrings.MODID, "textures/models/horse/numbernine.png"); - public static final ResourceLocation poohTex = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/pooh.png"); + public static final ResourceLocation hundunTex = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/hundun.png"); @Override public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { @@ -53,7 +53,7 @@ public class RenderPlushie extends TileEntitySpecialRenderer implements IItemRen case NONE: break; case YOMI: GL11.glScaled(0.5, 0.5, 0.5); break; case NUMBERNINE: GL11.glScaled(0.75, 0.75, 0.75); break; - case POOH: GL11.glScaled(0.75, 0.75, 0.75); break; + case HUNDUN: GL11.glScaled(1, 1, 1); break; } renderPlushie(te.type); @@ -110,9 +110,9 @@ public class RenderPlushie extends TileEntitySpecialRenderer implements IItemRen IIcon icon = stack.getIconIndex(); ItemRenderer.renderItemIn2D(Tessellator.instance, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), icon.getIconWidth(), icon.getIconHeight(), 0.0625F); break; - case POOH: - Minecraft.getMinecraft().getTextureManager().bindTexture(poohTex); - poohModel.renderAll(); + case HUNDUN: + Minecraft.getMinecraft().getTextureManager().bindTexture(hundunTex); + hundunModel.renderPart("goober_posed"); break; } } @@ -138,7 +138,7 @@ public class RenderPlushie extends TileEntitySpecialRenderer implements IItemRen case NONE: break; case YOMI: GL11.glScaled(1.25, 1.25, 1.25); break; case NUMBERNINE: GL11.glTranslated(0, 0.25, 0.25); GL11.glScaled(1.25, 1.25, 1.25); break; - case POOH: GL11.glTranslated(0, 0.25, 0); GL11.glScaled(1.5, 1.5, 1.5); break; + case HUNDUN: GL11.glTranslated(0.5, 0.5, 0); GL11.glScaled(1.25, 1.25, 1.25); break; } renderPlushie(type); }}; diff --git a/src/main/java/com/hbm/render/tileentity/RenderRBMKAutoloader.java b/src/main/java/com/hbm/render/tileentity/RenderRBMKAutoloader.java new file mode 100644 index 000000000..3018364a9 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderRBMKAutoloader.java @@ -0,0 +1,62 @@ +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.rbmk.TileEntityRBMKAutoloader; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderRBMKAutoloader 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_CULL_FACE); + + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.rbmk_autoloader_tex); + ResourceManager.rbmk_autoloader.renderPart("Base"); + + TileEntityRBMKAutoloader press = (TileEntityRBMKAutoloader) tile; + double p = (press.lastPiston + (press.renderPiston - press.lastPiston) * interp); + GL11.glTranslated(0, p * -4D, 0); + + GL11.glTranslated(0, 4, 0); + ResourceManager.rbmk_autoloader.renderPart("Piston"); + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.rbmk_autoloader); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(0, -6, 0); + GL11.glScaled(1.75, 1.75, 1.75); + } + public void renderCommon() { + GL11.glRotated(180, 0, 1, 0); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.rbmk_autoloader_tex); + ResourceManager.rbmk_autoloader.renderPart("Base"); + ResourceManager.rbmk_autoloader.renderPart("Piston"); + GL11.glShadeModel(GL11.GL_FLAT); + GL11.glEnable(GL11.GL_CULL_FACE); + }}; + } + +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java b/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java index adcbea5e9..45401d406 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java +++ b/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java @@ -23,6 +23,10 @@ public class RenderSkeletonHolder extends TileEntitySpecialRenderer { GL11.glPushMatrix(); GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + RenderHelper.enableStandardItemLighting(); + switch(te.getBlockMetadata()) { case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; @@ -30,10 +34,6 @@ public class RenderSkeletonHolder extends TileEntitySpecialRenderer { case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; } //why the FUCK did this not commit properl;y - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_CULL_FACE); - RenderHelper.enableStandardItemLighting(); - bindTexture(ResourceManager.skeleton_holder_tex); ResourceManager.skeleton_holder.renderPart("Holder1"); diff --git a/src/main/java/com/hbm/render/util/HorsePronter.java b/src/main/java/com/hbm/render/util/HorsePronter.java index bec1e9ef6..117f58db0 100644 --- a/src/main/java/com/hbm/render/util/HorsePronter.java +++ b/src/main/java/com/hbm/render/util/HorsePronter.java @@ -123,7 +123,7 @@ public class HorsePronter { 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.glRotated(rotation.zCoord, 0, 0, 1); GL11.glTranslated(-offset.xCoord, -offset.yCoord, -offset.zCoord); } diff --git a/src/main/java/com/hbm/render/util/MissilePart.java b/src/main/java/com/hbm/render/util/MissilePart.java index dbec574c4..1f33a4b6a 100644 --- a/src/main/java/com/hbm/render/util/MissilePart.java +++ b/src/main/java/com/hbm/render/util/MissilePart.java @@ -34,13 +34,10 @@ public class MissilePart { parts.clear(); MissilePart.registerPart(ModItems.mp_thruster_10_kerosene, PartType.THRUSTER, 1, 1, ResourceManager.mp_t_10_kerosene, ResourceManager.mp_t_10_kerosene_tex); - MissilePart.registerPart(ModItems.mp_thruster_10_kerosene_tec, PartType.THRUSTER, 1.25, 1.25, ResourceManager.mp_t_10_kerosene_tec, ResourceManager.universal); MissilePart.registerPart(ModItems.mp_thruster_10_solid, PartType.THRUSTER, 0.5, 1, ResourceManager.mp_t_10_solid, ResourceManager.mp_t_10_solid_tex); MissilePart.registerPart(ModItems.mp_thruster_10_xenon, PartType.THRUSTER, 0.5, 1, ResourceManager.mp_t_10_xenon, ResourceManager.mp_t_10_xenon_tex); // MissilePart.registerPart(ModItems.mp_thruster_15_kerosene, PartType.THRUSTER, 1.5, 1.5, ResourceManager.mp_t_15_kerosene, ResourceManager.mp_t_15_kerosene_tex); - MissilePart.registerPart(ModItems.mp_thruster_15_kerosene_tec, PartType.THRUSTER, 1.5, 3.25, ResourceManager.mp_t_15_kerosene_tec, ResourceManager.universal); - MissilePart.registerPart(ModItems.mp_thruster_15_kerosene_dual, PartType.THRUSTER, 1, 1.5, ResourceManager.mp_t_15_kerosene_dual, ResourceManager.mp_t_15_kerosene_dual_tex); MissilePart.registerPart(ModItems.mp_thruster_15_kerosene_triple, PartType.THRUSTER, 1, 1.5, ResourceManager.mp_t_15_kerosene_triple, ResourceManager.mp_t_15_kerosene_dual_tex); MissilePart.registerPart(ModItems.mp_thruster_15_solid, PartType.THRUSTER, 0.5, 1, ResourceManager.mp_t_15_solid, ResourceManager.mp_t_15_solid_tex); MissilePart.registerPart(ModItems.mp_thruster_15_solid_hexdecuple, PartType.THRUSTER, 0.5, 1, ResourceManager.mp_t_15_solid_hexdecuple, ResourceManager.mp_t_15_solid_hexdecuple_tex); @@ -149,8 +146,6 @@ public class MissilePart { MissilePart.registerPart(ModItems.mp_fuselage_15_20_kerosene, PartType.FUSELAGE, 16, 10, ResourceManager.mp_f_15_20_kerosene, ResourceManager.mp_f_15_20_kerosene_tex); MissilePart.registerPart(ModItems.mp_fuselage_15_20_kerosene_magnusson, PartType.FUSELAGE, 16, 10, ResourceManager.mp_f_15_20_kerosene, ResourceManager.mp_f_15_20_kerosene_magnusson_tex); MissilePart.registerPart(ModItems.mp_fuselage_15_20_solid, PartType.FUSELAGE, 16, 10, ResourceManager.mp_f_15_20_kerosene, ResourceManager.mp_f_15_20_solid_tex); - // - MissilePart.registerPart(ModItems.mp_fuselage_20_kerosene, PartType.FUSELAGE, 10, 8, ResourceManager.mp_f_20, ResourceManager.universal); ////// @@ -171,9 +166,6 @@ public class MissilePart { MissilePart.registerPart(ModItems.mp_warhead_15_n2, PartType.WARHEAD, 3, 2, ResourceManager.mp_w_15_n2, ResourceManager.mp_w_15_n2_tex); MissilePart.registerPart(ModItems.mp_warhead_15_balefire, PartType.WARHEAD, 2.75, 2, ResourceManager.mp_w_15_balefire, ResourceManager.mp_w_15_balefire_tex); MissilePart.registerPart(ModItems.mp_warhead_15_turbine, PartType.WARHEAD, 2.25, 2, ResourceManager.mp_w_15_turbine, ResourceManager.mp_w_15_turbine_tex); - // - MissilePart.registerPart(ModItems.mp_warhead_20_he, PartType.WARHEAD, 3, 2.25, ResourceManager.mp_w_20, ResourceManager.universal); - } public static void registerPart(Item item, PartType type, double height, double guiheight, IModelCustom model, ResourceLocation texture) { diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index d28ae1e22..e7cf6981f 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -67,8 +67,8 @@ public abstract class DoorDecl { } @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { - return super.getBlockBound(x, y, z, open); + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { + return super.getBlockBound(x, y, z, open, forCollision); } @Override @@ -156,7 +156,7 @@ public abstract class DoorDecl { } @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); if(z == 1) { @@ -166,9 +166,9 @@ public abstract class DoorDecl { } else if(y > 1) { return AxisAlignedBB.getBoundingBox(0, 0.75, 0, 1, 1, 1); } else if(y == 0) { - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.1, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.1, 1); } else { - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); } } @@ -240,15 +240,15 @@ public abstract class DoorDecl { } @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(open) { if(y == 3) { return AxisAlignedBB.getBoundingBox(0, 0.5, 0, 1, 1, 1); } else if(y == 0) { - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.08, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.08, 1); } } - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); } @Override @@ -327,10 +327,9 @@ public abstract class DoorDecl { }; @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { - if(open) { - if(y == 0) return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.25, 1, 0, 1); - return AxisAlignedBB.getBoundingBox(0, 0.9375, 1 - 0.25, 1, 1, 1); + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { + if(forCollision && open) { + return AxisAlignedBB.getBoundingBox(0, 0, 0, 0, 0, 0); } else { return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.25, 1, 1, 1); } @@ -429,7 +428,7 @@ public abstract class DoorDecl { } @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) { if(y > 0) { return AxisAlignedBB.getBoundingBox(0, 0, 0.375, 1, 1, 0.625); @@ -437,11 +436,13 @@ public abstract class DoorDecl { return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); } if(y == 1) { - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.0625, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.0625, 1); } else if(y == 4) { return AxisAlignedBB.getBoundingBox(0, 0.5, 0.15, 1, 1, 0.85); - } else { - return super.getBlockBound(x, y, z, open); + } else if(y == 0) { + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); + }else { + return super.getBlockBound(x, y, z, open, forCollision); } } @@ -504,9 +505,9 @@ public abstract class DoorDecl { }; @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); if(z == 1) { return AxisAlignedBB.getBoundingBox(0.4, 0, 0, 1, 1, 1); } else if(z == -2) { @@ -514,9 +515,9 @@ public abstract class DoorDecl { } else if(y == 3) { return AxisAlignedBB.getBoundingBox(0, 0.5, 0, 1, 1, 1); } else if(y == 0) { - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.0625, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.0625, 1); } - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); }; @Override @@ -586,7 +587,7 @@ public abstract class DoorDecl { @Override @SideOnly(Side.CLIENT) public void doOffsetTransform() { - GL11.glTranslated(0.4375, 0, 0.5); + GL11.glTranslated(0.40625, 0, 0.5); }; @Override @@ -595,15 +596,15 @@ public abstract class DoorDecl { }; @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { - if(open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { + if(forCollision && open) { if(z == 0) { - return AxisAlignedBB.getBoundingBox(1 - 0.125, 0, 1 - 0.125, 1, 1, 1); + return AxisAlignedBB.getBoundingBox(1 - 0.125, 0, 1 - 0.1875, 1, 1, 1); } else { - return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.125, 0.125, 1, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.1875, 0.125, 1, 1); } } else { - return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.125, 1, 1, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.1875, 1, 1, 1); } }; @@ -691,14 +692,14 @@ public abstract class DoorDecl { } @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) return AxisAlignedBB.getBoundingBox(0, 0, 0.5, 1, 1, 1); if(y > 1) return AxisAlignedBB.getBoundingBox(0, 0.5, 0.5, 1, 1, 1); else if(y == 0) - return AxisAlignedBB.getBoundingBox(0, 0, 0.5, 1, 0.1, 1); - return super.getBlockBound(x, y, z, open); + return AxisAlignedBB.getBoundingBox(0, 0, 0.5, 1, forCollision ? 0 : 0.1, 1); + return super.getBlockBound(x, y, z, open, forCollision); }; @Override @@ -814,15 +815,15 @@ public abstract class DoorDecl { }; @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) { return AxisAlignedBB.getBoundingBox(0, 0, 0.75, 1, 1, 1); } else if(y > 1) { return AxisAlignedBB.getBoundingBox(0, 0.85, 0.75, 1, 1, 1); } else if(y == 0) { - return AxisAlignedBB.getBoundingBox(0, 0, 0.75, 1, 0.15, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0.75, 1, forCollision ? 0 : 0.15, 1); } - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); }; @Override @@ -1018,15 +1019,17 @@ public abstract class DoorDecl { }; @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); if(z == 3) { return AxisAlignedBB.getBoundingBox(0.4, 0, 0, 1, 1, 1); } else if(z == -3) { return AxisAlignedBB.getBoundingBox(0, 0, 0, 0.6, 1, 1); + } else if(y == 0) { + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.0625, 1); } - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); }; @Override @@ -1159,7 +1162,7 @@ public abstract class DoorDecl { public void doOffsetTransform() { } - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { return open ? AxisAlignedBB.getBoundingBox(0, 0, 0, 0, 0, 0) : AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); } diff --git a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java index d05ac0843..e460bc08b 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java +++ b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java @@ -6,25 +6,22 @@ import java.util.Set; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.generic.BlockDoorGeneric; -import com.hbm.interfaces.IAnimatedDoor; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.toclient.TEDoorAnimationPacket; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.machine.TileEntityLockableBase; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.Rotation; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAnimatedDoor { +public class TileEntityDoorGeneric extends TileEntityLockableBase { //0: closed, 1: open, 2: closing, 3: opening public byte state = 0; @@ -39,9 +36,9 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn private AudioWrapper audio; private AudioWrapper audio2; - + @Override - public void updateEntity(){ + public void updateEntity() { if(state == 3) { openTicks++; if(openTicks >= getDoorType().timeToOpen()) { @@ -55,39 +52,39 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn } if(!worldObj.isRemote) { - + BlockPos pos = new BlockPos(this); - + int[][] ranges = getDoorType().getDoorOpenRanges(); ForgeDirection dir = ForgeDirection.getOrientation(getBlockMetadata() - BlockDummyable.offset); - + if(state == 3) { - + for(int i = 0; i < ranges.length; i++) { - + int[] range = ranges[i]; BlockPos startPos = new BlockPos(range[0], range[1], range[2]); float time = getDoorType().getDoorRangeOpenTime(openTicks, i); - + for(int j = 0; j < Math.abs(range[3]); j++) { - + if((float)j / (Math.abs(range[3] - 1)) > time) break; - + for(int k = 0; k < range[4]; k++) { BlockPos add = new BlockPos(0, 0, 0); - switch(range[5]){ + switch(range[5]) { case 0: add = new BlockPos(0, k, (int)Math.signum(range[3]) * j); break; case 1: add = new BlockPos(k, (int)Math.signum(range[3]) * j, 0); break; case 2: add = new BlockPos((int)Math.signum(range[3]) * j, k, 0); break; } - + Rotation r = Rotation.getBlockRotation(dir); if(dir == Library.POS_X || dir == Library.NEG_X) r = r.add(Rotation.CLOCKWISE_180); - + BlockPos finalPos = startPos.add(add).rotate(r).add(pos); - + if(finalPos.equals(pos)) { this.shouldUseBB = false; } else { @@ -96,24 +93,24 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn } } } - - } else if(state == 2){ - + + } else if(state == 2) { + for(int i = 0; i < ranges.length; i++) { - + int[] range = ranges[i]; BlockPos startPos = new BlockPos(range[0], range[1], range[2]); float time = getDoorType().getDoorRangeOpenTime(openTicks, i); - + for(int j = Math.abs(range[3])-1; j >= 0; j--) { - + if((float)j / (Math.abs(range[3] - 1)) < time) break; - + for(int k = 0; k < range[4]; k++) { BlockPos add = new BlockPos(0, 0, 0); - switch(range[5]){ + switch(range[5]) { case 0: add = new BlockPos(0, k, (int)Math.signum(range[3]) * j); break; case 1: add = new BlockPos(k, (int)Math.signum(range[3]) * j, 0); break; case 2: add = new BlockPos((int)Math.signum(range[3]) * j, k, 0); break; @@ -122,9 +119,9 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn Rotation r = Rotation.getBlockRotation(dir); if(dir == Library.POS_X || dir == Library.NEG_X) r = r.add(Rotation.CLOCKWISE_180); - + BlockPos finalPos = startPos.add(add).rotate(r).add(pos); - + if(finalPos.equals(pos)) { this.shouldUseBB = false; } else { @@ -140,19 +137,34 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn if(state == 2 && openTicks == 0) { state = 0; } - PacketDispatcher.wrapper.sendToAllAround(new TEDoorAnimationPacket(xCoord, yCoord, zCoord, state, skinIndex, (byte)(shouldUseBB ? 1 : 0)), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 100)); - - if(redstonePower == -1 && state == 1){ + + this.networkPackNT(100); + + if(redstonePower == -1 && state == 1) { tryToggle(-1); - } else if(redstonePower > 0 && state == 0){ + } else if(redstonePower > 0 && state == 0) { tryToggle(-1); } - if(redstonePower == -1){ + if(redstonePower == -1) { redstonePower = 0; } } } + @Override + public void serialize(ByteBuf buf) { + buf.writeByte(state); + buf.writeByte(skinIndex); + buf.writeBoolean(shouldUseBB); + } + + @Override + public void deserialize(ByteBuf buf) { + handleNewState(buf.readByte()); + setSkinIndex(buf.readByte()); + shouldUseBB = buf.readBoolean(); + } + @Override public void onChunkUnload() { if(audio != null) { @@ -164,20 +176,20 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn audio2 = null; } } - - public DoorDecl getDoorType(){ - + + public DoorDecl getDoorType() { + if(this.doorType == null && this.getBlockType() instanceof BlockDoorGeneric) this.doorType = ((BlockDoorGeneric)this.getBlockType()).type; - + return this.doorType; } - public boolean tryToggle(EntityPlayer player){ - + public boolean tryToggle(EntityPlayer player) { + if(this.isLocked() && player == null) return false; - - if(state == 0 && redstonePower > 0){ + + if(state == 0 && redstonePower > 0) { //Redstone "power locks" doors, just like minecraft iron doors return false; } @@ -194,8 +206,8 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn } return false; } - - public boolean tryToggle(int passcode){ + + public boolean tryToggle(int passcode) { if(this.isLocked() && passcode != this.lock) return false; if(this.state == 0) { @@ -212,55 +224,28 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn return false; } - @Override - public void open(){ - if(state == 0) - toggle(); - } - - @Override - public void close(){ - if(state == 1) - toggle(); - } - - @Override - public DoorState getState(){ - return DoorState.values()[state]; - } - - @Override - public void toggle(){ - if(state == 0) { - state = 3; - } else if(state == 1) { - state = 2; - } - } - - @Override @SideOnly(Side.CLIENT) - public void handleNewState(byte state){ - + public void handleNewState(byte state) { + if(this.state != state) { DoorDecl doorType = getDoorType(); - if(this.state == 0 && state == 3){ // Door transitioning to open + if(this.state == 0 && state == 3) { // Door transitioning to open if(audio != null) { audio.stopSound(); audio.setKeepAlive(0); } - if(doorType.getOpenSoundLoop() != null){ + if(doorType.getOpenSoundLoop() != null) { audio = MainRegistry.proxy.getLoopedSound(doorType.getOpenSoundLoop(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F); audio.startSound(); } - if(doorType.getOpenSoundStart() != null){ + if(doorType.getOpenSoundStart() != null) { worldObj.playSound(xCoord, yCoord, zCoord, doorType.getOpenSoundStart(), doorType.getSoundVolume(), 1F, false); } - if(doorType.getSoundLoop2() != null){ + if(doorType.getSoundLoop2() != null) { if(audio2 != null) audio2.stopSound(); audio2 = MainRegistry.proxy.getLoopedSound(doorType.getSoundLoop2(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F); @@ -268,21 +253,21 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn } } - if(this.state == 1 && state == 2){ // Door transitioning to closed + if(this.state == 1 && state == 2) { // Door transitioning to closed if(audio != null) { audio.stopSound(); } - if(doorType.getCloseSoundLoop() != null){ + if(doorType.getCloseSoundLoop() != null) { audio = MainRegistry.proxy.getLoopedSound(doorType.getCloseSoundLoop(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F); audio.startSound(); } - if(doorType.getCloseSoundStart() != null){ + if(doorType.getCloseSoundStart() != null) { worldObj.playSound(xCoord, yCoord, zCoord, doorType.getCloseSoundStart(), doorType.getSoundVolume(), 1F, false); } - if(doorType.getSoundLoop2() != null){ + if(doorType.getSoundLoop2() != null) { if(audio2 != null) audio2.stopSound(); audio2 = MainRegistry.proxy.getLoopedSound(doorType.getSoundLoop2(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F); @@ -290,47 +275,39 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn } } - if(state == 1 || state == 0){ // Door finished any transition - if(audio != null){ + if(state == 1 || state == 0) { // Door finished any transition + if(audio != null) { audio.stopSound(); audio = null; } - if(audio2 != null){ + if(audio2 != null) { audio2.stopSound(); audio2 = null; } } - if(this.state == 3 && state == 1){ // Door finished transitioning to open - if(doorType.getOpenSoundEnd() != null){ + if(this.state == 3 && state == 1) { // Door finished transitioning to open + if(doorType.getOpenSoundEnd() != null) { worldObj.playSound(xCoord, yCoord, zCoord, doorType.getOpenSoundEnd(), doorType.getSoundVolume(), 1F, false); } } - if(this.state == 2 && state == 0){ // Door finished transitioning to closed - if(doorType.getCloseSoundEnd() != null){ + if(this.state == 2 && state == 0) { // Door finished transitioning to closed + if(doorType.getCloseSoundEnd() != null) { worldObj.playSound(xCoord, yCoord, zCoord, doorType.getCloseSoundEnd(), doorType.getSoundVolume(), 1F, false); } } - - - this.state = state; - if(state > 1) - animStartTime = System.currentTimeMillis(); - } - } - //Ah yes piggy backing on this packet - @Override - public void setTextureState(byte tex){ - shouldUseBB = tex > 0; + + this.state = state; + if(state > 1) animStartTime = System.currentTimeMillis(); + } } public int getSkinIndex() { return skinIndex; } - @Override public boolean setSkinIndex(byte skinIndex) { if(!getDoorType().hasSkins()) return false; @@ -341,13 +318,22 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn return true; } + /**Useful for logic block interactions, as a way to close/open doors**/ + public void open(){ + if(state == 0) state = 3; + } + + public void close() { + if(state == 1) state = 2; + } + @Override - public AxisAlignedBB getRenderBoundingBox(){ + public AxisAlignedBB getRenderBoundingBox() { return INFINITE_EXTENT_AABB; } @Override - public double getMaxRenderDistanceSquared(){ + public double getMaxRenderDistanceSquared() { return 65536D; } @@ -388,14 +374,14 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn } tag.setTag("activatedBlocks", activatedBlocks); } - + @Override - public void validate(){ + public void validate() { super.validate(); } - + @Override - public void invalidate(){ + public void invalidate() { super.invalidate(); if(audio != null) { audio.stopSound(); @@ -412,19 +398,19 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn BlockPos pos = new BlockPos(x, y, z); boolean powered = worldObj.isBlockIndirectlyGettingPowered(x, y, z); boolean contained = activatedBlocks.contains(pos); - if(!contained && powered){ + if(!contained && powered) { activatedBlocks.add(pos); - if(redstonePower == -1){ + if(redstonePower == -1) { redstonePower = 0; } redstonePower++; - } else if(contained && !powered){ + } else if(contained && !powered) { activatedBlocks.remove(pos); redstonePower--; - if(redstonePower == 0){ + if(redstonePower == 0) { redstonePower = -1; } } } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java b/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java index c38e5f51e..dc30ea5b3 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java +++ b/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java @@ -75,9 +75,9 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy return this; } - /** Returns the actual tile entity that represents the core. Only for internal use. */ - protected TileEntity getTile() { - if(tile == null || tile.isInvalid()) { + /** Returns the actual tile entity that represents the core. Only for internal use, and EnergyControl. */ + public TileEntity getTile() { + if(tile == null || tile.isInvalid() || (tile instanceof TileEntityLoadedBase && !((TileEntityLoadedBase) tile).isLoaded)) { tile = this.getTE(); } return tile; diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index c883e8a05..250305afe 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -14,12 +14,16 @@ import com.hbm.blocks.generic.BlockGlyphidSpawner.TileEntityGlpyhidSpawner; import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; import com.hbm.blocks.generic.BlockPedestal.TileEntityPedestal; import com.hbm.blocks.generic.BlockPlushie.TileEntityPlushie; +import com.hbm.blocks.generic.BlockRebar.TileEntityRebar; import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.generic.BlockSupplyCrate.TileEntitySupplyCrate; import com.hbm.blocks.generic.BlockWandJigsaw.TileEntityWandJigsaw; import com.hbm.blocks.generic.BlockWandLoot.TileEntityWandLoot; +import com.hbm.blocks.generic.BlockWandTandem.TileEntityWandTandem; +import com.hbm.blocks.generic.BlockWandLogic.TileEntityWandLogic; import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; +import com.hbm.blocks.generic.LogicBlock; import com.hbm.blocks.generic.PartEmitter.TileEntityPartEmitter; import com.hbm.blocks.machine.BlockICF.TileEntityBlockICF; import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; @@ -35,8 +39,11 @@ import com.hbm.blocks.network.CableDiode.TileEntityDiode; import com.hbm.blocks.network.CranePartitioner.TileEntityCranePartitioner; import com.hbm.blocks.network.FluidDuctGauge.TileEntityPipeGauge; import com.hbm.blocks.network.FluidDuctPaintable.TileEntityPipePaintable; +import com.hbm.blocks.network.FluidDuctPaintableBlockExhaust.TileEntityPipeExhaustPaintable; import com.hbm.blocks.network.FluidPump.TileEntityFluidPump; +import com.hbm.blocks.network.PneumoTubePaintableBlock.TileEntityPneumoTubePaintable; import com.hbm.blocks.rail.RailStandardSwitch.TileEntityRailSwitch; +import com.hbm.blocks.network.BlockOpenComputersCablePaintable.TileEntityOpenComputersCablePaintable; import com.hbm.tileentity.bomb.*; import com.hbm.tileentity.deco.*; import com.hbm.tileentity.machine.*; @@ -47,7 +54,9 @@ import com.hbm.tileentity.machine.rbmk.*; import com.hbm.tileentity.machine.storage.*; import com.hbm.tileentity.network.*; import com.hbm.tileentity.turret.*; +import com.hbm.util.Compat; +import cpw.mods.fml.common.Loader; import net.minecraft.tileentity.TileEntity; public class TileMappings { @@ -142,7 +151,6 @@ public class TileMappings { put(TileEntityCoreInjector.class, "tileentity_v0_injector"); put(TileEntityCoreStabilizer.class, "tileentity_v0_stabilizer"); put(TileEntityCore.class, "tileentity_v0"); - put(TileEntityMachineArcFurnace.class, "tileentity_arc_furnace"); put(TileEntityMachineAmgen.class, "tileentity_amgen"); put(TileEntityMachineHephaestus.class, "tileentity_hephaestus"); put(TileEntityGeysir.class, "tileentity_geysir"); @@ -207,6 +215,7 @@ public class TileMappings { put(TileEntityPedestal.class, "tileentity_ntm_pedestal"); put(TileEntitySkeletonHolder.class, "tileentity_ntm_skeleton"); put(TileEntityDungeonSpawner.class, "tileentity_ntm_dungeon_spawner"); + put(LogicBlock.TileEntityLogicBlock.class, "tileentity_ntm_logic_block"); put(TileEntityBobble.class, "tileentity_ntm_bobblehead"); put(TileEntitySnowglobe.class, "tileentity_ntm_snowglobe"); put(TileEntityPlushie.class, "tileentity_ntm_plushie"); @@ -235,6 +244,8 @@ public class TileMappings { put(TileEntityWandLoot.class, "tileentity_wand_loot"); put(TileEntityWandJigsaw.class, "tileentity_wand_jigsaw"); + put(TileEntityWandLogic.class, "tileentity_wand_spawner"); + put(TileEntityWandTandem.class, "tileentity_wand_tandem"); putNetwork(); putBombs(); @@ -339,11 +350,13 @@ public class TileMappings { put(TileEntityMachineCombustionEngine.class, "tileentity_combustion_engine"); put(TileEntityMachineAssembler.class, "tileentity_assembly_machine"); + put(TileEntityMachineAssemblyMachine.class, "tileentity_assemblymachine"); put(TileEntityMachineAssemfac.class, "tileentity_assemfac"); put(TileEntityMachineChemplant.class, "tileentity_chemical_plant"); put(TileEntityMachineChemicalPlant.class, "tileentity_chemicalplant"); put(TileEntityMachineChemfac.class, "tileentity_chemfac"); put(TileEntityMachineChemicalFactory.class, "tileentity_chemicalfactory"); + put(TileEntityMachinePUREX.class, "tileentity_purex"); put(TileEntityMachineOilWell.class, "tileentity_derrick"); put(TileEntityMachinePumpjack.class, "tileentity_machine_pumpjack"); @@ -393,6 +406,7 @@ public class TileMappings { put(TileEntityRBMKConsole.class, "tileentity_rbmk_console"); put(TileEntityRBMKInlet.class, "tileentity_rbmk_inlet"); put(TileEntityRBMKOutlet.class, "tileentity_rbmk_outlet"); + put(TileEntityRBMKAutoloader.class, "tileentity_rbmk_autoloader"); } private static void putNetwork() { @@ -412,6 +426,7 @@ public class TileMappings { put(TileEntityPipePaintable.class, "tileentity_pipe_paintable"); put(TileEntityPipeGauge.class, "tileentity_pipe_gauge"); put(TileEntityPipeExhaust.class, "tileentity_pipe_exhaust"); + put(TileEntityPipeExhaustPaintable.class, "tileentity_pipe_exhaust_paintable"); put(TileEntityFluidValve.class, "tileentity_pipe_valve"); put(TileEntityFluidPump.class, "tileentity_pipe_pump"); @@ -425,8 +440,9 @@ public class TileMappings { put(TileEntityCranePartitioner.class, "tileentity_partitioner"); put(TileEntityFan.class, "tileentity_fan"); put(TileEntityPistonInserter.class, "tileentity_piston_inserter"); - + put(TileEntityPneumoTube.class, "tileentity_pneumatic_tube"); + put(TileEntityPneumoTubePaintable.class, "tileentity_pneumatic_tube_paintable"); put(TileEntityRadioTorchSender.class, "tileentity_rtty_sender"); put(TileEntityRadioTorchReceiver.class, "tileentity_rtty_rec"); @@ -444,6 +460,15 @@ public class TileMappings { put(TileEntityDroneRequester.class, "tileentity_drone_requester"); put(TileEntityRailSwitch.class, "tileentity_rail_switch"); + + put(TileEntityRebar.class, "tileentity_rebar"); + + // OC Compat items + boolean ocPresent = Loader.isModLoaded("OpenComputers"); + + if (ocPresent) { + put(TileEntityOpenComputersCablePaintable.class, "tileentity_oc_cable_paintable"); + } } private static void put(Class clazz, String... names) { @@ -456,5 +481,12 @@ public class TileMappings { if(IConfigurableMachine.class.isAssignableFrom(clazz)) { configurables.add((Class) clazz); } + + /** + * Causes problems with most machines where two independently acting tiles work together (TU machines, RBMKs, fluid transfer) + * Also breaks due to some sort of buffer leak in the threaded packets, if a boiler is involved (which uses a ByteBuf instead of the usual serializing) it crashes + * Ticking order of Torcherinos is AAA BBB CCC instead of ABC ABC ABC which can lead to some horrifying behavior + */ + Compat.blacklistAccelerator(clazz); } } diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java index f88b7070b..3e9875521 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java @@ -40,7 +40,9 @@ public class TileEntityNukeBalefire extends TileEntityMachineBase implements IGU if(!worldObj.isRemote) { - if(!this.isLoaded()) { + this.loaded = this.isLoaded(); + + if(!loaded) { started = false; } @@ -89,21 +91,15 @@ public class TileEntityNukeBalefire extends TileEntityMachineBase implements IGU } public boolean isLoaded() { - return hasEgg() && hasBattery(); } public boolean hasEgg() { - - if(slots[0] != null && slots[0].getItem() == ModItems.egg_balefire) { - return true; - } - + if(slots[0] != null && slots[0].getItem() == ModItems.egg_balefire) return true; return false; } public boolean hasBattery() { - return getBattery() > 0; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java index 5776fa53a..2c4999f23 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java @@ -105,7 +105,7 @@ public class TileEntityDiFurnaceRTG extends TileEntityMachineBase implements IGU for(int i = 0; i < 2; i++) { if(slots[i].stackSize <= 0) - slots[i] = new ItemStack(slots[i].getItem().setFull3D()); + slots[i] = new ItemStack(slots[i].getItem()); else slots[i].stackSize--; if(slots[i].stackSize <= 0) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java index 084aa7859..403e516f8 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java @@ -66,6 +66,8 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn public MaterialStack leftStack; public MaterialStack rightStack; public int maxMaterial = MaterialShapes.BLOCK.q(16); + + private int lastSelectedGUI = 0; public FluidTank[] tanks; @@ -248,6 +250,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn buf.writeInt(rightStack.material.id); buf.writeInt(rightStack.amount); } + buf.writeInt(lastSelectedGUI); } @Override @@ -269,6 +272,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn if(right) { this.rightStack = new MaterialStack(Mats.matById.get(buf.readInt()), buf.readInt()); } + this.lastSelectedGUI = buf.readInt(); } public boolean canProcessFluid() { @@ -423,6 +427,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn if(nbt.hasKey("rightType")) this.rightStack = new MaterialStack(Mats.matById.get(nbt.getInteger("rightType")), nbt.getInteger("rightAmount")); else this.rightStack = null; for(int i = 0; i < 4; i++) tanks[i].readFromNBT(nbt, "t" + i); + this.lastSelectedGUI = nbt.getInteger("lastSelectedGUI"); } @Override @@ -443,7 +448,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn nbt.setInteger("rightAmount", rightStack.amount); } for(int i = 0; i < 4; i++) tanks[i].writeToNBT(nbt, "t" + i); - + nbt.setInteger("lastSelectedGUI", this.lastSelectedGUI); } AxisAlignedBB bb = null; @@ -503,6 +508,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + if(ID == -1) ID = lastSelectedGUI; if(ID == 0) return new ContainerElectrolyserFluid(player.inventory, this); return new ContainerElectrolyserMetal(player.inventory, this); } @@ -510,6 +516,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn @Override @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + if(ID == -1) ID = lastSelectedGUI; if(ID == 0) return new GUIElectrolyserFluid(player.inventory, this); return new GUIElectrolyserMetal(player.inventory, this); } @@ -520,8 +527,10 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn @Override public void receiveControl(EntityPlayer player, NBTTagCompound data) { - if(data.hasKey("sgm")) FMLNetworkHandler.openGui(player, MainRegistry.instance, 1, worldObj, xCoord, yCoord, zCoord); - if(data.hasKey("sgf")) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, worldObj, xCoord, yCoord, zCoord); + if(data.hasKey("sgm")) lastSelectedGUI = 1; + if(data.hasKey("sgf")) lastSelectedGUI = 0; + + FMLNetworkHandler.openGui(player, MainRegistry.instance, lastSelectedGUI, worldObj, xCoord, yCoord, zCoord); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java index 1b75df130..93f8675ad 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java @@ -317,19 +317,19 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece } @Override - public boolean canExtractItem(int i, ItemStack itemStack, int j) { - return true; + public boolean canExtractItem(int slot, ItemStack stack, int side) { + return slot == 2; // only allow removing breeder outputs } @Override - public int[] getAccessibleSlotsFromSide(int p_94128_1_) { + public int[] getAccessibleSlotsFromSide(int side) { return new int[] { 1, 2, 4 }; } @Override - public boolean isItemValidForSlot(int i, ItemStack itemStack) { + public boolean isItemValidForSlot(int i, ItemStack stack) { - if(i == 1 && BreederRecipes.getOutput(itemStack) != null) + if(i == 1 && BreederRecipes.getOutput(stack) != null) return true; return false; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java deleted file mode 100644 index 7c6df467c..000000000 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java +++ /dev/null @@ -1,419 +0,0 @@ -package com.hbm.tileentity.machine; - -import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.machine.MachineArcFurnace; -import com.hbm.inventory.container.ContainerMachineArcFurnace; -import com.hbm.inventory.gui.GUIMachineArcFurnace; -import com.hbm.items.ModItems; -import com.hbm.lib.Library; -import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.TileEntityLoadedBase; -import com.hbm.util.CompatEnergyControl; - -import api.hbm.energymk2.IEnergyReceiverMK2; -import api.hbm.tile.IInfoProviderEC; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import io.netty.buffer.ByteBuf; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Container; -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.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements ISidedInventory, IEnergyReceiverMK2, IGUIProvider, IInfoProviderEC { - - private ItemStack slots[]; - - public int dualCookTime; - public long power; - public static final long maxPower = 50000; - public static final int processingSpeed = 20; - - //0: i - //1: o - //2: 1 - //3: 2 - //4: 3 - //5: b - private static final int[] slots_io = new int[] {0, 1, 2, 3, 4, 5}; - - private String customName; - - public TileEntityMachineArcFurnace() { - slots = new ItemStack[6]; - } - - @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.arcFurnace"; - } - - @Override - public boolean hasCustomInventoryName() { - return this.customName != null && this.customName.length() > 0; - } - - public void setCustomName(String name) { - this.customName = name; - markDirty(); - } - - @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; - } - } - - //You scrubs aren't needed for anything (right now) - @Override - public void openInventory() {} - @Override - public void closeInventory() {} - - @Override - public boolean isItemValidForSlot(int i, ItemStack itemStack) { - - if(i == 2 || i == 3 || i == 4) - return itemStack.getItem() == ModItems.arc_electrode; - - if(i == 0) - return FurnaceRecipes.smelting().getSmeltingResult(itemStack) != null; - - return false; - } - - @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 void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - NBTTagList list = nbt.getTagList("items", 10); - - this.power = nbt.getLong("powerTime"); - this.dualCookTime = nbt.getInteger("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); - } - } - - customName = nbt.getString("name"); - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setLong("powerTime", power); - nbt.setInteger("cookTime", dualCookTime); - 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); - - if (customName != null) { - nbt.setString("name", customName); - } - } - - @Override - public int[] getAccessibleSlotsFromSide(int side) { - return slots_io; - } - - @Override - public boolean canInsertItem(int i, ItemStack itemStack, int j) { - return this.isItemValidForSlot(i, itemStack); - } - - @Override - public boolean canExtractItem(int i, ItemStack itemStack, int j) { - - if(i == 1) - return true; - - if(i == 2 || i == 3 || i == 4) - return itemStack.getItem() == ModItems.arc_electrode_burnt; - - return false; - } - - public int getDiFurnaceProgressScaled(int i) { - return (dualCookTime * i) / processingSpeed; - } - - public long getPowerRemainingScaled(long i) { - return (power * i) / maxPower; - } - - public boolean hasPower() { - return power >= 250; - } - - public boolean isProcessing() { - return this.dualCookTime > 0; - } - - private boolean hasElectrodes() { - - if(slots[2] != null && slots[3] != null && slots[4] != null) { - if((slots[2].getItem() == ModItems.arc_electrode) && - (slots[3].getItem() == ModItems.arc_electrode) && - (slots[4].getItem() == ModItems.arc_electrode)) - return true; - } - - return false; - } - - public boolean canProcess() { - - if(!hasElectrodes()) - return false; - - if(slots[0] == null) - { - return false; - } - ItemStack itemStack = FurnaceRecipes.smelting().getSmeltingResult(this.slots[0]); - - if(itemStack == null) - { - return false; - } - - if(slots[1] == null) - { - return true; - } - - if(!slots[1].isItemEqual(itemStack)) { - return false; - } - - if(slots[1].stackSize < getInventoryStackLimit() && slots[1].stackSize < slots[1].getMaxStackSize()) { - return true; - }else{ - return slots[1].stackSize < itemStack.getMaxStackSize(); - } - } - - private void processItem() { - if(canProcess()) { - ItemStack itemStack = FurnaceRecipes.smelting().getSmeltingResult(this.slots[0]); - - if(slots[1] == null) - { - slots[1] = itemStack.copy(); - }else if(slots[1].isItemEqual(itemStack)) { - slots[1].stackSize += itemStack.stackSize; - } - - for(int i = 0; i < 1; i++) - { - if(slots[i].stackSize <= 0) - { - slots[i] = new ItemStack(slots[i].getItem()); - }else{ - slots[i].stackSize--; - } - if(slots[i].stackSize <= 0) - { - slots[i] = null; - } - } - } - } - - //TODO: fix this punjabi trash - @Override - public void updateEntity() { - boolean flag1 = false; - - if(!worldObj.isRemote) { - - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); - - if(hasPower() && canProcess()) - { - dualCookTime++; - - power -= 250; - - if(power < 0) - power = 0; - - if(this.dualCookTime == processingSpeed) - { - this.dualCookTime = 0; - this.processItem(); - flag1 = true; - } - }else{ - dualCookTime = 0; - } - - boolean trigger = true; - - if(hasPower() && canProcess() && this.dualCookTime == 0) - { - trigger = false; - } - - if(trigger) - { - flag1 = true; - MachineArcFurnace.updateBlockState(this.dualCookTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); - } - - if(worldObj.getBlock(xCoord, yCoord, zCoord) == ModBlocks.machine_arc_furnace_off) { - - int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); - - if(hasElectrodes() && meta <= 5) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, meta + 4, 2); - } - if(!hasElectrodes() && meta > 5) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, meta - 4, 2); - } - } - - power = Library.chargeTEFromItems(slots, 5, power, maxPower); - - networkPackNT(50); // it makes no sense to refactor this to some, but I want to delete the AuxElectricityPacket already - } - - if(flag1) - { - this.markDirty(); - } - } - - @Override - public void serialize(ByteBuf buf) { - super.serialize(buf); - buf.writeLong(power); - buf.writeInt(dualCookTime); - } - - @Override - public void deserialize(ByteBuf buf) { - super.deserialize(buf); - power = buf.readLong(); - dualCookTime = buf.readInt(); - } - - @Override - public void setPower(long i) { - power = i; - - } - - @Override - public long getPower() { - return power; - - } - - @Override - public long getMaxPower() { - return maxPower; - } - - @Override - public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new ContainerMachineArcFurnace(player.inventory, this); - } - - @Override - @SideOnly(Side.CLIENT) - public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new GUIMachineArcFurnace(player.inventory, this); - } - - @Override - public void provideExtraInfo(NBTTagCompound data) { - data.setBoolean(CompatEnergyControl.B_ACTIVE, this.hasPower() && this.canProcess()); - data.setInteger(CompatEnergyControl.I_PROGRESS, this.dualCookTime); - } -} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java index 6c9be1f71..6968f8b1a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java @@ -29,6 +29,7 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.CrucibleUtil; +import com.hbm.util.ItemStackUtil; import com.hbm.util.fauxpointtwelve.DirPos; import com.hbm.util.i18n.I18nUtil; @@ -400,6 +401,111 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl liquids.add(matStack.copy()); } + //Returns what is unused, or null if used up + public ItemStack distributeInput(ItemStack is, boolean modulate) { + if(is.stackSize == 0) return null; + ItemStack split; + + //Slots 0,1,2 + if(is.getItem() == ModItems.arc_electrode) { + for(int i = 0; i < 3; i++) { + if(slots[i] == null) { + split = is.splitStack(1); + if(modulate) this.setInventorySlotContents(i, split); + } + if (is.stackSize == 0) return null; + } + //Don't tell me you're gonna add an arc furnace recipe smelting electrodes + return is; + } + + //Slots 5-24 + ArcFurnaceRecipe recipe = ArcFurnaceRecipes.getOutput(is, this.liquidMode); + if(recipe != null) { + int maxStackSize = this.liquidMode ? 64 : recipe.solidOutput.getMaxStackSize() / recipe.solidOutput.stackSize; + maxStackSize = Math.min(maxStackSize, Math.min(is.getMaxStackSize(), getMaxInputSize())); + + //Scan + for(int i = 5; i < 25; i++){ + if(slots[i] == null) { + if(is.stackSize > maxStackSize) { + split = is.splitStack(maxStackSize); + if(modulate) slots[i] = split; + } else { + if(modulate) slots[i] = is; + return null; + } + } else if(ItemStackUtil.areStacksCompatible(is, slots[i]) && slots[i].stackSize < maxStackSize) { + if(is.stackSize > maxStackSize - slots[i].stackSize) { + is.splitStack(maxStackSize - slots[i].stackSize); + if(modulate) slots[i].stackSize = maxStackSize; + } else { + if(modulate) slots[i].stackSize += is.stackSize; + return null; + } + } + } + } + return is; + } + + //Returns requested ItemStack + public ItemStack collectRequested(ItemStack is, boolean modulate) { + int req = is.stackSize; + if(req == 0) return null; + + //Slots 0,1,2 + if(is.getItem() != ModItems.arc_electrode) { + for(int i = 0; i < 3; i++) { + if(slots[i] == null) continue; + if(ItemStackUtil.areStacksCompatible(is, slots[i])) { + if(req > slots[i].stackSize) { + req -= slots[i].stackSize; + if(modulate) slots[i] = null; + } else if(req < slots[i].stackSize) { + if(modulate) slots[i].stackSize -= req; + return is; + } else { + if(modulate) slots[i] = null; + return is; + } + } + } + } + + //Slots 5-24 + if(ArcFurnaceRecipes.getOutput(is, this.liquidMode) == null) { + for(int i = 5; i < 25; i++) { + if(slots[i] == null) continue; + if(ItemStackUtil.areStacksCompatible(is, slots[i])) { + if(req > slots[i].stackSize) { + req -= slots[i].stackSize; + if(modulate) slots[i] = null; + } else if(req < slots[i].stackSize) { + if(modulate) slots[i].stackSize -= req; + return is; + } else { + if(modulate) slots[i] = null; + return is; + } + } + } + } + + is.stackSize -= req; + if(is.stackSize == 0) return null; + return is; + } + + //Return ItemStack in slot, null if unavailable + public ItemStack getAvailableItemFromSlot(int slot) { + if(slots[slot] == null) return null; + if(slot < 3 && slots[slot].getItem() == ModItems.arc_electrode) return null; + else if(slot > 4 && ArcFurnaceRecipes.getOutput(slots[slot], this.liquidMode) != null) return null; + else if(slot == 3 || slot == 4) return null; + else return slots[slot]; + } + public static int getStackAmount(List stack) { int amount = 0; for(MaterialStack mat : stack) amount += mat.amount; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java index 53b47d04b..1117d6674 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java @@ -31,6 +31,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +@Deprecated public class TileEntityMachineAssembler extends TileEntityMachineAssemblerBase implements IUpgradeInfoProvider { public int recipe = -1; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java index d0d58dfb4..bcf3172d1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java @@ -22,6 +22,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +@Deprecated public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBase implements IEnergyReceiverMK2, IGUIProvider { public long power; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java new file mode 100644 index 000000000..ecc1c787c --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java @@ -0,0 +1,491 @@ +package com.hbm.tileentity.machine; + +import java.util.HashMap; +import java.util.List; +import java.util.Random; + +import com.hbm.blocks.ModBlocks; +import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.UpgradeManagerNT; +import com.hbm.inventory.container.ContainerMachineAssemblyMachine; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.gui.GUIMachineAssemblyMachine; +import com.hbm.inventory.recipes.AssemblyMachineRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemMachineUpgrade; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; +import com.hbm.lib.Library; +import com.hbm.main.MainRegistry; +import com.hbm.module.machine.ModuleMachineAssembler; +import com.hbm.sound.AudioWrapper; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.IUpgradeInfoProvider; +import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BobMathUtil; +import com.hbm.util.fauxpointtwelve.DirPos; +import com.hbm.util.i18n.I18nUtil; + +import api.hbm.energymk2.IEnergyReceiverMK2; +import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiverMK2, IUpgradeInfoProvider, IControlReceiver, IGUIProvider { + + public FluidTank inputTank; + public FluidTank outputTank; + + public long power; + public long maxPower = 100_000; + public boolean didProcess = false; + + public boolean frame = false; + private AudioWrapper audio; + + public ModuleMachineAssembler assemblerModule; + + public AssemblerArm[] arms = new AssemblerArm[2]; + public double prevRing; + public double ring; + public double ringSpeed; + public double ringTarget; + public int ringDelay; + + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(this); + + public TileEntityMachineAssemblyMachine() { + super(17); + this.inputTank = new FluidTank(Fluids.NONE, 4_000); + this.outputTank = new FluidTank(Fluids.NONE, 4_000); + + for(int i = 0; i < this.arms.length; i++) this.arms[i] = new AssemblerArm(); + + this.assemblerModule = new ModuleMachineAssembler(0, this, slots) + .itemInput(4).itemOutput(16) + .fluidInput(inputTank).fluidOutput(outputTank); + } + + @Override + public String getName() { + return "container.machineAssemblyMachine"; + } + + @Override + public void updateEntity() { + + if(maxPower <= 0) this.maxPower = 1_000_000; + + if(!worldObj.isRemote) { + + GenericRecipe recipe = AssemblyMachineRecipes.INSTANCE.recipeNameMap.get(assemblerModule.recipe); + if(recipe != null) { + this.maxPower = recipe.power * 100; + } + this.maxPower = BobMathUtil.max(this.power, this.maxPower, 100_000); + + this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); + upgradeManager.checkSlots(slots, 2, 3); + + for(DirPos pos : getConPos()) { + this.trySubscribe(worldObj, pos); + if(inputTank.getTankType() != Fluids.NONE) this.trySubscribe(inputTank.getTankType(), worldObj, pos); + if(outputTank.getFill() > 0) this.tryProvide(outputTank, worldObj, pos); + } + + double speed = 1D; + double pow = 1D; + + speed += Math.min(upgradeManager.getLevel(UpgradeType.SPEED), 3) / 3D; + speed += Math.min(upgradeManager.getLevel(UpgradeType.OVERDRIVE), 3); + + pow -= Math.min(upgradeManager.getLevel(UpgradeType.POWER), 3) * 0.25D; + pow += Math.min(upgradeManager.getLevel(UpgradeType.SPEED), 3) * 1D; + pow += Math.min(upgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) * 10D / 3D; + + this.assemblerModule.update(speed, pow, true, slots[1]); + this.didProcess = this.assemblerModule.didProcess; + if(this.assemblerModule.markDirty) this.markDirty(); + + if(didProcess) { + if(slots[0] != null && slots[0].getItem() == ModItems.meteorite_sword_alloyed) + slots[0] = new ItemStack(ModItems.meteorite_sword_machined); + } + + this.networkPackNT(100); + + } else { + + if(worldObj.getTotalWorldTime() % 20 == 0) { + frame = !worldObj.getBlock(xCoord, yCoord + 3, zCoord).isAir(worldObj, xCoord, yCoord + 3, zCoord); + } + + if(this.didProcess && MainRegistry.proxy.me().getDistance(xCoord , yCoord, zCoord) < 50) { + if(audio == null) { + audio = createAudioLoop(); + audio.startSound(); + } else if(!audio.isPlaying()) { + audio = rebootAudio(audio); + } + audio.keepAlive(); + audio.updatePitch(0.75F); + audio.updateVolume(this.getVolume(0.5F)); + + } else { + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + + for(AssemblerArm arm : arms) { + arm.updateInterp(); + if(didProcess) { + arm.updateArm(); + } else{ + arm.returnToNullPos(); + } + + if(!this.muffled && arm.prevAngles[3] != arm.angles[3] && arm.angles[3] == -0.75) { + MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.assemblerStrike", this.getVolume(0.5F), 1F); + } + } + + this.prevRing = this.ring; + + if(didProcess) { + if(this.ring != this.ringTarget) { + double ringDelta = Math.abs(this.ringTarget - this.ring); + if(ringDelta <= this.ringSpeed) this.ring = this.ringTarget; + if(this.ringTarget > this.ring) this.ring += this.ringSpeed; + if(this.ringTarget < this.ring) this.ring -= this.ringSpeed; + if(this.ringTarget == this.ring) { + if(ringTarget >= 360) { + this.ringTarget -= 360D; + this.ring -= 360D; + this.prevRing -= 360D; + } + if(ringTarget <= -360) { + this.ringTarget += 360D; + this.ring += 360D; + this.prevRing += 360D; + } + this.ringDelay = 20 + worldObj.rand.nextInt(21); + //MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.assemblerStop", this.getVolume(0.25F), 1.5F); + } + } else { + if(this.ringDelay > 0) this.ringDelay--; + if(this.ringDelay <= 0) { + this.ringTarget += (worldObj.rand.nextDouble() * 2 - 1) * 135; + this.ringSpeed = 10D + worldObj.rand.nextDouble() * 5D; + if(!this.muffled) MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.assemblerStart", this.getVolume(0.25F), 1.25F + worldObj.rand.nextFloat() * 0.25F); + } + } + } + } + } + + @Override public AudioWrapper createAudioLoop() { + return MainRegistry.proxy.getLoopedSound("hbm:block.motor", xCoord, yCoord, zCoord, 0.5F, 15F, 0.75F, 20); + } + + @Override public void onChunkUnload() { + if(audio != null) { audio.stopSound(); audio = null; } + } + + @Override public void invalidate() { + super.invalidate(); + if(audio != null) { audio.stopSound(); audio = null; } + } + + public DirPos[] getConPos() { + return new DirPos[] { + new DirPos(xCoord + 2, yCoord, zCoord - 1, Library.POS_X), + new DirPos(xCoord + 2, yCoord, zCoord + 0, Library.POS_X), + new DirPos(xCoord + 2, yCoord, zCoord + 1, Library.POS_X), + new DirPos(xCoord - 2, yCoord, zCoord - 1, Library.NEG_X), + new DirPos(xCoord - 2, yCoord, zCoord + 0, Library.NEG_X), + new DirPos(xCoord - 2, yCoord, zCoord + 1, Library.NEG_X), + new DirPos(xCoord - 1, yCoord, zCoord + 2, Library.POS_Z), + new DirPos(xCoord + 0, yCoord, zCoord + 2, Library.POS_Z), + new DirPos(xCoord + 1, yCoord, zCoord + 2, Library.POS_Z), + new DirPos(xCoord - 1, yCoord, zCoord - 2, Library.NEG_Z), + new DirPos(xCoord + 0, yCoord, zCoord - 2, Library.NEG_Z), + new DirPos(xCoord + 1, yCoord, zCoord - 2, Library.NEG_Z), + }; + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + this.inputTank.serialize(buf); + this.outputTank.serialize(buf); + buf.writeLong(power); + buf.writeLong(maxPower); + buf.writeBoolean(didProcess); + this.assemblerModule.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + boolean wasProcessing = this.didProcess; + this.inputTank.deserialize(buf); + this.outputTank.deserialize(buf); + this.power = buf.readLong(); + this.maxPower = buf.readLong(); + this.didProcess = buf.readBoolean(); + this.assemblerModule.deserialize(buf); + + if(wasProcessing && !didProcess) { + MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.assemblerStop", this.getVolume(0.25F), 1.5F); + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.inputTank.readFromNBT(nbt, "i"); + this.outputTank.readFromNBT(nbt, "o"); + this.power = nbt.getLong("power"); + this.maxPower = nbt.getLong("maxPower"); + this.assemblerModule.readFromNBT(nbt); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + this.inputTank.writeToNBT(nbt, "i"); + this.outputTank.writeToNBT(nbt, "o"); + nbt.setLong("power", power); + nbt.setLong("maxPower", maxPower); + this.assemblerModule.writeToNBT(nbt); + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + if(slot == 0) return true; // battery + if(slot == 1 && stack.getItem() == ModItems.blueprints) return true; + if(slot >= 2 && slot <= 3 && stack.getItem() instanceof ItemMachineUpgrade) return true; // upgrades + if(this.assemblerModule.isItemValid(slot, stack)) return true; // recipe input crap + return false; + } + + @Override + public boolean canExtractItem(int i, ItemStack itemStack, int j) { + return i == 16; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] {4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; + } + + @Override public long getPower() { return power; } + @Override public void setPower(long power) { this.power = power; } + @Override public long getMaxPower() { return maxPower; } + + @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {inputTank}; } + @Override public FluidTank[] getSendingTanks() { return new FluidTank[] {outputTank}; } + @Override public FluidTank[] getAllTanks() { return new FluidTank[] {inputTank, outputTank}; } + + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerMachineAssemblyMachine(player.inventory, this); } + @Override @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineAssemblyMachine(player.inventory, this); } + + @Override public boolean hasPermission(EntityPlayer player) { return this.isUseableByPlayer(player); } + + @Override + public void receiveControl(NBTTagCompound data) { + if(data.hasKey("index") && data.hasKey("selection")) { + int index = data.getInteger("index"); + String selection = data.getString("selection"); + if(index == 0) { + this.assemblerModule.recipe = selection; + this.markChanged(); + } + } + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + if(bb == null) bb = AxisAlignedBB.getBoundingBox(xCoord - 1, yCoord, zCoord - 1, xCoord + 2, yCoord + 3, zCoord + 2); + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } + + @Override + public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) { + return type == UpgradeType.SPEED || type == UpgradeType.POWER || type == UpgradeType.OVERDRIVE; + } + + @Override + public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { + info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_assembly_machine)); + if(type == UpgradeType.SPEED) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(KEY_SPEED, "+" + (level * 100 / 3) + "%")); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(KEY_CONSUMPTION, "+" + (level * 50) + "%")); + } + if(type == UpgradeType.POWER) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(KEY_CONSUMPTION, "-" + (level * 25) + "%")); + } + if(type == UpgradeType.OVERDRIVE) { + info.add((BobMathUtil.getBlink() ? EnumChatFormatting.RED : EnumChatFormatting.DARK_GRAY) + "YES"); + } + } + + @Override + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 3); + return upgrades; + } + + public static class AssemblerArm { + + public double[] angles = new double[4]; + public double[] prevAngles = new double[4]; + public double[] targetAngles = new double[4]; + public double[] speed = new double[4]; + + Random rand = new Random(); + ArmActionState state = ArmActionState.ASSUME_POSITION; + int actionDelay = 0; + + public static enum ArmActionState { + ASSUME_POSITION, + EXTEND_STRIKER, + RETRACT_STRIKER + } + + public AssemblerArm() { + this.resetSpeed(); + } + + private void updateInterp() { + for(int i = 0; i < angles.length; i++) { + prevAngles[i] = angles[i]; + } + } + + private void returnToNullPos() { + for(int i = 0; i < 4; i++) this.targetAngles[i] = 0; + for(int i = 0; i < 3; i++) this.speed[i] = 3; + this.speed[3] = 0.25; + this.state = ArmActionState.RETRACT_STRIKER; + + this.move(); + } + + private void resetSpeed() { + speed[0] = 15; //Pivot + speed[1] = 15; //Arm + speed[2] = 15; //Piston + speed[3] = 0.5; //Striker + } + + public void updateArm() { + resetSpeed(); + + if(actionDelay > 0) { + actionDelay--; + return; + } + + switch(state) { + // Move. If done moving, set a delay and progress to EXTEND + case ASSUME_POSITION: + if(move()) { + actionDelay = 2; + state = ArmActionState.EXTEND_STRIKER; + targetAngles[3] = -0.75D; + } + break; + case EXTEND_STRIKER: + if(move()) { + state = ArmActionState.RETRACT_STRIKER; + targetAngles[3] = 0D; + } + break; + case RETRACT_STRIKER: + if(move()) { + actionDelay = 2 + rand.nextInt(5); + chooseNewArmPoistion(); + state = ArmActionState.ASSUME_POSITION; + } + break; + + } + } + + private double[][] pos = new double[][] { // possible positions for the arms + {45, -15, -5}, + {15, 15, -15}, + {25, 10, -15}, + {30, 0, -10}, + {70, -10, -25}, + }; // sure it's not truly random like with the old assemfac, but at least now the striker always hits the center and doesn't clip through the board + + public void chooseNewArmPoistion() { + int chosen = rand.nextInt(pos.length); + this.targetAngles[0] = pos[chosen][0]; + this.targetAngles[1] = pos[chosen][1]; + this.targetAngles[2] = pos[chosen][2]; + } + + private boolean move() { + boolean didMove = false; + + for(int i = 0; i < angles.length; i++) { + if(angles[i] == targetAngles[i]) + continue; + + didMove = true; + + double angle = angles[i]; + double target = targetAngles[i]; + double turn = speed[i]; + double delta = Math.abs(angle - target); + + if(delta <= turn) { + angles[i] = targetAngles[i]; + continue; + } + + if(angle < target) { + angles[i] += turn; + } else { + angles[i] -= turn; + } + } + + return !didMove; + } + + public double[] getPositions(float interp) { + return new double[] { + BobMathUtil.interp(this.prevAngles[0], this.angles[0], interp), + BobMathUtil.interp(this.prevAngles[1], this.angles[1], interp), + BobMathUtil.interp(this.prevAngles[2], this.angles[2], interp), + BobMathUtil.interp(this.prevAngles[3], this.angles[3], interp) + }; + } + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java index a9bc5fc86..eafcb988c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java @@ -239,7 +239,7 @@ public class TileEntityMachineAutocrafter extends TileEntityMachineBase implemen ItemStack valid = slots[i]; if(valid == null) return false; //null? since slots[slot] is not null by now, this other slot needs the item more - if(!(valid.isItemEqual(stack) && ItemStack.areItemStackTagsEqual(valid, stack))) continue; //different item anyway? out with it + if(!(valid.isItemEqual(stack)/* && ItemStack.areItemStackTagsEqual(valid, stack)*/)) continue; //different item anyway? out with it //if there is another slot that actually does need the same item more, cancel if(valid.stackSize < size) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java index f88c37ac3..7763e5ee7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java @@ -305,6 +305,14 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB entityItem.delayBeforeCanPickup = 10; worldObj.spawnEntityInWorld(entityItem); } + + // Apparently, until 1.14 full-grown wheat could sometimes drop no seeds at all + // This is a quick and dirty workaround for that. + if (b == Blocks.wheat && !replanted) { + replacementBlock = b; + replacementMeta = 0; + replanted = true; + } } worldObj.setBlock(x, y, z, replacementBlock, replacementMeta, 3); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java index 07c5ea852..c5b5e9da6 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java @@ -236,7 +236,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement audioDuration = MathHelper.clamp_int(audioDuration, 0, 60); - if(audioDuration > 10) { + if(audioDuration > 10 && MainRegistry.proxy.me().getDistance(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 25) { if(audio == null) { audio = createAudioLoop(); @@ -247,6 +247,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement audio.updateVolume(getVolume(1F)); audio.updatePitch((audioDuration - 10) / 100F + 0.5F); + audio.keepAlive(); } else { @@ -276,7 +277,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement @Override public AudioWrapper createAudioLoop() { - return MainRegistry.proxy.getLoopedSound("hbm:block.centrifugeOperate", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F); + return MainRegistry.proxy.getLoopedSound("hbm:block.centrifugeOperate", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F, 20); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java index 8b31f6f11..ca0c259c7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java @@ -10,11 +10,14 @@ import com.hbm.inventory.container.ContainerMachineChemicalFactory; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachineChemicalFactory; +import com.hbm.inventory.recipes.ChemicalPlantRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.module.ModuleMachineChemplant; +import com.hbm.module.machine.ModuleMachineChemplant; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; @@ -48,7 +51,7 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl public FluidTank lps; public long power; - public long maxPower = 10_000_000; + public long maxPower = 1_000_000; public boolean[] didProcess = new boolean[4]; public boolean frame = false; @@ -101,6 +104,7 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { if(slot == 0) return true; // battery + for(int i = 0; i < 4; i++) if(slot == 4 + i * 7 && stack.getItem() == ModItems.blueprints) return true; if(slot >= 1 && slot <= 3 && stack.getItem() instanceof ItemMachineUpgrade) return true; // upgrades for(int i = 0; i < 4; i++) if(this.chemplantModule[i].isItemValid(slot, stack)) return true; // recipe input crap return false; @@ -128,6 +132,16 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl if(!worldObj.isRemote) { + long nextMaxPower = 0; + for(int i = 0; i < 4; i++) { + GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(chemplantModule[i].recipe); + if(recipe != null) { + nextMaxPower += recipe.power * 100; + } + } + this.maxPower = nextMaxPower; + this.maxPower = BobMathUtil.max(this.power, this.maxPower, 1_000_000); + this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); upgradeManager.checkSlots(slots, 1, 3); @@ -163,7 +177,7 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl boolean markDirty = false; for(int i = 0; i < 4; i++) { - this.chemplantModule[i].update(speed * 2D, pow * 2D, canCool()); + this.chemplantModule[i].update(speed * 2D, pow * 2D, canCool(), slots[4 + i * 7]); this.didProcess[i] = this.chemplantModule[i].didProcess; markDirty |= this.chemplantModule[i].markDirty; @@ -314,6 +328,9 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl for(int i = 0; i < inputTanks.length; i++) this.inputTanks[i].readFromNBT(nbt, "i" + i); for(int i = 0; i < outputTanks.length; i++) this.outputTanks[i].readFromNBT(nbt, "i" + i); + this.water.readFromNBT(nbt, "w"); + this.lps.readFromNBT(nbt, "s"); + this.power = nbt.getLong("power"); this.maxPower = nbt.getLong("maxPower"); for(int i = 0; i < 4; i++) this.chemplantModule[i].readFromNBT(nbt); @@ -326,6 +343,9 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl for(int i = 0; i < inputTanks.length; i++) this.inputTanks[i].writeToNBT(nbt, "i" + i); for(int i = 0; i < outputTanks.length; i++) this.outputTanks[i].writeToNBT(nbt, "i" + i); + this.water.writeToNBT(nbt, "w"); + this.lps.writeToNBT(nbt, "s"); + nbt.setLong("power", power); nbt.setLong("maxPower", maxPower); for(int i = 0; i < 4; i++) this.chemplantModule[i].writeToNBT(nbt); @@ -377,7 +397,7 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl @Override public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { - info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_chemical_plant)); + info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_chemical_factory)); if(type == UpgradeType.SPEED) { info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(KEY_SPEED, "+" + (level * 100 / 3) + "%")); info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(KEY_CONSUMPTION, "+" + (level * 50) + "%")); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java index 838958668..97ebd11bf 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java @@ -10,11 +10,14 @@ import com.hbm.inventory.container.ContainerMachineChemicalPlant; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachineChemicalPlant; +import com.hbm.inventory.recipes.ChemicalPlantRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.module.ModuleMachineChemplant; +import com.hbm.module.machine.ModuleMachineChemplant; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; @@ -42,7 +45,7 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem public FluidTank[] outputTanks; public long power; - public long maxPower = 1_000_000; + public long maxPower = 100_000; public boolean didProcess = false; public boolean frame = false; @@ -82,6 +85,12 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem if(!worldObj.isRemote) { + GenericRecipe recipe = ChemicalPlantRecipes.INSTANCE.recipeNameMap.get(chemplantModule.recipe); + if(recipe != null) { + this.maxPower = recipe.power * 100; + } + this.maxPower = BobMathUtil.max(this.power, this.maxPower, 100_000); + this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); upgradeManager.checkSlots(slots, 2, 3); @@ -109,10 +118,15 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem pow += Math.min(upgradeManager.getLevel(UpgradeType.SPEED), 3) * 1D; pow += Math.min(upgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) * 10D / 3D; - this.chemplantModule.update(speed, pow, true); + this.chemplantModule.update(speed, pow, true, slots[1]); this.didProcess = this.chemplantModule.didProcess; if(this.chemplantModule.markDirty) this.markDirty(); + if(didProcess) { + if(slots[0] != null && slots[0].getItem() == ModItems.meteorite_sword_machined) + slots[0] = new ItemStack(ModItems.meteorite_sword_treated); + } + this.networkPackNT(100); } else { @@ -226,6 +240,7 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { if(slot == 0) return true; // battery + if(slot == 1 && stack.getItem() == ModItems.blueprints) return true; if(slot >= 2 && slot <= 3 && stack.getItem() instanceof ItemMachineUpgrade) return true; // upgrades if(slot >= 10 && slot <= 12) return true; // input fluid if(slot >= 16 && slot <= 18) return true; // output fluid diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java index a72d1996e..1c1a940e9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java @@ -31,7 +31,6 @@ 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.EnumChatFormatting; import net.minecraft.world.World; @@ -51,7 +50,7 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme public FluidTank tank; - public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(this); public TileEntityMachineCrystallizer() { super(8); @@ -76,7 +75,7 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme tank.setType(7, slots); tank.loadTank(3, 4, slots); - upgradeManager.checkSlots(this, slots, 5, 6); + upgradeManager.checkSlots(slots, 5, 6); for(int i = 0; i < getCycleCount(); i++) { @@ -299,14 +298,8 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { - - CrystallizerRecipe recipe = CrystallizerRecipes.getOutput(itemStack, tank.getTankType()); - if(i == 0 && recipe != null) { - return true; - } - - if(i == 1 && itemStack.getItem() instanceof IBatteryItem) - return true; + if(i == 0 && CrystallizerRecipes.getOutput(itemStack, tank.getTankType()) != null) return true; + if(i == 1 && itemStack.getItem() instanceof IBatteryItem) return true; return false; } @@ -318,13 +311,26 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme @Override public int[] getAccessibleSlotsFromSide(int side) { - - return side == 0 ? new int[] { 2 } : new int[] { 0, 2 }; + return new int[] { 0, 2 }; } + AxisAlignedBB bb = null; + @Override public AxisAlignedBB getRenderBoundingBox() { - return TileEntity.INFINITE_EXTENT_AABB; + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 1, + yCoord, + zCoord - 1, + xCoord + 2, + yCoord + 10, + zCoord + 2 + ); + } + + return bb; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java index b2afe4309..4dc4df595 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java @@ -64,6 +64,11 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE if(!worldObj.isRemote) { + // Triggers the legacy monoblock fix + if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) < 12) { + worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord), 1); + } + this.updateConnections(); power = Library.chargeTEFromItems(slots, 0, power, maxPower); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java index 84c1fd378..bd76ff316 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java @@ -154,7 +154,7 @@ public class TileEntityMachineElectricFurnace extends TileEntityMachineBase impl for(int i = 1; i < 2; i++) { if(slots[i].stackSize <= 0) { - slots[i] = new ItemStack(slots[i].getItem().setFull3D()); + slots[i] = new ItemStack(slots[i].getItem()); } else { slots[i].stackSize--; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java index 62e76ae0e..7a63ee4d7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java @@ -151,7 +151,7 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I if(te instanceof TileEntityMachineGasCent) { TileEntityMachineGasCent cent = (TileEntityMachineGasCent) te; - if(cent.tank.getFill() == 0 && cent.tank.getTankType() == tank.getTankType()) { + if(cent.tank.getTankType() == tank.getTankType()) { if(cent.inputTank.getTankType() != outputTank.getTankType() && outputTank.getTankType() != PseudoFluidType.NONE) { cent.inputTank.setTankType(outputTank.getTankType()); cent.outputTank.setTankType(outputTank.getTankType().getOutputType()); @@ -237,7 +237,7 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I audioDuration = MathHelper.clamp_int(audioDuration, 0, 60); - if(audioDuration > 10) { + if(audioDuration > 10 && MainRegistry.proxy.me().getDistance(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 25) { if(audio == null) { audio = createAudioLoop(); @@ -248,6 +248,7 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I audio.updateVolume(getVolume(1F)); audio.updatePitch((audioDuration - 10) / 100F + 0.5F); + audio.keepAlive(); } else { @@ -261,7 +262,27 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I @Override public AudioWrapper createAudioLoop() { - return MainRegistry.proxy.getLoopedSound("hbm:block.centrifugeOperate", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F); + return MainRegistry.proxy.getLoopedSound("hbm:block.centrifugeOperate", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F, 20); + } + + @Override + public void onChunkUnload() { + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + + @Override + public void invalidate() { + + super.invalidate(); + + if(audio != null) { + audio.stopSound(); + audio = null; + } } @Override @@ -314,21 +335,9 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I }; } - @Override - public void setPower(long i) { - power = i; - } - - @Override - public long getPower() { - return power; - - } - - @Override - public long getMaxPower() { - return maxPower; - } + @Override public void setPower(long i) { power = i; } + @Override public long getPower() { return power; } + @Override public long getMaxPower() { return maxPower; } public int getProcessingSpeed() { if(slots[6] != null && slots[6].getItem() == ModItems.upgrade_gc_speed) { @@ -352,7 +361,6 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I tank.setTankType(newType); } } - } } @@ -374,7 +382,6 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I if(bb == null) { bb = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 5, zCoord + 1); } - return bb; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java index 2d82a79ff..358aa12ec 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java @@ -211,11 +211,10 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen } private void buildDam() { - - if(worldObj.getBlock(targetX + 1, targetY, targetZ).getMaterial().isLiquid()) worldObj.setBlock(targetX + 1, targetY, targetZ, ModBlocks.barricade); - if(worldObj.getBlock(targetX - 1, targetY, targetZ).getMaterial().isLiquid()) worldObj.setBlock(targetX - 1, targetY, targetZ, ModBlocks.barricade); - if(worldObj.getBlock(targetX, targetY, targetZ + 1).getMaterial().isLiquid()) worldObj.setBlock(targetX, targetY, targetZ + 1, ModBlocks.barricade); - if(worldObj.getBlock(targetX, targetY, targetZ - 1).getMaterial().isLiquid()) worldObj.setBlock(targetX, targetY, targetZ - 1, ModBlocks.barricade); + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + if(worldObj.getBlock(targetX + dir.offsetX, targetY + dir.offsetY, targetZ + dir.offsetZ).getMaterial().isLiquid()) worldObj.setBlock(targetX + dir.offsetX, targetY + dir.offsetY, targetZ + dir.offsetZ, ModBlocks.barricade); + } } private void tryFillContainer(int x, int y, int z) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java new file mode 100644 index 000000000..45a476b35 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePUREX.java @@ -0,0 +1,286 @@ +package com.hbm.tileentity.machine; + +import java.util.HashMap; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.UpgradeManagerNT; +import com.hbm.inventory.container.ContainerMachinePUREX; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.gui.GUIMachinePUREX; +import com.hbm.inventory.recipes.PUREXRecipes; +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemMachineUpgrade; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; +import com.hbm.lib.Library; +import com.hbm.module.machine.ModuleMachinePUREX; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.IUpgradeInfoProvider; +import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BobMathUtil; +import com.hbm.util.fauxpointtwelve.DirPos; +import com.hbm.util.i18n.I18nUtil; + +import api.hbm.energymk2.IEnergyReceiverMK2; +import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +public class TileEntityMachinePUREX extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiverMK2, IUpgradeInfoProvider, IControlReceiver, IGUIProvider { + + public FluidTank[] inputTanks; + public FluidTank[] outputTanks; + + public long power; + public long maxPower = 1_000_000; + public boolean didProcess = false; + + public boolean frame = false; + public int anim; + public int prevAnim; + + public ModuleMachinePUREX purexModule; + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(this); + + public TileEntityMachinePUREX() { + super(13); + + this.inputTanks = new FluidTank[3]; + this.outputTanks = new FluidTank[1]; + for(int i = 0; i < 3; i++) { + this.inputTanks[i] = new FluidTank(Fluids.NONE, 24_000); + } + this.outputTanks[0] = new FluidTank(Fluids.NONE, 24_000); + + this.purexModule = new ModuleMachinePUREX(0, this, slots) + .itemInput(4).itemOutput(7) + .fluidInput(inputTanks[0], inputTanks[1], inputTanks[2]).fluidOutput(outputTanks[0]); + } + + @Override + public String getName() { + return "container.machinePUREX"; + } + + @Override + public void updateEntity() { + + if(maxPower <= 0) this.maxPower = 1_000_000; + + if(!worldObj.isRemote) { + + GenericRecipe recipe = PUREXRecipes.INSTANCE.recipeNameMap.get(purexModule.recipe); + if(recipe != null) { + this.maxPower = recipe.power * 100; + } + this.maxPower = BobMathUtil.max(this.power, this.maxPower, 1_000_000); + + this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); + upgradeManager.checkSlots(slots, 2, 3); + + for(DirPos pos : getConPos()) { + this.trySubscribe(worldObj, pos); + for(FluidTank tank : inputTanks) if(tank.getTankType() != Fluids.NONE) this.trySubscribe(tank.getTankType(), worldObj, pos); + for(FluidTank tank : outputTanks) if(tank.getFill() > 0) this.tryProvide(tank, worldObj, pos); + } + + double speed = 1D; + double pow = 1D; + + speed += Math.min(upgradeManager.getLevel(UpgradeType.SPEED), 3) / 3D; + speed += Math.min(upgradeManager.getLevel(UpgradeType.OVERDRIVE), 3); + + pow -= Math.min(upgradeManager.getLevel(UpgradeType.POWER), 3) * 0.25D; + pow += Math.min(upgradeManager.getLevel(UpgradeType.SPEED), 3) * 1D; + pow += Math.min(upgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) * 10D / 3D; + + this.purexModule.update(speed, pow, true, slots[1]); + this.didProcess = this.purexModule.didProcess; + if(this.purexModule.markDirty) this.markDirty(); + + this.networkPackNT(100); + + } else { + + this.prevAnim = this.anim; + if(this.didProcess) this.anim++; + + if(worldObj.getTotalWorldTime() % 20 == 0) { + frame = !worldObj.getBlock(xCoord, yCoord + 5, zCoord).isAir(worldObj, xCoord, yCoord + 5, zCoord); + } + } + } + + public DirPos[] getConPos() { + return new DirPos[] { + new DirPos(xCoord + 3, yCoord, zCoord - 2, Library.POS_X), + new DirPos(xCoord + 3, yCoord, zCoord - 1, Library.POS_X), + new DirPos(xCoord + 3, yCoord, zCoord + 0, Library.POS_X), + new DirPos(xCoord + 3, yCoord, zCoord + 1, Library.POS_X), + new DirPos(xCoord + 3, yCoord, zCoord + 2, Library.POS_X), + new DirPos(xCoord - 3, yCoord, zCoord - 1, Library.NEG_X), + new DirPos(xCoord - 3, yCoord, zCoord - 2, Library.NEG_X), + new DirPos(xCoord - 3, yCoord, zCoord + 0, Library.NEG_X), + new DirPos(xCoord - 3, yCoord, zCoord + 1, Library.NEG_X), + new DirPos(xCoord - 3, yCoord, zCoord + 2, Library.NEG_X), + new DirPos(xCoord - 2, yCoord, zCoord + 3, Library.POS_Z), + new DirPos(xCoord - 1, yCoord, zCoord + 3, Library.POS_Z), + new DirPos(xCoord + 0, yCoord, zCoord + 3, Library.POS_Z), + new DirPos(xCoord + 1, yCoord, zCoord + 3, Library.POS_Z), + new DirPos(xCoord + 2, yCoord, zCoord + 3, Library.POS_Z), + new DirPos(xCoord - 2, yCoord, zCoord - 3, Library.NEG_Z), + new DirPos(xCoord - 1, yCoord, zCoord - 3, Library.NEG_Z), + new DirPos(xCoord + 0, yCoord, zCoord - 3, Library.NEG_Z), + new DirPos(xCoord + 1, yCoord, zCoord - 3, Library.NEG_Z), + new DirPos(xCoord + 2, yCoord, zCoord - 3, Library.NEG_Z), + }; + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + for(FluidTank tank : inputTanks) tank.serialize(buf); + for(FluidTank tank : outputTanks) tank.serialize(buf); + buf.writeLong(power); + buf.writeLong(maxPower); + buf.writeBoolean(didProcess); + this.purexModule.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + for(FluidTank tank : inputTanks) tank.deserialize(buf); + for(FluidTank tank : outputTanks) tank.deserialize(buf); + this.power = buf.readLong(); + this.maxPower = buf.readLong(); + this.didProcess = buf.readBoolean(); + this.purexModule.deserialize(buf); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + for(int i = 0; i < 3; i++) { + this.inputTanks[i].readFromNBT(nbt, "i" + i); + } + this.outputTanks[0].readFromNBT(nbt, "o" + 0); + + this.power = nbt.getLong("power"); + this.maxPower = nbt.getLong("maxPower"); + this.purexModule.readFromNBT(nbt); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + for(int i = 0; i < 3; i++) { + this.inputTanks[i].writeToNBT(nbt, "i" + i); + } + this.outputTanks[0].writeToNBT(nbt, "o" + 0); + + nbt.setLong("power", power); + nbt.setLong("maxPower", maxPower); + this.purexModule.writeToNBT(nbt); + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + if(slot == 0) return true; // battery + if(slot == 1 && stack.getItem() == ModItems.blueprints) return true; + if(slot >= 2 && slot <= 3 && stack.getItem() instanceof ItemMachineUpgrade) return true; // upgrades + if(this.purexModule.isItemValid(slot, stack)) return true; // recipe input crap + return false; + } + + @Override + public boolean canExtractItem(int i, ItemStack itemStack, int j) { + return i >= 7 && i <= 12; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] {4, 5, 6, 7, 8, 9, 10, 11, 12}; + } + + @Override public long getPower() { return power; } + @Override public void setPower(long power) { this.power = power; } + @Override public long getMaxPower() { return maxPower; } + + @Override public FluidTank[] getReceivingTanks() { return inputTanks; } + @Override public FluidTank[] getSendingTanks() { return outputTanks; } + @Override public FluidTank[] getAllTanks() { return new FluidTank[] {inputTanks[0], inputTanks[1], inputTanks[2], outputTanks[0]}; } + + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerMachinePUREX(player.inventory, this); } + @Override @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachinePUREX(player.inventory, this); } + + @Override public boolean hasPermission(EntityPlayer player) { return this.isUseableByPlayer(player); } + + @Override + public void receiveControl(NBTTagCompound data) { + if(data.hasKey("index") && data.hasKey("selection")) { + int index = data.getInteger("index"); + String selection = data.getString("selection"); + if(index == 0) { + this.purexModule.recipe = selection; + this.markChanged(); + } + } + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + if(bb == null) bb = AxisAlignedBB.getBoundingBox(xCoord - 2, yCoord, zCoord - 2, xCoord + 3, yCoord + 5, zCoord + 3); + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } + + @Override + public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) { + return type == UpgradeType.SPEED || type == UpgradeType.POWER || type == UpgradeType.OVERDRIVE; + } + + @Override + public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { + info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_purex)); + if(type == UpgradeType.SPEED) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(KEY_SPEED, "+" + (level * 100 / 3) + "%")); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(KEY_CONSUMPTION, "+" + (level * 50) + "%")); + } + if(type == UpgradeType.POWER) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(KEY_CONSUMPTION, "-" + (level * 25) + "%")); + } + if(type == UpgradeType.OVERDRIVE) { + info.add((BobMathUtil.getBlink() ? EnumChatFormatting.RED : EnumChatFormatting.DARK_GRAY) + "YES"); + } + } + + @Override + public HashMap getValidUpgrades() { + HashMap upgrades = new HashMap<>(); + upgrades.put(UpgradeType.SPEED, 3); + upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 3); + return upgrades; + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java index c927edc0a..a0d1e5b8a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java @@ -53,6 +53,11 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU if(!worldObj.isRemote) { + // Triggers the legacy monoblock fix + if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) < 12) { + worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord), 1); + } + boolean preheated = false; for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java index 5fe3ae5ca..b3589fd45 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java @@ -32,7 +32,7 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I public static final long maxPower = 10000; public static final int processingSpeed = 60; - private static final int[] slots_io = new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}; + private static final int[] slots_io = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 }; private String customName; @@ -52,21 +52,19 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I @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(); } } @@ -93,42 +91,44 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I @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 stack) { - if(i < 9) return ShredderRecipes.getShredderResult(stack) != null && !(stack.getItem() instanceof ItemBlades); - if(i == 29) return stack.getItem() instanceof IBatteryItem; - if(i == 27 || i == 28) return stack.getItem() instanceof ItemBlades; + if(i < 9) + return ShredderRecipes.getShredderResult(stack) != null && !(stack.getItem() instanceof ItemBlades); + if(i == 29) + return stack.getItem() instanceof IBatteryItem; + if(i == 27 || i == 28) + return stack.getItem() instanceof ItemBlades; return false; } @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; } @@ -146,12 +146,10 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I this.power = nbt.getLong("powerTime"); 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); } } @@ -165,19 +163,17 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I nbt.setLong("powerTime", power); 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); - - if (customName != null) { + + if(customName != null) { nbt.setString("name", customName); } } @@ -210,8 +206,11 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I @Override public boolean canExtractItem(int i, ItemStack itemStack, int j) { - if(i >= 9 && i <= 26) return true; - if(i >= 27 && i <= 28) if(itemStack.getItemDamage() == itemStack.getMaxDamage() && itemStack.getMaxDamage() > 0) return true; + if(i >= 9 && i <= 26) + return true; + if(i >= 27 && i <= 28) + if(itemStack.getItemDamage() == itemStack.getMaxDamage() && itemStack.getMaxDamage() > 0) + return true; return false; } @@ -235,15 +234,15 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I if(!worldObj.isRemote) { this.updateConnections(); + + if(this.progress == 0) this.soundCycle = 0; - if(hasPower() && canProcess()) - { + if(hasPower() && canProcess()) { progress++; power -= 5; - if(this.progress == TileEntityMachineShredder.processingSpeed) - { + if(this.progress == TileEntityMachineShredder.processingSpeed) { for(int i = 27; i <= 28; i++) if(slots[i].getMaxDamage() > 0) this.slots[i].setItemDamage(this.slots[i].getItemDamage() + 1); @@ -253,34 +252,31 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I flag1 = true; } if(soundCycle == 0) - this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "minecart.base", getVolume(1.0F), 0.75F); + this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "minecart.base", getVolume(1.0F), 0.75F); soundCycle++; if(soundCycle >= 50) soundCycle = 0; - }else{ + } else { progress = 0; } boolean trigger = true; - if(hasPower() && canProcess() && this.progress == 0) - { + if(hasPower() && canProcess() && this.progress == 0) { trigger = false; } - if(trigger) - { - flag1 = true; - } + if(trigger) { + flag1 = true; + } power = Library.chargeTEFromItems(slots, 29, power, maxPower); networkPackNT(50); } - if(flag1) - { + if(flag1) { this.markDirty(); } } @@ -305,20 +301,15 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I public void processItem() { - for(int inpSlot = 0; inpSlot < 9; inpSlot++) - { - if(slots[inpSlot] != null && hasSpace(slots[inpSlot])) - { + for(int inpSlot = 0; inpSlot < 9; inpSlot++) { + if(slots[inpSlot] != null && hasSpace(slots[inpSlot])) { ItemStack inp = slots[inpSlot]; ItemStack outp = ShredderRecipes.getShredderResult(inp); boolean flag = false; - for (int outSlot = 9; outSlot < 27; outSlot++) - { - if (slots[outSlot] != null && slots[outSlot].getItem() == outp.getItem() && - slots[outSlot].getItemDamage() == outp.getItemDamage() && - slots[outSlot].stackSize + outp.stackSize <= outp.getMaxStackSize()) { + for(int outSlot = 9; outSlot < 27; outSlot++) { + if(slots[outSlot] != null && slots[outSlot].getItem() == outp.getItem() && slots[outSlot].getItemDamage() == outp.getItemDamage() && slots[outSlot].stackSize + outp.stackSize <= outp.getMaxStackSize()) { slots[outSlot].stackSize += outp.stackSize; slots[inpSlot].stackSize -= 1; @@ -328,9 +319,8 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I } if(!flag) - for (int outSlot = 9; outSlot < 27; outSlot++) - { - if (slots[outSlot] == null) { + for(int outSlot = 9; outSlot < 27; outSlot++) { + if(slots[outSlot] == null) { slots[outSlot] = outp.copy(); slots[inpSlot].stackSize -= 1; break; @@ -344,14 +334,10 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I } public boolean canProcess() { - if(slots[27] != null && slots[28] != null && - this.getGearLeft() > 0 && this.getGearLeft() < 3 && - this.getGearRight() > 0 && this.getGearRight() < 3) { + if(slots[27] != null && slots[28] != null && this.getGearLeft() > 0 && this.getGearLeft() < 3 && this.getGearRight() > 0 && this.getGearRight() < 3) { - for(int i = 0; i < 9; i++) - { - if(slots[i] != null && slots[i].stackSize > 0 && hasSpace(slots[i])) - { + for(int i = 0; i < 9; i++) { + if(slots[i] != null && slots[i].stackSize > 0 && hasSpace(slots[i])) { return true; } } @@ -364,14 +350,13 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I ItemStack result = ShredderRecipes.getShredderResult(stack); - if (result != null) - for (int i = 9; i < 27; i++) { - if (slots[i] == null) { + if(result != null) + for(int i = 9; i < 27; i++) { + if(slots[i] == null) { return true; } - if (slots[i] != null && slots[i].getItem().equals(result.getItem()) - && slots[i].stackSize + result.stackSize <= result.getMaxStackSize()) { + if(slots[i] != null && slots[i].getItem().equals(result.getItem()) && slots[i].stackSize + result.stackSize <= result.getMaxStackSize()) { return true; } } @@ -401,13 +386,11 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I public int getGearLeft() { - if(slots[27] != null && slots[27].getItem() instanceof ItemBlades) - { + if(slots[27] != null && slots[27].getItem() instanceof ItemBlades) { if(slots[27].getMaxDamage() == 0) return 1; - if(slots[27].getItemDamage() < slots[27].getItem().getMaxDamage()/2) - { + if(slots[27].getItemDamage() < slots[27].getItem().getMaxDamage() / 2) { return 1; } else if(slots[27].getItemDamage() != slots[27].getItem().getMaxDamage()) { return 2; @@ -421,13 +404,11 @@ public class TileEntityMachineShredder extends TileEntityLoadedBase implements I public int getGearRight() { - if(slots[28] != null && slots[28].getItem() instanceof ItemBlades) - { + if(slots[28] != null && slots[28].getItem() instanceof ItemBlades) { if(slots[28].getMaxDamage() == 0) return 1; - if(slots[28].getItemDamage() < slots[28].getItem().getMaxDamage()/2) - { + if(slots[28].getItemDamage() < slots[28].getItem().getMaxDamage() / 2) { return 1; } else if(slots[28].getItemDamage() != slots[28].getItem().getMaxDamage()) { return 2; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java index 85e982856..079a563e4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java @@ -236,7 +236,7 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS } } nbt.setTag("items", list); - + if (customName != null) { nbt.setString("name", customName); } @@ -280,7 +280,7 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS this.tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); tanks[0].setType(0, 1, slots); - tanks[0].loadTank(2, 3, slots); + tanks[0].loadTank(2, 3, slots); power = Library.chargeItemsFromTE(slots, 4, power, maxPower); FluidType in = tanks[0].getTankType(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java index 26a44455f..0ce97569d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java @@ -106,10 +106,17 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement } } - if(autoMode) { //power production depending on power requirement + if(autoMode) { //power production depending on power requirement and fuel level - //scales the slider proportionally to the power gauge - int powerSliderTarget = 60 - (int) (60 * power / maxPower); + int powerSliderTarget; + + //when low on fuel, decrease consumption linearly + if(tanks[0].getFill() * 10 > tanks[0].getMaxFill()) { + powerSliderTarget = 60 - (int) (60 * power / maxPower); //scales the slider proportionally to the power gauge + } + else { + powerSliderTarget = (int) ( tanks[0].getFill() * 0.0001 * (60 - (int) (60 * power / maxPower)) ); + } if(powerSliderTarget > powerSliderPos) { //makes the auto slider slide instead of snapping into position powerSliderPos++; @@ -396,12 +403,12 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement double waterPerTick = (consMax * energy * (temp - tempIdle) / 220000); //it just works fuck you this.waterToBoil = waterPerTick; //caching in a field for the EC compat to use - + int heatCycles = (int) Math.floor(waterToBoil); int waterCycles = tanks[2].getFill(); int steamCycles = (tanks[3].getMaxFill() - tanks[3].getFill()) / 10; int cycles = BobMathUtil.min(heatCycles, waterCycles, steamCycles); - + tanks[2].setFill(tanks[2].getFill() - cycles); tanks[3].setFill(tanks[3].getFill() + cycles * 10); } @@ -612,8 +619,11 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement @Callback(direct = true, limit = 4) @Optional.Method(modid = "OpenComputers") public Object[] setThrottle(Context context, Arguments args) { - powerSliderPos = (int) (args.checkInteger(0) * 60D / 100D); - return new Object[] {}; + double input = args.checkInteger(0) * 60D / 100D; + if (input < 0 || input > 100) + return new Object[] {null, "Input out of range."}; + powerSliderPos = (int) (input); + return new Object[] {true}; } @Callback(direct = true, limit = 4) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 653ec66ca..1cff1e6e5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -12,12 +12,13 @@ import com.hbm.inventory.container.ContainerPWR; 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_PWRModerator; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingStep; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; +import com.hbm.inventory.fluid.trait.FT_PWRModerator; import com.hbm.inventory.gui.GUIPWR; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; +import com.hbm.items.machine.ItemPWRPrinter; import com.hbm.main.MainRegistry; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; @@ -375,8 +376,17 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG return this.rodCount + (int) Math.ceil(this.heatsinkCount / 4D); } + public boolean isPrinting; + @Override public void serialize(ByteBuf buf) { + buf.writeBoolean(isPrinting); + if(isPrinting) { + ItemPWRPrinter.serialize(worldObj, buf); + isPrinting = false; + return; + } + super.serialize(buf); buf.writeInt(this.rodCount); buf.writeLong(this.coreHeat); @@ -395,6 +405,14 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG @Override public void deserialize(ByteBuf buf) { + if(buf.readBoolean()) { + // piggybacking off of this packet so that we don't have to sync EVERY PWR + // block continuously to the client for one tiny screenshot tool + + ItemPWRPrinter.deserialize(worldObj, buf); + return; + } + super.deserialize(buf); this.rodCount = buf.readInt(); this.coreHeat = buf.readLong(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java index 3f3ae011a..a7ec9973f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java @@ -468,13 +468,13 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IC @Callback(direct = true) @Optional.Method(modid = "OpenComputers") public Object[] getTemp(Context context, Arguments args) { - return new Object[] {heat}; + return new Object[] {Math.round(heat * 1.0E-5D * 780.0D + 20.0D)}; } @Callback(direct = true) @Optional.Method(modid = "OpenComputers") public Object[] getPressure(Context context, Arguments args) { - return new Object[] {pressure}; + return new Object[] {Math.round(pressure * 1.0E-5D * 30.0D)}; } @Callback(direct = true) @@ -504,7 +504,7 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IC @Callback(direct = true) @Optional.Method(modid = "OpenComputers") public Object[] getInfo(Context context, Arguments args) { - return new Object[] {heat, pressure, water.getFill(), steam.getFill(), carbonDioxide.getFill(), isOn}; + return new Object[] {Math.round(heat * 1.0E-5D * 780.0D + 20.0D), Math.round(pressure * 1.0E-5D * 30.0D), water.getFill(), steam.getFill(), carbonDioxide.getFill(), isOn}; } @Callback(direct = true, limit = 4) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityRefueler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityRefueler.java index 22c3cf0d2..62f01a1e2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityRefueler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityRefueler.java @@ -153,5 +153,4 @@ public class TileEntityRefueler extends TileEntityLoadedBase implements IFluidSt public FluidTank[] getReceivingTanks() { return new FluidTank[] { tank }; } - } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityRtgFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityRtgFurnace.java index 72882cabd..f2ac74441 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityRtgFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityRtgFurnace.java @@ -240,7 +240,7 @@ public class TileEntityRtgFurnace extends TileEntity implements ISidedInventory, { if(slots[i].stackSize <= 0) { - slots[i] = new ItemStack(slots[i].getItem().setFull3D()); + slots[i] = new ItemStack(slots[i].getItem()); }else{ slots[i].stackSize--; } 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 b474ce248..e7ce296c2 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java @@ -49,7 +49,7 @@ public class TileEntityMachineRefinery extends TileEntityMachineBase implements public long power = 0; public int sulfur = 0; - public static final int maxSulfur = 100; + public static final int maxSulfur = 10; public static final long maxPower = 1000; public FluidTank[] tanks; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java index 120efd4f5..2c3b4ebb4 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java @@ -275,10 +275,16 @@ public class TileEntityCraneConsole extends TileEntityLoadedBase implements Simp this.centerY = y + RBMKDials.getColumnHeight(worldObj) + 1; this.centerZ = z; - this.spanF = 7; - this.spanB = 7; - this.spanL = 7; - this.spanR = 7; + int girderY = centerY + 6; + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); + this.spanF = this.findRoomExtent(x, girderY, z, dir, 16); + dir = dir.getRotation(ForgeDirection.UP); + this.spanR = this.findRoomExtent(x, girderY, z, dir, 16); + dir = dir.getRotation(ForgeDirection.UP); + this.spanB = this.findRoomExtent(x, girderY, z, dir, 16); + dir = dir.getRotation(ForgeDirection.UP); + this.spanL = this.findRoomExtent(x, girderY, z, dir, 16); this.height = 7; @@ -287,6 +293,16 @@ public class TileEntityCraneConsole extends TileEntityLoadedBase implements Simp this.markDirty(); } + private int findRoomExtent(int x, int y, int z, ForgeDirection dir, int max) { + for (int i = 1; i < max; i++) { + if (!worldObj.isAirBlock(x + dir.offsetX * i, y, z + dir.offsetZ * i)) { + return i - 1; + } + } + + return max; + } + public void cycleCraneRotation() { this.craneRotationOffset = (this.craneRotationOffset + 90) % 360; } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAutoloader.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAutoloader.java new file mode 100644 index 000000000..8ba45ef55 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKAutoloader.java @@ -0,0 +1,290 @@ +package com.hbm.tileentity.machine.rbmk; + +import com.hbm.blocks.machine.rbmk.RBMKBase; +import com.hbm.interfaces.IControlReceiver; +import com.hbm.interfaces.ICopiable; +import com.hbm.inventory.container.ContainerRBMKAutoloader; +import com.hbm.inventory.gui.GUIRBMKAutoloader; +import com.hbm.items.machine.ItemRBMKRod; +import com.hbm.main.MainRegistry; +import com.hbm.sound.AudioWrapper; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityMachineBase; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.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.MathHelper; +import net.minecraft.world.World; + +public class TileEntityRBMKAutoloader extends TileEntityMachineBase implements IGUIProvider, IControlReceiver, ICopiable { + + public double piston; + public double renderPiston; + public double lastPiston; + private double syncPiston; + private int turnProgress; + private boolean isRetracting = true; + private int delay = 0; + + public static double speed = 0.005D; + + public int cycle = 50; + + private AudioWrapper audioLift; + + public TileEntityRBMKAutoloader() { + super(18); + } + + @Override + public String getName() { + return "container.rbmkAutoloader"; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(delay > 0) delay--; + + if(delay <= 0 && this.isRetracting && this.piston > 0D) { + this.piston -= this.speed; + if(this.piston <= 0) { + this.piston = 0; + this.delay = 40; + } + } + + // check for connected fuel rod and decide whether to begin working + if(isRetracting && worldObj.getTotalWorldTime() % 20 == 0 && this.hasFuel() && this.hasSpace()) { + Block below = worldObj.getBlock(xCoord, yCoord - 1, zCoord); + if(below instanceof RBMKBase) { + int[] pos = ((RBMKBase) below).findCore(worldObj, xCoord, yCoord - 1, zCoord); + TileEntity tile = worldObj.getTileEntity(pos[0], pos[1], pos[2]); + if(tile instanceof TileEntityRBMKRod) { + TileEntityRBMKRod rod = (TileEntityRBMKRod) tile; + if(rod.slots[0] == null || (rod.slots[0] != null && rod.slots[0].getItem() instanceof ItemRBMKRod && ItemRBMKRod.getEnrichment(rod.slots[0]) * 100 < cycle)) { + this.isRetracting = false; + } + } + } + } + + if(delay <= 0 && !this.isRetracting && this.piston < 1D) { + this.piston += this.speed; + if(this.piston >= 1) { + this.piston = 1; + this.delay = 40; + } + } + + // once the piston is fully extended + if(!isRetracting && this.piston >= 1D) { + this.piston = 1D; + + Block below = worldObj.getBlock(xCoord, yCoord - 1, zCoord); + if(below instanceof RBMKBase) { + int[] pos = ((RBMKBase) below).findCore(worldObj, xCoord, yCoord - 1, zCoord); + TileEntity tile = worldObj.getTileEntity(pos[0], pos[1], pos[2]); + if(tile instanceof TileEntityRBMKRod) { + TileEntityRBMKRod rod = (TileEntityRBMKRod) tile; + // try to take out the old fuel rod + if(rod.slots[0] != null && this.hasSpace()) { + for(int i = 9; i < 18; i++) { + if(slots[i] == null) { + slots[i] = rod.slots[0].copy(); + rod.slots[0] = null; + break; + } + } + } + // if there's space, try and insert a new fuel rod + if(rod.slots[0] == null) { + for(int i = 0; i < 9; i++) { + ItemStack stack = slots[i]; + if(stack != null && stack.getItem() instanceof ItemRBMKRod && ItemRBMKRod.getEnrichment(stack) * 100 >= cycle) { + rod.slots[0] = stack.copy(); + slots[i] = null; + break; + } + } + } + + this.isRetracting = true; + this.delay = 40; + } + } + } + + this.networkPackNT(100); + } else { + + this.lastPiston = this.renderPiston; + + if(this.turnProgress > 0) { + this.renderPiston = this.renderPiston + ((this.syncPiston - this.renderPiston) / (double) this.turnProgress); + --this.turnProgress; + } else { + this.renderPiston = this.syncPiston; + } + + if(this.renderPiston > 0.01 && this.renderPiston < 0.99) { + if(this.audioLift == null || !this.audioLift.isPlaying()) { + this.audioLift = MainRegistry.proxy.getLoopedSound("hbm:door.wgh_start", xCoord, yCoord, zCoord, this.getVolume(0.75F), 25F, 1.0F, 5); + this.audioLift.startSound(); + } + this.audioLift.updateVolume(this.getVolume(0.75F)); + this.audioLift.keepAlive(); + } else { + if(this.audioLift != null) { + this.audioLift.stopSound(); + this.audioLift = null; + MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:door.wgh_stop", this.getVolume(2F), 1F); + } + } + + if(this.renderPiston > 0.99) { + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "tower"); + data.setFloat("lift", 0F); + data.setFloat("base", 0.25F); + data.setFloat("max", 1.5F); + data.setInteger("life", 70 + worldObj.rand.nextInt(30)); + data.setDouble("posX", xCoord + 0.5 + worldObj.rand.nextGaussian() * 0.125); + data.setDouble("posZ", zCoord + 0.5 + worldObj.rand.nextGaussian() * 0.125); + data.setDouble("posY", yCoord + 0.25); + data.setBoolean("noWind", true); + data.setFloat("alphaMod", 2F); + data.setFloat("strafe", 0.05F); + for(int i = 0; i < 3; i++) MainRegistry.proxy.effectNT(data); + } + } + } + + public boolean hasFuel() { + for(int i = 0; i < 9; i++) { + ItemStack stack = slots[i]; + if(stack != null && stack.getItem() instanceof ItemRBMKRod && ItemRBMKRod.getEnrichment(stack) * 100 >= cycle) { + return true; + } + } + + return false; + } + + public boolean hasSpace() { + for(int i = 9; i < 18; i++) if(slots[i] == null) return true; + return false; + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeDouble(this.piston); + buf.writeInt(this.cycle); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + this.syncPiston = buf.readDouble(); + this.cycle = buf.readInt(); + + this.turnProgress = 2; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack) { + return stack.getItem() instanceof ItemRBMKRod && ItemRBMKRod.getEnrichment(stack) * 100 >= cycle && i < 9; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return this.piston <= 0 ? new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 } : new int[0]; + } + + @Override + public boolean canExtractItem(int i, ItemStack itemStack, int j) { + return i >= 9; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + piston = nbt.getDouble("piston"); + isRetracting = nbt.getBoolean("ret"); + delay = nbt.getInteger("delay"); + cycle = nbt.getInteger("cycle"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setDouble("piston", piston); + nbt.setBoolean("ret", isRetracting); + nbt.setInteger("delay", delay); + nbt.setInteger("cycle", cycle); + } + + protected AxisAlignedBB aabb; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + if(aabb != null) return aabb; + aabb = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 9, zCoord + 1); + return aabb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } + + @Override + public boolean hasPermission(EntityPlayer player) { + return this.isUseableByPlayer(player); + } + + @Override + public void receiveControl(NBTTagCompound data) { + if(data.hasKey("minus") && this.cycle > 5) this.cycle -= 5; + if(data.hasKey("plus") && this.cycle < 95) this.cycle += 5; + this.cycle = MathHelper.clamp_int(cycle, 5, 95); + this.markChanged(); + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerRBMKAutoloader(player.inventory, this); + } + + @Override + @SideOnly(Side.CLIENT) + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIRBMKAutoloader(player.inventory, this); + } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound data = new NBTTagCompound(); + data.setInteger("cycle", cycle); + return data; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + if(nbt.hasKey("cycle")) { + this.cycle = MathHelper.clamp_int(nbt.getInteger("cycle"), 5, 95); + } + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index 219838228..94e666af3 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -156,7 +156,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase { * Moves heat to neighboring parts, if possible, in a relatively fair manner */ private void moveHeat() { - + boolean reasim = RBMKDials.getReasimBoilers(worldObj); List rec = new ArrayList<>(); @@ -344,6 +344,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase { exceptions.add("id"); exceptions.add("muffled"); + //Keep the title unlocalized is cool. String title = "Dump of Ordered Data Diagnostic (DODD)"; mc.fontRenderer.drawString(title, pX + 1, pZ - 19, 0x006000); mc.fontRenderer.drawString(title, pX, pZ - 20, 0x00FF00); @@ -359,8 +360,15 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase { if(exceptions.contains(key)) continue; - - mc.fontRenderer.drawString(key + ": " + flush.getTag(key), pX, pZ, 0xFFFFFF); + String value = flush.getTag(key).toString(); + //No...’d‘ doesn't refer to "day" and ‘s’ doesn't refer to "second". Meaningless. + if (!value.isEmpty()) { + char lastChar = value.charAt(value.length() - 1); + if (lastChar == 'd' || lastChar == 's' || lastChar == 'b') { + value = value.substring(0, value.length() - 1); + } + } + mc.fontRenderer.drawString(I18nUtil.resolveKey("tile.rbmk.dodd." + key) + ": " + value, pX, pZ, 0xFFFFFF); pZ += 10; } 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 bdb21f97c..db38eed4b 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java @@ -89,44 +89,28 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon double flux = 0; - for(int i = -7; i <= 7; i++) { - for(int j = -7; j <= 7; j++) { - int rx = i, rz = j; - switch (rotation) { - case 1: // 90° - rx = -j; - rz = i; - break; - case 2: // 180° - rx = -i; - rz = -j; - break; - case 3: // 270° - rx = j; - rz = -i; - break; + for(int index = 0; index < columns.length; index++) { + int rx = getXFromIndex(index); + int rz = getZFromIndex(index); + + TileEntity te = Compat.getTileStandard(worldObj, targetX + rx, targetY, targetZ + rz); + + if(te instanceof TileEntityRBMKBase) { + + TileEntityRBMKBase rbmk = (TileEntityRBMKBase)te; + + columns[index] = new RBMKColumn(rbmk.getConsoleType(), rbmk.getNBTForConsole()); + columns[index].data.setDouble("heat", rbmk.heat); + columns[index].data.setDouble("maxHeat", rbmk.maxHeat()); + if(rbmk.isModerated()) columns[index].data.setBoolean("moderated", true); //false is the default anyway and not setting it when we don't need to reduces cruft + + if(te instanceof TileEntityRBMKRod) { + TileEntityRBMKRod fuel = (TileEntityRBMKRod) te; + flux += fuel.lastFluxQuantity; } - TileEntity te = Compat.getTileStandard(worldObj, targetX + rx, targetY, targetZ + rz); - int index = (i + 7) + (j + 7) * 15; - - if(te instanceof TileEntityRBMKBase) { - - TileEntityRBMKBase rbmk = (TileEntityRBMKBase)te; - - columns[index] = new RBMKColumn(rbmk.getConsoleType(), rbmk.getNBTForConsole()); - columns[index].data.setDouble("heat", rbmk.heat); - columns[index].data.setDouble("maxHeat", rbmk.maxHeat()); - if(rbmk.isModerated()) columns[index].data.setBoolean("moderated", true); //false is the default anyway and not setting it when we don't need to reduces cruft - - if(te instanceof TileEntityRBMKRod) { - TileEntityRBMKRod fuel = (TileEntityRBMKRod) te; - flux += fuel.lastFluxQuantity; - } - - } else { - columns[index] = null; - } + } else { + columns[index] = null; } } @@ -281,8 +265,9 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon if(key.startsWith("sel_")) { - int x = data.getInteger(key) % 15 - 7; - int z = data.getInteger(key) / 15 - 7; + int index = data.getInteger(key); + int x = getXFromIndex(index); + int z = getZFromIndex(index); TileEntity te = Compat.getTileStandard(worldObj, targetX + x, targetY, targetZ + z); @@ -322,8 +307,8 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon int[] cols = data.getIntArray("cols"); for(int i : cols) { - int x = i % 15 - 7; - int z = i / 15 - 7; + int x = getXFromIndex(i); + int z = getZFromIndex(i); TileEntity te = Compat.getTileStandard(worldObj, targetX + x, targetY, targetZ + z); @@ -339,8 +324,8 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon int[] cols = data.getIntArray("cols"); for(int i : cols) { - int x = i % 15 - 7; - int z = i / 15 - 7; + int x = getXFromIndex(i); + int z = getZFromIndex(i); TileEntity te = Compat.getTileStandard(worldObj, targetX + x, targetY, targetZ + z); @@ -404,6 +389,40 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon rotation = (byte)((rotation + 1) % 4); } + public int getXFromIndex(int col) { + final int i = col % 15 - 7; + final int j = col / 15 - 7; + switch (rotation) { + case 0: // 0° + return i; + case 1: // 90° + return -j; + case 2: // 180° + return -i; + case 3: // 270° + return j; + } + + return i; + } + + public int getZFromIndex(int col) { + final int i = col % 15 - 7; + final int j = col / 15 - 7; + switch (rotation) { + case 0: // 0° + return j; + case 1: // 90° + return i; + case 2: // 180° + return -j; + case 3: // 270° + return -i; + } + + return j; + } + public static class RBMKColumn { public ColumnType type; @@ -556,13 +575,32 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon int x = args.checkInteger(0) - 7; int y = -args.checkInteger(1) + 7; - int i = (y + 7) * 15 + (x + 7); + int i = x; + int j = y; + switch (rotation) { + case 0: + break; + case 1: + i = y; + j = -x; + break; + case 2: + i = -x; + j = -y; + break; + case 3: + i = -y; + j = x; + break; + } + + int index = (j + 7) * 15 + (i + 7); TileEntity te = Compat.getTileStandard(worldObj, targetX + x, targetY, targetZ + y); if (te instanceof TileEntityRBMKBase) { TileEntityRBMKBase column = (TileEntityRBMKBase) te; - NBTTagCompound column_data = columns[i].data; + NBTTagCompound column_data = columns[index].data; LinkedHashMap data_table = new LinkedHashMap<>(); data_table.put("type", column.getConsoleType().name()); data_table.put("hullTemp", column_data.getDouble("heat")); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java index 3da017e91..c587fc355 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java @@ -1,10 +1,12 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.interfaces.IControlReceiver; +import com.hbm.interfaces.ICopiable; import com.hbm.inventory.container.ContainerRBMKControlAuto; import com.hbm.inventory.gui.GUIRBMKControlAuto; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKControlManual.RBMKColor; +import com.hbm.util.EnumUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -16,7 +18,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.world.World; -public class TileEntityRBMKControlAuto extends TileEntityRBMKControl implements IControlReceiver { +public class TileEntityRBMKControlAuto extends TileEntityRBMKControl implements IControlReceiver, ICopiable { public RBMKFunction function = RBMKFunction.LINEAR; public double levelLower; @@ -112,6 +114,7 @@ public class TileEntityRBMKControlAuto extends TileEntityRBMKControl implements buf.writeDouble(this.levelUpper); buf.writeDouble(this.heatLower); buf.writeDouble(this.heatUpper); + if(function != null) buf.writeInt(function.ordinal()); } @Override @@ -121,6 +124,7 @@ public class TileEntityRBMKControlAuto extends TileEntityRBMKControl implements this.levelUpper = buf.readDouble(); this.heatLower = buf.readDouble(); this.heatUpper = buf.readDouble(); + this.function = RBMKFunction.values()[buf.readInt()]; } @Override @@ -162,4 +166,24 @@ public class TileEntityRBMKControlAuto extends TileEntityRBMKControl implements public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIRBMKControlAuto(player.inventory, this); } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound data = new NBTTagCompound(); + data.setDouble("levelLower", levelLower); + data.setDouble("levelUpper", levelUpper); + data.setDouble("heatLower", heatLower); + data.setDouble("heatUpper", heatUpper); + data.setInteger("function", function.ordinal()); + return data; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + if(nbt.hasKey("levelLower")) levelLower = nbt.getDouble("levelLower"); + if(nbt.hasKey("levelUpper")) levelLower = nbt.getDouble("levelUpper"); + if(nbt.hasKey("heatLower")) levelLower = nbt.getDouble("heatLower"); + if(nbt.hasKey("heatUpper")) levelLower = nbt.getDouble("heatUpper"); + if(nbt.hasKey("function")) function = EnumUtil.grabEnumSafely(RBMKFunction.class, nbt.getInteger("function")); + } } \ No newline at end of file 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 b34f99a5e..721ef2af6 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlManual.java @@ -2,9 +2,11 @@ package com.hbm.tileentity.machine.rbmk; import com.hbm.blocks.machine.rbmk.RBMKControl; import com.hbm.interfaces.IControlReceiver; +import com.hbm.interfaces.ICopiable; import com.hbm.inventory.container.ContainerRBMKControl; import com.hbm.inventory.gui.GUIRBMKControl; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; +import com.hbm.util.EnumUtil; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; @@ -20,7 +22,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.world.World; -public class TileEntityRBMKControlManual extends TileEntityRBMKControl implements IControlReceiver { +public class TileEntityRBMKControlManual extends TileEntityRBMKControl implements IControlReceiver, ICopiable { public RBMKColor color; public double startingLevel; @@ -177,5 +179,17 @@ public class TileEntityRBMKControlManual extends TileEntityRBMKControl implement @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIRBMKControl(player.inventory, this); - } + } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound data = new NBTTagCompound(); + data.setInteger("color", color.ordinal()); + return data; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + if(nbt.hasKey("color")) color = EnumUtil.grabEnumSafely(RBMKColor.class, nbt.getInteger("color")); + } } 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 92b5ecfe2..8dc07b42d 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -264,8 +264,10 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM ItemRBMKRod rod = ((ItemRBMKRod)slots[0].getItem()); BufferUtil.writeString(buf, ItemRBMKRod.getYield(slots[0]) + " / " + rod.yield + " (" + (ItemRBMKRod.getEnrichment(slots[0]) * 100) + "%)"); BufferUtil.writeString(buf, ItemRBMKRod.getPoison(slots[0]) + "%"); - BufferUtil.writeString(buf, ItemRBMKRod.getCoreHeat(slots[0]) + " / " + ItemRBMKRod.getHullHeat(slots[0]) + " / " + rod.meltingPoint); - } + //Heat is too long! Reduce it to 6 numbers is enough. + BufferUtil.writeString(buf, String.format("%.6f", ItemRBMKRod.getCoreHeat(slots[0])) + + " / " + String.format("%.6f", ItemRBMKRod.getHullHeat(slots[0])) + + " / " + String.format("%.2f", rod.meltingPoint)); } } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java index 8d939f523..3d3213d2c 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java @@ -7,6 +7,7 @@ import com.hbm.tileentity.IBufPacketReceiver; import com.hbm.tileentity.IControlReceiverFilter; import com.hbm.util.BufferUtil; +import com.hbm.util.ItemStackUtil; import api.hbm.redstoneoverradio.IRORInteractive; import api.hbm.redstoneoverradio.IRORValueProvider; @@ -133,6 +134,109 @@ public class TileEntityMassStorage extends TileEntityCrateBase implements IBufPa return result; } + // Note: the following three methods are used for AE2 integration, and aren't meant to be called in any other context by default + + public int getTotalStockpile() { + ItemStack type = getType(); + if (type == null) + return 0; + + int result = getStockpile(); + + ItemStack inStack = slots[0]; + if (inStack != null && ItemStackUtil.areStacksCompatible(type, inStack)) { + result += inStack.stackSize; + } + + ItemStack outStack = slots[2]; + if (outStack != null && ItemStackUtil.areStacksCompatible(type, outStack)) { + result += outStack.stackSize; + } + + return result; + } + + // Returns the remainder that didn't fit. + // If `actually` is false, only predicts the outcome, but doesn't change the state + public int increaseTotalStockpile(int amount, boolean actually) { + return changeTotalStockpile(amount, actually, +1); + } + + // Returns the remainder that couldn't be extracted. + // If `actually` is false, only predicts the outcome, but doesn't change the state + public int decreaseTotalStockpile(int amount, boolean actually) { + return changeTotalStockpile(amount, actually, -1); + } + + private int changeTotalStockpile(int amount, boolean actually, int sign) { + ItemStack type = getType(); + + if (type == null) + return amount; + + int stockpileAvail = sign > 0 ? getCapacity() - getStockpile() : getStockpile(); + + if (amount > 0 && stockpileAvail > 0) { + int depositStockpile = Math.min(amount, stockpileAvail); + if (actually) { + this.stack += sign * depositStockpile; + } + amount -= depositStockpile; + } + + int inputAvail = 0; + ItemStack inStack = slots[0]; + if (inStack != null && ItemStackUtil.areStacksCompatible(type, inStack)) { + inputAvail = sign > 0 ? inStack.getMaxStackSize() - inStack.stackSize : inStack.stackSize; + } else if (inStack == null) { + inputAvail = sign > 0 ? type.getMaxStackSize() : 0; + } + + if (amount > 0 && inputAvail > 0) { + int depositInput = Math.min(amount, inputAvail); + if (actually) { + if (slots[0] == null) { // Only possible with sign == +1 + slots[0] = slots[1].copy(); + slots[0].stackSize = 0; + } + slots[0].stackSize += sign * depositInput; + if (slots[0].stackSize == 0) { + slots[0] = null; + } + } + amount -= depositInput; + } + + int outputAvail = 0; + ItemStack outStack = slots[2]; + if (outStack != null && ItemStackUtil.areStacksCompatible(type, outStack)) { + outputAvail = sign > 0 ? outStack.getMaxStackSize() - outStack.stackSize : outStack.stackSize; + } else if (outStack == null) { + outputAvail = sign > 0 ? type.getMaxStackSize() : 0; + } + + if (amount > 0 && outputAvail > 0) { + int depositOutput = Math.min(amount, outputAvail); + if (actually) { + if (slots[2] == null) { // Only possible with sign == +1 + slots[2] = slots[1].copy(); + slots[2].stackSize = 0; + } + slots[2].stackSize += sign * depositOutput; + if (slots[2].stackSize == 0) { + slots[2] = null; + } + } + amount -= depositOutput; + } + + if (actually) { + this.markDirty(); + } + + return amount; + } + @Override public void serialize(ByteBuf buf) { buf.writeInt(this.stack); diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityConverterHeRf.java b/src/main/java/com/hbm/tileentity/network/TileEntityConverterHeRf.java index 3d7072304..f6dc1fdff 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityConverterHeRf.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityConverterHeRf.java @@ -2,9 +2,10 @@ package com.hbm.tileentity.network; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; -import com.hbm.calc.Location; import com.hbm.tileentity.IConfigurableMachine; import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.Compat; +import com.hbm.util.fauxpointtwelve.BlockPos; import api.hbm.energymk2.IEnergyReceiverMK2; import cofh.api.energy.EnergyStorage; @@ -41,8 +42,8 @@ public class TileEntityConverterHeRf extends TileEntityLoadedBase implements IEn for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); - Location loc = new Location(worldObj, xCoord, yCoord, zCoord).add(dir); - TileEntity entity = loc.getTileEntity(); + BlockPos loc = new BlockPos(xCoord, yCoord, zCoord).offset(dir); + TileEntity entity = Compat.getTileStandard(worldObj, loc.getX(), loc.getY(), loc.getZ()); if (entity != null && entity instanceof IEnergyReceiver) { IEnergyReceiver receiver = (IEnergyReceiver) entity; diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java index 105ceb3fd..804c42321 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java @@ -10,6 +10,8 @@ import com.hbm.items.ModItems; import com.hbm.module.ModulePatternMatcher; import com.hbm.tileentity.IControlReceiverFilter; import com.hbm.tileentity.IGUIProvider; +import com.hbm.util.InventoryUtil; + import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -94,54 +96,62 @@ public class TileEntityCraneExtractor extends TileEntityCraneBase implements IGU } boolean hasSent = false; + + IConveyorBelt belt = null; if(b instanceof IConveyorBelt) { + belt = (IConveyorBelt) b; + } - IConveyorBelt belt = (IConveyorBelt) b; + /* try to send items from a connected inv, if present */ + if(te instanceof IInventory) { - /* try to send items from a connected inv, if present */ - if(te instanceof IInventory) { + IInventory inv = (IInventory) te; + int size = access == null ? inv.getSizeInventory() : access.length; + + for(int i = 0; i < size; i++) { + int index = access == null ? i : access[i]; + ItemStack stack = inv.getStackInSlot(index); - IInventory inv = (IInventory) te; - int size = access == null ? inv.getSizeInventory() : access.length; - - for(int i = 0; i < size; i++) { - int index = access == null ? i : access[i]; - ItemStack stack = inv.getStackInSlot(index); + if(stack != null && (sided == null || sided.canExtractItem(index, stack, inputSide.getOpposite().ordinal()))){ - if(stack != null && (sided == null || sided.canExtractItem(index, stack, inputSide.getOpposite().ordinal()))){ + boolean match = this.matchesFilter(stack); + + if((isWhitelist && match) || (!isWhitelist && !match)) { + stack = stack.copy(); + int toSend = Math.min(amount, stack.stackSize); - boolean match = this.matchesFilter(stack); - - if((isWhitelist && match) || (!isWhitelist && !match)) { - stack = stack.copy(); - int toSend = Math.min(amount, stack.stackSize); + if (belt != null) { inv.decrStackSize(index, toSend); stack.stackSize = toSend; - sendItem(stack, belt, outputSide); - hasSent = true; - break; + } else { + stack.stackSize = toSend; + ItemStack remaining = InventoryUtil.tryAddItemToInventory(this.slots, 9, 17, stack); + inv.decrStackSize(index, toSend - (remaining == null ? 0 : remaining.stackSize)); } + hasSent = true; + break; } } } + } + + /* if no item has been sent, send buffered items while ignoring the filter */ + if(!hasSent && belt != null) { - /* if no item has been sent, send buffered items while ignoring the filter */ - if(!hasSent) { + for(int i = 9; i < 18; i++) { + ItemStack stack = slots[i]; - for(int i = 9; i < 18; i++) { - ItemStack stack = slots[i]; - - if(stack != null){ - stack = stack.copy(); - int toSend = Math.min(amount, stack.stackSize); - decrStackSize(i, toSend); - stack.stackSize = toSend; - - sendItem(stack, belt, outputSide); - break; - } + if(stack != null){ + stack = stack.copy(); + int toSend = Math.min(amount, stack.stackSize); + + decrStackSize(i, toSend); + stack.stackSize = toSend; + sendItem(stack, belt, outputSide); + + break; } } } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneGrabber.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneGrabber.java index 61d9df4de..976201ba5 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneGrabber.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneGrabber.java @@ -107,7 +107,11 @@ public class TileEntityCraneGrabber extends TileEntityCraneBase implements IGUIP Vec3 pos = Vec3.createVectorHelper(xCoord + 0.5 + outputSide.offsetX * 0.55, yCoord + 0.5 + outputSide.offsetY * 0.55, zCoord + 0.5 + outputSide.offsetZ * 0.55); Vec3 snap = belt.getClosestSnappingPosition(worldObj, xCoord + outputSide.offsetX, yCoord + outputSide.offsetY, zCoord + outputSide.offsetZ, pos); - item.setPosition(snap.xCoord, snap.yCoord, snap.zCoord); + EntityMovingItem newItem = new EntityMovingItem(worldObj); + newItem.setItemStack(item.getItemStack().copy()); + newItem.setPosition(snap.xCoord, snap.yCoord, snap.zCoord); + item.setDead(); + worldObj.spawnEntityInWorld(newItem); break; } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneInserter.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneInserter.java index afd6012ed..3d55bf30f 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneInserter.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneInserter.java @@ -40,48 +40,49 @@ public class TileEntityCraneInserter extends TileEntityCraneBase implements IGUI super.updateEntity(); if(!worldObj.isRemote) { - ForgeDirection outputSide = getOutputSide(); - TileEntity te = worldObj.getTileEntity(xCoord + outputSide.offsetX, yCoord + outputSide.offsetY, zCoord + outputSide.offsetZ); - - int[] access = null; - - if(te instanceof ISidedInventory) { - ISidedInventory sided = (ISidedInventory) te; - //access = sided.getAccessibleSlotsFromSide(dir.ordinal()); - access = InventoryUtil.masquerade(sided, outputSide.getOpposite().ordinal()); - } - - if(te instanceof IInventory) { - for(int i = 0; i < slots.length; i++) { - - ItemStack stack = slots[i]; - - if(stack != null) { - ItemStack ret = CraneInserter.addToInventory((IInventory) te, access, stack.copy(), outputSide.getOpposite().ordinal()); - - if(ret == null || ret.stackSize != stack.stackSize) { - slots[i] = ret; - this.markDirty(); - return; - } - } + if (!this.worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) {ForgeDirection outputSide = getOutputSide(); + TileEntity te = worldObj.getTileEntity(xCoord + outputSide.offsetX, yCoord + outputSide.offsetY, zCoord + outputSide.offsetZ); + + int[] access = null; + + if(te instanceof ISidedInventory) { + ISidedInventory sided = (ISidedInventory) te; + //access = sided.getAccessibleSlotsFromSide(dir.ordinal()); + access = InventoryUtil.masquerade(sided, outputSide.getOpposite().ordinal()); } - //if the previous operation fails, repeat but use single items instead of the whole stack instead - //this should fix cases where the inserter can't insert into something that has a stack size limitation - for(int i = 0; i < slots.length; i++) { - - ItemStack stack = slots[i]; - - if(stack != null) { - stack = stack.copy(); - stack.stackSize = 1; - ItemStack ret = CraneInserter.addToInventory((IInventory) te, access, stack.copy(), outputSide.getOpposite().ordinal()); + if(te instanceof IInventory) { + for(int i = 0; i < slots.length; i++) { - if(ret == null || ret.stackSize != stack.stackSize) { - this.decrStackSize(i, 1); - this.markDirty(); - return; + ItemStack stack = slots[i]; + + if(stack != null) { + ItemStack ret = CraneInserter.addToInventory((IInventory) te, access, stack.copy(), outputSide.getOpposite().ordinal()); + + if(ret == null || ret.stackSize != stack.stackSize) { + slots[i] = ret; + this.markDirty(); + return; + } + } + } + + //if the previous operation fails, repeat but use single items instead of the whole stack instead + //this should fix cases where the inserter can't insert into something that has a stack size limitation + for(int i = 0; i < slots.length; i++) { + + ItemStack stack = slots[i]; + + if(stack != null) { + stack = stack.copy(); + stack.stackSize = 1; + ItemStack ret = CraneInserter.addToInventory((IInventory) te, access, stack.copy(), outputSide.getOpposite().ordinal()); + + if(ret == null || ret.stackSize != stack.stackSize) { + this.decrStackSize(i, 1); + this.markDirty(); + return; + } } } } diff --git a/src/main/java/com/hbm/uninos/NodeNet.java b/src/main/java/com/hbm/uninos/NodeNet.java index f37446cec..eb4c99233 100644 --- a/src/main/java/com/hbm/uninos/NodeNet.java +++ b/src/main/java/com/hbm/uninos/NodeNet.java @@ -2,7 +2,7 @@ package com.hbm.uninos; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Random; import java.util.Set; @@ -16,7 +16,7 @@ public abstract class NodeNet { public static Random rand = new Random(); public boolean valid = true; - public Set links = new HashSet(); + public Set links = new LinkedHashSet(); public HashMap receiverEntries = new HashMap(); public HashMap providerEntries = new HashMap(); diff --git a/src/main/java/com/hbm/uninos/UniNodespace.java b/src/main/java/com/hbm/uninos/UniNodespace.java index dec2b96dc..e9aaebb71 100644 --- a/src/main/java/com/hbm/uninos/UniNodespace.java +++ b/src/main/java/com/hbm/uninos/UniNodespace.java @@ -2,6 +2,7 @@ package com.hbm.uninos; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.Set; import java.util.Map.Entry; @@ -21,16 +22,16 @@ import net.minecraft.world.World; * @author hbm */ public class UniNodespace { - + public static HashMap worlds = new HashMap(); public static Set activeNodeNets = new HashSet(); - + public static GenNode getNode(World world, int x, int y, int z, INetworkProvider type) { UniNodeWorld nodeWorld = worlds.get(world); if(nodeWorld != null) return nodeWorld.nodes.get(new Pair(new BlockPos(x, y, z), type)); return null; } - + public static void createNode(World world, GenNode node) { UniNodeWorld nodeWorld = worlds.get(world); if(nodeWorld == null) { @@ -39,21 +40,21 @@ public class UniNodespace { } nodeWorld.pushNode(node); } - + public static void destroyNode(World world, int x, int y, int z, INetworkProvider type) { GenNode node = getNode(world, x, y, z, type); if(node != null) { worlds.get(world).popNode(node); } } - + public static void updateNodespace() { - + for(World world : MinecraftServer.getServer().worldServers) { UniNodeWorld nodeWorld = worlds.get(world); if(nodeWorld == null) continue; - + for(Entry, GenNode> entry : nodeWorld.nodes.entrySet()) { GenNode node = entry.getValue(); INetworkProvider provider = entry.getKey().getValue(); @@ -63,19 +64,19 @@ public class UniNodespace { } } } - + updateNetworks(); } - + private static void updateNetworks() { for(NodeNet net : activeNodeNets) net.resetTrackers(); //reset has to be done before everything else for(NodeNet net : activeNodeNets) net.update(); } - + /** Goes over each connection point of the given node, tries to find neighbor nodes and to join networks with them */ private static void checkNodeConnection(World world, GenNode node, INetworkProvider provider) { - + for(DirPos con : node.connections) { GenNode conNode = getNode(world, con.getX(), con.getY(), con.getZ(), provider); // get whatever neighbor node intersects with that connection if(conNode != null) { // if there is a node at that place @@ -85,10 +86,10 @@ public class UniNodespace { } } } - + if(node.net == null || !node.net.isValid()) provider.provideNetwork().joinLink(node); } - + /** Checks if the node can be connected to given the DirPos, skipSideCheck will ignore the DirPos' direction value */ public static boolean checkConnection(GenNode connectsTo, DirPos connectFrom, boolean skipSideCheck) { for(DirPos revCon : connectsTo.connections) { @@ -98,10 +99,10 @@ public class UniNodespace { } return false; } - + /** Links two nodes with different or potentially no networks */ private static void connectToNode(GenNode origin, GenNode connection) { - + if(origin.hasValidNet() && connection.hasValidNet()) { // both nodes have nets, but the nets are different (previous assumption), join networks if(origin.net.links.size() > connection.net.links.size()) { origin.net.joinNetworks(connection.net); @@ -114,18 +115,18 @@ public class UniNodespace { origin.net.joinLink(connection); } } - + public static class UniNodeWorld { - - public HashMap, GenNode> nodes = new HashMap(); - + + public HashMap, GenNode> nodes = new LinkedHashMap<>(); + /** Adds a node at all its positions to the nodespace */ public void pushNode(GenNode node) { for(BlockPos pos : node.positions) { nodes.put(new Pair(pos, node.networkProvider), node); } } - + /** Removes the specified node from all positions from nodespace */ public void popNode(GenNode node) { if(node.net != null) node.net.destroy(); diff --git a/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetworkProvider.java b/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetworkProvider.java index 330db1821..47d7c108f 100644 --- a/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetworkProvider.java +++ b/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetworkProvider.java @@ -2,7 +2,7 @@ package com.hbm.uninos.networkproviders; import com.hbm.uninos.INetworkProvider; -public class PneumaticNetworkProvider implements INetworkProvider{ +public class PneumaticNetworkProvider implements INetworkProvider { public static PneumaticNetworkProvider THE_PROVIDER = new PneumaticNetworkProvider(); diff --git a/src/main/java/com/hbm/uninos/networkproviders/RebarNetwork.java b/src/main/java/com/hbm/uninos/networkproviders/RebarNetwork.java new file mode 100644 index 000000000..23afb5ad8 --- /dev/null +++ b/src/main/java/com/hbm/uninos/networkproviders/RebarNetwork.java @@ -0,0 +1,9 @@ +package com.hbm.uninos.networkproviders; + +import com.hbm.uninos.NodeNet; + +public class RebarNetwork extends NodeNet { + + @Override + public void update() { } +} diff --git a/src/main/java/com/hbm/uninos/networkproviders/RebarNetworkProvider.java b/src/main/java/com/hbm/uninos/networkproviders/RebarNetworkProvider.java new file mode 100644 index 000000000..df9b22707 --- /dev/null +++ b/src/main/java/com/hbm/uninos/networkproviders/RebarNetworkProvider.java @@ -0,0 +1,13 @@ +package com.hbm.uninos.networkproviders; + +import com.hbm.uninos.INetworkProvider; + +public class RebarNetworkProvider implements INetworkProvider { + + public static RebarNetworkProvider THE_PROVIDER = new RebarNetworkProvider(); + + @Override + public RebarNetwork provideNetwork() { + return new RebarNetwork(); + } +} diff --git a/src/main/java/com/hbm/util/AchievementHandler.java b/src/main/java/com/hbm/util/AchievementHandler.java index 900509bfe..8ffbb48e8 100644 --- a/src/main/java/com/hbm/util/AchievementHandler.java +++ b/src/main/java/com/hbm/util/AchievementHandler.java @@ -20,7 +20,7 @@ public class AchievementHandler { craftingAchievements.put(new ComparableStack(ModItems.battery_potatos), MainRegistry.achPotato); craftingAchievements.put(new ComparableStack(ModBlocks.machine_press), MainRegistry.achBurnerPress); craftingAchievements.put(new ComparableStack(ModItems.rbmk_fuel_empty), MainRegistry.achRBMK); - craftingAchievements.put(new ComparableStack(ModBlocks.machine_chemplant), MainRegistry.achChemplant); + craftingAchievements.put(new ComparableStack(ModBlocks.machine_chemical_plant), MainRegistry.achChemplant); craftingAchievements.put(new ComparableStack(ModBlocks.concrete_smooth), MainRegistry.achConcrete); craftingAchievements.put(new ComparableStack(ModBlocks.concrete_asbestos), MainRegistry.achConcrete); craftingAchievements.put(new ComparableStack(ModItems.ingot_polymer), MainRegistry.achPolymer); @@ -47,7 +47,7 @@ public class AchievementHandler { craftingAchievements.put(new ComparableStack(ModItems.mp_warhead_15_boxcar), MainRegistry.achRedBalloons); craftingAchievements.put(new ComparableStack(ModBlocks.struct_iter_core), MainRegistry.achFusion); craftingAchievements.put(new ComparableStack(ModBlocks.machine_difurnace_off), MainRegistry.achBlastFurnace); - craftingAchievements.put(new ComparableStack(ModBlocks.machine_assembler), MainRegistry.achAssembly); + craftingAchievements.put(new ComparableStack(ModBlocks.machine_assembly_machine), MainRegistry.achAssembly); craftingAchievements.put(new ComparableStack(ModItems.billet_pu_mix), MainRegistry.achChicagoPile); } diff --git a/src/main/java/com/hbm/util/ColorUtil.java b/src/main/java/com/hbm/util/ColorUtil.java index c863c5d02..28b76c6ab 100644 --- a/src/main/java/com/hbm/util/ColorUtil.java +++ b/src/main/java/com/hbm/util/ColorUtil.java @@ -70,6 +70,30 @@ public class ColorUtil { return 0xFFFFFF; } } + + public static int ir(int color) { + return (color & 0xff0000) >> 16; + } + + public static int ig(int color) { + return (color & 0x00ff00) >> 8; + } + + public static int ib(int color) { + return (color & 0x0000ff) >> 0; + } + + public static float fr(int color) { + return ir(color) / 255F; + } + + public static float fg(int color) { + return ig(color) / 255F; + } + + public static float fb(int color) { + return ib(color) / 255F; + } @SideOnly(Side.CLIENT) public static int getMedianBrightnessColorFromStack(ItemStack stack) { diff --git a/src/main/java/com/hbm/util/Compat.java b/src/main/java/com/hbm/util/Compat.java index cac127f1a..138b109ed 100644 --- a/src/main/java/com/hbm/util/Compat.java +++ b/src/main/java/com/hbm/util/Compat.java @@ -9,6 +9,7 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.main.MainRegistry; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.eventhandler.EventBus; import cpw.mods.fml.common.eventhandler.IEventListener; import cpw.mods.fml.relauncher.ReflectionHelper; @@ -37,6 +38,7 @@ public class Compat { public static final String MOD_TC = "tc"; public static final String MOD_EIDS = "endlessids"; public static final String MOD_ANG = "angelica"; + public static final String MOD_TOR = "Torcherino"; public static Item tryLoadItem(String domain, String name) { return (Item) Item.itemRegistry.getObject(getReg(domain, name)); @@ -49,7 +51,29 @@ public class Compat { private static String getReg(String domain, String name) { return domain + ":" + name; } - + + public static ItemStack getPreferredOreOutput(List oreList) { + int lowestPref = -1; + ItemStack preferredStack = null; + + for(ItemStack item : oreList) { + String modid = ItemStackUtil.getModIdFromItemStack(item); + for(int i = 0; i < GeneralConfig.preferredOutputMod.length; i++) { + if (modid.equals(GeneralConfig.preferredOutputMod[i])){ + if (lowestPref<0 || i > 4, z >> 4)) return null; return world.getTileEntity(x, y, z); } + + public static void blacklistAccelerator(Class clazz) { + FMLInterModComms.sendMessage("Torcherino", "blacklist-tile", clazz.getName()); + } } diff --git a/src/main/java/com/hbm/util/DamageResistanceHandler.java b/src/main/java/com/hbm/util/DamageResistanceHandler.java index d5e475de9..154891677 100644 --- a/src/main/java/com/hbm/util/DamageResistanceHandler.java +++ b/src/main/java/com/hbm/util/DamageResistanceHandler.java @@ -28,6 +28,7 @@ import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; +import net.minecraft.util.EntityDamageSource; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MathHelper; import net.minecraftforge.event.entity.living.LivingAttackEvent; @@ -48,7 +49,7 @@ public class DamageResistanceHandler { public static final String CATEGORY_EXPLOSION = "EXPL"; public static final String CATEGORY_FIRE = "FIRE"; - public static final String CATEGORY_PROJECTILE = "PROJ"; + public static final String CATEGORY_PHYSICAL = "PHYS"; public static final String CATEGORY_ENERGY = "EN"; public static final Gson gson = new Gson(); @@ -121,70 +122,70 @@ public class DamageResistanceHandler { entityStats.put(EntityCreeper.class, new ResistanceStats().addCategory(CATEGORY_EXPLOSION, 2F, 0.25F)); itemStats.put(ModItems.jackt, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F)); + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F)); itemStats.put(ModItems.jackt2, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F)); + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F)); registerSet(ModItems.steel_helmet, ModItems.steel_plate, ModItems.steel_legs, ModItems.steel_boots, new ResistanceStats()); registerSet(ModItems.titanium_helmet, ModItems.titanium_plate, ModItems.titanium_legs, ModItems.titanium_boots, new ResistanceStats()); registerSet(ModItems.alloy_helmet, ModItems.alloy_plate, ModItems.alloy_legs, ModItems.alloy_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.1F)); + .addCategory(CATEGORY_PHYSICAL, 2F, 0.1F)); registerSet(ModItems.cobalt_helmet, ModItems.cobalt_plate, ModItems.cobalt_legs, ModItems.cobalt_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.1F)); + .addCategory(CATEGORY_PHYSICAL, 2F, 0.1F)); registerSet(ModItems.starmetal_helmet, ModItems.starmetal_plate, ModItems.starmetal_legs, ModItems.starmetal_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 3F, 0.25F) + .addCategory(CATEGORY_PHYSICAL, 3F, 0.25F) .setOther(1F, 0.1F)); registerSet(ModItems.zirconium_legs, ModItems.zirconium_legs, ModItems.zirconium_legs, ModItems.zirconium_legs, new ResistanceStats() .setOther(0F, 1F)); registerSet(ModItems.dnt_helmet, ModItems.dnt_plate, ModItems.dnt_legs, ModItems.dnt_boots, new ResistanceStats()); registerSet(ModItems.cmb_helmet, ModItems.cmb_plate, ModItems.cmb_legs, ModItems.cmb_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F) + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F) .setOther(5F, 0.25F)); registerSet(ModItems.schrabidium_helmet, ModItems.schrabidium_plate, ModItems.schrabidium_legs, ModItems.schrabidium_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 10F, 0.65F) + .addCategory(CATEGORY_PHYSICAL, 10F, 0.65F) .setOther(5F, 0.5F)); registerSet(ModItems.robes_helmet, ModItems.robes_plate, ModItems.robes_legs, ModItems.robes_boots, new ResistanceStats()); registerSet(ModItems.security_helmet, ModItems.security_plate, ModItems.security_legs, ModItems.security_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F) + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 2F, 0.25F)); registerSet(ModItems.steamsuit_helmet, ModItems.steamsuit_plate, ModItems.steamsuit_legs, ModItems.steamsuit_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 2F, 0.15F) .addCategory(CATEGORY_FIRE, 0.5F, 0.25F) .addExact(DamageSource.fall.damageType, 5F, 0.25F) .setOther(0F, 0.1F)); registerSet(ModItems.dieselsuit_helmet, ModItems.dieselsuit_plate, ModItems.dieselsuit_legs, ModItems.dieselsuit_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 1F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 1F, 0.15F) .addCategory(CATEGORY_FIRE, 0.5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 2F, 0.15F) .setOther(0F, 0.1F)); registerSet(ModItems.t45_helmet, ModItems.t45_plate, ModItems.t45_legs, ModItems.t45_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 2F, 0.15F) .addCategory(CATEGORY_FIRE, 0.5F, 0.35F) .addCategory(CATEGORY_EXPLOSION, 5F, 0.25F) .addExact(DamageSource.fall.damageType, 0F, 1F) .setOther(0F, 0.1F)); registerSet(ModItems.ajr_helmet, ModItems.ajr_plate, ModItems.ajr_legs, ModItems.ajr_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 4F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 4F, 0.15F) .addCategory(CATEGORY_FIRE, 0.5F, 0.35F) .addCategory(CATEGORY_EXPLOSION, 7.5F, 0.25F) .addExact(DamageSource.fall.damageType, 0F, 1F) .setOther(0F, 0.15F)); registerSet(ModItems.ajro_helmet, ModItems.ajro_plate, ModItems.ajro_legs, ModItems.ajro_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 4F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 4F, 0.15F) .addCategory(CATEGORY_FIRE, 0.5F, 0.35F) .addCategory(CATEGORY_EXPLOSION, 7.5F, 0.25F) .addExact(DamageSource.fall.damageType, 0F, 1F) .setOther(0F, 0.15F)); registerSet(ModItems.rpa_helmet, ModItems.rpa_plate, ModItems.rpa_legs, ModItems.rpa_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 25F, 0.65F) + .addCategory(CATEGORY_PHYSICAL, 25F, 0.65F) .addCategory(CATEGORY_FIRE, 10F, 0.9F) .addCategory(CATEGORY_EXPLOSION, 15F, 0.25F) .addCategory(CATEGORY_ENERGY, 25F, 0.75F) .addExact(DamageSource.fall.damageType, 0F, 1F) .setOther(15F, 0.3F)); ResistanceStats bj = new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F) + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F) .addCategory(CATEGORY_FIRE, 2.5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 10F, 0.25F) .addExact(DamageSource.fall.damageType, 0F, 1F) @@ -197,14 +198,14 @@ public class DamageResistanceHandler { .addExact(DamageSource.fall.damageType, 5F, 0.75F) .setOther(0F, 0.1F)); registerSet(ModItems.hev_helmet, ModItems.hev_plate, ModItems.hev_legs, ModItems.hev_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.25F) + .addCategory(CATEGORY_PHYSICAL, 2F, 0.25F) .addCategory(CATEGORY_FIRE, 0.5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 5F, 0.25F) .addExact(DamageSource.onFire.damageType, 0F, 1F) .addExact(DamageSource.fall.damageType, 10F, 0F) .setOther(2F, 0.25F)); registerSet(ModItems.bismuth_helmet, ModItems.bismuth_plate, ModItems.bismuth_legs, ModItems.bismuth_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 2F, 0.15F) .addCategory(CATEGORY_FIRE, 5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 5F, 0.25F) .addExact(DamageSource.fall.damageType, 0F, 1F) @@ -220,13 +221,13 @@ public class DamageResistanceHandler { .addCategory(CATEGORY_FIRE, 0F, 1F) .setOther(1000F, 1F)); registerSet(ModItems.taurun_helmet, ModItems.taurun_plate, ModItems.taurun_legs, ModItems.taurun_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 2F, 0.15F) .addCategory(CATEGORY_FIRE, 0F, 0.25F) .addCategory(CATEGORY_EXPLOSION, 0F, 0.25F) .addExact(DamageSource.fall.damageType, 4F, 0.5F) .setOther(2F, 0.1F)); registerSet(ModItems.trenchmaster_helmet, ModItems.trenchmaster_plate, ModItems.trenchmaster_legs, ModItems.trenchmaster_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F) + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F) .addCategory(CATEGORY_FIRE, 5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 5F, 0.25F) .addExact(DamageClass.LASER.name(), 15F, 0.9F) @@ -443,10 +444,13 @@ public class DamageResistanceHandler { public static String typeToCategory(DamageSource source) { if(source.isExplosion()) return CATEGORY_EXPLOSION; if(source.isFireDamage()) return CATEGORY_FIRE; - if(source.isProjectile()) return CATEGORY_PROJECTILE; + if(source.isProjectile()) return CATEGORY_PHYSICAL; if(source.damageType.equals(DamageClass.LASER.name())) return CATEGORY_ENERGY; if(source.damageType.equals(DamageClass.MICROWAVE.name())) return CATEGORY_ENERGY; if(source.damageType.equals(DamageClass.SUBATOMIC.name())) return CATEGORY_ENERGY; + if(source.damageType.equals(DamageClass.ELECTRIC.name())) return CATEGORY_ENERGY; + if(source == DamageSource.cactus) return CATEGORY_PHYSICAL; + if(source instanceof EntityDamageSource) return CATEGORY_PHYSICAL; return source.damageType; } diff --git a/src/main/java/com/hbm/util/ItemStackUtil.java b/src/main/java/com/hbm/util/ItemStackUtil.java index ec39e1d3c..a3bc8a822 100644 --- a/src/main/java/com/hbm/util/ItemStackUtil.java +++ b/src/main/java/com/hbm/util/ItemStackUtil.java @@ -15,6 +15,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.common.registry.GameRegistry.UniqueIdentifier; + public class ItemStackUtil { public static ItemStack carefulCopy(ItemStack stack) { @@ -166,6 +169,19 @@ public class ItemStackUtil { return list; } + + /** + * Returns a String of the mod id of an itemstack. If a unique identifier can't be found in the registry, returns null. + * @param stack + * @return + */ + public static String getModIdFromItemStack(ItemStack stack) { + UniqueIdentifier id = GameRegistry.findUniqueIdentifierFor(stack.getItem()); + if(id!=null) { + return id.modId; + } + return null; + } public static void spillItems(World world, int x, int y, int z, Block block, Random rand) { IInventory tileentityfurnace = (IInventory) world.getTileEntity(x, y, z); diff --git a/src/main/java/com/hbm/util/LootGenerator.java b/src/main/java/com/hbm/util/LootGenerator.java index b14306b9e..a91ec0e3a 100644 --- a/src/main/java/com/hbm/util/LootGenerator.java +++ b/src/main/java/com/hbm/util/LootGenerator.java @@ -28,6 +28,8 @@ public class LootGenerator { public static final String LOOT_BONES = "LOOT_BONES"; public static final String LOOT_GLYPHID_HIVE = "LOOT_GLYPHID_HIVE"; public static final String LOOT_METEOR = "LOOT_METEOR"; + public static final String LOOT_FLAREGUN = "LOOT_FLAREGUN"; + public static final String LOOT_SHIT = "LOOT_SHIT"; public static void applyLoot(World world, int x, int y, int z, String name) { switch(name) { @@ -40,6 +42,8 @@ public class LootGenerator { case LOOT_BONES: lootBones(world, x, y, z); case LOOT_GLYPHID_HIVE: lootGlyphidHive(world, x, y, z); case LOOT_METEOR: lootBookMeteor(world, x, y, z); + case LOOT_FLAREGUN: lootFlareGun(world, x, y, z); + case LOOT_SHIT: lootShit(world, x, y, z); default: lootBones(world, x, y, z); break; } } @@ -55,6 +59,7 @@ public class LootGenerator { LOOT_BONES, LOOT_GLYPHID_HIVE, LOOT_METEOR, + LOOT_FLAREGUN, }; } @@ -211,4 +216,35 @@ public class LootGenerator { } } -} \ No newline at end of file + public static void lootFlareGun(World world, int x, int y, int z) { + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); + if (loot != null && loot.items.isEmpty()) { + addItemWithDeviation(loot, world.rand, new ItemStack(ModItems.gun_flaregun), 0, 0, -0.25); + + int count = world.rand.nextInt(3) + 2; + for (int k = 0; k < count; k++) + addItemWithDeviation(loot, world.rand, + new ItemStack(ModItems.ammo_standard, 1, EnumAmmo.G26_FLARE.ordinal()), + -0.25, k * 0.03125, 0.25); + + count = world.rand.nextInt(1) + 1; + for (int k = 0; k < count; k++) + addItemWithDeviation(loot, world.rand, + new ItemStack(ModItems.ammo_standard, 1, + world.rand.nextBoolean() ? EnumAmmo.G26_FLARE_SUPPLY.ordinal() : EnumAmmo.G26_FLARE_WEAPON.ordinal()), + 0.25, k * 0.03125, 0.125); + } + } + public static void lootShit(World world, int x, int y, int z) { + + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); + + if(loot != null && loot.items.isEmpty()) { + + int limit = world.rand.nextInt(3) + 3; + for(int i = 0; i < limit; i++) { + addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPool.getPool(ItemPoolsPile.POOL_PILE_OF_GARBAGE), world.rand), world.rand.nextDouble() - 0.5, i * 0.03125, world.rand.nextDouble() - 0.5); + } + } + } +} diff --git a/src/main/java/com/hbm/util/MobUtil.java b/src/main/java/com/hbm/util/MobUtil.java new file mode 100644 index 000000000..8779c1ed2 --- /dev/null +++ b/src/main/java/com/hbm/util/MobUtil.java @@ -0,0 +1,197 @@ +package com.hbm.util; + +import com.hbm.entity.mob.ai.EntityAIFireGun; +import com.hbm.items.ModItems; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.ai.EntityAITasks; +import net.minecraft.entity.monster.EntitySkeleton; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.WeightedRandom; + +import java.util.*; + +public class MobUtil { + + + public static Map> slotPoolCommon = new HashMap<>(); + public static Map> slotPoolRanged = new HashMap<>(); + + public static Map> slotPoolAdv = new HashMap<>(); + public static Map> slotPoolAdvRanged; + /**Unlike the above two, the Double is interpreted as minimum soot level, instead of armor slot **/ + public static HashMap> slotPoolGuns = new HashMap<>(); + + + public static void intializeMobPools(){ + slotPoolCommon.put(4, createSlotPool(8000, new Object[][]{ //new slots, smooth, brushed, no wrinkles // old slots, wrinkled, rusty, not smooth + {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, + {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, + {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, + {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} + })); + slotPoolCommon.put(3, createSlotPool(7000, new Object[][]{ + {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.robes_plate, 32}, + {ModItems.jackt, 32}, {ModItems.jackt2, 32}, {ModItems.alloy_plate, 2}, + {ModItems.steel_plate, 2} + })); + slotPoolCommon.put(2, createSlotPool(7000, new Object[][]{ + {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, + {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2} + })); + slotPoolCommon.put(1, createSlotPool(7000, new Object[][]{ + {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2} + })); + slotPoolCommon.put(0, createSlotPool(10000, new Object[][]{ + {ModItems.pipe_lead, 30}, {ModItems.crowbar, 25}, {ModItems.geiger_counter, 20}, + {ModItems.reer_graar, 16}, {ModItems.steel_pickaxe, 12}, {ModItems.stopsign, 10}, + {ModItems.sopsign, 8}, {ModItems.chernobylsign, 6}, {ModItems.steel_sword, 15}, + {ModItems.titanium_sword, 8}, {ModItems.lead_gavel, 4}, {ModItems.wrench_flipped, 2}, + {ModItems.wrench, 20} + })); + + slotPoolRanged.put(4, createSlotPool(12000, new Object[][]{ + {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, + {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, + {ModItems.rag_piss, 1}, {ModItems.goggles, 1}, {ModItems.alloy_helmet, 2}, + {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} + })); + slotPoolRanged.put(3, createSlotPool(10000, new Object[][]{ + {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.alloy_plate, 2}, //sadly they cant wear jackets bc it breaks it + {ModItems.steel_plate, 8}, {ModItems.titanium_plate, 4} + })); + slotPoolRanged.put(2, createSlotPool(10000, new Object[][]{ + {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, + {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2}, + })); + slotPoolRanged.put(1, createSlotPool(10000, new Object[][]{ + {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2}, + {ModItems.titanium_boots, 6} + })); + + slotPoolGuns.put(0.3, createSlotPool(new Object[][]{ + {ModItems.gun_light_revolver, 16}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 2} + })); + slotPoolGuns.put(1D, createSlotPool(new Object[][]{ + {ModItems.gun_light_revolver, 6}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 4}, {ModItems.gun_henry, 6} + })); + slotPoolGuns.put(3D, createSlotPool(new Object[][]{ + {ModItems.gun_uzi, 10}, {ModItems.gun_maresleg, 8}, {ModItems.gun_henry, 12}, {ModItems.gun_heavy_revolver, 4}, {ModItems.gun_flaregun, 2} + })); + slotPoolGuns.put(5D, createSlotPool(new Object[][]{ + {ModItems.gun_am180, 6}, {ModItems.gun_uzi, 10}, {ModItems.gun_spas12, 8}, {ModItems.gun_henry_lincoln, 2}, {ModItems.gun_heavy_revolver, 12}, {ModItems.gun_flaregun, 4}, {ModItems.gun_flamer, 2} + })); + + slotPoolAdv.put(4, createSlotPool(new Object[][]{ + {ModItems.security_helmet, 10}, {ModItems.t45_helmet, 4}, {ModItems.asbestos_helmet, 12}, + {ModItems.liquidator_helmet, 4}, {ModItems.no9, 12}, + {ModItems.hazmat_helmet, 6} + })); + slotPoolAdv.put(3, createSlotPool(new Object[][]{ + {ModItems.liquidator_plate, 4}, {ModItems.security_plate, 8}, {ModItems.asbestos_plate, 12}, + {ModItems.t45_plate, 4}, {ModItems.hazmat_plate, 6}, + {ModItems.steel_plate, 8} + })); + slotPoolAdv.put(2, createSlotPool(new Object[][]{ + {ModItems.liquidator_legs, 4}, {ModItems.security_legs, 8}, {ModItems.asbestos_legs, 12}, + {ModItems.t45_legs, 4}, {ModItems.hazmat_legs, 6}, + {ModItems.steel_legs, 8} + })); + slotPoolAdv.put(1, createSlotPool(new Object[][]{ + {ModItems.liquidator_boots, 4}, {ModItems.security_boots, 8}, {ModItems.asbestos_boots, 12}, + {ModItems.t45_boots, 4}, {ModItems.hazmat_boots, 6}, + {ModItems.robes_boots, 8} + })); + slotPoolAdv.put(0, createSlotPool(new Object[][]{ + {ModItems.pipe_lead, 20}, {ModItems.crowbar, 30}, {ModItems.geiger_counter, 20}, + {ModItems.reer_graar, 20}, {ModItems.wrench_flipped, 12}, {ModItems.stopsign, 16}, + {ModItems.sopsign, 4}, {ModItems.chernobylsign, 16}, + {ModItems.titanium_sword, 18}, {ModItems.lead_gavel, 8}, + {ModItems.wrench, 20} + })); + + slotPoolAdvRanged = new HashMap<>(slotPoolAdv); + slotPoolAdvRanged.remove(0); + + } + + public static List createSlotPool(int nullWeight, Object[][] items) { + List pool = new ArrayList<>(); + pool.add(new WeightedRandomObject(null, nullWeight)); + for (Object[] item : items) { + Object obj = item[0]; + int weight = (int) item[1]; + + if (obj instanceof Item) { + pool.add(new WeightedRandomObject(new ItemStack((Item) obj), weight)); + } else if (obj instanceof ItemStack) { //lol just make it pass ItemStack aswell + pool.add(new WeightedRandomObject(obj, weight)); + } + } + return pool; + } + public static List createSlotPool(Object[][] items) { + List pool = new ArrayList<>(); + for (Object[] item : items) { + Object obj = item[0]; + int weight = (int) item[1]; + + if (obj instanceof Item) { + pool.add(new WeightedRandomObject(new ItemStack((Item) obj), weight)); + } else if (obj instanceof ItemStack) { //lol just make it pass ItemStack aswell + pool.add(new WeightedRandomObject(obj, weight)); + } + } + return pool; + } + + public static void equipFullSet(EntityLivingBase entity, Item helmet, Item chest, Item legs, Item boots) { //for brainlets (me) to add more armorsets later when i forget about how this works + entity.setCurrentItemOrArmor(4, new ItemStack(helmet)); //p_70062_1_ is the slot number + entity.setCurrentItemOrArmor(3, new ItemStack(chest)); + entity.setCurrentItemOrArmor(2, new ItemStack(legs)); + entity.setCurrentItemOrArmor(1, new ItemStack(boots)); + } + + public static void assignItemsToEntity(EntityLivingBase entity, Map> slotPools, Random rand) { + for (Map.Entry> entry : slotPools.entrySet()) { + int slot = entry.getKey(); + List pool = entry.getValue(); + + WeightedRandomObject choice = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); //NullPointerException sludge fix + if (choice == null) { + continue; + } + + ItemStack stack = choice.asStack(); + if (stack == null || stack.getItem() == null) { + continue; + } + + if (stack.getItem() == ModItems.gas_mask_m65 //eyesore + || stack.getItem() == ModItems.gas_mask_olde + || stack.getItem() == ModItems.gas_mask_mono) { + ArmorUtil.installGasMaskFilter(stack, new ItemStack(ModItems.gas_mask_filter)); + } + + entity.setCurrentItemOrArmor(slot, stack); + + //Give skeleton AI if it has a gun + if (slot == 0 && entity instanceof EntitySkeleton && pool == slotPools.get(0)) { + addFireTask((EntityLiving) entity); + } + } + } + + // these fucking tasks keep stacking on top of themselves + public static void addFireTask(EntityLiving entity) { + entity.setEquipmentDropChance(0, 0); // Prevent dropping guns + + for(Object entry : entity.tasks.taskEntries) { + EntityAITasks.EntityAITaskEntry task = (EntityAITasks.EntityAITaskEntry) entry; + if(task.action instanceof EntityAIFireGun) return; + } + + entity.tasks.addTask(3, new EntityAIFireGun(entity)); + } +} diff --git a/src/main/java/com/hbm/util/ShadyUtil.java b/src/main/java/com/hbm/util/ShadyUtil.java index 03a2390ab..7f6d3351f 100644 --- a/src/main/java/com/hbm/util/ShadyUtil.java +++ b/src/main/java/com/hbm/util/ShadyUtil.java @@ -144,8 +144,8 @@ public class ShadyUtil { Field field = ReflectionHelper.findField(test, decode(offset(checksum, -2))); if(field != null) { System.out.println("TEST SECTION START"); - Class toLoad = Class.forName(decode(offset(testCase, -2))); - Field toRead = ReflectionHelper.findField(toLoad, decode(offset(testValue, -2))); + //Class toLoad = Class.forName(decode(offset(testCase, -2))); + //Field toRead = ReflectionHelper.findField(toLoad, decode(offset(testValue, -2))); //ModEventHandler.reference = toRead; System.out.println("TEST SECTION END"); } diff --git a/src/main/java/com/hbm/util/Vec3NT.java b/src/main/java/com/hbm/util/Vec3NT.java index 0cb8121a7..1e6cb1294 100644 --- a/src/main/java/com/hbm/util/Vec3NT.java +++ b/src/main/java/com/hbm/util/Vec3NT.java @@ -29,6 +29,13 @@ public class Vec3NT extends Vec3 { return this; } + public Vec3NT add(Vec3 vec) { + this.xCoord += vec.xCoord; + this.yCoord += vec.yCoord; + this.zCoord += vec.zCoord; + return this; + } + public Vec3NT multiply(double m) { this.xCoord *= m; this.yCoord *= m; @@ -43,6 +50,13 @@ public class Vec3NT extends Vec3 { return this; } + public double distanceTo(double x, double y, double z) { + double dX = x - this.xCoord; + double dY = y - this.yCoord; + double dZ = z - this.zCoord; + return Math.sqrt(dX * dX + dY * dY + dZ * dZ); + } + @Override public Vec3NT setComponents(double x, double y, double z) { this.xCoord = x; diff --git a/src/main/java/com/hbm/world/gen/MapGenNTMFeatures.java b/src/main/java/com/hbm/world/gen/MapGenNTMFeatures.java index 20f380ed9..96641134f 100644 --- a/src/main/java/com/hbm/world/gen/MapGenNTMFeatures.java +++ b/src/main/java/com/hbm/world/gen/MapGenNTMFeatures.java @@ -15,10 +15,10 @@ import com.hbm.world.gen.component.CivilianFeatures.NTMLab2; import com.hbm.world.gen.component.CivilianFeatures.RuralHouse1; import com.hbm.world.gen.component.OfficeFeatures.LargeOffice; import com.hbm.world.gen.component.OfficeFeatures.LargeOfficeCorner; -import com.hbm.world.gen.component.RuinFeatures.NTMRuin1; -import com.hbm.world.gen.component.RuinFeatures.NTMRuin2; -import com.hbm.world.gen.component.RuinFeatures.NTMRuin3; -import com.hbm.world.gen.component.RuinFeatures.NTMRuin4; +//import com.hbm.world.gen.component.RuinFeatures.NTMRuin1; +//import com.hbm.world.gen.component.RuinFeatures.NTMRuin2; +//import com.hbm.world.gen.component.RuinFeatures.NTMRuin3; +//import com.hbm.world.gen.component.RuinFeatures.NTMRuin4; import com.hbm.world.gen.component.SiloComponent; import net.minecraft.world.World; @@ -124,26 +124,26 @@ public class MapGenNTMFeatures extends MapGenStructure { */ //TODO: Do something about this so it's nice-looking and easily readable. Plus, test compatibility against mods like BoP - if(rand.nextInt(3) == 0) { //Empty Ruin Structures - switch(rand.nextInt(4)) { - case 0: - NTMRuin1 ruin1 = new NTMRuin1(rand, i, j); - this.components.add(ruin1); - break; - case 1: - NTMRuin2 ruin2 = new NTMRuin2(rand, i, j); - this.components.add(ruin2); - break; - case 2: - NTMRuin3 ruin3 = new NTMRuin3(rand, i, j); - this.components.add(ruin3); - break; - case 3: - NTMRuin4 ruin4 = new NTMRuin4(rand, i, j); - this.components.add(ruin4); - } +// if(rand.nextInt(3) == 0) { //Empty Ruin Structures +// switch(rand.nextInt(4)) { +// case 0: +// NTMRuin1 ruin1 = new NTMRuin1(rand, i, j); +// this.components.add(ruin1); +// break; +// case 1: +// NTMRuin2 ruin2 = new NTMRuin2(rand, i, j); +// this.components.add(ruin2); +// break; +// case 2: +// NTMRuin3 ruin3 = new NTMRuin3(rand, i, j); +// this.components.add(ruin3); +// break; +// case 3: +// NTMRuin4 ruin4 = new NTMRuin4(rand, i, j); +// this.components.add(ruin4); +// } - } else if(biome.heightVariation <= 0.25F && rand.nextInt(10) == 0) { //for now our only restriction is kinda-flat biomes. that and chance might change idk + if(biome.heightVariation <= 0.25F && rand.nextInt(10) == 0) { //for now our only restriction is kinda-flat biomes. that and chance might change idk SiloComponent silo = new SiloComponent(rand, i, j); this.components.add(silo); } else if(biome.temperature >= 1.0 && biome.rainfall == 0 && !(biome instanceof BiomeGenMesa)) { //Desert & Savannah diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index 37b634229..ffa9977b3 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -9,14 +9,15 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.config.StructureConfig; import com.hbm.main.StructureManager; -import com.hbm.world.gen.NBTStructure.JigsawPiece; -import com.hbm.world.gen.NBTStructure.JigsawPool; -import com.hbm.world.gen.NBTStructure.SpawnCondition; import com.hbm.world.gen.component.BunkerComponents.BunkerStart; import com.hbm.world.gen.component.Component.CrabSpawners; import com.hbm.world.gen.component.Component.GreenOoze; import com.hbm.world.gen.component.Component.MeteorBricks; import com.hbm.world.gen.component.Component.SupplyCrates; +import com.hbm.world.gen.nbt.JigsawPiece; +import com.hbm.world.gen.nbt.JigsawPool; +import com.hbm.world.gen.nbt.NBTStructure; +import com.hbm.world.gen.nbt.SpawnCondition; import cpw.mods.fml.common.IWorldGenerator; import cpw.mods.fml.common.eventhandler.SubscribeEvent; @@ -39,46 +40,47 @@ public class NTMWorldGenerator implements IWorldGenerator { final List oceanBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.ocean, BiomeGenBase.deepOcean }); final List beachBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.beach, BiomeGenBase.stoneBeach, BiomeGenBase.coldBeach }); final List lighthouseBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.ocean, BiomeGenBase.deepOcean, BiomeGenBase.beach, BiomeGenBase.stoneBeach, BiomeGenBase.coldBeach }); + final List flatbiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.plains, BiomeGenBase.icePlains, BiomeGenBase.desert }); /// SPIRE /// - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("spire") {{ canSpawn = biome -> biome.heightVariation <= 0.05F && !invalidBiomes.contains(biome); structure = new JigsawPiece("spire", StructureManager.spire, -1); spawnWeight = 2; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("features") {{ canSpawn = biome -> !invalidBiomes.contains(biome); start = d -> new MapGenNTMFeatures.Start(d.getW(), d.getX(), d.getY(), d.getZ()); spawnWeight = 14 * 4; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("bunker") {{ canSpawn = biome -> !invalidBiomes.contains(biome); start = d -> new BunkerStart(d.getW(), d.getX(), d.getY(), d.getZ()); spawnWeight = 1 * 4; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("vertibird") {{ canSpawn = biome -> !biome.canSpawnLightningBolt() && biome.temperature >= 2F; structure = new JigsawPiece("vertibird", StructureManager.vertibird, -3); spawnWeight = 3 * 4; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("crashed_vertibird") {{ canSpawn = biome -> !biome.canSpawnLightningBolt() && biome.temperature >= 2F; structure = new JigsawPiece("crashed_vertibird", StructureManager.crashed_vertibird, -10); spawnWeight = 3 * 4; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("aircraft_carrier") {{ canSpawn = oceanBiomes::contains; structure = new JigsawPiece("aircraft_carrier", StructureManager.aircraft_carrier, -6); maxHeight = 42; spawnWeight = 1; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("oil_rig") {{ canSpawn = biome -> biome == BiomeGenBase.deepOcean; structure = new JigsawPiece("oil_rig", StructureManager.oil_rig, -20); maxHeight = 12; @@ -86,7 +88,7 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 2; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("lighthouse") {{ canSpawn = lighthouseBiomes::contains; structure = new JigsawPiece("lighthouse", StructureManager.lighthouse, -40); maxHeight = 29; @@ -94,7 +96,7 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 2; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("beached_patrol") {{ canSpawn = beachBiomes::contains; structure = new JigsawPiece("beached_patrol", StructureManager.beached_patrol, -5); minHeight = 58; @@ -102,7 +104,9 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 8; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); //why the fuck did this change + + NBTStructure.registerStructure(0, new SpawnCondition("dish") {{ canSpawn = biome -> biome == BiomeGenBase.plains; structure = new JigsawPiece("dish", StructureManager.dish, -10); minHeight = 53; @@ -117,6 +121,64 @@ public class NTMWorldGenerator implements IWorldGenerator { }}); NBTStructure.registerNullWeight(0, 4, oceanBiomes::contains); + NBTStructure.registerStructure(0, new SpawnCondition("ruin1") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsA", StructureManager.ntmruinsA, -1) {{conformToTerrain = true;}}; + spawnWeight = 20; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin2") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsB", StructureManager.ntmruinsB, -1) {{conformToTerrain = true;}}; + spawnWeight = 25; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin3") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsC", StructureManager.ntmruinsC, -1) {{conformToTerrain = true;}}; + spawnWeight = 25; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin4") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsD", StructureManager.ntmruinsD, -1) {{conformToTerrain = true;}}; + spawnWeight = 30; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin5") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsE", StructureManager.ntmruinsE, -1) {{conformToTerrain = true;}}; + spawnWeight = 30; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin6") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsF", StructureManager.ntmruinsF, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin7") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsG", StructureManager.ntmruinsG, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin8") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsH", StructureManager.ntmruinsH, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin9") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsI", StructureManager.ntmruinsI, -1) {{conformToTerrain = true;}}; + spawnWeight = 50; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("ruin10") {{ + canSpawn = biome -> !invalidBiomes.contains(biome) && biome.canSpawnLightningBolt(); + structure = new JigsawPiece("NTMRuinsJ", StructureManager.ntmruinsJ, -1) {{conformToTerrain = true;}}; + spawnWeight = 35; + }}); + NBTStructure.registerStructure(0, new SpawnCondition("radio") {{ + canSpawn = flatbiomes::contains; + structure = new JigsawPiece("radio_house", StructureManager.radio_house, -6); + spawnWeight = 30; + }}); + + NBTStructure.registerNullWeight(0, 2, biome -> biome == BiomeGenBase.plains); + NBTStructure.registerNullWeight(0, 2, oceanBiomes::contains); Map bricks = new HashMap() {{ put(ModBlocks.meteor_brick, new MeteorBricks()); @@ -131,13 +193,13 @@ public class NTMWorldGenerator implements IWorldGenerator { put(ModBlocks.concrete_colored, new GreenOoze()); }}; - NBTStructure.registerStructure(0, new SpawnCondition() {{ + NBTStructure.registerStructure(0, new SpawnCondition("meteor_dungeon") {{ minHeight = 32; maxHeight = 32; sizeLimit = 128; canSpawn = biome -> biome.rootHeight >= 0; startPool = "start"; - pools = new HashMap() {{ + pools = new HashMap() {{ put("start", new JigsawPool() {{ add(new JigsawPiece("meteor_core", StructureManager.meteor_core) {{ blockTable = bricks; }}, 1); }}); @@ -258,4 +320,13 @@ public class NTMWorldGenerator implements IWorldGenerator { nbtGen.generateStructures(world, rand, chunkProvider, chunkX, chunkZ); } + public SpawnCondition getStructureAt(World world, int chunkX, int chunkZ) { + if(StructureConfig.enableStructures == 0) return null; + if(StructureConfig.enableStructures == 2 && !world.getWorldInfo().isMapFeaturesEnabled()) return null; + + setRandomSeed(world, chunkX, chunkZ); + + return nbtGen.getStructureAt(world, chunkX, chunkZ); + } + } diff --git a/src/main/java/com/hbm/world/gen/component/BunkerComponents.java b/src/main/java/com/hbm/world/gen/component/BunkerComponents.java index 356164a26..3ae448a03 100644 --- a/src/main/java/com/hbm/world/gen/component/BunkerComponents.java +++ b/src/main/java/com/hbm/world/gen/component/BunkerComponents.java @@ -127,7 +127,7 @@ public class BunkerComponents { fillWithMetadataBlocks(world, box, 1, hpos, 4, 1, hpos, 6, ModBlocks.concrete_smooth_stairs, getStairMeta(0)); placeBlockAtCurrentPosition(world, ModBlocks.concrete_slab, 1, 2, hpos, 3, box); placeBlockAtCurrentPosition(world, ModBlocks.concrete_smooth_stairs, getStairMeta(2), 2, hpos, 4, box); - placeBlockAtCurrentPosition(world, Blocks.trapdoor, getDecoModelMeta(8) >> 2, 2, hpos, 5, box); + placeBlockAtCurrentPosition(world, ModBlocks.trapdoor_steel, getDecoModelMeta(8) >> 2, 2, hpos, 5, box); placeBlockAtCurrentPosition(world, ModBlocks.concrete_smooth_stairs, getStairMeta(3), 2, hpos, 6, box); placeBlockAtCurrentPosition(world, ModBlocks.concrete_slab, 1, 2, hpos, 7, box); fillWithMetadataBlocks(world, box, 3, hpos, 4, 3, hpos, 6, ModBlocks.concrete_smooth_stairs, getStairMeta(1)); diff --git a/src/main/java/com/hbm/world/gen/component/RuinFeatures.java b/src/main/java/com/hbm/world/gen/component/RuinFeatures.java index 9204e7b0e..0e59878d5 100644 --- a/src/main/java/com/hbm/world/gen/component/RuinFeatures.java +++ b/src/main/java/com/hbm/world/gen/component/RuinFeatures.java @@ -8,42 +8,42 @@ import net.minecraft.init.Blocks; import net.minecraft.world.World; import net.minecraft.world.gen.structure.MapGenStructureIO; import net.minecraft.world.gen.structure.StructureBoundingBox; - +// Idk what i should do with these if you read this bob do whatever since it's not used anywhere public class RuinFeatures { - + public static void registerComponents() { 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"); } - + public static class NTMRuin1 extends Component { - + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); - + public NTMRuin1() { super(); } - + public NTMRuin1(Random rand, int minX, int minZ) { super(rand, minX, 64, 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, 8, 10, -1, box); - + int pillarMetaWE = this.getPillarMeta(4); int pillarMetaNS = this.getPillarMeta(8); - + this.fillWithBlocks(world, box, 0, 0, 0, 0, 6, 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, 6 - 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); @@ -83,39 +83,39 @@ public class RuinFeatures { this.fillWithRandomizedBlocks(world, box, 8, 0, 6, 8, 0, 6, false, rand, RandomConcreteBricks); this.fillWithRandomizedBlocks(world, box, 8, 0, 10 - 2, 8, 1, 10 - 1, false, rand, RandomConcreteBricks); this.fillWithRandomizedBlocks(world, box, 8, 2, 10 - 1, 8, 2, 10 - 1, false, rand, RandomConcreteBricks); - + this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 1, 8 - 1, 0, 10 - 1, Blocks.gravel, Blocks.air, false); - + return true; } } - + public static class NTMRuin2 extends Component { - + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); - + public NTMRuin2() { super(); } - + public NTMRuin2(Random rand, int minX, int minZ) { super(rand, minX, 64, 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, 7, 10, -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, 7 - 1, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); this.fillWithBlocks(world, box, 7, 0, 0, 7, 5, 0, ModBlocks.concrete_pillar, Blocks.air, false); @@ -146,40 +146,40 @@ public class RuinFeatures { this.fillWithRandomizedBlocks(world, box, 7, 0, 6, 7, 0, 10 - 1, false, rand, RandomConcreteBricks); this.fillWithRandomizedBlocks(world, box, 7, 1, 6, 7, 1, 7, false, rand, RandomConcreteBricks); this.fillWithRandomizedBlocks(world, box, 7, 1, 10 - 1, 7, 2, 10 - 1, false, rand, RandomConcreteBricks); - + this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 1, 7 - 1, 0, 10 - 1, Blocks.gravel, Blocks.air, false); - + return true; } } - + public static class NTMRuin3 extends Component { - + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); - + public NTMRuin3() { super(); } - + public NTMRuin3(Random rand, int minX, int minZ) { super(rand, minX, 64, 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, 10, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 8, 0, 8, 10, -1, box); - + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 0, 8, 0, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 4, 8, 4, -1, box); - + this.fillWithBlocks(world, box, 0, 0, 0, 0, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall this.fillWithBlocks(world, box, 8, 0, 0, 8, 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); this.fillWithRandomizedBlocks(world, box, 1, 0, 0, 8 - 1, 0, 0, false, rand, RandomConcreteBricks); @@ -202,44 +202,44 @@ public class RuinFeatures { 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, 8 - 1, 1, 4, false, rand, RandomConcreteBricks); - + this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 1, 8 - 1, 0, 3, Blocks.gravel, Blocks.air, false); this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 5, 8 - 1, 0, 10 - 1, Blocks.gravel, Blocks.air, false); - + return true; } } - + public static class NTMRuin4 extends Component { - + private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks(); - + public NTMRuin4() { super(); } - + public NTMRuin4(Random rand, int minX, int minZ) { super(rand, minX, 64, 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, 11, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 10, 5, 10, 11, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 5, 0, 5, 4, -1, box); - + placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 11, 10 - 1, 11, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 1, 0, 4, 0, -1, box); placeFoundationUnderneath(world, Blocks.stonebrick, 0, 5, 5, 10 - 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, 2, 0, ModBlocks.concrete_pillar, Blocks.air, false); this.fillWithRandomizedBlocks(world, box, 1, 0, 0, 4, 0, 0, false, rand, RandomConcreteBricks); @@ -263,12 +263,12 @@ public class RuinFeatures { this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, 11 - 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, 10 - 1, 0, 11 - 1, Blocks.gravel, Blocks.air, false); - + return true; } } - + } diff --git a/src/main/java/com/hbm/world/gen/INBTTransformable.java b/src/main/java/com/hbm/world/gen/nbt/INBTBlockTransformable.java similarity index 89% rename from src/main/java/com/hbm/world/gen/INBTTransformable.java rename to src/main/java/com/hbm/world/gen/nbt/INBTBlockTransformable.java index 1d2cb8746..0247478e6 100644 --- a/src/main/java/com/hbm/world/gen/INBTTransformable.java +++ b/src/main/java/com/hbm/world/gen/nbt/INBTBlockTransformable.java @@ -1,8 +1,8 @@ -package com.hbm.world.gen; +package com.hbm.world.gen.nbt; import net.minecraft.block.Block; -public interface INBTTransformable { +public interface INBTBlockTransformable { /** * Defines this block as something that has a rotation or some other blockstate @@ -80,6 +80,30 @@ public interface INBTTransformable { return meta; } + // what in the FUCK mojangles + // same as stairs but 1 & 3 flipped + public static int transformMetaTrapdoor(int meta, int coordBaseMode) { + if(coordBaseMode == 0) return meta; + switch(coordBaseMode) { + case 1: //West + if((meta & 3) < 2) + meta = meta ^ 3; + else + meta = meta ^ 2; + break; + case 2: //North + meta = meta ^ 1; //Flip first bit + break; + case 3: //East + if((meta & 3) < 2) + meta = meta ^ 2; + else + meta = meta ^ 3; + break; + } + return meta; + } + public static int transformMetaPillar(int meta, int coordBaseMode) { if(coordBaseMode == 0 || coordBaseMode == 2) return meta; int type = meta & 3; diff --git a/src/main/java/com/hbm/world/gen/INBTTileEntityTransformable.java b/src/main/java/com/hbm/world/gen/nbt/INBTTileEntityTransformable.java similarity index 90% rename from src/main/java/com/hbm/world/gen/INBTTileEntityTransformable.java rename to src/main/java/com/hbm/world/gen/nbt/INBTTileEntityTransformable.java index 33dc141c8..88a05ba2e 100644 --- a/src/main/java/com/hbm/world/gen/INBTTileEntityTransformable.java +++ b/src/main/java/com/hbm/world/gen/nbt/INBTTileEntityTransformable.java @@ -1,4 +1,4 @@ -package com.hbm.world.gen; +package com.hbm.world.gen.nbt; import net.minecraft.world.World; diff --git a/src/main/java/com/hbm/world/gen/nbt/JigsawPiece.java b/src/main/java/com/hbm/world/gen/nbt/JigsawPiece.java new file mode 100644 index 000000000..039f8d154 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/nbt/JigsawPiece.java @@ -0,0 +1,39 @@ +package com.hbm.world.gen.nbt; + +import java.util.HashMap; +import java.util.Map; + +import net.minecraft.block.Block; +import net.minecraft.world.gen.structure.StructureComponent.BlockSelector; + +// Assigned to a Component to build +public class JigsawPiece { + + // Translates a given name into a jigsaw piece, for serialization + protected static Map jigsawMap = new HashMap<>(); + + public final String name; + public final NBTStructure structure; + + // Block modifiers, for randomization and terrain matching + public Map blockTable; + public boolean conformToTerrain = false; // moves every single column to the terrain (digging out trenches, natural formations) + public boolean alignToTerrain = false; // aligns this component y-level individually, without moving individual columns (village houses) + public int heightOffset = 0; // individual offset for the structure + + public JigsawPiece(String name, NBTStructure structure) { + this(name, structure, 0); + } + + public JigsawPiece(String name, NBTStructure structure, int heightOffset) { + if(name == null) throw new IllegalStateException("A severe error has occurred in NBTStructure! A jigsaw piece has been registered without a valid name!"); + if(jigsawMap.containsKey(name)) throw new IllegalStateException("A severe error has occurred in NBTStructure! A jigsaw piece has been registered with the same name as another: " + name); + + this.name = name; + this.structure = structure; + jigsawMap.put(name, this); + + this.heightOffset = heightOffset; + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/world/gen/nbt/JigsawPool.java b/src/main/java/com/hbm/world/gen/nbt/JigsawPool.java new file mode 100644 index 000000000..aaf0e70d2 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/nbt/JigsawPool.java @@ -0,0 +1,58 @@ +package com.hbm.world.gen.nbt; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import com.hbm.util.Tuple.Pair; + +// A set of pieces with weights +public class JigsawPool { + + // Weighted list of pieces to pick from + List> pieces = new ArrayList<>(); + int totalWeight = 0; + + public String fallback; + + private boolean isClone; + + public void add(JigsawPiece piece, int weight) { + if(weight <= 0) throw new IllegalStateException("JigsawPool spawn weight must be positive!"); + pieces.add(new Pair<>(piece, weight)); + totalWeight += weight; + } + + protected JigsawPool clone() { + JigsawPool clone = new JigsawPool(); + clone.pieces = new ArrayList<>(this.pieces); + clone.fallback = this.fallback; + clone.totalWeight = this.totalWeight; + clone.isClone = true; + + return clone; + } + + // If from a clone, will remove from the pool + public JigsawPiece get(Random rand) { + if(totalWeight <= 0) return null; + int weight = rand.nextInt(totalWeight); + + for(int i = 0; i < pieces.size(); i++) { + Pair pair = pieces.get(i); + weight -= pair.getValue(); + + if(weight < 0) { + if(isClone) { + pieces.remove(i); + totalWeight -= pair.getValue(); + } + + return pair.getKey(); + } + } + + return null; + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/world/gen/NBTStructure.java b/src/main/java/com/hbm/world/gen/nbt/NBTStructure.java similarity index 81% rename from src/main/java/com/hbm/world/gen/NBTStructure.java rename to src/main/java/com/hbm/world/gen/nbt/NBTStructure.java index 60da4735a..2bf7de38c 100644 --- a/src/main/java/com/hbm/world/gen/NBTStructure.java +++ b/src/main/java/com/hbm/world/gen/nbt/NBTStructure.java @@ -1,15 +1,15 @@ -package com.hbm.world.gen; +package com.hbm.world.gen.nbt; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.*; -import java.util.function.Function; import java.util.function.Predicate; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockWand; +import com.hbm.blocks.generic.BlockWandTandem.TileEntityWandTandem; import com.hbm.config.GeneralConfig; import com.hbm.config.StructureConfig; import com.hbm.handler.ThreeInts; @@ -17,6 +17,7 @@ import com.hbm.main.MainRegistry; import com.hbm.util.Tuple.Pair; import com.hbm.util.Tuple.Quartet; import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.world.gen.nbt.SpawnCondition.WorldCoordinate; import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.block.*; @@ -31,6 +32,7 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; +import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.chunk.IChunkProvider; @@ -53,16 +55,16 @@ public class NBTStructure { * without having to define and register each structure manually */ - protected static Map> weightedMap = new HashMap<>(); + private static Map namedMap = new HashMap<>(); - // serialization data - protected static Map jigsawMap = new HashMap<>(); + protected static Map> weightedMap = new HashMap<>(); + protected static Map> customSpawnMap = new HashMap<>(); private String name; private boolean isLoaded; - private ThreeInts size; + protected ThreeInts size; private List> itemPalette; private BlockState[][][] blockArray; @@ -89,6 +91,17 @@ public class NBTStructure { // Register a new structure for a given dimension public static void registerStructure(int dimensionId, SpawnCondition spawn) { + if(namedMap.containsKey(spawn.name) && namedMap.get(spawn.name) != spawn) + throw new IllegalStateException("A severe error has occurred in NBTStructure! A SpawnCondition has been registered with the same name as another: " + spawn.name); + + namedMap.put(spawn.name, spawn); + + if(spawn.checkCoordinates != null) { + List spawnList = customSpawnMap.computeIfAbsent(dimensionId, integer -> new ArrayList()); + spawnList.add(spawn); + return; + } + List weightedList = weightedMap.computeIfAbsent(dimensionId, integer -> new ArrayList()); for(int i = 0; i < spawn.spawnWeight; i++) { weightedList.add(spawn); @@ -107,10 +120,7 @@ public class NBTStructure { } public static void registerNullWeight(int dimensionId, int weight, Predicate predicate) { - SpawnCondition spawn = new SpawnCondition() {{ - spawnWeight = weight; - canSpawn = predicate; - }}; + SpawnCondition spawn = new SpawnCondition(weight, predicate); List weightedList = weightedMap.computeIfAbsent(dimensionId, integer -> new ArrayList()); for(int i = 0; i < spawn.spawnWeight; i++) { @@ -118,6 +128,19 @@ public class NBTStructure { } } + // Presents a list of all structures registered (so far) + public static List listStructures() { + List names = new ArrayList<>(namedMap.keySet()); + names.sort((a, b) -> a.compareTo(b)); + return names; + } + + // Fetches a registered structure by name, + // If one is not found, will simply return null. + public static SpawnCondition getStructure(String name) { + return namedMap.get(name); + } + // Saves a selected area into an NBT structure (+ some of our non-standard stuff to support 1.7.10) public static void saveArea(String filename, World world, int x1, int y1, int z1, int x2, int y2, int z2, Set> exclude) { NBTTagCompound structure = new NBTTagCompound(); @@ -399,7 +422,7 @@ public class NBTStructure { return worldItemPalette; } - private TileEntity buildTileEntity(World world, Block block, HashMap worldItemPalette, NBTTagCompound nbt, int coordBaseMode) { + private TileEntity buildTileEntity(World world, Block block, HashMap worldItemPalette, NBTTagCompound nbt, int coordBaseMode, String structureName) { nbt = (NBTTagCompound)nbt.copy(); if(worldItemPalette != null) relinkItems(worldItemPalette, nbt); @@ -410,6 +433,10 @@ public class NBTStructure { ((INBTTileEntityTransformable) te).transformTE(world, coordBaseMode); } + if(te instanceof TileEntityWandTandem) { + ((TileEntityWandTandem) te).arm(getStructure(structureName)); + } + return te; } @@ -449,7 +476,7 @@ public class NBTStructure { world.setBlock(rx, ry, rz, block, meta, 2); if(state.nbt != null) { - TileEntity te = buildTileEntity(world, block, worldItemPalette, state.nbt, coordBaseMode); + TileEntity te = buildTileEntity(world, block, worldItemPalette, state.nbt, coordBaseMode, null); world.setTileEntity(rx, ry, rz, te); } } @@ -457,7 +484,23 @@ public class NBTStructure { } } - protected boolean build(World world, JigsawPiece piece, StructureBoundingBox totalBounds, StructureBoundingBox generatingBounds, int coordBaseMode) { + // Used to construct tandems + public void build(World world, JigsawPiece piece, int x, int y, int z, int coordBaseMode, String structureName) { + StructureBoundingBox bb; + switch(coordBaseMode) { + case 1: + case 3: + bb = new StructureBoundingBox(x, y, z, x + piece.structure.size.z - 1, y + piece.structure.size.y - 1, z + piece.structure.size.x - 1); + break; + default: + bb = new StructureBoundingBox(x, y, z, x + piece.structure.size.x - 1, y + piece.structure.size.y - 1, z + piece.structure.size.z - 1); + break; + } + + build(world, piece, bb, bb, coordBaseMode, structureName); + } + + protected boolean build(World world, JigsawPiece piece, StructureBoundingBox totalBounds, StructureBoundingBox generatingBounds, int coordBaseMode, String structureName) { if(!isLoaded) { MainRegistry.logger.info("NBTStructure is invalid"); return false; @@ -506,7 +549,7 @@ public class NBTStructure { world.setBlock(rx, ry, rz, block, meta, 2); if(state.nbt != null) { - TileEntity te = buildTileEntity(world, block, worldItemPalette, state.nbt, coordBaseMode); + TileEntity te = buildTileEntity(world, block, worldItemPalette, state.nbt, coordBaseMode, structureName); world.setTileEntity(rx, ry, rz, te); } } @@ -516,6 +559,16 @@ public class NBTStructure { return true; } + public List getConnectionPool(ForgeDirection dir, String target) { + if(dir == ForgeDirection.DOWN) { + return toTopConnections.get(target); + } else if(dir == ForgeDirection.UP) { + return toBottomConnections.get(target); + } + + return toHorizontalConnections.get(target); + } + // What a fucken mess, why even implement the IntArray NBT if ye aint gonna use it Moe Yang? private ThreeInts parsePos(NBTTagList pos) { NBTBase xb = (NBTBase)pos.tagList.get(0); @@ -552,7 +605,7 @@ public class NBTStructure { return selector.func_151561_a(); } - if(definition.block instanceof INBTTransformable) return ((INBTTransformable) definition.block).transformBlock(definition.block); + if(definition.block instanceof INBTBlockTransformable) return ((INBTBlockTransformable) definition.block).transformBlock(definition.block); return definition.block; } @@ -563,26 +616,27 @@ public class NBTStructure { } // Our shit - if(definition.block instanceof INBTTransformable) return ((INBTTransformable) definition.block).transformMeta(definition.meta, coordBaseMode); + if(definition.block instanceof INBTBlockTransformable) return ((INBTBlockTransformable) definition.block).transformMeta(definition.meta, coordBaseMode); if(coordBaseMode == 0) return definition.meta; // Vanilla shit - if(definition.block instanceof BlockStairs) return INBTTransformable.transformMetaStairs(definition.meta, coordBaseMode); - if(definition.block instanceof BlockRotatedPillar) return INBTTransformable.transformMetaPillar(definition.meta, coordBaseMode); - if(definition.block instanceof BlockDirectional) return INBTTransformable.transformMetaDirectional(definition.meta, coordBaseMode); - if(definition.block instanceof BlockTorch) return INBTTransformable.transformMetaTorch(definition.meta, coordBaseMode); - if(definition.block instanceof BlockButton) return INBTTransformable.transformMetaTorch(definition.meta, coordBaseMode); - if(definition.block instanceof BlockDoor) return INBTTransformable.transformMetaDoor(definition.meta, coordBaseMode); - if(definition.block instanceof BlockLever) return INBTTransformable.transformMetaLever(definition.meta, coordBaseMode); - if(definition.block instanceof BlockSign) return INBTTransformable.transformMetaDeco(definition.meta, coordBaseMode); - if(definition.block instanceof BlockLadder) return INBTTransformable.transformMetaDeco(definition.meta, coordBaseMode); - if(definition.block instanceof BlockTripWireHook) return INBTTransformable.transformMetaDirectional(definition.meta, coordBaseMode); - if(definition.block == Blocks.vine) return INBTTransformable.transformMetaVine(definition.meta, coordBaseMode); + if(definition.block instanceof BlockStairs) return INBTBlockTransformable.transformMetaStairs(definition.meta, coordBaseMode); + if(definition.block instanceof BlockRotatedPillar) return INBTBlockTransformable.transformMetaPillar(definition.meta, coordBaseMode); + if(definition.block instanceof BlockDirectional) return INBTBlockTransformable.transformMetaDirectional(definition.meta, coordBaseMode); + if(definition.block instanceof BlockTorch) return INBTBlockTransformable.transformMetaTorch(definition.meta, coordBaseMode); + if(definition.block instanceof BlockButton) return INBTBlockTransformable.transformMetaTorch(definition.meta, coordBaseMode); + if(definition.block instanceof BlockDoor) return INBTBlockTransformable.transformMetaDoor(definition.meta, coordBaseMode); + if(definition.block instanceof BlockLever) return INBTBlockTransformable.transformMetaLever(definition.meta, coordBaseMode); + if(definition.block instanceof BlockSign) return INBTBlockTransformable.transformMetaDeco(definition.meta, coordBaseMode); + if(definition.block instanceof BlockLadder) return INBTBlockTransformable.transformMetaDeco(definition.meta, coordBaseMode); + if(definition.block instanceof BlockTripWireHook) return INBTBlockTransformable.transformMetaDirectional(definition.meta, coordBaseMode); + if(definition.block instanceof BlockVine) return INBTBlockTransformable.transformMetaVine(definition.meta, coordBaseMode); + if(definition.block instanceof BlockTrapDoor) return INBTBlockTransformable.transformMetaTrapdoor(definition.meta, coordBaseMode); return definition.meta; } - private int rotateX(int x, int z, int coordBaseMode) { + public int rotateX(int x, int z, int coordBaseMode) { switch(coordBaseMode) { case 1: return size.z - 1 - z; case 2: return size.x - 1 - x; @@ -591,7 +645,7 @@ public class NBTStructure { } } - private int rotateZ(int x, int z, int coordBaseMode) { + public int rotateZ(int x, int z, int coordBaseMode) { switch(coordBaseMode) { case 1: return x; case 2: return size.z - 1 - z; @@ -649,157 +703,11 @@ public class NBTStructure { } - public static class SpawnCondition { - - // If defined, will spawn a single jigsaw piece, for single nbt structures - public JigsawPiece structure; - - // If defined, will spawn in a non-nbt structure component - public Function, StructureStart> start; - - public Predicate canSpawn; - public int spawnWeight = 1; - - // Named jigsaw pools that are referenced within the structure - public Map pools; - public String startPool; - - // Maximum amount of components in this structure - public int sizeLimit = 8; - - // How far the structure can extend horizontally from the center, maximum of 128 - // This could be increased by changing GenStructure:range from 8, but this is already quite reasonably large - public int rangeLimit = 128; - - // Height modifiers, will clamp height that the start generates at, allowing for: - // * Submarines that must spawn under the ocean surface - // * Bunkers that sit underneath the ground - public int minHeight = 1; - public int maxHeight = 128; - - // Can this spawn in the current biome - protected boolean isValid(BiomeGenBase biome) { - if(canSpawn == null) return true; - return canSpawn.test(biome); - } - - protected JigsawPool getPool(String name) { - return pools.get(name).clone(); - } - - // Builds all of the pools into neat rows and columns, for editing and debugging! - // Make sure structure debug is enabled, or it will no-op - // Do not use in generation - public void buildAll(World world, int x, int y, int z) { - if(!StructureConfig.debugStructures) return; - - int padding = 5; - int oz = 0; - - for(JigsawPool pool : pools.values()) { - int highestWidth = 0; - int ox = 0; - - for(Pair entry : pool.pieces) { - NBTStructure structure = entry.key.structure; - structure.build(world, x + ox + (structure.size.x / 2), y, z + oz + (structure.size.z / 2)); - - ox += structure.size.x + padding; - highestWidth = Math.max(highestWidth, structure.size.z); - } - - oz += highestWidth + padding; - } - } - - } - - // A set of pieces with weights - public static class JigsawPool { - - // Weighted list of pieces to pick from - private List> pieces = new ArrayList<>(); - private int totalWeight = 0; - - public String fallback; - - private boolean isClone; - - public void add(JigsawPiece piece, int weight) { - if(weight <= 0) throw new IllegalStateException("JigsawPool spawn weight must be positive!"); - pieces.add(new Pair<>(piece, weight)); - totalWeight += weight; - } - - protected JigsawPool clone() { - JigsawPool clone = new JigsawPool(); - clone.pieces = new ArrayList<>(this.pieces); - clone.fallback = this.fallback; - clone.totalWeight = this.totalWeight; - clone.isClone = true; - - return clone; - } - - // If from a clone, will remove from the pool - public JigsawPiece get(Random rand) { - if(totalWeight <= 0) return null; - int weight = rand.nextInt(totalWeight); - - for(int i = 0; i < pieces.size(); i++) { - Pair pair = pieces.get(i); - weight -= pair.getValue(); - - if(weight < 0) { - if(isClone) { - pieces.remove(i); - totalWeight -= pair.getValue(); - } - - return pair.getKey(); - } - } - - return null; - } - - } - - // Assigned to a Component to build - public static class JigsawPiece { - - public final String name; - public final NBTStructure structure; - - // Block modifiers, for randomization and terrain matching - public Map blockTable; - public boolean conformToTerrain = false; // moves every single column to the terrain (digging out trenches, natural formations) - public boolean alignToTerrain = false; // aligns this component y-level individually, without moving individual columns (village houses) - public int heightOffset = 0; // individual offset for the structure - - public JigsawPiece(String name, NBTStructure structure) { - this(name, structure, 0); - } - - public JigsawPiece(String name, NBTStructure structure, int heightOffset) { - if(name == null) throw new IllegalStateException("A severe error has occurred in NBTStructure! A jigsaw piece has been registered without a valid name!"); - if(jigsawMap.containsKey(name)) throw new IllegalStateException("A severe error has occurred in NBTStructure! A jigsaw piece has been registered with the same name as another: " + name); - - this.name = name; - this.structure = structure; - jigsawMap.put(name, this); - - this.heightOffset = heightOffset; - } - - } - - // Each jigsaw block in a structure will instance one of these - private static class JigsawConnection { + public static class JigsawConnection { - private final ThreeInts pos; - private final ForgeDirection dir; + public final ThreeInts pos; + public final ForgeDirection dir; // what pool should we look through to find a connection private final String poolName; @@ -872,7 +780,7 @@ public class NBTStructure { // Save to NBT @Override protected void func_143012_a(NBTTagCompound nbt) { - nbt.setString("piece", piece.name); + nbt.setString("piece", piece != null ? piece.name : "NULL"); nbt.setInteger("min", minHeight); nbt.setInteger("max", maxHeight); nbt.setBoolean("hasHeight", heightUpdated); @@ -881,7 +789,7 @@ public class NBTStructure { // Load from NBT @Override protected void func_143011_b(NBTTagCompound nbt) { - piece = jigsawMap.get(nbt.getString("piece")); + piece = JigsawPiece.jigsawMap.get(nbt.getString("piece")); minHeight = nbt.getInteger("min"); maxHeight = nbt.getInteger("max"); heightUpdated = nbt.getBoolean("hasHeight"); @@ -895,14 +803,14 @@ public class NBTStructure { if(!piece.conformToTerrain && !heightUpdated) { int y = MathHelper.clamp_int(getAverageHeight(world, box) + piece.heightOffset, minHeight, maxHeight); - if(!piece.alignToTerrain && parent != null) { + if(!piece.alignToTerrain) { parent.offsetYHeight(y); } else { offsetYHeight(y); } } - return piece.structure.build(world, piece, boundingBox, box, coordBaseMode); + return piece.structure.build(world, piece, boundingBox, box, coordBaseMode, parent.name); } public void offsetYHeight(int y) { @@ -999,12 +907,16 @@ public class NBTStructure { public static class Start extends StructureStart { + public String name; + public Start() {} @SuppressWarnings("unchecked") public Start(World world, Random rand, SpawnCondition spawn, int chunkX, int chunkZ) { super(chunkX, chunkZ); + name = spawn.name; + int x = chunkX << 4; int z = chunkZ << 4; @@ -1055,6 +967,10 @@ public class NBTStructure { } JigsawPool nextPool = spawn.getPool(fromConnection.poolName); + if(nextPool == null) { + MainRegistry.logger.warn("[Jigsaw] Jigsaw block points to invalid pool: " + fromConnection.poolName); + continue; + } Component nextComponent = null; @@ -1085,7 +1001,7 @@ public class NBTStructure { } if(GeneralConfig.enableDebugMode) { - MainRegistry.logger.info("[Debug] Spawning NBT structure with " + components.size() + " piece(s) at: " + chunkX * 16 + ", " + chunkZ * 16); + MainRegistry.logger.info("[Debug] Spawning NBT structure " + name + " with " + components.size() + " piece(s) at: " + chunkX * 16 + ", " + chunkZ * 16); String componentList = "[Debug] Components: "; for(Object component : this.components) { componentList += ((Component) component).piece.structure.name + " "; @@ -1119,10 +1035,16 @@ public class NBTStructure { private Component buildNextComponent(Random rand, SpawnCondition spawn, JigsawPool pool, Component fromComponent, JigsawConnection fromConnection) { JigsawPiece nextPiece = pool.get(rand); - if(nextPiece == null) return null; + if(nextPiece == null) { + MainRegistry.logger.warn("[Jigsaw] Pool returned null piece: " + fromConnection.poolName); + return null; + } - List connectionPool = getConnectionPool(nextPiece, fromConnection); - if(connectionPool == null) return null; + List connectionPool = nextPiece.structure.getConnectionPool(fromConnection.dir, fromConnection.targetName); + if(connectionPool == null || connectionPool.isEmpty()) { + MainRegistry.logger.warn("[Jigsaw] No valid connections for: " + fromConnection.targetName + " - in piece: " + nextPiece.name); + return null; + } JigsawConnection toConnection = connectionPool.get(rand.nextInt(connectionPool.size())); @@ -1139,16 +1061,6 @@ public class NBTStructure { return new Component(spawn, nextPiece, rand, pos.getX() - ox, pos.getY() - oy, pos.getZ() - oz, nextCoordBase).connectedFrom(toConnection); } - private List getConnectionPool(JigsawPiece nextPiece, JigsawConnection fromConnection) { - if(fromConnection.dir == ForgeDirection.DOWN) { - return nextPiece.structure.toTopConnections.get(fromConnection.targetName); - } else if(fromConnection.dir == ForgeDirection.UP) { - return nextPiece.structure.toBottomConnections.get(fromConnection.targetName); - } - - return nextPiece.structure.toHorizontalConnections.get(fromConnection.targetName); - } - private int getDistanceTo(StructureBoundingBox box) { int x = box.getCenterX(); int z = box.getCenterZ(); @@ -1158,12 +1070,19 @@ public class NBTStructure { // post loading, update parent reference for loaded components @Override - public void func_143017_b(NBTTagCompound nbt) { + public void func_143017_b(NBTTagCompound nbt) { // readFromNBT + name = nbt.getString("name"); + for(Object o : components) { ((Component) o).parent = this; } } + @Override + public void func_143022_a(NBTTagCompound nbt) { // writeToNBT + nbt.setString("name", name); + } + public void offsetYHeight(int y) { for(Object o : components) { Component component = (Component) o; @@ -1192,7 +1111,42 @@ public class NBTStructure { @Override protected boolean canSpawnStructureAtCoords(int chunkX, int chunkZ) { - if(!weightedMap.containsKey(worldObj.provider.dimensionId)) return false; + nextSpawn = getSpawnAtCoords(chunkX, chunkZ); + return nextSpawn != null; + } + + public SpawnCondition getStructureAt(World world, int chunkX, int chunkZ) { + // make sure the random is in the correct state + this.worldObj = world; + this.rand.setSeed(world.getSeed()); + long l = this.rand.nextLong(); + long i1 = this.rand.nextLong(); + + long l1 = (long)chunkX * l; + long i2 = (long)chunkZ * i1; + this.rand.setSeed(l1 ^ i2 ^ world.getSeed()); + + // random nextInt call just before `canSpawnStructureAtCoords`, no, I don't know why Mojang added that + this.rand.nextInt(); + + return getSpawnAtCoords(chunkX, chunkZ); + } + + private SpawnCondition getSpawnAtCoords(int chunkX, int chunkZ) { + // attempt to spawn with custom chunk coordinate rules + if (customSpawnMap.containsKey(worldObj.provider.dimensionId)) { + WorldCoordinate coords = new WorldCoordinate(worldObj, new ChunkCoordIntPair(chunkX, chunkZ), rand); + + List spawnList = customSpawnMap.get(worldObj.provider.dimensionId); + for (SpawnCondition spawn : spawnList) { + if ((spawn.pools != null || spawn.structure != null) && spawn.checkCoordinates.test(coords)) { + return spawn; + } + } + } + + if (!weightedMap.containsKey(worldObj.provider.dimensionId)) + return null; int x = chunkX; int z = chunkZ; @@ -1208,15 +1162,16 @@ public class NBTStructure { x += rand.nextInt(StructureConfig.structureMaxChunks - StructureConfig.structureMinChunks); z += rand.nextInt(StructureConfig.structureMaxChunks - StructureConfig.structureMinChunks); - if(chunkX == x && chunkZ == z) { + if (chunkX == x && chunkZ == z) { BiomeGenBase biome = this.worldObj.getWorldChunkManager().getBiomeGenAt(chunkX * 16 + 8, chunkZ * 16 + 8); - nextSpawn = findSpawn(biome); + SpawnCondition spawn = findSpawn(biome); - return nextSpawn != null && (nextSpawn.pools != null || nextSpawn.start != null || nextSpawn.structure != null); + if(spawn != null && (spawn.pools != null || spawn.start != null || spawn.structure != null)) + return spawn; } - return false; + return null; } @Override diff --git a/src/main/java/com/hbm/world/gen/nbt/SpawnCondition.java b/src/main/java/com/hbm/world/gen/nbt/SpawnCondition.java new file mode 100644 index 000000000..f84d3aad8 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/nbt/SpawnCondition.java @@ -0,0 +1,115 @@ +package com.hbm.world.gen.nbt; + +import java.util.Map; +import java.util.Random; +import java.util.function.Function; +import java.util.function.Predicate; + +import com.hbm.config.StructureConfig; +import com.hbm.util.Tuple.Pair; +import com.hbm.util.Tuple.Quartet; + +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.gen.structure.StructureStart; + +public class SpawnCondition { + + public final String name; + + // If defined, will spawn a single jigsaw piece, for single nbt structures + public JigsawPiece structure; + + // If defined, will spawn in a non-nbt structure component + public Function, StructureStart> start; + + // If defined, will override regular spawn location checking, for placing at specific coordinates or with special rules + public Predicate checkCoordinates; + + // Our regular spawning mechanics, based on biome, you should generally use these + public Predicate canSpawn; + public int spawnWeight = 1; + + // Named jigsaw pools that are referenced within the structure + public Map pools; + public String startPool; + + // Maximum amount of components in this structure + public int sizeLimit = 8; + + // How far the structure can extend horizontally from the center, maximum of 128 + // This could be increased by changing GenStructure:range from 8, but this is already quite reasonably large + public int rangeLimit = 128; + + // Height modifiers, will clamp height that the start generates at, allowing for: + // * Submarines that must spawn under the ocean surface + // * Bunkers that sit underneath the ground + public int minHeight = 1; + public int maxHeight = 128; + + protected SpawnCondition(int weight, Predicate predicate) { + name = null; + spawnWeight = weight; + canSpawn = predicate; + } + + public SpawnCondition(String name) { + this.name = name; + } + + // Can this spawn in the current biome + protected boolean isValid(BiomeGenBase biome) { + if(canSpawn == null) return true; + return canSpawn.test(biome); + } + + public JigsawPool getPool(String name) { + JigsawPool pool = pools.get(name); + return pool != null ? pool.clone() : null; + } + + // Builds all of the pools into neat rows and columns, for editing and debugging! + // Make sure structure debug is enabled, or it will no-op + // Do not use in generation + public void buildAll(World world, int x, int y, int z) { + if(!StructureConfig.debugStructures) return; + + int padding = 5; + int oz = 0; + + for(JigsawPool pool : pools.values()) { + int highestWidth = 0; + int ox = 0; + + for(Pair entry : pool.pieces) { + NBTStructure structure = entry.key.structure; + structure.build(world, x + ox + (structure.size.x / 2), y, z + oz + (structure.size.z / 2)); + + ox += structure.size.x + padding; + highestWidth = Math.max(highestWidth, structure.size.z); + } + + oz += highestWidth + padding; + } + } + + /** + * Provides information about the current structure gen chunk, + * use the included random for consistent seeding! + */ + public static class WorldCoordinate { + + public final World world; + public final ChunkCoordIntPair coords; + public final Random rand; + + protected WorldCoordinate(World world, ChunkCoordIntPair coords, Random rand) { + this.world = world; + this.coords = coords; + this.rand = rand; + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java new file mode 100644 index 000000000..af2c41356 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java @@ -0,0 +1,268 @@ +package com.hbm.world.gen.util; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockSkeletonHolder; +import com.hbm.blocks.generic.LogicBlock; +import com.hbm.entity.item.EntityFallingBlockNT; +import com.hbm.entity.missile.EntityMissileTier2; +import com.hbm.entity.mob.EntityUndeadSoldier; +import com.hbm.items.ItemEnums; +import com.hbm.items.ModItems; +import com.hbm.tileentity.TileEntityDoorGeneric; +import com.hbm.tileentity.machine.storage.TileEntityCrateBase; +import com.hbm.util.ContaminationUtil; +import com.hbm.util.MobUtil; +import com.hbm.util.Vec3NT; +import com.hbm.world.WorldUtil; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.*; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.*; +import java.util.function.Consumer; + +public class LogicBlockActions { + + public static LinkedHashMap> actions = new LinkedHashMap<>(); + + public static Consumer PHASE_ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if (tile.phase == 1 || tile.phase == 2) { + tile.player = world.getClosestPlayer(x,y,z, 25); + if (tile.timer == 0) { + Vec3NT vec = new Vec3NT(20, 0, 0); + for (int i = 0; i < 10; i++) { + + if(vec.xCoord > 8) vec.xCoord += world.rand.nextInt(10) - 5; + + EntityUndeadSoldier mob = new EntityUndeadSoldier(world); + for (int j = 0; j < 7; j++) { + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue((int) (x + 0.5 + vec.xCoord),(int) (z + 0.5 + vec.zCoord)), z + 0.5 + vec.zCoord, i * 36F, 0); + if (mob.getCanSpawnHere()) { + mob.onSpawnWithEgg(null); + if(tile.player != null){ + mob.setTarget(tile.player); + } + world.spawnEntityInWorld(mob); + break; + } + } + vec.rotateAroundYDeg(36D); + } + } + } + if (tile.phase > 2) { + TileEntity te = world.getTileEntity(x, y + 18, z); + if (te instanceof BlockSkeletonHolder.TileEntitySkeletonHolder) { + BlockSkeletonHolder.TileEntitySkeletonHolder skeleton = (BlockSkeletonHolder.TileEntitySkeletonHolder) te; + if (world.rand.nextInt(5) == 0) { + skeleton.item = new ItemStack(ModItems.item_secret, 1, ItemEnums.EnumSecretType.ABERRATOR.ordinal()); + } else { + skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 1); + } + skeleton.markDirty(); + world.markBlockForUpdate(x, y + 18, z); + } + world.setBlock(x, y, z, Blocks.obsidian); + } + }; + + public static Consumer COLLAPSE_ROOF_RAD_5 = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase == 0) return; + + //from explosionChaos because i cannot be assed + int r = 4; + int r2 = r * r; + int r22 = r2 / 2; + + for (int xx = -r; xx < r; xx++) { + int X = xx + x; + int XX = xx * xx; + for (int yy = -r; yy < r; yy++) { + int Y = yy + y; + int YY = XX + yy * yy; + for (int zz = -r; zz < r; zz++) { + int Z = zz + z; + int ZZ = YY + zz * zz; + if (ZZ < r22) { + + if (world.getBlock(X, Y, Z).getExplosionResistance(null) <= 70) { + EntityFallingBlockNT entityfallingblock = new EntityFallingBlockNT(world, X + 0.5, Y + 0.5, Z + 0.5, world.getBlock(X, Y, Z), world.getBlockMetadata(X, Y, Z)); + world.spawnEntityInWorld(entityfallingblock); + } + } + } + } + } + world.setBlock(x, y, z, ModBlocks.block_steel); + + }; + + public static Consumer FODDER_WAVE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if (tile.phase == 1) { + Vec3NT vec = new Vec3NT(5, 0, 0); + for (int i = 0; i < 10; i++) { + EntityZombie mob = new EntityZombie(world); + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue(x,z), z + 0.5 + vec.zCoord, i * 36F, 0); + MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdv, new Random()); + world.spawnEntityInWorld(mob); + + vec.rotateAroundYDeg(36D); + } + world.setBlock(x, y, z, ModBlocks.block_steel); + } + }; + + public static Consumer PUZZLE_TEST = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase == 2){ + world.setBlock(x,y,z, ModBlocks.crate_steel); + + EntityLightningBolt blitz = new EntityLightningBolt(world, x, world.getHeightValue(x, z) + 2, z); + world.spawnEntityInWorld(blitz); + + TileEntityCrateBase crate = (TileEntityCrateBase) world.getTileEntity(x,y,z); + ((IInventory)crate).setInventorySlotContents(15, new ItemStack(ModItems.gun_bolter)); + } + }; + + public static Consumer MISSILE_STRIKE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase != 1) return; + + world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText(EnumChatFormatting.LIGHT_PURPLE + "[COMMAND UNIT]"+ EnumChatFormatting.RESET + " Missile Fired")); + + ForgeDirection parallel = tile.direction.getRotation(ForgeDirection.UP); + + EntityMissileTier2.EntityMissileStrong missile = + new EntityMissileTier2.EntityMissileStrong( + world, + x + tile.direction.offsetX * 300, + 200, + z + tile.direction.offsetZ * 300, + x + parallel.offsetX * 30 + tile.direction.offsetX * 30, + z + parallel.offsetZ * 30 + tile.direction.offsetZ * 30); + WorldUtil.loadAndSpawnEntityInWorld(missile); + + world.setBlock(x,y,z, ModBlocks.block_electrical_scrap); + }; + + public static Consumer RAD_CONTAINMENT_SYSTEM = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + ForgeDirection direction = tile.direction.getOpposite(); + ForgeDirection rot = direction.getRotation(ForgeDirection.UP); + + AxisAlignedBB bb = AxisAlignedBB.getBoundingBox(x - rot.offsetX, y - 1, z - rot.offsetZ, x + rot.offsetX + direction.offsetX * 15, y + 1, z + rot.offsetZ + direction.offsetZ * 15).expand(2,2,2); + + List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, bb); + + for(EntityLivingBase e : entities) { + + Vec3 vec = Vec3.createVectorHelper(e.posX - (x + 0.5), (e.posY + e.getEyeHeight()) - (y + 0.5), e.posZ - (z + 0.5)); + double len = vec.lengthVector(); + vec = vec.normalize(); + + len = Math.max(len,1D); + + float res = 0; + + for(int i = 1; i < len; i++) { + + int ix = (int)Math.floor(x + 0.5 + vec.xCoord * i); + int iy = (int)Math.floor(y + 0.5 + vec.yCoord * i); + int iz = (int)Math.floor(z + 0.5 + vec.zCoord * i); + + res += world.getBlock(ix, iy, iz).getExplosionResistance(null); + } + + if(res < 1) + res = 1; + + float eRads = 100F; + eRads /= (float)res; + eRads /= (float)(len * len); + + ContaminationUtil.contaminate(e, ContaminationUtil.HazardType.RADIATION, ContaminationUtil.ContaminationType.HAZMAT2, eRads); + } + + if (tile.phase == 2 && tile.timer > 40){ + world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText( + EnumChatFormatting.LIGHT_PURPLE + "[RAD CONTAINMENT SYSTEM]" + + EnumChatFormatting.RESET + " Diagnostics found containment failure, commencing lockdown")); + + for(int i = 1; i < 20; i++) { + int checkX, checkY, checkZ; + checkX = x + direction.offsetX * i; + checkY = y + 1; + checkZ = z + direction.offsetZ * i; + Block block = world.getBlock(checkX, checkY,checkZ); + TileEntity te = null; + if(block instanceof BlockDummyable){ + int[] coreCoords = ((BlockDummyable) block).findCore(world,checkX,checkY,checkZ); + te = world.getTileEntity(coreCoords[0], coreCoords[1], coreCoords[2]); + } + + if (te instanceof TileEntityDoorGeneric) { + TileEntityDoorGeneric door = (TileEntityDoorGeneric) te; + door.setPins(456); + door.close(); + door.lock(); + break; + } + } + + tile.phase = 3; + } + }; + + public static List getActionNames(){ + return new ArrayList<>(actions.keySet()); + } + + //register new actions here + static{ + //example actions + actions.put("FODDER_WAVE", FODDER_WAVE); + actions.put("ABERRATOR", PHASE_ABERRATOR); + actions.put("COLLAPSE_ROOF_RAD_5", COLLAPSE_ROOF_RAD_5); + actions.put("PUZZLE_TEST", PUZZLE_TEST); + actions.put("MISSILE_STRIKE", MISSILE_STRIKE); + actions.put("IRRADIATE_ENTITIES_AOE", RAD_CONTAINMENT_SYSTEM); + } + + + +} diff --git a/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java new file mode 100644 index 000000000..b51b96c23 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java @@ -0,0 +1,97 @@ +package com.hbm.world.gen.util; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockPedestal; +import com.hbm.blocks.generic.LogicBlock; +import com.hbm.entity.mob.EntityUndeadSoldier; +import com.hbm.items.ModItems; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.function.Function; + +public class LogicBlockConditions { + + public static LinkedHashMap> conditions = new LinkedHashMap<>(); + + /**For use with interactions, for having them handle all conditional tasks*/ + public static Function EMPTY = (tile) -> false; + + public static Function ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + if(world.difficultySetting.ordinal() == 0) return false; + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + boolean aoeCheck = !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(10, 10, 10)).isEmpty(); + if(tile.phase == 0) { + if(world.getTotalWorldTime() % 20 != 0) return false; + return aoeCheck; + } + if(tile.phase < 3) { + if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; + return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty() && aoeCheck; + } + return false; + }; + + public static Function PLAYER_CUBE_5 = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(5, 5, 5)).isEmpty(); + }; + + public static Function REDSTONE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + return world.isBlockIndirectlyGettingPowered(x,y,z); + }; + + public static Function PUZZLE_TEST = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase == 0 && world.isBlockIndirectlyGettingPowered(x,y,z)){ + world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText("Find a " + EnumChatFormatting.GOLD + "great" + EnumChatFormatting.RESET + " ancient weapon, of questionable use in the modern age")); + world.setBlock(x,y + 1,z, ModBlocks.pedestal); + return true; + } + + TileEntity pedestal = world.getTileEntity(x,y + 1,z); + + return tile.phase == 1 + && pedestal instanceof BlockPedestal.TileEntityPedestal + && ((BlockPedestal.TileEntityPedestal) pedestal).item != null + && ((BlockPedestal.TileEntityPedestal) pedestal).item.getItem() == ModItems.big_sword; + }; + + public static List getConditionNames(){ + return new ArrayList<>(conditions.keySet()); + } + + //register new conditions here + static { + //example conditions + conditions.put("EMPTY", EMPTY); + conditions.put("ABERRATOR", ABERRATOR); + conditions.put("PLAYER_CUBE_5", PLAYER_CUBE_5); + conditions.put("REDSTONE", REDSTONE); + conditions.put("PUZZLE_TEST", PUZZLE_TEST); + } + +} diff --git a/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java new file mode 100644 index 000000000..b9ee4dde1 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java @@ -0,0 +1,65 @@ +package com.hbm.world.gen.util; + +import com.hbm.blocks.generic.LogicBlock; +import com.hbm.items.ModItems; +import com.hbm.potion.HbmPotion; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.function.Consumer; + +/**Interactions are called when the player right-clicks the block**/ +public class LogicBlockInteractions { + + /**Consumer consists of world instance, tile entity instance, three ints for coordinates, one int for block side, and player instance, + * in that order **/ + public static LinkedHashMap> interactions = new LinkedHashMap<>(); + + public static Consumer TEST = (array) -> { + LogicBlock.TileEntityLogicBlock logic = (LogicBlock.TileEntityLogicBlock) array[1]; + EntityPlayer player = (EntityPlayer) array[5]; + + if(logic.phase > 1) return; + + if(player.getHeldItem() != null) + player.getHeldItem().stackSize--; + + logic.phase++; + }; + + public static Consumer RAD_CONTAINMENT_SYSTEM = (array) -> { + LogicBlock.TileEntityLogicBlock logic = (LogicBlock.TileEntityLogicBlock) array[1]; + EntityPlayer player = (EntityPlayer) array[5]; + + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.key){ + player.getHeldItem().stackSize--; + player.addChatMessage(new ChatComponentText( + EnumChatFormatting.LIGHT_PURPLE + "[RAD CONTAINMENT SYSTEM]" + + EnumChatFormatting.RESET + " Radiation treatment administered")); + player.addPotionEffect(new PotionEffect(HbmPotion.radaway.getId(), 3 * 60 * 20, 4)); + player.addPotionEffect(new PotionEffect(HbmPotion.radx.getId(), 3 * 60 * 20, 4)); + logic.phase = 2; + logic.timer = 0; + } + }; + + + + public static List getInteractionNames(){ + return new ArrayList<>(interactions.keySet()); + } + + //register new interactions here + static{ + interactions.put("TEST", TEST); + interactions.put("RADAWAY_INJECTOR", RAD_CONTAINMENT_SYSTEM); + } + + + +} diff --git a/src/main/resources/META-INF/HBM_at.cfg b/src/main/resources/META-INF/HBM_at.cfg index 28454115f..859de4618 100644 --- a/src/main/resources/META-INF/HBM_at.cfg +++ b/src/main/resources/META-INF/HBM_at.cfg @@ -50,4 +50,10 @@ public net.minecraft.client.resources.AbstractResourcePack field_110597_b # re public net.minecraft.inventory.Container * # fucking everything i hate this class # GuiIngame -public net.minecraft.client.gui.GuiIngame field_92016_l # highlightingItemStack \ No newline at end of file +public net.minecraft.client.gui.GuiIngame field_92016_l # highlightingItemStack + +# Block +public net.minecraft.block.Block func_149642_a(Lnet/minecraft/world/World;IIILnet/minecraft/item/ItemStack;)V # dropBlockAsItem + +# Minecraft +public net.minecraft.client.Minecraft field_71425_J # running diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 7b00fdbe6..b59ad8b12 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -129,6 +129,14 @@ armorMod.type.leggings=Beinschienen armorMod.type.servo=Servos armorMod.type.special=Spezial +autoswitch=Teil der Rezeptgruppe "%s"$Rezept ändert sich basierend auf das erste Item +autoswitch.plate=Wiederanreicherung Plattenbrennstoff +autoswitch.plates=Metallplatten +autoswitch.pwr=Wiederanreicherung PWR-Brennstoff +autoswitch.schrab=Schrabidium-Extraktion +autoswitch.watz=Wiederanreicherung Watzpellet +autoswitch.zirnox=Wiederanreicherung ZIRNOX-Brennstoff + bomb.detonated=Erfolgreich gezündet! bomb.incompatible=Gerät kann nicht ausgelöst werden! bomb.launched=Erfolgreich gestartet! @@ -371,6 +379,7 @@ container.leadBox=Sicherheitsbehälter container.machineAmmoPress=Munitionspresse container.machineArcWelder=Lichtbogenschweißer container.machineArcFurnaceLarge=Lichtbogenofen +container.machineAssemblyMachine=Montagemaschine container.machineBoiler=Ölwärmer container.machineChemicalFactory=Chemiefabrik container.machineChemicalPlant=Chemiewerk @@ -391,6 +400,7 @@ container.machineLargeTurbine=Industrielle Dampfturbine container.machineLiquefactor=Verflüssiger container.machineMixer=Industrieller Mixer container.machineOreSlopper=B.E.M. +container.machinePUREX=PUREX container.machinePyroOven=Pyrolyseofen container.machineRefinery=Ölraffinerie container.machineRotaryFurnace=Rotationshochofen @@ -436,6 +446,7 @@ container.radGen=Strahlenbetriebener Generator container.radar=Radar container.radiobox=UKW-Sender container.radiorec=UKW Radio +container.rbmkAutoloader=RBMK-Ladeautomat container.rbmkBoiler=RBMK Dampfkanal container.rbmkControl=RBMK Steuerstäbe container.rbmkControlAuto=RBMK Automatische Steuerstäbe @@ -448,6 +459,7 @@ container.reactor=Brutreaktor container.reactorControl=Reaktorfernsteuerung container.reactorLarge=Großer Atomreaktor container.reactorSmall=Atomreaktor +container.rebar=Armiereisen-Platzierer container.reix=Rei-X Hauptrechner container.rtg=Radioisotopengenerator container.rtgFurnace=RTG-Ofen @@ -509,7 +521,7 @@ damage.item=Resistenz wenn getragen: damage.category.EN=Energie damage.category.EXPL=Explosion damage.category.FIRE=Feuer -damage.category.PROJ=Projektil +damage.category.PHYS=Physisch damage.exact.drown=Ertrinken damage.exact.fall=Fallschaden damage.exact.LASER=Laser @@ -751,6 +763,7 @@ hbmfluid.coalgas=Kohlebenzin hbmfluid.coalgas_leaded=Bleikohlebenzin hbmfluid.colloid=Kolloid hbmfluid.coaloil=Kohleöl +hbmfluid.concrete=Nassbeton hbmfluid.coolant=Kühlflüssigkeit hbmfluid.coolant_hot=Heiße Kühlflüssigkeit hbmfluid.crackoil=Crack-Öl @@ -1080,6 +1093,7 @@ item.ammo_secret.folly_sm.name=Silberne Kugel item.ammo_secret.g12_equestrian.name=Kaliber 12 Gleisnägel item.ammo_secret.m44_equestrian.name=.44 Magnum Schädelsprenger item.ammo_secret.p35_800.name=.35-800 V9 +item.ammo_secret.p35_800_bl.name=.35-800 V9 (Schwarzer Blitz) item.ammo_standard.b75.name=.75 Bolzen item.ammo_standard.b75_exp.name=.75 Bolzen (Explosiv) item.ammo_standard.b75_inc.name=.75 Bolzen (Brand) @@ -1415,6 +1429,8 @@ item.blades_schrabidium.name=Schrabidiumsägeblatt item.blades_steel.name=Stahlsägeblatt item.blades_titanium.name=Titansägeblatt item.blowtorch.name=Lötlampe +item.blueprint_folder.name=Blaupausenbuch +item.blueprints.name=Blaupausen item.board_copper.name=Kupfertafel item.boat_rubber.name=Schlauchboot item.bobmazon.name=Bobmazon @@ -1614,6 +1630,7 @@ item.chopper_torso.name=Jagdschrauber Rumpf item.chopper_wing.name=Jagdschrauber Seitentragfläche item.chunk_ore.cryolite.name=Kryolithbrocken item.chunk_ore.malachite.name=Malachitbrocken +item.chunk_ore.moonstone.name=Mondstein item.chunk_ore.rare.name=Seltenerdenerz-Brocken item.cigarette.name=FFI-Markenzigarette item.cinnebar.name=Zinnober @@ -1962,7 +1979,7 @@ item.fleija_igniter.name=Impulszünder item.fleija_kit.name=F.L.E.I.J.A. Kit item.fleija_propellant.name=Schrabidiumtreibladung item.fluid_barrel_empty.name=Leeres Fass -item.fluid_barrel_full.name=Flüssigkeitsfass: +item.fluid_barrel_full.name=Flüssigkeitsfass: %s item.fluid_barrel_infinite.name=Unendliches Fass item.fluid_duct.name=Flüssigkeitsrohr: item.fluid_identifier.name=Flüssigkeits-Kennzeichnung @@ -1973,10 +1990,12 @@ item.fluid_identifier.usage2=einer maximalen Reichweite von 64 Rohren zuzuweisen item.fluid_identifier_multi.name=Multi-Flüssigkeits-Kennzeichnung item.fluid_identifier_multi.info=Universelle Flüssigkeits-Kennzeichnung für: item.fluid_identifier_multi.info2=Sekundärer Typ: +item.fluid_pack_empty.name=Großer Flüssigkeitsbehälter +item.fluid_pack_full.name=%s (Abgepackt) item.fluid_tank_empty.name=Leere universelle Flüssigkeitszelle -item.fluid_tank_full.name=Universelle Flüssigkeitszelle: +item.fluid_tank_full.name=Universelle Flüssigkeitszelle: %s item.fluid_tank_lead_empty.name=Leere Gefahrenstoffzelle -item.fluid_tank_lead_full.name=Gefahrenstoffzelle: +item.fluid_tank_lead_full.name=Gefahrenstoffzelle: %s item.fluorite.name=Fluorit item.flywheel_beryllium.name=Berylliumschwungscheibe item.fmn.name=Flunitrazepamtablette @@ -2092,6 +2111,7 @@ item.gun_amat.name=Panzerbüchse item.gun_amat_penance.name=Penance item.gun_amat_subtlety.name=Subtlety item.gun_autoshotgun.name=Auto-Flinte +item.gun_autoshotgun_heretic.name=The Heretic item.gun_autoshotgun_sexy.name=Sexy item.gun_autoshotgun_shredder.name=Shredder item.gun_b92.name=§9B92 Energiepistole§r @@ -2147,6 +2167,7 @@ item.gun_minigun.name=Minigun item.gun_minigun_dual.name=Doppelete Miniguns item.gun_minigun_lacunae.name=Lacunae item.gun_missile_launcher.name=Raketenwerfer +item.gun_n_i_4_n_i.name=N I 4 N I item.gun_pepperbox.name=Bündelrevolver item.gun_panzerschreck.name=Panzerschreck item.gun_quadro.name=Vierfachraketenwerfer @@ -2341,6 +2362,13 @@ item.insert_polonium.name=Poloniumeinlage item.insert_steel.name=Schwere Stahleinlage item.insert_xsapi.name=XSAPI-Einlage item.insert_yharonite.name=Yharoniteinlage +item.item_expensive.bronze_tubes.name=Bronze-Strukturelement +item.item_expensive.circuit.name=Umfangreiche Platine +item.item_expensive.computer.name=Großrechner +item.item_expensive.ferro_plating.name=Verstärkte Ferrouraniumpanele +item.item_expensive.heavy_frame.name=Schweres Gestell +item.item_expensive.lead_plating.name=Strahlenresistente Plattierung +item.item_expensive.steel_plating.name=Gebolzte Stahlplatten item.item_secret.aberrator.name=Aberrator-Teil item.item_secret.canister.name=Komposit SB-26 item.item_secret.controller.name=Proprietäre Steuereinheit @@ -3039,6 +3067,7 @@ item.radx.name=Rad-X item.rag.name=Stoff item.rag_damp.name=Nasser Stoff item.rag_piss.name=Pisslappen +item.rangefinder.name=Entfernungsmessgerät item.rbmk_fuel_balefire.name=Balefire-RBMK-Kernbrennstoff item.rbmk_fuel_balefire_gold.name=Flammgold-RBMK-Kernbrennstoff item.rbmk_fuel_drx.name=§cDigamma-RBMK-Kernbrennstoff @@ -3109,6 +3138,7 @@ item.rbmk_tool.set=RBMK verlinkt! item.reacher.name=Wolfram-Greifzange item.reactor_core.name=Brutreaktorkern item.reactor_sensor.name=Reaktor-Fernsensor +item.rebar_placer.name=Armiereisen-Platzierer item.record.glass.desc=? ? ? item.record.lc.desc=Valve - Diabolic Adrenaline Guitar/Lambda Core item.record.ss.desc=Valve - Sector Sweep @@ -3690,6 +3720,11 @@ potion.hbm_stability=Stabilität potion.hbm_taint=Verdorben potion.hbm_telekinesis=! ! ! +purex.recycle=Wiederanreicherung von %s +purex.schrab=Schrabidium extrahieren aus %s + +qmaw.tab=[ Drücke %s für Hilfe ] + radar.clearMap=Karte zurücksetzen radar.detectMissiles=Raketen erkennen radar.detectPlayers=Spieler erkennen @@ -4022,6 +4057,7 @@ tile.concrete_colored_ext.pink.name=Builder's Choice Concrete - Männliches Pink tile.concrete_colored_ext.purple.name=Builder's Choice Concrete - Mysteriöses Lila tile.concrete_colored_ext.sand.name=Builder's Choice Concrete - Wüstensturm tile.concrete_pillar.name=Stahlbetonsäule +tile.concrete_rebar.name=Stahlbeton tile.concrete_slab.asphalt.name=Asphaltstufe tile.concrete_slab.concrete.name=Betonfliesenstufe tile.concrete_slab.concrete_asbestos.name=Asbestbetonstufe @@ -4184,6 +4220,7 @@ tile.floodlight.name=Elektrischer Scheinwerfer tile.fluid_duct.name=Universelles Flüssigkeitsrohr (Veraltet) tile.fluid_duct_box.name=Universelles Flüssigkeitsrohr (Boxrohr) tile.fluid_duct_exhaust.name=Abgasrohr +tile.fluid_duct_paintable_block_exhaust.name=Geschirmtes Abgasrohr (Färbbar) tile.fluid_duct_gauge.name=Flussmessrohr tile.fluid_duct_gauge.desc=Rohr welches anzeight, wie viel Flüssigkeit$sich pro Tick im Netzwerk bewegt.$Geteilte Netzwerke die über Fässer oder Tanks$verbunden sind, werden als ein einzelnes gezählt. tile.fluid_duct_neo.name=Universelles Flüssigkeitsrohr @@ -4319,6 +4356,7 @@ tile.ladder_steel.name=Stahlleiter tile.ladder_sturdy.name=Feste Holzleiter tile.ladder_titanium.name=Titanleiter tile.ladder_tungsten.name=Wolframleiter +tile.trapdoor_steel.name=Stahl-Falltür tile.lamp_demon.name=Dämonenkernlampe tile.lamp_tritium_blue_off.name=Blaue Tritiumlampe tile.lamp_tritium_blue_on.name=Blaue Tritiumlampe @@ -4341,8 +4379,9 @@ tile.machine_arc_welder.name=Lichtbogenschweißer tile.machine_armor_table.name=Rüstungsmodifikationstisch tile.machine_ashpit.name=Aschekasten tile.machine_ashpit.desc=Sammelt Asche von Feuerbüchsen und Heizöfen -tile.machine_assembler.name=Fertigungsmaschine +tile.machine_assembler.name=Fertigungsmaschine (Legacy) tile.machine_assemfac.name=Fertigungsfabrik +tile.machine_assembly_machine.name=Montagemaschine tile.machine_autocrafter.name=Automatische Werkbank tile.machine_autosaw.name=Automatische Kreissäge tile.machine_autosaw.desc=Schneidet Pflanzen nieder, pflanzt Bäume nach$Akzeptiert:$-Holzöl$-Ethanol$-Fischöl$-Schweröl @@ -4435,6 +4474,8 @@ tile.machine_powerrtg.name=PT-Isotopenzelle tile.machine_press.name=Befeuerte Presse tile.machine_puf6_tank.name=Plutoniumhexafluorid-Tank tile.machine_pumpjack.name=Pferdekopfpumpe +tile.machine_purex.name=PUREX +tile.machine_purex.desc=Wiederaufbereitungsmaschine für Kernbrennstoff.$Die meisten Rezepte benötigen Kerosin und Salpetersäure. tile.machine_pyrooven.name=Pyrolyseofen tile.machine_radar.name=Radar tile.machine_radar_large.name=Großes Radar @@ -4651,6 +4692,7 @@ tile.plasma_heater.name=Plasmaerhitzer tile.plushie.name=%s Plüschfigur tile.pneumatic_tube.name=Rohrpost tile.pneumatic_tube.desc=Sendted Items mit Druckluft.$Rechtsklick mit Schraubenzieher aktiviert den Eingang.$Shift-Rechtskick mit Schrabuenzieher aktiviert den Ausgang.$Eingänge können konfiguriert und mit Druckluft verbunden werden.$Sendet bis zu einem Stack, vier Mal pro Sekunde. +tile.pneumatic_tube_paintable.name=Geschirmte Rohrpost (Färbbar) tile.pole_satellite_receiver.name=Satellitenschüssel tile.pole_top.name=Antennenspitze tile.press_preheater.name=Presse-Vorheizer @@ -4713,6 +4755,7 @@ tile.rail_large_switch.name=Normalspur-Weiche (15m, Links) tile.rail_large_switch_flipped.name=Normalspur-Weiche (15m, Rechts) tile.rail_wood.name=Holzschienen tile.rbmk_absorber.name=RBMK Bor-Neutronenabsorber +tile.rbmk_autoloader.name=RBMK-Ladeautomat tile.rbmk_blank.name=RBMK Strukturteil tile.rbmk_boiler.name=RBMK Dampfkanal tile.rbmk_cooler.name=RBMK Kühler @@ -4741,6 +4784,7 @@ tile.reactor_ejector.name=Reaktor-Brennstoffauswurf tile.reactor_element.name=Reaktorkammer tile.reactor_hatch.name=Kraftwerkszugriffsluke tile.reactor_inserter.name=Reaktor-Brennstoffeinlass +tile.rebar.name=Armierungseisen tile.red_barrel.name=Explosives Fass tile.red_cable.name=Rotes Kupferkabel tile.red_cable_classic.name=Rotes Kupferkabel (Klassisch) @@ -4980,6 +5024,7 @@ tool.ability.cnetrifuge=Auto-Zentrifuge tool.ability.crystallizer=Auto-Kristallisierer tool.ability.explosion=Explosion tool.ability.hammer=AoE +tool.ability.hammer_flat=Flacher AoE tool.ability.luck=Glück tool.ability.mercury=Quecksilber-Berührung tool.ability.midas=Midas' Hand @@ -5022,4 +5067,4 @@ weapon.ability.fire=Flammend weapon.ability.radiation=Radioaktive Schneide weapon.ability.phosphorus=Phosphorspitze weapon.ability.stun=Betäubend -weapon.ability.vampire=Vampir \ No newline at end of file +weapon.ability.vampire=Vampir diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 8e915f009..76c36d64d 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -184,6 +184,14 @@ armorMod.type.leggings=Leggings armorMod.type.servo=Servos armorMod.type.special=Special +autoswitch=Part of auto switch group "%s"$Recipe changes based on first ingredient +autoswitch.plate=Reprocessing Plate Fuel +autoswitch.plates=Metal Plates +autoswitch.pwr=Reprocessing PWR Fuel +autoswitch.schrab=Schrabidium Extraction +autoswitch.watz=Reprocessing Watz Pellet +autoswitch.zirnox=Reprocessing ZIRNOX Fuel + battery.mode.buffer=Input/Output Mode battery.mode.input=Input Mode battery.mode.off=OffW @@ -697,6 +705,10 @@ commands.satellite.satellite_descended=Satellite successfully descended. commands.satellite.satellite_orbited=Satellite launched. commands.satellite.should_be_run_as_player=This command should be run by a player! +commands.locate.no_match=No structures with that name! +commands.locate.none_found=No structures found nearby! +commands.locate.success.coordinates=Structure %s found at %d, %d + container.ammoBag=Ammo Bag container.amsBase=AMS Base (Deco) container.amsEmitter=AMS Emitter (Deco) @@ -773,6 +785,7 @@ container.leadBox=Containment Box container.machineAmmoPress=Ammo Press container.machineArcWelder=Arc Welder container.machineArcFurnaceLarge=Arc Furnace +container.machineAssemblyMachine=Assembly Machine container.machineBoiler=Oil Heater container.machineChemicalFactory=Chemical Factory container.machineChemicalPlant=Chemical Plant @@ -793,6 +806,7 @@ container.machineLargeTurbine=Industrial Steam Turbine container.machineLiquefactor=Liquefactor container.machineMixer=Industrial Mixer container.machineOreSlopper=B.O.P. +container.machinePUREX=PUREX container.machinePyroOven=Pyrolysis Oven container.machineRefinery=Oil Refinery container.machineRotaryFurnace=Rotary Furnace @@ -840,6 +854,7 @@ container.radar=Radar container.radiobox=FM Transmitter container.radiolysis=RTG and Radiolysis Chamber container.radiorec=FM Radio +container.rbmkAutoloader=RBMK Autoloader container.rbmkBoiler=RBMK Steam Channel container.rbmkControl=RBMK Control Rods container.rbmkControlAuto=RBMK Automatic Control Rods @@ -852,6 +867,7 @@ container.reactorBreeding=Breeding Reactor container.reactorControl=Reactor Remote Control Block container.reactorLarge=Big Nuclear Reactor container.reactorResearch=Research Reactor +container.rebar=Rebar Placer container.reix=Rei-X Mainframe container.rtg=RT Generator container.rtgFurnace=RTG Furnace @@ -925,7 +941,7 @@ damage.item=Resistances when worn: damage.category.EN=Energy damage.category.EXPL=Explosion damage.category.FIRE=Fire -damage.category.PROJ=Projectile +damage.category.PHYS=Physical damage.exact.drown=Drowning damage.exact.fall=Fall damage damage.exact.LASER=Laser @@ -1033,7 +1049,7 @@ desc.gui.rtg.pellets=Accepted Pellets: desc.gui.rtg.pelletHeat=%s (%s heat) desc.gui.rtg.pelletPower=%s (%s HE/tick) desc.gui.template=§9Templates§r$Templates can be made by$using the Machine Template Folder. -desc.gui.turbinegas.automode=§2Automatic Turbine Throttling Mode§r$By clicking the "AUTO" button, the turbine$will automatically adjust the power production$based on the power required from the network +desc.gui.turbinegas.automode=§2Automatic turbine throttling mode§r$By clicking the "AUTO" button, the turbine$will automatically adjust the throttle position$based on the power required from the network$and the fuel level in the internal tank desc.gui.turbinegas.fuels=§6Accepted fuels:§r desc.gui.turbinegas.warning=§cFuel or lubricant level low!§r desc.gui.zirnox.coolant=§3Coolant§r$CO2 transfers heat from the core to the water.$This will boil it into super dense steam.$The efficiency of cooling and steam production$is based on pressure. @@ -1214,6 +1230,8 @@ entity.hbm.entity_bullet.name=Bullet entity.hbm.entity_rocket.name=Rocket entity.hbm.entity_schrabnel.name=Schrabnel +error.generic=### I AM ERROR ### + excavator.crusher=Toggle Crusher excavator.drill=Toggle Drill excavator.silktouch=Toggle Silk Touch @@ -1243,6 +1261,28 @@ geiger.playerRes=Player resistance: geiger.title=GEIGER COUNTER geiger.title.dosimeter=DOSIMETER +general.na=N/A + +gui.recipe.duration=Duration +gui.recipe.consumption=Consumption +gui.recipe.input=Input +gui.recipe.output=Output +gui.recipe.atPressure=at +gui.recipe.setRecipe=Click to set recipe + +gui.weapon.ammo=Ammo +gui.weapon.baseDamage=Base Damage +gui.weapon.damageWithAmmo=Damage with current ammo +gui.weapon.condition=Condition +gui.weapon.accepts=Accepts +gui.weapon.quality.aside=Standard Arsenal +gui.weapon.quality.bside=B-Side +gui.weapon.quality.legendary=Legendary Weapon +gui.weapon.quality.special=Special Weapon +gui.weapon.quality.utility=Utility +gui.weapon.quality.secret=SECRET +gui.weapon.quality.debug=DEBUG + gun.make.ARMALITE=Armalite gun.make.AUTO_ORDINANCE=Auto-Ordnance Corporation gun.make.BAE=BAE Systems plc @@ -1460,6 +1500,7 @@ hbmfluid.coalgas=Coal Gasoline hbmfluid.coalgas_leaded=Leaded Coal Gasoline hbmfluid.coaloil=Coal Oil hbmfluid.colloid=Colloid +hbmfluid.concrete=Liquid Concrete hbmfluid.coolant=Coolant hbmfluid.coolant_hot=Hot Coolant hbmfluid.crackoil=Cracked Oil @@ -1805,6 +1846,7 @@ item.ammo_secret.folly_sm.name=Silver Bullet item.ammo_secret.g12_equestrian.name=12 Gauge Railway Spike Shot item.ammo_secret.m44_equestrian.name=.44 Magnum Head-Exploder item.ammo_secret.p35_800.name=.35-800 V9 +item.ammo_secret.p35_800_bl.name=.35-800 V9 (Black Lightning) item.ammo_standard.b75.name=.75 Bolt item.ammo_standard.b75_exp.name=.75 Bolt (Explosive) item.ammo_standard.b75_inc.name=.75 Bolt (Incendiary) @@ -2159,6 +2201,8 @@ item.blades_desh.name=Desh Shredder Blades item.blades_steel.name=Steel Shredder Blades item.blades_titanium.name=Titanium Shredder Blades item.blowtorch.name=Blowtorch +item.blueprint_folder.name=Blueprint Booklet +item.blueprints.name=Blueprints item.board_copper.name=Copper Panel item.boat_rubber.name=Rubber Boat item.bobmazon.name=Bobmazon @@ -2173,6 +2217,7 @@ item.bolt_spike.name=Railroad Spike item.bolt_spike.desc=Radiates a threatening aura, somehow item.boltgun.name=Pneumatic Rivet Gun item.bomb_caller.name=Airstrike Designator +item.bomb_part.used_in=Used in: item.bomb_waffle.name=Waffle of Mass Destruction item.book_guide.name=Guide Book item.book_of_.name=The Book of Boxcars @@ -2354,6 +2399,7 @@ item.centrifuge_tower.name=Centrifuge Tower item.chainsaw.name=Chainsaw item.cheese.name=Cheese item.cheese_quesadilla.name=Cheese Quesadilla +item.cheese_quesadilla.desc=That's what a 50 year old yeast infection does to you. item.chemical_dye.black.name=Chemical Dye (Black) item.chemical_dye.blue.name=Chemical Dye (Blue) item.chemical_dye.brown.name=Chemical Dye (Brown) @@ -2389,6 +2435,7 @@ item.chopper_torso.name=Hunter Chopper Body item.chopper_wing.name=Hunter Chopper Wing item.chunk_ore.malachite.name=Malachite Chunk item.chunk_ore.rare.name=Rare Earth Ore Chunk +item.chunk_ore.moonstone.name=Moonstone item.chunk_ore.cryolite.name=Cryolite Chunk item.cigarette.name=FFI-Brand Cigarette item.cinnebar.name=Cinnabar @@ -2768,7 +2815,7 @@ item.fleija_igniter.name=Pulse Igniter item.fleija_kit.name=F.L.E.I.J.A. Kit item.fleija_propellant.name=Schrabidium Propellant item.fluid_barrel_empty.name=Empty Fluid Barrel -item.fluid_barrel_full.name=Fluid Barrel: +item.fluid_barrel_full.name=Fluid Barrel: %s item.fluid_barrel_infinite.name=Infinite Fluid Barrel item.fluid_duct.name=Fluid Duct: item.fluid_identifier.name=Fluid Identifier @@ -2779,10 +2826,12 @@ item.fluid_identifier.usage2=up to a maximum range of 64 ducts. item.fluid_identifier_multi.name=Multi Fluid Identifier item.fluid_identifier_multi.info=Universal fluid identifier for: item.fluid_identifier_multi.info2=Secondary type: +item.fluid_pack_empty.name=Large Fluid Container +item.fluid_pack_full.name=Packaged %s item.fluid_tank_empty.name=Empty Universal Fluid Tank -item.fluid_tank_full.name=Universal Fluid Tank: +item.fluid_tank_full.name=Universal Fluid Tank: %s item.fluid_tank_lead_empty.name=Empty Hazardous Material Tank -item.fluid_tank_lead_full.name=Hazardous Material Tank: +item.fluid_tank_lead_full.name=Hazardous Material Tank: %s item.fluorite.name=Fluorite item.flywheel_beryllium.name=Beryllium Flywheel item.fmn.name=Flunitrazepam Tablet @@ -2903,6 +2952,7 @@ item.gun_amat.name=Anti-Materiel Rifle item.gun_amat_penance.name=Penance item.gun_amat_subtlety.name=Subtlety item.gun_autoshotgun.name=Auto Shotgun +item.gun_autoshotgun_heretic.name=The Heretic item.gun_autoshotgun_sexy.name=Sexy item.gun_autoshotgun_shredder.name=Shredder item.gun_b92.name=§9B92 Energy Pistol§r @@ -2959,6 +3009,7 @@ item.gun_minigun.name=Minigun item.gun_minigun_dual.name=Dual Miniguns item.gun_minigun_lacunae.name=Lacunae item.gun_missile_launcher.name=Missile Launcher +item.gun_n_i_4_n_i.name=N I 4 N I item.gun_pepperbox.name=Pepperbox item.gun_panzerschreck.name=Panzerschreck item.gun_quadro.name=Quad Rocket Launcher @@ -3007,6 +3058,7 @@ item.hev_legs.name=HEV Mark IV Leggings item.holotape_damaged.name=Damaged Holotape item.holotape_image.name=Holotape item.horseshoe_magnet.name=Horseshoe Magnet +item.hot_dusted.forged=Forged %s time(s) item.hull_big_aluminium.name=Big Aluminium Shell item.hull_big_steel.name=Big Steel Shell item.hull_big_titanium.name=Big Titanium Shell @@ -3126,6 +3178,7 @@ item.ingot_schrabidium_fuel.name=Ingot of Schrabidium Fuel item.ingot_schraranium.name=Schraranium Ingot item.ingot_schraranium.desc=Made from uranium in a schrabidium transmutator item.ingot_semtex.name=Bar of Semtex +item.ingot_semtex.desc=Semtex H Plastic Explosive$Performant explosive for many applications.$Edible item.ingot_silicon.name=Silicon Boule item.ingot_smore.name=S'more Ingot item.ingot_solinium.name=Solinium Ingot @@ -3167,6 +3220,13 @@ item.insert_polonium.name=Polonium Insert item.insert_steel.name=Heavy Steel Insert item.insert_xsapi.name=XSAPI Insert item.insert_yharonite.name=Yharonite Insert +item.item_expensive.bronze_tubes.name=Bronze Structural Elements +item.item_expensive.circuit.name=Extensive Circuit Board +item.item_expensive.computer.name=Mainframe +item.item_expensive.ferro_plating.name=Reinforced Ferrouranium Panels +item.item_expensive.heavy_frame.name=Heavy Framework +item.item_expensive.lead_plating.name=Radiation Resistant Plating +item.item_expensive.steel_plating.name=Bolted Steel Plating item.item_secret.aberrator.name=Aberrator Part item.item_secret.canister.name=Composition SB-26 item.item_secret.controller.name=Proprietary Control Unit @@ -3209,6 +3269,7 @@ item.launch_code_piece.name=Silo Launch Code Piece item.launch_key.name=Silo Launch Key item.lead_gavel.name=Leaden Gavel item.lemon.name="Lemon" +item.lemon.desc=Eh, good enough. item.letter.name=Express Mail item.levitation_unit.name=Gravity Manipulator item.lignite.name=Lignite @@ -3221,7 +3282,9 @@ item.liquidator_plate.name=Liquidator Suit Chestplate item.lithium.name=Lithium Cube item.lodestone.name=Lodestone item.loop_stew.name=IT Breakfast +item.loop_stew.desc=A very, very healthy breakfast. item.loops.name=Lööps +item.loops.desc=Brøther, may I have some lööps? item.loot_10.name=Size 10 Missile Loot Crate item.loot_15.name=Size 15 Missile Loot Crate item.loot_misc.name=General Missile Loot Crate @@ -3248,8 +3311,11 @@ item.mechanism_rifle_2.name=Advanced Rifle Mechanism item.mechanism_special.name=High-Tech Weapon Mechanism item.med_bag.name=First Aid Kit item.med_ipecac.name=Ipecac Syrup +item.med_ipecac.desс=Bitter juice that will cause your stomach$to forcefully eject its contents. item.med_ptsd.name=PTSD Medication +item.med_ptsd.desc=This isn't even PTSD medication, it's just$Ipecac in a different bottle! item.med_schiziphrenia.name=Schizophrenia Medication +item.med_schizophrenia.desc=Makes the voices go away. Just for a while.$...$Better not take it. item.medal_liquidator.name=Liquidator Medal item.meltdown_tool.name=Dyatlov Instant Meltdown Applicator item.memespoon.name=§eMarket Gardener @@ -3260,17 +3326,29 @@ item.mese_pickaxe.name=Mese Pickaxe item.meteor_charm.name=Meteor Charm item.meteor_remote.name=Meteorite Remote item.meteorite_sword.name=Meteorite Sword +item.meteorite_sword.desc=Forged from a fallen star$Sharper than most terrestrial blades item.meteorite_sword_seared.name=Meteorite Sword (Seared) +item.meteorite_sword.seared.desc=Fire strengthens the blade$Making it even more powerful item.meteorite_sword_reforged.name=Meteorite Sword (Reforged) +item.meteorite_sword.reforged.desc=The sword has been reforged$To rectify past imperfections item.meteorite_sword_hardened.name=Meteorite Sword (Hardened) +item.meteorite_sword.hardened.desc=Extremely high pressure has been used$To harden the blade further item.meteorite_sword_alloyed.name=Meteorite Sword (Alloyed) +item.meteorite_sword.alloyed.desc=Cobalt fills the fissures$Strengthening the sword item.meteorite_sword_machined.name=Meteorite Sword (Machined) +item.meteorite_sword.machined.desc=Advanced machinery was used$To refine the blade even more item.meteorite_sword_treated.name=Meteorite Sword (Treated) +item.meteorite_sword.treated.desc=Chemicals have been applied$Making the sword more powerful item.meteorite_sword_etched.name=Meteorite Sword (Etched) +item.meteorite_sword.etched.desc=Acids clean the material$To make this the perfect sword item.meteorite_sword_bred.name=Meteorite Sword (Bred) +item.meteorite_sword.bred.desc=Immense heat and radiation$Compress the material item.meteorite_sword_irradiated.name=Meteorite Sword (Irradiated) +item.meteorite_sword.irradiated.desc=The power of the Atom$Gives the sword might item.meteorite_sword_fused.name=Meteorite Sword (Fused) +item.meteorite_sword.fused.desc=This blade has met$With the forces of the stars item.meteorite_sword_baleful.name=Meteorite Sword (Baleful) +item.meteorite_sword.baleful.desc=This sword has met temperatures$Far beyond what normal material can endure item.mike_cooling_unit.name=Deuterium Cooling Unit item.mike_core.name=Uranium Coated Deuterium Tank item.mike_deut.name=Deuterium Tank @@ -3289,6 +3367,17 @@ item.missile_cluster.name=Cluster Missile item.missile_cluster_strong.name=Strong Cluster Missile item.missile_custom.name=Custom Missile item.missile_decoy.name=Decoy Missile +item.missile.desc.warhead=Warhead +item.missile.desc.strength=Strength +item.missile.desc.fuelType=Fuel Type +item.missile.desc.fuelAmount=Fuel amount +item.missile.desc.chipInaccuracy=Chip inaccuracy +item.missile.desc.finInaccuracy=Fin inaccuracy +item.missile.desc.size=Size +item.missile.desc.health=Health +item.missile.desc.fuel=Fuel +item.missile.desc.fuelCapacity=Fuel capacity +item.missile.desc.notLaunchable=Not launchable! item.missile_doomsday.name=Doomsday Missile item.missile_doomsday_rusted.name=Damaged Doomsday Missile item.missile_drill.name=The Concrete Cracker @@ -3296,6 +3385,14 @@ item.missile_emp.name=EMP Missile item.missile_emp_strong.name=Strong EMP Missile item.missile_endo.name=Endothermic Missile item.missile_exo.name=Exothermic Missile +item.missile.fuel.balefire=BF Rocket Fuel +item.missile.fuel.jetfuel_loxy=Jet Fuel / Liquid Oxygen +item.missile.fuel.ethanol_peroxide=Ethanol / Hydrogen Peroxide +item.missile.fuel.kerosene_loxy=Kerosene / Liquid Oxygen +item.missile.fuel.kerosene_peroxide=Kerosene / Hydrogen Peroxide +item.missile.fuel.solid=Solid Fuel +item.missile.fuel.solid.prefueled=Solid Fuel (pre-fueled) +item.missile.fuel.xenon=Xenon item.missile_generic.name=High Explosive Missile item.missile_incendiary.name=Incendiary Missile item.missile_incendiary_strong.name=Strong Incendiary Missile @@ -3304,6 +3401,28 @@ item.missile_kit.name=Missile Kit item.missile_micro.name=Micro-Nuclear Missile item.missile_nuclear.name=Nuclear Missile item.missile_nuclear_cluster.name=Thermonuclear Missile +item.missile.part.bottomSize=Bottom size +item.missile.part.by=by +item.missile.part.fuelAmount=Fuel amount +item.missile.part.fuelConsumption=Fuel consumption +item.missile.part.fuelType=Fuel type +item.missile.part.health=Health +item.missile.part.inaccuracy=Inaccuracy +item.missile.part.maxPayload=Max. payload +item.missile.part.rarity=Rarity +item.missile.part.rarity.common=Common +item.missile.part.rarity.epic=Epic +item.missile.part.rarity.legendary=Legendary +item.missile.part.rarity.rare=Rare +item.missile.part.rarity.strange=Strange +item.missile.part.rarity.uncommon=Uncommon +item.missile.part.size=Size +item.missile.part.size.any=Any +item.missile.part.size.none=None +item.missile.part.strength=Strength +item.missile.part.topSize=Top size +item.missile.part.type=Type +item.missile.part.weight=Weight item.missile_rain.name=Bomblet Rain item.missile_schrabidium.name=Schrabidium Missile item.missile_shuttle.name=Reliant Robin Space Shuttle @@ -3313,8 +3432,14 @@ item.missile_soyuz_lander.desc=Doubles as a crappy lander! item.missile_stealth.name=Stealth Missile item.missile_strong.name=Strong HE Missile item.missile_taint.name=Taint-Tipped Missile +item.missile.tier.tier0=Tier 0 +item.missile.tier.tier1=Tier 1 +item.missile.tier.tier2=Tier 2 +item.missile.tier.tier3=Tier 3 +item.missile.tier.tier4=Tier 4 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 @@ -3671,6 +3796,7 @@ item.particle_strange.name=Strange Quark Capsule item.particle_tachyon.name=Tachyon Capsule item.parts_legendary.name=Legendary Parts item.peas.name=Peas +item.peas.desc=He accepts your offering. item.pedestal_steel.name=Steel Pedestal item.pellet_advanced.name=Advanced Watz Performance Improver item.pellet_antimatter.name=Antimatter Cluster @@ -3937,6 +4063,7 @@ item.primer_buckshot.name=Buckshot Primer (x12) item.protection_charm.name=Charm of Protection item.prototype_kit.name=Prototype Kit item.pudding.name=Pudding +item.pudding.desc=What if he did?$What if he didn't?$What if the world was made of pudding? item.pwr_fuel.bfb_am_mix.name=Fuel Grade Americium PWR BFB Rod item.pwr_fuel.bfb_pu241.name=Plutonium-241 PWR BFB Rod item.pwr_fuel.hea242.name=HEA-242 PWR Fuel Rod @@ -3982,6 +4109,7 @@ item.pwr_fuel_hot.men.name=Hot MEN PWR Fuel Rod item.pwr_fuel_hot.mep.name=Hot MEP PWR Fuel Rod item.pwr_fuel_hot.meu.name=Hot MEU PWR Fuel Rod item.pwr_fuel_hot.mox.name=Hot MOX PWR Fuel Rod +item.pwr_printer.name=PWR Printer item.quartz_plutonium.name=Plutonic Quartz item.radar_linker.name=Radar Linker item.radaway.name=RadAway @@ -3990,8 +4118,10 @@ item.radaway_strong.name=Strong RadAway item.radx.name=Rad-X item.radx.desc=Increases radiation resistance by 0.2 (37%%) for 3 minutes item.rag.name=Cloth +item.rag.desc=Drop into water to make damp cloth.$Right-click to urinate on the cloth. item.rag_damp.name=Damp Cloth item.rag_piss.name=Piss-Soaked Rag +item.rangefinder.name=Rangefinder item.rbmk_fuel_balefire.name=Balefire RBMK Fuel Rod item.rbmk_fuel_balefire_gold.name=Flashgold RBMK Fuel Rod item.rbmk_fuel_drx.name=§cDigamma RBMK Fuel Rod§r @@ -4064,6 +4194,7 @@ item.rbmk_tool.set=RBMK linked! item.reacher.name=Tungsten Reacher item.reactor_core.name=Breeding Reactor Core item.reactor_sensor.name=Reactor Remote Sensor +item.rebar_placer.name=Rebar Placer item.record.glass.desc=? ? ? item.record.lc.desc=Valve - Diabolic Adrenaline Guitar/Lambda Core item.record.ss.desc=Valve - Sector Sweep @@ -4511,6 +4642,7 @@ item.turret_rocket_ammo.name=Rocket Turret 2x4 Ammunition item.turret_spitfire_ammo.name=AA-Shell item.turret_tau_ammo.name=Tau Turret Uranium Ammo item.twinkie.name=Twinkie +item.twinkie.desc=Expired 600 years ago! item.ullapool_caber.name=Ullapool Caber item.undefined.name=Undefined item.upgrade_5g.name=5G Radiation Emitter Upgrade @@ -4555,6 +4687,18 @@ item.wand_d.name=Debug Wand item.wand_k.name=Construction Wand item.wand_s.name=Structure Wand item.structure_custommachine.name=Custom Machine Structure Output Wand +item.warhead.desc.he=HE +item.warhead.desc.incendiary=Incendiary +item.warhead.desc.cluster=Cluster +item.warhead.desc.bunker_buster=Bunker Buster +item.warhead.desc.nuclear=Nuclear +item.warhead.desc.thermonuclear=Thermonuclear (TX) +item.warhead.desc.n2=N² +item.warhead.desc.balefire=BF +item.warhead.desc.schrabidium=Schrabidium +item.warhead.desc.taint=Taint +item.warhead.desc.cloud=Cloud +item.warhead.desc.turbine=Turbine item.warhead_buster_large.name=Large Bunker Buster Warhead item.warhead_buster_medium.name=Medium Bunker Buster Warhead item.warhead_buster_small.name=Small Bunker Buster Warhead @@ -4748,6 +4892,11 @@ potion.hbm_stability=Stability potion.hbm_taint=Tainted potion.hbm_telekinesis=! ! ! +purex.recycle=Reprocessing of %s +purex.schrab=Schrabidium extraction from %s + +qmaw.tab=[ Press %s for help ] + radar.clearMap=Clear Map radar.detectMissiles=Detect Missiles radar.detectPlayers=Detect Players @@ -4799,6 +4948,17 @@ rbmk.screen.rod=Control: %s rbmk.screen.temp=Temp: %s rbmk.screen.xenon=Xenon: %s +satchip.frequency=Satellite frequency +satchip.foeq=Gives you an achievement. That's it. +satchip.gerald.desc=Single use.$Requires orbital module.$Melter of CPUs, bane of every server owner. +satchip.laser=Allows to summon lasers with a 15 second cooldown. +satchip.mapper=Displays currently loaded chunks. +satchip.miner=Will deliver ore powders to a cargo landing pad. +satchip.lunar_miner=Mines moon turf to deliver it to a cargo landing pad. +satchip.radar=Shows a map of active entities. +satchip.resonator=Allows for teleportation with no cooldown. +satchip.scanner=Creates a topdown map of underground ores. + shape.barrelHeavy=Heavy Barrel shape.barrelLight=Light Barrel shape.billet=Billet @@ -5138,6 +5298,7 @@ tile.concrete_colored_ext.pink.name=Builder's Choice Concrete - Manly Pink tile.concrete_colored_ext.purple.name=Builder's Choice Concrete - Mysterious Purple tile.concrete_colored_ext.sand.name=Builder's Choice Concrete - Desert Storm tile.concrete_pillar.name=Rebar Reinforced Concrete Pillar +tile.concrete_rebar.name=Reinforced Concrete tile.concrete_slab.asphalt.name=Asphalt Slab tile.concrete_slab.concrete.name=Concrete Tile Slab tile.concrete_slab.concrete_asbestos.name=Asbestos Concrete Slab @@ -5276,6 +5437,7 @@ 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 +tile.logic_block.name=Dungeon Action Block tile.dynamite.name=Dynamite tile.emp_bomb.name=EMP Device tile.factory_advanced_conductor.name=Advanced Factory Electricity Port @@ -5309,6 +5471,7 @@ tile.floodlight.name=Powered Floodlight tile.fluid_duct.name=Universal Fluid Duct (Deprecated) tile.fluid_duct_box.name=Universal Fluid Duct (Boxduct) tile.fluid_duct_exhaust.name=Exhaust Pipe +tile.fluid_duct_paintable_block_exhaust.name=Paintable Coated Exhaust Pipe tile.fluid_duct_gauge.name=Flow Gauge Pipe tile.fluid_duct_gauge.desc=Pipe that displays how much fluid$moves within the network per tick.$Split networks connected by barrels$or tanks are considered as one shared network. tile.fluid_duct_neo.name=Universal Fluid Duct @@ -5444,6 +5607,7 @@ tile.ladder_steel.name=Steel Ladder tile.ladder_sturdy.name=Sturdy Wooden Ladder tile.ladder_titanium.name=Titanium Ladder tile.ladder_tungsten.name=Tungsten Ladder +tile.trapdoor_steel.name=Steel Trapdoor tile.lamp_demon.name=Demon Core Lamp tile.lamp_tritium_blue_off.name=Blue Tritium Lamp tile.lamp_tritium_blue_on.name=Blue Tritium Lamp @@ -5473,8 +5637,9 @@ tile.machine_arc_welder.name=Arc Welder tile.machine_armor_table.name=Armor Modification Table tile.machine_ashpit.name=Ashpit tile.machine_ashpit.desc=Collects ashes from fireboxes and heating ovens -tile.machine_assembler.name=Assembly Machine +tile.machine_assembler.name=Assembly Machine (Legacy) tile.machine_assemfac.name=Assembly Factory +tile.machine_assembly_machine.name=Assembly Machine tile.machine_autocrafter.name=Automatic Crafting Table tile.machine_autosaw.name=Automatic Buzz Saw tile.machine_autosaw.desc=Cuts down nearby plants, re-plants trees$Accepts:$-Wood oil$-Ethanol$-Fish oil$-Heavy oil @@ -5571,6 +5736,8 @@ tile.machine_powerrtg.name=PT Isotope Cell tile.machine_press.name=Burner Press tile.machine_puf6_tank.name=Plutonium Hexafluoride Tank tile.machine_pumpjack.name=Pumpjack +tile.machine_purex.name=PUREX +tile.machine_purex.desc=Reprocessing machine for many nuclear fuels.$Most recipes require kerosene and nitric acid. tile.machine_pyrooven.name=Pyrolysis Oven tile.machine_radar.name=Radar tile.machine_radar_large.name=Large Radar @@ -5797,6 +5964,7 @@ tile.plasma_heater.name=Plasma Heater tile.plushie.name=%s Plushie tile.pneumatic_tube.name=Pneumatic Tube tile.pneumatic_tube.desc=Sends items using compressed air.$Right-click with screwdriver to toggle an input.$Shift right-click with screwdriver to toggle an output.$Inputs can be configured, and connected to compressed air.$Sends up to one stack, four times per second. +tile.pneumatic_tube_paintable.name=Paintable Pneumatic Tube tile.pole_satellite_receiver.name=Satellite Dish tile.pole_top.name=Antenna Top tile.press_preheater.name=Burner Press Preheater @@ -5860,6 +6028,7 @@ tile.rail_large_switch_flipped.name=Standard Gauge Switch Rail (15m, Right) tile.rail_narrow.name=Narrow Gauge Cart Rail tile.rail_wood.name=Wooden Tracks tile.rbmk_absorber.name=RBMK Boron Neutron Absorber +tile.rbmk_autoloader.name=RBMK Autoloader tile.rbmk_blank.name=RBMK Structural Column tile.rbmk_boiler.name=RBMK Steam Channel tile.rbmk_console.name=RBMK Console @@ -5884,6 +6053,53 @@ tile.rbmk_steam_inlet.desc=Inserts water into RBMK columns if ReaSim boilers are tile.rbmk_steam_outlet.name=RBMK ReaSim Steam Outlet tile.rbmk_steam_outlet.desc=Extracts super dense steam from RBMK columns if ReaSim boilers are enabled$Connects to RBMK columns sideways tile.rbmk_storage.name=RBMK Storage Column +tile.rbmk.dodd.heat=Column Heat +tile.rbmk.dodd.reasimWater=ReaSim Water +tile.rbmk.dodd.reasimSteam=ReaSim Steam +tile.rbmk.dodd.level=Level +tile.rbmk.dodd.targetLevel=Target Level +tile.rbmk.dodd.startingLevel=Starting Level +tile.rbmk.dodd.mult=Mult +tile.rbmk.dodd.color=Color +tile.rbmk.dodd.levelLower=Level Lower +tile.rbmk.dodd.levelUpper=Level Upper +tile.rbmk.dodd.heatLower=Heat Lower +tile.rbmk.dodd.heatUpper=Heat Upper +tile.rbmk.dodd.function=Function +tile.rbmk.dodd.fluxSlow=Flux Slow +tile.rbmk.dodd.fluxFast=Flux Fast +tile.rbmk.dodd.hasRod=Has Rod +tile.rbmk.dodd.progress=Progress +tile.rbmk.dodd.gas=Gas +tile.rbmk.dodd.cooled=Cooled +tile.rbmk.dodd.burned=Burned +tile.rbmk.dodd.feed=Feed +tile.rbmk.dodd.steam=Steam +tile.rbmk.dodd.cryo=Cryo +tile.rbmk.dodd.fuel=Fuel +tile.rbmk.dodd.f_heat=Fuel Heat +tile.rbmk.dodd.f_xenon=Fuel Xenon +tile.rbmk.dodd.f_yield=Fuel Yield +tile.rbmk.dodd.feed_type=Feed Type(ID) +tile.rbmk.dodd.steam_type=Steam Type(ID) +tile.rbmk.dodd.cryo_type=Cryo Type(ID) +tile.rbmk.dodd.gas_type=Gas Type(ID) +tile.rbmk.dodd.fuel_type=Fuel Type(ID) +tile.rbmk.dodd.feed_p=Feed Pressure +tile.rbmk.dodd.steam_p=Steam Pressure +tile.rbmk.dodd.cryo_p=Cryo Pressure +tile.rbmk.dodd.gas_p=Gas Pressure +tile.rbmk.dodd.fuel_p=Fuel Pressure +tile.rbmk.dodd.feed_max=Feed Max Amount +tile.rbmk.dodd.steam_max=Steam Max Amount +tile.rbmk.dodd.cryo_max=Cryo Max Amount +tile.rbmk.dodd.gas_max=Gas Max Amount +tile.rbmk.dodd.fuel_max=Fuel Max Amount +tile.rbmk.dodd.feed_amt=Feed Amount +tile.rbmk.dodd.steam_amt=Steam Amount +tile.rbmk.dodd.cryo_amt=Cryo Amount +tile.rbmk.dodd.gas_amt=Gas Amount +tile.rbmk.dodd.fuel_amt=Fuel Amount tile.reactor_computer.name=Reactor Control tile.reactor_conductor.name=Reactor Boiler tile.reactor_control.name=Control Rods @@ -5891,6 +6107,7 @@ tile.reactor_ejector.name=Reactor Waste Ejector tile.reactor_element.name=Reactor Chamber tile.reactor_hatch.name=Reactor Access Hatch tile.reactor_inserter.name=Reactor Fuel Inserter +tile.rebar.name=Rebar tile.red_barrel.name=Explosive Barrel tile.red_cable.name=Red Copper Cable tile.red_cable_classic.name=Red Copper Cable (Classic) @@ -6056,6 +6273,7 @@ tile.volcano_rad_core.name=Rad Volcano Core tile.wand_air.name=Structure Wand Block (Air) tile.wand_loot.name=Structure Wand Block (Lootable) tile.wand_jigsaw.name=Structure Wand Block (Jigsaw) +tile.wand_logic.name=Structure Wand Block (Logic) tile.waste_earth.name=Dead Grass tile.waste_leaves.name=Dead Leaves tile.waste_log.name=Charred Log @@ -6146,6 +6364,7 @@ tool.ability.centrifuge=Auto-Centrifuge tool.ability.crystallizer=Auto-Crystallizer tool.ability.explosion=Explosion tool.ability.hammer=AoE +tool.ability.hammer_flat=Flat AoE tool.ability.luck=Fortune tool.ability.mercury=Mercury Touch tool.ability.midas=Midas Touch @@ -6219,3 +6438,5 @@ desc.gui.upgrade.effectiveness= * §aEffectiveness§r: Stacks to level 3 desc.gui.upgrade.overdrive= * §7Overdrive§r: Stacks to level 3 desc.gui.upgrade.power= * §1Power-Saving§r: Stacks to level 3 desc.gui.upgrade.speed= * §4Speed§r: Stacks to level 3 + +tile.oc_cable_paintable.name=Paintable Network Cable diff --git a/src/main/resources/assets/hbm/lang/it_IT.lang b/src/main/resources/assets/hbm/lang/it_IT.lang index 691badc0e..b426cae6d 100644 --- a/src/main/resources/assets/hbm/lang/it_IT.lang +++ b/src/main/resources/assets/hbm/lang/it_IT.lang @@ -5513,6 +5513,7 @@ tile.ladder_steel.name=Steel Ladder tile.ladder_sturdy.name=Sturdy Wooden Ladder tile.ladder_titanium.name=Titanium Ladder tile.ladder_tungsten.name=Tungsten Ladder +tile.trapdoor_steel.name=Steel Trapdoor tile.lamp_demon.name=Demon Core Lamp tile.lamp_tritium_blue_off.name=Blue Tritium Lamp tile.lamp_tritium_blue_on.name=Blue Tritium Lamp @@ -6164,6 +6165,7 @@ tool.ability.centrifuge=Auto-Centrifuge tool.ability.crystallizer=Auto-Crystallizer tool.ability.explosion=Explosion tool.ability.hammer=AoE +tool.ability.hammer_flat=AoE piatta tool.ability.luck=Fortune tool.ability.mercury=Mercury Touch tool.ability.midas=Midas Touch diff --git a/src/main/resources/assets/hbm/lang/pl_PL.lang b/src/main/resources/assets/hbm/lang/pl_PL.lang index f33a8a715..9ff1a89d8 100644 --- a/src/main/resources/assets/hbm/lang/pl_PL.lang +++ b/src/main/resources/assets/hbm/lang/pl_PL.lang @@ -4859,6 +4859,7 @@ tile.ladder_steel.name=Steel Ladder tile.ladder_sturdy.name=Sturdy Wooden Ladder tile.ladder_titanium.name=Titanium Ladder tile.ladder_tungsten.name=Tungsten Ladder +tile.trapdoor_steel.name=Steel Trapdoor tile.lamp_demon.name=Demon Core Lamp tile.lamp_tritium_blue_off.name=Blue Tritium Lamp tile.lamp_tritium_blue_on.name=Blue Tritium Lamp @@ -5399,6 +5400,7 @@ tool.ability.centrifuge=Auto-Centrifuge tool.ability.crystallizer=Auto-Crystallizer tool.ability.explosion=Explosion tool.ability.hammer=AoE +tool.ability.hammer_flat=Flat AoE tool.ability.luck=Fortune tool.ability.mercury=Mercury Touch tool.ability.midas=Midas Touch diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 5c3efa442..68cd5e606 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -14,9 +14,9 @@ achievement.bossCreeper.desc='Здесь есть ядерные криперы? achievement.bossCreeper=Бомба на четырёх ногах achievement.bossMaskman.desc=Врезать большому мальчику. achievement.bossMeltdown.desc=Скорее ужасно, чем отлично, но я приму то, что могу получить. -achievement.bossMaskman=6 месяцев срочной службы, и все что я получил это паршивая футболка +achievement.bossMaskman=6 месяцев срочной службы, и всё, что я получил, это паршивая футболка achievement.bossMeltdown=3.6 рентген -achievement.bossWorm.desc=Фабстафф. Моя задница. А ты считай. +achievement.bossWorm.desc=Просто маленький металический червь. achievement.bossWorm=Разборка Баллс-О-Трон achievement.bossUFO.desc=Эй, что у нас тут? Огромный космический корабль, приближающийся к блок-кораблю? achievement.bossUFO=Ayy Lmao @@ -38,29 +38,29 @@ achievement.desh.desc="Тогда давайте, вы все. Места, ку achievement.desh=Леверье achievement.digammaFeel.desc=Мои глаза кровоточат achievement.digammaFeel=Мусорный мир наполненный канализациями -achievement.digammaKauaiMoho.desc=Все ужасно, вот тебе горячий шоколад. +achievement.digammaKauaiMoho.desc=Всё ужасно, вот тебе горячий шоколад. achievement.digammaKauaiMoho=Пой, пой мне песню Кауаи Мохо -achievement.digammaKnow.desc=о чем вообще этот мир. +achievement.digammaKnow.desc=о чём вообще этот мир. achievement.digammaKnow=СТРАХ ПОЗНАНИЯ achievement.digammaSee.desc=Темновато, принеси фонарик. achievement.digammaSee=СПУСТИСЬ В БЕЗДНУ achievement.digammaUpOnTop.desc=Восхищайся сыном моим, он мой клон. achievement.digammaUpOnTop=ВОСХИЩАЙСЯ МНОЮ, ВОСХИЩАЙСЯ ДОМОМ МОИМ achievement.fiend.desc=Будь жестоким. -achievement.fiend2.desc=Будь еще жёстче. +achievement.fiend2.desc=Будь ещё жёстче. achievement.fiend2=Нарушитель-2: перенарушение. achievement.fiend=Нарушитель -achievement.freytag.desc=Стражи жизни Герольда. +achievement.freytag.desc=Стражи жизни Геральда. achievement.freytag=Фрейтаг achievement.fusion.desc=Танец дейтронов, тритонов и энергии. achievement.fusion=Синтез -achievement.gasCent.desc=Необогащенный уран ненавидит его! +achievement.gasCent.desc=Необогащённый уран ненавидит его! achievement.gasCent=Стиль Молнии achievement.goFish.desc=Морское распятие achievement.goFish=Иди порыбачь achievement.hidden.desc=Убейте зараженного крипера падающим товарным вагоном achievement.hidden=Скрытый Каталог -achievement.horizonsBonus.desc=честное слово что черт возьми с тобой не так +achievement.horizonsBonus.desc=честное слово что чёрт возьми с тобой не так achievement.horizonsBonus=Слэм-данк диарея achievement.horizonsEnd.desc=Отправьте Тома домой. achievement.horizonsEnd=Горизонты @@ -68,11 +68,11 @@ achievement.horizonsStart.desc=Отправьте Геральда на луну achievement.horizonsStart=Апогей achievement.impossible.desc=Ты не можешь получить это достижение. achievement.impossible=Буквально невозможно -achievement.inferno.desc="Превратите его в пепел! Этого недостаточно! Сбросьте еще бомбы!" +achievement.inferno.desc="Превратите его в пепел! Этого недостаточно! Сбросьте ещё бомбы!" achievement.inferno=Операция "Каннибал" achievement.manhattan.desc=8:15; 6 августа, 1945 год achievement.manhattan=Проект Манхэттен -achievement.meltdown.desc=Ты зашел так далеко, как ты мог все испортить? +achievement.meltdown.desc=Ты зашел так далеко, как ты мог всё испортить? achievement.meltdown=Быстрая внеплановая разборка achievement.no9.desc="Я надеюсь, что свинец, который я добываю, будет использован в вашей краске" achievement.no9=Старый номер Девять @@ -148,8 +148,8 @@ armor.explosionImmune=Не может получить никакого урон armor.fasterReload=Быстрая перезарядка armor.fastFall=Быстрое падение armor.fireproof=Огнеупорность -armor.fullSetBonus=Бонусы Полного Набора брони: -armor.geigerHUD=Встроенный HUD счетчика Гейгера +armor.fullSetBonus=Бонусы полного набора брони: +armor.geigerHUD=Встроенный HUD счётчика Гейгера armor.geigerSound=Звуковой Счётчик Гейгера armor.glider=Присесть, чтобы спланировать armor.gravity=Модификатор гравитации %s @@ -184,6 +184,14 @@ armorMod.type.leggings=Поножи armorMod.type.servo=Сервоприводы armorMod.type.special=Особое +autoswitch=Часть группы автоматического переключения "%s"$Рецепта изменяется в зависимости от первого ингредиента +autoswitch.plate=Переработка топливных пластин +autoswitch.plates=Металические пластины +autoswitch.pwr=Переработка стержней ВВЭР +autoswitch.schrab=Экстракция Шрабидия +autoswitch.watz=Переработка Ватцз-пеллет +autoswitch.zirnox=Переработка стержней Цирнокс + battery.mode.buffer=Буферный режим battery.mode.input=Зарядка battery.mode.off=Отключено @@ -210,7 +218,7 @@ book.test.page1=Test Page 1 book.error.cover=Адронный Коллайдер:$Диагностирование проблем book.error.title1=Ошибка 0x01 [NC] -book.error.page1=§lНазвание:§r "ERROR_NO_CHARGE" §lОписание:§r Частица достигла сегмента, у которого недостаточно заряда. §lПотенциальное решение:§r Либо замените один из портов питания, через который частица успешно проходит, на более мощный порт питания, либо добавьте еще один порт питания немного раньше сегмента, где исчезает частица. +book.error.page1=§lНазвание:§r "ERROR_NO_CHARGE" §lОписание:§r Частица достигла сегмента, у которого недостаточно заряда. §lПотенциальное решение:§r Либо замените один из портов питания, через который частица успешно проходит, на более мощный порт питания, либо добавьте ещё один порт питания немного раньше сегмента, где исчезает частица. book.error.title2=Ошибка 0x02 [NA] book.error.page2=§lНазвание:§r "ERROR_NO_ANALYSIS" §lОписание:§r Частица достигла ядра, несмотря на то, что она не прошла камеру анализа. §lПотенциальное решение:§r Проверьте что ваш ускоритель имеет камеру анализа и также проверьте режим работы (линейный/циклический). book.error.title3=Ошибка 0x03 [OC] @@ -218,13 +226,13 @@ book.error.page3=§lНазвание:§r "ERROR_OBSTRUCTED_CHANNEL" §lОпис book.error.title4=Ошибка 0x04 [EC] book.error.page4=§lНазвание:§r "ERROR_EXPECTED_COIL" §lОписание:§r Частица пересекла сегмент, у которого не хватает одной или нескольких катушек. §lПотенциальное решение:§r Снимите обшивку с коллайдера в предполагаемой области и проверьте наличие всех катушек. Эта ошибка также возникает при T-образных пересечениях которые были построены без диодов. book.error.title5=Ошибка 0x05 [MS] -book.error.page5=§lНазвание:§r "ERROR_MALFORMED_SEGMENT" §lОписание:§r Частица пересекла сегмент, который был неправильно построен (но не заблокирован или не имеет катушек). §lПотенциальное решение:§r Проверьте, что предполагаемый сегмент имеет обшивку во все требуемых местах, не оставляя открытых катушек. +book.error.page5=§lНазвание:§r "ERROR_MALFORMED_SEGMENT" §lОписание:§r Частица пересекла сегмент, который был неправильно построен (но не заблокирован или не имеет катушек). §lПотенциальное решение:§r Проверьте, что предполагаемый сегмент имеет обшивку во всех требуемых местах, не оставляя открытых катушек. book.error.title6=Ошибка 0x06 [ATL] -book.error.page6=§lНазвание:§r "ERROR_ANALYSIS_TOO_LONG" §lОписание:§r Частица прошла более трех требуемых допустимых сегментов камеры анализа. §lПотенциальное решение:§r Проверьте, что камера анализа точно 3 блока в длину для циклического ускорителя и хотя бы 2 блока в длину для линейного. Также проверьте, не проходит ли частица через несколько камер анализа в разветвленном и/или закольцованном ускорителе. +book.error.page6=§lНазвание:§r "ERROR_ANALYSIS_TOO_LONG" §lОписание:§r Частица прошла более трёх требуемых допустимых сегментов камеры анализа. §lПотенциальное решение:§r Проверьте, что камера анализа точно 3 блока в длину для циклического ускорителя и хотя бы 2 блока в длину для линейного. Также проверьте, не проходит ли частица через несколько камер анализа в разветвленном и/или закольцованном ускорителе. book.error.title7=Ошибка 0x07 [ATS] book.error.page7=§lНазвание:§r "ERROR_ANALYSIS_TOO_SHORT" §lОписание:§r Частица покинула камеру анализа, несмотря на несоответствие требованиям по длине. §lПотенциальное решение:§r Убедитесь, что камера анализа ускорителя имеет длину ровно 3 блока. Допустимые сегменты камеры не имеют катушек, а покрытие полностью состоит из стенок/окон камеры анализа. Камеры анализа с катушками в них считаются правильными сегментами. book.error.title8=Ошибка 0x08 [DC] -book.error.page8=§lНазвание:§r "ERROR_DIODE_COLLISION" §lОписание:§r Частица столкнулась с не входящей стороной диода частиц Шоттки. §lПотенциальное решение:§r Проверьте что ваши диоды настроены правильно. Частицы могут входить только со сторон с зелеными стрелками, направленными внутрь. +book.error.page8=§lНазвание:§r "ERROR_DIODE_COLLISION" §lОписание:§r Частица столкнулась с не входящей стороной диода частиц Шоттки. §lПотенциальное решение:§r Проверьте что ваши диоды настроены правильно. Частицы могут входить только со сторон с зелёными стрелками, направленными внутрь. book.error.title9=Ошибка 0x09 [BT] book.error.page9=§lНазвание:§r "ERROR_BRANCHING_TURN" §lОписание:§r Частица достигла поворота с несколькими выходами. §lПотенциальное решение:§r Если ваш поворот нормальный, проверьте есть ли там все катушки (то есть нет дыр в слоях). Если поворот предназначен для разветвления, для этого требуется правильно сконфигурированный диод частиц Шоттки. @@ -256,7 +264,7 @@ book.rbmk.title12=Консоль book.rbmk.page12=§lКонсоль РБМК§r позволяет управлять реактором издалека. Использование §lУстройства для соединения консоли§r §lРБМК§r на части РБМК и затем на консоли соединит реактор и консоль. Консоль может управлять только частями 15x15, для больших реакторов вы можете использовать несколько консолей. book.rbmk.title13=Использование консоли book.rbmk.page13=Щелчок по частям приведет к их выбору и отмене выбора. С помощью цветных кнопок вы можете быстро выбрать все стержни управления этой цветовой группы. Кнопка "A" выберет все стержни управления, "X" отменит выбор всех. -book.rbmk.page14=Ввод числа от 0 до 100 в зеленое поле, а затем нажатие кнопки рядом с ним приведет к установке всех выбранных стержней управления в это положение. Кнопка "АЗ-5" приведет к полной вставке всех стержней управления. +book.rbmk.page14=Ввод числа от 0 до 100 в зелёное поле, а затем нажатие кнопки рядом с ним приведет к установке всех выбранных стержней управления в это положение. Кнопка "АЗ-5" приведет к полной вставке всех стержней управления. book.rbmk.title15=Топливо book.rbmk.page15=Реакция §lтоплива§r зависит от множества факторов. Основными из них являются §lобогащение§r, §lксеноновое отравление§r и количество поступающих §lнейтронов§r. Ксенон накапливается, когда топливо получает мало нейтронов, и сгорает во время нормальной работы. Эффективность нейтронов зависит от типа, большинство видов топлива §lлучше всего расщепляются медленными нейтронами§r. book.rbmk.title16=Расплавление @@ -266,7 +274,7 @@ book.starter.cover=Руководство промышленника$по вос book.starter.title1=Вступление book.starter.page1=Если вы читаете это, то весьма вероятно, что общество, так или иначе, полностью рухнуло. Правительства, страны и власть - это концепция прошлого, вместе со всеми удобствами цивилизованной жизни. Таким образом, это руководство расскажет вам,как изменить это, воссоздав индустрию и технологии прошлого для улучшения вашей собственной жизни. book.starter.title2=Уголь и горчичный газ -book.starter.page2=Хотя невозможно предсказать фактическое состояние мира в постапокалиптическое время, вполне вероятно, что война и промышленность в ее нынешнем виде, возможно, еще не закончились. Чтобы защитить свои собственные лёгкие, эффективный и дешевый способ - помочиться на какую-нибудь тряпку, чтобы сделать §lтраншейную маску§r, чтобы защитить вас от угольной пыли или горчичного газа, если вы когда-нибудь столкнетесь с ними. +book.starter.page2=Хотя невозможно предсказать фактическое состояние мира в постапокалиптическое время, вполне вероятно, что война и промышленность в её нынешнем виде, возможно, ещё не закончились. Чтобы защитить свои собственные лёгкие, эффективный и дешёвый способ - помочиться на какую-нибудь тряпку, чтобы сделать §lтраншейную маску§r, чтобы защитить вас от угольной пыли или горчичного газа, если вы когда-нибудь столкнетесь с ними. book.starter.title3=Наковальни и прессы book.starter.page3=Квинтэссенцией для начала вашего промышленного возрождения являются §lнаковальня§r и §lпресс§r. Наковальня позволит вам вручную создавать ранние механизмы, такие как сборочная машина, в то время как пресс позволит вам изготавливать пластины, провода и схемы, которые вы не можете сделать с помощью наковальни. book.starter.title4=Шаблоны @@ -291,7 +299,7 @@ book.starter.title12=Радиация book.starter.page12a=§oОстальная часть этой книги будет посвящена вопросам, связанным с §oрадиацией. Для вашей безопасности и безопасности других людей я дам вам §oсоветы о том, как смягчить воздействие и справиться с ней. book.starter.page12b=Достаточное воздействие радиации может привести и приведет к телесным повреждениям. Первый шаг - это внешняя защита; обязательно ограничьте свое воздействие и наденьте защитное снаряжение, например §lЗащитный костюм§r, или прикрепить §lОбшивку§r к вашей одежде или броне; вы также можете принять §lРад-X§r чтобы ограничить получаемую дозу. Спасибо современной медицине, вторым шагом может быть удаление, если это необходимо; например, §l"Обеззараживатель §lигрока"§r будет медленно уменьшать излучение, поглощённое вашим телом. §lАнтирадин§r может быть использован как профилактика при облучении, быстро и эффективно устраняя повреждения, причиненные вашему организму ионизирующим излучением. book.starter.title13=Обогащение урана -book.starter.page13=Существует несколько простых вариантов топлива для ядерного реактора; например, топливо из §lПриродного урана§r или §lТория§r. Однако, если вы ищете что-то более мощное, вы можете настроить каскад обогащения из двух §lГазовых центрифуг§r для производства §lУранового топлива§r с остатками §lУрана-238§r. Для этого вам придется превратить природный уран в §lЙеллоукейк§r, а затем в §lГексафторид §lурана§r. +book.starter.page13=Существует несколько простых вариантов топлива для ядерного реактора; например, топливо из §lПриродного урана§r или §lТория§r. Однако, если вы ищете что-то более мощное, вы можете настроить каскад обогащения из двух §lГазовых центрифуг§r для производства §lУранового топлива§r с остатками §lУрана-238§r. Для этого вам придется превратить природный уран в §lжёлтый кек§r, а затем в §lГексафторид §lурана§r. book.starter.title14=Чикагская поленница book.starter.page14=В качестве альтернативы вы можете получить §lРеакторный плутоний§r, более мощное топливо, из природного урана, используя §lЧикагскую поленницу§r. Укладывая графитовые блоки и сверля их, вы можете вставить топливные стержни для размножения в плутоний и стержни источников нейтронов, такие как §lРадий-Бериллий§r, чтобы начать реакцию. Обязательно протестируйте свои конструкции; для предотвращения перегрева может потребоваться разделение или ограничение количества блоков. book.starter.title15=ЦИРНОКС РГО @@ -345,9 +353,9 @@ book_lore.test.page.4=5 book_lore.book_iodine.name=Заметка book_lore.book_iodine.author=Дейв -book_lore.book_iodine.page.0=Лады, вы не поверите, но старик Везэрвэйн наконец объявился через две недели после своего ухода и, что еще более впечатляюще, он раскололся на тему своих занятий в каньоне: +book_lore.book_iodine.page.0=Лады, вы не поверите, но старик Везэрвэйн наконец объявился через две недели после своего ухода и, что ещё более впечатляюще, он раскололся на тему своих занятий в каньоне: book_lore.book_iodine.page.1=Похоже, дебилы из НИОКР обнаружили соединение, в основном неорганическое, очень схожее с токсином, но вникните: умирающие клетки воспроизводят и выделяют его во внешнюю среду, создавая чрезвычайно заразный аэрозоль. -book_lore.book_iodine.page.2=Оно как вирус, но не вирус. Состав странный, его можно замешать в любой бутылке, но лишь в нужном порядке. Док сказал, что первый реактив это просто измельченные кристаллы иода, идущие в ячейку %d. +book_lore.book_iodine.page.2=Оно как вирус, но не вирус. Состав странный, его можно замешать в любой бутылке, но лишь в нужном порядке. Док сказал, что первый реактив это просто измельчённые кристаллы иода, идущие в ячейку %d. book_lore.book_phosphorous.name=Заметка book_lore.book_phosphorous.author=Дейв @@ -377,7 +385,7 @@ book_lore.book_syringe.page.1=шприц идёт в ячейку %d. book_lore.resignation_note.name=Заявление об отставке book_lore.resignation_note.author=Косма -book_lore.resignation_note.page.0=Управление вновь сократило наш отдел. Эти идиоты могут обвинить в произошедшем только себя, я не знаю, чего они ожидали после такого фиаско. Кто, черт его дери, сливает информацию? Мы теряем миллионы, а +book_lore.resignation_note.page.0=Управление вновь сократило наш отдел. Эти идиоты могут обвинить в произошедшем только себя, я не знаю, чего они ожидали после такого фиаско. Кто, чёрт его дери, сливает информацию? Мы теряем миллионы, а book_lore.resignation_note.page.1=работы лишили МЕНЯ. МЕНЯ попросили уволиться. Я надеюсь вы, кретины, наконец извлечете урок из громады своих ошибок и возьмёте себя в руки. book_lore.resignation_note.page.2=Я не приду в пятницу. Просто пришлите мне зарплату. @@ -420,7 +428,7 @@ book_lore.bf_bomb_3.name=Личные заметки book_lore.bf_bomb_3.author=М. Портер book_lore.bf_bomb_3.page.0=Мы с командой добились некоторых успехов. Особенно в плане работы с персоналом – игнорирование особо верующих людей сделало работу гораздо пристойней. Мы до сих пор не имеем ни малейшего представления о реальных свойствах жар-огня (сложно анализировать book_lore.bf_bomb_3.page.1=образец, тупо сжигающий твоё оборудование), но его взаимодействие с другими материалами дало нам пищу для размышлений. Примечательно, что они синтезировали "газообразную" форму: из всего персонала, именно Эндрю сообщил мне, что это был коллоид из микроскопических частиц жар-огня, взвешенных в некоем -book_lore.bf_bomb_3.page.2=инертном газе. Каждая частица окружена положительно заряженным 'пузырём' ионизированного газа, препятствующим ее осаждению. Кто бы мог подумать, что смертельное гамма-излучение может приносить пользу? Точно не я. $ Я предпочитаю не думать о том, что они превратили образец в +book_lore.bf_bomb_3.page.2=инертном газе. Каждая частица окружена положительно заряженным 'пузырём' ионизированного газа, препятствующим её осаждению. Кто бы мог подумать, что смертельное гамма-излучение может приносить пользу? Точно не я. $ Я предпочитаю не думать о том, что они превратили образец в book_lore.bf_bomb_3.page.3=дисперсную смесь, но я не могу недооценить удобство этого газообразного жар-пламени – экспериментировать с ним стало гораздо безопаснее. $ Говоря о безопасности, главный исследователь (в приступе бездумного пренебрежения) сделал открытие, которое чуть не стоило ему жизни. book_lore.bf_bomb_3.page.4=Он решил получить "грязнушку", позволив ячейке нашего нового коллоида напрямую взаимодействовать с какой-то очень дорогой антиматерией: в результате взрыва стол, на котором она стояла, превратился в кусок отбеленного радиацией шлака, прорезанный почти идеальной полусферой сквозь book_lore.bf_bomb_3.page.5=столешницу, также главный исследователь получил острую лучевую болезнь. Думаю, теперь мы знаем, как его взорвать, но, боже, некоторые люди... @@ -436,19 +444,19 @@ book_lore.bf_bomb_4.page.4=Все они придают большое знач book_lore.bf_bomb_5.name=Личные заметки book_lore.bf_bomb_5.author=М. Портер book_lore.bf_bomb_5.page.0=Я просто... не могу с этим справиться, даже спустя несколько дней. На самом деле, это было предрешено, учитывая, насколько легкомысленно научная группа относилась к безопасности. $ $ Доктор Мелфин, старший научный сотрудник, сгинул. Вероятно, мёртв. Я видел, как это произошло, собственными глазами, в испытательной камере. -book_lore.bf_bomb_5.page.1=Мы только что получили еще одну порцию чистого жар-огня, а он нашел необходимое электрооборудование и источник энергии, чтобы проверить свое предположение. Я не знаю, что стало причиной (было ли запущено оборудование? Он начал слишком рано?), но оно свершилось мучительно медленно, -book_lore.bf_bomb_5.page.2=когда зеленый свет поглотил стол, батарею и доктора Мелфина, стоящего всего в метре от него. Даже когда стол превратился в лужу кипящего металла на полу, он не загорелся. Я не знаю, что я увидел в его глазах... $$ Ужас или трепет, +book_lore.bf_bomb_5.page.1=Мы только что получили ещё одну порцию чистого жар-огня, а он нашел необходимое электрооборудование и источник энергии, чтобы проверить свое предположение. Я не знаю, что стало причиной (было ли запущено оборудование? Он начал слишком рано?), но оно свершилось мучительно медленно, +book_lore.bf_bomb_5.page.2=когда зелёный свет поглотил стол, батарею и доктора Мелфина, стоящего всего в метре от него. Даже когда стол превратился в лужу кипящего металла на полу, он не загорелся. Я не знаю, что я увидел в его глазах... $$ Ужас или трепет, book_lore.bf_bomb_5.page.3=может из-за того, что он ещё жив? Чем бы ни был наш "чудо" материал, его это не волновало. В следующий момент он исчез в яркой вспышке света. Он испарился? сгорел? аннигилирован? Отошлите меня хоть в грёбаный ад, я больше ничего не знаю! -book_lore.bf_bomb_5.page.4=Меня тошнит от главного исследователя. Он звиздел, что мы могли бы быть более осторожными, продолжать просто кружить вокруг, какую-то ещё подымающую мораль чепуху. Этот тупой урод никогда не поймет, что играя с огнем, можно обжечься. $ Я не стал заморачиваться с +book_lore.bf_bomb_5.page.4=Меня тошнит от главного исследователя. Он звиздел, что мы могли бы быть более осторожными, продолжать просто кружить вокруг, какую-то ещё подымающую мораль чепуху. Этот тупой урод никогда не поймет, что, играя с огнем, можно обжечься. $ Я не стал заморачиваться с book_lore.bf_bomb_5.page.5=увольнением, просто забрал свои шмотки и побежал к холмам. В любом случае, неважно; учитывая отсутствие звонков и грибовидное облако, поднявшееся над моим (теперь уже бывшим) местом работы, они взорвали всё либо перешли в полное распоряжение военных. book_lore.bf_bomb_5.page.6=Есть важное различие между диссекцией и ВИВИСЕКЦИЕЙ, что они явно упустили из виду. Они могут рассекать металлы или атомы сколько угодно, но вторгаться внутрь, вивисекцировать саму реальность – это значит лишь порождать новых докторов Мелфинов. Кто знает! book_lore.bf_bomb_5.page.7=В конце-концов, правительство стремится превратить эту херню в бомбы, может, мы увидим ещё пару войн, ещё пару миллионов людей, встретивших судьбу хуже смерти. Они не могут прятать это вечно. $ $ Меня это не волнует. Теперь не волнует. Боже, пожалуйста, позволь мне вернуться -book_lore.bf_bomb_5.page.8=к настоящей науке. $ $ Черт возьми, Мэй, возьми себя в руки... +book_lore.bf_bomb_5.page.8=к настоящей науке. $ $ Чёрт возьми, Мэй, возьми себя в руки... book_lore.beacon.name=Инструкция по эксплуатированию сигнального маяка book_lore.beacon.author=ФлимФлэм Индастриз book_lore.beacon.page.0=Благодарим вас за покупку светового сигнального маяка мод.2 (версия 1.3)! Этот небольшой буклет содержит краткое введение в работу маяка и его внутреннюю работу. -book_lore.beacon.page.1=Глава 1: Архитектура $ Каждый блок состоит из четырех основных частей: управляющей микросхемы, фонаря, противотуманной сирены и корпуса, в котором расположены остальные части. Для подробного объяснения, пожалуйста, +book_lore.beacon.page.1=Глава 1: Архитектура $ Каждый блок состоит из четырёх основных частей: управляющей микросхемы, фонаря, противотуманной сирены и корпуса, в котором расположены остальные части. Для подробного объяснения, пожалуйста, book_lore.beacon.page.2=обратитесь к принципиальной схеме, расположенной на внутренней стороне крышки для обслуживания корпуса. Фонарь состоит из поликарбонатного корпуса, содержащего двуцветную галогеновую лампу мощностью 250Вт со стандартным 200мм разъёмом, запасные части book_lore.beacon.page.3=для лампы могут быть заказаны из наших магазинов. Не рекомендуется использовать лампы сторонних производителей, поскольку мы не можем гарантировать безопасную работу. Корпус изготовлен из специальной оцинкованной нержавеющей стали и устойчив к атмосферным воздействиям. book_lore.beacon.page.4=Глава 2: Фонарь $ Основное назначение фонаря — освещение для облегчения обслуживания в суровых погодных условиях, а также информирование о состоянии устройства. Если Power-On Self-Test (POST) не пройден, фонарь будет светиться @@ -457,7 +465,7 @@ book_lore.beacon.page.6=Глава 3: Туманный звуковой сигн book_lore.beacon.page.7=Глава 4: Peer-to-peer $ Подробную информацию о связи см. в руководстве по связи. Ниже приводится краткое описание установки P2P-соединения: во-первых, маяк должен подать сигнал «НАЧАТЬ СОЕДИНЕНИЕ», book_lore.beacon.page.8=являющийся одним длинным звуком. Все доступные узлы также должны ответить одним длинным однотонным сигналом (порядок определяется близостью, а также правилами связи, изложенными в руководстве, раздел «Ответ на соединение») book_lore.beacon.page.9=Как только желаемый партнер ответил, подайте сигнал «ПРИНЯТЬ СОЕДИНЕНИЕ» в виде двух длинных тонов, затем партнер также ответит двумя длинными тонами. Вся последующая коммуникация должна происходить с использованием заранее согласованных сигналов, чаще всего -book_lore.beacon.page.10=по стандарту ФАР-5М. Связь прекратится немедленно, если не будет согласован ни один стандарт, что будет служить «пингом». Если связь продолжается, соединение можно завершить, используя еще один длинный тональный сигнал «ЗАВЕРШИТЬ СОЕДИНЕНИЕ». +book_lore.beacon.page.10=по стандарту ФАР-5М. Связь прекратится немедленно, если не будет согласован ни один стандарт, что будет служить «пингом». Если связь продолжается, соединение можно завершить, используя ещё один длинный тональный сигнал «ЗАВЕРШИТЬ СОЕДИНЕНИЕ». book_lore.beacon.page.11=Глава 5: Гарантия $ [страница намеренно оставлена ​​пустой] cannery.f1=[ Нажмите f1 для справки ] @@ -533,7 +541,7 @@ cannery.willow.8=Вскоре растение снова начнет раст cannery.willow.9=Сбор ивовых листьев можно автоматизировать с помощью автоматической бензопилы, она будет ломать только те растения, которые готовы к сбору урожая. cannery.hadron=Ускоритель частиц -cannery.hadron.0=Ускоритель частиц состоит из трех основных частей: Ядро, Камера анализа и набор сверхпроводящих катушек. +cannery.hadron.0=Ускоритель частиц состоит из трёх основных частей: Ядро, Камера анализа и набор сверхпроводящих катушек. cannery.hadron.1=Это компонент ядра ускорителя частиц, который выстреливает частицы с релятивистскими скоростями по катушкам в сторону аналитической камеры cannery.hadron.2=Частицы выбрасываются отсюда cannery.hadron.3=И в круговых ускорителяхвозвращаются сюда @@ -566,6 +574,21 @@ cannery.schottky.7=Если какие-либо виртуальные част cannery.schottky.8=Обратите внимание, что виртуальные частицы никогда не будут использовать один и тот же выход диода дважды. Бесконечные циклы будут неудачными, но повторный вход в диод в остальном будет нормальным cannery.schottky.9=Ваш диод Шоттки для частиц должен быть правильно заключен, со свободными путями для каждого выхода пересечения +chem.hydrogen=Водород +chem.hydrogencoke=Водород из кокса +chem.oxygen=Кислород +chem.xenon=Ксенон +chem.xenonoxy=Ксенон (Охлаждённый) +chem.helium3=Гелий-3 +chem.ethanol=Этанол +chem.biogas=Биогаз +chem.biofuel=Переэтерификация биотоплива +chem.reoil=Регенерированное масло +chem.gasoline=Газолин +chem.tarsand=Битум из битумозного песка +chem.meatprocessing=Переработка мяса глифидов +chem.birkeland=Азотная кислота из воздуха + chem.ARSENIC=Экстракция мышьяка chem.ASPHALT=Производство асфальта chem.BAKELITE=Производство бакелита @@ -607,7 +630,7 @@ chem.FC_DIESEL_KEROSENE=Крекинг дизеля chem.FC_GAS_PETROLEUM=Крекинг попутного газа chem.FC_I_NAPHTHA=Крекинг промышленного масла chem.FC_KEROSENE_PETROLEUM=Крекинг керосина -chem.FP_HEAVYOIL=Переработка тяжелой нефти +chem.FP_HEAVYOIL=Переработка тяжёлой нефти chem.FP_LIGHTOIL=Переработка лёгкой нефти chem.FP_NAPHTHA=Переработка нафты chem.FP_SMEAR=Переработка промышленного масла @@ -673,7 +696,7 @@ chem.VIT_GAS=Остекловывание газообразных ядерны chem.VIT_LIQUID=Остекловывание жидких ядерных отходов chem.XENON=Ксеноновый цикл Линде chem.XENON_OXY=Улучшенный ксеноновый цикл Линде -chem.YELLOWCAKE=Производство йеллоукейка +chem.YELLOWCAKE=Производство жёлтого кека commands.satellite.no_active_satellites=Нет активных спутников! commands.satellite.no_satellite=Спутник не найден! @@ -682,7 +705,8 @@ commands.satellite.satellite_descended=Спутник успешно удалё commands.satellite.satellite_orbited=Спутник запущен. commands.satellite.should_be_run_as_player=Команда должна быть выполнена игроком! -container.ammoBag=Сумка для патрон + +container.ammoBag=Сумка для боеприпасов container.amsBase=Основание АМС [Декор] container.amsEmitter=Излучатель АМС [Декор] container.amsLimiter=Стабилизатор АМС [Декор] @@ -746,7 +770,7 @@ container.generator=Ядерный реактор container.hadron=Ускоритель частиц container.heaterFirebox=Топка container.heaterHeatex=Теплообменник -container.heaterOilburner=Жидкостный бойлер +container.heaterOilburner=Жидкостный котёл container.heaterOven=Нагревательная печь container.hydrotreater=Гидроочиститель container.iGenerator=Промышленный генератор @@ -756,7 +780,10 @@ container.launchPadRusted=Пусковая площадка container.launchTable=Большая пусковая площадка container.leadBox=Защитная коробка container.machineAmmoPress=Пресс для патронов +container.machineAssemblyMachine=Сборочная машина container.machineArcWelder=Дуговой сварщик +container.machineChemicalFactory=Химический завод +container.machineChemicalPlant=Химическая установка container.machineArcFurnaceLarge=Дуговая печь container.machineBoiler=Нагреватель нефти container.machineCMB=Печь для стали Альянса @@ -775,6 +802,7 @@ container.machineITER=Термоядерный реактор container.machineLargeTurbine=Промышленная паровая турбина container.machineLiquefactor=Разжижитель container.machineMixer=Промышленный смеситель +container.machinePUREX=PUREX container.machineOreSlopper=П.Б.Р. container.machinePyroOven=Пиролизная печь container.machineRefinery=Нефтеперерабатывающий завод @@ -821,8 +849,9 @@ container.pumpjack=Станок-качалка container.radGen=Радиационный двигатель container.radar=Радар container.radiobox=FM передатчик -container.radiolysis=РИТЭГ и Камера Радиолиза +container.radiolysis=РИТЭГ и камера радиолиза container.radiorec=FM радио +container.rbmkAutoloader=Автозагрузчик стержней РБМК container.rbmkBoiler=Паровой канал РБМК container.rbmkControl=Регулирующие стержни РБМК container.rbmkControlAuto=Автоматические регулирующие стержни РБМК @@ -835,9 +864,12 @@ container.reactorBreeding=Реактор-размножитель container.reactorControl=Блок удалённого доступа к реактору container.reactorLarge=Большой ядерный реактор container.reactorResearch=Исследовательский реактор +container.rebar=Установщик арматуры container.reix=Мэйнфрейм Rei-X +container.rttyController=Контроллер редстоун-радио container.rtg=РИТЭГ-генератор container.rtgFurnace=РИТЭГ-печь +container.rttyReader=Редстоун-радио считыватель container.rttyCounter=Редстоун-радио счётчик предметов container.rttyLogic=Редстоун-радио логический приёмник container.rttyReceiver=Редстоун-радио приёмник @@ -878,7 +910,7 @@ copytool.invertFilter=Инвертированный фильтр copytool.orientation=Ориентация copytool.pattern0=Красная сторона copytool.pattern1=Оранжевая сторона -copytool.pattern2=Желтая сторона +copytool.pattern2=Жёлтая сторона copytool.pattern3=Зелёная сторона copytool.pattern4=Синяя сторона copytool.pattern5=Фиолетовая сторона @@ -891,7 +923,7 @@ crucible.cdalloy=Производство кадмиевой стали crucible.cmb=Производство стали Альянса crucible.ferro=Производство ферроуранового сплава crucible.hematite=Переплавка гематита в железо -crucible.hss=Производство высокоскоростной стали +crucible.hss=Производство быстрорежущей стали crucible.malachite=Переплавка малахита в медь crucible.magtung=Производство намагниченного вольфрама crucible.redcopper=Производство красной меди @@ -903,9 +935,10 @@ crucible.tcalloy=Производство технециевой стали damage.inset=Сопротивления к при полном наборе: damage.item=Сопротивления к: +damage.category.EN=Энергетическому damage.category.EXPL=Взрывам damage.category.FIRE=Огню -damage.category.PROJ=Снарядам +damage.category.PHYS=Физическому damage.exact.drown=Утоплению damage.exact.fall=Падению damage.exact.LASER=Лазерам @@ -919,7 +952,7 @@ death.attack.amsCore=%1$s испарился в огне сингулярнос death.attack.asbestos=%1$s теперь имеет право на финансовую компенсацию. death.attack.bang=%1$s превратился в рагу. death.attack.blackhole=%1$s превратился в спагетти. -death.attack.blacklung=%1$s умер от болезни черных лёгких. +death.attack.blacklung=%1$s умер от болезни чёрных лёгких. death.attack.blender=%1$s стал фаршем. death.attack.boat=%1$s был пришиблен лодкой. death.attack.boil=%1$s был заживо сварен %2$s. @@ -1013,7 +1046,7 @@ desc.gui.rtg.pellets=Принимаемые пеллеты: desc.gui.rtg.pelletHeat=%s (%s тепла) desc.gui.rtg.pelletPower=%s (%s HE/тик) desc.gui.template=§9Шаблоны§r$Шаблоны могут быть сделаны$в Папке шаблонов машин. -desc.gui.turbinegas.automode=§2Автоматический режим турбины§r$Нажав кнопку "AUTO", турбина автоматически$отрегулирует выработку электроэнергии$в зависимости от мощности, требуемой от сети +desc.gui.turbinegas.automode=§2Автоматический режим турбины§r$Нажав кнопку "AUTO", турбина автоматически$отрегулирует позицию регулятора$в зависимости от требуемой мощности сети$и количества оставшегося топлива desc.gui.turbinegas.fuels=§6Принимаемое топливо: desc.gui.turbinegas.warning=§cНизкий уровень топлива или смазки!§r desc.gui.zirnox.coolant=§3Охлаждение§r$CO2 перемещает тепло из активной зоны в воду.$Вода будет нагреваться до перегретого пара.$Эффективность охлаждения и производства пара$зависит от давления. @@ -1194,6 +1227,8 @@ entity.hbm.entity_bullet.name=Пуля entity.hbm.entity_rocket.name=Ракета entity.hbm.entity_schrabnel.name=Шрапнель +error.generic=### Я ОШИБКА ### + excavator.crusher=Включить измельчитель excavator.drill=Включить бур excavator.silktouch=Включить шёлковое касание @@ -1223,6 +1258,28 @@ geiger.playerRes=Защищённость игрока: geiger.title=СЧЁТЧИК ГЕЙГЕРА geiger.title.dosimeter=ДОЗИМЕТР +general.na=Н/Д + +gui.recipe.duration=Длительность +gui.recipe.consumption=Потребление +gui.recipe.input=Вход +gui.recipe.output=Выход +gui.recipe.atPressure=при давлении в +gui.recipe.setRecipe=Нажмите, чтобы выбрать рецепт + +gui.weapon.ammo=Боеприпасы +gui.weapon.baseDamage=Базовый урон +gui.weapon.damageWithAmmo=Урон с текущими боеприпасами +gui.weapon.condition=Состояние +gui.weapon.accepts=Принимает +gui.weapon.quality.aside=Стандартный арсенал +gui.weapon.quality.bside=Би-Сайд +gui.weapon.quality.legendary=Легендарное оружие +gui.weapon.quality.special=Специальное оружие +gui.weapon.quality.utility=Утилитарное +gui.weapon.quality.secret=СЕКРЕТНОЕ +gui.weapon.quality.debug=ОТЛАДКА + gun.make.ARMALITE=Armalite gun.make.AUTO_ORDINANCE=Корпорация Авто-Орденс gun.make.BAE=БАЕ Системс @@ -1394,7 +1451,9 @@ hazard.particleCoarse=Частиц, находящихся в воздухе hazard.particleFine=Твердых частиц hazard.sand=Раздражителей глаз -hbm.key=NTM Hotkeys +hbm.key.ability=Переключение способностей инструмента +hbm.key.abilityAlt=Изменить способности инструмента +hbm.key=NTM Хоткеи hbm.key.calculator=Калькулятор hbm.key.copyToolAlt=Устройство настройки: Переключить вставку hbm.key.copyToolCtrl=Устройство настройки: Применить к трубам @@ -1407,6 +1466,7 @@ hbm.key.dash=Рывок hbm.key.gunPrimary=Основной огонь hbm.key.gunSecondary=Альтернативный огонь hbm.key.gunTertitary=Переключить прицел +hbm.key.toggleMagnet=Вкл/выкл магнит hbm.key.toggleBack=Включить ранец hbm.key.toggleHUD=Включить HUD hbm.key.trainInv=Открыть инвентарь поезда @@ -1437,6 +1497,7 @@ hbmfluid.coalgas=Угольный газ hbmfluid.coalgas_leaded=Этилированный угольный газ hbmfluid.coaloil=Фотоген hbmfluid.colloid=Коллоидный раствор +hbmfluid.concrete=Жидкий бетон hbmfluid.coolant=Хладагент hbmfluid.coolant_hot=Горячий хладагент hbmfluid.crackoil=Крекированная нефть @@ -1446,8 +1507,8 @@ hbmfluid.death=Осмиридовый раствор hbmfluid.deuterium=Дейтерий hbmfluid.diesel=Дизель hbmfluid.diesel_crack=Крекированный дизель -hbmfluid.diesel_crack_reform=Высокооктановый крекированный дизель -hbmfluid.diesel_reform=Высокооктановый дизель +hbmfluid.diesel_crack_reform=Высокоцетановый крекированный дизель +hbmfluid.diesel_reform=Высокоцетановый дизель hbmfluid.egg=Растворенное яйцо hbmfluid.estradiol=Раствор эстрадиола hbmfluid.ethanol=Этанол @@ -1461,7 +1522,7 @@ hbmfluid.gasoline=Газолин hbmfluid.gasoline_leaded=Этилированный газолин hbmfluid.heatingoil=Мазут hbmfluid.heatingoil_vacuum=Тяжёлый мазут -hbmfluid.heavyoil=Тяжелая нефть +hbmfluid.heavyoil=Тяжёлая нефть hbmfluid.heavyoil_vacuum=Вакуумная тяжёлая нефть hbmfluid.heavywater=Тяжёлая вода hbmfluid.heavywater_hot=Горячая тяжёлая вода @@ -1487,8 +1548,8 @@ hbmfluid.lpg=Сжиженный попутный газ (СПГ) hbmfluid.lubricant=Машинная смазка hbmfluid.lye=Щёлок hbmfluid.mercury=Ртуть -hbmfluid.mug=Пиво "Mug Root" -hbmfluid.mug_hot=Горячее пиво "Mug Root" +hbmfluid.mug=Квас "Царские Припасы" +hbmfluid.mug_hot=Горячий квас "Царские Припасы" hbmfluid.mustardgas=Иприт hbmfluid.naphtha=Нафта hbmfluid.naphtha_coker=Коксовая нафта @@ -1504,9 +1565,9 @@ hbmfluid.oil_ds=Десульфуризованная неочищенная не hbmfluid.oxygen=Жидкий кислород hbmfluid.oxyhydrogen=Гремучий газ hbmfluid.pain=Пандемониум(III)Раствор танталита -hbmfluid.perfluoromethyl=Перфторометил -hbmfluid.perfluoromethyl_cold=Холодный перфторометил -hbmfluid.perfluoromethyl_hot=Горячий перфторометил +hbmfluid.perfluoromethyl=Перфторометан +hbmfluid.perfluoromethyl_cold=Холодный перфторометан +hbmfluid.perfluoromethyl_hot=Горячий перфторометан hbmfluid.peroxide=Пероксид водорода hbmfluid.petroil=Бензин hbmfluid.petroil_leaded=Этилированный бензин @@ -1543,13 +1604,13 @@ hbmfluid.solvent=Растворитель hbmfluid.sourgas=Кислый газ hbmfluid.spentsteam=Пар низкого давления hbmfluid.steam=Пар -hbmfluid.stellar_flux=Звёздный флюс +hbmfluid.stellar_flux=Звёздный поток hbmfluid.sulfuric_acid=Серная кислота hbmfluid.sunfloweroil=Подсолнечное масло hbmfluid.superhotsteam=Перегретый пар hbmfluid.syngas=Синтгаз hbmfluid.thorium_salt=Жидкая ториевая соль -hbmfluid.thorium_salt_depleted=Обедненная жидкая ториевая соль +hbmfluid.thorium_salt_depleted=Обеднённая жидкая ториевая соль hbmfluid.thorium_salt_hot=Горячая жидкая ториевая соль hbmfluid.tritium=Тритий hbmfluid.uf6=Гексафторид урана @@ -1566,9 +1627,9 @@ hbmfluid.xpjuice=Жидкий опыт hbmfluid.xylene=Бензол-толуол-ксилол (BTX) hbmpseudofluid.none=Пусто -hbmpseudofluid.heuf6=Высокообогащенный UF6 -hbmpseudofluid.meuf6=Среднеобогащенный UF6 -hbmpseudofluid.leuf6=Низкообогащенный UF6 +hbmpseudofluid.heuf6=Высокообогащённый UF6 +hbmpseudofluid.meuf6=Среднеобогащённый UF6 +hbmpseudofluid.leuf6=Низкообогащённый UF6 hbmpseudofluid.nuf6=Природный UF6 hbmpseudofluid.pf6=Гексафторид плутония hbmpseudofluid.mud_heavy=Тяжёлая осадочная фракция @@ -1609,7 +1670,7 @@ hbmmat.cryolite=Криолит hbmmat.desh=Деш hbmmat.diamond=Алмаз hbmmat.dineutronium=Динейтроний -hbmmat.durasteel=Высокоскоростная сталь +hbmmat.durasteel=Быстрорежущая сталь hbmmat.emerald=Изумруд hbmmat.euphemium=Эвфемий hbmmat.ferrouranium=Ферроуран @@ -1623,7 +1684,7 @@ hbmmat.graphene=Графен hbmmat.graphite=Графит hbmmat.gunmetal=Пушечная бронза hbmmat.hematite=Гематит -hbmmat.iron=Железа +hbmmat.iron=Железо hbmmat.lanthanum=Лантан hbmmat.lapis=Лазурит hbmmat.lead=Свинец @@ -1796,18 +1857,19 @@ item.ammo_50ae_ap.name=Патрон калибра .50 AE (Бронебойны item.ammo_50ae_chlorophyte.name=Патрон калибра .50 AE (Хлорофит) item.ammo_50ae_du.name=Патрон калибра .50 AE (ДУ) item.ammo_50ae_star.name=Патрон калибра .50 AE (Звёздный металл) -item.ammo_50bmg.name=Крупнокалиберный патрон .50 BMG -item.ammo_50bmg_ap.name=Крупнокалиберный патрон .50 BMG (Бронебойный) -item.ammo_50bmg_chlorophyte.name=Крупнокалиберный патрон .50 BMG (Хлорофит) -item.ammo_50bmg_du.name=Крупнокалиберный патрон .50 BMG (ДУ) -item.ammo_50bmg_explosive.name=Крупнокалиберный патрон .50 BMG (Взрывной) -item.ammo_50bmg_flechette.name=Игольчатый .50 BMG патрон -item.ammo_50bmg_flechette_am.name=Игольчатый .50 BMG патрон (Америций) -item.ammo_50bmg_flechette_po.name=Игольчатый .50 BMG патрон (Полоний) -item.ammo_50bmg_incendiary.name=Крупнокалиберный патрон .50 BMG (Зажигательный) -item.ammo_50bmg_phosphorus.name=Крупнокалиберный патрон .50 BMG (БФ) -item.ammo_50bmg_sleek.name=Крупнокалиберный патрон .50 BMG (IF-R&D) -item.ammo_50bmg_star.name=Крупнокалиберный патрон .50 BMG (Звёздный металл) +item.ammo_50bmg.name=Патрон калибра .50 BMG +item.ammo_50bmg_ap.name=Патрон калибра .50 BMG (Бронебойный) +item.ammo_50bmg_chlorophyte.name=Патрон калибра .50 BMG (Хлорофит) +item.ammo_50bmg_du.name=Патрон калибра .50 BMG (ДУ) +item.ammo_50bmg_explosive.name=Патрон калибра .50 BMG (Взрывной) +item.ammo_50bmg_flechette.name=Игольчатый патрон калибра .50 BMG +item.ammo_50bmg_flechette_am.name=Игольчатый патрон калибра .50 BMG (Америций) +item.ammo_50bmg_flechette_po.name=Игольчатый патрон калибра .50 BMG (Полоний) +item.ammo_50bmg_incendiary.name=Патрон калибра .50 BMG (Зажигательный) +item.ammo_50bmg_phosphorus.name=Патрон калибра .50 BMG (БФ) +item.ammo_50bmg_sleek.name=Патрон калибра .50 BMG (IF-R&D) +item.ammo_50bmg_star.name=Патрон калибра .50 BMG (Звёздный металл) +item.ammo_secret.bmg50_black.name=Патрон калибра .50 BMG (Простреливающий) item.ammo_556.name=5.56мм патрон item.ammo_556_ap.name=5.56мм патрон (Бронебойный) item.ammo_556_chlorophyte.name=5.56мм патрон (Хлорофит) @@ -1858,7 +1920,7 @@ item.ammo_bag_infinite.name=Бесконечная сумка для боепр item.ammo_arty_phosphorus_multi.name=Фосфорный 16-дюймовый мульти-снаряд item.ammo_cell.name=Энерго-патроны item.ammo_coilgun.name=Вольфрамовый шар для гаусс-пушки -item.ammo_coilgun_du.name=Ферроураниевый шар для гаусс-пушки +item.ammo_coilgun_du.name=Ферроурановый шар для гаусс-пушки item.ammo_coilgun_rubber.name=Резиновый шар для гаусс-пушки item.ammo_container.name=Контейнер с боеприпасами item.ammo_dart.name=Пластиковый дротик (Иссущающий) @@ -1929,12 +1991,13 @@ item.ammo_shell_apfsds_du.name=240мм APFSTS-DU item.ammo_shell_apfsds_t.name=240мм APFSTS-T item.ammo_shell_explosive.name=240мм Фугасный снаряд item.ammo_shell_w9.name=240мм Ядерный снаряд W9 -item.ammo_secret.bmg50_equestrian.name=.50 BMG патрон Разрушитель +item.ammo_secret.bmg50_equestrian.name=Патрон калибра .50 BMG (Разрушитель) item.ammo_secret.folly_nuke.name=Серебрянная пуля, ядерная item.ammo_secret.folly_sm.name=Серебрянная пуля item.ammo_secret.g12_equestrian.name=12-й калибр Railway Spike Shot item.ammo_secret.m44_equestrian.name=.44 магнум Разрыватель голов item.ammo_secret.p35_800.name=.35-800 V9 +item.ammo_secret.p35_800_bl.name=.35-800 V9 (Чёрная Молния) item.ammo_standard.b75.name=.75 болт item.ammo_standard.b75_exp.name=.75 болт (Взрывной) item.ammo_standard.b75_inc.name=.75 болт (Зажигательный) @@ -1942,13 +2005,17 @@ item.ammo_standard.bmg50_ap.name=.50 BMG патрон (Бронебойный) item.ammo_standard.bmg50_he.name=.50 BMG патрон (Разрывной) item.ammo_standard.bmg50_du.name=.50 BMG патрон (Обеднённый уран) item.ammo_standard.bmg50_fmj.name=.50 BMG патрон (Цельнометаллическая оболочка) +item.ammo_standard.bmg50_sm.name=.50 BMG патрон (Звёздный Металл) item.ammo_standard.bmg50_jhp.name=.50 BMG патрон (Экспансивный+) item.ammo_standard.bmg50_sp.name=.50 BMG патрон (Экспансивный) -item.ammo_standard.capacitor.name=Конденсатор -item.ammo_standard.capacitor_ir.name=Конденсатор (Низкая длина волны) -item.ammo_standard.capacitor_overcharge.name=Конденсатор (Перезаряженный) -item.ammo_standard.coil_ferrouranium.name=Ферроураниевый шарик гаусс-пушки +item.ammo_standard.capacitor.name=Оружейный конденсатор (Стандартный) +item.ammo_standard.capacitor_ir.name=Оружейный конденсатор (Коротковолновой) +item.ammo_standard.capacitor_overcharge.name=Оружейный конденсатор (Перегруженный) +item.ammo_standard.coil_ferrouranium.name=Ферроурановый шарик гаусс-пушки item.ammo_standard.coil_tungsten.name=Вольфрамовый шарик гаусс-пушки +item.ammo_standard.ct_hook.name=Крюк-кошка +item.ammo_standard.ct_mortar.name=Разрывной снаряд +item.ammo_standard.ct_mortar_charge.name=Тяжёлый разрывной снаряд item.ammo_standard.flame_balefire.name=Топливо огнемёта (Жар-пламя) item.ammo_standard.flame_diesel.name=Топливо огнемёта (Дизель) item.ammo_standard.flame_gas.name=Топливо огнемёта (Газ) @@ -1976,46 +2043,47 @@ item.ammo_standard.g40_he.name=40мм граната (Фугасная) item.ammo_standard.g40_heat.name=40мм граната (Кумулятивная) item.ammo_standard.g40_inc.name=40мм граната (Зажигательная) item.ammo_standard.g40_phosphorus.name=40мм граната (Белый фосфор) -item.ammo_standard.m357_ap.name=.357 magnum (Бронебойный) -item.ammo_standard.m357_bp.name=.357 magnum (Чёрный порох) -item.ammo_standard.m357_express.name=.357 magnum (Высокомощная цельнометаллическая оболочка) -item.ammo_standard.m357_fmj.name=.357 magnum (Цельнометаллическая оболочка) -item.ammo_standard.m357_jhp.name=.357 magnum (Экспансивный+) -item.ammo_standard.m357_sp.name=.357 magnum (Экспансивный) -item.ammo_standard.m44_ap.name=.44 magnum (Бронебойный) -item.ammo_standard.m44_bp.name=.44 magnum (Чёрный порох) -item.ammo_standard.m44_express.name=.44 magnum (Высокомощная цельнометаллическая оболочка) -item.ammo_standard.m44_fmj.name=.44 magnum (Цельнометаллическая оболочка) -item.ammo_standard.m44_jhp.name=.44 magnum (Экспансивный+) -item.ammo_standard.m44_sp.name=.44 magnum (Экспансивный) +item.ammo_standard.m357_ap.name=Патрон .357 магнум (Бронебойный) +item.ammo_standard.m357_bp.name=Патрон .357 магнум (Чёрный порох) +item.ammo_standard.m357_express.name=Патрон .357 магнум (Высокомощная цельнометаллическая оболочка) +item.ammo_standard.m357_fmj.name=Патрон .357 магнум (Цельнометаллическая оболочка) +item.ammo_standard.m357_jhp.name=Патрон .357 магнум (Экспансивный+) +item.ammo_standard.m357_sp.name=Патрон .357 магнум (Экспансивный) +item.ammo_standard.m44_ap.name=Патрон .44 магнум (Бронебойный) +item.ammo_standard.m44_bp.name=Патрон .44 магнум (Чёрный порох) +item.ammo_standard.m44_express.name=Патрон .44 магнум (Высокомощная цельнометаллическая оболочка) +item.ammo_standard.m44_fmj.name=Патрон .44 магнум (Цельнометаллическая оболочка) +item.ammo_standard.m44_jhp.name=Патрон .44 магнум (Экспансивный+) +item.ammo_standard.m44_sp.name=Патрон .44 магнум (Экспансивный) +item.ammo_standard.nuke_balefire.name=Ядерный минизаряд (Жар-яйцо) item.ammo_standard.nuke_demo.name=Ядерный минизаряд (Разрушающий) item.ammo_standard.nuke_high.name=Ядерный минизаряд (Высокомощный) -item.ammo_standard.nuke_hive.name=Rocket Hive +item.ammo_standard.nuke_hive.name=Ракетный рой item.ammo_standard.nuke_standard.name=Ядерный минизаряд item.ammo_standard.nuke_tots.name=Ядерный минизаряд (Карапузы) -item.ammo_standard.p22_ap.name=.22 LR патрон (Бронебойный) -item.ammo_standard.p22_fmj.name=.22 LR патрон (Цельнометаллическая оболочка) -item.ammo_standard.p22_jhp.name=.22 LR патрон (Экспансивный+) -item.ammo_standard.p22_sp.name=.22 LR патрон (Экспансивный) -item.ammo_standard.p45_ap.name=.45 патрон (Бронебойный) -item.ammo_standard.p45_du.name=.45 патрон (Depleted Uranium) -item.ammo_standard.p45_fmj.name=.45 патрон (Цельнометаллическая оболочка) -item.ammo_standard.p45_jhp.name=.45 патрон (Экспансивный+) -item.ammo_standard.p45_sp.name=.45 патрон (Экспансивный) -item.ammo_standard.p9_ap.name=9мм патрон (Бронебойный) -item.ammo_standard.p9_fmj.name=9мм патрон (Цельнометаллическая оболочка) -item.ammo_standard.p9_jhp.name=9мм патрон (Экспансивный+) -item.ammo_standard.p9_sp.name=9мм патрон (Экспансивный) -item.ammo_standard.r556_ap.name=5.56мм патрон (Бронебойный) -item.ammo_standard.r556_fmj.name=5.56мм патрон (Цельнометаллическая оболочка) -item.ammo_standard.r556_jhp.name=5.56мм патрон (Экспансивный+) -item.ammo_standard.r556_sp.name=5.56мм патрон (Экспансивный) -item.ammo_standard.r762_ap.name=7.62мм патрон (Бронебойный) -item.ammo_standard.r762_du.name=7.62мм патрон (Обеднённый уран) -item.ammo_standard.r762_fmj.name=7.62мм патрон (Цельнометаллическая оболочка) -item.ammo_standard.r762_he.name=7.62mm патрон (Разрывной) -item.ammo_standard.r762_jhp.name=7.62мм патрон (Экспансивный+) -item.ammo_standard.r762_sp.name=7.62мм патрон (Экспансивный) +item.ammo_standard.p22_ap.name=Патрон .22 LR (Бронебойный) +item.ammo_standard.p22_fmj.name=Патрон .22 LR (Цельнометаллическая оболочка) +item.ammo_standard.p22_jhp.name=Патрон .22 LR (Экспансивный+) +item.ammo_standard.p22_sp.name=Патрон .22 LR (Экспансивный) +item.ammo_standard.p45_ap.name=Патрон .45 (Бронебойный) +item.ammo_standard.p45_du.name=Патрон .45 (Обеднённый уран) +item.ammo_standard.p45_fmj.name=Патрон .45 (Цельнометаллическая оболочка) +item.ammo_standard.p45_jhp.name=Патрон .45 (Экспансивный+) +item.ammo_standard.p45_sp.name=Патрон .45 (Экспансивный) +item.ammo_standard.p9_ap.name=9мм-ый патрон (Бронебойный) +item.ammo_standard.p9_fmj.name=9мм-ый патрон (Цельнометаллическая оболочка) +item.ammo_standard.p9_jhp.name=9мм-ый патрон (Экспансивный+) +item.ammo_standard.p9_sp.name=9мм-ый патрон (Экспансивный) +item.ammo_standard.r556_ap.name=Патрон 5.56мм (Бронебойный) +item.ammo_standard.r556_fmj.name=Патрон 5.56мм (Цельнометаллическая оболочка) +item.ammo_standard.r556_jhp.name=Патрон 5.56мм (Экспансивный+) +item.ammo_standard.r556_sp.name=Патрон 5.56мм (Экспансивный) +item.ammo_standard.r762_ap.name=Патрон 7.62мм (Бронебойный) +item.ammo_standard.r762_du.name=Патрон 7.62мм (Обеднённый уран) +item.ammo_standard.r762_fmj.name=Патрон 7.62мм (Цельнометаллическая оболочка) +item.ammo_standard.r762_he.name=Патрон 7.62мм (Разрывной) +item.ammo_standard.r762_jhp.name=Патрон 7.62мм (Экспансивный+) +item.ammo_standard.r762_sp.name=Патрон 7.62мм (Экспансивный) item.ammo_standard.rocket_demo.name=Ракета (Разрушающая) item.ammo_standard.rocket_he.name=Ракета (Фугасная) item.ammo_standard.rocket_heat.name=Ракета (Кумулятивная) @@ -2062,16 +2130,16 @@ item.ams_muzzle.desc=...он испускает штуковину с энерг item.analysis_tool.name=Анализатор item.analyzer.name=Анализатор item.anchor_remote.name=Устройство вызова -item.apple_euphemium.name=Эвфемиевое Яблоко +item.apple_euphemium.name=Эвфемиевое яблоко item.apple_lead.name=Свинцовое яблоко -item.apple_schrabidium.name=Шрабидиевое Яблоко +item.apple_schrabidium.name=Шрабидиевое яблоко item.arc_electrode.name=Графитовый электрод item.arc_electrode.desh.name=Деш-электрод item.arc_electrode.graphite.name=Графитовый электрод item.arc_electrode.lanthanium.name=Лантановый электрод item.arc_electrode.saturnite.name=Сатурнитовый электрод item.arc_electrode_burnt.name=Расплавленный электрод -item.arc_electrode_burnt.desh.name=Расплавленный Деш-электрод +item.arc_electrode_burnt.desh.name=Расплавленный деш-электрод item.arc_electrode_burnt.graphite.name=Расплавленный графитовый электрод item.arc_electrode_burnt.lanthanium.name=Расплавленный лантановый электрод item.arc_electrode_burnt.saturnite.name=Расплавленный сатурнитовый электрод @@ -2155,8 +2223,8 @@ item.battery_spark.name=Спарк-батарея item.battery_spark_cell_100.name=Спарк-Магический массив хранения энергии item.battery_spark_cell_1000.name=Спарк-Магическая масс-энергетическая пустота item.battery_spark_cell_10000.name=Устойчивый пространственно-временной спарк-кристалл -item.battery_spark_cell_25.name=Спарк-Магический аккумулятор -item.battery_spark_cell_2500.name=Спарк-Магическое море Дирака +item.battery_spark_cell_25.name=Спарк-магический аккумулятор +item.battery_spark_cell_2500.name=Спарк-магическое море Дирака item.battery_spark_cell_6.name=Спарк-энергоячейка item.battery_spark_cell_power.name=Абсурдный физический спарк-блок накопления энергии item.battery_steam.name=Паровой бак для хранения энергии @@ -2166,13 +2234,13 @@ item.battery_su_l.name=Большая одноразовая батарейка item.battery_trixite.name=Безымянная спарк-батарея item.bdcl.name=BDCL item.bedrock_ore.grade.base.name=Бедроковая руда (%s) -item.bedrock_ore.grade.base_roasted.name=Обожженная бедроковая руда (%s) +item.bedrock_ore.grade.base_roasted.name=Обожжённая бедроковая руда (%s) item.bedrock_ore.grade.base_washed.name=Промытая бедроковая руда (%s) item.bedrock_ore.grade.primary.name=Бедроковая руда (%s), первичная фракция -item.bedrock_ore.grade.primary_roasted.name=Бедроковая руда (%s), обожженная первичная фракция +item.bedrock_ore.grade.primary_roasted.name=Бедроковая руда (%s), обожжённая первичная фракция item.bedrock_ore.grade.primary_sulfuric.name=Бедроковая руда (%s), серная первичная фракция item.bedrock_ore.grade.primary_nosulfuric.name=Бедроковая руда (%s), отделённая серная первичная фракция -item.bedrock_ore.grade.primary_solvent.name=Бедроковая руда (%s), растворенная первичная фракция +item.bedrock_ore.grade.primary_solvent.name=Бедроковая руда (%s), растворённая первичная фракция item.bedrock_ore.grade.primary_nosolvent.name=Бедроковая руда (%s), отделённая растворенная первичная фракция item.bedrock_ore.grade.primary_rad.name=Бедроковая руда (%s), очищенная первичная фракция item.bedrock_ore.grade.primary_norad.name=Бедроковая руда (%s), отделённая очищенная первичная фракция @@ -2180,15 +2248,15 @@ item.bedrock_ore.grade.primary_first.name=Бедроковая руда (%s), п item.bedrock_ore.grade.primary_second.name=Бедроковая руда (%s), первичная фракция, малый вес item.bedrock_ore.grade.crumbs.name=Куски бедроковой руды (%s) item.bedrock_ore.grade.sulfuric_byproduct.name=Бедроковая руда (%s), серная побочка -item.bedrock_ore.grade.sulfuric_roasted.name=Бедроковая руда (%s), обожженная серная побочка +item.bedrock_ore.grade.sulfuric_roasted.name=Бедроковая руда (%s), обожжённая серная побочка item.bedrock_ore.grade.sulfuric_arc.name=Бедроковая руда (%s), переплавленная серная побочка item.bedrock_ore.grade.sulfuric_washed.name=Бедроковая руда (%s), промытая серная побочка -item.bedrock_ore.grade.solvent_byproduct.name=Бедроковая руда (%s), растворенная побочка -item.bedrock_ore.grade.solvent_roasted.name=Бедроковая руда (%s), обожженная растворенная побочка +item.bedrock_ore.grade.solvent_byproduct.name=Бедроковая руда (%s), растворённая побочка +item.bedrock_ore.grade.solvent_roasted.name=Бедроковая руда (%s), обожжённая растворенная побочка item.bedrock_ore.grade.solvent_arc.name=Бедроковая руда (%s), переплавленная растворенная побочка item.bedrock_ore.grade.solvent_washed.name=Бедроковая руда (%s), промытая растворенная побочка item.bedrock_ore.grade.rad_byproduct.name=Бедроковая руда (%s), очищенная побочка -item.bedrock_ore.grade.rad_roasted.name=Бедроковая руда (%s), обожженная очищенная побочка +item.bedrock_ore.grade.rad_roasted.name=Бедроковая руда (%s), обожжённая очищенная побочка item.bedrock_ore.grade.rad_arc.name=Бедроковая руда (%s), переплавленная очищенная побочка item.bedrock_ore.grade.rad_washed.name=Бедроковая руда (%s), промытая очищенная побочка item.bedrock_ore.trait.arc=§6Дуговая плавка @@ -2200,7 +2268,7 @@ item.bedrock_ore.trait.sulfuric=§6Обработанный серной кис item.bedrock_ore.trait.washed=§bПромытый в окислителе водой item.bedrock_ore.type.actinide.name=Актинидная item.bedrock_ore.type.crystal.name=Кристаллическая -item.bedrock_ore.type.heavy.name=Тяжелая металлическая +item.bedrock_ore.type.heavy.name=Тяжёлая металлическая item.bedrock_ore.type.light.name=Лёгкая металлическая item.bedrock_ore.type.nonmetal.name=Неметаллическая item.bedrock_ore.type.rare.name=Редкоземельная @@ -2223,29 +2291,29 @@ item.billet_bismuth.name=Заготовка висмута item.billet_co60.name=Заготовка кобальта-60 item.billet_cobalt.name=Заготовка кобальта item.billet_flashlead.name=Заготовка флэшлида -item.billet_flashlead.desc=Решетка распадается, вызывая реакции аннигиляции антивещества и материи, вызывая высвобождение$пионов, распадающихся на мюоны, катализирующих слияние$ядер, создавая новый элемент.$Пожалуйста, постарайся не отставать. +item.billet_flashlead.desc=Решётка распадается, вызывая реакции аннигиляции антивещества и материи, вызывая высвобождение$пионов, распадающихся на мюоны, катализирующих слияние$ядер, создавая новый элемент.$Пожалуйста, постарайся не отставать. item.billet_gh336.name=Заготовка гиорсия-336 item.billet_gh336.desc=Коллега Сиборгиума. -item.billet_hes.name=Заготовка высокообогащенного шрабидиевого топлива -item.billet_les.name=Заготовка низкообогащенного шрабидиевого топлива +item.billet_hes.name=Заготовка высокообогащённого шрабидиевого топлива +item.billet_les.name=Заготовка низкообогащённого шрабидиевого топлива item.billet_mox_fuel.name=Заготовка МОКС-топлива item.billet_mox_fuel.desc=Карманный Мокси! item.billet_neptunium.name=Заготовка нептуния item.billet_neptunium_fuel.name=Заготовка нептуниевого топлива item.billet_nuclear_waste.name=Заготовка ядерных отходов item.billet_pb209.name=Заготовка свинца-209 -item.billet_po210be.name=Заготовка Полоний-210-Бериллия +item.billet_po210be.name=Заготовка полоний-210-бериллия item.billet_polonium.name=Заготовка полония-210 item.billet_pu_mix.name=Заготовка плутония реакторного качества item.billet_pu238.name=Заготовка плутония-238 -item.billet_pu238be.name=Заготовка Плутоний-210-Бериллия +item.billet_pu238be.name=Заготовка плутоний-238-бериллия item.billet_pu239.name=Заготовка плутония-239 item.billet_pu240.name=Заготовка плутония-240 item.billet_pu241.name=Заготовка плутония-241 item.billet_plutonium.name=Заготовка плутония item.billet_plutonium_fuel.name=Заготовка плутониевого топлива item.billet_ra226.name=Заготовка радия-226 -item.billet_ra226be.name=Заготовка Радий-226-Бериллия +item.billet_ra226be.name=Заготовка радий-226-бериллия item.billet_schrabidium.name=Заготовка шрабидия item.billet_schrabidium_fuel.name=Заготовка шрабидиевого топлива item.billet_silicon.name=Кремниевая пластина @@ -2289,6 +2357,8 @@ item.blades_desh.name=Деш-лезвия измельчителя item.blades_steel.name=Стальные лезвия измельчителя item.blades_titanium.name=Титановые лезвия измельчителя item.blowtorch.name=Паяльная лампа +item.blueprint_folder.name=Буклет чертежей +item.blueprints.name=Чертежи item.board_copper.name=Медная панель item.boat_rubber.name=Резиновая лодка item.bobmazon.name=Bobmazon @@ -2298,11 +2368,12 @@ item.bobmazon_materials.name=Бобмазон: Материалы item.bobmazon_tools.name=Бобмазон: Предметы item.bobmazon_weapons.name=Бобмазон: Оружие и взрывчатка item.boltntm.name=Стержень (%s) -item.bolt_compound.name=Укрепленный вал турбины +item.bolt_compound.name=Укреплённый вал турбины item.bolt_spike.name=Железнодорожный гвоздь item.bolt_spike.desc=Излучает угрожающую ауру, как-то item.boltgun.name=Пневматический заклепочник item.bomb_caller.name=Устройство для обозначения авиаудара +item.bomb_part.used_in=Используется в: item.bomb_waffle.name=Вафля массового поражения item.book_guide.name=Руководство item.book_of_.name=Книга Вагонов @@ -2344,9 +2415,9 @@ item.can_breen.name=Личный резерв др.Брина item.can_creature.name=Энергетический напиток "Существо" item.can_empty.name=Пустая банка item.can_key.name=Винтовой ключ -item.can_luna.name=Черная Меза Луна - Темная Кола +item.can_luna.name=Чёрная Меза луна - Тёмная кола item.can_mrsugar.name=Безалкогольный напиток 'Доктор Сахар' -item.can_mug.name=MUG Root Beer +item.can_mug.name=Квас "Царские Припасы" item.can_overcharge.name=Перезарядка Delirium XT item.can_redbomb.name=Энергетический напиток "Красная Бомба" item.can_smart.name=Энергетический напиток “Смарт” @@ -2363,7 +2434,7 @@ item.canister_full.name=Канистра: item.canister_gasoline.name=Канистра с этилированным бензином (LEGACY) item.canister_gasoline.desc=свинец - это друг$впусти друга в свой кровоток$*достаёт пистолет* живо. item.canister_heatingoil.name=Канистра с мазутом (LEGACY) -item.canister_heavyoil.name=Канистра с тяжелой нефтью (LEGACY) +item.canister_heavyoil.name=Канистра с тяжёлой нефтью (LEGACY) item.canister_kerosene.name=Канистра с керосином (LEGACY) item.canister_lightoil.name=Канистра с лёгкой нефтью (LEGACY) item.canister_napalm.name=Напалм Б @@ -2380,7 +2451,7 @@ item.canned_bark.name=Консервы вяленой сосновой коры item.canned_bark.desc=Очень хрустящие! item.canned_beef.name=Консервированная говядина item.canned_beef.desc=Несколько веков назад для этого умерла корова. -item.canned_bhole.name=Консервированная черная дыра +item.canned_bhole.name=Консервированная чёрная дыра item.canned_bhole.desc=Сингулярность это ням ням в моём там там item.canned_cheese.name=Консервированный плавленый сыр item.canned_cheese.desc=Это сыр? Это резиновый цемент? Кто знает. Кого волнует. @@ -2408,14 +2479,14 @@ item.canned_napalm.name=Консервированный напалм item.canned_napalm.desc=Люблю запах старых мемов по утрам. item.canned_oil.name=Консервированное моторное масло item.canned_oil.desc=Заставляет мотор работать, почему не может и людей? -item.canned_pashtet.name=Паштет -item.canned_pashtet.desc=услуги перевода недоступны! +item.canned_pashtet.name=Pate +item.canned_pashtet.desc=Translation services are not available! item.canned_pizza.name=Консервированная пицца item.canned_pizza.desc=Преступление против человечества. item.canned_recursion.name=Консервированная рекурсия item.canned_recursion.desc=Консервированная рекурсия item.canned_spam.name=Консервы “Спам” -item.canned_spam.desc=Действие трехминутного скетча разворачивается в вымышленном кафе$"Зеленый Карлик" в Бромли. Разгорается спор между официанткой, читающей$меню, в котором почти каждое блюдо содержит спам, и миссис Бун, которая$не любит спам. Она заказывает блюдо без спама, что вызывает удивление$у её мужа, обожающего спам. Официантка с раздражением отвечает на этот$заказ. Мистер Бун предлагает забрать ее спам и заказывает блюдо с большим$количеством спама и запеченной фасолью. Официантка отвечает "нет", так как$фасоль закончилась; когда мистер Бун спрашивает о замене спама, официантка$снова реагирует с отвращением. В какой-то момент группа викингов в ресторане$перебивает разговор громким пением о спаме. Разъяренная официантка приказывает$им замолчать, но они продолжают петь еще громче. Венгерский турист подходит к$стойке, пытаясь сделать заказ с помощью абсолютно неточного венгерско-английского$разговорника (отсылка к предыдущему скетчу). Его быстро выводит полицейский.$Скетч резко переходит к историку в теле-студии, который рассказывает о$происхождении викингов в кафе. По мере того как он продолжает, он все чаще$вставляет слово "спам" в каждое предложение, а кулиса на заднем фоне$поднимается, открывая декорации ресторана. Историк присоединяется к$викингам в их песне, а мистера и миссис Бун поднимают с помощью тросов$и уводят из кадра, пока пение продолжается. В оригинальной телевизионной$версии финальные титры начинают прокручиваться, пока на фоне всё ещё$слышно пение. +item.canned_spam.desc=Действие трёхминутного скетча разворачивается в вымышленном кафе$"Зелёный Карлик" в Бромли. Разгорается спор между официанткой, читающей$меню, в котором почти каждое блюдо содержит спам, и миссис Бун, которая$не любит спам. Она заказывает блюдо без спама, что вызывает удивление$у её мужа, обожающего спам. Официантка с раздражением отвечает на этот$заказ. Мистер Бун предлагает забрать её спам и заказывает блюдо с большим$количеством спама и запечённой фасолью. Официантка отвечает "нет", так как$фасоль закончилась; когда мистер Бун спрашивает о замене спама, официантка$снова реагирует с отвращением. В какой-то момент группа викингов в ресторане$перебивает разговор громким пением о спаме. Разъяренная официантка приказывает$им замолчать, но они продолжают петь ещё громче. Венгерский турист подходит к$стойке, пытаясь сделать заказ с помощью абсолютно неточного венгерско-английского$разговорника (отсылка к предыдущему скетчу). Его быстро выводит полицейский.$Скетч резко переходит к историку в теле-студии, который рассказывает о$происхождении викингов в кафе. По мере того как он продолжает, он всё чаще$вставляет слово "спам" в каждое предложение, а кулиса на заднем фоне$поднимается, открывая декорации ресторана. Историк присоединяется к$викингам в их песне, а мистера и миссис Бун поднимают с помощью тросов$и уводят из кадра, пока пение продолжается. В оригинальной телевизионной$версии финальные титры начинают прокручиваться, пока на фоне всё ещё$слышно пение. item.canned_stew.name=Консервы "Тушеные грибы" item.canned_stew.desc=... item.canned_tomato.name=Консервированный томатный суп @@ -2426,8 +2497,6 @@ item.canned_tuna.name=Консервированный тунец item.canned_tuna.desc=Я не могу сказать, действительно ли это тунец или высушенный цемент. item.canned_yogurt.name=Консервированный йогурт item.canned_yogurt.desc=Возможно просрочен, но не важно. -item.canteen_13.name=Фляжка Убежища 13 -item.canteen_fab.name=Потрясающая водка item.canteen_vodka.name=Стильная фляга item.cap_fritz.name=Крышка от Фрицз-Колы item.cap_korl.name=Крышка от Бутылки Корла @@ -2486,7 +2555,8 @@ item.centrifuge_tower.name=Башня центрифуги item.chainsaw.name=Бензопила item.cheese.name=Сыр item.cheese_quesadilla.name=Сырная кесадилья -item.chemical_dye.black.name=Химический краситель (Черный) +item.cheese_quesadilla.desc=Вот что делает с вами 50-летняя дрожжевая инфекция. +item.chemical_dye.black.name=Химический краситель (Чёрный) item.chemical_dye.blue.name=Химический краситель (Синий) item.chemical_dye.brown.name=Химический краситель (Коричневый) item.chemical_dye.cyan.name=Химический краситель (Голубой) @@ -2513,14 +2583,15 @@ item.chocolate.name=Фирменный радиевый шоколад item.chocolate.desc=Радиевый шоколад? Почти уверен, что это просто мет. item.chocolate_milk.name=Шоколадное молоко item.chopper.name=Вертолёт-охотник -item.chopper_blades.name=Лопасти Вертолёта-охотника +item.chopper_blades.name=Лопасти вертолёта-охотника item.chopper_gun.name=Огневая установка -item.chopper_head.name=Кабина Вертолета-охотника -item.chopper_tail.name=Хвост Вертолёта-охотника -item.chopper_torso.name=Корпус Вертолёта-охотника -item.chopper_wing.name=Крыло Вертолета-охотника +item.chopper_head.name=Кабина вертолёта-охотника +item.chopper_tail.name=Хвост вертолёта-охотника +item.chopper_torso.name=Корпус вертолёта-охотника +item.chopper_wing.name=Крыло вертолёта-охотника item.chunk_ore.malachite.name=Кусок малахита item.chunk_ore.rare.name=Кусок редкоземельной руды +item.chunk_ore.moonstone.name=Лунный камень item.chunk_ore.cryolite.name=Кусок криолита item.cigarette.name=Сигарета марки "FFI" item.cinnebar.name=Киноварь @@ -2687,7 +2758,7 @@ item.cordite.name=Кордит item.cotton_candy.name=Радиоактивная сахарная вата item.crackpipe.name=Оздоровительная трубка item.crate_caller.name=Запросчик поставки припасов -item.crayon.black.name=Черный мелок +item.crayon.black.name=Чёрный мелок item.crayon.blue.name=Синий мелок item.crayon.brown.name=Коричневый мелок item.crayon.cyan.name=Голубой мелок @@ -2810,8 +2881,8 @@ item.drillbit_desh.name=Деш-головка бура item.drillbit_desh_diamond.name=Деш-головка бура (с алмазным напылением) item.drillbit_ferro.name=Головка бура из ферроурана item.drillbit_ferro_diamond.name=Головка бура из ферроурана (с алмазным напылением) -item.drillbit_hss.name=Головка бура из высокоскоростной стали -item.drillbit_hss_diamond.name=Головка бура из высокоскоростной стали (с алмазным напылением) +item.drillbit_hss.name=Головка бура из быстрорежущей стали +item.drillbit_hss_diamond.name=Головка бура из быстрорежущей стали (с алмазным напылением) item.drillbit_steel.name=Головка бура из стали item.drillbit_steel_diamond.name=Головка бура из стали (с алмазным напылением) item.drillbit_tcalloy.name=Головка бура из технециевой стали @@ -2871,7 +2942,6 @@ item.euphemium_plate.name=Эвфемиевый нагрудник item.euphemium_stopper.name=Ограничитель item.explosive_lenses.name=Набор взрывоопасных линз item.explosive_lenses.desc=Сборка из 8 линз из пластичной взрывчатки с тонким$алюминиевым толкателем, дюралюминиевым корпусом и$миниатюрными мостовыми детонаторами. -item.fabsols_vodka.name=Водка Fabsol'а item.factory_core_advanced.name=Энергетический кластер усовершенствованной фабрики item.factory_core_titanium.name=Энергетический кластер базовой фабрики item.fallout.name=Куча радиоактивных осадков @@ -2880,11 +2950,11 @@ item.fau_helmet.name=Фау-шлем item.fau_legs.name=Фау-поножи item.fau_plate.name=Фау-нагрудник item.filter_coal.name=Фильтр с активированным углём -item.fins_big_steel.name=Большие стальные ребра решетки +item.fins_big_steel.name=Большие стальные рёбра решётки item.fins_flat.name=Плоский стальной кожух -item.fins_quad_titanium.name=Маленькие титановые ребра -item.fins_small_steel.name=Малые стальные ребра решетки -item.fins_tri_steel.name=Большие стальные ребра +item.fins_quad_titanium.name=Маленькие титановые рёбра +item.fins_small_steel.name=Малые стальные рёбра решётки +item.fins_tri_steel.name=Большие стальные рёбра item.five_htp.name=Таблетки энтерамина item.five_htp.desc=Убирает все DRX, Стабильность на 10 минут item.flame_conspiracy.name=Конспирологическая теория @@ -2894,14 +2964,14 @@ item.flame_opinion.desc=Что ж, мне это нравится... item.flame_politics.name=Политическая тема item.flame_politics.desc=Дональд Дак построит стену! item.flame_pony.name=Картинка цветной лошади -item.flame_pony.desc=Желтая лошадь побеждает синюю лошадь, это доказанный факт! +item.flame_pony.desc=Жёлтая лошадь побеждает синюю лошадь, это доказанный факт! item.flask_infusion.shield.name=Эликсир защиты item.fleija_core.name=Заряд Ф.Л.Е.И из урана 235 item.fleija_igniter.name=Импульсный воспламенитель item.fleija_kit.name=Комплект Ф.Л.Е.Я item.fleija_propellant.name=Шрабидиевая взрывчатка item.fluid_barrel_empty.name=Пустая бочка для жидкости -item.fluid_barrel_full.name=Жидкостная бочка: +item.fluid_barrel_full.name=Жидкостная бочка: %s item.fluid_barrel_infinite.name=Бесконечная жидкостная бочка item.fluid_duct.name=Жидкостная труба: item.fluid_identifier.name=Идентификатор жидкости @@ -2912,10 +2982,12 @@ item.fluid_identifier.usage2=в радиусе 64 блоков. item.fluid_identifier_multi.name=Мульти-жидкостный идентификатор item.fluid_identifier_multi.info=Жидкостный идентификатор для: item.fluid_identifier_multi.info2=Второй тип: +item.fluid_pack_empty.name=Большой жидкостный контейнер +item.fluid_pack_full.name=%s - упакованно item.fluid_tank_empty.name=Пустой универсальный резервуар для жидкости -item.fluid_tank_full.name=Универсальный резервуар для жидкости: +item.fluid_tank_full.name=Универсальный резервуар для жидкости: %s item.fluid_tank_lead_empty.name=Пустой резервуар для опасных материалов -item.fluid_tank_lead_full.name=Резервуар с опасными материалами: +item.fluid_tank_lead_full.name=Резервуар с опасными материалами: %s item.fluorite.name=Флюорит item.flywheel_beryllium.name=Бериллевый маховик item.fmn.name=Таблетка флунитразепама @@ -2967,7 +3039,7 @@ item.gas_petroleum.name=Баллон с попутным газом item.gas_tester.name=Газовый датчик item.gear_large.name=Большая шестерня item.gear_large_steel.name=Большая стальная шестерня -item.geiger_counter.name=Ручной счетчик Гейгера +item.geiger_counter.name=Ручной счётчик Гейгера item.gem_alexandrite.name=Александрит item.gem_rad.name=Радиоактивный самоцвет item.gem_sodalite.name=Содалит @@ -2978,7 +3050,7 @@ item.gem_volcanic.name=Вулканический самоцвет item.generator_front.name=Перед генератора item.generator_steel.name=Корпус генератора item.glitch.name=Глюк -item.glowing_stew.name=Тушеные светящиеся грибы +item.glowing_stew.name=Тушёные светящиеся грибы item.glyphid_meat.name=Мясо глифидов item.glyphid_meat_grilled.name=Жареное мясо глифидов item.goggles.name=Защитные очки @@ -3032,13 +3104,17 @@ item.gun_aberrator.name=Аберратор item.gun_aberrator_eott.name=Глаза бури item.gun_am180.name=Пистолет-пулемёт .22 LR item.gun_am180_silenced.name=Пистолет-пулемёт .22 LR с глушителем +item.gun_amat.name=Крупнокалиберная снайперская винтовка +item.gun_amat_penance.name="Покаяние" +item.gun_amat_subtlety.name="Тонкость" item.gun_ar15.name="Джош" -item.gun_autoshotgun.name=Барабанный дробовик +item.gun_autoshotgun.name=Автоматический дробовик +item.gun_autoshotgun_heretic.name=Еретик item.gun_autoshotgun_sexy.name=Секси item.gun_autoshotgun_shredder.name=Шреддер item.gun_avenger.name=CZ57 “Авенджер” item.gun_b92.name=§9Энергетический бластер B92§r -item.gun_b92_ammo.name=§9Энергетический Элемент B92§r +item.gun_b92_ammo.name=§9Энергетический элемент B92§r item.gun_b93.name=§cМодифицированный бластер B93§r item.gun_benelli.name=Benelli Autoshotgun item.gun_bf.name=BEL @@ -3054,6 +3130,7 @@ item.gun_calamity.name=Каламити item.gun_calamity_ammo.name=Кал. 50 (LEGACY) item.gun_calamity_dual.name=Боевое седло item.gun_carbine.name=Карабин +item.gun_charge_thrower.name=Метатель снарядов item.gun_chemthrower.name=Химомёт item.gun_coilgun.name=Гаусс-пушка item.gun_congolake.name=Congo Lake @@ -3083,7 +3160,7 @@ item.gun_flechette.name=Игольчатая винтовка item.gun_folly.name=Прототип Дигамма "Причуда" item.gun_g3.name=Штурмовая винтовка item.gun_g3_a3.name=G3A3 -item.gun_g3_infiltrator.name=Infiltrator +item.gun_g3_infiltrator.name=Инфильтратор item.gun_g3_zebra.name=Зебринская винтовка item.gun_glass_cannon.name=Стеклянная пушка item.gun_greasegun.name=Пистолет-пулемёт "Маслёнка" @@ -3101,7 +3178,7 @@ item.gun_hp_ammo.name=Чернильный картридж item.gun_immolator.name=Иммолятор item.gun_immolator_ammo.name=Топливо Иммолатора item.gun_jack.name=Джекхаммер -item.gun_jack_ammo.name=Снаряд для четырехствольного дробовика +item.gun_jack_ammo.name=Снаряд для четырёхствольного дробовика item.gun_karl.name=Карл item.gun_kit_1.name=Ружейное масло item.gun_kit_2.name=Комплект для ремонта оружия @@ -3111,11 +3188,11 @@ item.gun_lacunae_ammo.name=5-мм патрон (LEGACY) item.gun_lag.name=Комически длинный пистолет item.gun_laser_pistol.name=Лазерный пистолет item.gun_laser_pistol_morning_glory.name=Морнин Глори -item.gun_laser_pistol_pew_pew.name=Пью-Пью +item.gun_laser_pistol_pew_pew.name=Пиу-пиу item.gun_lasrifle.name=Лазерная винтовка item.gun_lever_action.name=«Нога кобылы» (Оригинал) item.gun_lever_action_ammo.name=Дробь 12x74 калибра (LEGACY) -item.gun_lever_action_dark.name=«Нога кобылы» (Тёмный) +item.gun_lever_action_dark.name="Нога кобылы" (Тёмный) item.gun_lever_action_sonata.name=Перевёрнутая «Нога кобылы» item.gun_lever_action_sonata_2.name=§cSonata's Microphone§r item.gun_liberator.name=Либератор @@ -3129,8 +3206,9 @@ item.gun_maresleg_akimbo.name=Дробовики рычажного действ item.gun_maresleg_broken.name=Broken item.gun_maresleg_short.name=Нога кобылы item.gun_mas36.name=Южная Звезда -item.gun_minigun.name=Персональный миниган CZ53 -item.gun_minigun_lacunae.name=Лакунай +item.gun_minigun.name=Персональный миниган +item.gun_minigun_dual.name=Двойные миниганы +item.gun_minigun_lacunae.name=Лакунэ item.gun_mirv.name=M42 Ядерная катапульта "Экспериментальный МИРВ" item.gun_mirv_ammo.name=Восьмиричный МИРВ (LEGACY) item.gun_missile_launcher.name=Ракетница @@ -3199,7 +3277,7 @@ item.gun_uzi_saturnite.name=Сатурнитовый Узи item.gun_uzi_saturnite_silencer.name=Сатурнитовый Узи с глушителем item.gun_uzi_silencer.name=IMI Узи с глушителем item.gun_xvl1456.name=Прототип Тау-пушки XVL1456 -item.gun_xvl1456_ammo.name=Ящик с Обедненным Ураном-235 +item.gun_xvl1456_ammo.name=Ящик с обеднённым ураном-235 item.gun_zomg.name=ZOMG-пушка item.hand_drill.name=Ручная дрель item.hand_drill_desh.name=Ручная дрель из деша @@ -3227,7 +3305,7 @@ item.hazmat_plate_red.name=Улучшенный защитный нагрудн item.hazmat_red_kit.name=Расширенный комплект химической и радиационной защиты item.heart_booster.name=Усилитель сердца item.heart_container.name=Контейнер для сердца -item.heart_fab.name=Фаб-сердце +item.heart_fab.name=Сердце Тьмы item.heart_piece.name=Частичка сердца item.heavy_component.name=Тяжёлый компонент (%s) item.hev_battery.name=Батарея костюма @@ -3238,6 +3316,7 @@ item.hev_legs.name=Поножи H.E.V Модели IV item.holotape_damaged.name=Повреждённый голодиск item.holotape_image.name=Голодиск item.horseshoe_magnet.name=Магнит-подкова +item.hot_dusted.forged=Выковано %s раз(а) item.hull_big_aluminium.name=Большая алюминиевая оболочка item.hull_big_steel.name=Большая стальная оболочка item.hull_big_titanium.name=Большая титановая оболочка @@ -3245,10 +3324,10 @@ item.hull_small_aluminium.name=Небольшая алюминиевая обо item.hull_small_aluminium.desc=Может быть вставлен в просверленный графит item.hull_small_steel.name=Небольшая стальная оболочка item.icf_pellet.name=Топливная пеллета ICF -item.icf_pellet_depleted.name=Обедненная топливная пеллета ICF +item.icf_pellet_depleted.name=Обеднённая топливная пеллета ICF item.icf_pellet_empty.name=Пустая топливная пеллета ICF item.igniter.name=Зажигатель -item.igniter.desc=(Щёлкните правой кнопкой мыши по Прототипу)$Это зеленая металлическая ручка с $ярко-красной кнопкой и маленькой крышкой.$Внизу выгравированы инициалы N.E.$. Кем бы ни был N.E., у него был отличный вкус в оттенках зеленого. +item.igniter.desc=(Щёлкните правой кнопкой мыши по Прототипу)$Это зелёная металлическая ручка с $ярко-красной кнопкой и маленькой крышкой.$Внизу выгравированы инициалы N.E.$. Кем бы ни был N.E., у него был отличный вкус в оттенках зелёного. item.industrial_magnet.name=Промышленный магнит item.inf_antimatter.name=Infinite Antimatter Tank item.inf_antischrabidium.name=Infinite Antischrabidium Tank @@ -3293,28 +3372,28 @@ item.ingot_copper.name=Слиток промышленной меди item.ingot_daffergon.name=Даффергоновый слиток item.ingot_desh.name=Слиток деш item.ingot_dineutronium.name=Динейтрониевый слиток -item.ingot_dura_steel.name=Слиток высокоскоростной стали +item.ingot_dura_steel.name=Слиток быстрорежущей стали item.ingot_electronium.name=Электрониевый слиток item.ingot_euphemium.name=Эвфемиевый слиток item.ingot_euphemium.desc=Совершенно особый и в то же время странный элемент. -item.ingot_ferrouranium.name=Ферроураниевый слиток +item.ingot_ferrouranium.name=Ферроурановый слиток item.ingot_fiberglass.name=Стекловолокно -item.ingot_fiberglass.desc=С высоким содержанием волокна, с высоким содержанием стекла. Все, что нужно организму. +item.ingot_fiberglass.desc=С высоким содержанием волокна, с высоким содержанием стекла. Всё, что необходимо организму. item.ingot_firebrick.name=Шамотный кирпич item.ingot_gh336.name=Слиток гиорсия-336 item.ingot_gh336.desc=Коллега Сиборгиума. item.ingot_graphite.name=Графитовый слиток item.ingot_gunmetal.name=Слиток пушечной бронзы -item.ingot_hes.name=Высокообогащенный слиток шрабидиевого топлива +item.ingot_hes.name=Высокообогащённый слиток шрабидиевого топлива item.ingot_lanthanium.name=Полустабильный слиток лантана item.ingot_lanthanium.desc='Лантанум' item.ingot_lanthanium.desc.P11=Вообще лантанум, но ладно. item.ingot_lead.name=Свинцовый слиток -item.ingot_les.name=Слиток низкообогащенного шрабидиевого топлива +item.ingot_les.name=Слиток низкообогащённого шрабидиевого топлива item.ingot_magnetized_tungsten.name=Слиток намагниченного вольфрама item.ingot_metal.name=Металлический слиток item.ingot_metal.bar.name=Металлический кусок -item.ingot_metal.beacon.name=Radio Homing Beacon +item.ingot_metal.beacon.name=Радиомаяк item.ingot_metal.casing.name=Металлическая оболочка item.ingot_metal.clockwork.name=Заводной механизм item.ingot_metal.counter.name=Счётчик @@ -3357,6 +3436,7 @@ item.ingot_schrabidium_fuel.name=Слиток шрабидиевого топл item.ingot_schraranium.name=Шрараниевый слиток item.ingot_schraranium.desc=Делается из урана в шрабидиевом трансмутаторе item.ingot_semtex.name=Семтекс +item.ingot_semtex.desc=Пластиковая взрывчатка Семтекс H$Эффективное взрывчатое вещество для многих применений.$Съедобно item.ingot_silicon.name=Кремниевый брусок item.ingot_smore.name=Слиток с'мора item.ingot_solinium.name=Солиниевый слиток @@ -3398,6 +3478,13 @@ item.insert_polonium.name=Полониевая пластина item.insert_steel.name=Тяжёлостальные пластины item.insert_xsapi.name=XSAPI пластины item.insert_yharonite.name=Яронитовая пластина +item.item_expensive.bronze_tubes.name=Бронзовые конструкционные элементы +item.item_expensive.circuit.name=Обширная печатная плата +item.item_expensive.computer.name=Мейнфрейм +item.item_expensive.ferro_plating.name=Армированные ферроурановые панели +item.item_expensive.heavy_frame.name=Тяжёлый каркас +item.item_expensive.lead_plating.name=Радиационно-стойкое покрытие +item.item_expensive.steel_plating.name=Стальная обшивка с болтовым соединением item.item_secret.aberrator.name=Часть Аберратора item.item_secret.canister.name=Композит SB-26 item.item_secret.controller.name=Проприетарный блок управления @@ -3444,6 +3531,7 @@ item.launch_code_piece.name=Кусок кода запуска item.launch_key.name=Ключ запуска item.lead_gavel.name=Свинцовый молоток item.lemon.name="Лимон" +item.lemon.desc=Ну, вроде нормально. item.letter.name=Экспресс-почта item.levitation_unit.name=Гравитационный манипулятор item.lignite.name=Бурый уголь @@ -3456,10 +3544,12 @@ item.liquidator_plate.name=Нагрудник костюма Ликвидато item.lithium.name=Куб лития item.lodestone.name=Магнетит item.loop_stew.name=Завтрак IT-шника +item.loop_stew.desc=Очень, очень полезный завтрак. item.loops.name=Пəтли -item.loot_10.name=Ящик с запчастями от Ракеты 10-го размера -item.loot_15.name=Ящик с запчастями от Ракеты 15-го размера -item.loot_misc.name=Общий ящик с запчастями от Ракеты +item.loops.desc=Брø, можно мне немного пəтлей? +item.loot_10.name=Ящик с запчастями от ракеты 10-го размера +item.loot_15.name=Ящик с запчастями от ракеты 15-го размера +item.loot_misc.name=Общий ящик с запчастями от ракеты item.magnet_circular.name=Плоский магнит item.magnet_dee.name=Ди-магниты item.magnetron.name=Магнетрон @@ -3483,8 +3573,11 @@ item.mechanism_rifle_2.name=Усовершенствованный винтов item.mechanism_special.name=Механизм высокотехнологичного оружия item.med_bag.name=Аптечка первой помощи item.med_ipecac.name=Сироп из рвотного корня +item.med_ipecac.desс=Горький сок, который заставит ваш желудок$с силой извергнуть свое содержимое. item.med_ptsd.name=Лечение ПТСР +item.med_ptsd.desc=Это даже не лекарство от ПТСР,$это просто рвотный корень в другой банке! item.med_schiziphrenia.name=Лекарство от шизофрении +item.med_schizophrenia.desc=Заставляет голоса исчезнуть. На некоторое время.$...$Лучше не принимать. item.medal_liquidator.name=Медаль Ликвидатора item.meltdown_tool.name=Аппликатор мгновенного расплавления Дятлова item.memespoon.name=§eЗемлекоп @@ -3494,18 +3587,29 @@ item.mese_axe.name=Месе топор item.mese_pickaxe.name=Месе кирка item.meteor_charm.name=Талисман от метеоритов item.meteor_remote.name=Устройство для вызова метеоритов -item.meteorite_sword.name=Метеоритовый меч -item.meteorite_sword_seared.name=Метеоритовый меч (Опаленный) +item.meteorite_sword.desc=Выкован из павшей звезды$Острее, чем большинство земных лезвий +item.meteorite_sword_seared.name=Метеоритовый меч (Опалённый) +item.meteorite_sword.seared.desc=Огонь укрепляет клинок,$Делая его даже ещё мощнее item.meteorite_sword_reforged.name=Метеоритовый меч (Перекованный) +item.meteorite_sword.reforged.desc=Меч был перекован,$Чтобы искоренить прошлые недостатки item.meteorite_sword_hardened.name=Метеоритовый меч (Закалённый) +item.meteorite_sword.hardened.desc=Экстремально высокое давление использовано,$Чтобы закаливать этот меч дальше item.meteorite_sword_alloyed.name=Метеоритовый меч (Легированный) +item.meteorite_sword.alloyed.desc=Кобальт заполняет трещины,$Упрочняя меч item.meteorite_sword_machined.name=Метеоритовый меч (Механически обработанный) +item.meteorite_sword.machined.desc=Было использовано передовое оборудование,$Чтобы ещё больше усовершенствовать лезвие item.meteorite_sword_treated.name=Метеоритовый меч (Обработанный) +item.meteorite_sword.treated.desc=Были применены химикаты,$Делающие меч мощнее item.meteorite_sword_etched.name=Метеоритовый меч (Гравированный) +item.meteorite_sword.etched.desc=Кислоты очищают материал,$Чтобы получить этот идеальный меч item.meteorite_sword_bred.name=Метеоритовый меч (Разведённый) +item.meteorite_sword.bred.desc=Огромные количества тепла и радиации$Сжимают материал item.meteorite_sword_irradiated.name=Метеоритовый меч (Облучённый) +item.meteorite_sword.irradiated.desc=Сила Атома$Придает мечу мощи item.meteorite_sword_fused.name=Метеоритовый меч (Сплавленный) +item.meteorite_sword.fused.desc=Этот клинок встретился$С силами звёзд item.meteorite_sword_baleful.name=Метеоритовый меч (Зловещий) +item.meteorite_sword.baleful.desc=Этот меч встретил температуры$Гораздо большие, чем обычный материал может выдержать item.mike_cooling_unit.name=Блок охлаждения дейтерия item.mike_core.name=Дейтериевый бак с урановым покрытием item.mike_deut.name=Дейтериевый бак @@ -3515,7 +3619,7 @@ item.mirror_tool.linked=Позиция выравнивания установл item.mirror_tool.desc=Щелкните правой кнопкой мыши по бойлеру, чтобы запомнить его положение.$Нажмите на зеркала, чтобы повернуть их в сторону бойлера item.missile_anti_ballistic.name=Антибаллистическая ракета item.missile_assembly.name=Сборка малой ракеты -item.missile_bhole.name=Ракета "Черная Дыра" +item.missile_bhole.name=Ракета "Чёрная Дыра" item.missile_burst.name=Запасная ракета item.missile_buster.name=Противобункерная ракета item.missile_buster_strong.name=Улучшенная противобункерная ракета @@ -3524,6 +3628,17 @@ item.missile_cluster.name=Кластерная ракета item.missile_cluster_strong.name=Мощная кластерная ракета item.missile_custom.name=Пользовательская Ракета item.missile_decoy.name=Ракета-приманка +item.missile.desc.warhead=Боеголовка +item.missile.desc.strength=Сила +item.missile.desc.fuelType=Тип топлива +item.missile.desc.fuelAmount=Количество топлива +item.missile.desc.chipInaccuracy=Неточность чипа +item.missile.desc.finInaccuracy=Неточность стабилизаторов +item.missile.desc.size=Размер +item.missile.desc.health=Здоровье +item.missile.desc.fuel=Топливо +item.missile.desc.fuelCapacity=Вместимость топлива +item.missile.desc.notLaunchable=Не запускаемо! item.missile_doomsday.name=Ракета Судного Дня item.missile_doomsday_rusted.name=Повреждённая ракета Судного Дня item.missile_drill.name=Крушитель бетона @@ -3531,6 +3646,14 @@ item.missile_emp.name=ЭМИ-ракета item.missile_emp_strong.name=Мощная ЭМИ-ракета item.missile_endo.name=Эндотермическая ракета item.missile_exo.name=Экзотермическая ракета +item.missile.fuel.balefire=Ракетное жар-топливо +item.missile.fuel.jetfuel_loxy=Авиационное топливо / Жидкий кислород +item.missile.fuel.ethanol_peroxide=Этанол / Пероксид водорода +item.missile.fuel.kerosene_loxy=Керосин / Жидкий кислород +item.missile.fuel.kerosene_peroxide=Керосин / Пероксид водорода +item.missile.fuel.solid=Твёрдое топливо +item.missile.fuel.solid.prefueled=Твёрдое топливо (предзаправлено) +item.missile.fuel.xenon=Ксенон item.missile_generic.name=Фугасная ракета item.missile_incendiary.name=Зажигательная ракета item.missile_incendiary_strong.name=Мощная зажигательная ракета @@ -3539,6 +3662,28 @@ item.missile_kit.name=Ракетный набор item.missile_micro.name=Микро-ядерная ракета item.missile_nuclear.name=Ядерная ракета item.missile_nuclear_cluster.name=Термоядерная ракета +item.missile.part.bottomSize=Нижний размер +item.missile.part.by=Автор - +item.missile.part.fuelAmount=Количество топлива +item.missile.part.fuelConsumption=Потребление топлива +item.missile.part.fuelType=Тип топлива +item.missile.part.health=Здоровье +item.missile.part.inaccuracy=Неточность +item.missile.part.maxPayload=Максимальная полезная нагрузка +item.missile.part.rarity=Редкость +item.missile.part.rarity.common=Обычная +item.missile.part.rarity.epic=Эпическая +item.missile.part.rarity.legendary=Легендарная +item.missile.part.rarity.rare=Редкая +item.missile.part.rarity.strange=Странная +item.missile.part.rarity.uncommon=Необычная +item.missile.part.size=Размер +item.missile.part.size.any=Любой +item.missile.part.size.none=Нет +item.missile.part.strength=Сила +item.missile.part.topSize=Верхний размер +item.missile.part.type=Тип +item.missile.part.weight=Вес item.missile_rain.name=Бомбовый дождь item.missile_schrabidium.name=Шрабидиевая ракета item.missile_shuttle.name=Космический шаттл Reliant Robin @@ -3548,8 +3693,14 @@ item.missile_soyuz_lander.desc=А также паршивый посадочны item.missile_stealth.name=Стелс-ракета item.missile_strong.name=Мощная фугасная ракета item.missile_taint.name=Зараженная ракета +item.missile.tier.tier0=Уровень 0 +item.missile.tier.tier1=Уровень 1 +item.missile.tier.tier2=Уровень 2 +item.missile.tier.tier3=Уровень 3 +item.missile.tier.tier4=Уровень 4 item.missile_volcano.name=Тектоническая ракета item.missile_volcano.desc=Используя силу ядерной взрывчатки, мы можем вызвать вулкан! + item.mold_base.name=Пустая литейная форма item.mold.name=Литейная форма item.morning_glory.name=Фиалковый вьюнок @@ -3737,9 +3888,9 @@ item.nugget_euphemium.name=Эвфемиевый самородок item.nugget_euphemium.desc=Маленький кусочек розового металла.$Его свойства до сих пор неизвестны,$ОБРАЩАЙТЕСЬ С НИМ осторожно. item.nugget_gh336.name=Самородок гиорсия-336 item.nugget_gh336.desc=Коллега Сиборгиума. -item.nugget_hes.name=Высокообогащенный самородок шрабидиевого топлива +item.nugget_hes.name=Высокообогащённый самородок шрабидиевого топлива item.nugget_lead.name=Свинцовый самородок -item.nugget_les.name=Низкообогащенный самородок шрабидиевого топлива +item.nugget_les.name=Низкообогащённый самородок шрабидиевого топлива item.nugget_mercury_tiny.name=Маленькая капля ртути item.nugget_mercury.name=Капля ртути item.nugget_mox_fuel.name=Самородок МОКС топлива @@ -3855,7 +4006,7 @@ item.paa_boots.name="Старые добрые ботинки" из PaA item.paa_legs.name=Укреплённые поножи из PaA item.paa_plate.name=Защищающая грудная пластина из PaA item.padlock.name=Замок -item.padlock_reinforced.name=Защищенный замок +item.padlock_reinforced.name=Защищённый замок item.padlock_rusty.name=Ржавый замок item.padlock_unbreakable.name=Несокрушимый замок item.pads_rubber.name=Резиновые прокладки @@ -3875,6 +4026,7 @@ item.part_barrel_light.name=Лёгкий ствол (%s) item.part_beryllium.name=Коробка бериллиевой пыли item.part_carbon.name=Коробка угольной пыли item.part_copper.name=Коробка медной пыли +item.part_generic.glass_polarized.name=Поляризованная линза item.part_generic.hde.name=Элемент повышенной прочности item.part_generic.lde.name=Элемент малой плотности item.part_generic.piston_electric.name=Электрический поршень @@ -3885,7 +4037,7 @@ item.part_lithium.name=Коробка литиевой пыли item.part_mechanism.name=Оружейный механизм (%s) item.part_plutonium.name=Коробка плутониевой пыли item.part_receiver_heavy.name=Тяжёлый ресивер (%s) -item.part_receiver_light.name=Лёгкий ресивер(%s) +item.part_receiver_light.name=Лёгкий ресивер (%s) item.part_stock.name=Приклад (%s) item.particle_aelectron.name=Капсула с Позитроном item.particle_amat.name=Капсула с Антиматерией @@ -3905,6 +4057,7 @@ item.particle_strange.name=Капсула со Странным кварком item.particle_tachyon.name=Капсула с тахионом item.parts_legendary.name=Легендарные запчасти item.peas.name=Горошек +item.peas.desc=Он принимает твое приношение. item.pedestal_steel.name=Стальная стойка item.pellet_advanced.name=Улучшитель производительности Ватцз item.pellet_antimatter.name=Кластер антиматерии @@ -3921,11 +4074,11 @@ item.pellet_coolant.name=Охлаждающий кластер item.pellet_flechette.name=Флешетты item.pellet_gas.name=Ядовитый газовый баллон item.pellet_gas.desc=Используется в многоцелевых бомбах:$*кхе-кхе* Астанавитесь пжлст! -item.pellet_hes.name=Высокообогащенная шрабидиевая Ватцз-пеллета +item.pellet_hes.name=Высокообогащённая шрабидиевая Ватцз-пеллета item.pellet_lead.name=Свинцовая пеллета -item.pellet_les.name=Низкообогащенная шрабидиевая Ватцз-пеллета +item.pellet_les.name=Низкообогащённая шрабидиевая Ватцз-пеллета item.pellet_mercury.name=Ртутные гранулы -item.pellet_mes.name=Среднеобогащенная шрабидиевая Ватцз-пеллета +item.pellet_mes.name=Среднеобогащённая шрабидиевая Ватцз-пеллета item.pellet_meteorite.name=Метеоритные гранулы item.pellet_neptunium.name=Нептуниевая Ватцз-пеллета item.pellet_rtg.name=РИТЭГ-пеллета из плутония-238 @@ -3935,7 +4088,7 @@ item.pellet_rtg_actinium.desc=Сияние голубого света и бет item.pellet_rtg_americium.name=РИТЭГ-пеллета из америция-241 item.pellet_rtg_americium.desc=Редкий и надежный, старый добрый Америций! item.pellet_rtg_berkelium.name=РИТЭГ-пеллета из берклия-248 -item.pellet_rtg_berkelium.desc= +item.pellet_rtg_berkelium.desc=Экзотический источник альфа-излучения, служит дольше, чем америций! item.pellet_rtg_cobalt.name=РИТЭГ-пеллета из кобальта-60 item.pellet_rtg_cobalt.desc=Не лучший для РИТЭГ энергии, но хорош для гамма-радиации! item.pellet_rtg_depleted.bismuth.name=Распавшаяся РИТЭГ-пеллета висмута @@ -3955,15 +4108,15 @@ item.pellet_rtg_strontium.desc=Известен штату Калифорния. item.pellet_rtg_radium.name=РИТЭГ-пеллета из радия-226 item.pellet_rtg_radium.desc=Отличная стартовая пеллета, полученная из натурального радия! item.pellet_rtg_weak.name=Слабая урановая РИТЭГ-топливная пеллета -item.pellet_rtg_weak.desc=Более дешевая и слабая пеллета, теперь с большим количеством U238! +item.pellet_rtg_weak.desc=Более дешёвая и слабая пеллета, теперь с большим количеством U238! item.pellet_schrabidium.name=Чистая шрабидиевая Ватцз-пеллета item.photo_panel.name=Фотоэлектрическая панель item.pile_rod_boron.name=Контрольный стержень "Чикагской поленницы" item.pile_rod_boron.desc=§9[Поглотитель нейтронов]$§eПКМ, чтобы переключить item.pile_rod_detector.name=Регулирующий и детектирующий стержень "Чикагской поленницы" -item.pile_rod_detector.desc=§9[Детектор/поглотитель нейтронов]$§eПКМ дефьюзером чтобы увеличить/уменьшить лимит нейтронов$§eПКМ отвёрткой без шифта чтобы проверить поток +item.pile_rod_detector.desc=§9[Детектор/поглотитель нейтронов]$§eПКМ дефьюзером, чтобы увеличить/уменьшить лимит нейтронов$§eПКМ отвёрткой без шифта, чтобы проверить поток item.pile_rod_lithium.name=Литиевая ячейка "Чикагской поленницы" -item.pile_rod_lithium.desc=§a[Топливо-размножитель]$§eПКМ ручной дрелью чтобы проверить ядро ячейки +item.pile_rod_lithium.desc=§a[Топливо-размножитель]$§eПКМ ручной дрелью, чтобы проверить ядро ячейки item.pile_rod_plutonium.name=Плутониевый стержень "Чикагской поленницы" item.pile_rod_plutonium.desc=§d[Источник нейтронов] item.pile_rod_pu239.name=Урановый стержень-размножитель "Чикагской поленницы" @@ -3971,7 +4124,7 @@ item.pile_rod_pu239.desc=§a[Активное топливо]$§eбогатое item.pile_rod_source.name=Радий-226-Бериллевый источник нейтронов "Чикагской поленницы" item.pile_rod_source.desc=§d[Источник нейтронов] item.pile_rod_uranium.name=Урановый стержень "Чикагской поленницы" -item.pile_rod_uranium.desc=§a[Активное топливо]$§eПКМ ручной дрелью чтобы взять образец ядра стержня +item.pile_rod_uranium.desc=§a[Активное топливо]$§eПКМ ручной дрелью, чтобы взять образец ядра стержня item.pill_iodine.name=Таблетка иода item.pill_iodine.desc=Убирает негативные эффекты item.pill_herbal.name=Травяная паста @@ -3984,7 +4137,7 @@ item.pipes_steel.name=Стальные трубы item.pipes_steel.desc=Раскрафт был исключен из-за уклонения от уплаты налогов item.piston_selenium.name=Поршень двигателя внутреннего сгорания item.piston_set_desh.name=Набор деш-поршней -item.piston_set_dura.name=Набор поршней из высокоскоростной стали +item.piston_set_dura.name=Набор поршней из быстрорежущей стали item.piston_set_starmetal.name=Набор поршней из звёздного металла item.piston_set_steel.name=Набор стальных поршней item.plan_c.name=План С @@ -4009,19 +4162,19 @@ item.plate_copper.name=Медная пластина item.plate_dalekanium.name=Злой металл item.plate_desh.name=Составная пластина из деш item.plate_dineutronium.name=Составная пластина из динейтрония -item.plate_dura_steel.name=Пластина высокоскоростной стали +item.plate_dura_steel.name=Пластина быстрорежущей стали item.plate_euphemium.name=Составная пластина из эвфемия item.plate_fuel_mox.name=МОКС-топливная пластина item.plate_fuel_pu238be.name=Плутоний-238-Бериллевая топливная пластина -item.plate_fuel_pu239.name=Высокообогащенная плутониевая-239 топливная пластина +item.plate_fuel_pu239.name=Высокообогащённая плутониевая-239 топливная пластина item.plate_fuel_ra226be.name=Радий-226-Бериллевая топливная пластина -item.plate_fuel_sa326.name=Высокообогащенная шрабидий-326 топливная пластина -item.plate_fuel_u233.name=Высокообогащенная уран-233 топливная пластина -item.plate_fuel_u235.name=Высокообогащенная уран-235 топливная пластина +item.plate_fuel_sa326.name=Высокообогащённая шрабидий-326 топливная пластина +item.plate_fuel_u233.name=Высокообогащённая уран-233 топливная пластина +item.plate_fuel_u235.name=Высокообогащённая уран-235 топливная пластина item.plate_gold.name=Золотая пластина item.plate_gunmetal.name=Пластина пушечной бронзы item.plate_iron.name=Железная пластина -item.plate_kevlar.name=Кевларо-керамический состав +item.plate_kevlar.name=Лист кевлара item.plate_lead.name=Свинцовая пластина item.plate_mixed.name=Смешанная пластина item.plate_paa.name=Пластина сплава PaA @@ -4073,8 +4226,8 @@ item.powder_coal_tiny.name=Кучка угольного порошка item.powder_cobalt.name=Кобальтовый порошок item.powder_cobalt_tiny.name=Кучка кобальтового порошка item.powder_coltan.name=Очищенный танталит -item.powder_coltan_ore.name=Измельченный Колтан -item.powder_combine_steel.name=Измельченная сталь Альянса +item.powder_coltan_ore.name=Измельчённый колтан +item.powder_combine_steel.name=Измельчённая сталь Альянса item.powder_copper.name=Медный порошок item.powder_cs137.name=Порошок цезия-137 item.powder_cs137_tiny.name=Кучка порошка цезия-137 @@ -4084,10 +4237,10 @@ item.powder_desh_mix.name=Смесь деш item.powder_desh_ready.name=ГотоваяДеш™ смесь item.powder_diamond.name=Алмазный порошок item.powder_dineutronium.name=Динейтрониевый порошок -item.powder_dura_steel.name=Измельченная высокоскоростная сталь +item.powder_dura_steel.name=Измельчённая быстрорежущая сталь item.powder_emerald.name=Изумрудный порошок item.powder_euphemium.name=Эвфемиевый порошок -item.powder_euphemium.desc=Измельченный розовый.$На вкус как клубника. +item.powder_euphemium.desc=Измельчённая розовость.$На вкус как клубника. item.powder_fertilizer.name=Промышленное удобрение item.powder_fire.name=Красный фосфор item.powder_fire.desc=Используется в многоцелевых бомбах:$Зажигательные бомбы - это весело! @@ -4107,8 +4260,8 @@ item.powder_lignite.name=Порошок бурого угля item.powder_limestone.name=Известняковый порошок item.powder_lithium.name=Литиевый порошок item.powder_lithium_tiny.name=Кучка литиевого порошка -item.powder_magic.name=Измельченное зачарование -item.powder_magnetized_tungsten.name=Измельченный намагниченный вольфрам +item.powder_magic.name=Измельчённое зачарование +item.powder_magnetized_tungsten.name=Измельчённый намагниченный вольфрам item.powder_meteorite.name=Метеоритный порошок item.powder_meteorite_tiny.name=Кучка метеоритного порошка item.powder_molysite.name=Молизит @@ -4122,7 +4275,7 @@ item.powder_paleogenite.name=Порошок палеогенита item.powder_paleogenite_tiny.name=Кучка палеогенитового порошка item.powder_plutonium.name=Плутониевый порошок item.powder_poison.name=Ядовитый порошок -item.powder_poison.desc=Используется в многоцелевых бомбах:$Внимание: Ядовито! +item.powder_poison.desc=Используется в многоцелевых бомбах:$Внимание: ядовито! item.powder_polonium.name=Порошок полония-210 item.powder_polymer.name=Полимерный порошок item.powder_power.name=Энерго-порошок @@ -4157,9 +4310,9 @@ item.powder_verticium.name=Вертициевый порошок item.powder_weidanium.name=Вейдановый порошок item.powder_xe135.name=Порошок ксенона-135 item.powder_xe135_tiny.name=Кучка порошка ксенона-135 -item.powder_yellowcake.name=Йеллоукейк +item.powder_yellowcake.name=Жёлтый кек item.powder_zirconium.name=Циркониевый порошок -item.power_net_tool.name=Анализатор энергосети +item.power_net_tool.name=Анализатор электросети item.pipette.name=Пипетка item.pipette_boron.name=Борная пипетка item.pipette_laboratory.name=Лабораторная пипетка @@ -4171,50 +4324,51 @@ item.primer_buckshot.name=Картечные Капсюли (x12) item.protection_charm.name=Талисман защиты item.prototype_kit.name=Комплект Прототипа item.pudding.name=Пудинг +item.pudding.desc=Что, если бы он сделал?$WЧто, если бы он не сделал?$Что, если бы если мир был сделан из пуддинга? item.pwr_fuel.bfb_am_mix.name=Стержень ВВЭР ЦБР с реакторным америцием item.pwr_fuel.bfb_pu241.name=Стержень ВВЭР ЦБР с плутонием-241 -item.pwr_fuel.hea242.name=Топливный стержень ВВЭР с высокообогащенным америцием-242 -item.pwr_fuel.hen237.name=Топливный стержень ВВЭР с высокообогащенным нептунием-237 -item.pwr_fuel.hep239.name=Топливный стержень ВВЭР с высокообогащенным плутонием-239 -item.pwr_fuel.hep241.name=Топливный стержень ВВЭР с высокообогащенным плутонием-241 -item.pwr_fuel.hes326.name=Топливный стержень ВВЭР с высокообогащенным шрабидием-326 -item.pwr_fuel.hes327.name=Топливный стержень ВВЭР с высокообогащенным шрабидием-327 -item.pwr_fuel.heu233.name=Топливный стержень ВВЭР с высокообогащенным ураном-233 -item.pwr_fuel.heu235.name=Топливный стержень ВВЭР с высокообогащенным ураном-235 -item.pwr_fuel.mea.name=Топливный стержень ВВЭР со среднеобогащенным америцием -item.pwr_fuel.men.name=Топливный стержень ВВЭР со среднеобогащенным нептунием -item.pwr_fuel.mep.name=Топливный стержень ВВЭР со среднеобогащенным плутонием -item.pwr_fuel.meu.name=Топливный стержень ВВЭР со среднеобогащенным ураном +item.pwr_fuel.hea242.name=Топливный стержень ВВЭР с высокообогащённым америцием-242 +item.pwr_fuel.hen237.name=Топливный стержень ВВЭР с высокообогащённым нептунием-237 +item.pwr_fuel.hep239.name=Топливный стержень ВВЭР с высокообогащённым плутонием-239 +item.pwr_fuel.hep241.name=Топливный стержень ВВЭР с высокообогащённым плутонием-241 +item.pwr_fuel.hes326.name=Топливный стержень ВВЭР с высокообогащённым шрабидием-326 +item.pwr_fuel.hes327.name=Топливный стержень ВВЭР с высокообогащённым шрабидием-327 +item.pwr_fuel.heu233.name=Топливный стержень ВВЭР с высокообогащённым ураном-233 +item.pwr_fuel.heu235.name=Топливный стержень ВВЭР с высокообогащённым ураном-235 +item.pwr_fuel.mea.name=Топливный стержень ВВЭР со среднеобогащённым америцием +item.pwr_fuel.men.name=Топливный стержень ВВЭР со среднеобогащённым нептунием +item.pwr_fuel.mep.name=Топливный стержень ВВЭР со среднеобогащённым плутонием +item.pwr_fuel.meu.name=Топливный стержень ВВЭР со среднеобогащённым ураном item.pwr_fuel.mox.name=Топливный стержень ВВЭР с МОКС-топливом -item.pwr_fuel_depleted.bfb_am_mix.name=Обедненный стержень ВВЭР ЦБР с реакторным америцием -item.pwr_fuel_depleted.bfb_pu241.name=Обедненный стержень ВВЭР ЦБР с плутонием-241 -item.pwr_fuel_depleted.hea242.name=Обедненный топливный стержень ВВЭР с высокообогащенным америцием-242 -item.pwr_fuel_depleted.hen237.name=Обедненный топливный стержень ВВЭР с высокообогащенным нептунием-237 -item.pwr_fuel_depleted.hep239.name=Обедненный топливный стержень ВВЭР с высокообогащенным плутонием-239 -item.pwr_fuel_depleted.hep241.name=Обедненный топливный стержень ВВЭР с высокообогащенным плутонием-241 -item.pwr_fuel_depleted.hes326.name=Обедненный топливный стержень ВВЭР с высокообогащенным шрабидием-326 -item.pwr_fuel_depleted.hes327.name=Обедненный топливный стержень ВВЭР с высокообогащенным шрабидием-327 -item.pwr_fuel_depleted.heu233.name=Обедненный топливный стержень ВВЭР с высокообогащенным ураном-233 -item.pwr_fuel_depleted.heu235.name=Обедненный топливный стержень ВВЭР с высокообогащенным ураном-235 -item.pwr_fuel_depleted.mea.name=Обедненный топливный стержень ВВЭР со среднеобогащенным америцием -item.pwr_fuel_depleted.men.name=Обедненный топливный стержень ВВЭР со среднеобогащенным нептунием -item.pwr_fuel_depleted.mep.name=Обедненный топливный стержень ВВЭР со среднеобогащенным плутонием -item.pwr_fuel_depleted.meu.name=Обедненный топливный стержень ВВЭР со среднеобогащенным ураном -item.pwr_fuel_depleted.mox.name=Обедненный топливный стержень ВВЭР с МОКС-топливом +item.pwr_fuel_depleted.bfb_am_mix.name=Обеднённый стержень ВВЭР ЦБР с реакторным америцием +item.pwr_fuel_depleted.bfb_pu241.name=Обеднённый стержень ВВЭР ЦБР с плутонием-241 +item.pwr_fuel_depleted.hea242.name=Обеднённый топливный стержень ВВЭР с высокообогащённым америцием-242 +item.pwr_fuel_depleted.hen237.name=Обеднённый топливный стержень ВВЭР с высокообогащённым нептунием-237 +item.pwr_fuel_depleted.hep239.name=Обеднённый топливный стержень ВВЭР с высокообогащённым плутонием-239 +item.pwr_fuel_depleted.hep241.name=Обеднённый топливный стержень ВВЭР с высокообогащённым плутонием-241 +item.pwr_fuel_depleted.hes326.name=Обеднённый топливный стержень ВВЭР с высокообогащённым шрабидием-326 +item.pwr_fuel_depleted.hes327.name=Обеднённый топливный стержень ВВЭР с высокообогащённым шрабидием-327 +item.pwr_fuel_depleted.heu233.name=Обеднённый топливный стержень ВВЭР с высокообогащённым ураном-233 +item.pwr_fuel_depleted.heu235.name=Обеднённый топливный стержень ВВЭР с высокообогащённым ураном-235 +item.pwr_fuel_depleted.mea.name=Обеднённый топливный стержень ВВЭР со среднеобогащённым америцием +item.pwr_fuel_depleted.men.name=Обеднённый топливный стержень ВВЭР со среднеобогащённым нептунием +item.pwr_fuel_depleted.mep.name=Обеднённый топливный стержень ВВЭР со среднеобогащённым плутонием +item.pwr_fuel_depleted.meu.name=Обеднённый топливный стержень ВВЭР со среднеобогащённым ураном +item.pwr_fuel_depleted.mox.name=Обеднённый топливный стержень ВВЭР с МОКС-топливом item.pwr_fuel_hot.bfb_am_mix.name=Горячий стержень ВВЭР ЦБР с реакторным америцием item.pwr_fuel_hot.bfb_pu241.name=Горячий стержень ВВЭР ЦБР с плутонием-241 -item.pwr_fuel_hot.hea242.name=Горячий стержень ВВЭР с высокообогащенным америцием-242 -item.pwr_fuel_hot.hen237.name=Горячий стержень ВВЭР с высокообогащенным нептунием-237 -item.pwr_fuel_hot.hep239.name=Горячий стержень ВВЭР с высокообогащенным плутонием-239 -item.pwr_fuel_hot.hep241.name=Горячий стержень ВВЭР с высокообогащенным плутонием-241 -item.pwr_fuel_hot.hes326.name=Горячий стержень ВВЭР с высокообогащенным шрабидием-326 -item.pwr_fuel_hot.hes327.name=Горячий стержень ВВЭР с высокообогащенным шрабидием-327 -item.pwr_fuel_hot.heu233.name=Горячий стержень ВВЭР с высокообогащенным ураном-233 -item.pwr_fuel_hot.heu235.name=Горячий стержень ВВЭР с высокообогащенным ураном-235 -item.pwr_fuel_hot.mea.name=Горячий стержень ВВЭР со среднеобогащенным америцием -item.pwr_fuel_hot.men.name=Горячий стержень ВВЭР со среднеобогащенным нептунием -item.pwr_fuel_hot.mep.name=Горячий стержень ВВЭР со среднеобогащенным плутонием -item.pwr_fuel_hot.meu.name=Горячий стержень ВВЭР со среднеобогащенным ураном +item.pwr_fuel_hot.hea242.name=Горячий стержень ВВЭР с высокообогащённым америцием-242 +item.pwr_fuel_hot.hen237.name=Горячий стержень ВВЭР с высокообогащённым нептунием-237 +item.pwr_fuel_hot.hep239.name=Горячий стержень ВВЭР с высокообогащённым плутонием-239 +item.pwr_fuel_hot.hep241.name=Горячий стержень ВВЭР с высокообогащённым плутонием-241 +item.pwr_fuel_hot.hes326.name=Горячий стержень ВВЭР с высокообогащённым шрабидием-326 +item.pwr_fuel_hot.hes327.name=Горячий стержень ВВЭР с высокообогащённым шрабидием-327 +item.pwr_fuel_hot.heu233.name=Горячий стержень ВВЭР с высокообогащённым ураном-233 +item.pwr_fuel_hot.heu235.name=Горячий стержень ВВЭР с высокообогащённым ураном-235 +item.pwr_fuel_hot.mea.name=Горячий стержень ВВЭР со среднеобогащённым америцием +item.pwr_fuel_hot.men.name=Горячий стержень ВВЭР со среднеобогащённым нептунием +item.pwr_fuel_hot.mep.name=Горячий стержень ВВЭР со среднеобогащённым плутонием +item.pwr_fuel_hot.meu.name=Горячий стержень ВВЭР со среднеобогащённым ураном item.pwr_fuel_hot.mox.name=Горячий стержень ВВЭР с МОКС-топливом item.quartz_plutonium.name=Плутонический кварц item.radar_linker.name=Радарный соединитель @@ -4224,37 +4378,39 @@ item.radaway_strong.name=Усиленный антирадин item.radx.name=Рад-X item.radx.desc=Increases radiation resistance by 0.2 (37%) for 3 minutes item.rag.name=Тряпка +item.rag.desc=Бросьте в воду, чтобы намочить.$Нажмите правой кнопкой мыши, чтобы помочиться на тряпку. item.rag_damp.name=Влажная тряпка item.rag_piss.name=Пропитанная мочой тряпка +item.rangefinder.name=Дальномер item.rbmk_fuel_balefire.name=Жар-топливный стержень РБМК item.rbmk_fuel_balefire_gold.name=Флэшголд-топливный стержень РБМК -item.rbmk_fuel_drx.name=§cДигамма топливный стержень РБМК§r +item.rbmk_fuel_drx.name=§cДигамма-топливный стержень РБМК§r item.rbmk_fuel_empty.name=Пустой топливный стержень РБМК item.rbmk_fuel_flashlead.name=Флэшлид-топливный стержень РБМК -item.rbmk_fuel_hea241.name=Высокообогащенный америциевый-241 топливный стержень РБМК -item.rbmk_fuel_hea242.name=Высокообогащенный америциевый-242 топливный стержень РБМК -item.rbmk_fuel_heaus.name=Высокообогащенный австралиевый топливный стержень РБМК -item.rbmk_fuel_hen.name=Высокообогащенный нептуниевый топливный стержень РБМК -item.rbmk_fuel_hes.name=Высокообогащенный шрабидиевый топливный стержень РБМК -item.rbmk_fuel_hep.name=Высокообогащенный плутониевый-239 топливный стержень РБМК -item.rbmk_fuel_hep241.name=Высокообогащенный плутониевый-241 топливный стержень РБМК -item.rbmk_fuel_heu233.name=Высокообогащенный урановый-233 топливный стержень РБМК -item.rbmk_fuel_heu235.name=Высокообогащенный урановый-235 топливный стержень РБМК -item.rbmk_fuel_lea.name=Низкообогащенный америциевый топливный стержень РБМК -item.rbmk_fuel_leaus.name=Низкообогащенный австралиевый топливный стержень РБМК -item.rbmk_fuel_lep.name=Низкообогащенный плутониевый-239 топливный стержень РБМК -item.rbmk_fuel_les.name=Низкообогащенный шрабидиевый топливный стержень РБМК -item.rbmk_fuel_mea.name=Среднеобогащенный америциевый топливный стержень РБМК -item.rbmk_fuel_men.name=Среднеобогащенный нептуниевый топливный стержень РБМК -item.rbmk_fuel_mep.name=Среднеобогащенный плутониевый-239 топливный стержень РБМК -item.rbmk_fuel_mes.name=Среднеобогащенный шрабидиевый топливный стержень РБМК -item.rbmk_fuel_meu.name=Среднеобогащенный урановый топливный стержень РБМК +item.rbmk_fuel_hea241.name=Высокообогащённый америциевый-241 топливный стержень РБМК +item.rbmk_fuel_hea242.name=Высокообогащённый америциевый-242 топливный стержень РБМК +item.rbmk_fuel_heaus.name=Высокообогащённый австралиевый топливный стержень РБМК +item.rbmk_fuel_hen.name=Высокообогащённый нептуниевый топливный стержень РБМК +item.rbmk_fuel_hes.name=Высокообогащённый шрабидиевый топливный стержень РБМК +item.rbmk_fuel_hep.name=Высокообогащённый плутониевый-239 топливный стержень РБМК +item.rbmk_fuel_hep241.name=Высокообогащённый плутониевый-241 топливный стержень РБМК +item.rbmk_fuel_heu233.name=Высокообогащённый урановый-233 топливный стержень РБМК +item.rbmk_fuel_heu235.name=Высокообогащённый урановый-235 топливный стержень РБМК +item.rbmk_fuel_lea.name=Низкообогащённый америциевый топливный стержень РБМК +item.rbmk_fuel_leaus.name=Низкообогащённый австралиевый топливный стержень РБМК +item.rbmk_fuel_lep.name=Низкообогащённый плутониевый-239 топливный стержень РБМК +item.rbmk_fuel_les.name=Низкообогащённый шрабидиевый топливный стержень РБМК +item.rbmk_fuel_mea.name=Среднеобогащённый америциевый топливный стержень РБМК +item.rbmk_fuel_men.name=Среднеобогащённый нептуниевый топливный стержень РБМК +item.rbmk_fuel_mep.name=Среднеобогащённый плутониевый-239 топливный стержень РБМК +item.rbmk_fuel_mes.name=Среднеобогащённый шрабидиевый топливный стержень РБМК +item.rbmk_fuel_meu.name=Среднеобогащённый урановый топливный стержень РБМК item.rbmk_fuel_mox.name=МОКС-топливный стержень РБМК item.rbmk_fuel_po210be.name=Полоний-210-Бериллевый источник нейтронов РБМК item.rbmk_fuel_pu238be.name=Плутоний-238-Бериллевый источник нейтронов РБМК item.rbmk_fuel_ra226be.name=Радий-226-Бериллевый источник нейтронов РБМК item.rbmk_fuel_thmeu.name=Ториево-урановый среднеобогащённый топливный стержень РБМК -item.rbmk_fuel_ueu.name=Необогащенный урановый топливный стержень РБМК +item.rbmk_fuel_ueu.name=Необогащённый урановый топливный стержень РБМК item.rbmk_fuel_zfb_am_mix.name=Америций реакторного качества ЦТС стержень РБМК item.rbmk_fuel_zfb_bismuth.name=Висмутовый ЦТС стержень РБМК item.rbmk_fuel_zfb_pu241.name=Плутоний-241 ЦТС стержень РБМК @@ -4262,32 +4418,32 @@ item.rbmk_lid.name=Покрывающая панель РБМК item.rbmk_lid_glass.name=Стеклянная покрывающая панель РБМК item.rbmk_pellet_balefire.name=Жар-топливная пеллета item.rbmk_pellet_balefire_gold.name=Флэшголд-топливная пеллета -item.rbmk_pellet_drx.name=§cДигамма топливная пеллета§r +item.rbmk_pellet_drx.name=§cДигамма-топливная пеллета§r item.rbmk_pellet_flashlead.name=Флэшлид-топливная пеллета -item.rbmk_pellet_hea241.name=Высокообогащенная америциевая-241 топливная пеллета -item.rbmk_pellet_hea242.name=Высокообогащенная америциевая-242 топливная пеллета -item.rbmk_pellet_heaus.name=Высокообогащенная австралиевая топливная пеллета -item.rbmk_pellet_hen.name=Высокообогащенная нептуниевая топливная пеллета -item.rbmk_pellet_hep239.name=Высокообогащенная плутониевая-239 топливная пеллета -item.rbmk_pellet_hep241.name=Высокообогащенная плутониевая-241 топливная пеллета -item.rbmk_pellet_heu233.name=Высокообогащенная урановая-233 топливная пеллета -item.rbmk_pellet_heu235.name=Высокообогащенная урановая-235 топливная пеллета -item.rbmk_pellet_hes.name=Высокообогащенная шрабидиевая топливная пеллета -item.rbmk_pellet_lea.name=Низкообогащенная америциевая топливная пеллета -item.rbmk_pellet_leaus.name=Низкообогащенная австралиевая топливная пеллета -item.rbmk_pellet_lep.name=Низкообогащенная плутониевая топливная пеллета -item.rbmk_pellet_les.name=Низкообогащенная шрабидиевая топливная пеллета -item.rbmk_pellet_mea.name=Среднеобогащенная америциевая топливная пеллета -item.rbmk_pellet_men.name=Среднеобогащенная нептуниевая топливная пеллета -item.rbmk_pellet_mep.name=Среднеобогащенная плутониевая топливная пеллета -item.rbmk_pellet_mes.name=Среднеобогащенная шрабидиевая топливная пеллета -item.rbmk_pellet_meu.name=Среднеобогащенная урановая топливная пеллета +item.rbmk_pellet_hea241.name=Высокообогащённая америциевая-241 топливная пеллета +item.rbmk_pellet_hea242.name=Высокообогащённая америциевая-242 топливная пеллета +item.rbmk_pellet_heaus.name=Высокообогащённая австралиевая топливная пеллета +item.rbmk_pellet_hen.name=Высокообогащённая нептуниевая топливная пеллета +item.rbmk_pellet_hep239.name=Высокообогащённая плутониевая-239 топливная пеллета +item.rbmk_pellet_hep241.name=Высокообогащённая плутониевая-241 топливная пеллета +item.rbmk_pellet_heu233.name=Высокообогащённая урановая-233 топливная пеллета +item.rbmk_pellet_heu235.name=Высокообогащённая урановая-235 топливная пеллета +item.rbmk_pellet_hes.name=Высокообогащённая шрабидиевая топливная пеллета +item.rbmk_pellet_lea.name=Низкообогащённая америциевая топливная пеллета +item.rbmk_pellet_leaus.name=Низкообогащённая австралиевая топливная пеллета +item.rbmk_pellet_lep.name=Низкообогащённая плутониевая топливная пеллета +item.rbmk_pellet_les.name=Низкообогащённая шрабидиевая топливная пеллета +item.rbmk_pellet_mea.name=Среднеобогащённая америциевая топливная пеллета +item.rbmk_pellet_men.name=Среднеобогащённая нептуниевая топливная пеллета +item.rbmk_pellet_mep.name=Среднеобогащённая плутониевая топливная пеллета +item.rbmk_pellet_mes.name=Среднеобогащённая шрабидиевая топливная пеллета +item.rbmk_pellet_meu.name=Среднеобогащённая урановая топливная пеллета item.rbmk_pellet_mox.name=МОКС топливная пеллета item.rbmk_pellet_po210be.name=Полоний-210-Бериллиевая пеллета item.rbmk_pellet_pu238be.name=Плутоний-238-Бериллиевая пеллета item.rbmk_pellet_ra226be.name=Радий-226-Бериллевая пеллета item.rbmk_pellet_thmeu.name=Торий-урановая топливная пеллета -item.rbmk_pellet_ueu.name=Необогащенная урановая топливная пеллета +item.rbmk_pellet_ueu.name=Необогащённая урановая топливная пеллета item.rbmk_pellet_zfb_am_mix.name=ЦТС пеллета америция реакторного качества item.rbmk_pellet_zfb_bismuth.name=Висмутовая ЦТС пеллета item.rbmk_pellet_zfb_pu241.name=Плутоний-241 ЦТС пеллета @@ -4298,6 +4454,7 @@ item.rbmk_tool.set=РБМК соединён! item.reacher.name=Вольфрамовые хваталки item.reactor_core.name=Активная зона реактора-размножителя item.reactor_sensor.name=Дистанционный датчик реактора +item.rebar_placer.name=Установщик арматуры item.record.glass.desc=? ? ? item.record.lc.desc=Valve - Diabolic Adrenaline Guitar/Lambda Core item.record.ss.desc=Valve - Sector Sweep @@ -4471,7 +4628,7 @@ item.rod_waste.name=Стержень с ядерными отходами item.rod_water.name=Стержень с водой item.rod_weidanium.name=Weidanium Rod item.rod_zirnox_empty.name=Пустой стержень Цирнокс -item.rod_zirnox_natural_uranium_fuel.name=Необогащенный урановый топливный стержень Цирнокс +item.rod_zirnox_natural_uranium_fuel.name=Необогащённый урановый топливный стержень Цирнокс item.rod_zirnox_uranium_fuel.name=Урановый топливный стержень Цирнокс item.rod_zirnox_th232.name=Торий-232 стержень Цирнокс item.rod_zirnox_thorium_fuel.name=Ториевый топливный стержень Цирнокс @@ -4479,7 +4636,7 @@ item.rod_zirnox_mox_fuel.name=МОКС-топливный стержень Ци item.rod_zirnox_plutonium_fuel.name=Плутониевый топливный стержень Цирнокс item.rod_zirnox_u233_fuel.name=Уран-233 топливный стержень Цирнокс item.rod_zirnox_u235_fuel.name=Уран-235 топливный стержень Цирнокс -item.rod_zirnox_les_fuel.name=Низкообогащенный шрабидиевый топливный стержень Цирнокс +item.rod_zirnox_les_fuel.name=Низкообогащённый шрабидиевый топливный стержень Цирнокс item.rod_zirnox_lithium.name=Литиевый стержень Цирнокс item.rod_zirnox_tritium.name=Тритиевый стержень Цирнокс item.rod_zirnox_zfb_mox.name=ЦТС МОКС-топливный стержень Цирнокс @@ -4490,7 +4647,7 @@ item.rod_zirnox_mox_fuel_depleted.name=Обеднённый МОКС-топли item.rod_zirnox_plutonium_fuel_depleted.name=Обеднённый плутониевый топливный стержень Цирнокс item.rod_zirnox_u233_fuel_depleted.name=Обеднённый уран-233 топливный стержень Цирнокс item.rod_zirnox_u235_fuel_depleted.name=Обеднённый уран-235 топливный стержень Цирнокс -item.rod_zirnox_les_fuel_depleted.name=Обеднённый низкообогащенный шрабидиевый топливный стержень Цирнокс +item.rod_zirnox_les_fuel_depleted.name=Обеднённый низкообогащённый шрабидиевый топливный стержень Цирнокс item.rod_zirnox_zfb_mox_depleted.name=Обеднённый ЦТС МОКС-топливный стержень Цирнокс item.rotor_steel.name=Большой стальной ротор item.rpa_boots.name=Ботинки силовой брони Оставшихся @@ -4521,11 +4678,12 @@ item.sat_head_scanner.name=Сканер M700 item.sat_interface.name=Интерфейс спутникового управления item.sat_laser.name=Орбитальный Луч Смерти item.sat_lunar_miner.name=Модуль для добычи лунного грунта -item.sat_mapper.name=Спутник для Картографирования Поверхности +item.sat_mapper.name=Спутник для картографирования поверхности item.sat_miner.name=Модуль для добычи астероидов -item.sat_radar.name=Спутник с Радиолокационным Зондированием +item.sat_radar.name=Спутник с радиолокационным зондированием item.sat_resonator.name=Спутник с Зен-Резонатором item.sat_scanner.name=Спутник с модулем глубинно-ресурсного сканирования + item.sawblade.name=Лезвие пилорамы item.schnitzel_vegan.name=Вегетарианский шницель item.schrabidium_axe.name=Шрабидиевый топор @@ -4561,9 +4719,9 @@ item.settings_tool.name=Устройство настройки item.shackles.name=Оковы item.shellntm.name=Оболочка (%s) item.shimmer_axe.name=Отлитый топор -item.shimmer_axe_head.name=Тяжелое лезвие топора +item.shimmer_axe_head.name=Тяжёлое лезвие топора item.shimmer_handle.name=Усиленная полимерная ручка -item.shimmer_head.name=Тяжелая головка молота +item.shimmer_head.name=Тяжёлая головка молота item.shimmer_sledge.name=Отлитая кувалда item.singularity.name=Сингулярность item.singularity_counter_resonant.name=Заключённая контр-резонансная сингулярность @@ -4583,10 +4741,10 @@ item.solid_fuel_bf.name=Твердое топливо (Жар-пламя) item.solid_fuel_presto.name=Топливное полено item.solid_fuel_presto_bf.name=Топливное полено (Жар-пламя) item.solid_fuel_presto_triplet.name=Сжатые топливные поленья -item.solid_fuel_presto_triplet_bf.name=Сжатые топливные полена (Жар-пламя) +item.solid_fuel_presto_triplet_bf.name=Сжатые топливные поленья (Жар-пламя) item.solinium_core.name=Полустабильный солиниевый заряд item.solinium_igniter.name=Солиниевый импульсный воспламенитель -item.solinium_kit.name=Солиниевый комплект +item.solinium_kit.name=Комплект Синего Ополаскивателя item.solinium_propellant.name=Солиниевый сжимающий заряд item.sopsign.name=Боевой топор из знака С ОП item.spawn_duck.name=Золотое яйцо @@ -4684,10 +4842,10 @@ item.t45_kit.name=Комплект силовой брони T45 item.t45_legs.name=Поножи силовой брони T45 item.t45_plate.name=Нагрудник силовой брони T45 item.tank_steel.name=Стальной бак -item.taurun_boots.name=Taurun Boots -item.taurun_helmet.name=Taurun Helmet -item.taurun_legs.name=Taurun Leggings -item.taurun_plate.name=Taurun Chestplate +item.taurun_boots.name=Taurun ботинки +item.taurun_helmet.name=Taurun шлем +item.taurun_legs.name=Taurun поножи +item.taurun_plate.name=Taurun нагрудник item.tank_waste_0.name=Контейнер с отходами item.tank_waste_1.name=Контейнер с отходами item.tank_waste_2.name=Контейнер с отходами @@ -4741,7 +4899,7 @@ item.tsar_kit.name=Комплект Царь Бомбы item.turbine_titanium.name=Титановая паровая турбина item.turbine_tungsten.name=Усиленные лопасти турбовентилятора item.turret_biometry.name=Карта телелинка -item.turret_cheapo_ammo.name=Дешевые турельные боеприпасы 6x24 +item.turret_cheapo_ammo.name=Дешёвые турельные боеприпасы 6x24 item.turret_chip.name=Турельный чип искусственного интеллекта item.turret_control.name=Турельный контроллер item.turret_cwis_ammo.name=Барабан 20-мм патронов @@ -4752,6 +4910,7 @@ item.turret_rocket_ammo.name=Боекомплект ракетной турел item.turret_spitfire_ammo.name=AA-Снаряд item.turret_tau_ammo.name=Урановые боеприпасы Тау-турели item.twinkie.name=Твинки +item.twinkie.desc=Испортилось 600 лет назад! item.ullapool_caber.name=Аллапульское бревно item.undefined.name=Undefined item.upgrade_5g.name=Улучшение "5G излучение" @@ -4796,6 +4955,18 @@ item.wand_d.name=Отладочная палочка item.wand_k.name=Строительная палочка item.wand_s.name=Структурная палочка item.structure_custommachine.name=Жезл обозначения кастомных машин +item.warhead.desc.he=HE +item.warhead.desc.incendiary=Зажигательная +item.warhead.desc.cluster=Кассетная +item.warhead.desc.bunker_buster=Разрушитель бункеров +item.warhead.desc.nuclear=Ядерная +item.warhead.desc.thermonuclear=Термоядерная (TX) +item.warhead.desc.n2=N² +item.warhead.desc.balefire=Жар-ядерная +item.warhead.desc.schrabidium=Шрабидиевая +item.warhead.desc.taint=Порча +item.warhead.desc.cloud=Облако +item.warhead.desc.turbine=Турбина item.warhead_buster_large.name=Большая бункерная боеголовка item.warhead_buster_medium.name=Средняя бункерная боеголовка item.warhead_buster_small.name=Малая бункерная боеголовка @@ -4814,48 +4985,48 @@ item.warhead_nuclear.name=Ядерная боеголовка item.warhead_thermo_endo.name=Эндотермическая боеголовка item.warhead_thermo_exo.name=Экзотермическая боеголовка item.warhead_volcano.name=Тектоническая боеголовка -item.waste_mox.name=Обедненное МОКС-топливо -item.waste_natural_uranium.name=Обедненное природное урановое топливо +item.waste_mox.name=Обеднённое МОКС-топливо +item.waste_natural_uranium.name=Обеднённое природное урановое топливо item.waste_plate_mox.name=Обеднённая МОКС-топливная пластина item.waste_plate_pu238be.name=Обеднённая плутоний-238-бериллевая топливная пластина -item.waste_plate_pu239.name=Обеднённая высокообогащенная плутониевая-239 топливная пластина +item.waste_plate_pu239.name=Обеднённая высокообогащённая плутониевая-239 топливная пластина item.waste_plate_ra226be.name=Обеднённая радий-226-бериллевая топливная пластина -item.waste_plate_sa326.name=Обеднённая высокообогащенная шрабидий-326 топливная пластина -item.waste_plate_u233.name=Обеднённая высокообогащенная уран-233 топливная пластина -item.waste_plate_u235.name=Обеднённая высокообогащенная уран-235 топливная пластина -item.waste_plutonium.name=Обедненное плутониевое топливо -item.waste_schrabidium.name=Обедненное шрабидиевое топливо -item.waste_thorium.name=Обедненное ториевое топливо -item.waste_u235.name=Обедненное уран-235 топливо -item.waste_u233.name=Обедненное уран-233 топливо -item.waste_uranium.name=Обедненное урановое топливо -item.waste_zfb_mox.name=Обедненное ЦТС МОКС-топливо +item.waste_plate_sa326.name=Обеднённая высокообогащённая шрабидий-326 топливная пластина +item.waste_plate_u233.name=Обеднённая высокообогащённая уран-233 топливная пластина +item.waste_plate_u235.name=Обеднённая высокообогащённая уран-235 топливная пластина +item.waste_plutonium.name=Обеднённое плутониевое топливо +item.waste_schrabidium.name=Обеднённое шрабидиевое топливо +item.waste_thorium.name=Обеднённое ториевое топливо +item.waste_u235.name=Обеднённое уран-235 топливо +item.waste_u233.name=Обеднённое уран-233 топливо +item.waste_uranium.name=Обеднённое урановое топливо +item.waste_zfb_mox.name=Обеднённое ЦТС МОКС-топливо item.watch.name=Сломанные карманные часы item.watch.desc=Маленькие синие карманные часы.$На стекле есть несколько трещин,$и несколько осколков отсутствуют.$Перестали тикать в 2:34. item.watz_pellet.boron.name=Поглощающая Ватцз-пеллета из бора -item.watz_pellet.du.name=Поглощающая Ватцз-пеллета из обедненного урана -item.watz_pellet.hes.name=Ватцз-пеллета из высокообогащенного шрабидия +item.watz_pellet.du.name=Поглощающая Ватцз-пеллета из обеднённого урана +item.watz_pellet.hes.name=Ватцз-пеллета из высокообогащённого шрабидия item.watz_pellet.lead.name=Поглощающая Ватцз-пеллета из свинца -item.watz_pellet.les.name=Ватцз-пеллета из низкообогащенного шрабидия -item.watz_pellet.mes.name=Ватцз-пеллета из среднеобогащенного шрабидия -item.watz_pellet.mep.name=Ватцз-пеллета из среднеобогащенного плутония -item.watz_pellet.meu.name=Ватцз-пеллета из среднеобогащенного урана -item.watz_pellet.nqd.name=Ватцз-пеллета из обогащенного наквадаха +item.watz_pellet.les.name=Ватцз-пеллета из низкообогащённого шрабидия +item.watz_pellet.mes.name=Ватцз-пеллета из среднеобогащённого шрабидия +item.watz_pellet.mep.name=Ватцз-пеллета из среднеобогащённого плутония +item.watz_pellet.meu.name=Ватцз-пеллета из среднеобогащённого урана +item.watz_pellet.nqd.name=Ватцз-пеллета из обогащённого наквадаха item.watz_pellet.nqr.name=Ватцз-пеллета из наквадрии -item.watz_pellet.hen.name=Ватцз-пеллета из высокообогащенного нептуния +item.watz_pellet.hen.name=Ватцз-пеллета из высокообогащённого нептуния item.watz_pellet.schrabidium.name=Ватцз-пеллета из чистого шрабидия -item.watz_pellet_depleted.boron.name=Поглощающая Ватцз-пеллета из бора (Обедненная) -item.watz_pellet_depleted.du.name=Поглощающая Ватцз-пеллета из обедненного урана (Обедненная) -item.watz_pellet_depleted.hes.name=Ватцз-пеллета из высокообогащенного шрабидия (Обедненная) -item.watz_pellet_depleted.lead.name=Поглощающая Ватцз-пеллета из свинца (Обедненная) -item.watz_pellet_depleted.les.name=Ватцз-пеллета из низкообогащенного шрабидия (Обедненная) -item.watz_pellet_depleted.mes.name=Ватцз-пеллета из среднеобогащенного шрабидия (Обедненная) -item.watz_pellet_depleted.mep.name=Ватцз-пеллета из среднеобогащенного плутония (Обедненная) -item.watz_pellet_depleted.meu.name=Ватцз-пеллета из среднеобогащенного урана (Обедненная) -item.watz_pellet_depleted.nqd.name=Ватцз-пеллета из обогащенного наквадаха (Обедненная) -item.watz_pellet_depleted.nqr.name=Ватцз-пеллета из наквадрии (Обедненная) -item.watz_pellet_depleted.hen.name=Ватцз-пеллета из высокообогащенного нептуния (Обедненная) -item.watz_pellet_depleted.schrabidium.name=Ватцз-пеллета из чистого шрабидия (Обедненная) +item.watz_pellet_depleted.boron.name=Поглощающая Ватцз-пеллета из бора (Обеднённая) +item.watz_pellet_depleted.du.name=Поглощающая Ватцз-пеллета из обеднённого урана (Обеднённая) +item.watz_pellet_depleted.hes.name=Ватцз-пеллета из высокообогащённого шрабидия (Обеднённая) +item.watz_pellet_depleted.lead.name=Поглощающая Ватцз-пеллета из свинца (Обеднённая) +item.watz_pellet_depleted.les.name=Ватцз-пеллета из низкообогащённого шрабидия (Обеднённая) +item.watz_pellet_depleted.mes.name=Ватцз-пеллета из среднеобогащённого шрабидия (Обеднённая) +item.watz_pellet_depleted.mep.name=Ватцз-пеллета из среднеобогащённого плутония (Обеднённая) +item.watz_pellet_depleted.meu.name=Ватцз-пеллета из среднеобогащённого урана (Обеднённая) +item.watz_pellet_depleted.nqd.name=Ватцз-пеллета из обогащённого наквадаха (Обеднённая) +item.watz_pellet_depleted.nqr.name=Ватцз-пеллета из наквадрии (Обеднённая) +item.watz_pellet_depleted.hen.name=Ватцз-пеллета из высокообогащённого нептуния (Обеднённая) +item.watz_pellet_depleted.schrabidium.name=Ватцз-пеллета из чистого шрабидия (Обёдненная) item.weapon_bat.name=Любимица Ричарда item.weapon_bat_nail.name=Клише item.weapon_golf_club.name=Клюшка русского бандита @@ -4873,9 +5044,9 @@ item.weapon_mod_generic.bronze_damage.name=Оптимизированный бр item.weapon_mod_generic.bronze_dura.name=Высокопрочные запчасти из бронзы item.weapon_mod_generic.desh_damage.name=Оптимизированный деш ресивер item.weapon_mod_generic.desh_dura.name=Высокопрочные запчасти из деша -item.weapon_mod_generic.dura_damage.name=Оптимизированный высокоскоростной ресивер -item.weapon_mod_generic.dura_dura.name=Высокопрочные запчасти из высокоскоростной стали -item.weapon_mod_generic.ferro_damage.name=Оптимизированный ферроураниевый ресивер +item.weapon_mod_generic.dura_damage.name=Оптимизированный ресивер из быстрорежущей стали +item.weapon_mod_generic.dura_dura.name=Высокопрочные запчасти из быстрорежущей стали +item.weapon_mod_generic.ferro_damage.name=Оптимизированный ферроурановый ресивер item.weapon_mod_generic.ferro_dura.name=Высокопрочные запчасти из ферроурана item.weapon_mod_generic.iron_damage.name=Оптимизированный железный ресивер item.weapon_mod_generic.iron_dura.name=Высокопрочные запчасти из железа @@ -4934,7 +5105,7 @@ item.wood_gavel.name=Деревянный молоток item.wrench.name=Газовый ключ item.wrench_archineer.name=Гаечный ключ инженера item.wrench_flipped.name=Лезвие на гаечном ключе -item.xanax.name=Препарат "НАКСА" против дигаммы +item.xanax.name=Препарат "НАКСА" против Дигаммы item.xanax.desc=Снимает 500mDRX item.zirconium_legs.name=Циркониевые штаны @@ -4959,7 +5130,7 @@ pa.pause_unloaded=Приостановлен pa.pause_unloaded.desc=Частица вошла$в незагруженный чанк. Операция$была приостановлена$до тех пор пока частица и источник частиц$не будут загружены. #The particle has entered an$unloaded chunk. The operation has$been suspended, until both the$particle and the particle source$are loaded. pa.crash_defocus=Расфокус! -pa.crash_defocus.desc=Частица потеряла фокус.$Убедитесь что ускоритель имеет достаточное количество квадрупольных магнитов. +pa.crash_defocus.desc=Частица потеряла фокус.$Убедитесь, что ускоритель имеет достаточное количество квадрупольных магнитов. pa.crash_derail=Сход с рельсов! pa.crash_derail.desc=Частица вышла за пределы ускорителя.$Убедитесь что никакие части не отсутствуют,$и что диполи настроены правильно. pa.crash_cannot_enter=Отклонено! @@ -4990,6 +5161,9 @@ potion.hbm_stability=Стабильность potion.hbm_taint=Порча potion.hbm_telekinesis=! ! ! +purex.recycle=Переработка %s +purex.schrab=Извлечение шрабидия из %s + radar.clearMap=Очистить карту radar.detectMissiles=Обнаружение ракет radar.detectPlayers=Обнаружение игроков @@ -5005,7 +5179,7 @@ radar.target.custom1015=Ракета 10/15 размера radar.target.custom15=Ракета 15 размера radar.target.custom1520=Ракета 15/20 размера radar.target.custom20=Ракета 20 размера -radar.target.doomsday=Ракета судного дня +radar.target.doomsday=Ракета Судного Дня radar.target.shuttle=Космический шаттл Reliant Robin radar.target.tier0=Ракета 0-го уровня radar.target.tier1=Ракета 1-го уровня @@ -5041,7 +5215,18 @@ rbmk.screen.rod=Управ: %s rbmk.screen.temp=Темп: %s rbmk.screen.xenon=Ксенон: %s -shape.barrelHeavy=Тяжелый ствол +satchip.frequency=Частота спутника +satchip.foeq=Даёт тебе достижение. Это всё. +satchip.gerald.desc=Одноразовый.$Требует орбитальный модуль.$Плавитель процессоров, проклятие администраторов серверов. +satchip.laser=Позволяет вызывать лазеры с перезарядкой 15 секунд.. +satchip.mapper=Отображает загруженные в данный момент чанки. +satchip.miner=Доставит рудный порошок на грузовую посадочную площадку. +satchip.lunar_miner=Добывает лунный грунт, чтобы доставить его на грузовую посадочную площадку. +satchip.radar=Показывает карту активных сущностей. +satchip.resonator=Позволяет телепортироваться без перезарядки. +satchip.scanner=Создает карту подземных руд сверху вниз. + +shape.barrelHeavy=Тяжёлый ствол shape.barrelLight=Лёгкий ствол shape.billet=Заготовка shape.blade=Лопасть @@ -5091,7 +5276,7 @@ tile.anvil_bismuth.name=Висмутовая наковальня tile.anvil_bismuth_bronze.name=Наковальня из висмутовой бронзы tile.anvil_desh.name=Деш-наковальня tile.anvil_dnt.name=Динейтрониевая наковальня -tile.anvil_ferrouranium.name=Ферроураниевая наковальня +tile.anvil_ferrouranium.name=Ферроурановая наковальня tile.anvil_iron.name=Железная наковальня tile.anvil_lead.name=Свинцовая наковальня tile.anvil_meteorite.name=Метеоритовая наковальня @@ -5154,9 +5339,9 @@ tile.block_copper.name=Медный блок tile.block_corium.name=Кориум tile.block_corium_cobble.name=Буриум tile.block_daffergon.name=Даффергоновый блок -tile.block_desh.name=Укрепленный блок деш +tile.block_desh.name=Укреплённый блок деш tile.block_dineutronium.name=Блок динейтрония -tile.block_dura_steel.name=Укрепленный блок высокоскоростной стали +tile.block_dura_steel.name=Укреплённый блок быстрорежущей стали tile.block_electrical_scrap.name=Блок отходов электроники tile.block_euphemium.name=Блок эвфемия tile.block_euphemium_cluster.name=Эвфемиево-вытравленный кластер шрабидия @@ -5186,7 +5371,7 @@ tile.block_meteor_treasure.name=Блок метеоритных сокровищ tile.block_mox_fuel.name=Блок МОКС топлива tile.block_neptunium.name=Нептуниевый блок tile.block_niter.name=Блок селитры -tile.block_niter_reinforced.name=Укрепленный блок селитры +tile.block_niter_reinforced.name=Укреплённый блок селитры tile.block_niobium.name=Блок ниобия tile.block_plutonium.name=Плутониевый блок tile.block_plutonium_fuel.name=Блок плутониевого топлива @@ -5234,7 +5419,7 @@ tile.block_waste_painted.name=Покрашенный блок ядерных о tile.block_waste_vitrified.name=Блок остеклованных ядерных отходов tile.block_weidanium.name=Вейданиевый блок tile.block_white_phosphorus.name=Блок белого фосфора -tile.block_yellowcake.name=Блок йеллоукейка +tile.block_yellowcake.name=Блок жёлтого кека tile.block_zirconium.name=Блок циркония tile.boat.name=Лодка tile.bobblehead.name=Болванчик @@ -5330,8 +5515,8 @@ tile.cm_circuit.schrabidium.name=Блок микросхем 5-го уровня tile.cm_engine.bismuth.name=Моторный блок из висмута tile.cm_engine.desh.name=Моторный блок из деша tile.cm_engine.standard.name=Моторный блок -tile.cm_flux.name=Приемник нейтронного потока -tile.cm_heat.name=Теплоприемник +tile.cm_flux.name=Приёмник нейтронного потока +tile.cm_heat.name=Теплоприёмник tile.cm_port.alloy.name=Люк из продвинутого сплава tile.cm_port.desh.name=Люк из деша tile.cm_port.steel.name=Люк из стали @@ -5355,7 +5540,7 @@ tile.concrete_brick_slab.brick_concrete_broken.name=Плита из разруш tile.concrete_brick_slab.brick_concrete_cracked.name=Плита из потресканных бетонных кирпичей tile.concrete_brick_slab.brick_concrete_mossy.name=Плита из замшелых бетонных кирпичей tile.concrete_brick_slab.brick_ducrete.name=Плита из дюкретовых кирпичей -tile.concrete_colored.black.name=Черный бетон +tile.concrete_colored.black.name=Чёрный бетон tile.concrete_colored.blue.name=Синий бетон tile.concrete_colored.brown.name=Коричневый бетон tile.concrete_colored.cyan.name=Бирюзовый бетон @@ -5380,6 +5565,7 @@ tile.concrete_colored_ext.pink.name=Бетон "Выбор строителя" - tile.concrete_colored_ext.purple.name=Бетон "Выбор строителя" - Таинственный фиолетовый tile.concrete_colored_ext.sand.name=Бетон "Выбор строителя" - Пустыня tile.concrete_pillar.name=Арматурный железобетонный столб +tile.concrete_rebar.name=Железобетон tile.concrete_slab.asphalt.name=Плита из асфальта tile.concrete_slab.concrete.name=Плита из бетонной плитки tile.concrete_slab.concrete_asbestos.name=Плита из асбестобетона @@ -5407,19 +5593,19 @@ tile.corium_block.name=Кориум tile.crane_boxer.name=Конвейерный упаковщик tile.crane_boxer.desc=Загружает настраиваемое количество стопок в ящики, которые перемещаются по конвейерным лентам$Правый клик отверткой для установки входной стороны$Шифтовый клик отверткой для установки выходной стороны$Кликните дважды для установки противоположной стороны tile.crane_extractor.name=Конвейерный извлекатель -tile.crane_extractor.desc=Забирает предметы из инвентаря и помещает их на конвейерные ленты$Имеет до 9 слотов фильтрации с черным и белым списком$Правый клик отверткой для установки выходной стороны$Shift-клик отверткой для установки входной стороны$Кликните дважды для установки противоположной стороны +tile.crane_extractor.desc=Забирает предметы из инвентаря и помещает их на конвейерные ленты$Имеет до 9 слотов фильтрации с чёрным и белым списком$Правый клик отверткой для установки выходной стороны$Shift-клик отверткой для установки входной стороны$Кликните дважды для установки противоположной стороны tile.crane_grabber.name=Конвейерный сборщик -tile.crane_grabber.desc=Принимает предметы с проходящих конвейеров и помещает их в контейнеры$Принимает предметы только с ближайшей дорожки$Имеет до 9 слотов фильтрации с черным и белым списком$Правый клик отверткой для установки стороны входа$Сменный клик отверткой для установки стороны выхода$Кликните дважды для установки противоположной стороны +tile.crane_grabber.desc=Принимает предметы с проходящих конвейеров и помещает их в контейнеры$Принимает предметы только с ближайшей дорожки$Имеет до 9 слотов фильтрации с чёрным и белым списком$Правый клик отверткой для установки стороны входа$Сменный клик отверткой для установки стороны выхода$Кликните дважды для установки противоположной стороны tile.crane_inserter.name=Конвейерный вставщик tile.crane_inserter.desc=Принимает предметы с конвейеров и помещает их в контейнеры$Правый щелчок отверткой для установки входной стороны$Shift-щелчок отверткой для установки выходной стороны$Кликните дважды для установки противоположной стороны tile.crane_partitioner.name=Вставщик окислителя tile.crane_partitioner.desc=Принимает и сохраняет до девяти входов рудного окислителя$и освобождает их, если они соответствуют требуемому размеру входа.$Неправильные предметы также сохраняются и должны быть извлечены из стороны. tile.crane_router.name=Конвейерный сортировщик -tile.crane_router.desc=Сортирует элемент на основе заданных критериев$Стороны могут быть определены как черный список, белый список или подстановочный знак$Стороны подстановочного знака выбираются только в том случае, если ни один другой фильтр не подходит +tile.crane_router.desc=Сортирует элемент на основе заданных критериев$Стороны могут быть определены как чёрный список, белый список или подстановочный знак$Стороны подстановочного знака выбираются только в том случае, если ни один другой фильтр не подходит tile.crane_splitter.name=Конвейерный разделитель -tile.crane_splitter.desc=Разделяет предметы и равномерно укладывает их на две конвейерные ленты$Сама является конвейерной лентой, поэтому может напрямую входить в инсертер или сортировщик +tile.crane_splitter.desc=Разделяет предметы и равномерно укладывает их на две конвейерные ленты$Сама является конвейерной лентой, поэтому может напрямую входить в вставщик или сортировщик$Соотношение можно настроить с помощью отвертки tile.crane_unboxer.name=Конвейерный распаковщик -tile.crane_unboxer.desc=Прием коробок и извлечение их содержимого$Правый щелчок отверткой для установки выходной стороны$Shift-щелчок отверткой для установки входной стороны$Дважды щелкните для установки противоположной стороны +tile.crane_unboxer.desc=Приём коробок и извлечение их содержимого$Правый щелчок отверткой для установки выходной стороны$Shift-щелчок отверткой для установки входной стороны$Дважды щелкните для установки противоположной стороны tile.crashed_bomb.name=Неразорвавшаяся бомба tile.crate.name=Ящик снабжения tile.crate_ammo.name=Ящик из звёздного металла @@ -5435,7 +5621,7 @@ tile.crate_supply.name=Ящик с припасами tile.crate_template.name=Сборочный ящик tile.crate_tungsten.name=Вольфрамовый ящик tile.crate_weapon.name=Ящик с оружием -tile.crystal_hardened.name=Закаленный темный кристалл +tile.crystal_hardened.name=Закаленный тёмный кристалл tile.crystal_pulsar.name=Пульсирующий кристалл tile.crystal_virus.name=Тёмный кристалл tile.deco_aluminium.name=Алюминиевый декоративный блок @@ -5518,6 +5704,7 @@ tile.ducrete_smooth_stairs.name=Ступеньки из дюкрета tile.dummy_block.name=Блок-пустышка tile.dummy_port.name=Блок-пустышка (Розетка) tile.dungeon_chain.name=Металлическая цепь +tile.logic_block.name=Блок действия подземелья tile.dynamite.name=Динамит tile.emp_bomb.name=ЭМИ-бомба tile.factory_advanced_conductor.name=Порт электричества усовершенствованной фабрики @@ -5530,14 +5717,14 @@ tile.factory_titanium_furnace.name=Люк доступа базовой фабр tile.factory_titanium_hull.name=Корпус базовой фабрики tile.fallout.name=Радиоактивный осадок tile.fan.name=Вентилятор -tile.fan.desc=Активируется редстоуном$Толкает существ до 10 блоков$ПКМ отвёрткой чтобы повернуть$ПКМ ручным сверлом чтобы переключить режим +tile.fan.desc=Активируется редстоуном$Толкает существ до 10 блоков$ПКМ отвёрткой, чтобы повернуть$ПКМ ручной дрелью, чтобы переключить режим tile.fan.falloffOn=Сила вентилятора уменьшается с расстоянием tile.fan.falloffOff=Постоянная сила вентилорая tile.fence_metal.name=Проволочная сетка tile.fence_metal_post.name=Столб проволочной сетки tile.field_disturber.name=Подавитель высокоэнергитических полей tile.filing_cabinet.green.name=Пыльный картотечный шкафчик -tile.filing_cabinet.steel.name=Стальной карточеный шкафчик +tile.filing_cabinet.steel.name=Стальной картотечный шкафчик tile.fire_digamma.name=Затяжная Дигамма tile.fire_door.name=Пожарная дверь tile.fireworks.name=Батарея фейерверков @@ -5551,11 +5738,13 @@ tile.floodlight.name=Электрический прожектор tile.fluid_duct.name=Универсальная жидкостная труба (Устаревшее) tile.fluid_duct_box.name=Универсальная жидкостная труба (Boxduct) tile.fluid_duct_exhaust.name=Выхлопная труба +tile.fluid_duct_paintable_block_exhaust.name=Окрашиваемая покрытая выхлопная труба tile.fluid_duct_gauge.name=Труба с измерителем потока tile.fluid_duct_gauge.desc=Труба которая показывает сколько жидкости$перемещается внутри сети за тик.$Разделенные сети, соединенные бочками$или резервуары рассматриваются как одна общая сеть. tile.fluid_duct_neo.name=Универсальная жидкостная труба tile.fluid_duct_paintable.name=Окрашиваемая покрытая универсальная жидкостная труба tile.fluid_duct_solid.name=Покрытая универсальная жидкостная труба (Устаревшее) +tile.fluid_pump.name=Помпа контроля потока tile.fluid_switch.name=Редстоун-Жидкостный клапан tile.fluid_valve.name=Жидкостный клапан tile.foam_layer.name=Слой пены @@ -5604,10 +5793,11 @@ tile.gas_monoxide.name=Угарный газ tile.gas_radon.name=Радон tile.gas_radon_dense.name=Плотный радон tile.gas_radon_tomb.name=Могильный газ -tile.geiger.name=Счетчик Гейгера +tile.geiger.name=Счётчик Гейгера tile.glass_ash.name=Пепельное стекло tile.glass_boron.name=Борное стекло tile.glass_lead.name=Свинцовое стекло +tile.glass_polarized.name=Поляризованное стекло tile.glass_polonium.name=Полониевое стекло tile.glass_quartz.name=Кварцевое стекло tile.glass_trinitite.name=Тринититовое стекло @@ -5617,8 +5807,8 @@ tile.glyphid_spawner.name=Спавнер улья глифидов tile.gneiss_brick.name=Сланцевые кирпичи tile.gneiss_chiseled.name=Высеченный сланец tile.gneiss_tile.name=Сланцевая плитка -tile.gravel_diamond.name=Измельченные алмазы -tile.gravel_obsidian.name=Измельченный обсидиан +tile.gravel_diamond.name=Измельчённые алмазы +tile.gravel_obsidian.name=Измельчённый обсидиан tile.hadron_access.name=Терминал доступа ускорителя частиц tile.hadron_analysis.name=Стенка камеры ускорителя частиц tile.hadron_analysis_glass.name=Окно камеры ускорителя частиц @@ -5631,10 +5821,6 @@ tile.hadron_coil_neodymium.name=Плотная неодимовая катушк tile.hadron_coil_schrabidate.name=Плотная шрабидатавая катушка tile.hadron_coil_schrabidium.name=Плотная шрабидиевая катушка tile.hadron_coil_starmetal.name=Плотная звёзднометаллическая катушка -tile.hadron_cooler.name=Кулер ускорителя частиц -tile.hadron_cooler.desc=Мощность охлаждения: 10$Порог переохлаждения: 10$Бонус: +10%%$Штраф переохлаждения: -25%% -tile.hadron_cooler_mk2.name=Кулер ускорителя частиц - The Palindrome Special -tile.hadron_cooler_mk2.desc=Мощность охлаждения: 5$Функция эффективности: 2-(охлад-15)²/225$Макс. штраф: -90%% tile.hadron_core.name=Ядро ускорителя частиц tile.hadron_diode.name=Диод частиц Шоттки tile.hadron_plating.name=Обшивка ускорителя частиц @@ -5656,7 +5842,7 @@ tile.heater_firebox.name=Топка tile.heater_firebox.desc=Производит тепло, сжигая твёрдое топливо. tile.heater_heatex.name=Теплообменный нагреватель tile.heater_heatex.desc=Выделяет тепло из горячих жидкостей. -tile.heater_oilburner.name=Жидкостный бойлер +tile.heater_oilburner.name=Жидкостный котёл tile.heater_oilburner.desc=Производит тепло, сжигая жидкое топливо.$Может быть настроено с помощью отвертки. tile.heater_oven.name=Нагревательная печь tile.heater_oven.desc=Производит тепло, сжигая твёрдое топливо.$Принимает тепло снизу с 50%% эффективностью. @@ -5688,6 +5874,7 @@ tile.ladder_steel.name=Стальная лестница tile.ladder_sturdy.name=Прочная деревянная лестница tile.ladder_titanium.name=Титановая лестница tile.ladder_tungsten.name=Вольфрамовая лестница +tile.trapdoor_steel.name=Стальной люк tile.lamp_demon.name=Лампа из заряда-демона tile.lamp_tritium_blue_off.name=Синяя тритиевая лампа tile.lamp_tritium_blue_on.name=Синяя тритиевая лампа @@ -5717,11 +5904,12 @@ tile.machine_arc_welder.name=Дуговой сварщик tile.machine_armor_table.name=Стол модификации брони tile.machine_ashpit.name=Зольник tile.machine_ashpit.desc=Собирает золу из топок и нагревательных печей -tile.machine_assembler.name=Сборочная машина +tile.machine_assembler.name=Сборочная машина (Legacy) tile.machine_assemfac.name=Сборочный завод +tile.machine_assembly_machine.name=Сборочная машина tile.machine_autocrafter.name=Автоматический верстак tile.machine_autosaw.name=Автоматическая пила -tile.machine_autosaw.desc=Срубает ближайшие растения, пересаживает деревья$Принимает:$-Древесное масло$-Этанол$-Рыбное масло$-Тяжелую нефть +tile.machine_autosaw.desc=Срубает ближайшие растения, пересаживает деревья$Принимает:$-Древесное масло$-Этанол$-Рыбное масло$-Тяжёлую нефть tile.machine_autosaw.suspended=Приостановлена tile.machine_bat9000.name=Охереть-большая цистерна 9000 tile.machine_battery.name=Энергохранилище @@ -5734,8 +5922,11 @@ tile.machine_boiler_off.name=Нагревательнефти tile.machine_catalytic_cracker.name=Башня каталитического крекинга tile.machine_catalytic_reformer.name=Каталитический реформер tile.machine_centrifuge.name=Центрифуга -tile.machine_chemfac.name=Химический завод -tile.machine_chemplant.name=Химическая установка +tile.machine_chemfac.name=Химический завод (Legacy) +tile.machine_chemical_factory.name=Химический завод +tile.machine_chemical_factory.desc=Четырёхкратный химический завод.$Рецепты обрабатываются в два раза быстрее,$но требуют в два раза больше энергии.$Требует охлаждения водой,$производит пар низкого давления. +tile.machine_chemical_plant.name=Химическая установка +tile.machine_chemplant.name=Химическая установка (Legacy) tile.machine_chungus.name=Паровая турбина "Левиафан" tile.machine_chungus.desc=Эффективность: 85%% tile.machine_coal_off.name=Генератор внутреннего сгорания @@ -5752,7 +5943,7 @@ tile.machine_controller.name=Блок удалённого доступа к р tile.machine_converter_he_rf.name=Конвертер энергии HE в RF tile.machine_converter_rf_he.name=Конвертер энергии RF в HE tile.machine_conveyor_press.name=Конвейерный пресс -tile.machine_conveyor_press.desc=Лента двигается слево-направо$ПКМ чтобы установить штамп$ПКМ отвёрткой чтобы снять штамп +tile.machine_conveyor_press.desc=Лента двигается слева направо$ПКМ, чтобы установить штамп$ПКМ отвёрткой, чтобы снять штамп tile.machine_crucible.name=Плавильня tile.machine_crystallizer.name=Рудный окислитель tile.machine_cyclotron.name=Циклотрон @@ -5812,6 +6003,8 @@ tile.machine_powerrtg.name=ПТ-изотопная ячейка tile.machine_press.name=Пресс tile.machine_puf6_tank.name=Бочка гексафторида плутония tile.machine_pumpjack.name=Станок-качалка +tile.machine_purex.name=PUREX +tile.machine_purex.desc=Машина для переработки многих видов ядерного топлива.$Для большинства рецептов требуются керосин и азотная кислота. tile.machine_pyrooven.name=Пиролизная печь tile.machine_radar.name=Радар tile.machine_radar_large.name=Большой радар @@ -5947,7 +6140,7 @@ tile.ore_gneiss_lithium.name=Сланцевая литиевая руда tile.ore_gneiss_rare.name=Сланцевая редкоземельная руда tile.ore_gneiss_schrabidium.name=Сланцевая шрабидиевая руда tile.ore_gneiss_uranium.name=Сланцевая урановая руда -tile.ore_gneiss_uranium_scorched.name=Обожённая сланцевая урановая руда +tile.ore_gneiss_uranium_scorched.name=Обожжённая сланцевая урановая руда tile.ore_lead.name=Свинцовая руда tile.ore_lignite.name=Бурый уголь tile.ore_meteor.aluminium.name=Метеоритная алюминиевая руда @@ -5974,7 +6167,7 @@ tile.ore_nether_smoldering.name=Тлеющий адский камень tile.ore_nether_sulfur.name=Адская серная руда tile.ore_nether_tungsten.name=Адская вольфрамовая руда tile.ore_nether_uranium.name=Адская урановая руда -tile.ore_nether_uranium_scorched.name=Обожённая адская урановая руда +tile.ore_nether_uranium_scorched.name=Обожжённая адская урановая руда tile.ore_niter.name=Селитровая руда tile.ore_oil.name=Нефтяной карман tile.ore_oil_empty.name=Пустой нефтяной карман @@ -5987,16 +6180,16 @@ tile.ore_sellafield_diamond.name=Селлафитовая алмазная ру tile.ore_sellafield_emerald.name=Селлафитовая изумрудная руда tile.ore_sellafield_radgem.name=Селлафитовый радиоактивный самоцвет tile.ore_sellafield_schrabidium.name=Селлафитовая шрабидиевая руда -tile.ore_sellafield_uranium_scorched.name=Обожженная селлафитовая урановая руда +tile.ore_sellafield_uranium_scorched.name=Обожжённая селлафитовая урановая руда tile.ore_sulfur.name=Серная руда -tile.ore_tektite_osmiridium.name=Перемешанный с осмиридием Тектит +tile.ore_tektite_osmiridium.name=Перемешанный с осмиридием тектит tile.ore_thorium.name=Ториевая руда tile.ore_tikite.name=Трикситовая руда tile.ore_titanium.name=Титановая руда tile.ore_tungsten.name=Вольфрамовая руда tile.ore_unobtainium.name=Брайтбленд tile.ore_uranium.name=Урановая руда -tile.ore_uranium_scorched.name=Обожженная урановая руда +tile.ore_uranium_scorched.name=Обожжённая урановая руда tile.ore_verticium.name=Долларовый Зелёный минерал tile.ore_volcano.name=Геотермальный источник tile.ore_weidanium.name=Вейдитит @@ -6011,7 +6204,7 @@ tile.pa_quadrupole.desc=Требует охлаждения!$Уменьшает tile.pa_rfc.name=Радиочастотный резонатор tile.pa_rfc.desc=Требует охлаждения!$Ускоряет частицы на 100 единиц,$и увеличивает расфокус на 100 единиц.$Частица столкнется при достижении расфокуса в 1000 единиц. tile.pa_source.name=Источник частиц -tile.pa_source.desc=Требует охлаждения!$Использует два предмета чтобы создать частицу. +tile.pa_source.desc=Требует охлаждения!$Использует два предмета, чтобы создать частицу. tile.part_emitter.name=Декоративный источник частиц tile.pedestal.name=Пьедестал tile.pink_barrel.name=Керосиновая бочка @@ -6038,6 +6231,7 @@ tile.plasma_heater.name=Нагреватель плазмы tile.plushie.name=Плюшевая игрушка %s tile.pneumatic_tube.name=Пневмотруба tile.pneumatic_tube.desc=Пересылает предметы за счёт сжатого воздуха.$ПКМ отвёрткой, чтобы задать вход.$ПКМ отвёрткой в присяде, чтобы задать выход.$Входы могут быть настроены и подключены к источнику сжатого воздуха.$Отсылает вплоть до полного стака четыре раза в секунду. +tile.pneumatic_tube_paintable.name=Окрашиваемая пневматическая труба tile.pole_satellite_receiver.name=Спутниковая тарелка tile.pole_top.name=Антенна tile.press_preheater.name=Внешний нагреватель пресса @@ -6046,7 +6240,7 @@ tile.pribris_burning.name=Горящие обломки РБМК tile.pribris_digamma.name=Почерневшие обломки РБМК tile.pribris_radiating.name=Тлеющие обломки РБМК tile.pump_electric.name=Электрический насос для грунтовых вод -tile.pump_electric.desc=Использует электричество для выкачивания грунтовых вод$Выкачывает до 10,000мБ/тик$Должно быть размещено ниже Y:70 +tile.pump_electric.desc=Использует электричество для выкачивания грунтовых вод$Выкачивает до 10,000мБ/тик$Должно быть размещено ниже Y:70 tile.pump_steam.name=Паровой насос для грунтовых вод tile.pump_steam.desc=Использует пар для выкачивания грунтовых вод$Выкачывает до 1000мБ/тик$Должно быть размещено ниже Y:70 tile.pwr_block.name=Водо-водяной энергетический реактор (ВВЭР) @@ -6073,10 +6267,14 @@ tile.pwr_reflector.desc=Отражает нейтроны обратно к то tile.rad_lava_block.name=Вулканическая лава tile.radar_screen.name=Экран радара tile.radio_telex.name=Телекс +tile.radio_torch_controller.name=Контроллер редстоун-радио +tile.radio_torch_controller.desc=Может принимать сигналы команд и передавать$их на подключенное устройство tile.radio_torch_counter.name=Редстоун-радио счётчик предметов tile.radio_torch_counter.desc=Ставится на плоские поверхности или совместимые компараторные блоки$Сигнал зависит от количества нужных предметов tile.radio_torch_logic.name=Редстоун-радио логический приёмник tile.radio_torch_logic.desc=Размещается на плоских поверхностях или совместимых с компаратором блоках$Сопоставляет сигналы красного камня с условиями, оцениваемыми в заданном порядке$Числовые или строковые входы сравниваются с константой +tile.radio_torch_reader.name=Редстоун-радио считыватель +tile.radio_torch_reader.desc=Считывает значения из подключенных блоков,$а затем отправляет их с указанной частотой tile.radio_torch_receiver.name=Редстоун-радио приёмник tile.radio_torch_receiver.desc=Ставится на плоские поверхности или совместимые компараторные блоки tile.radio_torch_sender.name=Редстоун-радио передатчик @@ -6097,6 +6295,7 @@ tile.rail_large_switch_flipped.name=Переключатель стандарт tile.rail_narrow.name=Узкоколейные вагонеточные рельсы tile.rail_wood.name=Деревянные рельсы tile.rbmk_absorber.name=Борный поглотитель нейтронов РБМК +tile.rbmk_autoloader.name=Автозагрузчик стержней РБМК tile.rbmk_blank.name=Структурная колонна РБМК tile.rbmk_boiler.name=Паровой канал РБМК tile.rbmk_console.name=Консоль РБМК @@ -6121,6 +6320,53 @@ tile.rbmk_steam_inlet.desc=Подает воду в колонны RBMK, есл tile.rbmk_steam_outlet.name=Порт вывода пара РБМК РеаСим tile.rbmk_steam_outlet.desc=Извлекает перегретый пар из колонн РБМК, если включены ReaSim бойлеры$Подключается к колоннам RBMK сбоку tile.rbmk_storage.name=Колонна-хранилище РБМК +tile.rbmk.dodd.heat=Температура колонны +tile.rbmk.dodd.reasimWater=Вода РеаСим +tile.rbmk.dodd.reasimSteam=Пар РеаСим +tile.rbmk.dodd.level=Уровень +tile.rbmk.dodd.targetLevel=Целевой уровень +tile.rbmk.dodd.startingLevel=Начальный уровень +tile.rbmk.dodd.mult=Мульт. +tile.rbmk.dodd.color=Цвет +tile.rbmk.dodd.levelLower=Уровень ниже +tile.rbmk.dodd.levelUpper=Уровень выше +tile.rbmk.dodd.heatLower=Температура ниже +tile.rbmk.dodd.heatUpper=Температура выше +tile.rbmk.dodd.function=Функция +tile.rbmk.dodd.fluxSlow=Медленный поток +tile.rbmk.dodd.fluxFast=Быстрый поток +tile.rbmk.dodd.hasRod=Имеет стержень +tile.rbmk.dodd.progress=Прогресс +tile.rbmk.dodd.gas=Газ +tile.rbmk.dodd.cooled=Охлажденный +tile.rbmk.dodd.burned=Сожженный +tile.rbmk.dodd.feed=Питание +tile.rbmk.dodd.steam=Пар +tile.rbmk.dodd.cryo=Крио +tile.rbmk.dodd.fuel=Топливо +tile.rbmk.dodd.f_heat=Температура топлива +tile.rbmk.dodd.f_xenon=Отравление ксеноном +tile.rbmk.dodd.f_yield=Выход топлива +tile.rbmk.dodd.feed_type=Тип питания(ID) +tile.rbmk.dodd.steam_type=Тип пара(ID) +tile.rbmk.dodd.cryo_type=Тип крио(ID) +tile.rbmk.dodd.gas_type=Тип газа(ID) +tile.rbmk.dodd.fuel_type=Тип топлива(ID) +tile.rbmk.dodd.feed_p=Давление +tile.rbmk.dodd.steam_p=Давление пара +tile.rbmk.dodd.cryo_p=Давление крио +tile.rbmk.dodd.gas_p=Давление газа +tile.rbmk.dodd.fuel_p=Давление топлива +tile.rbmk.dodd.feed_max=Максимальное количество питания +tile.rbmk.dodd.steam_max=Максимальное количество пара +tile.rbmk.dodd.cryo_max=Максимальное количество крио +tile.rbmk.dodd.gas_max=Максимальное количество газа +tile.rbmk.dodd.fuel_max=Максимальное количество топлива +tile.rbmk.dodd.feed_amt=Количество питания +tile.rbmk.dodd.steam_amt=Количество пара +tile.rbmk.dodd.cryo_amt=Количество крио +tile.rbmk.dodd.gas_amt=Количество газа +tile.rbmk.dodd.fuel_amt=Количество топлива tile.reactor_computer.name=Контроллер реактора tile.reactor_conductor.name=Бойлер реактора tile.reactor_control.name=Регулирующие стержни @@ -6128,6 +6374,7 @@ tile.reactor_ejector.name=Выталкиватель отходов реакто tile.reactor_element.name=Реакторная камера tile.reactor_hatch.name=Люк доступа реактора tile.reactor_inserter.name=Автоматический заправщик реактора +tile.rebar.name=Арматура tile.red_barrel.name=Взрывная бочка tile.red_cable.name=Провод из красной меди tile.red_cable_classic.name=Провод из красной меди (Старый) @@ -6169,6 +6416,7 @@ tile.sand_lead.name=Свинцовый песок tile.sand_polonium.name=Полониевый песок tile.sand_quartz.name=Кварцевый песок tile.sand_uranium.name=Урановый песок +tile.sandbags.name=Мешки с песком tile.sat_dock.name=Станция посадки груза tile.sat_foeq.name=ВСАП-МК.I зонд “FOEQ Duna” с экспериментальным ядерным двигателем (Декор) tile.sat_laser.name=Орбитальный Луч Смерти (Декор) @@ -6232,7 +6480,7 @@ tile.stones_slab.lightstone.2.name=Плита из светлокаменног tile.struct_icf_core.name=Ядро инерциального термоядерного реактора (ICF) tile.struct_iter_core.name=Ядро термоядерного реактора tile.struct_launcher.name=Блок-компонент пусковой площадки -tile.struct_launcher_core.name=Compact Launch Pad Core Component +tile.struct_launcher_core.name=Ядро компактной пусковой площадки tile.struct_launcher_core_large.name=Ядро большой пусковой площадки tile.struct_plasma_core.name=Ядро нагревателя плазмы tile.struct_scaffold.name=Подмосток пусковой площадки @@ -6261,7 +6509,7 @@ tile.turret_chekhov.name=Крупнокалиберная пулеметная tile.turret_cwis.name=”Фэленкс” Mk-15 CIWS tile.turret_flamer.name=Турель с огнемётом tile.turret_friendly.name=Турель Гатлинга "Мистер Дружелюбный" -tile.turret_fritz.name=Тяжелая огнеметная турель "Фриц" +tile.turret_fritz.name=Тяжёлая огнеметная турель "Фриц" tile.turret_heavy.name=Турель с тяжёлым пулемётом tile.turret_himars.name=Ракетная артиллерийская турель "Генри" tile.turret_howard.name=Двойная турель Гатлинга CIWS "Говард" @@ -6282,6 +6530,7 @@ tile.vent_chlorine.name=Хлорный клапан tile.vent_chlorine_seal.name=Хлорный уплотнитель tile.vent_cloud.name=Воздушный клапан с облаком tile.vent_pink_cloud.name=Воздушный клапан с розовым облаком +tile.vine_phosphor.large.name=Фосфорные лианы tile.vinyl_tile.large.name=Большая виниловая плитка tile.vinyl_tile.small.name=Маленькие виниловые плитки tile.vitrified_barrel.name=Бочка с остеклованными ядерными отходами @@ -6291,6 +6540,7 @@ tile.volcano_rad_core.name=Радиоактивное вулканическое tile.wand_air.name=Блок для структурной палочки (Air) tile.wand_loot.name=Блок для структурной палочки (Lootable) tile.wand_jigsaw.name=Блок для структурной палочки (Jigsaw) +tile.wand_logic.name=Блок для структурной палочки (Logic) tile.waste_earth.name=Мертвая трава tile.waste_leaves.name=Мёртвые листья tile.waste_log.name=Обугленное бревно @@ -6308,7 +6558,11 @@ tile.watz_end.name=Стабилизатор реактора Ватцза tile.watz_end_bolted.name=Стабилизатор реактора Ватцза (Заклепанный) tile.watz_hatch.name=Люк доступа к реактору Ватцза tile.watz_pump.name=Нагнетающая помпа Ватцза -tile.yellow_barrel.name=Радиоктивная бочка +tile.wood_barrier.name=Деревянный барьер +tile.wood_structure.ceiling.name=Деревянный настил +tile.wood_structure.roof.name=Деревянное перекрытие +tile.wood_structure.scaffold.name=Деревянные подмостки +tile.yellow_barrel.name=Радиоактивная бочка tile.zirnox_destroyed.name=Разрушенный Цирнокс tile.large_vehicle_door.name=Дверь для крупногабаритных автомобилей @@ -6322,7 +6576,7 @@ tile.sliding_seal_door.name=Раздвижная герметичная двер trait.asbestos=Содержит асбест trait.blinding=Ослепление trait.coal=Угольная пыль -trait.digamma=Дигамма радиация +trait.digamma=Дигамма-радиация trait.drop=Опасно выкидывать trait.explosive=Воспламеняющийся / Взрывоопасный trait.furnace=Даёт %s операций в ядерной печи @@ -6370,17 +6624,18 @@ trait.rbmx.xenon=Свинцовое отравление: %s trait.rbmx.xenonBurn=Функция разрушения свинца: %s trait.rbmx.xenonGen=Функция создания свинца: %s -trait.tile.cluster=Выпадает только тогда, когда разрушен игроком -trait.tile.depth=Может быть разрушен только взрывом +trait.tile.cluster=Выпадает только тогда, когда добыт игроком +trait.tile.depth=Может быть добыт только взрывом tool.ability.centrifuge=Авто-центрифуга tool.ability.crystallizer=Авто-кристаллизатор tool.ability.explosion=Взрыв tool.ability.hammer=Зона действия +tool.ability.hammer_flat=Плоская зона действия tool.ability.luck=Удача tool.ability.mercury=Ртутное касание tool.ability.midas=Прикосновение Мидаса -tool.ability.recursion=Жилковый Майнер +tool.ability.recursion=Жилковый майнер tool.ability.shredder=Авто-измельчитель tool.ability.silktouch=Шёлковое касание tool.ability.smelter=Авто-плавка @@ -6406,6 +6661,7 @@ upgrade.fortune=Удача %s upgrade.overheatChance=Шанс перегрева %s upgrade.productivity=Продуктивность %s upgrade.range=Радиус %s +upgrade.speed=Скорость процесса %s upgrade.gui.title=§lПринимаемые улучшения:§r upgrade.gui.afterburner= * §dФорсаж§r: Стакается до %s уровней @@ -6449,3 +6705,7 @@ desc.gui.upgrade.effectiveness= * §aЭффективность§r: Стакае desc.gui.upgrade.overdrive= * §7Перегруз§r: Стакается до 3-х уровней desc.gui.upgrade.power= * §1Энергосбережение§r: Стакается до 3-х уровней desc.gui.upgrade.speed= * §4Скорость§r: Стакается до 3-х уровней + +tile.oc_cable_paintable.name=Окрашиваемый сетевой кабель + +// Last updated 26.08.2025 by Bufka2011, MrKimkimora and TactiCOOLHimZa // diff --git a/src/main/resources/assets/hbm/lang/uk_UA.lang b/src/main/resources/assets/hbm/lang/uk_UA.lang index 28776824b..0c9a59171 100644 --- a/src/main/resources/assets/hbm/lang/uk_UA.lang +++ b/src/main/resources/assets/hbm/lang/uk_UA.lang @@ -184,6 +184,14 @@ armorMod.type.leggings=Наголінники armorMod.type.servo=Сервоприводи armorMod.type.special=Спеціальне +autoswitch=Частина групи автоматичного перемикання "%s"$Рецепт змінюється залежно від першого інгредієнта +autoswitch.plate=Переробка паливних пластин +autoswitch.plates=Металеві пластини +autoswitch.pwr=Переробка палива ВВЕР +autoswitch.schrab=Екстракція шрабідіуму +autoswitch.watz=Переробка Ватцз гранул +autoswitch.zirnox=Переробка ЦИРНОКС палива + battery.mode.buffer=Буферний режим battery.mode.input=Зарядка battery.mode.off=Вимкнено @@ -566,6 +574,21 @@ cannery.schottky.7=If any virtual particles encounter any malformed segments, al cannery.schottky.8=Note that virtual particles will never use the same Diode exit twice. Infinite loops will fail, but re-entering a Diode is otherwise fine cannery.schottky.9=Your Schottky Particle Diode should be properly enclosed, with free paths for each intersection exit +chem.hydrogen=Водень +chem.hydrogencoke=Hydrogen from CokeAdd commentMore actions +chem.oxygen=Кисень +chem.xenon=Ксеноновий газ +chem.xenonoxy=Ксеноновий газ (Охолоджений) +chem.helium3=Гелій-3 +chem.ethanol=Етанол +chem.biogas=Біогаз +chem.biofuel=Трансестерифікація біопалива +chem.reoil=Очищення оливи +chem.gasoline=Газолін +chem.tarsand=Бітум з бітумінозного піску +chem.meatprocessing=Обробка м'яса гліфідів +chem.birkeland=Азотна кислота з повітря + chem.ARSENIC=Екстракція миш'яку chem.ASPHALT=Виробництво асфальту chem.BAKELITE=Виробництво карболіту @@ -682,6 +705,10 @@ commands.satellite.satellite_descended=Супутник успішно спус commands.satellite.satellite_orbited=Супутник запущено. commands.satellite.should_be_run_as_player=Цю команду має виконати гравець! +commands.locate.no_match=Немає споруд з такою назвою! +commands.locate.none_found=Поруч не знайдено жодних споруд! +commands.locate.success.coordinates=Структуру %s знайдено на %d, %d + container.ammoBag=Сумка для боєприпасів container.amsBase=AMS Base (Deco) container.amsEmitter=AMS Emitter (Deco) @@ -758,7 +785,10 @@ container.leadBox=Свинцевий ящик container.machineAmmoPress=Прес для боєприпасів container.machineArcWelder=Дуговий зварювальник container.machineArcFurnaceLarge=Дугова піч +container.machineAssemblyMachine=Збиральна машина container.machineBoiler=Нагрівач нафти +container.machineChemicalFactory=Хімічна фабрика +container.machineChemicalPlant=Хімічний завод container.machineCMB=CMB Steel Furnace container.machineCoal=Твердопаливний генератор container.machineCoker=Коксова установка @@ -776,6 +806,7 @@ container.machineLargeTurbine=Промислова парова турбіна container.machineLiquefactor=Скраплювач container.machineMixer=Промисловий змішувач container.machineOreSlopper=Переробник корінної руди +container.machinePUREX=PUREX container.machinePyroOven=Піролізна піч container.machineRefinery=Нафтопереробний завод container.machineRotaryFurnace=Роторна піч @@ -823,6 +854,7 @@ container.radar=Радар container.radiobox=FM-передавач container.radiolysis=РІТЕГ та радіолізна камера container.radiorec=FM радіо +container.rbmkAutoloader=Автозавантажувач РБМК container.rbmkBoiler=Паровий канал РБМК container.rbmkControl=Регулюючий стрижень РБМК container.rbmkControlAuto=Автоматичний регулюючий стрижень РБМК @@ -835,6 +867,7 @@ container.reactorBreeding=Реактор-розмножувач container.reactorControl=Блок дистанційного керування реактором container.reactorLarge=Великий ядерний реактор container.reactorResearch=Дослідницький реактор +container.rebar=Постановщик арматури container.reix=Rei-X Mainframe container.rtg=РІТЕГ container.rtgFurnace=РІТЕГ піч @@ -908,7 +941,7 @@ damage.item=Опір до: damage.category.EN=Енергії damage.category.EXPL=Вибухів damage.category.FIRE=Вогню -damage.category.PROJ=Снарядів +damage.category.PHYS=Фізики damage.exact.drown=Утоплення damage.exact.fall=Падіння damage.exact.LASER=Лазерів @@ -1016,7 +1049,7 @@ desc.gui.rtg.pellets=Допустимі пелети: desc.gui.rtg.pelletHeat=%s (%s тепла) desc.gui.rtg.pelletPower=%s (%s HE/тік) desc.gui.template=§9Шаблони§r$Шаблони можна створювати за$допомогою Папки шаблонів машин. -desc.gui.turbinegas.automode=§2Режим автоматичного дроселювання турбіни§r$Натиснувши кнопку "AUTO", турбіна$втоматично відрегулює виробництво електроенергії$на основі необхідної енергії в мережі +desc.gui.turbinegas.automode=§2Режим автоматичного дроселювання турбіни§r$Натиснувши кнопку "AUTO", турбіна$втоматично відрегулює виробництво електроенергії$на основі необхідної енергії в мережі$та рівня палива у внутрішньому баку desc.gui.turbinegas.fuels=§6Допустимі види палива:§r desc.gui.turbinegas.warning=§cНизький рівень палива або мастила!§r desc.gui.zirnox.coolant=§3Охолодження§r$CO2 передає тепло від реактора до води.$Це скип'ятить її до надзвичайно гарячу пару$Ефективність охолодження та виробництва пари$залежить від тиску. @@ -1398,22 +1431,25 @@ hazard.particleFine=Твердих часток hazard.sand=Подразників очей hbm.key=NTM Hotkeys -hbm.key.calculator=Calculator -hbm.key.copyToolAlt=Copy Tool: Switch Paste -hbm.key.copyToolCtrl=Copy Tool: Paste to Pipes -hbm.key.craneLoad=Load/Unload Crane -hbm.key.craneMoveDown=Move Crane Backward -hbm.key.craneMoveLeft=Move Crane Left -hbm.key.craneMoveRight=Move Crane Right -hbm.key.craneMoveUp=Move Crane Forward -hbm.key.dash=Dash -hbm.key.gunPrimary=Primary Fire -hbm.key.gunSecondary=Secondary Fire -hbm.key.gunTertitary=Gun Sights -hbm.key.toggleBack=Toggle Jetpack -hbm.key.toggleHUD=Toggle HUD -hbm.key.trainInv=Train Inventory -hbm.key.reload=Reload +hbm.key.ability=Перемикання здібностей інструмента +hbm.key.abilityAlt=Конфігурація здібностей інструмента +hbm.key.calculator=Калькулятор +hbm.key.copyToolAlt=Інструмент копіювання: Перемикнути вставку +hbm.key.copyToolCtrl=Інструмент копіювання: Застосувати до труб +hbm.key.craneLoad=Завантажити/Розвантажити кран +hbm.key.craneMoveDown=Рухати кран назад +hbm.key.craneMoveLeft=Рухати кран вліво +hbm.key.craneMoveRight=Рухати кран вправо +hbm.key.craneMoveUp=Рухати кран вперед +hbm.key.dash=Ривок +hbm.key.gunPrimary=Основний вогонь +hbm.key.gunSecondary=Альтернативний вогонь +hbm.key.gunTertitary=Приціл +hbm.key.toggleBack=Перемикання реактивного ранця +hbm.key.toggleHUD=Перемикання HUD +hbm.key.toggleMagnet=Перемикання магніта +hbm.key.trainInv=Інвентар поїзда +hbm.key.reload=Перезарядити hbmfluid.air=Стиснене повітря hbmfluid.alumina=Оксид алюмінію @@ -1440,6 +1476,7 @@ hbmfluid.coalgas=Вугільний бензин hbmfluid.coalgas_leaded=Етильований вугільний бензин hbmfluid.coaloil=Скраплене вугілля hbmfluid.colloid=Колоїд +hbmfluid.concrete=Рідкий бетон hbmfluid.coolant=Охолоджувальна рідина hbmfluid.coolant_hot=Гаряча охолоджувальна рідина hbmfluid.crackoil=Крекінгова нафта @@ -1449,8 +1486,8 @@ hbmfluid.death=Розчин осмистого іридію hbmfluid.deuterium=Дейтерій hbmfluid.diesel=Дизель hbmfluid.diesel_crack=Крекінговий дизель -hbmfluid.diesel_crack_reform=Високооктановий крекінговий дизель -hbmfluid.diesel_reform=Високооктановий дизель +hbmfluid.diesel_crack_reform=Високоцетановий крекінговий дизель +hbmfluid.diesel_reform=Високоцетановий дизель hbmfluid.egg=Розчинене яйце hbmfluid.estradiol=Розчин естрадіолу hbmfluid.ethanol=Етанол @@ -1785,6 +1822,7 @@ item.ammo_secret.folly_sm.name=Срібна куля item.ammo_secret.g12_equestrian.name=Флешетний снаряд з залізничними цвяхами 12-го калібру item.ammo_secret.m44_equestrian.name=.44 Magnum Череполом item.ammo_secret.p35_800.name=.35-800 V9 +item.ammo_secret.p35_800_bl.name=.35-800 V9 (Чорна блискавка) item.ammo_standard.b75.name=Болт .75 item.ammo_standard.b75_exp.name=Болт .75 (Розривний) item.ammo_standard.b75_inc.name=Болт .75 (Запальний) @@ -2086,7 +2124,7 @@ item.billet_nuclear_waste.name=Заготовка ядерних відході item.billet_pb209.name=Заготовка свинцю-209 item.billet_po210be.name=Заготовка полоній-210 берилію item.billet_polonium.name=Заготовка полонію-210 -item.billet_pu_mix.name=Заготовка реакторного полонію +item.billet_pu_mix.name=Заготовка реакторного плутонію item.billet_pu238.name=Заготовка плутонію-238 item.billet_pu238be.name=Заготовка плутоній-238 берилію item.billet_pu239.name=Заготовка плутонію-239 @@ -2139,6 +2177,8 @@ item.blades_desh.name=Деш леза подрібнювача item.blades_steel.name=Стальні леза подрібнювача item.blades_titanium.name=Титанові леза подрібнювача item.blowtorch.name=Паяльна лампа +item.blueprint_folder.name=Буклет з кресленнями +item.blueprints.name=Креслення item.board_copper.name=Мідна панель item.boat_rubber.name=Гумовий човен item.bobmazon.name=Бобмазон @@ -2369,6 +2409,7 @@ item.chopper_torso.name=Корпус Гвинтокрила Мисливця item.chopper_wing.name=Крило Гвинтокрила Мисливця item.chunk_ore.malachite.name=Шматок малахіту item.chunk_ore.rare.name=Шматок рідкоземельної руди +item.chunk_ore.moonstone.name=Місячний камінь item.chunk_ore.cryolite.name=Шматок кріоліту item.cigarette.name=Сигарети торгової марки FFI item.cinnebar.name=Кіновар @@ -2748,7 +2789,7 @@ item.fleija_igniter.name=Імпульсний запальник item.fleija_kit.name=Комплект F.L.E.I.J.A. item.fleija_propellant.name=Шрабідієвий заряд item.fluid_barrel_empty.name=Порожня бочка для рідини -item.fluid_barrel_full.name=Бочка для рідини: +item.fluid_barrel_full.name=Бочка для рідини: %s item.fluid_barrel_infinite.name=Нескінченна бочка для рідини item.fluid_duct.name=Трубопровід: item.fluid_identifier.name=Ідентифікатор рідини @@ -2759,10 +2800,12 @@ item.fluid_identifier.usage2=трубопроводів в діапазоні 64 item.fluid_identifier_multi.name=Мульти ідентифікатор рідини item.fluid_identifier_multi.info=Універсальний ідентифікатор рідини для: item.fluid_identifier_multi.info2=Другий тип: +item.fluid_pack_empty.name=Великий контейнер для рідини +item.fluid_pack_full.name=Упаковано %s item.fluid_tank_empty.name=Порожній універсальний резервуар для рідини -item.fluid_tank_full.name=Універсальний резервуар для рідини: +item.fluid_tank_full.name=Універсальний резервуар для рідини: %s item.fluid_tank_lead_empty.name=Порожній резервуар для небезпечних матеріалів -item.fluid_tank_lead_full.name=Резервуар для небезпечних матеріалів: +item.fluid_tank_lead_full.name=Резервуар для небезпечних матеріалів: %s item.fluorite.name=Флюорит item.flywheel_beryllium.name=Берилієвий маховик item.fmn.name=Таблетка флунітразепаму @@ -2883,6 +2926,7 @@ item.gun_amat.name=Антиматерієва гвинтівка item.gun_amat_penance.name=Покаяння item.gun_amat_subtlety.name=Витонченість item.gun_autoshotgun.name=Автоматичний дробовик +item.gun_autoshotgun_heretic.name=Єретик item.gun_autoshotgun_sexy.name=Сексі item.gun_autoshotgun_shredder.name=Шредер item.gun_b92.name=§9B92 Енергетичний пістолет§r @@ -3147,6 +3191,13 @@ item.insert_polonium.name=Полонієва вставка item.insert_steel.name=Важка сталева вставка item.insert_xsapi.name=Твердосплавна протикульна броневставка item.insert_yharonite.name=Яронітова вставка +item.item_expensive.bronze_tubes.name=Бронзові структурні елементи +item.item_expensive.circuit.name=Розширена друкована плата +item.item_expensive.computer.name=Мейнфрейм +item.item_expensive.ferro_plating.name=Армовані фероуранові панелі +item.item_expensive.heavy_frame.name=Важкий каркас +item.item_expensive.lead_plating.name=Радіаційно-стійке покриття +item.item_expensive.steel_plating.name=Болтове сталеве покриття item.item_secret.aberrator.name=Частина Абератора item.item_secret.canister.name=Композит SB-26 item.item_secret.controller.name=Пропрієтарний блок керування @@ -3620,6 +3671,7 @@ item.part_barrel_light.name=Легкий ствол %s item.part_beryllium.name=Коробка з берилієвим пилом item.part_carbon.name=Коробка з вугільним пилом item.part_copper.name=Коробка з мідним пилом +item.part_generic.glass_polarized.name=Поляризована лінза item.part_generic.hde.name=Елемент для важких умов експлуатації item.part_generic.lde.name=Елемент низької щільності item.part_generic.piston_electric.name=Електричний поршень @@ -3685,7 +3737,7 @@ item.pellet_rtg_cobalt.name=РІТЕГ гранула кобальту-60 item.pellet_rtg_cobalt.desc=Не найкращий як РІТЕГ, але чудовий для гамма-випромінювання! item.pellet_rtg_depleted.bismuth.name=Розкладена вісмутова РІТЕГ гранула item.pellet_rtg_depleted.lead.name=Розкладена свинцева РІТЕГ гранула -item.pellet_rtg_depleted.neptunium.name=Розкладена немтунієва РІТЕГ гранула +item.pellet_rtg_depleted.neptunium.name=Розкладена нептунієва РІТЕГ гранула item.pellet_rtg_depleted.mercury.name=Розкладена ртутна РІТЕГ гранула item.pellet_rtg_depleted.nickel.name=Розкладена нікелева РІТЕГ гранула item.pellet_rtg_depleted.zirconium.name=Розкладена цирконієва РІТЕГ гранула @@ -3971,6 +4023,7 @@ item.radx.desc=Збільшує стійкість до радіації на 0. item.rag.name=Тканина item.rag_damp.name=Волога тканина item.rag_piss.name=Просочена сечею ганчірка +item.rangefinder.name=Прилад для вимірювання відстані item.rbmk_fuel_balefire.name=Паливний стрижень РБМК BF item.rbmk_fuel_balefire_gold.name=Паливний стрижень РБМК флешголду item.rbmk_fuel_drx.name=§cПаливний стрижень РБМК Дігамма§r @@ -4043,6 +4096,7 @@ item.rbmk_tool.set=РБМК підключено! item.reacher.name=Вольфрамовий ухват item.reactor_core.name=Активна зона реактора розмножувача item.reactor_sensor.name=Дистанційний датчик реактора +item.rebar_placer.name=Встановлювач арматури item.record.glass.desc=? ? ? item.record.lc.desc=Valve - Diabolic Adrenaline Guitar/Lambda Core item.record.ss.desc=Valve - Sector Sweep @@ -4727,6 +4781,11 @@ potion.hbm_stability=Стабільність potion.hbm_taint=Отруєння порчею potion.hbm_telekinesis=! ! ! +purex.recycle=Переробка %s +purex.schrab=Екстракція шрабідіуму з %s + +qmaw.tab=[ Натисніть %s для допомоги ] + radar.clearMap=Очистити карту radar.detectMissiles=Виявляти ракети radar.detectPlayers=Виявляти гравців @@ -5117,6 +5176,7 @@ tile.concrete_colored_ext.pink.name=Бетон "Вибір будівельни tile.concrete_colored_ext.purple.name=Бетон "Вибір будівельника" - Таємничий фіолетовий tile.concrete_colored_ext.sand.name=Бетон "Вибір будівельника" - Буря в пустелі tile.concrete_pillar.name=Армована залізобетонна колона +tile.concrete_rebar.name=Залізобетон tile.concrete_slab.asphalt.name=Плита з асфальту tile.concrete_slab.concrete.name=Плита з бетонної плитки tile.concrete_slab.concrete_asbestos.name=Плита з азбестобетону @@ -5255,6 +5315,7 @@ tile.ducrete_smooth_stairs.name=Сходи з уранобетону tile.dummy_block.name=Dummy Block tile.dummy_port.name=Dummy Block (Electricity Port) tile.dungeon_chain.name=Металевий ланцюг +tile.logic_block.name=Dungeon Action Block tile.dynamite.name=Динаміт tile.emp_bomb.name=Пристрій електромагнітного іпульсу tile.factory_advanced_conductor.name=Advanced Factory Electricity Port @@ -5288,11 +5349,12 @@ tile.floodlight.name=Потужний прожектор tile.fluid_duct.name=Універсальний рідинний трубопровід (Застаріло) tile.fluid_duct_box.name=Універсальний рідинний трубопровід (Boxduct) tile.fluid_duct_exhaust.name=Вихлопна труба +tile.fluid_duct_paintable_block_exhaust.name=Вихлопна труба, яку можна пофарбувати tile.fluid_duct_gauge.name=Вимірювальна труба tile.fluid_duct_gauge.desc=Труба, що показує, скільки рідини$переміщується в мережі за один тік.$Розділені мережі, з'єднані бочками$або цистернами, вважаються однією спільною мережею. tile.fluid_duct_neo.name=Універсальний рідинний трубопровід -tile.fluid_duct_paintable.name=Універсальний рідинний трубопровід з покриттям -tile.fluid_duct_solid.name=Універсальний рідинний трубопровід з покриттям (Застаріло) +tile.fluid_duct_paintable.name=Універсальний рідинний трубопровід, який можна пофарбувати +tile.fluid_duct_solid.name=Універсальний рідинний трубопровід, який можна пофарбувати (Застаріло) tile.fluid_pump.name=Насос регулювання потоку tile.fluid_switch.name=Редстоун рідинний клапан tile.fluid_valve.name=Рідинний клапан @@ -5346,6 +5408,7 @@ tile.geiger.name=Лічильник Гейгера tile.glass_ash.name=Попелясте скло tile.glass_boron.name=Борне скло tile.glass_lead.name=Свинцеве скло +tile.glass_polarized.name=Поляризоване скло tile.glass_polonium.name=Полонієве скло tile.glass_quartz.name=Кварцове скло tile.glass_trinitite.name=Тринітитове скло @@ -5369,10 +5432,6 @@ tile.hadron_coil_neodymium.name=Щільна неодимова котушка tile.hadron_coil_schrabidate.name=Щільна шрабідатова котушка tile.hadron_coil_schrabidium.name=Щільна шрабідієва котушка tile.hadron_coil_starmetal.name=Щільна котушка з зіркового металу -tile.hadron_cooler.name=Блок охолодження прискорювача частинок -tile.hadron_cooler.desc=Cooling power: 10$Overcooling threshold: 10$Cooling bonus: +10%%$Overcooling penalty: -25%% -tile.hadron_cooler_mk2.name=Particle Accelerator Cooling Unit - The Palindrome Special -tile.hadron_cooler_mk2.desc=Cooling power: 5$Efficiency function: 2-(cooling-15)²/225$Maximum penalty: -90%% tile.hadron_core.name=Particle Accelerator Core Component tile.hadron_diode.name=Schottky Particle Diode tile.hadron_plating.name=Particle Accelerator Plating @@ -5426,6 +5485,7 @@ tile.ladder_steel.name=Сталева драбина tile.ladder_sturdy.name=Міцна дерев'яна драбина tile.ladder_titanium.name=Титанова драбина tile.ladder_tungsten.name=Вольфрамова драбина +tile.trapdoor_steel.name=Сталевий люк tile.lamp_demon.name=Ядро-демон лампа tile.lamp_tritium_blue_off.name=Синя тритієва лампа tile.lamp_tritium_blue_on.name=Синя тритієва лампа @@ -5455,8 +5515,9 @@ tile.machine_arc_welder.name=Дуговий зварювальник tile.machine_armor_table.name=Стіл модифікації броні tile.machine_ashpit.name=Зольник tile.machine_ashpit.desc=Збирає попіл з топок та нагрівальних печей -tile.machine_assembler.name=Збиральна машина +tile.machine_assembler.name=Збиральна машина (Legacy) tile.machine_assemfac.name=Збиральна фабрика +tile.machine_assembly_machine.name=Збиральна машина tile.machine_autocrafter.name=Автоматичний верстак tile.machine_autosaw.name=Автоматична пила tile.machine_autosaw.desc=Вирубує рослини поруч, заново висажує дерева$Приймає:$-Деревну смолу$-Етанол$-Риб'ячий жир$-Важку нафту @@ -5472,8 +5533,11 @@ tile.machine_boiler_off.name=Старий бойлер tile.machine_catalytic_cracker.name=Вежа каталітичного крекінгу tile.machine_catalytic_reformer.name=Каталітичний риформер tile.machine_centrifuge.name=Центрифуга -tile.machine_chemfac.name=Хімічна фабрика -tile.machine_chemplant.name=Хімічний завод +tile.machine_chemfac.name=Хімічна фабрика (Застаріла) +tile.machine_chemical_factory.name=Хімічна фабрика +tile.machine_chemical_factory.desc=Четверний хімічний завод.$Рецепти обробляються вдвічі швидше,$але потребують вдвічі більше енергії.$Потрібно охолодження водою,$виробляє пару низького тиску. +tile.machine_chemical_plant.name=Хімічний завод +tile.machine_chemplant.name=Хімічний завод (Застарілий) tile.machine_chungus.name=Парова турбіна "Левіафан" tile.machine_chungus.desc=Ефективність: 85%% tile.machine_coal_off.name=Combustion Generator @@ -5550,6 +5614,8 @@ tile.machine_powerrtg.name=Полоній-теннессинова ізотоп tile.machine_press.name=Твердопаливний прес tile.machine_puf6_tank.name=Цистерна гексафториду плутонію tile.machine_pumpjack.name=Верстат-гойдалка +tile.machine_purex.name=PUREX +tile.machine_purex.desc=Машина для переробки багатьох видів ядерного палива.$Для більшості рецептів потрібен гас та азотна кислота. tile.machine_pyrooven.name=Піролізна піч tile.machine_radar.name=Радар tile.machine_radar_large.name=Великий радар @@ -5776,6 +5842,7 @@ tile.plasma_heater.name=Нагрівач плазми tile.plushie.name=%s плюшка tile.pneumatic_tube.name=Пневматична труба tile.pneumatic_tube.desc=Надсилає предмети за допомогою стисненого повітря.$Клацніть правою кнопкою миші викруткою, щоб перемкнути вхід.$Клацніть правою кнопкою миші з шифтом та викруткою, щоб перемкнути вихід.$Входи можна налаштувати та підключити до стисненого повітря.$Надсилає один стак чотири рази на секунду. +tile.pneumatic_tube_paintable.name=Пневматична труба, яку можна пофарбувати tile.pole_satellite_receiver.name=Супутникова тарілка tile.pole_top.name=Верхівка антени tile.press_preheater.name=Burner Press Preheater @@ -5788,7 +5855,7 @@ tile.pump_electric.desc=Використовує електроенергію д tile.pump_steam.name=Паровий насос ґрунтових вод tile.pump_steam.desc=Використовує пару для відкачування ґрунтових вод$Генерує до 1,000mB/t$Повинен бути розміщений нижче Y:70 tile.pwr_block.name=ВВЕР -tile.pwr_casing.name=Корпус рекатора ВВЕР +tile.pwr_casing.name=Корпус реактора ВВЕР tile.pwr_casing.desc=Потрібно покрити всі внутрішні частини реактора для формування$Розміщення: Корпус tile.pwr_channel.name=Канал теплоносія ВВЕР tile.pwr_channel.desc=Використовує тепло корпусу для нагрівання охолоджувальної рідини$Розміщення: Будь-яке @@ -5839,6 +5906,7 @@ tile.rail_large_switch_flipped.name=Стандартний залізнични tile.rail_narrow.name=Вузькоколійні рейки tile.rail_wood.name=Дерев'яні рейки tile.rbmk_absorber.name=Борний поглинач нейтронів РБМК +tile.rbmk_autoloader.name=Автозавантажувач РБМК tile.rbmk_blank.name=Структурна колона РБМК tile.rbmk_boiler.name=Паровий канал РБМК tile.rbmk_console.name=Консоль РБМК @@ -5870,12 +5938,13 @@ tile.reactor_ejector.name=Reactor Waste Ejector tile.reactor_element.name=Reactor Chamber tile.reactor_hatch.name=Reactor Access Hatch tile.reactor_inserter.name=Reactor Fuel Inserter +tile.rebar.name=Арматура tile.red_barrel.name=Вибухова бочка tile.red_cable.name=Червономідний кабель tile.red_cable_classic.name=Червономідний кабель (Класичний) tile.red_cable_gauge.name=Датчик потужності tile.red_cable_gauge.desc=Кабель, який показує, скільки енергії$переміщується в мережі за один тік.$Розділені мережі, з’єднані блоками$накопичення енергії, вважаються однією спільною мережею. -tile.red_cable_paintable.name=Червономідний кабель, який можна фарбувати +tile.red_cable_paintable.name=Червономідний кабель, який можна пофарбувати tile.red_connector.name=Конектор електропередач tile.red_pylon.name=Опора лінії електропередач tile.red_pylon_large.name=Велика опора лінії електропередач @@ -6035,6 +6104,7 @@ tile.volcano_rad_core.name=Радіоактивне вулканічне ядр tile.wand_air.name=Structure Wand Block (Air) tile.wand_loot.name=Structure Wand Block (Lootable) tile.wand_jigsaw.name=Structure Wand Block (Jigsaw) +tile.wand_logic.name=Structure Wand Block (Logic) tile.waste_earth.name=Мертва трава tile.waste_leaves.name=Мертве листя tile.waste_log.name=Обвуглене дерево @@ -6125,6 +6195,7 @@ tool.ability.centrifuge=Автоцентрифуга tool.ability.crystallizer=Автокристалізатор tool.ability.explosion=Вибух tool.ability.hammer=Зона дії +tool.ability.hammer_flat=Плоска зона дії tool.ability.luck=Вдача tool.ability.mercury=Ртутний дотик tool.ability.midas=Дотик Мідаса @@ -6148,12 +6219,13 @@ upgrade.acid=Необхідна кислота %s upgrade.burn=Burn %smb/t for %sHE upgrade.consumption=Споживання %s upgrade.coolantConsumption=Витрата охолоджувальної рідини %s -upgrade.delay=Швидкість роботи %s +upgrade.delay=Час роботи %s upgrade.efficiency=Ефективність %s upgrade.fortune=Вдача %s upgrade.overheatChance=Ймовірність перегріву %s upgrade.productivity=Продуктивність %s upgrade.range=Радіус %s +upgrade.speed=Швидкість роботи %s upgrade.gui.title=§lДопустимі покращення:§r upgrade.gui.afterburner= * §dФорсаж§r: Складається до %s рівнів @@ -6196,4 +6268,6 @@ desc.gui.upgrade.afterburner= * §dФорсаж§r: Складається до desc.gui.upgrade.effectiveness= * §aЕфективність§r: Складається до 3 рівнів desc.gui.upgrade.overdrive= * §7Перевантаження§r: Складається до 3 рівнів desc.gui.upgrade.power= * §1Енергозбереження§r: Складається до 3 рівнів -desc.gui.upgrade.speed= * §4Швидкість§r: Складається до 3 рівнів \ No newline at end of file +desc.gui.upgrade.speed= * §4Швидкість§r: Складається до 3 рівнів + +tile.oc_cable_paintable.name=Мережевий кабель, який можна пофарбувати \ No newline at end of file diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index 41847c119..70b5f5ef4 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -819,7 +819,6 @@ damage.inset=成套装备时的获得的伤害减免: damage.item=装备时获得的伤害减免: damage.category.EXPL=爆炸 damage.category.FIRE=火焰 -damage.category.PROJ=投射物 damage.exact.drown=溺水 damage.exact.fall=摔落 damage.exact.LASER=激光 @@ -1340,8 +1339,8 @@ hbmfluid.death=锇酸溶液 hbmfluid.deuterium=氘 hbmfluid.diesel=柴油 hbmfluid.diesel_crack=裂化柴油 -hbmfluid.diesel_crack_reform=高辛烷值裂化柴油 -hbmfluid.diesel_reform=高辛烷值柴油 +hbmfluid.diesel_crack_reform=高十六烷值裂化柴油 +hbmfluid.diesel_reform=高十六烷值柴油 hbmfluid.egg=蛋溶解液 hbmfluid.estradiol=雌二醇溶液 hbmfluid.ethanol=乙醇 @@ -2121,7 +2120,7 @@ item.canned_napalm.name=凝固汽油罐头 item.canned_napalm.desc=我喜欢早上闻着老梗的味道! item.canned_oil.name=机油罐头 item.canned_oil.desc=它既然能让发动机运转的更流畅,那为什么不能用在人类身上? -item.canned_pashtet.name=牛排罐头 +item.canned_pashtet.name=俄式肝酱罐头 item.canned_pashtet.desc=翻译服务不可用блядь! item.canned_pizza.name=意大利香肠比萨罐头 item.canned_pizza.desc=反人类罪 @@ -2604,7 +2603,7 @@ item.fleija_igniter.name=脉冲点火器 item.fleija_kit.name=F.L.E.I.J.A. 套件 item.fleija_propellant.name=Sa326炸药 item.fluid_barrel_empty.name=空流体桶 -item.fluid_barrel_full.name=流体桶: +item.fluid_barrel_full.name=流体桶: %s item.fluid_barrel_infinite.name=无限流体桶 item.fluid_duct.name=流体管道: item.fluid_identifier.name=流体识别码 @@ -2616,9 +2615,9 @@ item.fluid_identifier_multi.name=多类型流体识别码 item.fluid_identifier_multi.info=通用流体识别码: item.fluid_identifier_multi.info2=次要类型: item.fluid_tank_empty.name=空通用流体罐 -item.fluid_tank_full.name=通用流体罐: +item.fluid_tank_full.name=通用流体罐: %s item.fluid_tank_lead_empty.name=空危险品罐 -item.fluid_tank_lead_full.name=危险品罐: +item.fluid_tank_lead_full.name=危险品罐:%s item.fluorite.name=氟石粉 item.flywheel_beryllium.name=铍制飞轮 item.fmn.name=氟硝西泮片 @@ -5101,10 +5100,6 @@ tile.hadron_coil_neodymium.name=致密钕线圈 tile.hadron_coil_schrabidate.name=致密Sa酸铁线圈 tile.hadron_coil_schrabidium.name=致密Sa326线圈 tile.hadron_coil_starmetal.name=致密星辉线圈 -tile.hadron_cooler.name=粒子加速器冷却装置 -tile.hadron_cooler.desc=冷却功率:10$过冷阈值:10$冷却加成:+10%%$过冷惩罚:-25%% -tile.hadron_cooler_mk2.name=粒子加速器冷却装置-回文特制 -tile.hadron_cooler_mk2.desc=冷却功率:5$效率功能:2-(冷却-15)²/225$最高惩罚:-90%% tile.hadron_core.name=粒子加速器核心组件 tile.hadron_diode.name=肖基特二极管 tile.hadron_plating.name=粒子加速器镀层 @@ -5180,7 +5175,7 @@ tile.machine_arc_welder.name=电弧焊机 tile.machine_armor_table.name=装甲改装台 tile.machine_ashpit.name=储灰槽 tile.machine_ashpit.desc=收集来自燃烧室和加热炉的灰烬 -tile.machine_assembler.name=装配机 +tile.machine_assembler.name=装配机(遗留) tile.machine_assemfac.name=装配厂 tile.machine_autocrafter.name=自动工作台 tile.machine_autosaw.name=自动嗡嗡锯 @@ -5196,8 +5191,8 @@ tile.machine_boiler_off.name=锅炉 tile.machine_catalytic_cracker.name=催化裂化塔 tile.machine_catalytic_reformer.name=催化重整器 tile.machine_centrifuge.name=离心机 -tile.machine_chemfac.name=大型化工厂 -tile.machine_chemplant.name=化工厂 +tile.machine_chemfac.name=大型化工厂(遗留) +tile.machine_chemplant.name=化工厂(遗留) tile.machine_chungus.name=“利维坦”巨型汽轮机 tile.machine_chungus.desc=效率: 85%% tile.machine_coal_off.name=火力发电机 @@ -5571,6 +5566,53 @@ tile.rbmk_steam_inlet.desc=当启用ReaSim锅炉时向反应堆内输入水$从 tile.rbmk_steam_outlet.name=RBMK ReaSim蒸汽出口 tile.rbmk_steam_outlet.desc=当启用ReaSim锅炉时从反应堆内输出超热蒸汽$从侧面连接至反应堆结构 tile.rbmk_storage.name=RBMK燃料棒存储棒 +tile.rbmk.dodd.heat=温度 +tile.rbmk.dodd.reasimWater=ReaSim给水量 +tile.rbmk.dodd.reasimSteam=ReaSim蒸汽量 +tile.rbmk.dodd.level=控制棒深度 +tile.rbmk.dodd.targetLevel=目标深度 +tile.rbmk.dodd.startingLevel=起始深度 +tile.rbmk.dodd.mult=倍数 +tile.rbmk.dodd.color=颜色 +tile.rbmk.dodd.levelLower=深度下限 +tile.rbmk.dodd.levelUpper=深度上限 +tile.rbmk.dodd.heatLower=温度下限 +tile.rbmk.dodd.heatUpper=温度上限 +tile.rbmk.dodd.function=函数类型 +tile.rbmk.dodd.fluxSlow=慢中子计数 +tile.rbmk.dodd.fluxFast=快中子计数 +tile.rbmk.dodd.hasRod=是否有燃料棒 +tile.rbmk.dodd.progress=进度 +tile.rbmk.dodd.cooled=冷却中 +tile.rbmk.dodd.burned=燃烧中 +tile.rbmk.dodd.f_heat=燃料棒温度 +tile.rbmk.dodd.f_xenon=氙中毒指数 +tile.rbmk.dodd.f_yield=耐久 +tile.rbmk.dodd.gas=气体 +tile.rbmk.dodd.feed=工质储量 +tile.rbmk.dodd.steam=蒸汽储量 +tile.rbmk.dodd.cryo=凝胶储量 +tile.rbmk.dodd.fuel=燃料储量 +tile.rbmk.dodd.feed_type=工质种类(ID) +tile.rbmk.dodd.steam_type=蒸汽种类(ID) +tile.rbmk.dodd.cryo_type=凝胶种类(ID) +tile.rbmk.dodd.gas_type=气体种类(ID) +tile.rbmk.dodd.fuel_type=燃料种类(ID) +tile.rbmk.dodd.feed_p=工质压力 +tile.rbmk.dodd.steam_p=蒸汽压力 +tile.rbmk.dodd.cryo_p=凝胶压力 +tile.rbmk.dodd.gas_p=气体压力 +tile.rbmk.dodd.fuel_p=燃料压力 +tile.rbmk.dodd.feed_max=工质最大储量 +tile.rbmk.dodd.steam_max=蒸汽最大储量 +tile.rbmk.dodd.cryo_max=凝胶最大储量 +tile.rbmk.dodd.gas_max=气体最大储量 +tile.rbmk.dodd.fuel_max=燃料最大储量 +tile.rbmk.dodd.feed_amt=工质储量 +tile.rbmk.dodd.steam_amt=蒸汽储量 +tile.rbmk.dodd.cryo_amt=凝胶储量 +tile.rbmk.dodd.gas_amt=气体储量 +tile.rbmk.dodd.fuel_amt=燃料储量 tile.reactor_computer.name=反应堆控制器 tile.reactor_conductor.name=反应堆锅炉 tile.reactor_control.name=控制棒 @@ -6090,4 +6132,59 @@ tile.fan.falloffOn=风扇功率随距离增加而减小 tile.fan.falloffOff=稳定的风扇功率 tile.glass_polarized.name=偏光玻璃 tile.machine_autosaw.suspended=暂停 -tile.machine_chemical_plant.name=化工厂二代 : 电子布加洛 +tile.machine_chemical_plant.name=化工厂 +hbm.key.ability=循环工具能力 +hbm.key.abilityAlt=配置工具能力 +hbm.key.toggleMagnet=开关磁铁 +upgrade.speed=工作速度 %s +container.machineChemicalFactory=大型化工厂 +item.rangefinder.name=测距仪 +tile.fluid_duct_paintable_block_exhaust.name=可涂漆排气管 +tile.machine_chemical_factory.name=大型化工厂 +tile.machine_chemical_factory.desc=可处理四个配方的化工厂。$配方处理速度更快。$但也需要消耗更多电量。$需要水来运行。$会产生低压蒸汽。 +tool.ability.hammer_flat=平整表面 +container.machineAssemblyMachine=装配机 +damage.category.PHYS=物理 +item.ammo_secret.p35_800_bl.name=.35-800 V9 (黑雷霆) +item.blueprints.name=蓝图 +item.chunk_ore.moonstone.name=月长石 +tile.logic_block.name=地牢逻辑砖块 +tile.trapdoor_steel.name=钢活板门 +tile.machine_assembly_machine.name=装配机 +tile.wand_logic.name=结构魔杖方块(逻辑) +item.fluid_pack_empty.name=大型流体容器 +item.fluid_pack_full.name=流体包装 %s +tile.pneumatic_tube_paintable.name=可涂漆气动物流管道 +tile.oc_cable_paintable.name=可涂漆网线 +container.rebar=钢筋铺设器 +hbmfluid.concrete=液态混凝土 +item.blueprint_folder.name=蓝图册 +item.rebar_placer.name=钢筋铺设器 +tile.concrete_rebar.name=钢筋混凝土 +tile.rebar.name=钢筋 +container.rbmkAutoloader=RBMK燃料自动装填机 +item.item_expensive.bronze_tubes.name=青铜结构件 +item.item_expensive.circuit.name=大型电路板 +item.item_expensive.computer.name=处理器主机 +item.item_expensive.ferro_plating.name=强化铀铁合金板 +item.item_expensive.heavy_frame.name=重型框架 +item.item_expensive.lead_plating.name=防辐射镀层 +item.item_expensive.steel_plating.name=铆接固定钢板 +purex.recycle=再处理 %s +tile.rbmk_autoloader.name=RBMK燃料自动装填机 +autoswitch=自动切换组"%s"的一部分。$配方根据第一次输入而变化。 +autoswitch.plate=板状燃料再处理 +autoswitch.plates=金属板 +autoswitch.pwr=PWR燃料再处理 +autoswitch.schrab=Sa326萃取 +autoswitch.watz=Watz燃料靶丸再处理 +autoswitch.zirnox=锆诺克斯燃料再处理 +container.machinePUREX=PUREX +item.gun_autoshotgun_heretic.name=异教徒 +purex.schrab=从 %s 中萃取Sa326 +tile.machine_purex.name=钚铀还原提取设备(PUREX) +tile.machine_purex.desc=可用于多种核燃料的再处理机器。$大多数配方需要用到硝酸和煤油。 +qmaw.tab=[按 %s 键获取帮助] +commands.locate.no_match=没有具有此名称的结构! +commands.locate.none_found=未在附近找到结构! +commands.locate.success.coordinates=在 %2$d, %3$d 处找到结构 %1$s diff --git a/src/main/resources/assets/hbm/manual/demo.json b/src/main/resources/assets/hbm/manual/demo.json deleted file mode 100644 index f21a54d12..000000000 --- a/src/main/resources/assets/hbm/manual/demo.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "DEMO", - "icon": ["hbm:item.gun_light_revolver", 1, 0], - "content": { - "en_US": "This is a test page that links to [[Demo|DEMO]].\n\nFormat line break" - } -} diff --git a/src/main/resources/assets/hbm/manual/material/alloy.json b/src/main/resources/assets/hbm/manual/material/alloy.json new file mode 100644 index 000000000..fc37bc84e --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/alloy.json @@ -0,0 +1,17 @@ +{ + "name": "Advanced Alloy", + "icon": ["hbm:item.ingot_advanced_alloy", 1, 0], + "trigger": [["hbm:item.ingot_advanced_alloy"], ["hbm:item.powder_advanced_alloy"], ["hbm:item.plate_advanced_alloy"]], + "title": { + "en_US": "Advanced Alloy", + "uk_UA": "Удосконалений сплав", + "zh_CN": "高级合金", + "ru_RU": "Продвинутый сплав" + }, + "content": { + "en_US": "Made in a [[blast furnace|Blast Furnace]] from [[steel|Steel]] and [[Minecraft grade copper|Minecraft Grade Copper]]. Makes better-than-diamond gear. Also used in some high-powered magnets for the [[fusion reactor|Fusion Reactor]] and the [[exposure chamber|Exposure Chamber]].", + "uk_UA": "Виготовлено в [[доменній печі|Blast Furnace]] зі [[сталі|Steel]] та [[червоної міді|Minecraft Grade Copper]]. З нього робиться спорядження краще за алмазне. Також використовується в деяких потужних магнітах для [[термоядерного реактору|Fusion Reactor]] та [[камери опромінювання|Exposure Chamber]].", + "ru_RU": "Изготовлено в [[доменной печи|Blast Furnace]] из [[стали|Steel]] и [[красной меди|Minecraft Grade Copper]]. Из него делают инструменты, превосходящие алмазные. Также используется в некоторых мощных магнитах для [[термоядерного реактора|Fusion Reactor]] и [[камеры облучения|Exposure Chamber]].", + "zh_CN": "在[[高炉|Blast Furnace]]中使用[[钢|Steel]]和[[紫铜|Minecraft Grade Copper]]制成。其制成的工具比钻石更加优质。同时也能用于制作[[聚变反应堆|Fusion Reactor]]和[[辐照舱|Exposure Chamber]]的高能磁铁。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/aluminium.json b/src/main/resources/assets/hbm/manual/material/aluminium.json new file mode 100644 index 000000000..8a8af90d9 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/aluminium.json @@ -0,0 +1,17 @@ +{ + "name": "Aluminium", + "icon": ["hbm:item.ingot_aluminium", 1, 0], + "trigger": [["hbm:item.ingot_aluminium"], ["hbm:item.plate_aluminium"], ["hbm:item.powder_aluminium"]], + "title": { + "en_US": "Aluminium", + "uk_UA": "Алюміній", + "ru_RU": "Алюминий", + "zh_CN": "铝" + }, + "content": { + "en_US": "Common, lightweight metal. Available early on from smelting cryolite ('aluminium-bearing ore') in a [[combination oven|Combination Oven]]. Can be made later by processing [[bauxite|Bauxite]], and [[electrolyzing|Electrolysis Machine]] the resulting alumina solution.

Used in piping, general fluid handling, as part of [[gunmetal|Gunmetal]] and missile fuselages.", + "uk_UA": "Звичайний, легкий метал. Доступний на ранніх стадіях шляхом плавлення кріоліту ('алюмінієвої руди') у [[коксовій печі|Combination Oven]]. Може бути отриманий пізніше шляхом обробки [[бокситів|Bauxite]], та [[електролізу|Electrolysis Machine]] отриманого розчину оксиду алюмінію.

Використовується в трубопроводах, загальній роботі з рідинами, як компонент [[гарматної бронзи|Gunmetal]] та фюзеляжів ракет.", + "ru_RU": "Распространённый легкий металл. Доступен на ранних этапах от плавки криолита ('алюминиевая руда') в [[коксовой печи|Combination Oven]]. Позже может быть получен путём обработки [[боксита|Bauxite]] и [[электролиза|Electrolysis Machine]] полученного раствора глинозёма.

Используется в трубах, общем обращении с жидкостями, как часть [[оружейного металла|Gunmetal]] и фюзеляжей ракет.", + "zh_CN": "常见的轻质金属,在早期可使用[[复式炼焦炉|Combination Oven]]冶炼冰晶石(含铝矿石)来得到铝。后期可通过加工[[铝土矿|Bauxite]],后使用[[电解机|Electrolysis Machine]]处理氧化铝溶液得到。

用于制作管道,一般流体储存,制作[[炮铜|Gunmetal]]和导弹弹体。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/arsenic.json b/src/main/resources/assets/hbm/manual/material/arsenic.json new file mode 100644 index 000000000..eee027fb1 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/arsenic.json @@ -0,0 +1,17 @@ +{ + "name": "Arsenic", + "icon": ["hbm:item.ingot_arsenic", 1, 0], + "trigger": [["hbm:item.ingot_arsenic"], ["hbm:item.nugget_arsenic"]], + "title": { + "en_US": "Arsenic", + "uk_UA": "Миш'як", + "ru_RU": "Мышьяк", + "zh_CN": "砷" + }, + "content": { + "en_US": "Obtainable by treating oily scraps with [[high-performance solvent|High-Performance Solvent]] in an [[acidizer|Ore Acidizer]]. Oily scraps can be created by [[shredding|Shredder]] polluted blocks created by the [[fracking tower|Hydraulic Fracking Tower]]. Primarily used as [[arsenic bronze|Arsenic Bronze]].", + "uk_UA": "Отримується шляхом обробки нафтових відходів [[високоефективним розчинником|High-Performance Solvent]] в [[рудному окислювачі|Ore Acidizer]]. Нафтові відходи утворюються [[подрібненням|Shredder]] забруднених блоків, утворених [[вежею гідророзриву|Hydraulic Fracking Tower]]. В основному використовується як [[миш'якова бронза|Arsenic Bronze]].", + "ru_RU": "Получается путём обработки нефтяных отходов [[высокоэффективным растворителем|High-Performance Solvent]] в [[рудном окислитиле|Ore Acidizer]]. Нефтяные отходы можно создать [[измельчением|Shredder]] загрязненных блоков, созданных [[башней гидроразрыва|Hydraulic Fracking Tower]]. В основном используется как [[мышьяковая бронза|Arsenic Bronze]].", + "zh_CN": "可通过在[[酸化机|Ore Acidizer]]中使用[[高性能溶剂|High-Performance Solvent]]处理油性废料获得。油性废料可在[[粉碎机|Shredder]]中粉碎[[水力压裂塔|Hydraulic Fracking Tower]]产生的污染方块获得。主要用于制作[[砷青铜|Arsenic Bronze]]。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json new file mode 100644 index 000000000..eaec58dcb --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/arsenic_bronze.json @@ -0,0 +1,17 @@ +{ + "name": "Arsenic Bronze", + "icon": ["hbm:item.ingot_arsenic_bronze", 1, 0], + "trigger": [["hbm:item.ingot_arsenic_bronze"]], + "title": { + "en_US": "Arsenic Bronze", + "uk_UA": "Миш'якова бронза", + "ru_RU": "Мышьяковая бронза", + "zh_CN": "砷青铜" + }, + "content": { + "en_US": "Derivative of [[arsenic|Arsenic]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]] due to requiring [[high-performance solvent|High-Performance Solvent]].

Fully interchangeable with [[bismuth bronze|Bismuth Bronze]].", + "uk_UA": "Похідна від [[миш'яку|Arsenic]], виготовлена в [[ливарні|Crucible]], доступна лише після будівництва [[РБМК|RBMK]] через необхідність у [[високоефективному розчиннику|High-Performance Solvent]].

Повністю взаємозамінна з [[вісмутовою бронзою|Bismuth Bronze]].", + "ru_RU": "Производное от [[мышьяка|Arsenic]], изготовленное в [[плавильне|Crucible]], поэтому доступно только после постройки [[РБМК|RBMK]] из-за требования [[высокоэффективного растворителя|High-Performance Solvent]].

Полностью взаимозаменяемо с [[висмутовой бронзой|Bismuth Bronze]].", + "zh_CN": "使用[[砷|Arsenic]]在[[坩埚|Crucible]]中制作的衍生物,只能在建造[[RBMK]]之后获得,因为提取砷需要用到[[高性能溶剂|High-Performance Solvent]]。

和[[铋青铜|Bismuth Bronze]]完全通用。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/bakelite.json b/src/main/resources/assets/hbm/manual/material/bakelite.json new file mode 100644 index 000000000..2d7a05db9 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/bakelite.json @@ -0,0 +1,17 @@ +{ + "name": "Bakelite", + "icon": ["hbm:item.ingot_bakelite", 1, 0], + "trigger": [["hbm:item.ingot_bakelite"], ["hbm:item.powder_bakelite"]], + "title": { + "en_US": "Bakelite", + "uk_UA": "Карболіт", + "ru_RU": "Бакелит", + "zh_CN": "电木" + }, + "content": { + "en_US": "Alternative to [[polymer|Polymer]] made from [[aromatic hydrocarbons|Aromatic Hydrocarbons]] derived from [[cracked oil products|Catalytic Cracking Tower]]. Completely interchangeable in all recipes.", + "uk_UA": "Карболіт (радянська назва бакеліту) — альтернатива [[полімеру|Polymer]], виготовлений з [[ароматичних вуглеводнів|Aromatic Hydrocarbons]], отриманих з [[продуктів крекінгу нафти|Catalytic Cracking Tower]]. Повністю взаємозамінний у всіх рецептах.", + "ru_RU": "Альтернатива [[полимеру|Polymer]], изготовленная из [[ароматических углеводородов|Aromatic Hydrocarbons]], полученных из [[продуктов крекинга нефти|Catalytic Cracking Tower]]. Полностью взаимозаменяема во всех рецептах.", + "zh_CN": "[[聚合物|Polymer]]的替代品,使用处理[[裂化油|Catalytic Cracking Tower]]得到的产品之一[[芳香烃|Aromatic Hydrocarbons]]制作。在所有配方中与聚合物完全通用。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/bismuth.json b/src/main/resources/assets/hbm/manual/material/bismuth.json new file mode 100644 index 000000000..40d513ca7 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/bismuth.json @@ -0,0 +1,17 @@ +{ + "name": "Bismuth", + "icon": ["hbm:item.ingot_bismuth", 1, 0], + "trigger": [["hbm:item.ingot_bismuth"], ["hbm:item.billet_bismuth"], ["hbm:item.nugget_bismuth"], ["hbm:item.powder_bismuth"]], + "title": { + "en_US": "Bismuth", + "uk_UA": "Вісмут", + "ru_RU": "Висмут", + "zh_CN": "铋" + }, + "content": { + "en_US": "Heavy metal, intially derived from reprocessing spent [[RBMK]] fuel in the [[SILEX]], can also be made from later stage bedrock ore processing using [[high-performance solvent|High-Performance Solvent]]. Primarily used as [[bismuth bronze|Bismuth Bronze]].", + "uk_UA": "Важкий метал, початково який можна отримати у результаті переробки відпрацьованого палива [[РБМК|RBMK]] в [[SILEX]], також може бути отриманий на пізнішій стадії переробки корінної руди з використанням [[високоефективного розчинника|High-Performance Solvent]]. Переважно використовуюється як [[вісмутова бронза|Bismuth Bronze]].", + "ru_RU": "Тяжёлый металл, первоначально получаемый из переработки отработанного топлива [[РБМК|RBMK]] в [[SILEX]], также может быть получен в поздние стадии обработки бедроковой руды с использованием [[высокоэффективного растворителя|High-Performance Solvent]]. В основном используется в виде [[висмутовой бронзы|Bismuth Bronze]].", + "zh_CN": "一种重金属,最初可使用[[SILEX]]回收枯竭的[[RBMK]]燃料获取,之后也可在基岩矿石处理的后期步骤中,使用[[高性能溶剂|Hing-Performance Solvent]]处理矿石获取。主要用于制作[[铋青铜|Bismuth Bronze]]。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json new file mode 100644 index 000000000..a2d5eb72d --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/bismuth_bronze.json @@ -0,0 +1,17 @@ +{ + "name": "Bismuth Bronze", + "icon": ["hbm:item.ingot_bismuth_bronze", 1, 0], + "trigger": [["hbm:item.ingot_bismuth_bronze"]], + "title": { + "en_US": "Bismuth Bronze", + "uk_UA": "Вісмутова бронза", + "ru_RU": "Висмутовая бронза", + "zh_CN": "铋青铜" + }, + "content": { + "en_US": "Derivative of [[bismuth|Bismuth]] made in the [[crucible|Crucible]], therefore available only after building an [[RBMK]].

Fully interchangeable with [[arsenic bronze|Arsenic Bronze]].", + "uk_UA": "Похідна від [[вісмуту|Bismuth]], виготовлена в [[ливарні|Crucible]], доступна лише після будівництва [[РБМК|RBMK]]br>
Повністю взаємозамінна з [[миш'яковою бронзою|Arsenic Bronze]].", + "ru_RU": "Производное от [[висмута|Bismuth]], изготовленное в [[плавильне|Crucible]], поэтому доступно только после постройки [[РБМК|RBMK]].

Полностью взаимозаменяема с [[мышьяковой бронзой|Arsenic Bronze]].", + "zh_CN": "使用[[铋|Bismuth]]在[[坩埚|Crucible]]中制作的衍生物,只能在建造[[RBMK]]之后获得。

和[[砷青铜|Arsenic Bronze]]完全通用。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/bscco.json b/src/main/resources/assets/hbm/manual/material/bscco.json new file mode 100644 index 000000000..562b4789d --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/bscco.json @@ -0,0 +1,17 @@ +{ + "name": "BSCCO", + "icon": ["hbm:item.ingot_bscco", 1, 0], + "trigger": [["hbm:item.ingot_bscco"], ["hbm:item.wire_dense", 1, 48]], + "title": { + "en_US": "BSCCO", + "uk_UA": "Вісмут стронцій кальцій мідь оксид (BSCCO)", + "ru_RU": "BSCCO", + "zh_CN": "BSCCO超导体" + }, + "content": { + "en_US": "Powerful superconductor, used in high tier circuits and coils for the [[particle accelerator|Particle Accelerator]]. Requires [[bismuth|Bismuth]], and is therefore only obtainable after building an [[RBMK]].", + "uk_UA": "Потужний надпровідник, що використовується у високоякісних платах та котушках для [[прискорювача часток|Particle Accelerator]]. Потребує [[вісмут|Bismuth]], і тому доступний лише після побудови [[РБМК|RBMK]].", + "ru_RU": "Мощный сверхпроводник, используемый в высокоуровневых цепях и катушках для [[ускорителя частиц|Particle Accelerator]]. Требует [[висмут|Bismuth]], и поэтому доступен только после постройки [[РБМК|RBMK]].", + "zh_CN": "强力的超导体,用于制作高等级的电路及用于[[粒子加速器|Particle Accelerator]]的线圈。需要[[铋|Bismuth]]制作,因此只能在建造[[RBMK]]后获得。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/cadmium.json b/src/main/resources/assets/hbm/manual/material/cadmium.json new file mode 100644 index 000000000..10b34e06e --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/cadmium.json @@ -0,0 +1,17 @@ +{ + "name": "Cadmium", + "icon": ["hbm:item.ingot_cadmium", 1, 0], + "trigger": [["hbm:item.ingot_cadmium"], ["hbm:item.powder_cadmium"]], + "title": { + "en_US": "Cadmium", + "uk_UA": "Кадмій", + "ru_RU": "Кадмий", + "zh_CN": "镉" + }, + "content": { + "en_US": "Made by treating mustard willow leaves with [[high-performance solvent|High-Performance Solvent]]. Used in [[PVC]], a lategame alternate recipe for [[rubber|Rubber]] and for [[cadmium steel|Cadmium Steel]], which acts as a [[technetium steel|Technetium Steel]] substitute.", + "uk_UA": "Виготовляється шляхом обробки листя гірчичної верби [[високоефективним розчинником|High-Performance Solvent]]. Використовується у [[полівінілхлориді|PVC]], пізньому альтернативному рецепті для [[гуми|Rubber]] та для [[кадмієвої сталі|Cadmium Steel]], яка виступає як замінник [[технецієвої сталі|Technetium Steel]].", + "ru_RU": "Изготовлен путём обработки листьев горчичной ивы [[высокоэффективным растворителем|High-Performance Solvent]]. Используется в [[ПВХ|PVC]], позднеигровом альтернативном рецепте для [[резины|Rubber]] и для [[кадмиевой стали|Cadmium Steel]], которая действует как замена [[технециевой стали|Technetium Steel]].", + "zh_CN": "使用[[高性能溶剂|High-Performance Solvent]]处理芥子柳叶获取。用于制作[[PVC]],也可用于游戏后期的[[橡胶|Rubber]]替代配方,以及制作[[锝钢|Technetium Steel]]的替代品[[镉钢|Cadmium Steel]]。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/cadmium_steel.json b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json new file mode 100644 index 000000000..776a3dc5e --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/cadmium_steel.json @@ -0,0 +1,17 @@ +{ + "name": "Cadmium Steel", + "icon": ["hbm:item.ingot_cdalloy", 1, 0], + "trigger": [["hbm:item.ingot_cdalloy"]], + "title": { + "en_US": "Cadmium Steel", + "uk_UA": "Кадмієва сталь", + "ru_RU": "Кадмиевая сталь", + "zh_CN": "镉钢" + }, + "content": { + "en_US": "Corrosion-resistant alloy, made from [[steel|Steel]] and [[cadmium|Cadmium]]. Alternative to [[technetium steel|Technetium Steel]] in most recipes.", + "uk_UA": "Корозійностійкий сплав, виготовлений зі [[сталі|Steel]] та [[кадмію|Cadmium]]. Альтернатива [[технецієвій сталі|Technetium Steel]] в більшості рецептів.", + "ru_RU": "Коррозионно-стойкий сплав, изготовленный из [[стали|Steel]] и [[кадмия|Cadmium]]. Альтернатива [[технециевой стали|Technetium Steel]] в большинстве рецептов.", + "zh_CN": "由[[钢|Steel]]和[[镉|Cadmium]]制成的耐腐蚀合金,可在大部分配方中替代[[锝钢|Technetium Steel]]。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/cinnabar.json b/src/main/resources/assets/hbm/manual/material/cinnabar.json new file mode 100644 index 000000000..75596122a --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/cinnabar.json @@ -0,0 +1,17 @@ +{ + "name": "Cinnabar", + "icon": ["hbm:item.cinnebar", 1, 0], + "trigger": [["hbm:item.cinnebar"]], + "title": { + "en_US": "Cinnabar", + "uk_UA": "Кіновар", + "ru_RU": "Киноварь", + "zh_CN": "朱砂" + }, + "content": { + "en_US": "Rare ore. Can be [[acidized|Ore Acidizer]] into 375mB worth of [[mercury|Mercury]] drops, or [[combination smelted|Combination Oven]] into 100mB of mercury and some sulfur. Mainly exists as an early means to get mercury for [[desh|Desh]] production.", + "uk_UA": "Рідкісна руда. Може бути [[окислена|Ore Acidizer]] в 375mB [[ртуті|Mercury]] (3 краплі ртуті), або виплавлена у [[коксовій печі|Combination Oven]] в 100mB ртуті та трохи сірки. Здебільшого використовується як ранній спосіб отримання ртуті для виробництва [[деш|Desh]].", + "ru_RU": "Редкая руда. Может быть [[обработана кислотой|Ore Acidizer]] в 375 мБ капель [[ртути|Mercury]] или [[переплавлена в коксовой печи|Combination Oven]] в 100 мБ ртути и немного серы. В основном используется как ранний способ получения ртути для производства [[деш|Desh]].", + "zh_CN": "稀有矿物,可[[酸化|Ore Acidizer]]为相当于375mB流体的[[水银|Mercury]]液滴,也可[[炼焦|Combination Oven]]为100mB水银和一个硫粉。其主要作为获取生产[[Desh]]需要的水银的早期手段。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/coke.json b/src/main/resources/assets/hbm/manual/material/coke.json new file mode 100644 index 000000000..d5ff23cef --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/coke.json @@ -0,0 +1,17 @@ +{ + "name": "Coke", + "icon": ["hbm:item.coke", 1, 0], + "trigger": [["hbm:item.coke", 1, 32767]], + "title": { + "en_US": "Coke", + "uk_UA": "Кокс", + "ru_RU": "Кокс", + "zh_CN": "焦炭" + }, + "content": { + "en_US": "High-purity carbon, has twice the burn value of coal. Can be pressed into [[graphite|Graphite]], used in various [[steel|Steel]] recipes or as a source of carbon for the [[crucible|Crucible]].

Coal coke can be made by smelting coal briquettes, or combination smelting coal in its various forms.

Lignite coke is made from the much cheaper and less powerful lignite in much the same way, despite this it has the same characteristics.

Petroleum coke is made either from non-coal tars in a [[combination oven|Combination Oven]], or by coking various types of oil in a [[coker|Coking Unit]].", + "uk_UA": "Високочистий вуглець, має вдвічі вищу горючість, ніж вугілля. Може бути зпресований у [[графіт|Graphite]], використовується у різних рецептах [[сталі|Steel]] або як джерело вуглецю для [[ливарні|Crucible]].

Вугільний кокс можна виготовляти шляхом обсмаження вугільних брикетів або коксування вугілля в різних його формах.

Буровугільний кокс виготовляється з набагато дешевшого та менш потужного бурого вугілля майже таким самим способом, незважаючи на це, він має ті ж характеристики.

Нафтовий кокс виготовляється або з невугільних смол у [[коксовій печі|Combination Oven]], або шляхом коксування різних видів нафтопродуктів у [[коксовій установці|Coking Unit]].", + "ru_RU": "Высокочистый углерод, имеет вдвое большую энергию сгорания, чем уголь. Может быть спрессован в [[графит|Graphite]], используется в различных рецептах [[стали|Steel]] или как источник углерода для [[плавильни|Crucible]].

Угольный кокс можно получить путём переплавки угольных брикетов или комбинированной переплавки угля в различных формах.

Бурый кокс изготавливается из более дешёвого и менее мощного бурого угля тем же способом, но обладает теми же характеристиками.

Нефтяной кокс производится либо из неугольных смол в [[коксовой печи|Combination Oven]], либо путём коксования различных видов масла в [[коксовой установке|Coking Unit]].", + "zh_CN": "高纯度的碳,其热值为煤炭的两倍。可被锻压为[[石墨|Graphite]],也可用于多种炼[[钢|Steel]]配方或作为[[坩埚|Crucible]]中碳的来源。

煤焦炭可通过在熔炉中烧炼煤球获取,或在复式炼焦炉中炼焦各种形式的煤炭获取。

褐煤焦炭可以以更廉价且品质更低的褐煤为原料,通过相同的方式获取, 尽管其特性与煤焦炭完全相同。

石油焦炭可通过在[[复式炼焦炉|Combination Oven]]中炼焦焦油(煤焦油除外)获取,也可通过在[[焦化装置|Coking Unit]]中焦化多种油获取。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/copper.json b/src/main/resources/assets/hbm/manual/material/copper.json new file mode 100644 index 000000000..bbcc0eabe --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/copper.json @@ -0,0 +1,17 @@ +{ + "name": "Copper", + "icon": ["hbm:item.ingot_copper", 1, 0], + "trigger": [["hbm:item.ingot_copper"], ["hbm:item.plate_copper"], ["hbm:item.powder_copper"]], + "title": { + "en_US": "Copper", + "uk_UA": "Мідь", + "ru_RU": "Медь", + "zh_CN": "铜" + }, + "content": { + "en_US": "Common resource. In its raw form, mostly used as a structural material, and in things that handle high temperatures (as a heat conductor). Strongly used in various alloyed forms.

[[Minecraft grade copper|Minecraft Grade Copper]] is an alloy made from redstone that is used in almost all electrical things.

[[Advanced alloy|Advanced Alloy]] is a powerful early tool material which surpasses diamond.

[[Gunmetal]] is a vital component of many guns, as well as casings for ammunition.

[[Bismuth bronze|Bismuth Bronze]] and [[arsenic bronze|Arsenic Bronze]] are post-[[RBMK]] materials used in many late-game machines.

[[BSCCO]] is a [[bismuth|Bismuth]]-derived super conductor needed for high-tier quantum circuits and [[particle accelerator|Particle Accelerator]] coils.", + "uk_UA": "Поширений ресурс. У сирому вигляді здебільшого використовується як конструкційний матеріал, а також у речах, що витримують високі температури (такі як теплопропровідники). Активно використовується в різних сплавах.

[[Червона мідь|Minecraft Grade Copper]] — це сплав, виготовлений з редстоуну, який використовується майже у всіх електричних пристроях.

[[Удосконалений сплав|Advanced Alloy]] — це потужний ранній інструментальний матеріал, який перевершує алмаз.

[[Гарматна бронза|Gunmetal]] — це важливий компонент багатьох видів зброї, а також гільз для боєприпасів.

[[Вісмутова бронза|Bismuth Bronze]] та [[миш'якова бронза|Arsenic Bronze]] — це пост-[[РБМК|RBMK]] матеріали що використовуються в багатьох машинах пізньої версії гри.

[[BSCCO]] — це надпровідник, похідний від [[вісмуту|Bismuth]] необхідний для високорівневих квантових схем та котушок [[прискорювача часток|Particle Accelerator]].", + "ru_RU": "Распространённый ресурс. В чистом виде в основном используется как конструкционный материал и в вещах, работающих с высокими температурами (как теплопроводник). Широко применяется в различных сплавах.

[[Красная медь|Minecraft Grade Copper]] — это сплав, изготовленный из красного камня, используемый почти во всех электрических устройствах.

[[Продвинутый сплав|Advanced Alloy]] — мощный материал для ранних инструментов, превосходящий алмаз.

[[Оружейный металл|Gunmetal]] — важный компонент многих видов оружия, а также гильз для боеприпасов.

[[Висмутовая бронза|Bismuth Bronze]] и [[мышьяковая бронза|Arsenic Bronze]] — материалы, доступные после [[РБМК|RBMK]], используемые во многих машинах поздней игры.

[[BSCCO]] — сверхпроводник, производный от [[висмута|Bismuth]], необходимый для высокоуровневых квантовых схем и катушек [[ускорителя частиц|Particle Accelerator]].", + "zh_CN": "常见资源。纯铜主要用作结构材料,或在能够承受高温的设备中使用(作热导体); 铜的多种合金用途极广。

[[紫铜|Minecraft Grade Copper]]是红石和铜的合金,几乎所有电力设备都使用紫铜。

[[高级合金|Advanced Alloy]]是前期强力的装备材料,其性能优于钻石。

[[炮铜|Gunmetal]]是制作多种枪炮必不可少的材料,同时也用于制造弹壳。

[[铋青铜|Bismuth Bronze]]和[[砷青铜|Arsenic Bronze]]是 [[RBMK]] 后的材料,用于制作多种后期机器。

[[BSCCO]]是一种由铋衍生的超导体,高等级的量子电路和[[粒子加速器|Particle Accelerator]]线圈都需要BSCCO超导体制作。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/desh.json b/src/main/resources/assets/hbm/manual/material/desh.json new file mode 100644 index 000000000..1b21e5ce7 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/desh.json @@ -0,0 +1,17 @@ +{ + "name": "Desh", + "icon": ["hbm:item.ingot_desh", 1, 0], + "trigger": [["hbm:item.ingot_desh"], ["hbm:item.powder_desh"]], + "title": { + "en_US": "Desh", + "uk_UA": "Деш", + "ru_RU": "Деш", + "zh_CN": "Desh" + }, + "content": { + "en_US": "High-strength working alloy made in a [[chemical plant|Chemical Plant]]. Requires [[light oil|Light oil]] from basic [[oil|Crude Oil]] refining, [[mercury|Mercury]], a byproduct of [[centrifuging|Centrifuge]] redstone ore and desh blend, which is just [[shredded|Shredder]] rare earth ore chunks.

Used in a variety of things, especially tools and weapons. Desh tools are slow and only iron tier, but are the first available ones to be unbreakable and offer many tool abilities.", + "uk_UA": "Високоміцний робочий сплав, виготовлений на [[хімічному заводі|Chemical Plant]]. Потребує [[легку нафту|Light oil]] з базової переробки [[нафти|Crude Oil]], [[ртуть|Mercury]], побічний продукт [[[центрифугування|Centrifuge]] редстоунової руди та деш суміш, яка є просто [[подрібненими|Shredder]] шматками рідкоземельної руди.

Використовується в різних речах, особливо в інструментах та зброї. Деш інструменти повільні та відповідають лише залізному тіру, але є першими доступними незламними інструментами з багатьма режимами роботи.", + "ru_RU": "Высокопрочный рабочий сплав, изготовленный на [[химической установке|Chemical Plant]]. Требует [[лёгкую нефть|Light oil]] из базовой переработки [[нефти|Crude Oil]], [[ртуть|Mercury]], побочный продукт [[центрифугирования|Centrifuge]] красной руды, и смесь деш, которая представляет собой просто [[измельчённые|Shredder]] куски редкоземельной руды.

Используется в различных вещах, особенно в инструментах и оружии. Инструменты из деш медленные и соответствуют железному уровню, но являются первыми доступными неломающимися инструментами с множеством способностей.", + "zh_CN": "在[[化工厂|Chemical Plant]]中制成的高强度工作合金,需要基础[[原油|Crude Oil]]精炼的产物[[轻油|Light Oil]]、[[离心|Centrifuge]]红石矿石得到的副产物[[水银|Mercury]]以及[[粉碎|Shredder]]稀土矿石块得到的Desh混合物制作。

用于制作多种物品,特别是工具和武器。Desh制工具挖掘速度较慢且挖掘等级 只相当于铁制工具,但其是最早可获得的无法破坏的工具之一,而且具有多个工具 能力。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/ferrouranium.json b/src/main/resources/assets/hbm/manual/material/ferrouranium.json new file mode 100644 index 000000000..3efb82964 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/ferrouranium.json @@ -0,0 +1,17 @@ +{ + "name": "Ferrouranium", + "icon": ["hbm:item.ingot_ferrouranium", 1, 0], + "trigger": [["hbm:item.ingot_ferrouranium"]], + "title": { + "en_US": "Ferrouranium", + "uk_UA": "Фероуран", + "ru_RU": "Ферроуран", + "zh_CN": "铀铁合金" + }, + "content": { + "en_US": "Alloy of [[steel|Steel]] and [[uranium-238|Uranium-238]] made in the [[crucible|Crucible]]. Mainly used in ducrete, weapon parts and high-explosive ammunition.", + "uk_UA": "Сплав [[сталі|Steel]] та [[урану-238|Uranium-238]], виготовлений у [[ливарні|Crucible]]. В основному використовується в уранобетоні, деталях зброї та вибухових боєприпасах.", + "ru_RU": "Сплав из [[стали|Steel]] и [[урана-238|Uranium-238]], изготовленный в [[плавильне|Crucible]]. В основном используется в дюкрете, деталях оружия и взрывных боеприпасах.", + "zh_CN": "[[钢|Steel]]与[[铀-238|Uranium-238]]的合金,在坩埚中制成。 主要用于制作贫铀混凝土、武器部件和高爆弹药。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/graphite.json b/src/main/resources/assets/hbm/manual/material/graphite.json new file mode 100644 index 000000000..eb0be35b5 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/graphite.json @@ -0,0 +1,17 @@ +{ + "name": "Graphite", + "icon": ["hbm:item.ingot_graphite", 1, 0], + "trigger": [["hbm:item.ingot_graphite"]], + "title": { + "en_US": "Graphite", + "uk_UA": "Графіт", + "ru_RU": "Графит", + "zh_CN": "石墨" + }, + "content": { + "en_US": "Made from pressing coke. Used in nuclear reactors, graphite electrodes for the [[electric arc furnace|Electric Arc Furnace]] or as a source for carbon in various [[crucible|Crucible]] recipes.", + "uk_UA": "Виготовляється пресуванням коксу. Використовується в ядерних реакторах, графітових електродах для [[електричної дугової печі|Electric Arc Furnace]] або як джерело вуглецю в різних рецептах [[ливарні|Crucible]].", + "ru_RU": "Изготавливается путём прессования кокса. Используется в ядерных реакторах, графитовых электродах для [[электродуговой печи|Electric Arc Furnace]] или как источник углерода в различных рецептах для [[плавильни|Crucible]].", + "zh_CN": "通过锻压焦炭获取。用于核反应堆、[[电弧炉|Electric Arc Furnace]]电极,也可作为部分[[坩埚|Crucible]]配方中碳的来源。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/gunmetal.json b/src/main/resources/assets/hbm/manual/material/gunmetal.json new file mode 100644 index 000000000..78ac96aaa --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/gunmetal.json @@ -0,0 +1,17 @@ +{ + "name": "Gunmetal", + "icon": ["hbm:item.ingot_gunmetal", 1, 0], + "trigger": [["hbm:item.ingot_gunmetal"], ["hbm:item.plate_gunmetal"]], + "title": { + "en_US": "Gunmetal", + "uk_UA": "Гарматна бронза", + "ru_RU": "Оружейный металл", + "zh_CN": "炮铜" + }, + "content": { + "en_US": "Alloy of [[aluminium|Aluminium]] and [[copper|Copper]]. Can be made in an anvil, or more efficiently in a [[rotary furnace|Rotary Furnace]]. Used mainly for weapon parts, as well as casings for most ammunition.", + "uk_UA": "Сплав [[алюмінію|Aluminium]] та [[міді|Copper]]. Може бути виготовлений на ковадлі або, що ефективніше, у [[роторній печі|Rotary Furnace]]. Використовується переважно для деталей зброї, а також для гільз більшості боєприпасів.", + "ru_RU": "Сплав из [[алюминия|Aluminium]] и [[меди|Copper]]. Может быть изготовлен на наковальне или более эффективно в [[роторной печи|Rotary Furnace]]. В основном используется для деталей оружия, а также для гильз большинства боеприпасов.", + "zh_CN": "[[铝|Aluminium]]和[[铜|Copper]]的合金。可在砧中制作,也可在[[回转炉|Rotary Furnace]]中更高效地制作。主要用于制作武器部件,也用于制作大部分弹壳。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/hss.json b/src/main/resources/assets/hbm/manual/material/hss.json new file mode 100644 index 000000000..5e31bd555 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/hss.json @@ -0,0 +1,17 @@ +{ + "name": "High-Speed Steel", + "icon": ["hbm:item.ingot_dura_steel", 1, 0], + "trigger": [["hbm:item.ingot_dura_steel"], ["hbm:item.powder_dura_steel"], ["hbm:item.plate_dura_steel"]], + "title": { + "en_US": "High-Speed Steel", + "uk_UA": "Швидкорізальна сталь", + "ru_RU": "Высокоскоростная сталь", + "zh_CN": "高速钢" + }, + "content": { + "en_US": "Alloy made from [[steel|Steel]], [[tungsten|Tungsten]] and [[cobalt|Cobalt]] in a [[curcible|Crucible]]. Created as liquid metal, needs to be cast into ingot or plate shape before being usable.", + "uk_UA": "Сплав зі [[сталі|Steel]], [[вольфраму|Tungsten]] та [[кобальту|Cobalt]], виготовлений в [[ливарні|Crucible]]. Створюється у вигляді рідкого металу, перед використанням його необхідно відлити у форму зливка або пластини.

Використовується для виготовлення різального обладнання що працює на великих швидкостях.", + "ru_RU": "Сплав из [[стали|Steel]], [[вольфрама|Tungsten]] и [[кобальта|Cobalt]], изготовленный в [[плавильне|Crucible]]. Создается в виде жидкого металла, требует отливки в форму слитка или пластины перед использованием.", + "zh_CN": "[[钢|Steel]、[[钨|Tungsten]]、[[钴|Cobalt]]的合金,在[[坩埚|Crucible]]中制成。制造出的高速钢为熔融状态, 在使用前需要将其铸造成锭或板的形式。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/latex.json b/src/main/resources/assets/hbm/manual/material/latex.json new file mode 100644 index 000000000..a00bcfee7 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/latex.json @@ -0,0 +1,17 @@ +{ + "name": "Latex", + "icon": ["hbm:item.ingot_biorubber", 1, 0], + "trigger": [["hbm:item.ingot_biorubber"], ["hbm:item.ball_resin"]], + "title": { + "en_US": "Latex", + "uk_UA": "Латекс", + "ru_RU": "Латекс", + "zh_CN": "乳胶" + }, + "content": { + "en_US": "Natural form of rubber, obtainable from dandelions or by pressing jungle wood. Can be replaced in all recipes by [[rubber|Rubber]], but not vice versa.", + "uk_UA": "Натуральна форма гуми, яку можна отримати з кульбаб або пресуванням тропічного дерева. У всіх рецептах може бути замінена на [[гуму|Rubber]], але не навпаки.", + "ru_RU": "Натуральная форма резины, добывается из одуванчиков или путём прессования древесины джунглей. Может быть заменена во всех рецептах на [[резину|Rubber]], но не наоборот.", + "zh_CN": "橡胶的天然形态,可用蒲公英合成获得或锻压丛林木获得。可在所有配方中被[[橡胶|Rubber]]替代,反之则不行。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/lead.json b/src/main/resources/assets/hbm/manual/material/lead.json new file mode 100644 index 000000000..629b2d00a --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/lead.json @@ -0,0 +1,17 @@ +{ + "name": "Lead", + "icon": ["hbm:item.ingot_lead", 1, 0], + "trigger": [["hbm:item.ingot_lead"], ["hbm:item.nugget_lead"], ["hbm:item.powder_lead"]], + "title": { + "en_US": "Lead", + "uk_UA": "Свинець", + "ru_RU": "Свинец", + "zh_CN": "铅" + }, + "content": { + "en_US": "Common resource. Mainly used for things that involve radiation, as well as ammunition, and as solder for many circuits.", + "uk_UA": "Поширений ресурс. В основному використовується для речей, пов'язаних з радіацією, та для боєприпасів, а також як припій для багатьох схем.", + "ru_RU": "Распространённый ресурс. В основном используется для вещей, связанных с радиацией, а также для боеприпасов и в качестве припоя для многих схем.", + "zh_CN": "常见资源,主要用于涉及辐射的设备,也用于制作弹药,以及用作电路板的焊料。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/mingrade.json b/src/main/resources/assets/hbm/manual/material/mingrade.json new file mode 100644 index 000000000..92137c7f0 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/mingrade.json @@ -0,0 +1,17 @@ +{ + "name": "Minecraft Grade Copper", + "icon": ["hbm:item.ingot_red_copper", 1, 0], + "trigger": [["hbm:item.ingot_red_copper"], ["hbm:item.powder_red_copper"]], + "title": { + "en_US": "Minecraft Grade Copper (Red Copper)", + "uk_UA": "Червона мідь (aka Minecraft Grade Copper)", + "ru_RU": "Красная медь", + "zh_CN": "紫铜" + }, + "content": { + "en_US": "Alloy made from copper and redstone in equal parts using the [[blast furnace|Blast Furnace]]. Used in almost all things electric, commonly in wire form.", + "uk_UA": "Сплав, виготовлений з [[міді|Copper]] та редстоуну в рівному співвідношенні в [[доменній печі|Blast Furnace]]. Використовується майже у всій електриці, зазвичай у вигляді дроту.", + "ru_RU": "Сплав, изготовленный из меди и красного камня в равных частях в [[доменной печи|Blast Furnace]]. Используется почти во всех электрических устройствах, обычно в виде проводов.", + "zh_CN": "等量的铜和红石在[[高炉|Blast Furnace]]中制作的合金。 主要以线的形式用于几乎所有电力设备。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/neptunium.json b/src/main/resources/assets/hbm/manual/material/neptunium.json new file mode 100644 index 000000000..0e3b80a58 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/neptunium.json @@ -0,0 +1,17 @@ +{ + "name": "Neptunium", + "icon": ["hbm:item.ingot_neptunium", 1, 0], + "trigger": [["hbm:item.ingot_neptunium"], ["hbm:item.billet_neptunium"], ["hbm:item.nugget_neptunium"], ["hbm:item.powder_neptunium"]], + "title": { + "en_US": "Neptunium", + "uk_UA": "Нептуній-237", + "ru_RU": "Нептуний", + "zh_CN": "镎" + }, + "content": { + "en_US": "Fissile isotope, usually found in spent [[uranium-235|Uranium-235]] fuel. Mostly used for nuclear reactors, either pure as high enriched neptunium fuel, or combined with [[uranium-238|Uranium-238]] as medium enriched neptunium fuel. Usable in the [[PWR]] and [[RBMK]].", + "uk_UA": "Ізотоп здатний до розщеплення, зазвичай міститься у відпрацьованому паливі [[урану-235|Uranium-235]]. Здебільшого використовується для ядерних реакторів у чистому вигляді як високозбагачене нептунієве паливо або в поєднанні з [[ураном-238|Uranium-238]] як середньозбагачене нептунієве паливо. Використовується в [[ВВЕР|PWR]] та [[РБМК|RBMK]].", + "ru_RU": "Делящийся изотоп, обычно содержится в отработанном топливе из [[урана-235|Uranium-235]]. В основном используется для ядерных реакторов, либо в чистом виде как высокообогащённое нептуниевое топливо, либо в сочетании с [[ураном-238|Uranium-238]] как среднеобогащённое нептуниевое топливо. Применяется в [[ВВЭР|PWR]] и [[РБМК|RBMK]].", + "zh_CN": "一种易裂变同位素,主要存在于枯竭的[[铀-235|Uranium-235]]燃料中。 主要用于核反应堆,纯净的镎既可直接用作高浓缩度镎燃料,也可和[[铀-238|Uranium-238]]混合为中浓缩度镎燃料。可用于[[PWR]]和[[RBMK]]。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-238.json b/src/main/resources/assets/hbm/manual/material/plutonium-238.json new file mode 100644 index 000000000..9d2330fdf --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/plutonium-238.json @@ -0,0 +1,17 @@ +{ + "name": "Plutonium-238", + "icon": ["hbm:item.billet_pu238", 1, 0], + "trigger": [["hbm:item.ingot_pu238"], ["hbm:item.billet_pu238"], ["hbm:item.nugget_pu238"]], + "title": { + "en_US": "Plutonium-238", + "uk_UA": "Плутоній-238", + "ru_RU": "Плутоний-238", + "zh_CN": "钚-238" + }, + "content": { + "en_US": "Radioisotope, used mainly in [[RTGs|RTG]]. Derived from [[plutonium|Plutonium]] hexafluoride, or from various nuclear fuels, mainly ones using [[uranium-235|Uranium-235]]. Usable with [[beryllium|Beryllium]] as Pu238Be neutron sources in [[RBMKs|RBMK]].

Moderately radioactive, very hot.", + "uk_UA": "Радіоізотоп, що використовується переважно в [[РІТЕГ|RTG]]. Отримується з гексафториду [[плутонію|Plutonium]], або з різного ядерного палива, переважно того, що використовує [[уран-235|Uranium-235]]. Використовується з [[берилієм|Beryllium]] як Плутоній-238 берилієве джерело нейтронів в [[РБМК|RBMK]].

Помірно радіоактивний, дуже гарячий.", + "ru_RU": "Радиоизотоп, в основном используется в [[РИТЭГ|RTG]]. Получается из гексафторида [[плутония|Plutonium]] или из различных ядерных топлив, преимущественно использующих [[уран-235|Uranium-235]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках плутоний-210-бериллевых источниках для [[РБМК|RBMK]].

Умеренно радиоактивен, очень горячий.", + "zh_CN": "放射性同位素,主要用于[[RTG]]。可从六氟化[[钚|Plutonium]]中提取,也可从一些核燃料(主要是含[[铀-235|Uranium-235]]的种类)中分离得到。可与[[铍|Beryllium]]混合制成钚-238-铍中子源,用于[[RBMK]]反应堆。

放射性中等,高温。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-239.json b/src/main/resources/assets/hbm/manual/material/plutonium-239.json new file mode 100644 index 000000000..1a80f4cbc --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/plutonium-239.json @@ -0,0 +1,17 @@ +{ + "name": "Plutonium-239", + "icon": ["hbm:item.billet_pu239", 1, 0], + "trigger": [["hbm:item.ingot_pu239"], ["hbm:item.billet_pu239"], ["hbm:item.nugget_pu239"]], + "title": { + "en_US": "Plutonium-239", + "uk_UA": "Плутоній-239", + "ru_RU": "Плутоний-239", + "zh_CN": "钚-239" + }, + "content": { + "en_US": "Primary fissile isotope of [[plutonium|Plutonium]]. Can be extracted from many spent fuels that use [[uranium-238|Uranium-238]] or directly from [[reactor-grade plutonium|Reactor-Grade Plutonium]]. Usable in high enriched fuels for various reactors, mixed with other isotopes for lower enriched fuels, or as fissile material in many nuclear bombs.

Moderately radioactive.", + "uk_UA": "Перший здатний до поділу ізотоп [[плутонію|Plutonium]]. Може бути отриманий з багатьох видів відпрацьованого палива, що використовують [[уран-238|Uranium-238]] бо безпосередньо з [[реакторного плутонію|Reactor-Grade Plutonium]]. Використовується у високозбагаченому паливі для різних реакторів, змішується з іншими ізотопами для низькозбагаченого палива або як заряд у багатьох ядерних бомбах.

Помірно радіоактивний.", + "ru_RU": "Основной делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из многих отработанных топлив, использующих [[уран-238|Uranium-238]], или непосредственно из [[реакторного плутония|Reactor-Grade Plutonium]]. Используется в высокообогащённом топливе для различных реакторов, в смеси с другими изотопами для менее обогащённых топлив или как делящийся материал во многих ядерных бомбах.

Умеренно радиоактивен.", + "zh_CN": "[[钚|Plutonium]]主要的易裂变同位素,可从多种使用[[铀-238|Uranium-238]]的核燃料中提取,或直接从[[反应堆级钚|Reactor-Grade Plutonium]]中分离得到。可在多种反应堆中用作高浓缩度燃料,也可与其他同位素混合制成 浓缩度较低的燃料,还可在多种核弹中用作裂变材料。

放射性中等。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-240.json b/src/main/resources/assets/hbm/manual/material/plutonium-240.json new file mode 100644 index 000000000..1406f170a --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/plutonium-240.json @@ -0,0 +1,17 @@ +{ + "name": "Plutonium-240", + "icon": ["hbm:item.billet_pu240", 1, 0], + "trigger": [["hbm:item.ingot_pu240"], ["hbm:item.billet_pu240"], ["hbm:item.nugget_pu240"]], + "title": { + "en_US": "Plutonium-240", + "uk_UA": "Плутоній-240", + "ru_RU": "Плутоний-240", + "zh_CN": "钚-240" + }, + "content": { + "en_US": "Non-fissile isotope found in [[plutonium|Plutonium]] and [[reactor-grade plutonium|Reactor-Grade-Plutonium]]. Only useful when manually making reactor-grade plutonium from [[plutonium-239|Plutonium-239]] or in specialized [[zirconium|Zirconium]] fast breeder rods for making [[plutonium-241|Plutonium-241]] in the [[RBMK]].", + "uk_UA": "Не здатний до поділу ізотоп, що міститься в [[плутонії|Plutonium]] та [[реакторному плутонії|Reactor-Grade-Plutonium]]. Корисний лише при ручному виготовленні реакторного плутонію з [[плутонію-239|Plutonium-239]] або у спеціалізованих [[цирконієвих|Zirconium]] швидких розмножувачах для виготовлення [[плутонію-241|Plutonium-241]] в [[РБМК|RBMK]].", + "ru_RU": "Неделимый изотоп, содержащийся в [[плутонии|Plutonium]] и [[реакторном плутонии|Reactor-Grade-Plutonium]]. Полезен только при ручном создании реакторного плутония из [[плутония-239|Plutonium-239]] или в специализированных [[циркониевых|Zirconium]] стержнях быстрого размножения для производства [[плутония-241|Plutonium-241]] в [[РБМК|RBMK]].", + "zh_CN": "[[钚|Plutonium]]和[[反应堆级钚|Reactor-Grade Plutonium]]中存在的不易裂变同位素。仅有的用途是手动与[[钚-239|Plutonium-239]]混合为反应堆级钚,或与[[锆|Zirconium]]一同制成专用于增殖的ZFB燃料棒,以在[[RBMK]]中生产[[钚-241|Plutonium-241]]。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-241.json b/src/main/resources/assets/hbm/manual/material/plutonium-241.json new file mode 100644 index 000000000..58afa6faa --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/plutonium-241.json @@ -0,0 +1,17 @@ +{ + "name": "Plutonium-241", + "icon": ["hbm:item.billet_pu241", 1, 0], + "trigger": [["hbm:item.ingot_pu241"], ["hbm:item.billet_pu241"], ["hbm:item.nugget_pu241"]], + "title": { + "en_US": "Plutonium-241", + "uk_UA": "Плутоній-241", + "ru_RU": "Плутоний-241", + "zh_CN": "钚-241" + }, + "content": { + "en_US": "Secondary fissile isotope of [[plutonium|Plutonium]]. Can be recovered from [[plutonium-240|Plutonium-240]]-rich spent [[RBMK]] fuels, as well as certain types of [[zirconium|Zirconium]] fast breefer fuels. Only used in specialized breeding fuels and as high enriched fuel, which is more powerful than its [[plutonium-239|Plutonium-239]] counterpart. Plutonium-241 in RBMKs yields [[americium-241|Americium-241]] and [[americium-242|Americium-242]] when reprocessed.

Highly radioactive.", + "uk_UA": "Другий здатний до поділу ізотоп [[плутонію|Plutonium]]. Може бути відновлений з відпрацьованого палива [[РБМК|RBMK]], багатого на [[плутоній-240|Plutonium-240]], а також з деяких видів [[цирконієвих|Zirconium]] швидких розмножувачів. Використовується лише в спеціальних паливних розмножувачах та як високозбагачене паливо, яке є потужнішим за свій аналог [[плутонію-239|Plutonium-239]]. Плутоній-241 в РБМК утворює [[америцій-241|Americium-241]] та [[америцій-242|Americium-242]] після переробки.

Високорадіоактивний.", + "ru_RU": "Вторичный делящийся изотоп [[плутония|Plutonium]]. Может быть извлечен из отработанного топлива [[РБМК|RBMK]], богатого [[плутонием-240|Plutonium-240]], а также из определённых видов [[циркониевого|Zirconium]] топлива быстрого размножения. Используется только в специализированных топливных стержнях для размножения и как высокообогащённое топливо, которое мощнее, чем его аналог [[плутоний-239|Plutonium-239]]. Плутоний-241 в РБМК при переработке дает [[америций-241|Americium-241]] и [[америций-242|Americium-242]].

Сильно радиоактивен.", + "zh_CN": "[[钚|Plutonium]]次要的易裂变同位素,可从枯竭的富含[[钚-240|Plutonium-240]]的[[RBMK]]燃料及特定种类的[[锆|Zirconium]]快速增殖燃料(ZFB)中提取。 仅用于专用的增殖燃料,或用作比相应的[[钚-239|Plutonium-239]]燃料更强力的高浓缩度燃料。再处理用于RBMK的钚-241燃料时 可以得到[[镅-241|Americium-241]]和[[镅-242|Americium-242]]。

放射性较强。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/plutonium-rg.json b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json new file mode 100644 index 000000000..0876eab04 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/plutonium-rg.json @@ -0,0 +1,17 @@ +{ + "name": "Reactor-Grade Plutonium", + "icon": ["hbm:item.billet_pu_mix", 1, 0], + "trigger": [["hbm:item.ingot_pu_mix"], ["hbm:item.billet_pu_mix"], ["hbm:item.nugget_pu_mix"]], + "title": { + "en_US": "Reactor-Grade Plutonium", + "uk_UA": "Реакторний плутоній", + "ru_RU": "Плутоний реакторного качества", + "zh_CN": "反应堆级钚" + }, + "content": { + "en_US": "Mixture of [[plutonium-239|Plutonium-239]] and [[plutonium-240|Plutonium-240]]. Common result of reprocessing many [[uranium|Uranium]]-based fuels, as well as by breeding uranium in the [[Chicago Pile]]. Usable in many reactors as medium enriched plutonium fuel.

Moderately radioactive.", + "uk_UA": "Суміш [[плутонію-239|Plutonium-239]] та [[плутонію-240|Plutonium-240]]. Поширений результат переробки багатьох видів палива на основі [[урану|Uranium]], а також розмноження урану в [[Чиказькій дровітні|Chicago Pile]]. Використовується в багатьох реакторах як середньозбагачене плутонієве паливо.

Помірно радіоактивний.", + "ru_RU": "Смесь [[плутония-239|Plutonium-239]] и [[плутония-240|Plutonium-240]]. Обычный результат переработки многих топлив на основе [[урана|Uranium]], а также при размножении урана в [[Чикагской полленице|Chicago Pile]]. Используется во многих реакторах как среднеобогащённое плутониевое топливо.

Умеренно радиоактивен.", + "zh_CN": "[[钚-239|Plutonium-239]]和[[钚-240|Plutonium-240]]的混合物。是再处理多种[[铀|Uranium]]基燃料的常见产物,也是在[[芝加哥反应堆|Chicago Pile]]中增殖铀的常见产物。可在多种反应堆中用作中浓缩度燃料。

放射性中等。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/plutonium.json b/src/main/resources/assets/hbm/manual/material/plutonium.json new file mode 100644 index 000000000..a3e0bdd3f --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/plutonium.json @@ -0,0 +1,17 @@ +{ + "name": "Plutonium", + "icon": ["hbm:item.ingot_plutonium", 1, 0], + "trigger": [["hbm:item.ingot_plutonium"], ["hbm:item.billet_plutonium"], ["hbm:item.nugget_plutonium"], ["hbm:item.powder_plutonium"]], + "title": { + "en_US": "Plutonium", + "uk_UA": "Плутоній", + "ru_RU": "Плутоний", + "zh_CN": "钚" + }, + "content": { + "en_US": "Rare form of impure plutonium, composed of plutonium-238, 239 and 240. Plutonium in ore form is disabled by default. May be processed in a [[gas centrifuge|Gas Centrifuge]] in hexafluoride form, or used for certain [[cyclotron|Cyclotron]] recipes.

Moderately radioactive.

See also:
[[Plutonium-238]]
[[Plutonium-239]]
[[Plutonium-240]]
[[Plutonium-241]]", + "uk_UA": "Рідкісна форма природнього плутонію, що складається з плутонію-238, 239 та 240. Плутоній у формі руди вимкнено за замовчуванням. Може бути перероблений в [[газовій центріфузі|Gas Centrifuge]] у формі гексафториду, або використовуватися для певних рецептів [[циклотрона|Cyclotron]].

Помірно радіоактивний.

Див. також:
[[Плутоній-238|Plutonium-238]]
[[Плутоній-239|Plutonium-239]]
[[Плутоній-240|Plutonium-240]]
[[Плутоній-241|Plutonium-241]]", + "ru_RU": "Редкая форма природного плутония, состоящая из плутония-238, 239 и 240. Плутоний в рудной форме по умолчанию отключен. Может быть переработан в [[газовой центрифуге|Gas Centrifuge]] в форме гексафторида или использован для определённых рецептов [[циклотрона|Cyclotron]].

Умеренно радиоактивен.

См. также:
[[Плутоний-238|Plutonium-238]]
[[Плутоний-239|Plutonium-239]]
[[Плутоний-240|Plutonium-240]]
[[Плутоний-241|Plutonium-241]]", + "zh_CN": "不纯钚的稀有形式,由钚-238、钚-239、钚-240组成。 钚的矿石形式默认禁用。钚可以以六氟化钚的形式在[[气体离心机|Gas Centrifuge]]中处理,也用于某些[[回旋加速器|Cyclotron]]配方。

放射性中等。

另见:
[[钚-238|Plutonium-238]]
[[钚-239|Plutonium-239]]
[[钚-240|Plutonium-240]]
[[钚-241|Plutonium-241]]" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/polonium.json b/src/main/resources/assets/hbm/manual/material/polonium.json new file mode 100644 index 000000000..5c3dd0e46 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/polonium.json @@ -0,0 +1,17 @@ +{ + "name": "Polonium-210", + "icon": ["hbm:item.billet_polonium", 1, 0], + "trigger": [["hbm:item.ingot_polonium"], ["hbm:item.billet_polonium"], ["hbm:item.nugget_polonium"]], + "title": { + "en_US": "Polonium-210", + "uk_UA": "Полоній-210", + "ru_RU": "Полоний-210", + "zh_CN": "钋-210" + }, + "content": { + "en_US": "Radioisotope derived from reprocessing [[radium-226|Radium-226]] neutron sources. Usable for [[RTGs|RTG]], or with [[beryllium|Beryllium]] in Po210Be neutron sources for [[RBMKs|RBMK]].

Highly radioactive, very hot.", + "uk_UA": "Радіоізотоп, отриманий в результаті переробки [[радій-226|Radium-226]]берилієвих джерел нейтронів. Використовується для [[РІТЕГ|RTG]] або з [[берилієм|Beryllium]] у полоній-210 берилієвих джерелах нейтронів для [[РБМК|RBMK]].

Високорадіоактивний, дуже гарячий.", + "ru_RU": "Радиоизотоп, получаемый переработкой нейтронных источников [[радия-226|Radium-226]]. Используется для [[РИТЭГ|RTG]] или с [[бериллием|Beryllium]] в полоний-210-бериллиевых источниках нейтронов для [[РБМК|RBMK]].

Сильно радиоактивен, очень горячий.", + "zh_CN": "再处理[[镭-226|Radium-226]]中子源时得到的放射性同位素。可用于[[RTG]],也可与[[铍|Beryllium]]混合为钋-210-铍中子源,用于[[RBMK]]。

放射性强,高温。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/polymer.json b/src/main/resources/assets/hbm/manual/material/polymer.json new file mode 100644 index 000000000..c0f38ff48 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/polymer.json @@ -0,0 +1,17 @@ +{ + "name": "Polymer", + "icon": ["hbm:item.ingot_polymer", 1, 0], + "trigger": [["hbm:item.ingot_polymer"], ["hbm:item.powder_polymer"]], + "title": { + "en_US": "Polymer", + "uk_UA": "Полімер", + "ru_RU": "Полимер", + "zh_CN": "聚合物" + }, + "content": { + "en_US": "Polymer ('Teflon') is the first available type of plastic. Requires [[petroleum gas|Petroleum Gas]] and therefore [[oil processing|Crude Oil]].

Fully interchangable with [[Bakelite]], which becomes available after [[oil cracking|Catalytic Cracking Tower]].", + "uk_UA": "Полімер ('Тефлон') – це перший доступний тип пластику. потребує [[нафтовий газ|Petroleum Gas]], а отже, [[переробку нафти|Crude Oil]].

Повністю взаємозамінний з [[карболітом|Bakelite]], який стає доступним після [[крекінгу нафти|Catalytic Cracking Tower]].", + "ru_RU": "Полимер ('Тефлон') — первый доступный тип пластика. Требует [[нефтяного газа|Petroleum Gas]] и, следовательно, [[переработки нефти|Crude Oil]].

Полностью взаимозаменяем с [[бакелитом|Bakelite]], который становится доступным после [[крекинга нефти|Catalytic Cracking Tower]].", + "zh_CN": "聚合物(“特氟龙”)是第一种可获取的塑料。需要[[石油气|Petroleum Gas]]制作,因此需要 [[原油处理|Crude Oil]]。和[[电木|Bakelite]]完全通用,后者在获得[[催化裂化塔|Catalytic Cracking Tower]]后才可制作。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/radium.json b/src/main/resources/assets/hbm/manual/material/radium.json new file mode 100644 index 000000000..cd3e8a006 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/radium.json @@ -0,0 +1,17 @@ +{ + "name": "Radium-226", + "icon": ["hbm:item.billet_ra226", 1, 0], + "trigger": [["hbm:item.ingot_ra226"], ["hbm:item.billet_ra226"], ["hbm:item.nugget_ra226"], ["hbm:item.powder_ra226"]], + "title": { + "en_US": "Radium-226", + "uk_UA": "Радій-226", + "ru_RU": "Радий-226", + "zh_CN": "镭-226" + }, + "content": { + "en_US": "Rare radioactive material found in [[uranium|Uranium]] and [[thorium|Thorium-232]] ores, may be extracted using a [[centrifuge|Centrifuge]]. Used with [[beryllium|Beryllium]] in Ra226Be neutron sources, which are vital for kickstarting the [[Chicago Pile]], [[PWR]], [[research reactor|Research Reactor]] and [[RBMK]]. The first available neutron source, and often times the cheapest.

Moderately radioactive.", + "uk_UA": "Рідкісний радіоактивний матеріал, що міститься в [[уранових|Uranium]] та [[торієвих|Thorium-232]] рудах, можна отримати за допомогою [[центрифуги|Centrifuge]]. Використовується разом з [[берилієм|Beryllium]] у радій-226 берилієвих джерелах нейтронів, які необхідні для запуску [[Чиказької дровітні|Chicago Pile]], [[ВВЕР|PWR]], [[дослідницького реактора|Research Reactor]] та [[РБМК|RBMK]]. Перше доступне джерело нейтронів і часто найдешевше.

Помірно радіоактивний.", + "ru_RU": "Редкий радиоактивный материал, содержащийся в рудах [[урана|Uranium]] и [[тория-232|Thorium-232]], может быть извлечён с помощью [[центрифуги|Centrifuge]]. Используется с [[бериллием|Beryllium]] в нейтронных источниках радий-226-бериллий, которые необходимы для запуска [[Чикагской поленницы|Chicago Pile]], [[ВВЭР|PWR]], [[исследовательского реактора|Research Reactor]] и [[РБМК|RBMK]]. Первый доступный нейтронный источник, часто самый дешевый.

Умеренно радиоактивен.", + "zh_CN": "稀有的放射性物质,存在于[[铀|Uranium]]矿石和[[钍|Thorium]]矿石中,可通过[[离心机|Centrifuge]]提取。可与[[铍|Beryllium]]混合得到启动[[芝加哥反应堆|Chicago Pile]]、[[RBMK]]、[[PWR]]、[[研究型反应堆|]]必须的镭-226-铍中子源。是最早可获得的中子放射源,而且通常也是最便宜的。

放射性中等。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/rubber.json b/src/main/resources/assets/hbm/manual/material/rubber.json new file mode 100644 index 000000000..41be5fcee --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/rubber.json @@ -0,0 +1,17 @@ +{ + "name": "Rubber", + "icon": ["hbm:item.ingot_rubber", 1, 0], + "trigger": [["hbm:item.ingot_rubber"]], + "title": { + "en_US": "Rubber", + "uk_UA": "Гума", + "ru_RU": "Резина", + "zh_CN": "橡胶" + }, + "content": { + "en_US": "Oil product, derived from [[unsaturated hydrocabons|Unsaturated Hydrocarbons]] and [[sulfur|Sulfur]]. Requires at least a [[cracking tower|Catalytic Cracking Tower]] to make. Can replace [[latex|Latex]] in every recipe.", + "uk_UA": "Нафтопродукт, отриманий з [[ненасичених вуглеводнів|Unsaturated Hydrocarbons]] та [[сірки|Sulfur]]. Для виробництва потрібна щонайменше [[вежа каталітичного крекінгу|Catalytic Cracking Tower]]. Може замінити [[латекс|Latex]] у всіх рецептах.", + "ru_RU": "Нефтепродукт, получаемый из [[непредельных углеводородов|Unsaturated Hydrocarbons]] и [[серы|Sulfur]]. Требует как минимум [[башню крекинга|Catalytic Cracking Tower]] для производства. Может заменить [[латекс|Latex]] во всех рецептах.", + "zh_CN": "一种石化产品,衍生自[[不饱和烃|Unsaturated Hydrocarbons]]和[[硫|Sulfur]]。至少需要一台[[催化裂化塔|Catalytic Cracking Tower]]才能制作。可在所有配方中替代[[乳胶|Latex]]。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/silicon.json b/src/main/resources/assets/hbm/manual/material/silicon.json new file mode 100644 index 000000000..53f20d37e --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/silicon.json @@ -0,0 +1,17 @@ +{ + "name": "Silicon", + "icon": ["hbm:item.billet_silicon", 1, 0], + "trigger": [["hbm:item.ingot_silicon"], ["hbm:item.billet_silicon"], ["hbm:item.nugget_silicon"]], + "title": { + "en_US": "Silicon", + "uk_UA": "Кремній", + "ru_RU": "Кремний", + "zh_CN": "硅" + }, + "content": { + "en_US": "Important material for producing integrated circuits, and any electronics more sophisticated than an analog circuit. Created in an [[electric arc furnace|Electric Arc Furnace]] using things that contain silicon dioxide, like regular sand, nether quartz, fiberglass, flint or [[asbestos|Asbestos]]. Used primarily as wafers (i.e. billets) which are [[pressed|Burner Press]] using a circuit stamp, and then crafted into different types of microchips. Due to requiring an arc furnace, silicon is available after obtaining [[polymer|Polymer]], requiring [[oil|Crude Oil]] processing.", + "uk_UA": "Важливий матеріал для виробництва інтегральних плат та будь-якої електроніки, складнішої за аналогову плату. Виготовляється в [[електричній дуговій печі|Electric Arc Furnace]] використанням матеріалів, що містять діоксид кремнію, наприклад звичайного піску, пекельного кварцу, скловолокна, кременю або [[азбесту|Asbestos]]. Використовується переважно як пластини (тобто заготовки) які [[пресуються|Burner Press]] за допомогою штампа схеми, а потім перетворюються на різні типи мікрочіпів. Через необхідність у дуговій печі, кремній стає доступний після отримання [[полімеру|Polymer]], що вимагає переробки [[нафти|Crude Oil]].", + "ru_RU": "Важный материал для производства интегральных схем и любой электроники, более сложной, чем аналоговые схемы. Производится в [[электродуговой печи|Electric Arc Furnace]] из материалов, содержащих диоксид кремния, таких как обычный песок, кварц незера, стекловолокно, кремень или [[асбест|Asbestos]]. В основном используется в виде пластин (т.е. заготовок), которые [[прессуются|Burner Press]] с использованием штампа для схем, а затем превращаются в различные типы микросхем. Из-за необходимости в дуговой печи кремний доступен после получения [[полимера|Polymer]], что требует переработки [[нефти|Crude Oil]].", + "zh_CN": "生产集成电路以及其他比模拟电路更加复杂的电路的重要材料。可通过使用[[电弧炉|Electric Arc Furnace]]冶炼含二氧化硅的物品(如普通沙子、下界石英、玻璃纤维、燧石和[[石棉|Asbestos]])获取。主要的应用形式为在[[锻压机|Burner Press]]中经电路板锻模锻压的晶圆(即坯料),这些晶圆随后被用来制作多种微处理器。 因为其制作需要电弧炉,硅只能在获得[[聚合物|Polymer]]后制作,因此需要[[原油处理|Crude Oil]]。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/sodium.json b/src/main/resources/assets/hbm/manual/material/sodium.json new file mode 100644 index 000000000..90c98db3f --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/sodium.json @@ -0,0 +1,17 @@ +{ + "name": "Sodium", + "icon": ["hbm:item.powder_sodium", 1, 0], + "trigger": [["hbm:item.powder_sodium"]], + "title": { + "en_US": "Sodium", + "uk_UA": "Натрій", + "ru_RU": "Натрий", + "zh_CN": "钠" + }, + "content": { + "en_US": "Mainly derived from sodalite, a gem which is found as a [[centrifuge|Centrifuge]] byproduct of many ores. Used in liquid form as a powerful [[PWR]] coolant.", + "uk_UA": "В основному отримується з содаліту, дорогоцінного каменю, який зустрічається як побічний продукт [[центрифугування|Centrifuge]] багатьох руд. Використовується в рідкому вигляді як потужний охолоджувач для [[ВВЕР|PWR]].", + "ru_RU": "В основном добывается из содалита, драгоценного камня, который является побочным продуктом [[центрифугования|Centrifuge]] при переработке многих руд. Используется в жидкой форме как мощный охладитель для [[ВВЭР|PWR]].", + "zh_CN": "主要通过方钠石获取,方钠石可作为多种矿石的[[离心|Centrifuge]]副产物获得。其液体形式可用作强力的[[PWR]]冷却剂。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/steel.json b/src/main/resources/assets/hbm/manual/material/steel.json new file mode 100644 index 000000000..77dad347b --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/steel.json @@ -0,0 +1,17 @@ +{ + "name": "Steel", + "icon": ["hbm:item.ingot_steel", 1, 0], + "trigger": [["hbm:item.ingot_steel"], ["hbm:item.plate_steel"], ["hbm:item.powder_steel"]], + "title": { + "en_US": "Steel", + "uk_UA": "Сталь", + "ru_RU": "Сталь", + "zh_CN": "钢" + }, + "content": { + "en_US": "Upgraded version of iron, basic material. Used in almost everything. Initially obtained by combining coal and iron in a [[blast furnace|Blast Furnace]]. Upgraded recipes are available later on via [[crucible|Crucible]] and [[rotary furnace|Rotary Furnace]].", + "uk_UA": "Покращена версія заліза, базовий матеріал. Використовується майже в усьому. Спочатку отримується шляхом поєднання вугілля та заліза в [[доменній печі|Blast Furnace]]. Покращені рецепти доступні пізніше в [[ливарні|Crucible]] та [[роторній печі|Rotary Furnace]].", + "ru_RU": "Улучшенная версия железа, базовый материал. Используется почти во всем. Изначально получается путём комбинирования угля и железа в [[доменной печи|Blast Furnace]]. Улучшенные рецепты доступны позже через [[плавильню|Crucible]] и [[роторную печь|Rotary Furnace]].", + "zh_CN": "铁的升级版,是一种基础金属,几乎所有东西都要用到钢。最初可通过在[[高炉|Blast Furnace]]中混合煤炭和铁获取,而之后也有通过[[坩埚|Crucible]]和[[回转炉|Rotary Furnace]]制作的高级配方。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/sulfur.json b/src/main/resources/assets/hbm/manual/material/sulfur.json new file mode 100644 index 000000000..5984bf61d --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/sulfur.json @@ -0,0 +1,17 @@ +{ + "name": "Sulfur", + "icon": ["hbm:item.sulfur", 1, 0], + "trigger": [["hbm:item.sulfur"]], + "title": { + "en_US": "Sulfur", + "uk_UA": "Сірка", + "ru_RU": "Сера", + "zh_CN": "硫" + }, + "content": { + "en_US": "Common ore, found in even larger numbers in the nether. Used in a variety of things, like [[sulfuric acid|Sulfuric Acid]], [[rubber|Rubber]] and in yellowcake for [[uranium|Uranium]] hexafluoride. Can also make gunpowder, matchsticks, or act as yellow dye.", + "uk_UA": "Звичайна руда, зустрічається у великих кількостях в пеклі. Використовується в різних речах, таких як [[сірчана кислота|Sulfuric Acid]], [[гума|Rubber]] та єлоукейку для отримання гексафториду [[урану|Uranium]]. Також може використовуватися для виготовлення пороху, сірників або як жовтий барвник.", + "ru_RU": "Распространённая руда, в больших количествах встречается в Незере. Используется для различных вещей, таких как [[серная кислота|Sulfuric Acid]], [[резина|Rubber]] и в жёлтом кеке для гексафторида [[урана|Uranium]]. Также может использоваться для изготовления пороха, спичек или в качестве жёлтого красителя.", + "zh_CN": "常见矿物,在下界的生成量更多。用于多种配方,例如制作[[硫酸|Sulfuric Acid]]和 [[橡胶|Rubber]],也用于制作黄饼,作为合成六氟化[[铀|Uranium]]的原料。 也可用于制作火药、火柴,以及用作黄色染料。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/tantalium.json b/src/main/resources/assets/hbm/manual/material/tantalium.json new file mode 100644 index 000000000..cf3e30380 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/tantalium.json @@ -0,0 +1,17 @@ +{ + "name": "Tantalium", + "icon": ["hbm:item.ingot_tantalium", 1, 0], + "trigger": [["hbm:item.ingot_tantalium"], ["hbm:item.powder_tantalium"], ["hbm:item.nugget_tantalium"]], + "title": { + "en_US": "Tantalium", + "uk_UA": "Тантал", + "ru_RU": "Тантал", + "zh_CN": "钽" + }, + "content": { + "en_US": "Tantalium ('Tantalum') can be extracted out of [[coltan|Coltan]] which is only found within one specific area in the world. Used mainly for tantalium capacitors, which are crucial for the control units used by most nuclear bombs.", + "uk_UA": "Тантал ('Танталій') можна отримати з [[колтану|Coltan]] який зустрічається лише в одному конкретному регіоні світу. Використовується переважно для танталових конденсаторів, які є критично важливими для блоків керування, що використовуються в більшості ядерних бомб.", + "ru_RU": "Тантал ('Tantalum') добывается из [[колтана|Coltan]], который встречается только в одной определённой области мира. В основном используется для танталовых конденсаторов, которые критически важны для блоков управления, используемых в большинстве ядерных бомб.", + "zh_CN": "钽可从仅生成在特定区域的[[钶钽铁矿|Coltan]]中提取。 主要用于制作钽电容器,钽电容器可作为大多数核弹所需的控制单元的重要原料。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/technetium.json b/src/main/resources/assets/hbm/manual/material/technetium.json new file mode 100644 index 000000000..d640d843e --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/technetium.json @@ -0,0 +1,17 @@ +{ + "name": "Technetium", + "icon": ["hbm:item.ingot_technetium", 1, 0], + "trigger": [["hbm:item.billet_technetium"], ["hbm:item.ingot_technetium"], ["hbm:item.nugget_technetium"]], + "title": { + "en_US": "Technetium", + "uk_UA": "Технецій-99", + "ru_RU": "Технеций", + "zh_CN": "锝" + }, + "content": { + "en_US": "Synthetic metal, reprocessed from [[ZIRNOX]] or [[PWR]] fuel early on. May also be extracted from some [[RBMK]] fuels or [[bedrock ore|Bedrock Ore]] with high-performance solvent.

Primarily used for [[technetium steel|Technetium Steel]].

Moderately radioactive.", + "uk_UA": "Синтетичний метал, перероблений з палива [[ЦИРНОКС|ZIRNOX]] або [[ВВЕР|PWR]] на ранніх етапах. також може бути отриманий з деяких видів палива [[РБМК|RBMK]] або [[корінної руди|Bedrock Ore]] за допомогою високоефективного розчинника.

В основному використовується для [[технецієвої сталі|Technetium Steel]].

Помірно радіоактивний.", + "ru_RU": "Синтетический металл, получаемый в результате переработки топлива [[ЦИРНОКС|ZIRNOX]] или [[ВВЭР|PWR]] на ранних стадиях. Также может быть извлечен из некоторых видов топлива [[РБМК|RBMK]] или [[бедроковой руды|Bedrock Ore]] с использованием высокоэффективного растворителя.

В основном используется для [[технециевой стали|Technetium Steel]].

Умеренно радиоактивен.", + "zh_CN": "人工合成的金属元素,初期可通过再处理[[锆诺克斯|ZIRNOX]]和[[PWR]]的枯竭燃料获取。也可通过回收某些[[RBMK]]燃料或使用高性能溶剂处理[[基岩矿石|Bedrock Ore]]获取。

主要用于制作[[锝钢|Technetium Steel]]。

放射性中等。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/technetium_steel.json b/src/main/resources/assets/hbm/manual/material/technetium_steel.json new file mode 100644 index 000000000..848f139a7 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/technetium_steel.json @@ -0,0 +1,17 @@ +{ + "name": "Technetium Steel", + "icon": ["hbm:item.ingot_tcalloy", 1, 0], + "trigger": [["hbm:item.ingot_tcalloy"], ["hbm:item.powder_tcalloy"]], + "title": { + "en_US": "Technetium Steel", + "uk_UA": "Технецієва сталь", + "ru_RU": "Технециевая сталь", + "zh_CN": "锝钢" + }, + "content": { + "en_US": "Alloy made from [[steel|Steel]] and [[technetium|Technetium]]. Corrosion resistant, used in stronger fluid tanks and many advanced machines. Obtainable after either a [[ZIRNOX]] or [[PWR]] due to technetium being synthetic.

Fully interchangeable with [[cadmium steel|Cadmium Steel]].", + "uk_UA": "Сплав, виготовлений зі [[сталі|Steel]] та [[технецію|Technetium]]. Стійкий до корозії, використовується в більш міцних резервуарах для рідини та в багатьох передових машинах. Одержується після [[ЦИРНОКС|ZIRNOX]] або [[ВВЕР|PWR]], оскільки технецій є синтетичним.

Повністю взаємозамінний з [[кадмієвою сталлю|Cadmium Steel]].", + "ru_RU": "Сплав из [[стали|Steel]] и [[технеция|Technetium]]. Устойчив к коррозии, используется в более прочных резервуарах для жидкостей и во многих продвинутых машинах. Доступен после [[ЦИРНОКС|ZIRNOX]] или [[ВВЭР|PWR]], так как технеций является синтетическим.

Полностью взаимозаменяем с [[кадмиевой сталью|Cadmium Steel]].", + "zh_CN": "[[钢|Steel]]和[[锝|Technetium]]的合金,耐腐蚀,用于制作强度更高的液体储罐和多种高级机器。 由于锝需要人工制造,因此只能在建造[[锆诺克斯|ZIRNOX]]或[[PWR]]之后获取。

和[[镉钢|Cadmium Steel]]完全通用。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/thorium.json b/src/main/resources/assets/hbm/manual/material/thorium.json new file mode 100644 index 000000000..075261d4a --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/thorium.json @@ -0,0 +1,17 @@ +{ + "name": "Thorium-232", + "icon": ["hbm:item.billet_th232", 1, 0], + "trigger": [["hbm:item.ingot_th232"], ["hbm:item.billet_th232"], ["hbm:item.nugget_th232"], ["hbm:item.powder_thorium"]], + "title": { + "en_US": "Thorium-232", + "uk_UA": "Торій-232", + "ru_RU": "Торий-232", + "zh_CN": "钍-232" + }, + "content": { + "en_US": "Fertile (i.e. can be bred) isotope which yields [[uranium-233|Uranium-233]]. Can either be irradiated in an [[RBMK]] to produce [[thorium fuel|Thorium Fuel]] or combined with uranium-233. Thorium-derived fuels are generally cost-effective but not very powerful. Also usable in [[liquid thorium salt|Liquid Thorium Salt]], a powerful [[PWR]] coolant (turning it into a molten salt reactor) which yields tons of uranium-233 quickly.

Slightly radioactive.", + "uk_UA": "Фертильний (тобто придатний до розмноження) ізотоп який дає [[уран-233|Uranium-233]]. Може бути опромінений в [[РБМК|RBMK]] для отримання [[торієвого палива|Thorium Fuel]] або поєднаний з ураном-233. Паливо, отримане з торію, зазвичай економічне, але не дуже потужне. Також використовується у вигляді [[рідкої торієвої солі|Liquid Thorium Salt]], потужному теплоносію [[ВВЕР|PWR]] (перетворюючи його у реактор на розплавах солей) який швидко дає тонни урану-233.

Слабко радіоактивний.", + "ru_RU": "Фертильный (т.е. пригодный для размножения) изотоп, дающий [[уран-233|Uranium-233]]. Может быть облучен в [[РБМК|RBMK]] для производства [[ториевого топлива|Thorium Fuel]] или комбинирован с ураном-233. Топливо, производное от тория, обычно экономично, но не очень мощное. Также используется в [[жидкой ториевой соли|Liquid Thorium Salt]], мощном охладителе [[ВВЭР|PWR]], превращающем его в реактор на расплавленных солях, который быстро производит большое количество урана-233.

Слабо радиоактивен.", + "zh_CN": "可增殖的同位素,增殖后产生[[铀-233|Uranium-233]]。可通过在[[RBMK]]中辐照或与铀-233混合得到[[钍燃料|Thorium Fuel]]。 总体来讲,由钍衍生的燃料成本较低,但能量不高。 也可用于[[液态钍盐|Liquid Thorium Salt]],其可作为一种强力的[[PWR]]冷却剂(同时将反应堆变成熔盐堆),同时快速产生大量铀-233。

略有放射性。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/uranium-233.json b/src/main/resources/assets/hbm/manual/material/uranium-233.json new file mode 100644 index 000000000..ea6e52f83 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/uranium-233.json @@ -0,0 +1,17 @@ +{ + "name": "Uranium-233", + "icon": ["hbm:item.billet_u233", 1, 0], + "trigger": [["hbm:item.ingot_u233"], ["hbm:item.billet_u233"], ["hbm:item.nugget_u233"]], + "title": { + "en_US": "Uranium-233", + "uk_UA": "Уран-233", + "ru_RU": "Уран-233", + "zh_CN": "铀-233" + }, + "content": { + "en_US": "Artificial type of fissile uranium (i.e. reactor capable), created by reprocessing [[thorium-based fuels|Thorium Fuel]]. High enriched uranium-233 fuel is generally more powerful than fuel derived from [[uranium-235|Uranium-235]].

Moderately radioactive.", + "uk_UA": "Штучний ізотоп урану здатного до розщеплення (тобто придатного для реакторів), отримується шляхом переробки [[палива на основі торію|Thorium Fuel]]. Високозбагачене паливо з урану-233, як правило, потужніше, ніж паливо, отримане з [[урану-235|Uranium-235]].

Помірно радіоактивний.", + "ru_RU": "Искусственный тип делящегося урана (т.е. пригодного для реакторов), получаемый путём переработки [[ториевых топлив|Thorium Fuel]]. Высокообогащённое топливо из урана-233, как правило, мощнее, чем топливо, полученное из [[урана-235|Uranium-235]].

Умеренно радиоактивен.", + "zh_CN": "人工制造的易裂变(即能够用于反应堆)的铀同位素,可通过再处理[[钍基燃料|Thorium Fuel]]获取。总体来讲,高浓缩度的铀-233较基于铀-235的燃料更加强力。

放射性中等。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/uranium-235.json b/src/main/resources/assets/hbm/manual/material/uranium-235.json new file mode 100644 index 000000000..23e2a810c --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/uranium-235.json @@ -0,0 +1,17 @@ +{ + "name": "Uranium-235", + "icon": ["hbm:item.billet_u235", 1, 0], + "trigger": [["hbm:item.ingot_u235"], ["hbm:item.billet_u235"], ["hbm:item.nugget_u235"]], + "title": { + "en_US": "Uranium-235", + "uk_UA": "Уран-235", + "ru_RU": "Уран-235", + "zh_CN": "铀-235" + }, + "content": { + "en_US": "Enriched uranium. Fissile, usable in some reactors directly as high enriched fuel, or mixed back with [[uranium-238|Uranium-238]] for medium enriched uranium fuels. Weapons grade. Created initially by processing [[uranium hexafluuoride|Uranium Hexafluoride]] in a cascade of four [[gas centrifuges|Gas Centriuge]], available later on by separating [[natural uranium|Uranium]] via [[SILEX]].

Moderately radioactive.", + "uk_UA": "Збагачений уран. Придатний до розщеплення, використовується в деяких реакторах безпосередньо як високозбагачене паливо або змішується з [[ураном-238|Uranium-238]] для отримання середньозбагаченого уранового палива. Збройового класу. Спочатку отримується шялхом переробки [[гексафториду урану|Uranium Hexafluoride]] у каскаді з чотирьох [[газових центрифуг|Gas Centriuge]], пізніше доступний шляхом розділення [[природного урану|Uranium]] за допомогою [[камери лазерного розділення ізотопів|SILEX]].

Помірно радіоактивний.", + "ru_RU": "Обогащённый уран. Делящийся, используется в некоторых реакторах непосредственно как высокообогащенное топливо или смешивается с [[ураном-238|Uranium-238]] для среднеобогащенного уранового топлива. Оружейное качество. Изначально создается путём переработки [[гексафторида урана|Uranium Hexafluoride]] в каскаде из четырех [[газовых центрифуг|Gas Centrifuge]], позже доступен через разделение [[натурального урана|Uranium]] с помощью [[SILEX]].

Умеренно радиоактивен.", + "zh_CN": "浓缩的铀,容易裂变,可直接作为高浓缩度燃料用于某些反应堆,也可与[[铀-238|Uranium-238]]混合回中浓缩度的铀燃料。 也是一种武器级的同位素。最初可通过在四台串联的[[气体离心机|Gas Centrifuge]]中处理[[六氟化铀|Uranium Hexafluoride]]获取,之后也可直接在[[SILEX]]中 分离[[天然铀|Uranium]]获取。

放射性中等。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/uranium-238.json b/src/main/resources/assets/hbm/manual/material/uranium-238.json new file mode 100644 index 000000000..6d55e3765 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/uranium-238.json @@ -0,0 +1,17 @@ +{ + "name": "Uranium-238", + "icon": ["hbm:item.billet_u238", 1, 0], + "trigger": [["hbm:item.ingot_u238"], ["hbm:item.billet_u238"], ["hbm:item.nugget_u238"]], + "title": { + "en_US": "Uranium-238", + "uk_UA": "Уран-238", + "ru_RU": "Уран-238", + "zh_CN": "铀-238" + }, + "content": { + "en_US": "Depleted uranium, not fissile (i.e. not directly reactor-usable). Primarily a byproduct from enriching [[uranium|Uranium]]. Used in [[ferrouranium|Ferrouranium]], for [[depleted uranium ammo|Depleted Uranium Ammo]] and for certain low-enriched fuels. Fuels that contain uranium-238 typically yield useful [[plutonium-239|Plutonium-239]] when reprocessing.

Slightly radioactive.", + "uk_UA": "Збіднений уран, не ділиться (тобто не придатний для безпосереднього використання в реакторах). В основному побічний продукт збагачення [[урану|Uranium]]. Використовується у виготовленні [[фероурану|Ferrouranium]], [[боєприпасів зі збідненим ураном|Depleted Uranium Ammo]] та для певного низькозбагаченого палива. Паливо, що містить уран-238 зазвичай дає корисний [[плутоній-239|Plutonium-239]] під час переробки.

Слабо радіоактивний.", + "ru_RU": "Обеднённый уран, не делящийся (т.е. не пригоден для прямого использования в реакторах). В основном является побочным продуктом обогащения [[урана|Uranium]]. Используется в [[ферроуране|Ferrouranium]], для [[боеприпасов с обеднённым ураном|Depleted Uranium Ammo]] и для некоторых низкообогащенных видов топлива. Виды топлива, содержащие уран-238, при переработке обычно дают полезный [[плутоний-239|Plutonium-239]].

Слабо радиоактивен.", + "zh_CN": "贫铀,不能作为燃料(即无法直接被反应堆使用)。通常作为[[铀|Uranium]]浓缩过程中的副产品。用于制造[[铀铁合金|Ferrouranium]],[[贫铀弹药|Depleted Uranium Ammo]]和低浓缩度燃料。含有铀-238的燃料在再处理时会产生有用的[[钚-239|Plutonium-239]]。

略有放射性。" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/uranium.json b/src/main/resources/assets/hbm/manual/material/uranium.json new file mode 100644 index 000000000..a85eae076 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/uranium.json @@ -0,0 +1,17 @@ +{ + "name": "Uranium", + "icon": ["hbm:item.ingot_uranium", 1, 0], + "trigger": [["hbm:item.ingot_uranium"], ["hbm:item.billet_uranium"], ["hbm:item.nugget_uranium"], ["hbm:item.powder_uranium"], ["hbm:tile.ore_uranium"]], + "title": { + "en_US": "Uranium", + "uk_UA": "Уран", + "ru_RU": "Уран", + "zh_CN": "铀" + }, + "content": { + "en_US": "Natural uranium, slightly radioactive. Not very fissile on its own, can be enriched by turning it into [[uranium hexafluoride|Uranium Hexafluoride]] and processing it in [[gas centrifuges|Gas Centrifuge]]. [[ZIRNOX]], [[RBMK]] and [[Chigago Pile]] may use natural uranium as fuel without enrichment.

See also:
[[Uranium-233]]
[[Uranium-235]]
[[Uranium-238]]", + "uk_UA": "Природний уран, слабо радіоактивний. Сам по собі не дуже ділиться, його можна збагачувати, перетворюючи на [[гексафторид урану|Uranium Hexafluoride]] та оброблюючи в [[газових центрифугах|Gas Centrifuge]]. [[ЦИРНОКС|ZIRNOX]], [[РБМК|RBMK]] та [[Чиказька дровітня|Chigago Pile]] можуть використовувати природний уран як паливо без збагачення.

Див. також:
[[Уран-233|Uranium-233]]
[[Уран-235|Uranium-235]]
[[Уран-238|Uranium-238]]", + "ru_RU": "Природный уран, слабо радиоактивен. Сам по себе не очень делящийся, может быть обогащён путём превращения в [[гексафторид урана|Uranium Hexafluoride]] и переработки в [[газовых центрифугах|Gas Centrifuge]]. [[ЦИРНОКС|ZIRNOX]], [[РБМК|RBMK]] и [[Чикагская поленница|Chicago Pile]] могут использовать природный уран как топливо без обогащения.

См. также:
[[Уран-233|Uranium-233]]
[[Уран-235|Uranium-235]]
[[Уран-238|Uranium-238]]", + "zh_CN": "天然铀,具有微弱放射性。本身不太容易裂变,但可通过将其变为[[六氟化铀|Uranium Hexafluoride]]并在[[气体离心机|Gas Centrifuge]]中处理以将其浓缩。[[锆诺克斯|ZIRNOX]],[[RBMK]]和[[芝加哥反应堆|Chigago Pile]]可直接将未浓缩铀用作燃料。

另见:
[[铀-233|Uranium-233]]
[[铀-235|Uranium-235]]
[[铀-238|Uranium-238]]" + } +} diff --git a/src/main/resources/assets/hbm/manual/material/weaponsteel.json b/src/main/resources/assets/hbm/manual/material/weaponsteel.json new file mode 100644 index 000000000..9b7d9b2df --- /dev/null +++ b/src/main/resources/assets/hbm/manual/material/weaponsteel.json @@ -0,0 +1,17 @@ +{ + "name": "Weapon Steel", + "icon": ["hbm:item.ingot_weaponsteel", 1, 0], + "trigger": [["hbm:item.ingot_weaponsteel"], ["hbm:item.plate_weaponsteel"]], + "title": { + "en_US": "Weapon Steel", + "uk_UA": "Збройова сталь", + "ru_RU": "Оружейная сталь", + "zh_CN": "武器级钢" + }, + "content": { + "en_US": "High-purity version of [[steel|Steel]] made in a [[rotary furnace|Rotary Furnace]]. Requires [[coker gas|Coker Gas]], and therefore a [[coker unit|Coker Unit]]. Used in many mid-game weapons, weapon modifications and missile warheads.", + "uk_UA": "Високочиста версія [[сталі|Steel]] виготовлена в [[роторній печі|Rotary Furnace]]. Потребує [[коксовий газ|Coker Gas]], тому і [[коксову установку|Coker Unit]]. Використовується в багатьох видах мідгеймової зброї, модифікаціях зброї та ракетних боєголовках.", + "ru_RU": "Высококачественная версия [[стали|Steel]], изготовленная в [[роторной печи|Rotary Furnace]]. Требует [[коксовый газ|Coker Gas]] и, следовательно, [[коксовую установку|Coker Unit]]. Используется во многих оружиях среднего этапа игры, модификациях оружия и боеголовках ракет.", + "zh_CN": "在[[回转炉|Rotary Furnace]]中制作的高纯度[[钢|Steel]]。需要[[焦化气|Coker Gas]],焦化气则需要[[焦化装置|Coker Unit]]来制作。用于游戏中期的武器制作和改装以及导弹弹头的制作。" + } +} diff --git a/src/main/resources/assets/hbm/models/assembler_main.obj b/src/main/resources/assets/hbm/models/assembler_main.obj deleted file mode 100644 index 0f371b213..000000000 --- a/src/main/resources/assets/hbm/models/assembler_main.obj +++ /dev/null @@ -1,1142 +0,0 @@ -# Blender v2.76 (sub 0) OBJ File: 'assembler_main.blend' -# www.blender.org -o Cube_Cube.001 -v -1.500000 0.000000 1.500000 -v -1.500000 0.250000 1.500000 -v -1.500000 0.000000 -1.500000 -v -1.500000 0.250000 -1.500000 -v 1.500000 0.000000 1.500000 -v 1.500000 0.250000 1.500000 -v 1.500000 0.000000 -1.500000 -v 1.500000 0.250000 -1.500000 -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.250000 1.000000 -1.250000 -v -1.250000 1.000000 -1.250000 -v -1.250000 1.000000 1.250000 -v 1.250000 1.000000 1.250000 -v 1.062500 1.500000 -1.062500 -v 1.062500 1.500000 1.062500 -v 1.000000 0.250000 -0.250000 -v 1.000000 0.750000 -0.250000 -v 1.000000 0.250000 -0.750000 -v 1.000000 0.750000 -0.750000 -v 2.000000 0.000000 0.000000 -v 2.000000 1.000000 0.000000 -v 2.000000 0.000000 -1.000000 -v 2.000000 1.000000 -1.000000 -v 1.500000 1.000000 -1.000000 -v 1.500000 0.000000 -1.000000 -v 1.500000 1.000000 0.000000 -v 1.500000 0.000000 0.000000 -v 2.000000 0.875000 -0.875000 -v 2.000000 0.125000 -0.875000 -v 2.000000 0.875000 -0.125000 -v 2.000000 0.125000 -0.125000 -v 1.500000 0.687500 -0.687500 -v 1.500000 0.312500 -0.687500 -v 1.500000 0.687500 -0.312500 -v 1.500000 0.312500 -0.312500 -v -1.000000 0.250000 0.750000 -v -1.000000 0.750000 0.750000 -v -1.000000 0.250000 0.250000 -v -1.000000 0.750000 0.250000 -v -2.000000 0.000000 1.000000 -v -2.000000 1.000000 1.000000 -v -2.000000 0.000000 0.000000 -v -2.000000 1.000000 0.000000 -v -1.500000 1.000000 0.000000 -v -1.500000 0.000000 0.000000 -v -1.500000 1.000000 1.000000 -v -1.500000 0.000000 1.000000 -v -2.000000 0.875000 0.125000 -v -2.000000 0.125000 0.125000 -v -2.000000 0.875000 0.875000 -v -2.000000 0.125000 0.875000 -v -1.500000 0.687500 0.312500 -v -1.500000 0.312500 0.312500 -v -1.500000 0.687500 0.687500 -v -1.500000 0.312500 0.687500 -v 0.656250 0.343750 -2.000000 -v 0.656250 0.656250 -2.000000 -v 0.343750 0.343750 -1.150000 -v 0.343750 0.656250 -1.150000 -v 0.343750 0.343750 -2.000000 -v 0.343750 0.656250 -2.000000 -v 0.656250 0.343750 -1.150000 -v 0.656250 0.656250 -1.150000 -v 0.328125 0.671875 -1.150000 -v 0.328125 0.328125 -1.150000 -v 0.671875 0.671875 -1.150000 -v 0.671875 0.328125 -1.150000 -v 0.328125 0.671875 -1.000000 -v 0.328125 0.328125 -1.000000 -v 0.671875 0.671875 -1.000000 -v 0.671875 0.328125 -1.000000 -v -0.343750 0.343750 -2.000000 -v -0.343750 0.656250 -2.000000 -v -0.656250 0.343750 -1.150000 -v -0.656250 0.656250 -1.150000 -v -0.656250 0.343750 -2.000000 -v -0.656250 0.656250 -2.000000 -v -0.343750 0.343750 -1.150000 -v -0.343750 0.656250 -1.150000 -v -0.671875 0.671875 -1.150000 -v -0.671875 0.328125 -1.150000 -v -0.328125 0.671875 -1.150000 -v -0.328125 0.328125 -1.150000 -v -0.671875 0.671875 -1.000000 -v -0.671875 0.328125 -1.000000 -v -0.328125 0.671875 -1.000000 -v -0.328125 0.328125 -1.000000 -v -0.343750 0.343750 2.000000 -v -0.343750 0.656250 2.000000 -v -0.656250 0.343750 1.150000 -v -0.656250 0.656250 1.150000 -v -0.656250 0.343750 2.000000 -v -0.656250 0.656250 2.000000 -v -0.343750 0.343750 1.150000 -v -0.343750 0.656250 1.150000 -v -0.671875 0.671875 1.150000 -v -0.671875 0.328125 1.150000 -v -0.328125 0.671875 1.150000 -v -0.328125 0.328125 1.150000 -v -0.671875 0.671875 1.000000 -v -0.671875 0.328125 1.000000 -v -0.328125 0.671875 1.000000 -v -0.328125 0.328125 1.000000 -v 0.656250 0.343750 2.000000 -v 0.656250 0.656250 2.000000 -v 0.343750 0.343750 1.150000 -v 0.343750 0.656250 1.150000 -v 0.343750 0.343750 2.000000 -v 0.343750 0.656250 2.000000 -v 0.656250 0.343750 1.150000 -v 0.656250 0.656250 1.150000 -v 0.328125 0.671875 1.150000 -v 0.328125 0.328125 1.150000 -v 0.671875 0.671875 1.150000 -v 0.671875 0.328125 1.150000 -v 0.328125 0.671875 1.000000 -v 0.328125 0.328125 1.000000 -v 0.671875 0.671875 1.000000 -v 0.671875 0.328125 1.000000 -v -1.062500 1.500000 -1.062500 -v -1.062500 1.500000 1.062500 -v 0.903125 1.500000 0.903125 -v 0.903125 1.500000 -0.903125 -v -0.903125 1.500000 -0.903125 -v -0.903125 1.500000 0.903125 -v 0.903125 1.350000 0.903125 -v 0.903125 1.350000 -0.903125 -v -0.903125 1.350000 -0.903125 -v -0.903125 1.350000 0.903125 -v 0.817113 1.500000 0.903125 -v 0.731101 1.500000 0.903125 -v 0.645089 1.500000 0.903125 -v 0.559078 1.500000 0.903125 -v 0.473066 1.500000 0.903125 -v 0.387054 1.500000 0.903125 -v 0.301042 1.500000 0.903125 -v 0.215030 1.500000 0.903125 -v 0.129018 1.500000 0.903125 -v 0.043006 1.500000 0.903125 -v -0.043006 1.500000 0.903125 -v -0.129018 1.500000 0.903125 -v -0.215030 1.500000 0.903125 -v -0.301042 1.500000 0.903125 -v -0.387054 1.500000 0.903125 -v -0.473065 1.500000 0.903125 -v -0.559077 1.500000 0.903125 -v -0.645089 1.500000 0.903125 -v -0.731101 1.500000 0.903125 -v -0.817113 1.500000 0.903125 -v 0.817113 1.750000 0.903125 -v 0.731101 1.750000 0.903125 -v 0.645089 1.750000 0.903125 -v 0.559078 1.750000 0.903125 -v 0.473066 1.750000 0.903125 -v 0.387054 1.750000 0.903125 -v 0.301042 1.750000 0.903125 -v 0.215030 1.750000 0.903125 -v 0.129018 1.750000 0.903125 -v 0.043006 1.750000 0.903125 -v -0.043006 1.750000 0.903125 -v -0.129018 1.750000 0.903125 -v -0.215030 1.750000 0.903125 -v -0.301042 1.750000 0.903125 -v -0.387054 1.750000 0.903125 -v -0.473065 1.750000 0.903125 -v -0.559077 1.750000 0.903125 -v -0.645089 1.750000 0.903125 -v -0.731101 1.750000 0.903125 -v -0.817113 1.750000 0.903125 -v 0.817113 2.000000 0.653125 -v 0.731101 2.000000 0.653125 -v 0.645089 2.000000 0.653125 -v 0.559078 2.000000 0.653125 -v 0.473066 2.000000 0.653125 -v 0.387054 2.000000 0.653125 -v 0.301042 2.000000 0.653125 -v 0.215030 2.000000 0.653125 -v 0.129018 2.000000 0.653125 -v 0.043006 2.000000 0.653125 -v -0.043006 2.000000 0.653125 -v -0.129018 2.000000 0.653125 -v -0.215030 2.000000 0.653125 -v -0.301042 2.000000 0.653125 -v -0.387054 2.000000 0.653125 -v -0.473065 2.000000 0.653125 -v -0.559077 2.000000 0.653125 -v -0.645089 2.000000 0.653125 -v -0.731101 2.000000 0.653125 -v -0.817113 2.000000 0.653125 -v -0.817113 1.500000 -0.903125 -v -0.731101 1.500000 -0.903125 -v -0.645089 1.500000 -0.903125 -v -0.559078 1.500000 -0.903125 -v -0.473066 1.500000 -0.903125 -v -0.387054 1.500000 -0.903125 -v -0.301042 1.500000 -0.903125 -v -0.215030 1.500000 -0.903125 -v -0.129018 1.500000 -0.903125 -v -0.043006 1.500000 -0.903125 -v 0.043006 1.500000 -0.903125 -v 0.129018 1.500000 -0.903125 -v 0.215030 1.500000 -0.903125 -v 0.301042 1.500000 -0.903125 -v 0.387054 1.500000 -0.903125 -v 0.473065 1.500000 -0.903125 -v 0.559077 1.500000 -0.903125 -v 0.645089 1.500000 -0.903125 -v 0.731101 1.500000 -0.903125 -v 0.817113 1.500000 -0.903125 -v -0.817113 1.750000 -0.903125 -v -0.731101 1.750000 -0.903125 -v -0.645089 1.750000 -0.903125 -v -0.559078 1.750000 -0.903125 -v -0.473066 1.750000 -0.903125 -v -0.387054 1.750000 -0.903125 -v -0.301042 1.750000 -0.903125 -v -0.215030 1.750000 -0.903125 -v -0.129018 1.750000 -0.903125 -v -0.043006 1.750000 -0.903125 -v 0.043006 1.750000 -0.903125 -v 0.129018 1.750000 -0.903125 -v 0.215030 1.750000 -0.903125 -v 0.301042 1.750000 -0.903125 -v 0.387054 1.750000 -0.903125 -v 0.473065 1.750000 -0.903125 -v 0.559077 1.750000 -0.903125 -v 0.645089 1.750000 -0.903125 -v 0.731101 1.750000 -0.903125 -v 0.817113 1.750000 -0.903125 -v -0.817113 2.000000 -0.653125 -v -0.731101 2.000000 -0.653125 -v -0.645089 2.000000 -0.653125 -v -0.559078 2.000000 -0.653125 -v -0.473066 2.000000 -0.653125 -v -0.387054 2.000000 -0.653125 -v -0.301042 2.000000 -0.653125 -v -0.215030 2.000000 -0.653125 -v -0.129018 2.000000 -0.653125 -v -0.043006 2.000000 -0.653125 -v 0.043006 2.000000 -0.653125 -v 0.129018 2.000000 -0.653125 -v 0.215030 2.000000 -0.653125 -v 0.301042 2.000000 -0.653125 -v 0.387054 2.000000 -0.653125 -v 0.473065 2.000000 -0.653125 -v 0.559077 2.000000 -0.653125 -v 0.645089 2.000000 -0.653125 -v 0.731101 2.000000 -0.653125 -v 0.817113 2.000000 -0.653125 -v 1.916667 0.250000 -1.100000 -v 1.916667 0.750000 -1.100000 -v 1.666667 0.500000 -1.100000 -v 1.916667 0.250000 0.100000 -v 1.916667 0.750000 0.100000 -v 1.666667 0.500000 0.100000 -v -1.583333 0.250000 -0.100000 -v -1.583333 0.750000 -0.100000 -v -1.833333 0.500000 -0.100000 -v -1.583333 0.250000 1.100000 -v -1.583333 0.750000 1.100000 -v -1.833333 0.500000 1.100000 -vt 0.576309 0.460125 -vt 0.576309 0.482085 -vt 0.312788 0.482085 -vt 0.281091 0.465560 -vt 0.281091 0.487663 -vt 0.015849 0.487663 -vt 0.312788 0.535743 -vt 0.312788 0.513782 -vt 0.576309 0.513783 -vt 0.311067 0.037952 -vt 0.311067 0.015849 -vt 0.576309 0.015849 -vt 0.015849 0.015849 -vt 0.279369 0.015849 -vt 0.279369 0.279369 -vt 0.334748 0.566799 -vt 0.576309 0.535743 -vt 0.312788 0.460125 -vt 0.334748 0.429069 -vt 0.015849 0.465560 -vt 0.037952 0.434301 -vt 0.576309 0.037952 -vt 0.554205 0.069211 -vt 0.333170 0.069211 -vt 0.037952 0.390094 -vt 0.258987 0.390094 -vt 0.806630 0.015849 -vt 0.894470 0.015849 -vt 0.894470 0.059769 -vt 0.134126 0.756933 -vt 0.123146 0.767913 -vt 0.057265 0.767913 -vt 0.806630 0.445525 -vt 0.806630 0.401605 -vt 0.855734 0.379645 -vt 0.847469 0.740928 -vt 0.891389 0.740929 -vt 0.891389 0.828769 -vt 0.855734 0.228410 -vt 0.806630 0.206450 -vt 0.806630 0.162530 -vt 0.899654 0.228410 -vt 0.855734 0.140570 -vt 0.798365 0.762888 -vt 0.847469 0.828769 -vt 0.855734 0.467485 -vt 0.899654 0.379645 -vt 0.806630 0.059769 -vt 0.872510 0.108873 -vt 0.026829 0.798350 -vt 0.073735 0.814820 -vt 0.073735 0.847760 -vt 0.046285 0.905647 -vt 0.057265 0.894667 -vt 0.123145 0.894667 -vt 0.164562 0.875210 -vt 0.153582 0.864230 -vt 0.153582 0.798350 -vt 0.015849 0.787370 -vt 0.026829 0.864230 -vt 0.106675 0.814820 -vt 0.106675 0.847760 -vt 0.850550 0.587022 -vt 0.806630 0.587022 -vt 0.806630 0.499182 -vt 0.354205 0.854232 -vt 0.420085 0.854232 -vt 0.431065 0.865212 -vt 0.850550 0.260107 -vt 0.899654 0.282067 -vt 0.899654 0.325988 -vt 0.608006 0.899590 -vt 0.608006 0.811750 -vt 0.651926 0.811750 -vt 0.891389 0.643351 -vt 0.891389 0.687271 -vt 0.842285 0.709231 -vt 0.842285 0.621391 -vt 0.798365 0.709231 -vt 0.651926 0.899590 -vt 0.701030 0.833710 -vt 0.806630 0.260107 -vt 0.850550 0.347948 -vt 0.899654 0.565062 -vt 0.850550 0.499182 -vt 0.370675 0.774385 -vt 0.370675 0.807325 -vt 0.323768 0.823795 -vt 0.420085 0.727478 -vt 0.354205 0.727478 -vt 0.343225 0.716498 -vt 0.450521 0.823795 -vt 0.450521 0.757915 -vt 0.461501 0.746935 -vt 0.323768 0.757915 -vt 0.312788 0.834775 -vt 0.403615 0.807325 -vt 0.403615 0.774385 -vt 0.619264 0.360402 -vt 0.672059 0.307606 -vt 0.691469 0.327016 -vt 0.619264 0.254810 -vt 0.617323 0.254810 -vt 0.638674 0.233459 -vt 0.763675 0.254810 -vt 0.710880 0.307606 -vt 0.691469 0.288196 -vt 0.744265 0.379812 -vt 0.638674 0.235400 -vt 0.608006 0.245494 -vt 0.629357 0.224142 -vt 0.763675 0.360402 -vt 0.765616 0.360402 -vt 0.744265 0.381753 -vt 0.744265 0.235400 -vt 0.744265 0.233459 -vt 0.765616 0.254810 -vt 0.638674 0.379812 -vt 0.638674 0.381753 -vt 0.617323 0.360402 -vt 0.774933 0.369719 -vt 0.753582 0.391070 -vt 0.629357 0.391070 -vt 0.608006 0.369718 -vt 0.753582 0.224142 -vt 0.774933 0.245494 -vt 0.763675 0.046517 -vt 0.710880 0.099312 -vt 0.691469 0.079902 -vt 0.763675 0.152108 -vt 0.765616 0.152108 -vt 0.744265 0.173459 -vt 0.619264 0.152108 -vt 0.672059 0.099312 -vt 0.691469 0.118722 -vt 0.638674 0.027106 -vt 0.744265 0.171518 -vt 0.774933 0.161425 -vt 0.753582 0.182776 -vt 0.619264 0.046517 -vt 0.617323 0.046517 -vt 0.638674 0.025165 -vt 0.638674 0.171518 -vt 0.638674 0.173459 -vt 0.617323 0.152108 -vt 0.744265 0.027106 -vt 0.744265 0.025165 -vt 0.765616 0.046517 -vt 0.608006 0.037200 -vt 0.629357 0.015849 -vt 0.753582 0.015849 -vt 0.774933 0.037200 -vt 0.629357 0.182776 -vt 0.608006 0.161425 -vt 0.691469 0.525640 -vt 0.710880 0.506230 -vt 0.763675 0.559026 -vt 0.744265 0.432084 -vt 0.765616 0.453435 -vt 0.763675 0.453435 -vt 0.691469 0.486820 -vt 0.672059 0.506230 -vt 0.619264 0.453435 -vt 0.638674 0.578436 -vt 0.744265 0.434025 -vt 0.753582 0.422767 -vt 0.774933 0.444118 -vt 0.638674 0.580377 -vt 0.617323 0.559026 -vt 0.619264 0.559026 -vt 0.617323 0.453435 -vt 0.638674 0.432084 -vt 0.638674 0.434025 -vt 0.765616 0.559026 -vt 0.744265 0.580377 -vt 0.744265 0.578436 -vt 0.629357 0.589694 -vt 0.608006 0.568343 -vt 0.774933 0.568343 -vt 0.753582 0.589694 -vt 0.608006 0.444118 -vt 0.629357 0.422767 -vt 0.105061 0.608573 -vt 0.105061 0.636023 -vt 0.030397 0.636023 -vt 0.133884 0.712060 -vt 0.103689 0.712060 -vt 0.105061 0.710688 -vt 0.132511 0.636023 -vt 0.132511 0.608573 -vt 0.207176 0.608573 -vt 0.105061 0.533909 -vt 0.132511 0.710688 -vt 0.133884 0.725236 -vt 0.103689 0.725236 -vt 0.103689 0.532536 -vt 0.133884 0.532536 -vt 0.132511 0.533909 -vt 0.208548 0.607201 -vt 0.208548 0.637396 -vt 0.207176 0.636023 -vt 0.029025 0.637396 -vt 0.029025 0.607201 -vt 0.030397 0.608573 -vt 0.103689 0.519360 -vt 0.133884 0.519360 -vt 0.015849 0.637396 -vt 0.015849 0.607201 -vt 0.221724 0.607201 -vt 0.221724 0.637396 -vt 0.554205 0.113418 -vt 0.537628 0.160631 -vt 0.349748 0.160631 -vt 0.333170 0.113418 -vt 0.554349 0.566799 -vt 0.554349 0.610719 -vt 0.334748 0.610719 -vt 0.334748 0.385149 -vt 0.554349 0.385149 -vt 0.493263 0.170323 -vt 0.054530 0.342881 -vt 0.242409 0.342880 -vt 0.351218 0.338242 -vt 0.537879 0.338242 -vt 0.537879 0.657626 -vt 0.351218 0.657626 -vt 0.365217 0.324243 -vt 0.365217 0.311067 -vt 0.523879 0.311066 -vt 0.098895 0.333189 -vt 0.523879 0.324243 -vt 0.523879 0.671625 -vt 0.365217 0.671625 -vt 0.766667 0.780053 -vt 0.608006 0.780053 -vt 0.608006 0.621391 -vt 0.523879 0.684801 -vt 0.365217 0.684801 -vt 0.496673 0.170201 -vt 0.531971 0.176003 -vt 0.364530 0.192445 -vt 0.095484 0.333311 -vt 0.060187 0.327509 -vt 0.227627 0.311066 -vt 0.236623 0.984151 -vt 0.214662 0.984151 -vt 0.214662 0.976596 -vt 0.531841 0.231698 -vt 0.509881 0.231698 -vt 0.509881 0.224142 -vt 0.533562 0.943717 -vt 0.511602 0.943717 -vt 0.511602 0.936161 -vt 0.828780 0.938842 -vt 0.806820 0.938842 -vt 0.806820 0.931287 -vt 0.236623 0.944899 -vt 0.214662 0.944899 -vt 0.214662 0.937344 -vt 0.953501 0.899590 -vt 0.931541 0.899590 -vt 0.931541 0.892035 -vt 0.828780 0.978095 -vt 0.806820 0.978095 -vt 0.806820 0.970539 -vt 0.533562 0.982969 -vt 0.511602 0.982969 -vt 0.511602 0.975414 -vt 0.531841 0.270950 -vt 0.509881 0.270950 -vt 0.509881 0.263395 -vt 0.533562 0.904464 -vt 0.511602 0.904464 -vt 0.511602 0.896909 -vt 0.480545 0.904464 -vt 0.480545 0.896909 -vt 0.478824 0.270950 -vt 0.478824 0.263395 -vt 0.480546 0.982969 -vt 0.480546 0.975414 -vt 0.775764 0.978095 -vt 0.775764 0.970539 -vt 0.900485 0.899590 -vt 0.900485 0.892035 -vt 0.183606 0.944899 -vt 0.183606 0.937344 -vt 0.775764 0.938842 -vt 0.775764 0.931287 -vt 0.480546 0.943717 -vt 0.480546 0.936161 -vt 0.478824 0.231698 -vt 0.478824 0.224142 -vt 0.183606 0.984151 -vt 0.183606 0.976596 -vt 0.037809 0.976596 -vt 0.068865 0.976596 -vt 0.068865 0.984151 -vt 0.333027 0.224143 -vt 0.364083 0.224142 -vt 0.364083 0.231698 -vt 0.312788 0.936161 -vt 0.334748 0.936161 -vt 0.334748 0.943717 -vt 0.311067 0.224143 -vt 0.333027 0.231698 -vt 0.015849 0.976596 -vt 0.037809 0.984151 -vt 0.608006 0.931287 -vt 0.629966 0.931287 -vt 0.629966 0.938842 -vt 0.015849 0.937344 -vt 0.037809 0.937344 -vt 0.037809 0.944899 -vt 0.732727 0.892035 -vt 0.754687 0.892035 -vt 0.754687 0.899590 -vt 0.608006 0.970539 -vt 0.629966 0.970539 -vt 0.629966 0.978095 -vt 0.312788 0.975414 -vt 0.334748 0.975414 -vt 0.334748 0.982969 -vt 0.311067 0.263395 -vt 0.333027 0.263395 -vt 0.333027 0.270950 -vt 0.312788 0.896909 -vt 0.334748 0.896909 -vt 0.334748 0.904464 -vt 0.365804 0.896909 -vt 0.365804 0.904464 -vt 0.364083 0.263395 -vt 0.364083 0.270950 -vt 0.365804 0.975414 -vt 0.365804 0.982969 -vt 0.661022 0.970539 -vt 0.661022 0.978095 -vt 0.785744 0.892035 -vt 0.785744 0.899590 -vt 0.068865 0.937344 -vt 0.068865 0.944899 -vt 0.661022 0.931287 -vt 0.661022 0.938842 -vt 0.365804 0.936161 -vt 0.365804 0.943717 -vt 0.253421 0.638898 -vt 0.253421 0.594978 -vt 0.275381 0.616938 -vt 0.515159 0.760418 -vt 0.493199 0.738458 -vt 0.515159 0.716498 -vt 0.253421 0.714515 -vt 0.253421 0.670595 -vt 0.275381 0.692555 -vt 0.275381 0.563281 -vt 0.253421 0.541320 -vt 0.275381 0.519360 -vt 0.015849 0.279369 -vt 0.554349 0.429069 -vt 0.258987 0.434301 -vt 0.046285 0.756933 -vt 0.899654 0.140570 -vt 0.798364 0.806809 -vt 0.899654 0.467485 -vt 0.828590 0.108873 -vt 0.134125 0.905647 -vt 0.164562 0.787370 -vt 0.015849 0.875210 -vt 0.343224 0.865212 -vt 0.798364 0.621391 -vt 0.701030 0.877630 -vt 0.806630 0.347948 -vt 0.899654 0.521142 -vt 0.431065 0.716498 -vt 0.461502 0.834775 -vt 0.312788 0.746935 -vt 0.363839 0.174722 -vt 0.375834 0.174919 -vt 0.531331 0.168272 -vt 0.527282 0.168652 -vt 0.523273 0.168887 -vt 0.519466 0.169118 -vt 0.515811 0.169319 -vt 0.512310 0.169498 -vt 0.508962 0.169663 -vt 0.505764 0.169815 -vt 0.502713 0.169957 -vt 0.499748 0.170088 -vt 0.489313 0.170468 -vt 0.484693 0.170641 -vt 0.479208 0.170849 -vt 0.472561 0.171104 -vt 0.464263 0.171426 -vt 0.453455 0.171849 -vt 0.438489 0.172437 -vt 0.415776 0.173333 -vt 0.228319 0.328790 -vt 0.216323 0.328593 -vt 0.060826 0.335240 -vt 0.064875 0.334860 -vt 0.068884 0.334625 -vt 0.072692 0.334394 -vt 0.076346 0.334193 -vt 0.079847 0.334014 -vt 0.083195 0.333849 -vt 0.086393 0.333697 -vt 0.089444 0.333555 -vt 0.092409 0.333424 -vt 0.102844 0.333044 -vt 0.107464 0.332871 -vt 0.112949 0.332663 -vt 0.119596 0.332407 -vt 0.127894 0.332085 -vt 0.138702 0.331663 -vt 0.153668 0.331075 -vt 0.176381 0.330179 -vt 0.766667 0.621391 -vt 0.236623 0.976596 -vt 0.531841 0.224142 -vt 0.533562 0.936161 -vt 0.828780 0.931287 -vt 0.236623 0.937344 -vt 0.953501 0.892035 -vt 0.828780 0.970539 -vt 0.533562 0.975414 -vt 0.531841 0.263395 -vt 0.533562 0.896909 -vt 0.312788 0.943717 -vt 0.311067 0.231698 -vt 0.015849 0.984151 -vt 0.608006 0.938842 -vt 0.015849 0.944899 -vt 0.732727 0.899590 -vt 0.608006 0.978095 -vt 0.312788 0.982969 -vt 0.311067 0.270950 -vt 0.312788 0.904464 -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.707100 0.707100 0.000000 -vn -0.707100 0.707100 0.000000 -vn 0.000000 0.707100 -0.707100 -vn 0.000000 0.707100 0.707100 -vn -0.447200 0.000000 0.894400 -vn -0.447200 0.894400 0.000000 -vn 0.000000 1.000000 0.000000 -vn -0.447200 -0.894400 0.000000 -vn -0.447200 0.000000 -0.894400 -vn 0.351100 0.000000 -0.936300 -vn 0.351100 0.000000 0.936300 -vn 0.351100 0.936300 0.000000 -vn 0.351100 -0.936300 0.000000 -vn 0.447200 0.000000 0.894400 -vn 0.447200 0.894400 0.000000 -vn 0.447200 -0.894400 0.000000 -vn 0.447200 0.000000 -0.894400 -vn -0.351100 0.000000 -0.936300 -vn -0.351100 0.000000 0.936300 -vn -0.351100 0.936300 0.000000 -vn -0.351100 -0.936300 0.000000 -vn 0.000000 0.351100 0.936300 -vn 0.000000 0.351100 -0.936300 -vn -0.936300 0.351100 0.000000 -vn 0.936300 0.351100 0.000000 -s off -f 4/1/1 3/2/1 1/3/1 -f 8/4/2 7/5/2 3/6/2 -f 6/7/3 5/8/3 7/9/3 -f 2/10/4 1/11/4 5/12/4 -f 3/13/5 7/14/5 5/15/5 -f 12/16/6 6/7/6 8/17/6 -f 4/1/7 2/18/7 9/19/7 -f 8/4/8 4/20/8 10/21/8 -f 6/22/9 12/23/9 9/24/9 -f 10/21/2 14/25/2 13/26/2 -f 26/27/2 25/28/2 28/29/2 -f 25/30/3 32/31/3 34/32/3 -f 20/33/10 19/34/10 30/35/10 -f 28/36/5 25/37/5 23/38/5 -f 27/39/11 22/40/11 20/41/11 -f 26/42/12 27/39/12 29/43/12 -f 21/44/13 28/36/13 30/45/13 -f 29/46/4 30/35/4 23/47/4 -f 27/48/14 28/29/14 21/49/14 -f 34/50/15 38/51/15 37/52/15 -f 24/53/3 33/54/3 31/55/3 -f 26/56/3 31/57/3 32/58/3 -f 23/59/3 34/50/3 33/60/3 -f 37/52/3 38/51/3 36/61/3 -f 31/57/16 35/62/16 36/61/16 -f 32/31/17 36/61/17 38/51/17 -f 33/54/18 37/52/18 35/62/18 -f 48/63/2 45/64/2 46/65/2 -f 54/66/1 52/67/1 45/68/1 -f 50/69/19 39/70/19 40/71/19 -f 43/72/5 45/73/5 48/74/5 -f 40/75/20 42/76/20 47/77/20 -f 49/78/12 47/77/12 46/79/12 -f 50/80/21 48/74/21 41/81/21 -f 43/82/4 50/69/4 49/83/4 -f 41/84/22 48/63/22 47/85/22 -f 57/86/23 58/87/23 54/88/23 -f 51/89/1 53/90/1 44/91/1 -f 52/92/1 51/93/1 46/94/1 -f 53/95/1 54/88/1 43/96/1 -f 56/97/1 58/87/1 57/86/1 -f 56/97/24 55/98/24 51/93/24 -f 58/87/25 56/97/25 52/67/25 -f 55/98/26 57/86/26 53/90/26 -f 65/99/3 59/100/3 60/101/3 -f 65/102/2 70/103/2 68/104/2 -f 62/105/1 64/106/1 63/107/1 -f 66/108/12 60/101/12 64/106/12 -f 61/109/5 63/107/5 59/100/5 -f 60/101/2 59/100/2 63/107/2 -f 70/103/5 74/110/5 72/111/5 -f 62/112/2 67/113/2 69/114/2 -f 61/115/2 68/116/2 67/117/2 -f 66/118/2 69/119/2 70/120/2 -f 67/113/12 71/121/12 73/122/12 -f 69/119/3 73/123/3 74/124/3 -f 68/116/1 72/125/1 71/126/1 -f 81/127/3 75/128/3 76/129/3 -f 81/130/2 86/131/2 84/132/2 -f 78/133/1 80/134/1 79/135/1 -f 82/136/12 76/129/12 80/134/12 -f 77/137/5 79/135/5 75/128/5 -f 76/129/2 75/128/2 79/135/2 -f 86/131/5 90/138/5 88/139/5 -f 78/140/2 83/141/2 85/142/2 -f 77/143/2 84/144/2 83/145/2 -f 82/146/2 85/147/2 86/148/2 -f 83/141/12 87/149/12 89/150/12 -f 85/147/3 89/151/3 90/152/3 -f 84/144/1 88/153/1 87/154/1 -f 92/155/3 91/156/3 97/157/3 -f 100/158/4 102/159/4 97/160/4 -f 95/161/1 96/162/1 94/163/1 -f 96/162/12 92/155/12 98/164/12 -f 91/156/5 95/161/5 93/165/5 -f 95/161/4 91/156/4 92/155/4 -f 104/166/5 106/167/5 102/159/5 -f 101/168/4 99/169/4 94/170/4 -f 99/171/4 100/172/4 93/173/4 -f 102/174/4 101/175/4 98/176/4 -f 105/177/12 103/178/12 99/169/12 -f 106/179/3 105/180/3 101/175/3 -f 103/181/1 104/182/1 100/172/1 -f 108/183/3 107/184/3 113/185/3 -f 116/186/4 118/187/4 113/188/4 -f 111/189/1 112/190/1 110/191/1 -f 112/190/12 108/183/12 114/192/12 -f 107/184/5 111/189/5 109/193/5 -f 111/189/4 107/184/4 108/183/4 -f 120/194/5 122/195/5 118/187/5 -f 117/196/4 115/197/4 110/198/4 -f 115/199/4 116/200/4 109/201/4 -f 118/202/4 117/203/4 114/204/4 -f 121/205/12 119/206/12 115/197/12 -f 122/207/3 121/208/3 117/203/3 -f 119/209/1 120/210/1 116/200/1 -f 16/211/27 18/212/27 124/213/27 -f 12/23/4 16/211/4 15/214/4 -f 11/215/3 13/216/3 16/217/3 -f 9/19/1 15/218/1 14/219/1 -f 18/212/12 143/220/12 124/213/12 -f 14/25/28 123/221/28 17/222/28 -f 15/218/29 124/223/29 123/224/29 -f 13/216/30 17/225/30 18/226/30 -f 128/227/3 132/228/3 131/229/3 -f 123/221/12 203/230/12 17/222/12 -f 124/223/12 128/227/12 127/231/12 -f 17/225/12 126/232/12 125/233/12 -f 130/234/12 131/235/12 132/236/12 -f 126/232/1 130/237/1 129/238/1 -f 142/239/2 129/240/2 132/241/2 -f 202/242/4 131/243/4 130/244/4 -f 193/245/2 213/246/2 214/247/2 -f 195/248/2 215/249/2 216/250/2 -f 197/251/2 217/252/2 218/253/2 -f 199/254/2 219/255/2 220/256/2 -f 201/257/2 221/258/2 222/259/2 -f 203/260/2 223/261/2 224/262/2 -f 205/263/2 225/264/2 226/265/2 -f 207/266/2 227/267/2 228/268/2 -f 209/269/2 229/270/2 230/271/2 -f 211/272/2 231/273/2 232/274/2 -f 231/273/8 251/275/8 252/276/8 -f 229/270/8 249/277/8 250/278/8 -f 227/267/8 247/279/8 248/280/8 -f 225/264/8 245/281/8 246/282/8 -f 223/261/8 243/283/8 244/284/8 -f 221/258/8 241/285/8 242/286/8 -f 219/255/8 239/287/8 240/288/8 -f 217/252/8 237/289/8 238/290/8 -f 215/249/8 235/291/8 236/292/8 -f 213/246/8 233/293/8 234/294/8 -f 171/295/9 191/296/9 192/297/9 -f 169/298/9 189/299/9 190/300/9 -f 147/301/4 167/302/4 168/303/4 -f 149/304/4 169/298/4 170/305/4 -f 151/306/4 171/295/4 172/307/4 -f 145/308/4 165/309/4 166/310/4 -f 143/311/4 163/312/4 164/313/4 -f 141/314/4 161/315/4 162/316/4 -f 139/317/4 159/318/4 160/319/4 -f 137/320/4 157/321/4 158/322/4 -f 135/323/4 155/324/4 156/325/4 -f 133/326/4 153/327/4 154/328/4 -f 153/327/9 173/329/9 174/330/9 -f 155/324/9 175/331/9 176/332/9 -f 157/321/9 177/333/9 178/334/9 -f 159/318/9 179/335/9 180/336/9 -f 161/315/9 181/337/9 182/338/9 -f 163/312/9 183/339/9 184/340/9 -f 165/309/9 185/341/9 186/342/9 -f 167/302/9 187/343/9 188/344/9 -f 252/276/12 251/275/12 174/330/12 -f 250/278/12 249/277/12 176/332/12 -f 248/280/12 247/279/12 178/334/12 -f 246/282/12 245/281/12 180/336/12 -f 244/284/12 243/283/12 182/338/12 -f 242/286/12 241/285/12 184/340/12 -f 234/294/12 233/293/12 192/297/12 -f 236/292/12 235/291/12 190/300/12 -f 238/290/12 237/289/12 188/344/12 -f 240/288/12 239/287/12 186/342/12 -f 254/345/2 253/346/2 255/347/2 -f 257/348/4 258/349/4 256/350/4 -f 260/351/2 259/352/2 261/353/2 -f 263/354/4 264/355/4 262/356/4 -f 2/18/1 4/1/1 1/3/1 -f 4/20/2 8/4/2 3/6/2 -f 8/17/3 6/7/3 7/9/3 -f 6/22/4 2/10/4 5/12/4 -f 1/357/5 3/13/5 5/15/5 -f 11/215/6 12/16/6 8/17/6 -f 10/358/7 4/1/7 9/19/7 -f 11/359/8 8/4/8 10/21/8 -f 2/10/9 6/22/9 9/24/9 -f 11/359/2 10/21/2 13/26/2 -f 27/48/2 26/27/2 28/29/2 -f 23/360/3 25/30/3 34/32/3 -f 29/46/10 20/33/10 30/35/10 -f 30/45/5 28/36/5 23/38/5 -f 29/43/11 27/39/11 20/41/11 -f 24/361/12 26/42/12 29/43/12 -f 19/362/13 21/44/13 30/45/13 -f 24/363/4 29/46/4 23/47/4 -f 22/364/14 27/48/14 21/49/14 -f 33/60/15 34/50/15 37/52/15 -f 26/365/3 24/53/3 31/55/3 -f 25/366/3 26/56/3 32/58/3 -f 24/367/3 23/59/3 33/60/3 -f 35/62/3 37/52/3 36/61/3 -f 32/58/16 31/57/16 36/61/16 -f 34/32/17 32/31/17 38/51/17 -f 31/55/18 33/54/18 35/62/18 -f 47/85/2 48/63/2 46/65/2 -f 43/368/1 54/66/1 45/68/1 -f 49/83/19 50/69/19 40/71/19 -f 50/80/5 43/72/5 48/74/5 -f 49/78/20 40/75/20 47/77/20 -f 44/369/12 49/78/12 46/79/12 -f 39/370/21 50/80/21 41/81/21 -f 44/371/4 43/82/4 49/83/4 -f 42/372/22 41/84/22 47/85/22 -f 53/95/23 57/86/23 54/88/23 -f 46/373/1 51/89/1 44/91/1 -f 45/374/1 52/92/1 46/94/1 -f 44/375/1 53/95/1 43/96/1 -f 55/98/1 56/97/1 57/86/1 -f 52/92/24 56/97/24 51/93/24 -f 54/66/25 58/87/25 52/67/25 -f 51/89/26 55/98/26 53/90/26 -f 66/118/3 65/99/3 60/101/3 -f 61/109/2 65/102/2 68/104/2 -f 61/115/1 62/105/1 63/107/1 -f 62/112/12 66/108/12 64/106/12 -f 65/102/5 61/109/5 59/100/5 -f 64/106/2 60/101/2 63/107/2 -f 68/104/5 70/103/5 72/111/5 -f 66/108/2 62/112/2 69/114/2 -f 62/105/2 61/115/2 67/117/2 -f 65/99/2 66/118/2 70/120/2 -f 69/114/12 67/113/12 73/122/12 -f 70/120/3 69/119/3 74/124/3 -f 67/117/1 68/116/1 71/126/1 -f 82/146/3 81/127/3 76/129/3 -f 77/137/2 81/130/2 84/132/2 -f 77/143/1 78/133/1 79/135/1 -f 78/140/12 82/136/12 80/134/12 -f 81/130/5 77/137/5 75/128/5 -f 80/134/2 76/129/2 79/135/2 -f 84/132/5 86/131/5 88/139/5 -f 82/136/2 78/140/2 85/142/2 -f 78/133/2 77/143/2 83/145/2 -f 81/127/2 82/146/2 86/148/2 -f 85/142/12 83/141/12 89/150/12 -f 86/148/3 85/147/3 90/152/3 -f 83/145/1 84/144/1 87/154/1 -f 98/176/3 92/155/3 97/157/3 -f 93/165/4 100/158/4 97/160/4 -f 93/173/1 95/161/1 94/163/1 -f 94/170/12 96/162/12 98/164/12 -f 97/160/5 91/156/5 93/165/5 -f 96/162/4 95/161/4 92/155/4 -f 100/158/5 104/166/5 102/159/5 -f 98/164/4 101/168/4 94/170/4 -f 94/163/4 99/171/4 93/173/4 -f 97/157/4 102/174/4 98/176/4 -f 101/168/12 105/177/12 99/169/12 -f 102/174/3 106/179/3 101/175/3 -f 99/171/1 103/181/1 100/172/1 -f 114/204/3 108/183/3 113/185/3 -f 109/193/4 116/186/4 113/188/4 -f 109/201/1 111/189/1 110/191/1 -f 110/198/12 112/190/12 114/192/12 -f 113/188/5 107/184/5 109/193/5 -f 112/190/4 111/189/4 108/183/4 -f 116/186/5 120/194/5 118/187/5 -f 114/192/4 117/196/4 110/198/4 -f 110/191/4 115/199/4 109/201/4 -f 113/185/4 118/202/4 114/204/4 -f 117/196/12 121/205/12 115/197/12 -f 118/202/3 122/207/3 117/203/3 -f 115/199/1 119/209/1 116/200/1 -f 15/214/27 16/211/27 124/213/27 -f 9/24/4 12/23/4 15/214/4 -f 12/16/3 11/215/3 16/217/3 -f 10/358/1 9/19/1 14/219/1 -f 128/376/12 124/213/12 152/377/12 -f 18/212/12 125/378/12 133/379/12 -f 133/379/12 134/380/12 18/212/12 -f 135/381/12 136/382/12 18/212/12 -f 137/383/12 138/384/12 18/212/12 -f 139/385/12 140/386/12 18/212/12 -f 141/387/12 142/239/12 18/212/12 -f 143/220/12 144/388/12 124/213/12 -f 145/389/12 146/390/12 124/213/12 -f 147/391/12 148/392/12 124/213/12 -f 149/393/12 150/394/12 124/213/12 -f 151/395/12 152/377/12 124/213/12 -f 18/212/12 134/380/12 135/381/12 -f 151/395/12 124/213/12 150/394/12 -f 148/392/12 149/393/12 124/213/12 -f 144/388/12 145/389/12 124/213/12 -f 140/386/12 141/387/12 18/212/12 -f 136/382/12 137/383/12 18/212/12 -f 147/391/12 124/213/12 146/390/12 -f 18/212/12 138/384/12 139/385/12 -f 142/239/12 143/220/12 18/212/12 -f 13/26/28 14/25/28 17/222/28 -f 14/219/29 15/218/29 123/224/29 -f 16/217/30 13/216/30 18/226/30 -f 127/231/3 128/227/3 131/229/3 -f 126/396/12 17/222/12 212/397/12 -f 123/221/12 127/398/12 193/399/12 -f 193/399/12 194/400/12 123/221/12 -f 195/401/12 196/402/12 123/221/12 -f 197/403/12 198/404/12 123/221/12 -f 199/405/12 200/406/12 123/221/12 -f 201/407/12 202/242/12 123/221/12 -f 203/230/12 204/408/12 17/222/12 -f 205/409/12 206/410/12 17/222/12 -f 207/411/12 208/412/12 17/222/12 -f 209/413/12 210/414/12 17/222/12 -f 211/415/12 212/397/12 17/222/12 -f 123/221/12 194/400/12 195/401/12 -f 211/415/12 17/222/12 210/414/12 -f 208/412/12 209/413/12 17/222/12 -f 204/408/12 205/409/12 17/222/12 -f 200/406/12 201/407/12 123/221/12 -f 196/402/12 197/403/12 123/221/12 -f 207/411/12 17/222/12 206/410/12 -f 123/221/12 198/404/12 199/405/12 -f 202/242/12 203/230/12 123/221/12 -f 123/224/12 124/223/12 127/231/12 -f 18/226/12 17/225/12 125/233/12 -f 129/416/12 130/234/12 132/236/12 -f 125/233/1 126/232/1 129/238/1 -f 132/241/2 128/376/2 152/377/2 -f 152/377/2 151/395/2 132/241/2 -f 150/394/2 149/393/2 132/241/2 -f 148/392/2 147/391/2 132/241/2 -f 146/390/2 145/389/2 132/241/2 -f 144/388/2 143/220/2 132/241/2 -f 142/239/2 141/387/2 129/240/2 -f 140/386/2 139/385/2 129/240/2 -f 138/384/2 137/383/2 129/240/2 -f 136/382/2 135/381/2 129/240/2 -f 134/380/2 133/379/2 129/240/2 -f 125/378/2 129/240/2 133/379/2 -f 132/241/2 151/395/2 150/394/2 -f 149/393/2 148/392/2 132/241/2 -f 145/389/2 144/388/2 132/241/2 -f 141/387/2 140/386/2 129/240/2 -f 137/383/2 136/382/2 129/240/2 -f 134/380/2 129/240/2 135/381/2 -f 132/241/2 147/391/2 146/390/2 -f 143/220/2 142/239/2 132/241/2 -f 138/384/2 129/240/2 139/385/2 -f 130/244/4 126/396/4 212/397/4 -f 212/397/4 211/415/4 130/244/4 -f 210/414/4 209/413/4 130/244/4 -f 208/412/4 207/411/4 130/244/4 -f 206/410/4 205/409/4 130/244/4 -f 204/408/4 203/230/4 130/244/4 -f 202/242/4 201/407/4 131/243/4 -f 200/406/4 199/405/4 131/243/4 -f 198/404/4 197/403/4 131/243/4 -f 196/402/4 195/401/4 131/243/4 -f 194/400/4 193/399/4 131/243/4 -f 127/398/4 131/243/4 193/399/4 -f 130/244/4 211/415/4 210/414/4 -f 209/413/4 208/412/4 130/244/4 -f 205/409/4 204/408/4 130/244/4 -f 201/407/4 200/406/4 131/243/4 -f 197/403/4 196/402/4 131/243/4 -f 194/400/4 131/243/4 195/401/4 -f 130/244/4 207/411/4 206/410/4 -f 203/230/4 202/242/4 130/244/4 -f 198/404/4 131/243/4 199/405/4 -f 194/417/2 193/245/2 214/247/2 -f 196/418/2 195/248/2 216/250/2 -f 198/419/2 197/251/2 218/253/2 -f 200/420/2 199/254/2 220/256/2 -f 202/421/2 201/257/2 222/259/2 -f 204/422/2 203/260/2 224/262/2 -f 206/423/2 205/263/2 226/265/2 -f 208/424/2 207/266/2 228/268/2 -f 210/425/2 209/269/2 230/271/2 -f 212/426/2 211/272/2 232/274/2 -f 232/274/8 231/273/8 252/276/8 -f 230/271/8 229/270/8 250/278/8 -f 228/268/8 227/267/8 248/280/8 -f 226/265/8 225/264/8 246/282/8 -f 224/262/8 223/261/8 244/284/8 -f 222/259/8 221/258/8 242/286/8 -f 220/256/8 219/255/8 240/288/8 -f 218/253/8 217/252/8 238/290/8 -f 216/250/8 215/249/8 236/292/8 -f 214/247/8 213/246/8 234/294/8 -f 172/307/9 171/295/9 192/297/9 -f 170/305/9 169/298/9 190/300/9 -f 148/427/4 147/301/4 168/303/4 -f 150/428/4 149/304/4 170/305/4 -f 152/429/4 151/306/4 172/307/4 -f 146/430/4 145/308/4 166/310/4 -f 144/431/4 143/311/4 164/313/4 -f 142/432/4 141/314/4 162/316/4 -f 140/433/4 139/317/4 160/319/4 -f 138/434/4 137/320/4 158/322/4 -f 136/435/4 135/323/4 156/325/4 -f 134/436/4 133/326/4 154/328/4 -f 154/328/9 153/327/9 174/330/9 -f 156/325/9 155/324/9 176/332/9 -f 158/322/9 157/321/9 178/334/9 -f 160/319/9 159/318/9 180/336/9 -f 162/316/9 161/315/9 182/338/9 -f 164/313/9 163/312/9 184/340/9 -f 166/310/9 165/309/9 186/342/9 -f 168/303/9 167/302/9 188/344/9 -f 173/329/12 252/276/12 174/330/12 -f 175/331/12 250/278/12 176/332/12 -f 177/333/12 248/280/12 178/334/12 -f 179/335/12 246/282/12 180/336/12 -f 181/337/12 244/284/12 182/338/12 -f 183/339/12 242/286/12 184/340/12 -f 191/296/12 234/294/12 192/297/12 -f 189/299/12 236/292/12 190/300/12 -f 187/343/12 238/290/12 188/344/12 -f 185/341/12 240/288/12 186/342/12 diff --git a/src/main/resources/assets/hbm/models/assembler_wheel.obj b/src/main/resources/assets/hbm/models/assembler_wheel.obj deleted file mode 100644 index 526a71b3c..000000000 --- a/src/main/resources/assets/hbm/models/assembler_wheel.obj +++ /dev/null @@ -1,645 +0,0 @@ -# Blender v2.76 (sub 0) OBJ File: 'assembler_wheel.blend' -# www.blender.org -o Cylinder -v 0.000000 1.162500 -0.750000 -v 0.000000 1.537500 -0.750000 -v 0.194114 1.162500 -0.724444 -v 0.194114 1.537500 -0.724444 -v 0.375000 1.162500 -0.649519 -v 0.375000 1.537500 -0.649519 -v 0.530330 1.162500 -0.530330 -v 0.530330 1.537500 -0.530330 -v 0.649519 1.162500 -0.375000 -v 0.649519 1.537500 -0.375000 -v 0.724444 1.162500 -0.194114 -v 0.724444 1.537500 -0.194114 -v 0.750000 1.162500 -0.000000 -v 0.750000 1.537500 -0.000000 -v 0.724444 1.162500 0.194114 -v 0.724444 1.537500 0.194114 -v 0.649519 1.162500 0.375000 -v 0.649519 1.537500 0.375000 -v 0.530330 1.162500 0.530330 -v 0.530330 1.537500 0.530330 -v 0.375000 1.162500 0.649519 -v 0.375000 1.537500 0.649519 -v 0.194115 1.162500 0.724444 -v 0.194115 1.537500 0.724444 -v 0.000000 1.162500 0.750000 -v 0.000000 1.537500 0.750000 -v -0.194114 1.162500 0.724444 -v -0.194114 1.537500 0.724444 -v -0.375000 1.162500 0.649519 -v -0.375000 1.537500 0.649519 -v -0.530330 1.162500 0.530330 -v -0.530330 1.537500 0.530330 -v -0.649519 1.162500 0.375000 -v -0.649519 1.537500 0.375000 -v -0.724444 1.162500 0.194115 -v -0.724444 1.537500 0.194115 -v -0.750000 1.162500 0.000000 -v -0.750000 1.537500 0.000000 -v -0.724444 1.162500 -0.194114 -v -0.724444 1.537500 -0.194114 -v -0.649519 1.162500 -0.375000 -v -0.649519 1.537500 -0.375000 -v -0.530330 1.162500 -0.530330 -v -0.530330 1.537500 -0.530330 -v -0.375000 1.162500 -0.649519 -v -0.375000 1.537500 -0.649519 -v -0.194115 1.162500 -0.724444 -v -0.194115 1.537500 -0.724444 -v 0.000000 1.162500 -0.562500 -v 0.000000 1.537500 -0.562500 -v 0.145586 1.162500 -0.543333 -v 0.145586 1.537500 -0.543333 -v 0.281250 1.162500 -0.487139 -v 0.281250 1.537500 -0.487139 -v 0.397748 1.162500 -0.397748 -v 0.397748 1.537500 -0.397748 -v 0.487139 1.162500 -0.281250 -v 0.487139 1.537500 -0.281250 -v 0.543333 1.162500 -0.145586 -v 0.543333 1.537500 -0.145586 -v 0.562500 1.162500 -0.000000 -v 0.562500 1.537500 -0.000000 -v 0.543333 1.162500 0.145586 -v 0.543333 1.537500 0.145586 -v 0.487139 1.162500 0.281250 -v 0.487139 1.537500 0.281250 -v 0.397748 1.162500 0.397747 -v 0.397748 1.537500 0.397747 -v 0.281250 1.162500 0.487139 -v 0.281250 1.537500 0.487139 -v 0.145586 1.162500 0.543333 -v 0.145586 1.537500 0.543333 -v 0.000000 1.162500 0.562500 -v 0.000000 1.537500 0.562500 -v -0.145585 1.162500 0.543333 -v -0.145585 1.537500 0.543333 -v -0.281250 1.162500 0.487139 -v -0.281250 1.537500 0.487139 -v -0.397747 1.162500 0.397748 -v -0.397747 1.537500 0.397748 -v -0.487139 1.162500 0.281250 -v -0.487139 1.537500 0.281250 -v -0.543333 1.162500 0.145586 -v -0.543333 1.537500 0.145586 -v -0.562500 1.162500 0.000000 -v -0.562500 1.537500 0.000000 -v -0.543333 1.162500 -0.145585 -v -0.543333 1.537500 -0.145585 -v -0.487139 1.162500 -0.281250 -v -0.487139 1.537500 -0.281250 -v -0.397748 1.162500 -0.397747 -v -0.397748 1.537500 -0.397747 -v -0.281250 1.162500 -0.487139 -v -0.281250 1.537500 -0.487139 -v -0.145586 1.162500 -0.543333 -v -0.145586 1.537500 -0.543333 -v 0.000000 1.537500 -0.281250 -v 0.072793 1.537500 -0.271667 -v 0.140625 1.537500 -0.243570 -v 0.198874 1.537500 -0.198874 -v 0.243570 1.537500 -0.140625 -v 0.271667 1.537500 -0.072793 -v 0.281250 1.537500 0.000000 -v 0.271667 1.537500 0.072793 -v 0.243570 1.537500 0.140625 -v 0.198874 1.537500 0.198874 -v 0.140625 1.537500 0.243570 -v 0.072793 1.537500 0.271667 -v 0.000000 1.537500 0.281250 -v -0.072793 1.537500 0.271667 -v -0.140625 1.537500 0.243570 -v -0.198874 1.537500 0.198874 -v -0.243570 1.537500 0.140625 -v -0.271667 1.537500 0.072793 -v -0.281250 1.537500 0.000000 -v -0.271667 1.537500 -0.072793 -v -0.243570 1.537500 -0.140625 -v -0.198874 1.537500 -0.198874 -v -0.140625 1.537500 -0.243569 -v -0.072793 1.537500 -0.271667 -v 0.000000 1.287500 0.281250 -v 0.072793 1.287500 0.271667 -v 0.140625 1.287500 0.243570 -v 0.198874 1.287500 0.198874 -v 0.243570 1.287500 0.140625 -v 0.271667 1.287500 0.072793 -v 0.281250 1.287500 0.000000 -v 0.271667 1.287500 -0.072793 -v 0.243570 1.287500 -0.140625 -v 0.198874 1.287500 -0.198874 -v 0.140625 1.287500 -0.243570 -v 0.072793 1.287500 -0.271667 -v 0.000000 1.287500 -0.281250 -v -0.072793 1.287500 0.271667 -v -0.140625 1.287500 0.243570 -v -0.198874 1.287500 0.198874 -v -0.243570 1.287500 0.140625 -v -0.271667 1.287500 0.072793 -v -0.281250 1.287500 0.000000 -v -0.271667 1.287500 -0.072793 -v -0.243570 1.287500 -0.140625 -v -0.198874 1.287500 -0.198874 -v -0.140625 1.287500 -0.243569 -v -0.072793 1.287500 -0.271667 -vt 0.190885 0.497428 -vt 0.190885 0.622697 -vt 0.128251 0.622697 -vt 0.607699 0.748393 -vt 0.542295 0.748393 -vt 0.542295 0.623125 -vt 0.062848 0.622697 -vt 0.000214 0.622697 -vt 0.000214 0.497429 -vt 0.367975 0.748393 -vt 0.302572 0.748393 -vt 0.302572 0.623125 -vt 0.670333 0.748821 -vt 0.670333 0.874089 -vt 0.607699 0.874089 -vt 0.128251 0.748393 -vt 0.062848 0.748393 -vt 0.062848 0.623125 -vt 0.542296 0.874090 -vt 0.479662 0.874090 -vt 0.479662 0.748821 -vt 0.607699 0.999786 -vt 0.542296 0.999786 -vt 0.542296 0.874518 -vt 0.430609 0.748821 -vt 0.430609 0.874090 -vt 0.367975 0.874090 -vt 0.367975 0.999786 -vt 0.302572 0.999786 -vt 0.302572 0.874518 -vt 0.302572 0.874090 -vt 0.239938 0.874090 -vt 0.239938 0.748821 -vt 0.128251 0.999786 -vt 0.062848 0.999786 -vt 0.062848 0.874518 -vt 0.190886 0.748821 -vt 0.190886 0.874090 -vt 0.128251 0.874089 -vt 0.607699 0.622697 -vt 0.542295 0.622697 -vt 0.542295 0.497428 -vt 0.000214 0.874089 -vt 0.000214 0.748821 -vt 0.062848 0.748821 -vt 0.367975 0.622697 -vt 0.302572 0.622697 -vt 0.302572 0.497428 -vt 0.670333 0.623125 -vt 0.670333 0.748393 -vt 0.062848 0.497429 -vt 0.479661 0.748393 -vt 0.479661 0.623125 -vt 0.542296 0.748821 -vt 0.430609 0.623125 -vt 0.430609 0.748393 -vt 0.302572 0.748821 -vt 0.176700 0.075008 -vt 0.134220 0.099534 -vt 0.096090 0.049843 -vt 0.062848 0.874089 -vt 0.239938 0.748393 -vt 0.049843 0.096090 -vt 0.099534 0.134219 -vt 0.075008 0.176700 -vt 0.719385 0.748393 -vt 0.190885 0.748393 -vt 0.128251 0.623125 -vt 0.000214 0.748393 -vt 0.190885 0.623125 -vt 0.670333 0.999786 -vt 0.607699 0.874518 -vt 0.719385 0.999786 -vt 0.670333 0.874518 -vt 0.479661 0.999786 -vt 0.479661 0.874518 -vt 0.430609 0.999786 -vt 0.430609 0.874518 -vt 0.239938 0.999786 -vt 0.190885 0.999786 -vt 0.190885 0.874518 -vt 0.239938 0.874518 -vt 0.719385 0.622697 -vt 0.670333 0.622697 -vt 0.670333 0.497428 -vt 0.239938 0.622697 -vt 0.239938 0.497428 -vt 0.479661 0.622697 -vt 0.430609 0.622697 -vt 0.430609 0.497428 -vt 0.000214 0.999786 -vt 0.000214 0.874518 -vt 0.719385 0.874089 -vt 0.479661 0.497428 -vt 0.323144 0.191413 -vt 0.397680 0.134219 -vt 0.422206 0.176700 -vt 0.273133 0.062312 -vt 0.224081 0.062312 -vt 0.215906 0.000214 -vt 0.362995 0.099534 -vt 0.320514 0.075008 -vt 0.344483 0.017142 -vt 0.480073 0.152731 -vt 0.434902 0.224081 -vt 0.497000 0.215905 -vt 0.497000 0.281309 -vt 0.397680 0.362995 -vt 0.422206 0.320514 -vt 0.480073 0.344483 -vt 0.362995 0.397680 -vt 0.401124 0.447371 -vt 0.344484 0.480073 -vt 0.224081 0.434902 -vt 0.273133 0.434902 -vt 0.281309 0.497000 -vt 0.134219 0.397680 -vt 0.176700 0.422206 -vt 0.152731 0.480073 -vt 0.017142 0.344483 -vt 0.075008 0.320514 -vt 0.099534 0.362995 -vt 0.062312 0.224081 -vt 0.062312 0.273133 -vt 0.000214 0.281309 -vt 0.305801 0.174071 -vt 0.521955 0.167717 -vt 0.521955 0.084205 -vt 0.546481 0.084205 -vt 0.546481 0.335598 -vt 0.546481 0.252086 -vt 0.571007 0.252086 -vt 0.497428 0.251658 -vt 0.497428 0.168145 -vt 0.521955 0.168145 -vt 0.571007 0.083752 -vt 0.571036 0.000239 -vt 0.595562 0.000248 -vt 0.546481 0.167717 -vt 0.571007 0.084205 -vt 0.521955 0.251658 -vt 0.546481 0.168145 -vt 0.571007 0.335598 -vt 0.595533 0.252086 -vt 0.571007 0.167717 -vt 0.595533 0.084205 -vt 0.595533 0.083760 -vt 0.620088 0.000256 -vt 0.546481 0.251658 -vt 0.571007 0.168145 -vt 0.595533 0.167717 -vt 0.620059 0.084205 -vt 0.595533 0.335598 -vt 0.620059 0.252086 -vt 0.571007 0.251658 -vt 0.595533 0.168145 -vt 0.620059 0.083769 -vt 0.644614 0.000265 -vt 0.620059 0.167717 -vt 0.644585 0.084205 -vt 0.497428 0.083726 -vt 0.497457 0.000214 -vt 0.521983 0.000223 -vt 0.595533 0.251658 -vt 0.620059 0.168145 -vt 0.620059 0.335598 -vt 0.644585 0.252086 -vt 0.497428 0.335598 -vt 0.497428 0.252086 -vt 0.521955 0.252086 -vt 0.620059 0.251658 -vt 0.644585 0.168145 -vt 0.521955 0.083735 -vt 0.546510 0.000231 -vt 0.497428 0.167717 -vt 0.497428 0.084205 -vt 0.521955 0.335598 -vt 0.546481 0.083743 -vt 0.341755 0.236344 -vt 0.335407 0.212654 -vt 0.434902 0.273133 -vt 0.341755 0.260870 -vt 0.335407 0.284561 -vt 0.323144 0.305801 -vt 0.305801 0.323144 -vt 0.284561 0.335407 -vt 0.260870 0.341754 -vt 0.320514 0.422206 -vt 0.236344 0.341754 -vt 0.212654 0.335407 -vt 0.191413 0.323144 -vt 0.174071 0.305801 -vt 0.161808 0.284561 -vt 0.155460 0.260870 -vt 0.155460 0.236344 -vt 0.161808 0.212653 -vt 0.174071 0.191413 -vt 0.191413 0.174071 -vt 0.212654 0.161807 -vt 0.236344 0.155460 -vt 0.260870 0.155460 -vt 0.284561 0.161808 -vt 0.128251 0.497428 -vt 0.607699 0.623125 -vt 0.367975 0.623125 -vt 0.607699 0.748821 -vt 0.367975 0.748821 -vt 0.367975 0.874518 -vt 0.128251 0.874518 -vt 0.128251 0.748821 -vt 0.607699 0.497428 -vt 0.367975 0.497428 -vt 0.152731 0.017142 -vt 0.239938 0.623125 -vt 0.017142 0.152731 -vt 0.719385 0.623125 -vt 0.000214 0.623125 -vt 0.719385 0.874518 -vt 0.719385 0.497428 -vt 0.719385 0.748821 -vt 0.281309 0.000214 -vt 0.401124 0.049843 -vt 0.447371 0.096090 -vt 0.447371 0.401124 -vt 0.215906 0.497000 -vt 0.096090 0.447371 -vt 0.049843 0.401124 -vt 0.000214 0.215905 -vt 0.644585 0.083777 -vt 0.644585 0.167717 -vt 0.644585 0.335598 -vt 0.644585 0.251658 -vn 0.258800 0.000000 0.965900 -vn 0.382700 0.000000 -0.923900 -vn -0.000000 0.000000 -1.000000 -vn 0.793400 0.000000 -0.608800 -vn -0.258800 0.000000 0.965900 -vn 0.991400 0.000000 -0.130500 -vn 0.500000 0.000000 -0.866000 -vn 0.923900 0.000000 0.382700 -vn -0.707100 0.000000 0.707100 -vn 0.608800 0.000000 0.793400 -vn 0.866000 0.000000 -0.500000 -vn 0.130500 0.000000 0.991400 -vn -0.965900 0.000000 0.258800 -vn -0.382700 0.000000 0.923900 -vn 1.000000 0.000000 -0.000000 -vn -0.793400 0.000000 0.608800 -vn -0.965900 0.000000 -0.258800 -vn -0.991400 0.000000 0.130500 -vn 0.866000 0.000000 0.500000 -vn -0.923900 0.000000 -0.382700 -vn -0.707100 0.000000 -0.707100 -vn -0.608800 0.000000 -0.793400 -vn 0.000000 1.000000 -0.000000 -vn -0.130500 0.000000 -0.991400 -vn 0.500000 0.000000 0.866000 -vn 0.130500 0.000000 -0.991400 -vn -0.258800 0.000000 -0.965900 -vn 0.608800 0.000000 -0.793400 -vn 0.000000 0.000000 1.000000 -vn 0.923900 0.000000 -0.382700 -vn 0.258800 0.000000 -0.965900 -vn 0.991400 0.000000 0.130500 -vn -0.500000 0.000000 0.866000 -vn 0.793400 0.000000 0.608800 -vn 0.707100 0.000000 -0.707100 -vn 0.382700 0.000000 0.923900 -vn -0.866000 0.000000 0.500000 -vn -0.130500 0.000000 0.991400 -vn -0.500000 0.000000 -0.866000 -vn -0.608800 0.000000 0.793400 -vn 0.965900 0.000000 -0.258800 -vn -0.923900 0.000000 0.382700 -vn -1.000000 0.000000 0.000000 -vn -0.991400 0.000000 -0.130500 -vn 0.965900 0.000000 0.258800 -vn -0.793400 0.000000 -0.608800 -vn -0.866000 0.000000 -0.500000 -vn 0.707100 0.000000 0.707100 -vn -0.382700 0.000000 -0.923900 -s off -f 83/1/1 84/2/1 36/3/1 -f 4/4/2 6/5/2 5/6/2 -f 38/7/3 86/8/3 85/9/3 -f 8/10/4 10/11/4 9/12/4 -f 87/13/5 88/14/5 40/15/5 -f 12/16/6 14/17/6 13/18/6 -f 42/19/7 90/20/7 89/21/7 -f 16/22/8 18/23/8 17/24/8 -f 91/25/9 92/26/9 44/27/9 -f 20/28/10 22/29/10 21/30/10 -f 46/31/11 94/32/11 93/33/11 -f 24/34/12 26/35/12 25/36/12 -f 95/37/13 96/38/13 48/39/13 -f 28/40/14 30/41/14 29/42/14 -f 50/43/15 49/44/15 1/45/15 -f 32/46/16 34/47/16 33/48/16 -f 51/49/17 52/50/17 4/4/17 -f 36/3/18 38/7/18 37/51/18 -f 6/5/19 54/52/19 53/53/19 -f 40/15/20 42/19/20 41/54/20 -f 55/55/21 56/56/21 8/10/21 -f 44/27/22 46/31/22 45/57/22 -f 80/58/23 82/59/23 34/60/23 -f 48/39/24 2/61/24 1/45/24 -f 9/12/25 10/11/25 58/62/25 -f 36/63/23 84/64/23 86/65/23 -f 50/66/26 52/50/26 51/49/26 -f 60/67/27 12/16/27 11/68/27 -f 54/52/28 56/56/28 55/55/28 -f 13/18/29 14/17/29 62/69/29 -f 58/62/30 60/67/30 59/70/30 -f 64/71/31 16/22/31 15/72/31 -f 62/73/32 64/71/32 63/74/32 -f 18/23/33 66/75/33 65/76/33 -f 66/75/34 68/77/34 67/78/34 -f 67/78/35 68/77/35 20/28/35 -f 70/79/36 72/80/36 71/81/36 -f 22/29/37 70/79/37 69/82/37 -f 74/83/38 76/84/38 75/85/38 -f 34/47/39 82/86/39 81/87/39 -f 78/88/40 80/89/40 79/90/40 -f 71/81/41 72/80/41 24/34/41 -f 82/86/42 84/2/42 83/1/42 -f 26/35/43 74/91/43 73/92/43 -f 86/93/44 88/14/44 87/13/44 -f 75/85/45 76/84/45 28/40/45 -f 90/20/46 92/26/46 91/25/46 -f 30/41/47 78/88/47 77/94/47 -f 79/90/48 80/89/48 32/46/48 -f 94/32/49 96/38/49 95/37/49 -f 107/95/23 70/96/23 68/97/23 -f 76/98/23 78/99/23 30/100/23 -f 72/101/23 74/102/23 26/103/23 -f 20/104/23 68/97/23 70/96/23 -f 66/105/23 18/106/23 16/107/23 -f 60/108/23 62/109/23 14/110/23 -f 58/111/23 10/112/23 8/113/23 -f 52/114/23 54/115/23 6/116/23 -f 96/117/23 50/118/23 2/119/23 -f 44/120/23 92/121/23 94/122/23 -f 88/123/23 90/124/23 42/125/23 -f 108/126/23 72/101/23 70/96/23 -f 116/127/8 140/128/8 141/129/8 -f 105/130/46 125/131/46 124/132/46 -f 109/133/26 121/134/26 134/135/26 -f 100/136/16 130/137/16 129/138/16 -f 117/139/34 141/129/34 142/140/34 -f 110/141/2 134/135/2 135/142/2 -f 106/143/22 124/132/22 123/144/22 -f 118/145/10 142/140/10 143/146/10 -f 101/147/42 129/138/42 128/148/42 -f 111/149/28 135/142/28 136/150/28 -f 119/151/36 143/146/36 144/152/36 -f 107/153/49 123/144/49 122/154/49 -f 112/155/4 136/150/4 137/156/4 -f 102/157/18 128/148/18 127/158/18 -f 120/159/12 144/152/12 133/160/12 -f 97/161/38 133/162/38 132/163/38 -f 113/164/30 137/156/30 138/165/30 -f 108/166/24 122/154/24 121/167/24 -f 103/168/44 127/169/44 126/170/44 -f 114/171/6 138/165/6 139/172/6 -f 98/173/14 132/163/14 131/174/14 -f 115/175/32 139/176/32 140/128/32 -f 104/177/20 126/170/20 125/131/20 -f 99/178/40 131/174/40 130/137/40 -f 105/179/23 106/180/23 68/97/23 -f 64/181/23 104/182/23 105/179/23 -f 103/183/23 104/182/23 64/181/23 -f 102/184/23 103/183/23 62/109/23 -f 101/185/23 102/184/23 60/108/23 -f 100/186/23 101/185/23 58/111/23 -f 99/187/23 100/186/23 56/188/23 -f 52/114/23 98/189/23 99/187/23 -f 97/190/23 98/189/23 52/114/23 -f 120/191/23 97/190/23 50/118/23 -f 119/192/23 120/191/23 96/117/23 -f 118/193/23 119/192/23 94/122/23 -f 117/194/23 118/193/23 92/121/23 -f 116/195/23 117/194/23 90/124/23 -f 115/196/23 116/195/23 88/123/23 -f 84/64/23 114/197/23 115/196/23 -f 82/59/23 113/198/23 114/197/23 -f 112/199/23 113/198/23 82/59/23 -f 78/99/23 111/200/23 112/199/23 -f 110/201/23 111/200/23 78/99/23 -f 74/102/23 109/202/23 110/201/23 -f 108/126/23 109/202/23 74/102/23 -f 35/203/1 83/1/1 36/3/1 -f 3/204/2 4/4/2 5/6/2 -f 37/51/3 38/7/3 85/9/3 -f 7/205/4 8/10/4 9/12/4 -f 39/206/5 87/13/5 40/15/5 -f 11/68/6 12/16/6 13/18/6 -f 41/54/7 42/19/7 89/21/7 -f 15/72/8 16/22/8 17/24/8 -f 43/207/9 91/25/9 44/27/9 -f 19/208/10 20/28/10 21/30/10 -f 45/57/11 46/31/11 93/33/11 -f 23/209/12 24/34/12 25/36/12 -f 47/210/13 95/37/13 48/39/13 -f 27/211/14 28/40/14 29/42/14 -f 2/61/15 50/43/15 1/45/15 -f 31/212/16 32/46/16 33/48/16 -f 3/204/17 51/49/17 4/4/17 -f 35/203/18 36/3/18 37/51/18 -f 5/6/19 6/5/19 53/53/19 -f 39/206/20 40/15/20 41/54/20 -f 7/205/21 55/55/21 8/10/21 -f 43/207/22 44/27/22 45/57/22 -f 32/213/23 80/58/23 34/60/23 -f 47/210/24 48/39/24 1/45/24 -f 57/214/25 9/12/25 58/62/25 -f 38/215/23 36/63/23 86/65/23 -f 49/216/26 50/66/26 51/49/26 -f 59/70/27 60/67/27 11/68/27 -f 53/53/28 54/52/28 55/55/28 -f 61/217/29 13/18/29 62/69/29 -f 57/214/30 58/62/30 59/70/30 -f 63/74/31 64/71/31 15/72/31 -f 61/218/32 62/73/32 63/74/32 -f 17/24/33 18/23/33 65/76/33 -f 65/76/34 66/75/34 67/78/34 -f 19/208/35 67/78/35 20/28/35 -f 69/82/36 70/79/36 71/81/36 -f 21/30/37 22/29/37 69/82/37 -f 73/219/38 74/83/38 75/85/38 -f 33/48/39 34/47/39 81/87/39 -f 77/94/40 78/88/40 79/90/40 -f 23/209/41 71/81/41 24/34/41 -f 81/87/42 82/86/42 83/1/42 -f 25/36/43 26/35/43 73/92/43 -f 85/220/44 86/93/44 87/13/44 -f 27/211/45 75/85/45 28/40/45 -f 89/21/46 90/20/46 91/25/46 -f 29/42/47 30/41/47 77/94/47 -f 31/212/48 79/90/48 32/46/48 -f 93/33/49 94/32/49 95/37/49 -f 106/180/23 107/95/23 68/97/23 -f 28/221/23 76/98/23 30/100/23 -f 24/222/23 72/101/23 26/103/23 -f 22/223/23 20/104/23 70/96/23 -f 64/181/23 66/105/23 16/107/23 -f 12/224/23 60/108/23 14/110/23 -f 56/188/23 58/111/23 8/113/23 -f 4/225/23 52/114/23 6/116/23 -f 48/226/23 96/117/23 2/119/23 -f 46/227/23 44/120/23 94/122/23 -f 40/228/23 88/123/23 42/125/23 -f 107/95/23 108/126/23 70/96/23 -f 117/139/8 116/127/8 141/129/8 -f 106/143/46 105/130/46 124/132/46 -f 110/141/26 109/133/26 134/135/26 -f 101/147/16 100/136/16 129/138/16 -f 118/145/34 117/139/34 142/140/34 -f 111/149/2 110/141/2 135/142/2 -f 107/153/22 106/143/22 123/144/22 -f 119/151/10 118/145/10 143/146/10 -f 102/157/42 101/147/42 128/148/42 -f 112/155/28 111/149/28 136/150/28 -f 120/159/36 119/151/36 144/152/36 -f 108/166/49 107/153/49 122/154/49 -f 113/164/4 112/155/4 137/156/4 -f 103/229/18 102/157/18 127/158/18 -f 97/230/12 120/159/12 133/160/12 -f 98/173/38 97/161/38 132/163/38 -f 114/171/30 113/164/30 138/165/30 -f 109/231/24 108/166/24 121/167/24 -f 104/177/44 103/168/44 126/170/44 -f 115/232/6 114/171/6 139/172/6 -f 99/178/14 98/173/14 131/174/14 -f 116/127/32 115/175/32 140/128/32 -f 105/130/20 104/177/20 125/131/20 -f 100/136/40 99/178/40 130/137/40 -f 66/105/23 105/179/23 68/97/23 -f 66/105/23 64/181/23 105/179/23 -f 62/109/23 103/183/23 64/181/23 -f 60/108/23 102/184/23 62/109/23 -f 58/111/23 101/185/23 60/108/23 -f 56/188/23 100/186/23 58/111/23 -f 54/115/23 99/187/23 56/188/23 -f 54/115/23 52/114/23 99/187/23 -f 50/118/23 97/190/23 52/114/23 -f 96/117/23 120/191/23 50/118/23 -f 94/122/23 119/192/23 96/117/23 -f 92/121/23 118/193/23 94/122/23 -f 90/124/23 117/194/23 92/121/23 -f 88/123/23 116/195/23 90/124/23 -f 86/65/23 115/196/23 88/123/23 -f 86/65/23 84/64/23 115/196/23 -f 84/64/23 82/59/23 114/197/23 -f 80/58/23 112/199/23 82/59/23 -f 80/58/23 78/99/23 112/199/23 -f 76/98/23 110/201/23 78/99/23 -f 76/98/23 74/102/23 110/201/23 -f 72/101/23 108/126/23 74/102/23 diff --git a/src/main/resources/assets/hbm/models/machines/assembly_machine.obj b/src/main/resources/assets/hbm/models/machines/assembly_machine.obj new file mode 100644 index 000000000..1b79436d5 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/assembly_machine.obj @@ -0,0 +1,4670 @@ +# Blender v2.79 (sub 0) OBJ File: 'assembler.blend' +# www.blender.org +o Head2 +v -0.125000 2.750000 0.000000 +v 0.125000 2.750000 -0.000000 +v -0.125000 2.750000 -0.250000 +v 0.125000 2.750000 -0.250000 +v -0.125000 1.750000 -0.250000 +v -0.125000 1.750000 0.000000 +v 0.125000 1.750000 -0.000000 +v 0.125000 1.750000 -0.250000 +v -0.062500 2.500000 -0.250000 +v 0.062500 2.500000 -0.250000 +v -0.062500 2.500000 -0.437500 +v 0.062500 2.500000 -0.437500 +v -0.062500 2.250000 -0.437500 +v 0.062500 2.250000 -0.437500 +v -0.062500 2.250000 -0.250000 +v 0.062500 2.250000 -0.250000 +v 0.250000 2.625000 -0.093750 +v 0.250000 1.875000 -0.093750 +v 0.250000 2.625000 -0.156250 +v 0.250000 1.875000 -0.156250 +v 0.125000 2.625000 -0.093750 +v 0.125000 1.875000 -0.093750 +v 0.125000 2.625000 -0.156250 +v 0.125000 1.875000 -0.156250 +v 0.187500 2.562500 -0.093750 +v 0.187500 1.937500 -0.093750 +v 0.187500 2.562500 -0.156250 +v 0.187500 1.937500 -0.156250 +v 0.125000 2.562500 -0.093750 +v 0.125000 1.937500 -0.093750 +v 0.125000 2.562500 -0.156250 +v 0.125000 1.937500 -0.156250 +v -0.250001 2.625000 -0.156250 +v -0.250001 1.875000 -0.156250 +v -0.250001 2.625000 -0.093750 +v -0.250001 1.875000 -0.093750 +v -0.125001 2.625000 -0.156250 +v -0.125001 1.875000 -0.156250 +v -0.125001 2.625000 -0.093750 +v -0.125001 1.875000 -0.093750 +v -0.187501 2.562500 -0.156250 +v -0.187501 1.937500 -0.156250 +v -0.187501 2.562500 -0.093750 +v -0.187501 1.937500 -0.093750 +v -0.125001 2.562500 -0.156250 +v -0.125001 1.937500 -0.156250 +v -0.125001 2.562500 -0.093750 +v -0.125001 1.937500 -0.093750 +v -0.125000 2.375000 -0.562500 +v -0.000000 2.375000 -0.562500 +v -0.125000 2.286612 -0.525888 +v -0.000000 2.286612 -0.525888 +v -0.125000 2.250000 -0.437500 +v -0.000000 2.250000 -0.437500 +v -0.125000 2.286612 -0.349112 +v -0.000000 2.286612 -0.349112 +v -0.125000 2.375000 -0.312500 +v -0.000000 2.375000 -0.312500 +v -0.125000 2.463388 -0.349112 +v -0.000000 2.463388 -0.349112 +v -0.125000 2.500000 -0.437500 +v -0.000000 2.500000 -0.437500 +v -0.125000 2.463388 -0.525888 +v -0.000000 2.463388 -0.525888 +v -0.130000 1.875000 -0.234375 +v -0.130000 1.875000 -0.171875 +v -0.130000 2.062500 -0.234375 +v -0.130000 2.062500 -0.171875 +vt 0.750000 0.907407 +vt 0.723684 0.870370 +vt 0.750000 0.870370 +vt 0.750000 0.685185 +vt 0.723684 0.722222 +vt 0.723684 0.685185 +vt 0.802632 0.870370 +vt 0.828947 0.722222 +vt 0.828947 0.870370 +vt 0.776316 0.722222 +vt 0.776316 0.870370 +vt 0.750000 0.722222 +vt 0.802632 0.722222 +vt 0.875000 0.574074 +vt 0.861842 0.601852 +vt 0.861842 0.574074 +vt 0.875000 0.601852 +vt 0.901316 0.620370 +vt 0.875000 0.620370 +vt 0.901316 0.601852 +vt 0.914474 0.574074 +vt 0.914474 0.601852 +vt 0.901316 0.574074 +vt 0.940789 0.574074 +vt 0.940789 0.601852 +vt 0.703947 0.703704 +vt 0.710526 0.814815 +vt 0.703947 0.814815 +vt 0.710526 0.685185 +vt 0.710526 0.703704 +vt 0.703947 0.833333 +vt 0.723684 0.805556 +vt 0.717105 0.712963 +vt 0.723684 0.712963 +vt 0.717105 0.694444 +vt 0.723684 0.685185 +vt 0.723684 0.694444 +vt 0.723684 0.833333 +vt 0.717105 0.824074 +vt 0.723684 0.824074 +vt 0.697368 0.824074 +vt 0.710526 0.833333 +vt 0.717105 0.833333 +vt 0.717105 0.805556 +vt 0.697368 0.712963 +vt 0.703947 0.685185 +vt 0.697368 0.694444 +vt 0.697368 0.685185 +vt 0.703947 0.703704 +vt 0.710526 0.814815 +vt 0.703947 0.814815 +vt 0.710526 0.685185 +vt 0.710526 0.703704 +vt 0.710526 0.833333 +vt 0.703947 0.833333 +vt 0.723684 0.805556 +vt 0.717105 0.712963 +vt 0.723684 0.712963 +vt 0.717105 0.685185 +vt 0.723684 0.694444 +vt 0.717105 0.694444 +vt 0.723684 0.833333 +vt 0.717105 0.824074 +vt 0.723684 0.824074 +vt 0.697368 0.824074 +vt 0.717105 0.833333 +vt 0.717105 0.805556 +vt 0.697368 0.712963 +vt 0.703947 0.685185 +vt 0.697368 0.694444 +vt 0.697368 0.685185 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.559211 0.944444 +vt 0.460526 0.898148 +vt 0.559211 0.898148 +vt 0.723684 0.907407 +vt 0.717105 0.685185 +vt 0.697368 0.833333 +vt 0.697368 0.805556 +vt 0.723684 0.685185 +vt 0.697368 0.833333 +vt 0.697368 0.805556 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.460526 0.944444 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.789474 0.574074 +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 +vn -0.0000 -0.7071 -0.7071 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn -0.0000 0.7071 -0.7071 +s off +f 1/1/1 4/2/1 3/3/1 +f 6/4/2 8/5/2 7/6/2 +f 2/7/3 8/8/3 4/9/3 +f 3/3/4 6/10/4 1/11/4 +f 4/2/5 5/12/5 3/3/5 +f 1/11/6 7/13/6 2/7/6 +f 10/14/1 11/15/1 9/16/1 +f 12/17/5 13/18/5 11/19/5 +f 14/20/2 15/21/2 13/22/2 +f 16/23/3 12/17/3 10/14/3 +f 13/22/4 9/24/4 11/25/4 +f 18/26/3 19/27/3 17/28/3 +f 18/26/2 24/29/2 20/30/2 +f 19/27/1 21/31/1 17/28/1 +f 25/32/4 28/33/4 26/34/4 +f 28/35/1 30/36/1 26/37/1 +f 29/38/2 27/39/2 25/40/2 +f 21/31/6 25/41/6 17/28/6 +f 23/42/5 27/39/5 31/43/5 +f 20/30/5 27/44/5 19/27/5 +f 24/29/5 28/35/5 20/30/5 +f 17/28/6 26/45/6 18/26/6 +f 22/46/6 26/47/6 30/48/6 +f 34/49/4 35/50/4 33/51/4 +f 34/49/2 40/52/2 36/53/2 +f 33/51/1 39/54/1 37/55/1 +f 41/56/3 44/57/3 42/58/3 +f 48/59/1 42/60/1 44/61/1 +f 45/62/2 43/63/2 41/64/2 +f 37/55/5 41/65/5 33/51/5 +f 39/54/6 43/63/6 47/66/6 +f 36/53/6 43/67/6 35/50/6 +f 40/52/6 44/61/6 36/53/6 +f 33/51/5 42/68/5 34/49/5 +f 38/69/5 42/70/5 46/71/5 +f 62/72/3 58/73/3 54/74/3 +f 59/75/4 61/76/4 63/77/4 +f 66/78/4 67/79/4 65/80/4 +f 1/1/1 2/81/1 4/2/1 +f 6/4/2 5/12/2 8/5/2 +f 2/7/3 7/13/3 8/8/3 +f 3/3/4 5/12/4 6/10/4 +f 4/2/5 8/5/5 5/12/5 +f 1/11/6 6/10/6 7/13/6 +f 10/14/1 12/17/1 11/15/1 +f 12/17/5 14/20/5 13/18/5 +f 14/20/2 16/23/2 15/21/2 +f 16/23/3 14/20/3 12/17/3 +f 13/22/4 15/21/4 9/24/4 +f 18/26/3 20/30/3 19/27/3 +f 18/26/2 22/46/2 24/29/2 +f 19/27/1 23/42/1 21/31/1 +f 25/32/4 27/44/4 28/33/4 +f 28/35/1 32/82/1 30/36/1 +f 29/38/2 31/43/2 27/39/2 +f 21/31/6 29/83/6 25/41/6 +f 23/42/5 19/27/5 27/39/5 +f 20/30/5 28/33/5 27/44/5 +f 24/29/5 32/82/5 28/35/5 +f 17/28/6 25/84/6 26/45/6 +f 22/46/6 18/26/6 26/47/6 +f 34/49/4 36/53/4 35/50/4 +f 34/49/2 38/69/2 40/52/2 +f 33/51/1 35/50/1 39/54/1 +f 41/56/3 43/67/3 44/57/3 +f 48/59/1 46/85/1 42/60/1 +f 45/62/2 47/66/2 43/63/2 +f 37/55/5 45/86/5 41/65/5 +f 39/54/6 35/50/6 43/63/6 +f 36/53/6 44/57/6 43/67/6 +f 40/52/6 48/59/6 44/61/6 +f 33/51/5 41/87/5 42/68/5 +f 38/69/5 34/49/5 42/70/5 +f 54/74/3 52/88/3 50/89/3 +f 50/89/3 64/90/3 62/72/3 +f 62/72/3 60/91/3 58/73/3 +f 58/73/3 56/92/3 54/74/3 +f 54/74/3 50/89/3 62/72/3 +f 63/77/4 49/93/4 51/94/4 +f 51/94/4 53/95/4 63/77/4 +f 53/95/4 55/96/4 63/77/4 +f 55/96/4 57/97/4 63/77/4 +f 57/97/4 59/75/4 63/77/4 +f 66/78/4 68/98/4 67/79/4 +s 1 +f 50/99/5 51/100/7 49/101/5 +f 52/102/7 53/103/2 51/100/7 +f 54/104/2 55/105/8 53/106/2 +f 56/107/8 57/108/6 55/105/8 +f 58/109/6 59/110/9 57/108/6 +f 60/111/9 61/112/1 59/110/9 +f 62/113/1 63/114/10 61/112/1 +f 64/115/10 49/101/5 63/114/10 +f 50/99/5 52/102/7 51/100/7 +f 52/102/7 54/116/2 53/103/2 +f 54/104/2 56/107/8 55/105/8 +f 56/107/8 58/109/6 57/108/6 +f 58/109/6 60/111/9 59/110/9 +f 60/111/9 62/113/1 61/112/1 +f 62/113/1 64/115/10 63/114/10 +f 64/115/10 50/99/5 49/101/5 +o Ring +v -0.000000 1.250000 -1.375000 +v -0.526190 1.250000 -1.270334 +v -0.972272 1.250000 -0.972272 +v -1.270334 1.250000 -0.526190 +v -1.375000 1.250000 0.000000 +v -1.270334 1.250000 0.526190 +v -0.972272 1.250000 0.972272 +v -0.526190 1.250000 1.270334 +v -0.000000 1.250000 1.375000 +v 0.526189 1.250000 1.270334 +v 0.972271 1.250000 0.972272 +v 1.270334 1.250000 0.526190 +v 1.375000 1.250000 0.000000 +v 1.270334 1.250000 -0.526190 +v 0.972271 1.250000 -0.972272 +v 0.526189 1.250000 -1.270335 +v -0.000000 1.500000 -1.375000 +v -0.526190 1.500000 -1.270334 +v -0.972272 1.500000 -0.972272 +v -1.270334 1.500000 -0.526190 +v -1.375000 1.500000 0.000000 +v -1.270334 1.500000 0.526190 +v -0.972272 1.500000 0.972272 +v -0.526190 1.500000 1.270334 +v -0.000000 1.500000 1.375000 +v 0.526189 1.500000 1.270334 +v 0.972271 1.500000 0.972272 +v 1.270334 1.500000 0.526190 +v 1.375000 1.500000 0.000000 +v 1.270334 1.500000 -0.526190 +v 0.972271 1.500000 -0.972272 +v 0.526189 1.500000 -1.270335 +v -0.000000 1.500000 -1.250000 +v -0.478355 1.500000 -1.154850 +v -0.883884 1.500000 -0.883883 +v -1.154850 1.500000 -0.478354 +v -1.250000 1.500000 0.000000 +v -1.154850 1.500000 0.478354 +v -0.883884 1.500000 0.883883 +v -0.478355 1.500000 1.154850 +v -0.000000 1.500000 1.250000 +v 0.478354 1.500000 1.154850 +v 0.883883 1.500000 0.883884 +v 1.154849 1.500000 0.478354 +v 1.250000 1.500000 0.000000 +v 1.154849 1.500000 -0.478354 +v 0.883883 1.500000 -0.883884 +v 0.478354 1.500000 -1.154850 +v -0.000000 1.375000 -1.250000 +v -0.478355 1.375000 -1.154850 +v -0.883884 1.375000 -0.883883 +v -1.154850 1.375000 -0.478354 +v -1.250000 1.375000 0.000000 +v -1.154850 1.375000 0.478354 +v -0.883884 1.375000 0.883883 +v -0.478355 1.375000 1.154850 +v -0.000000 1.375000 1.250000 +v 0.478354 1.375000 1.154850 +v 0.883883 1.375000 0.883884 +v 1.154849 1.375000 0.478354 +v 1.250000 1.375000 0.000000 +v 1.154849 1.375000 -0.478354 +v 0.883883 1.375000 -0.883884 +v 0.478354 1.375000 -1.154850 +v -0.000000 1.375000 -1.125000 +v -0.430519 1.375000 -1.039364 +v -0.795495 1.375000 -0.795495 +v -1.039365 1.375000 -0.430519 +v -1.125000 1.375000 0.000000 +v -1.039365 1.375000 0.430519 +v -0.795495 1.375000 0.795495 +v -0.430519 1.375000 1.039364 +v -0.000000 1.375000 1.125000 +v 0.430518 1.375000 1.039365 +v 0.795495 1.375000 0.795496 +v 1.039364 1.375000 0.430519 +v 1.125000 1.375000 0.000000 +v 1.039364 1.375000 -0.430519 +v 0.795495 1.375000 -0.795496 +v 0.430518 1.375000 -1.039365 +v -0.000000 1.250000 -1.125000 +v -0.430519 1.250000 -1.039364 +v -0.795495 1.250000 -0.795495 +v -1.039365 1.250000 -0.430519 +v -1.125000 1.250000 0.000000 +v -1.039365 1.250000 0.430519 +v -0.795495 1.250000 0.795495 +v -0.430519 1.250000 1.039364 +v -0.000000 1.250000 1.125000 +v 0.430518 1.250000 1.039365 +v 0.795495 1.250000 0.795496 +v 1.039364 1.250000 0.430519 +v 1.125000 1.250000 0.000000 +v 1.039364 1.250000 -0.430519 +v 0.795495 1.250000 -0.795496 +v 0.430518 1.250000 -1.039365 +v -0.093750 1.250000 -0.812500 +v 0.093750 1.250000 -0.812500 +v -0.093750 1.250000 -1.437500 +v 0.093750 1.250000 -1.437500 +v -0.093750 1.625000 -1.437500 +v -0.093750 1.625000 -0.812500 +v 0.093750 1.625000 -0.812500 +v 0.093750 1.625000 -1.437500 +v -0.000000 1.625000 -1.062500 +v 0.125000 1.625000 -1.062500 +v -0.000000 1.536612 -1.025888 +v 0.125000 1.536612 -1.025888 +v -0.000000 1.500000 -0.937500 +v 0.125000 1.500000 -0.937500 +v -0.000000 1.536612 -0.849112 +v 0.125000 1.536612 -0.849112 +v -0.000000 1.625000 -0.812500 +v 0.125000 1.625000 -0.812500 +v -0.000000 1.713388 -0.849112 +v 0.125000 1.713388 -0.849112 +v -0.000000 1.750000 -0.937500 +v 0.125000 1.750000 -0.937500 +v -0.000000 1.713388 -1.025888 +v 0.125000 1.713388 -1.025888 +v 0.062499 1.625000 -1.375000 +v -0.062501 1.625000 -1.375000 +v 0.062499 1.625000 -1.250000 +v -0.062501 1.625000 -1.250000 +v 0.062499 1.750000 -1.250000 +v 0.062499 1.750000 -1.375000 +v -0.062501 1.750000 -1.375000 +v -0.062501 1.750000 -1.250000 +v 0.093750 1.250000 0.812500 +v -0.093750 1.250000 0.812500 +v 0.093750 1.250000 1.437500 +v -0.093750 1.250000 1.437500 +v 0.093750 1.625000 1.437500 +v 0.093750 1.625000 0.812500 +v -0.093750 1.625000 0.812500 +v -0.093750 1.625000 1.437500 +v 0.000000 1.625000 1.062500 +v -0.125000 1.625000 1.062500 +v 0.000000 1.536612 1.025888 +v -0.125000 1.536612 1.025888 +v 0.000000 1.500000 0.937500 +v -0.125000 1.500000 0.937500 +v 0.000000 1.536612 0.849112 +v -0.125000 1.536612 0.849112 +v 0.000000 1.625000 0.812500 +v -0.125000 1.625000 0.812500 +v 0.000000 1.713388 0.849112 +v -0.125000 1.713388 0.849112 +v 0.000000 1.750000 0.937500 +v -0.125000 1.750000 0.937500 +v 0.000000 1.713388 1.025888 +v -0.125000 1.713388 1.025888 +v -0.062499 1.625000 1.375000 +v 0.062501 1.625000 1.375000 +v -0.062499 1.625000 1.250000 +v 0.062501 1.625000 1.250000 +v -0.062499 1.750000 1.250000 +v -0.062499 1.750000 1.375000 +v 0.062501 1.750000 1.375000 +v 0.062501 1.750000 1.250000 +vt 0.315789 0.222222 +vt 0.368421 0.240741 +vt 0.315789 0.240741 +vt 0.368421 0.222222 +vt 0.421053 0.240741 +vt 0.473684 0.222222 +vt 0.421053 0.222222 +vt 0.526316 0.222222 +vt 0.473684 0.240741 +vt 0.578947 0.222222 +vt 0.526316 0.240741 +vt 0.631579 0.222222 +vt 0.578947 0.240741 +vt 0.684211 0.222222 +vt 0.631579 0.240741 +vt 0.736842 0.222222 +vt 0.684211 0.240741 +vt 0.789474 0.222222 +vt 0.736842 0.240741 +vt 0.842105 0.222222 +vt 0.789474 0.240741 +vt 0.052632 0.222222 +vt 0.000000 0.240741 +vt -0.000000 0.222222 +vt 0.105263 0.240741 +vt 0.052632 0.240741 +vt 0.105263 0.222222 +vt 0.157895 0.240741 +vt 0.157895 0.222222 +vt 0.210526 0.240741 +vt 0.210526 0.222222 +vt 0.263158 0.240741 +vt 0.263158 0.222222 +vt 0.210526 0.259259 +vt 0.259868 0.277778 +vt 0.213816 0.277778 +vt 0.157895 0.259259 +vt 0.207237 0.277778 +vt 0.161184 0.277778 +vt 0.105263 0.259259 +vt 0.154605 0.277778 +vt 0.108553 0.277778 +vt 0.052632 0.259259 +vt 0.101974 0.277778 +vt 0.055921 0.277778 +vt -0.000000 0.259259 +vt 0.049342 0.277778 +vt 0.003289 0.277778 +vt 0.842105 0.259259 +vt 0.792763 0.277778 +vt 0.789474 0.259259 +vt 0.736842 0.259259 +vt 0.786184 0.277778 +vt 0.740132 0.277778 +vt 0.687500 0.277778 +vt 0.684211 0.259259 +vt 0.634869 0.277778 +vt 0.631579 0.259259 +vt 0.582237 0.277778 +vt 0.578947 0.259259 +vt 0.529605 0.277778 +vt 0.526316 0.259259 +vt 0.476974 0.277778 +vt 0.473684 0.259259 +vt 0.424342 0.277778 +vt 0.421053 0.259259 +vt 0.371711 0.277778 +vt 0.368421 0.259259 +vt 0.315789 0.259259 +vt 0.365132 0.277778 +vt 0.319079 0.277778 +vt 0.263158 0.259259 +vt 0.312500 0.277778 +vt 0.266447 0.277778 +vt 0.263158 0.185185 +vt 0.312500 0.148148 +vt 0.315789 0.185185 +vt 0.210526 0.185185 +vt 0.259868 0.148148 +vt 0.157895 0.185185 +vt 0.207237 0.148148 +vt 0.105263 0.185185 +vt 0.154605 0.148148 +vt 0.052632 0.185185 +vt 0.101974 0.148148 +vt 0.000000 0.185185 +vt 0.049342 0.148148 +vt 0.792763 0.148148 +vt 0.842105 0.185185 +vt 0.789474 0.185185 +vt 0.740132 0.148148 +vt 0.736842 0.185185 +vt 0.687500 0.148148 +vt 0.684211 0.185185 +vt 0.634869 0.148148 +vt 0.631579 0.185185 +vt 0.582237 0.148148 +vt 0.578947 0.185185 +vt 0.529605 0.148148 +vt 0.526316 0.185185 +vt 0.476974 0.148148 +vt 0.473684 0.185185 +vt 0.424342 0.148148 +vt 0.421053 0.185185 +vt 0.371711 0.148148 +vt 0.368421 0.185185 +vt 0.365132 0.148148 +vt 0.861842 0.490741 +vt 0.796053 0.518519 +vt 0.796053 0.490741 +vt 0.796053 0.574074 +vt 0.861842 0.601852 +vt 0.796053 0.601852 +vt 0.776316 0.574074 +vt 0.776316 0.518519 +vt 0.861842 0.518519 +vt 0.947368 0.518519 +vt 0.881579 0.574074 +vt 0.881579 0.518519 +vt 0.861842 0.574074 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.688096 0.624161 +vt 0.688096 0.598061 +vt 0.706641 0.598061 +vt 0.907895 0.481481 +vt 0.894737 0.462963 +vt 0.907895 0.462963 +vt 0.921053 0.444444 +vt 0.907895 0.444444 +vt 0.934211 0.444444 +vt 0.921053 0.462963 +vt 0.894737 0.444444 +vt 0.947368 0.444444 +vt 0.934211 0.462963 +vt 0.861842 0.490741 +vt 0.796053 0.518519 +vt 0.796053 0.490741 +vt 0.796053 0.574074 +vt 0.861842 0.601852 +vt 0.796053 0.601852 +vt 0.776316 0.574074 +vt 0.776316 0.518519 +vt 0.861842 0.518519 +vt 0.947368 0.518519 +vt 0.881579 0.574074 +vt 0.881579 0.518519 +vt 0.861842 0.574074 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.688096 0.624161 +vt 0.688096 0.598061 +vt 0.706641 0.598061 +vt 0.907895 0.481481 +vt 0.894737 0.462963 +vt 0.907895 0.462963 +vt 0.921053 0.444444 +vt 0.907895 0.444444 +vt 0.934211 0.444444 +vt 0.921053 0.462963 +vt 0.894737 0.444444 +vt 0.947368 0.444444 +vt 0.934211 0.462963 +vt 0.842105 0.240741 +vt 0.838816 0.277778 +vt 0.733553 0.277778 +vt 0.680921 0.277778 +vt 0.628289 0.277778 +vt 0.575658 0.277778 +vt 0.523026 0.277778 +vt 0.470395 0.277778 +vt 0.417763 0.277778 +vt 0.266447 0.148148 +vt 0.213816 0.148148 +vt 0.161184 0.148148 +vt 0.108553 0.148148 +vt 0.055921 0.148148 +vt 0.003289 0.148148 +vt 0.838816 0.148148 +vt 0.786184 0.148148 +vt 0.733553 0.148148 +vt 0.680921 0.148148 +vt 0.628289 0.148148 +vt 0.575658 0.148148 +vt 0.523026 0.148148 +vt 0.470395 0.148148 +vt 0.417763 0.148148 +vt 0.319079 0.148148 +vt 0.947368 0.574074 +vt 0.732957 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.697369 0.592656 +vt 0.710482 0.611111 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.894737 0.481481 +vt 0.947368 0.462963 +vt 0.947368 0.574074 +vt 0.732957 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.697369 0.592656 +vt 0.710482 0.611111 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.894737 0.481481 +vt 0.947368 0.462963 +vt 0.319079 0.296296 +vt 0.792763 0.296296 +vt 0.371711 0.296296 +vt 0.003289 0.296296 +vt 0.424342 0.296296 +vt 0.055921 0.296296 +vt 0.476974 0.296296 +vt 0.108553 0.296296 +vt 0.529605 0.296296 +vt 0.161184 0.296296 +vt 0.634869 0.296296 +vt 0.582237 0.296296 +vt 0.213816 0.296296 +vt 0.687500 0.296296 +vt 0.266447 0.296296 +vt 0.740132 0.296296 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.789474 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.365132 0.296296 +vt 0.838816 0.296296 +vt 0.417763 0.296296 +vt 0.049342 0.296296 +vt 0.470395 0.296296 +vt 0.101974 0.296296 +vt 0.523026 0.296296 +vt 0.154605 0.296296 +vt 0.575658 0.296296 +vt 0.207237 0.296296 +vt 0.680921 0.296296 +vt 0.628289 0.296296 +vt 0.259868 0.296296 +vt 0.733553 0.296296 +vt 0.312500 0.296296 +vt 0.786184 0.296296 +vt 0.789474 0.574074 +vt 0.776316 0.574074 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +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.3827 0.0000 -0.9239 +vn 0.3827 0.0000 0.9239 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn -0.9239 0.0000 -0.3827 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +s off +f 95/117/11 112/118/11 111/119/11 +f 96/120/11 113/121/11 112/118/11 +f 98/122/11 113/121/11 97/123/11 +f 99/124/11 114/125/11 98/122/11 +f 100/126/11 115/127/11 99/124/11 +f 85/128/11 116/129/11 100/126/11 +f 86/130/11 101/131/11 85/128/11 +f 87/132/11 102/133/11 86/130/11 +f 88/134/11 103/135/11 87/132/11 +f 89/136/11 104/137/11 88/134/11 +f 90/138/11 105/139/11 89/140/11 +f 90/138/11 107/141/11 106/142/11 +f 91/143/11 108/144/11 107/141/11 +f 92/145/11 109/146/11 108/144/11 +f 93/147/11 110/148/11 109/146/11 +f 94/149/11 111/119/11 110/148/11 +f 125/150/11 142/151/11 141/152/11 +f 124/153/11 141/154/11 140/155/11 +f 123/156/11 140/157/11 139/158/11 +f 122/159/11 139/160/11 138/161/11 +f 121/162/11 138/163/11 137/164/11 +f 121/165/11 136/166/11 120/167/11 +f 119/168/11 136/169/11 135/170/11 +f 119/168/11 134/171/11 118/172/11 +f 118/172/11 133/173/11 117/174/11 +f 117/174/11 148/175/11 132/176/11 +f 132/176/11 147/177/11 131/178/11 +f 131/178/11 146/179/11 130/180/11 +f 130/180/11 145/181/11 129/182/11 +f 129/182/11 144/183/11 128/184/11 +f 127/185/11 144/186/11 143/187/11 +f 126/188/11 143/189/11 142/190/11 +f 78/191/12 159/192/12 79/193/12 +f 77/194/12 158/195/12 78/191/12 +f 76/196/12 157/197/12 77/194/12 +f 75/198/12 156/199/12 76/196/12 +f 74/200/12 155/201/12 75/198/12 +f 73/202/12 154/203/12 74/200/12 +f 152/204/12 73/205/12 72/206/12 +f 151/207/12 72/206/12 71/208/12 +f 150/209/12 71/208/12 70/210/12 +f 149/211/12 70/210/12 69/212/12 +f 164/213/12 69/212/12 84/214/12 +f 163/215/12 84/214/12 83/216/12 +f 162/217/12 83/216/12 82/218/12 +f 161/219/12 82/218/12 81/220/12 +f 160/221/12 81/220/12 80/222/12 +f 79/193/12 160/223/12 80/222/12 +f 167/224/12 166/225/12 165/226/12 +f 171/227/11 169/228/11 170/229/11 +f 166/225/13 170/230/13 165/231/13 +f 168/232/14 171/227/14 166/225/14 +f 165/233/15 169/234/15 167/235/15 +f 167/235/16 172/236/16 168/232/16 +f 186/237/14 182/238/14 178/239/14 +f 187/240/15 175/241/15 179/242/15 +f 195/243/11 193/244/11 194/245/11 +f 190/246/16 194/245/16 189/247/16 +f 192/248/15 195/249/15 190/246/15 +f 189/247/14 193/244/14 191/250/14 +f 191/251/13 196/252/13 192/248/13 +f 199/253/12 198/254/12 197/255/12 +f 203/256/11 201/257/11 202/258/11 +f 198/254/16 202/259/16 197/260/16 +f 200/261/15 203/256/15 198/254/15 +f 197/262/14 201/263/14 199/264/14 +f 199/264/13 204/265/13 200/261/13 +f 218/266/15 214/267/15 210/268/15 +f 219/269/14 207/270/14 211/271/14 +f 227/272/11 225/273/11 226/274/11 +f 222/275/13 226/274/13 221/276/13 +f 224/277/14 227/278/14 222/275/14 +f 221/276/15 225/273/15 223/279/15 +f 223/280/16 228/281/16 224/277/16 +f 95/117/11 96/120/11 112/118/11 +f 96/120/11 97/123/11 113/121/11 +f 98/122/11 114/125/11 113/121/11 +f 99/124/11 115/127/11 114/125/11 +f 100/126/11 116/129/11 115/127/11 +f 85/128/11 101/131/11 116/129/11 +f 86/130/11 102/133/11 101/131/11 +f 87/132/11 103/135/11 102/133/11 +f 88/134/11 104/137/11 103/135/11 +f 89/136/11 105/282/11 104/137/11 +f 90/138/11 106/142/11 105/139/11 +f 90/138/11 91/143/11 107/141/11 +f 91/143/11 92/145/11 108/144/11 +f 92/145/11 93/147/11 109/146/11 +f 93/147/11 94/149/11 110/148/11 +f 94/149/11 95/117/11 111/119/11 +f 125/150/11 126/188/11 142/151/11 +f 124/153/11 125/150/11 141/154/11 +f 123/156/11 124/153/11 140/157/11 +f 122/159/11 123/156/11 139/160/11 +f 121/162/11 122/159/11 138/163/11 +f 121/165/11 137/283/11 136/166/11 +f 119/168/11 120/167/11 136/169/11 +f 119/168/11 135/284/11 134/171/11 +f 118/172/11 134/285/11 133/173/11 +f 117/174/11 133/286/11 148/175/11 +f 132/176/11 148/287/11 147/177/11 +f 131/178/11 147/288/11 146/179/11 +f 130/180/11 146/289/11 145/181/11 +f 129/182/11 145/290/11 144/183/11 +f 127/185/11 128/184/11 144/186/11 +f 126/188/11 127/185/11 143/189/11 +f 78/191/12 158/291/12 159/192/12 +f 77/194/12 157/292/12 158/195/12 +f 76/196/12 156/293/12 157/197/12 +f 75/198/12 155/294/12 156/199/12 +f 74/200/12 154/295/12 155/201/12 +f 73/202/12 153/296/12 154/203/12 +f 152/204/12 153/297/12 73/205/12 +f 151/207/12 152/298/12 72/206/12 +f 150/209/12 151/299/12 71/208/12 +f 149/211/12 150/300/12 70/210/12 +f 164/213/12 149/301/12 69/212/12 +f 163/215/12 164/302/12 84/214/12 +f 162/217/12 163/303/12 83/216/12 +f 161/219/12 162/304/12 82/218/12 +f 160/221/12 161/305/12 81/220/12 +f 79/193/12 159/306/12 160/223/12 +f 167/224/12 168/232/12 166/225/12 +f 171/227/11 172/236/11 169/228/11 +f 166/225/13 171/227/13 170/230/13 +f 168/232/14 172/236/14 171/227/14 +f 165/233/15 170/307/15 169/234/15 +f 167/235/16 169/234/16 172/236/16 +f 178/239/14 176/308/14 174/309/14 +f 174/309/14 188/310/14 178/239/14 +f 188/310/14 186/237/14 178/239/14 +f 186/237/14 184/311/14 182/238/14 +f 182/238/14 180/312/14 178/239/14 +f 187/240/15 173/313/15 175/241/15 +f 175/241/15 177/314/15 179/242/15 +f 179/242/15 181/315/15 187/240/15 +f 181/315/15 183/316/15 187/240/15 +f 183/316/15 185/317/15 187/240/15 +f 195/243/11 196/318/11 193/244/11 +f 190/246/16 195/249/16 194/245/16 +f 192/248/15 196/252/15 195/249/15 +f 189/247/14 194/245/14 193/244/14 +f 191/251/13 193/319/13 196/252/13 +f 199/253/12 200/261/12 198/254/12 +f 203/256/11 204/265/11 201/257/11 +f 198/254/16 203/256/16 202/259/16 +f 200/261/15 204/265/15 203/256/15 +f 197/262/14 202/320/14 201/263/14 +f 199/264/13 201/263/13 204/265/13 +f 210/268/15 208/321/15 206/322/15 +f 206/322/15 220/323/15 210/268/15 +f 220/323/15 218/266/15 210/268/15 +f 218/266/15 216/324/15 214/267/15 +f 214/267/15 212/325/15 210/268/15 +f 219/269/14 205/326/14 207/270/14 +f 207/270/14 209/327/14 211/271/14 +f 211/271/14 213/328/14 219/269/14 +f 213/328/14 215/329/14 219/269/14 +f 215/329/14 217/330/14 219/269/14 +f 227/272/11 228/331/11 225/273/11 +f 222/275/13 227/278/13 226/274/13 +f 224/277/14 228/281/14 227/278/14 +f 221/276/15 226/274/15 225/273/15 +f 223/280/16 225/332/16 228/281/16 +s 1 +f 81/220/14 96/120/17 80/222/17 +f 74/200/18 89/140/15 73/202/15 +f 82/218/19 97/123/14 81/220/14 +f 75/198/20 90/138/18 74/200/18 +f 83/216/21 98/122/19 82/218/19 +f 76/196/22 91/143/20 75/198/20 +f 84/214/23 99/124/21 83/216/21 +f 77/194/13 92/145/22 76/196/22 +f 70/210/24 85/128/16 69/212/16 +f 69/212/16 100/126/23 84/214/23 +f 78/191/25 93/147/13 77/194/13 +f 71/208/26 86/130/24 70/210/24 +f 79/193/27 94/149/25 78/191/25 +f 72/206/28 87/132/26 71/208/26 +f 80/222/17 95/117/27 79/193/27 +f 73/205/15 88/134/28 72/206/28 +f 102/133/25 117/174/13 101/131/13 +f 101/131/13 132/176/22 116/129/22 +f 110/148/24 125/150/16 109/146/16 +f 103/135/27 118/172/25 102/133/25 +f 111/119/26 126/188/24 110/148/24 +f 104/137/17 119/168/27 103/135/27 +f 112/118/28 127/185/26 111/119/26 +f 105/282/14 120/167/17 104/137/17 +f 113/121/15 128/184/28 112/118/28 +f 106/142/19 121/162/14 105/139/14 +f 114/125/18 129/182/15 113/121/15 +f 107/141/21 122/159/19 106/142/19 +f 115/127/20 130/180/18 114/125/18 +f 108/144/23 123/156/21 107/141/21 +f 116/129/22 131/178/20 115/127/20 +f 109/146/16 124/153/23 108/144/23 +f 144/186/28 159/333/26 143/187/26 +f 137/283/14 152/334/17 136/166/17 +f 145/290/15 160/335/28 144/183/28 +f 138/163/19 153/336/14 137/164/14 +f 146/289/18 161/337/15 145/181/15 +f 139/160/21 154/338/19 138/161/19 +f 147/288/20 162/339/18 146/179/18 +f 140/157/23 155/340/21 139/158/21 +f 148/287/22 163/341/20 147/177/20 +f 141/154/16 156/342/23 140/155/23 +f 134/285/25 149/343/13 133/173/13 +f 133/286/13 164/344/22 148/175/22 +f 142/151/24 157/345/16 141/152/16 +f 135/284/27 150/346/25 134/171/25 +f 143/189/26 158/347/24 142/190/24 +f 136/169/17 151/348/27 135/170/27 +f 174/349/16 175/350/29 173/351/16 +f 176/352/29 177/353/12 175/350/29 +f 178/354/12 179/355/30 177/356/12 +f 180/357/30 181/358/13 179/355/30 +f 182/359/13 183/360/31 181/358/13 +f 184/361/31 185/362/11 183/360/31 +f 186/363/11 187/364/32 185/362/11 +f 188/365/32 173/351/16 187/364/32 +f 206/366/13 207/367/30 205/368/13 +f 207/367/30 210/369/12 209/370/12 +f 210/371/12 211/372/29 209/373/12 +f 212/374/29 213/375/16 211/372/29 +f 214/376/16 215/377/32 213/375/16 +f 216/378/32 217/379/11 215/377/32 +f 218/380/11 219/381/31 217/379/11 +f 220/382/31 205/368/13 219/381/31 +f 81/220/14 97/123/14 96/120/17 +f 74/200/18 90/138/18 89/140/15 +f 82/218/19 98/122/19 97/123/14 +f 75/198/20 91/143/20 90/138/18 +f 83/216/21 99/124/21 98/122/19 +f 76/196/22 92/145/22 91/143/20 +f 84/214/23 100/126/23 99/124/21 +f 77/194/13 93/147/13 92/145/22 +f 70/210/24 86/130/24 85/128/16 +f 69/212/16 85/128/16 100/126/23 +f 78/191/25 94/149/25 93/147/13 +f 71/208/26 87/132/26 86/130/24 +f 79/193/27 95/117/27 94/149/25 +f 72/206/28 88/134/28 87/132/26 +f 80/222/17 96/120/17 95/117/27 +f 73/205/15 89/136/15 88/134/28 +f 102/133/25 118/172/25 117/174/13 +f 101/131/13 117/174/13 132/176/22 +f 110/148/24 126/188/24 125/150/16 +f 103/135/27 119/168/27 118/172/25 +f 111/119/26 127/185/26 126/188/24 +f 104/137/17 120/167/17 119/168/27 +f 112/118/28 128/184/28 127/185/26 +f 105/282/14 121/165/14 120/167/17 +f 113/121/15 129/182/15 128/184/28 +f 106/142/19 122/159/19 121/162/14 +f 114/125/18 130/180/18 129/182/15 +f 107/141/21 123/156/21 122/159/19 +f 115/127/20 131/178/20 130/180/18 +f 108/144/23 124/153/23 123/156/21 +f 116/129/22 132/176/22 131/178/20 +f 109/146/16 125/150/16 124/153/23 +f 144/186/28 160/383/28 159/333/26 +f 137/283/14 153/384/14 152/334/17 +f 145/290/15 161/385/15 160/335/28 +f 138/163/19 154/386/19 153/336/14 +f 146/289/18 162/387/18 161/337/15 +f 139/160/21 155/388/21 154/338/19 +f 147/288/20 163/389/20 162/339/18 +f 140/157/23 156/390/23 155/340/21 +f 148/287/22 164/391/22 163/341/20 +f 141/154/16 157/392/16 156/342/23 +f 134/285/25 150/393/25 149/343/13 +f 133/286/13 149/394/13 164/344/22 +f 142/151/24 158/395/24 157/345/16 +f 135/284/27 151/396/27 150/346/25 +f 143/189/26 159/397/26 158/347/24 +f 136/169/17 152/398/17 151/348/27 +f 174/349/16 176/352/29 175/350/29 +f 176/352/29 178/399/12 177/353/12 +f 178/354/12 180/357/30 179/355/30 +f 180/357/30 182/359/13 181/358/13 +f 182/359/13 184/361/31 183/360/31 +f 184/361/31 186/363/11 185/362/11 +f 186/363/11 188/365/32 187/364/32 +f 188/365/32 174/349/16 173/351/16 +f 206/366/13 208/400/30 207/367/30 +f 207/367/30 208/400/30 210/369/12 +f 210/371/12 212/374/29 211/372/29 +f 212/374/29 214/376/16 213/375/16 +f 214/376/16 216/378/32 215/377/32 +f 216/378/32 218/380/11 217/379/11 +f 218/380/11 220/382/31 219/381/31 +f 220/382/31 206/366/13 205/368/13 +o ArmLower1 +v 0.031250 1.625000 0.875000 +v 0.093750 1.625000 0.875000 +v 0.093750 1.625000 1.000000 +v 0.031250 1.625000 1.000000 +v 0.031250 2.375000 1.000000 +v 0.093750 2.375000 1.000000 +v 0.031250 2.375000 0.875000 +v 0.093750 2.375000 0.875000 +v 0.125000 1.625000 1.062500 +v 0.000000 1.625000 1.062500 +v 0.125000 1.536612 1.025888 +v 0.000000 1.536612 1.025888 +v 0.125000 1.500000 0.937500 +v 0.000000 1.500000 0.937500 +v 0.125000 1.536612 0.849112 +v 0.000000 1.536612 0.849112 +v 0.125000 1.625000 0.812500 +v 0.000000 1.625000 0.812500 +v 0.125000 1.713388 0.849112 +v 0.000000 1.713388 0.849112 +v 0.125000 1.750000 0.937500 +v 0.000000 1.750000 0.937500 +v 0.125000 1.713388 1.025888 +v 0.000000 1.713388 1.025888 +v 0.125000 2.375000 1.062500 +v 0.000000 2.375000 1.062500 +v 0.125000 2.286612 1.025888 +v 0.000000 2.286612 1.025888 +v 0.125000 2.250000 0.937500 +v 0.000000 2.250000 0.937500 +v 0.125000 2.286612 0.849112 +v 0.000000 2.286612 0.849112 +v 0.125000 2.375000 0.812500 +v 0.000000 2.375000 0.812500 +v 0.125000 2.463388 0.849112 +v 0.000000 2.463388 0.849112 +v 0.125000 2.500000 0.937500 +v 0.000000 2.500000 0.937500 +v 0.125000 2.463388 1.025888 +v 0.000000 2.463388 1.025888 +vt 0.763158 0.666667 +vt 0.684211 0.657407 +vt 0.763158 0.657407 +vt 0.763158 0.685185 +vt 0.684211 0.666667 +vt 0.763158 0.638889 +vt 0.684211 0.629630 +vt 0.763158 0.629630 +vt 0.684211 0.638889 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.688096 0.624161 +vt 0.688096 0.598061 +vt 0.706641 0.598061 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.684211 0.685185 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.697369 0.592656 +vt 0.710481 0.611111 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.736842 0.574074 +vt 0.736842 0.592593 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.789474 0.574074 +vt 0.789474 0.574074 +vt 0.723684 0.574074 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 -0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -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 1.0000 -0.0000 +vn 0.0000 0.7071 0.7071 +s off +f 231/401/33 233/402/33 232/403/33 +f 230/404/34 234/405/34 231/401/34 +f 229/406/35 236/407/35 230/408/35 +f 232/403/36 235/409/36 229/406/36 +f 250/410/36 246/411/36 242/412/36 +f 251/413/34 239/414/34 243/415/34 +f 266/416/36 262/417/36 258/418/36 +f 263/419/34 265/420/34 267/421/34 +f 231/401/33 234/405/33 233/402/33 +f 230/404/34 236/422/34 234/405/34 +f 229/406/35 235/409/35 236/407/35 +f 232/403/36 233/402/36 235/409/36 +f 242/412/36 240/423/36 238/424/36 +f 238/424/36 252/425/36 242/412/36 +f 252/425/36 250/410/36 242/412/36 +f 250/410/36 248/426/36 246/411/36 +f 246/411/36 244/427/36 242/412/36 +f 251/413/34 237/428/34 239/414/34 +f 239/414/34 241/429/34 243/415/34 +f 243/415/34 245/430/34 251/413/34 +f 245/430/34 247/431/34 251/413/34 +f 247/431/34 249/432/34 251/413/34 +f 258/418/36 256/433/36 254/434/36 +f 254/434/36 268/435/36 266/416/36 +f 266/416/36 264/436/36 262/417/36 +f 262/417/36 260/437/36 258/418/36 +f 258/418/36 254/434/36 266/416/36 +f 267/421/34 253/438/34 255/439/34 +f 255/439/34 257/440/34 267/421/34 +f 257/440/34 259/441/34 267/421/34 +f 259/441/34 261/442/34 267/421/34 +f 261/442/34 263/419/34 267/421/34 +s 1 +f 238/443/33 239/444/37 237/445/33 +f 240/446/37 241/447/38 239/444/37 +f 242/448/38 243/449/39 241/450/38 +f 244/451/39 245/452/35 243/449/39 +f 246/453/35 247/454/40 245/452/35 +f 248/455/40 249/456/41 247/454/40 +f 250/457/41 251/458/42 249/456/41 +f 252/459/42 237/445/33 251/458/42 +f 254/460/33 255/461/37 253/462/33 +f 256/463/37 257/464/38 255/461/37 +f 258/465/38 259/466/39 257/467/38 +f 260/468/39 261/469/35 259/466/39 +f 262/470/35 263/471/40 261/469/35 +f 263/471/40 266/472/41 265/473/41 +f 266/472/41 267/474/42 265/473/41 +f 268/475/42 253/462/33 267/474/42 +f 238/443/33 240/446/37 239/444/37 +f 240/446/37 242/476/38 241/447/38 +f 242/448/38 244/451/39 243/449/39 +f 244/451/39 246/453/35 245/452/35 +f 246/453/35 248/455/40 247/454/40 +f 248/455/40 250/457/41 249/456/41 +f 250/457/41 252/459/42 251/458/42 +f 252/459/42 238/443/33 237/445/33 +f 254/460/33 256/463/37 255/461/37 +f 256/463/37 258/477/38 257/464/38 +f 258/465/38 260/468/39 259/466/39 +f 260/468/39 262/470/35 261/469/35 +f 262/470/35 264/478/40 263/471/40 +f 263/471/40 264/478/40 266/472/41 +f 266/472/41 268/475/42 267/474/42 +f 268/475/42 254/460/33 253/462/33 +o ArmLower2 +v -0.031250 1.625000 -0.875000 +v -0.093750 1.625000 -0.875000 +v -0.093750 1.625000 -1.000000 +v -0.031250 1.625000 -1.000000 +v -0.031250 2.375000 -1.000000 +v -0.093750 2.375000 -1.000000 +v -0.031250 2.375000 -0.875000 +v -0.093750 2.375000 -0.875000 +v -0.125000 1.625000 -1.062500 +v -0.000000 1.625000 -1.062500 +v -0.125000 1.536612 -1.025888 +v -0.000000 1.536612 -1.025888 +v -0.125000 1.500000 -0.937500 +v -0.000000 1.500000 -0.937500 +v -0.125000 1.536612 -0.849112 +v -0.000000 1.536612 -0.849112 +v -0.125000 1.625000 -0.812500 +v -0.000000 1.625000 -0.812500 +v -0.125000 1.713388 -0.849112 +v -0.000000 1.713388 -0.849112 +v -0.125000 1.750000 -0.937500 +v -0.000000 1.750000 -0.937500 +v -0.125000 1.713388 -1.025888 +v -0.000000 1.713388 -1.025888 +v -0.125000 2.375000 -1.062500 +v -0.000000 2.375000 -1.062500 +v -0.125000 2.286612 -1.025888 +v -0.000000 2.286612 -1.025888 +v -0.125000 2.250000 -0.937500 +v -0.000000 2.250000 -0.937500 +v -0.125000 2.286612 -0.849112 +v -0.000000 2.286612 -0.849112 +v -0.125000 2.375000 -0.812500 +v -0.000000 2.375000 -0.812500 +v -0.125000 2.463388 -0.849112 +v -0.000000 2.463388 -0.849112 +v -0.125000 2.500000 -0.937500 +v -0.000000 2.500000 -0.937500 +v -0.125000 2.463388 -1.025888 +v -0.000000 2.463388 -1.025888 +vt 0.763158 0.666667 +vt 0.684211 0.657407 +vt 0.763158 0.657407 +vt 0.763158 0.685185 +vt 0.684211 0.666667 +vt 0.763158 0.638889 +vt 0.684211 0.629630 +vt 0.763158 0.629630 +vt 0.684211 0.638889 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.688096 0.624161 +vt 0.688096 0.598061 +vt 0.706641 0.598061 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.684211 0.685185 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.697369 0.592656 +vt 0.710481 0.611111 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.789474 0.574074 +vt 0.789474 0.574074 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -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 1.0000 0.0000 +vn 0.0000 0.7071 -0.7071 +s off +f 271/479/43 273/480/43 272/481/43 +f 270/482/44 274/483/44 271/479/44 +f 269/484/45 276/485/45 270/486/45 +f 272/481/46 275/487/46 269/484/46 +f 290/488/46 286/489/46 282/490/46 +f 291/491/44 279/492/44 283/493/44 +f 306/494/46 302/495/46 298/496/46 +f 303/497/44 305/498/44 307/499/44 +f 271/479/43 274/483/43 273/480/43 +f 270/482/44 276/500/44 274/483/44 +f 269/484/45 275/487/45 276/485/45 +f 272/481/46 273/480/46 275/487/46 +f 282/490/46 280/501/46 278/502/46 +f 278/502/46 292/503/46 282/490/46 +f 292/503/46 290/488/46 282/490/46 +f 290/488/46 288/504/46 286/489/46 +f 286/489/46 284/505/46 282/490/46 +f 291/491/44 277/506/44 279/492/44 +f 279/492/44 281/507/44 283/493/44 +f 283/493/44 285/508/44 291/491/44 +f 285/508/44 287/509/44 291/491/44 +f 287/509/44 289/510/44 291/491/44 +f 298/496/46 296/511/46 294/512/46 +f 294/512/46 308/513/46 306/494/46 +f 306/494/46 304/514/46 302/495/46 +f 302/495/46 300/515/46 298/496/46 +f 298/496/46 294/512/46 306/494/46 +f 307/499/44 293/516/44 295/517/44 +f 295/517/44 297/518/44 307/499/44 +f 297/518/44 299/519/44 307/499/44 +f 299/519/44 301/520/44 307/499/44 +f 301/520/44 303/497/44 307/499/44 +s 1 +f 278/521/43 279/522/47 277/523/43 +f 280/524/47 281/525/48 279/522/47 +f 282/526/48 283/527/49 281/528/48 +f 284/529/49 285/530/45 283/527/49 +f 286/531/45 287/532/50 285/530/45 +f 288/533/50 289/534/51 287/532/50 +f 290/535/51 291/536/52 289/534/51 +f 292/537/52 277/523/43 291/536/52 +f 294/538/43 295/539/47 293/540/43 +f 296/541/47 297/542/48 295/539/47 +f 298/543/48 299/544/49 297/545/48 +f 300/546/49 301/547/45 299/544/49 +f 302/548/45 303/549/50 301/547/45 +f 304/550/50 305/551/51 303/549/50 +f 306/552/51 307/553/52 305/551/51 +f 308/554/52 293/540/43 307/553/52 +f 278/521/43 280/524/47 279/522/47 +f 280/524/47 282/555/48 281/525/48 +f 282/526/48 284/529/49 283/527/49 +f 284/529/49 286/531/45 285/530/45 +f 286/531/45 288/533/50 287/532/50 +f 288/533/50 290/535/51 289/534/51 +f 290/535/51 292/537/52 291/536/52 +f 292/537/52 278/521/43 277/523/43 +f 294/538/43 296/541/47 295/539/47 +f 296/541/47 298/556/48 297/542/48 +f 298/543/48 300/546/49 299/544/49 +f 300/546/49 302/548/45 301/547/45 +f 302/548/45 304/550/50 303/549/50 +f 304/550/50 306/552/51 305/551/51 +f 306/552/51 308/554/52 307/553/52 +f 308/554/52 294/538/43 293/540/43 +o ArmUpper2 +v 0.031250 2.312500 -0.937500 +v 0.093750 2.312500 -0.937500 +v 0.031250 2.437500 -0.937500 +v 0.093750 2.437500 -0.937500 +v 0.031250 2.437500 -0.437500 +v 0.031250 2.312500 -0.437500 +v 0.093750 2.312500 -0.437500 +v 0.093750 2.437500 -0.437500 +v -0.000000 2.375000 -1.062500 +v 0.125000 2.375000 -1.062500 +v -0.000000 2.286612 -1.025888 +v 0.125000 2.286612 -1.025888 +v -0.000000 2.250000 -0.937500 +v 0.125000 2.250000 -0.937500 +v -0.000000 2.286612 -0.849112 +v 0.125000 2.286612 -0.849112 +v -0.000000 2.375000 -0.812500 +v 0.125000 2.375000 -0.812500 +v -0.000000 2.463388 -0.849112 +v 0.125000 2.463388 -0.849112 +v -0.000000 2.500000 -0.937500 +v 0.125000 2.500000 -0.937500 +v -0.000000 2.463388 -1.025888 +v 0.125000 2.463388 -1.025888 +v -0.000000 2.375000 -0.562500 +v 0.125000 2.375000 -0.562500 +v -0.000000 2.286612 -0.525888 +v 0.125000 2.286612 -0.525888 +v -0.000000 2.250000 -0.437500 +v 0.125000 2.250000 -0.437500 +v -0.000000 2.286612 -0.349112 +v 0.125000 2.286612 -0.349112 +v -0.000000 2.375000 -0.312500 +v 0.125000 2.375000 -0.312500 +v -0.000000 2.463388 -0.349112 +v 0.125000 2.463388 -0.349112 +v -0.000000 2.500000 -0.437500 +v 0.125000 2.500000 -0.437500 +v -0.000000 2.463388 -0.525888 +v 0.125000 2.463388 -0.525888 +vt 0.815789 0.666667 +vt 0.763158 0.657407 +vt 0.815789 0.657407 +vt 0.815789 0.638889 +vt 0.763158 0.629630 +vt 0.815789 0.629630 +vt 0.763158 0.638889 +vt 0.815789 0.685185 +vt 0.763158 0.666667 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.763158 0.685185 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.789474 0.574074 +vt 0.789474 0.574074 +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.7071 -0.7071 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +s off +f 311/557/53 316/558/53 312/559/53 +f 310/560/54 314/561/54 309/562/54 +f 312/559/55 315/563/55 310/560/55 +f 309/564/56 313/565/56 311/557/56 +f 330/566/55 326/567/55 322/568/55 +f 327/569/56 329/570/56 331/571/56 +f 346/572/55 342/573/55 338/574/55 +f 343/575/56 345/576/56 347/577/56 +f 311/557/53 313/565/53 316/558/53 +f 310/560/54 315/563/54 314/561/54 +f 312/559/55 316/558/55 315/563/55 +f 309/564/56 314/578/56 313/565/56 +f 322/568/55 320/579/55 318/580/55 +f 318/580/55 332/581/55 330/566/55 +f 330/566/55 328/582/55 326/567/55 +f 326/567/55 324/583/55 322/568/55 +f 322/568/55 318/580/55 330/566/55 +f 331/571/56 317/584/56 319/585/56 +f 319/585/56 321/586/56 331/571/56 +f 321/586/56 323/587/56 331/571/56 +f 323/587/56 325/588/56 331/571/56 +f 325/588/56 327/569/56 331/571/56 +f 338/574/55 336/589/55 334/590/55 +f 334/590/55 348/591/55 346/572/55 +f 346/572/55 344/592/55 342/573/55 +f 342/573/55 340/593/55 338/574/55 +f 338/574/55 334/590/55 346/572/55 +f 347/577/56 333/594/56 335/595/56 +f 335/595/56 337/596/56 347/577/56 +f 337/596/56 339/597/56 347/577/56 +f 339/597/56 341/598/56 347/577/56 +f 341/598/56 343/575/56 347/577/56 +s 1 +f 318/599/57 319/600/58 317/601/57 +f 320/602/58 321/603/54 319/600/58 +f 322/604/54 323/605/59 321/606/54 +f 324/607/59 325/608/60 323/605/59 +f 326/609/60 327/610/61 325/608/60 +f 328/611/61 329/612/53 327/610/61 +f 330/613/53 331/614/62 329/612/53 +f 332/615/62 317/601/57 331/614/62 +f 334/616/57 335/617/58 333/618/57 +f 336/619/58 337/620/54 335/617/58 +f 338/621/54 339/622/59 337/623/54 +f 340/624/59 341/625/60 339/622/59 +f 342/626/60 343/627/61 341/625/60 +f 344/628/61 345/629/53 343/627/61 +f 346/630/53 347/631/62 345/629/53 +f 348/632/62 333/618/57 347/631/62 +f 318/599/57 320/602/58 319/600/58 +f 320/602/58 322/633/54 321/603/54 +f 322/604/54 324/607/59 323/605/59 +f 324/607/59 326/609/60 325/608/60 +f 326/609/60 328/611/61 327/610/61 +f 328/611/61 330/613/53 329/612/53 +f 330/613/53 332/615/62 331/614/62 +f 332/615/62 318/599/57 317/601/57 +f 334/616/57 336/619/58 335/617/58 +f 336/619/58 338/634/54 337/620/54 +f 338/621/54 340/624/59 339/622/59 +f 340/624/59 342/626/60 341/625/60 +f 342/626/60 344/628/61 343/627/61 +f 344/628/61 346/630/53 345/629/53 +f 346/630/53 348/632/62 347/631/62 +f 348/632/62 334/616/57 333/618/57 +o ArmUpper1 +v -0.031250 2.312500 0.937500 +v -0.093750 2.312500 0.937500 +v -0.031250 2.437500 0.937500 +v -0.093750 2.437500 0.937500 +v -0.031250 2.437500 0.437500 +v -0.031250 2.312500 0.437500 +v -0.093750 2.312500 0.437500 +v -0.093750 2.437500 0.437500 +v 0.000000 2.375000 1.062500 +v -0.125000 2.375000 1.062500 +v 0.000000 2.286612 1.025888 +v -0.125000 2.286612 1.025888 +v 0.000000 2.250000 0.937500 +v -0.125000 2.250000 0.937500 +v 0.000000 2.286612 0.849112 +v -0.125000 2.286612 0.849112 +v 0.000000 2.375000 0.812500 +v -0.125000 2.375000 0.812500 +v 0.000000 2.463388 0.849112 +v -0.125000 2.463388 0.849112 +v 0.000000 2.500000 0.937500 +v -0.125000 2.500000 0.937500 +v 0.000000 2.463388 1.025888 +v -0.125000 2.463388 1.025888 +v 0.000000 2.375000 0.562500 +v -0.125000 2.375000 0.562500 +v 0.000000 2.286612 0.525888 +v -0.125000 2.286612 0.525888 +v 0.000000 2.250000 0.437500 +v -0.125000 2.250000 0.437500 +v 0.000000 2.286612 0.349112 +v -0.125000 2.286612 0.349112 +v 0.000000 2.375000 0.312500 +v -0.125000 2.375000 0.312500 +v 0.000000 2.463388 0.349112 +v -0.125000 2.463388 0.349112 +v 0.000000 2.500000 0.437500 +v -0.125000 2.500000 0.437500 +v 0.000000 2.463388 0.525888 +v -0.125000 2.463388 0.525888 +vt 0.815789 0.666667 +vt 0.763158 0.657407 +vt 0.815789 0.657407 +vt 0.815789 0.638889 +vt 0.763158 0.629630 +vt 0.815789 0.629630 +vt 0.763158 0.638889 +vt 0.815789 0.685185 +vt 0.763158 0.666667 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.763158 0.685185 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.789474 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.710526 0.574074 +vt 0.710526 0.592593 +vt 0.723684 0.592593 +vt 0.736842 0.574074 +vt 0.736842 0.592593 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.776316 0.574074 +vt 0.789474 0.574074 +vt 0.697368 0.574074 +vt 0.723684 0.574074 +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.7071 0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 0.7071 0.7071 +s off +f 351/635/63 356/636/63 352/637/63 +f 350/638/64 354/639/64 349/640/64 +f 352/637/65 355/641/65 350/638/65 +f 349/642/66 353/643/66 351/635/66 +f 370/644/65 366/645/65 362/646/65 +f 367/647/66 369/648/66 371/649/66 +f 386/650/65 382/651/65 378/652/65 +f 383/653/66 385/654/66 387/655/66 +f 351/635/63 353/643/63 356/636/63 +f 350/638/64 355/641/64 354/639/64 +f 352/637/65 356/636/65 355/641/65 +f 349/642/66 354/656/66 353/643/66 +f 362/646/65 360/657/65 358/658/65 +f 358/658/65 372/659/65 370/644/65 +f 370/644/65 368/660/65 366/645/65 +f 366/645/65 364/661/65 362/646/65 +f 362/646/65 358/658/65 370/644/65 +f 371/649/66 357/662/66 359/663/66 +f 359/663/66 361/664/66 371/649/66 +f 361/664/66 363/665/66 371/649/66 +f 363/665/66 365/666/66 371/649/66 +f 365/666/66 367/647/66 371/649/66 +f 378/652/65 376/667/65 374/668/65 +f 374/668/65 388/669/65 386/650/65 +f 386/650/65 384/670/65 382/651/65 +f 382/651/65 380/671/65 378/652/65 +f 378/652/65 374/668/65 386/650/65 +f 387/655/66 373/672/66 375/673/66 +f 375/673/66 377/674/66 387/655/66 +f 377/674/66 379/675/66 387/655/66 +f 379/675/66 381/676/66 387/655/66 +f 381/676/66 383/653/66 387/655/66 +s 1 +f 358/677/67 359/678/68 357/679/67 +f 359/678/68 362/680/64 361/681/64 +f 362/682/64 363/683/69 361/684/64 +f 364/685/69 365/686/70 363/683/69 +f 366/687/70 367/688/71 365/686/70 +f 368/689/71 369/690/63 367/688/71 +f 370/691/63 371/692/72 369/690/63 +f 372/693/72 357/679/67 371/692/72 +f 374/694/67 375/695/68 373/696/67 +f 376/697/68 377/698/64 375/695/68 +f 378/699/64 379/700/69 377/701/64 +f 379/700/69 382/702/70 381/703/70 +f 382/702/70 383/704/71 381/703/70 +f 383/704/71 386/705/63 385/706/63 +f 386/705/63 387/707/72 385/706/63 +f 388/708/72 373/696/67 387/707/72 +f 358/677/67 360/709/68 359/678/68 +f 359/678/68 360/709/68 362/680/64 +f 362/682/64 364/685/69 363/683/69 +f 364/685/69 366/687/70 365/686/70 +f 366/687/70 368/689/71 367/688/71 +f 368/689/71 370/691/63 369/690/63 +f 370/691/63 372/693/72 371/692/72 +f 372/693/72 358/677/67 357/679/67 +f 374/694/67 376/697/68 375/695/68 +f 376/697/68 378/710/64 377/698/64 +f 378/699/64 380/711/69 379/700/69 +f 379/700/69 380/711/69 382/702/70 +f 382/702/70 384/712/71 383/704/71 +f 383/704/71 384/712/71 386/705/63 +f 386/705/63 388/708/72 387/707/72 +f 388/708/72 374/694/67 373/696/67 +o Head1 +v 0.125000 2.750000 -0.000000 +v -0.125000 2.750000 0.000000 +v 0.125000 2.750000 0.250000 +v -0.125000 2.750000 0.250000 +v 0.125000 1.750000 0.250000 +v 0.125000 1.750000 -0.000000 +v -0.125000 1.750000 0.000000 +v -0.125000 1.750000 0.250000 +v 0.062500 2.500000 0.250000 +v -0.062500 2.500000 0.250000 +v 0.062500 2.500000 0.437500 +v -0.062500 2.500000 0.437500 +v 0.062500 2.250000 0.437500 +v -0.062500 2.250000 0.437500 +v 0.062500 2.250000 0.250000 +v -0.062500 2.250000 0.250000 +v -0.250000 2.625000 0.093750 +v -0.250000 1.875000 0.093750 +v -0.250000 2.625000 0.156250 +v -0.250000 1.875000 0.156250 +v -0.125000 2.625000 0.093750 +v -0.125000 1.875000 0.093750 +v -0.125000 2.625000 0.156250 +v -0.125000 1.875000 0.156250 +v -0.187500 2.562500 0.093750 +v -0.187500 1.937500 0.093750 +v -0.187500 2.562500 0.156250 +v -0.187500 1.937500 0.156250 +v -0.125000 2.562500 0.093750 +v -0.125000 1.937500 0.093750 +v -0.125000 2.562500 0.156250 +v -0.125000 1.937500 0.156250 +v 0.250001 2.625000 0.156250 +v 0.250001 1.875000 0.156250 +v 0.250001 2.625000 0.093750 +v 0.250001 1.875000 0.093750 +v 0.125001 2.625000 0.156250 +v 0.125001 1.875000 0.156250 +v 0.125001 2.625000 0.093750 +v 0.125001 1.875000 0.093750 +v 0.187501 2.562500 0.156250 +v 0.187501 1.937500 0.156250 +v 0.187501 2.562500 0.093750 +v 0.187501 1.937500 0.093750 +v 0.125001 2.562500 0.156250 +v 0.125001 1.937500 0.156250 +v 0.125001 2.562500 0.093750 +v 0.125001 1.937500 0.093750 +v 0.125000 2.375000 0.562500 +v 0.000000 2.375000 0.562500 +v 0.125000 2.286612 0.525888 +v 0.000000 2.286612 0.525888 +v 0.125000 2.250000 0.437500 +v 0.000000 2.250000 0.437500 +v 0.125000 2.286612 0.349112 +v 0.000000 2.286612 0.349112 +v 0.125000 2.375000 0.312500 +v 0.000000 2.375000 0.312500 +v 0.125000 2.463388 0.349112 +v 0.000000 2.463388 0.349112 +v 0.125000 2.500000 0.437500 +v 0.000000 2.500000 0.437500 +v 0.125000 2.463388 0.525888 +v 0.000000 2.463388 0.525888 +v 0.130000 1.875000 0.234375 +v 0.130000 1.875000 0.171875 +v 0.130000 2.062500 0.234375 +v 0.130000 2.062500 0.171875 +vt 0.750000 0.907407 +vt 0.723684 0.870370 +vt 0.750000 0.870370 +vt 0.750000 0.685185 +vt 0.723684 0.722222 +vt 0.723684 0.685185 +vt 0.802632 0.870370 +vt 0.828947 0.722222 +vt 0.828947 0.870370 +vt 0.776316 0.722222 +vt 0.776316 0.870370 +vt 0.750000 0.722222 +vt 0.802632 0.722222 +vt 0.875000 0.574074 +vt 0.861842 0.601852 +vt 0.861842 0.574074 +vt 0.875000 0.601852 +vt 0.901316 0.620370 +vt 0.875000 0.620370 +vt 0.901316 0.601852 +vt 0.914474 0.574074 +vt 0.914474 0.601852 +vt 0.901316 0.574074 +vt 0.940789 0.574074 +vt 0.940789 0.601852 +vt 0.703947 0.703704 +vt 0.710526 0.814815 +vt 0.703947 0.814815 +vt 0.710526 0.685185 +vt 0.710526 0.703704 +vt 0.703947 0.833333 +vt 0.723684 0.805556 +vt 0.717105 0.712963 +vt 0.723684 0.712963 +vt 0.717105 0.694444 +vt 0.723684 0.685185 +vt 0.723684 0.694444 +vt 0.723684 0.833333 +vt 0.717105 0.824074 +vt 0.723684 0.824074 +vt 0.697368 0.824074 +vt 0.710526 0.833333 +vt 0.717105 0.833333 +vt 0.717105 0.805556 +vt 0.697368 0.712963 +vt 0.703947 0.685185 +vt 0.697368 0.694444 +vt 0.697368 0.685185 +vt 0.703947 0.703704 +vt 0.710526 0.814815 +vt 0.703947 0.814815 +vt 0.710526 0.685185 +vt 0.710526 0.703704 +vt 0.710526 0.833333 +vt 0.703947 0.833333 +vt 0.723684 0.805556 +vt 0.717105 0.712963 +vt 0.723684 0.712963 +vt 0.717105 0.685185 +vt 0.723684 0.694444 +vt 0.717105 0.694444 +vt 0.723684 0.833333 +vt 0.717105 0.824074 +vt 0.723684 0.824074 +vt 0.697368 0.824074 +vt 0.717105 0.833333 +vt 0.717105 0.805556 +vt 0.697368 0.712963 +vt 0.703947 0.685185 +vt 0.697368 0.694444 +vt 0.697368 0.685185 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.559211 1.000000 +vt 0.460526 0.953704 +vt 0.559211 0.953704 +vt 0.723684 0.907407 +vt 0.717105 0.685185 +vt 0.697368 0.833333 +vt 0.697368 0.805556 +vt 0.723684 0.685185 +vt 0.697368 0.833333 +vt 0.697368 0.805556 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.460526 1.000000 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.789474 0.574074 +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 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 0.7071 0.7071 +s off +f 389/713/73 392/714/73 391/715/73 +f 394/716/74 396/717/74 395/718/74 +f 390/719/75 396/720/75 392/721/75 +f 391/715/76 394/722/76 389/723/76 +f 392/714/77 393/724/77 391/715/77 +f 389/723/78 395/725/78 390/719/78 +f 398/726/73 399/727/73 397/728/73 +f 400/729/77 401/730/77 399/731/77 +f 402/732/74 403/733/74 401/734/74 +f 404/735/75 400/729/75 398/726/75 +f 401/734/76 397/736/76 399/737/76 +f 406/738/75 407/739/75 405/740/75 +f 406/738/74 412/741/74 408/742/74 +f 407/739/73 409/743/73 405/740/73 +f 413/744/76 416/745/76 414/746/76 +f 416/747/73 418/748/73 414/749/73 +f 417/750/74 415/751/74 413/752/74 +f 409/743/78 413/753/78 405/740/78 +f 411/754/77 415/751/77 419/755/77 +f 408/742/77 415/756/77 407/739/77 +f 412/741/77 416/747/77 408/742/77 +f 405/740/78 414/757/78 406/738/78 +f 410/758/78 414/759/78 418/760/78 +f 422/761/76 423/762/76 421/763/76 +f 422/761/74 428/764/74 424/765/74 +f 421/763/73 427/766/73 425/767/73 +f 429/768/75 432/769/75 430/770/75 +f 436/771/73 430/772/73 432/773/73 +f 433/774/74 431/775/74 429/776/74 +f 425/767/77 429/777/77 421/763/77 +f 427/766/78 431/775/78 435/778/78 +f 424/765/78 431/779/78 423/762/78 +f 428/764/78 432/773/78 424/765/78 +f 421/763/77 430/780/77 422/761/77 +f 426/781/77 430/782/77 434/783/77 +f 450/784/75 446/785/75 442/786/75 +f 447/787/76 449/788/76 451/789/76 +f 454/790/76 455/791/76 453/792/76 +f 389/713/73 390/793/73 392/714/73 +f 394/716/74 393/724/74 396/717/74 +f 390/719/75 395/725/75 396/720/75 +f 391/715/76 393/724/76 394/722/76 +f 392/714/77 396/717/77 393/724/77 +f 389/723/78 394/722/78 395/725/78 +f 398/726/73 400/729/73 399/727/73 +f 400/729/77 402/732/77 401/730/77 +f 402/732/74 404/735/74 403/733/74 +f 404/735/75 402/732/75 400/729/75 +f 401/734/76 403/733/76 397/736/76 +f 406/738/75 408/742/75 407/739/75 +f 406/738/74 410/758/74 412/741/74 +f 407/739/73 411/754/73 409/743/73 +f 413/744/76 415/756/76 416/745/76 +f 416/747/73 420/794/73 418/748/73 +f 417/750/74 419/755/74 415/751/74 +f 409/743/78 417/795/78 413/753/78 +f 411/754/77 407/739/77 415/751/77 +f 408/742/77 416/745/77 415/756/77 +f 412/741/77 420/794/77 416/747/77 +f 405/740/78 413/796/78 414/757/78 +f 410/758/78 406/738/78 414/759/78 +f 422/761/76 424/765/76 423/762/76 +f 422/761/74 426/781/74 428/764/74 +f 421/763/73 423/762/73 427/766/73 +f 429/768/75 431/779/75 432/769/75 +f 436/771/73 434/797/73 430/772/73 +f 433/774/74 435/778/74 431/775/74 +f 425/767/77 433/798/77 429/777/77 +f 427/766/78 423/762/78 431/775/78 +f 424/765/78 432/769/78 431/779/78 +f 428/764/78 436/771/78 432/773/78 +f 421/763/77 429/799/77 430/780/77 +f 426/781/77 422/761/77 430/782/77 +f 442/786/75 440/800/75 438/801/75 +f 438/801/75 452/802/75 450/784/75 +f 450/784/75 448/803/75 446/785/75 +f 446/785/75 444/804/75 442/786/75 +f 442/786/75 438/801/75 450/784/75 +f 451/789/76 437/805/76 439/806/76 +f 439/806/76 441/807/76 451/789/76 +f 441/807/76 443/808/76 451/789/76 +f 443/808/76 445/809/76 451/789/76 +f 445/809/76 447/787/76 451/789/76 +f 454/790/76 456/810/76 455/791/76 +s 1 +f 438/811/77 439/812/79 437/813/77 +f 440/814/79 441/815/74 439/812/79 +f 442/816/74 443/817/80 441/818/74 +f 444/819/80 445/820/78 443/817/80 +f 446/821/78 447/822/81 445/820/78 +f 448/823/81 449/824/73 447/822/81 +f 450/825/73 451/826/82 449/824/73 +f 452/827/82 437/813/77 451/826/82 +f 438/811/77 440/814/79 439/812/79 +f 440/814/79 442/828/74 441/815/74 +f 442/816/74 444/819/80 443/817/80 +f 444/819/80 446/821/78 445/820/78 +f 446/821/78 448/823/81 447/822/81 +f 448/823/81 450/825/73 449/824/73 +f 450/825/73 452/827/82 451/826/82 +f 452/827/82 438/811/77 437/813/77 +o Spike2 +v -0.062500 2.875000 -0.062500 +v 0.062500 2.875000 -0.062500 +v -0.062500 2.875000 -0.187500 +v 0.062500 2.875000 -0.187500 +v -0.062500 1.625000 -0.187500 +v -0.062500 1.625000 -0.062500 +v 0.062500 1.625000 -0.062500 +v 0.062500 1.625000 -0.187500 +v 0.000000 1.375000 -0.125000 +vt 0.828947 0.888889 +vt 0.842105 0.870370 +vt 0.842105 0.888889 +vt 0.868421 0.870370 +vt 0.881579 0.685185 +vt 0.881579 0.870370 +vt 0.855263 0.685185 +vt 0.855263 0.870370 +vt 0.828947 0.870370 +vt 0.842105 0.685185 +vt 0.868421 0.685185 +vt 0.848684 0.648148 +vt 0.828947 0.685185 +vt 0.835526 0.648148 +vt 0.875000 0.648148 +vt 0.861842 0.648148 +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.9701 -0.2425 0.0000 +vn 0.0000 -0.2425 -0.9701 +vn 0.9701 -0.2425 0.0000 +vn 0.0000 -0.2425 0.9701 +s off +f 458/829/83 459/830/83 457/831/83 +f 458/832/84 464/833/84 460/834/84 +f 459/830/85 462/835/85 457/836/85 +f 460/837/86 461/838/86 459/830/86 +f 457/836/87 463/839/87 458/832/87 +f 462/835/88 461/838/88 465/840/88 +f 461/838/89 464/841/89 465/842/89 +f 464/833/90 463/839/90 465/843/90 +f 463/839/91 462/835/91 465/844/91 +f 458/829/83 460/837/83 459/830/83 +f 458/832/84 463/839/84 464/833/84 +f 459/830/85 461/838/85 462/835/85 +f 460/837/86 464/841/86 461/838/86 +f 457/836/87 462/835/87 463/839/87 +o Spike1 +v 0.062500 2.875000 0.062500 +v -0.062500 2.875000 0.062500 +v 0.062500 2.875000 0.187500 +v -0.062500 2.875000 0.187500 +v 0.062500 1.625000 0.187500 +v 0.062500 1.625000 0.062500 +v -0.062500 1.625000 0.062500 +v -0.062500 1.625000 0.187500 +v 0.000000 1.375000 0.125000 +vt 0.842105 0.888889 +vt 0.828947 0.870370 +vt 0.842105 0.870370 +vt 0.868421 0.870370 +vt 0.881579 0.685185 +vt 0.881579 0.870370 +vt 0.855263 0.685185 +vt 0.855263 0.870370 +vt 0.842105 0.685185 +vt 0.868421 0.685185 +vt 0.848684 0.648148 +vt 0.828947 0.685185 +vt 0.835526 0.648148 +vt 0.875000 0.648148 +vt 0.861842 0.648148 +vt 0.828947 0.888889 +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.9701 -0.2425 0.0000 +vn 0.0000 -0.2425 0.9701 +vn -0.9701 -0.2425 0.0000 +vn 0.0000 -0.2425 -0.9701 +s off +f 466/845/92 469/846/92 468/847/92 +f 467/848/93 473/849/93 469/850/93 +f 468/847/94 471/851/94 466/852/94 +f 469/846/95 470/853/95 468/847/95 +f 466/852/96 472/854/96 467/848/96 +f 471/851/97 470/853/97 474/855/97 +f 470/853/98 473/856/98 474/857/98 +f 473/849/99 472/854/99 474/858/99 +f 472/854/100 471/851/100 474/859/100 +f 466/845/92 467/860/92 469/846/92 +f 467/848/93 472/854/93 473/849/93 +f 468/847/94 470/853/94 471/851/94 +f 469/846/95 473/856/95 470/853/95 +f 466/852/96 471/851/96 472/854/96 +o Frame +v 1.250000 2.750000 -1.250000 +v 1.250000 3.000000 -1.250000 +v 1.250000 2.750000 -1.500000 +v 1.250000 3.000000 -1.500000 +v 1.500000 2.750000 -1.250000 +v 1.500000 3.000000 -1.250000 +v 1.500000 2.750000 -1.500000 +v 1.500000 3.000000 -1.500000 +v -1.500000 2.750000 -1.250000 +v -1.500000 3.000000 -1.250000 +v -1.500000 2.750000 -1.500000 +v -1.500000 3.000000 -1.500000 +v -1.250000 2.750000 -1.250000 +v -1.250000 3.000000 -1.250000 +v -1.250000 2.750000 -1.500000 +v -1.250000 3.000000 -1.500000 +v 1.250000 2.750000 1.500000 +v 1.250000 3.000000 1.500000 +v 1.250000 2.750000 1.250000 +v 1.250000 3.000000 1.250000 +v 1.500000 2.750000 1.500000 +v 1.500000 3.000000 1.500000 +v 1.500000 2.750000 1.250000 +v 1.500000 3.000000 1.250000 +v -1.500000 2.750000 1.500000 +v -1.500000 3.000000 1.500000 +v -1.500000 2.750000 1.250000 +v -1.500000 3.000000 1.250000 +v -1.250000 2.750000 1.500000 +v -1.250000 3.000000 1.500000 +v -1.250000 2.750000 1.250000 +v -1.250000 3.000000 1.250000 +v 1.500000 3.000000 -1.250000 +v 1.500000 3.000000 1.250000 +v 1.500000 2.875000 1.250000 +v 1.500000 2.875000 -1.250000 +v 1.375000 3.000000 -1.250000 +v 1.375000 3.000000 1.250000 +v 1.375000 2.875000 1.250000 +v 1.375000 2.875000 -1.250000 +v -1.375000 3.000000 -1.250000 +v -1.375000 3.000000 1.250000 +v -1.375000 2.875000 1.250000 +v -1.375000 2.875000 -1.250000 +v -1.500000 3.000000 -1.250000 +v -1.500000 3.000000 1.250000 +v -1.500000 2.875000 1.250000 +v -1.500000 2.875000 -1.250000 +v -1.250000 3.000000 -1.500000 +v 1.250000 3.000000 -1.500000 +v 1.250000 2.875000 -1.500000 +v -1.250000 2.875000 -1.500000 +v -1.250000 3.000000 -1.375000 +v 1.250000 3.000000 -1.375000 +v 1.250000 2.875000 -1.375000 +v -1.250000 2.875000 -1.375000 +v -1.250000 3.000000 1.375000 +v 1.250000 3.000000 1.375000 +v 1.250000 2.875000 1.375000 +v -1.250000 2.875000 1.375000 +v -1.250000 3.000000 1.500000 +v 1.250000 3.000000 1.500000 +v 1.250000 2.875000 1.500000 +v -1.250000 2.875000 1.500000 +v -1.375000 2.750000 -1.500000 +v -1.375000 0.250000 -1.500000 +v -1.500000 0.250000 -1.500000 +v -1.500000 2.750000 -1.500000 +v -1.375000 2.750000 -1.375000 +v -1.375000 0.250000 -1.375000 +v -1.500000 0.250000 -1.375000 +v -1.500000 2.750000 -1.375000 +v -1.375000 2.750000 1.375000 +v -1.375000 0.250000 1.375000 +v -1.500000 0.250000 1.375000 +v -1.500000 2.750000 1.375000 +v -1.375000 2.750000 1.500000 +v -1.375000 0.250000 1.500000 +v -1.500000 0.250000 1.500000 +v -1.500000 2.750000 1.500000 +v 1.500000 2.750000 -1.500000 +v 1.500000 0.250000 -1.500000 +v 1.375000 0.250000 -1.500000 +v 1.375000 2.750000 -1.500000 +v 1.500000 2.750000 -1.375000 +v 1.500000 0.250000 -1.375000 +v 1.375000 0.250000 -1.375000 +v 1.375000 2.750000 -1.375000 +v 1.500000 2.750000 1.375000 +v 1.500000 0.250000 1.375000 +v 1.375000 0.250000 1.375000 +v 1.375000 2.750000 1.375000 +v 1.500000 2.750000 1.500000 +v 1.500000 0.250000 1.500000 +v 1.375000 0.250000 1.500000 +v 1.375000 2.750000 1.500000 +vt 0.421053 0.962963 +vt 0.394737 0.925926 +vt 0.421053 0.925926 +vt 0.394737 0.962963 +vt 0.368421 0.925926 +vt 0.368421 0.962963 +vt 0.342105 0.925926 +vt 0.447368 0.962963 +vt 0.447368 0.925926 +vt 0.342105 0.888889 +vt 0.368421 0.888889 +vt 0.368421 1.000000 +vt 0.342105 0.962963 +vt 0.421053 0.962963 +vt 0.394737 0.925926 +vt 0.421053 0.925926 +vt 0.394737 0.962963 +vt 0.368421 0.925926 +vt 0.368421 0.962963 +vt 0.342105 0.925926 +vt 0.447368 0.962963 +vt 0.447368 0.925926 +vt 0.342105 0.888889 +vt 0.368421 0.888889 +vt 0.368421 1.000000 +vt 0.342105 0.962963 +vt 0.421053 0.962963 +vt 0.394737 0.925926 +vt 0.421053 0.925926 +vt 0.394737 0.962963 +vt 0.368421 0.925926 +vt 0.368421 0.962963 +vt 0.342105 0.925926 +vt 0.447368 0.962963 +vt 0.447368 0.925926 +vt 0.342105 0.888889 +vt 0.368421 0.888889 +vt 0.368421 1.000000 +vt 0.342105 0.962963 +vt 0.421053 0.962963 +vt 0.394737 0.925926 +vt 0.421053 0.925926 +vt 0.394737 0.962963 +vt 0.368421 0.925926 +vt 0.368421 0.962963 +vt 0.342105 0.925926 +vt 0.447368 0.962963 +vt 0.447368 0.925926 +vt 0.342105 0.888889 +vt 0.368421 0.888889 +vt 0.368421 1.000000 +vt 0.342105 0.962963 +vt 0.473684 0.833333 +vt 0.210526 0.851852 +vt 0.210526 0.833333 +vt 0.473684 0.814815 +vt 0.473684 0.851852 +vt 0.210526 0.870370 +vt 0.473684 0.888889 +vt 0.473684 0.870370 +vt 0.210526 0.888889 +vt 0.473684 0.870370 +vt 0.473684 0.888889 +vt 0.473684 0.814815 +vt 0.210526 0.833333 +vt 0.210526 0.814815 +vt 0.210526 0.870370 +vt 0.473684 0.851852 +vt 0.210526 0.851852 +vt 0.473684 0.833333 +vt 0.210526 0.851852 +vt 0.210526 0.833333 +vt 0.473684 0.814815 +vt 0.473684 0.851852 +vt 0.210526 0.870370 +vt 0.473684 0.888889 +vt 0.473684 0.870370 +vt 0.210526 0.888889 +vt 0.473684 0.870370 +vt 0.473684 0.888889 +vt 0.473684 0.814815 +vt 0.210526 0.833333 +vt 0.210526 0.814815 +vt 0.210526 0.870370 +vt 0.473684 0.851852 +vt 0.210526 0.851852 +vt 0.210526 0.851852 +vt 0.473684 0.833333 +vt 0.473684 0.851852 +vt 0.210526 0.870370 +vt 0.210526 0.833333 +vt 0.473684 0.814815 +vt 0.473684 0.888889 +vt 0.210526 0.888889 +vt 0.210526 0.833333 +vt 0.473684 0.814815 +vt 0.473684 0.833333 +vt 0.210526 0.851852 +vt 0.210526 0.888889 +vt 0.473684 0.870370 +vt 0.473684 0.888889 +vt 0.210526 0.870370 +vt 0.210526 0.870370 +vt 0.473684 0.851852 +vt 0.473684 0.870370 +vt 0.210526 0.888889 +vt 0.210526 0.851852 +vt 0.473684 0.833333 +vt 0.210526 0.814815 +vt 0.210526 0.833333 +vt 0.210526 0.888889 +vt 0.473684 0.870370 +vt 0.473684 0.888889 +vt 0.473684 0.814815 +vt 0.210526 0.833333 +vt 0.210526 0.814815 +vt 0.210526 0.870370 +vt 0.473684 0.851852 +vt 0.210526 0.851852 +vt 0.342105 1.000000 +vt 0.342105 1.000000 +vt 0.342105 1.000000 +vt 0.342105 1.000000 +vt 0.210526 0.814815 +vt 0.210526 0.888889 +vt 0.473684 0.833333 +vt 0.210526 0.814815 +vt 0.210526 0.888889 +vt 0.473684 0.833333 +vt 0.473684 0.870370 +vt 0.210526 0.814815 +vt 0.210526 0.814815 +vt 0.473684 0.851852 +vt 0.473684 0.888889 +vt 0.473684 0.814815 +vt 0.473684 0.833333 +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 1.0000 0.0000 +s off +f 476/861/101 477/862/101 475/863/101 +f 478/864/102 481/865/102 477/862/102 +f 482/866/103 479/867/103 481/865/103 +f 480/868/104 475/863/104 479/869/104 +f 481/865/105 475/870/105 477/871/105 +f 478/872/106 480/873/106 482/866/106 +f 484/874/101 485/875/101 483/876/101 +f 486/877/102 489/878/102 485/875/102 +f 490/879/103 487/880/103 489/878/103 +f 488/881/104 483/876/104 487/882/104 +f 489/878/105 483/883/105 485/884/105 +f 486/885/106 488/886/106 490/879/106 +f 492/887/101 493/888/101 491/889/101 +f 494/890/102 497/891/102 493/888/102 +f 498/892/103 495/893/103 497/891/103 +f 496/894/104 491/889/104 495/895/104 +f 497/891/105 491/896/105 493/897/105 +f 494/898/106 496/899/106 498/892/106 +f 500/900/101 501/901/101 499/902/101 +f 502/903/102 505/904/102 501/901/102 +f 506/905/103 503/906/103 505/904/103 +f 504/907/104 499/902/104 503/908/104 +f 505/904/105 499/909/105 501/910/105 +f 502/911/106 504/912/106 506/905/106 +f 510/913/103 508/914/103 509/915/103 +f 509/915/105 514/916/105 510/913/105 +f 507/917/106 512/918/106 508/914/106 +f 514/919/101 512/918/101 511/920/101 +f 518/921/103 516/922/103 517/923/103 +f 517/924/105 522/925/105 518/926/105 +f 515/927/106 520/928/106 516/922/106 +f 522/925/101 520/928/101 519/929/101 +f 526/930/102 524/931/102 525/932/102 +f 525/932/105 530/933/105 526/930/105 +f 523/934/106 528/935/106 524/931/106 +f 530/936/104 528/935/104 527/937/104 +f 534/938/102 532/939/102 533/940/102 +f 533/941/105 538/942/105 534/943/105 +f 531/944/106 536/945/106 532/939/106 +f 538/942/104 536/945/104 535/946/104 +f 542/947/102 540/948/102 541/949/102 +f 541/949/101 546/950/101 542/947/101 +f 539/951/103 544/952/103 540/948/103 +f 546/950/104 544/953/104 543/954/104 +f 550/955/102 548/956/102 549/957/102 +f 549/957/101 554/958/101 550/955/101 +f 547/959/103 552/960/103 548/961/103 +f 554/958/104 552/960/104 551/962/104 +f 558/963/102 556/964/102 557/965/102 +f 557/965/101 562/966/101 558/963/101 +f 555/967/103 560/968/103 556/964/103 +f 562/969/104 560/968/104 559/970/104 +f 566/971/102 564/972/102 565/973/102 +f 565/974/101 570/975/101 566/976/101 +f 563/977/103 568/978/103 564/972/103 +f 570/975/104 568/978/104 567/979/104 +f 476/861/101 478/864/101 477/862/101 +f 478/864/102 482/866/102 481/865/102 +f 482/866/103 480/873/103 479/867/103 +f 480/868/104 476/861/104 475/863/104 +f 481/865/105 479/867/105 475/870/105 +f 478/872/106 476/980/106 480/873/106 +f 484/874/101 486/877/101 485/875/101 +f 486/877/102 490/879/102 489/878/102 +f 490/879/103 488/886/103 487/880/103 +f 488/881/104 484/874/104 483/876/104 +f 489/878/105 487/880/105 483/883/105 +f 486/885/106 484/981/106 488/886/106 +f 492/887/101 494/890/101 493/888/101 +f 494/890/102 498/892/102 497/891/102 +f 498/892/103 496/899/103 495/893/103 +f 496/894/104 492/887/104 491/889/104 +f 497/891/105 495/893/105 491/896/105 +f 494/898/106 492/982/106 496/899/106 +f 500/900/101 502/903/101 501/901/101 +f 502/903/102 506/905/102 505/904/102 +f 506/905/103 504/912/103 503/906/103 +f 504/907/104 500/900/104 499/902/104 +f 505/904/105 503/906/105 499/909/105 +f 502/911/106 500/983/106 504/912/106 +f 510/913/103 507/917/103 508/914/103 +f 509/915/105 513/984/105 514/916/105 +f 507/917/106 511/920/106 512/918/106 +f 514/919/101 513/985/101 512/918/101 +f 518/921/103 515/927/103 516/922/103 +f 517/924/105 521/986/105 522/925/105 +f 515/927/106 519/929/106 520/928/106 +f 522/925/101 521/986/101 520/928/101 +f 526/930/102 523/934/102 524/931/102 +f 525/932/105 529/987/105 530/933/105 +f 523/934/106 527/937/106 528/935/106 +f 530/936/104 529/988/104 528/935/104 +f 534/938/102 531/944/102 532/939/102 +f 533/941/105 537/989/105 538/942/105 +f 531/944/106 535/946/106 536/945/106 +f 538/942/104 537/989/104 536/945/104 +f 542/947/102 539/951/102 540/948/102 +f 541/949/101 545/990/101 546/950/101 +f 539/951/103 543/991/103 544/952/103 +f 546/950/104 545/990/104 544/953/104 +f 550/955/102 547/992/102 548/956/102 +f 549/957/101 553/993/101 554/958/101 +f 547/959/103 551/962/103 552/960/103 +f 554/958/104 553/993/104 552/960/104 +f 558/963/102 555/967/102 556/964/102 +f 557/965/101 561/994/101 562/966/101 +f 555/967/103 559/970/103 560/968/103 +f 562/969/104 561/995/104 560/968/104 +f 566/971/102 563/977/102 564/972/102 +f 565/974/101 569/996/101 570/975/101 +f 563/977/103 567/979/103 568/978/103 +f 570/975/104 569/996/104 568/978/104 +o Base +v 1.500000 0.125000 -1.250000 +v 1.500000 0.125000 1.250000 +v 1.500000 0.000000 1.250000 +v 1.500000 0.000000 -1.250000 +v 1.250000 0.000000 -1.250000 +v 1.250000 0.250000 -1.250000 +v 1.250000 0.000000 -1.500000 +v 1.250000 0.250000 -1.500000 +v 1.500000 0.000000 -1.250000 +v 1.500000 0.250000 -1.250000 +v 1.500000 0.000000 -1.500000 +v 1.500000 0.250000 -1.500000 +v -1.500000 0.000000 -1.250000 +v -1.500000 0.250000 -1.250000 +v -1.500000 0.000000 -1.500000 +v -1.500000 0.250000 -1.500000 +v -1.250000 0.000000 -1.250000 +v -1.250000 0.250000 -1.250000 +v -1.250000 0.000000 -1.500000 +v -1.250000 0.250000 -1.500000 +v 1.250000 0.000000 1.500000 +v 1.250000 0.250000 1.500000 +v 1.250000 0.000000 1.250000 +v 1.250000 0.250000 1.250000 +v 1.500000 0.000000 1.500000 +v 1.500000 0.250000 1.500000 +v 1.500000 0.000000 1.250000 +v 1.500000 0.250000 1.250000 +v -1.500000 0.000000 1.500000 +v -1.500000 0.250000 1.500000 +v -1.500000 0.000000 1.250000 +v -1.500000 0.250000 1.250000 +v -1.250000 0.000000 1.500000 +v -1.250000 0.250000 1.500000 +v -1.250000 0.000000 1.250000 +v -1.250000 0.250000 1.250000 +v 1.375000 0.125000 -1.250000 +v 1.375000 0.125000 1.250000 +v 1.375000 0.000000 1.250000 +v 1.375000 0.000000 -1.250000 +v -1.375000 0.125000 -1.250000 +v -1.375000 0.125000 1.250000 +v -1.375000 0.000000 1.250000 +v -1.375000 0.000000 -1.250000 +v -1.500000 0.125000 -1.250000 +v -1.500000 0.125000 1.250000 +v -1.500000 0.000000 1.250000 +v -1.500000 0.000000 -1.250000 +v -1.250000 0.125000 -1.500000 +v 1.250000 0.125000 -1.500000 +v 1.250000 0.000000 -1.500000 +v -1.250000 0.000000 -1.500000 +v -1.250000 0.125000 -1.375000 +v 1.250000 0.125000 -1.375000 +v 1.250000 0.000000 -1.375000 +v -1.250000 0.000000 -1.375000 +v -1.250000 0.125000 1.375000 +v 1.250000 0.125000 1.375000 +v 1.250000 0.000000 1.375000 +v -1.250000 0.000000 1.375000 +v -1.250000 0.125000 1.500000 +v 1.250000 0.125000 1.500000 +v 1.250000 0.000000 1.500000 +v -1.250000 0.000000 1.500000 +v 1.500000 0.687500 0.187500 +v 1.500000 0.312500 0.187500 +v 1.500000 0.687500 -0.187500 +v 1.500000 0.312500 -0.187500 +v 1.375000 0.625000 -0.125000 +v 1.375000 0.625000 0.125000 +v 1.375000 0.375000 0.125000 +v 1.375000 0.375000 -0.125000 +v 1.375000 0.687500 -0.187500 +v 1.375000 0.687500 0.187500 +v 1.375000 0.312500 0.187500 +v 1.375000 0.312500 -0.187500 +v 1.250000 0.625000 -0.125000 +v 1.250000 0.625000 0.125000 +v 1.250000 0.375000 0.125000 +v 1.250000 0.375000 -0.125000 +v 0.125000 0.125000 1.500000 +v 0.125000 0.125000 -1.500000 +v -0.125000 0.125000 1.500000 +v -0.125000 0.125000 -1.500000 +v -0.125000 0.250000 1.500000 +v 0.125000 0.250000 1.500000 +v 0.125000 0.250000 -1.500000 +v -0.125000 0.250000 -1.500000 +v -0.875000 0.125000 1.500000 +v -0.875000 0.125000 -1.500000 +v -1.125000 0.125000 1.500000 +v -1.125000 0.125000 -1.500000 +v -1.125000 0.250000 1.500000 +v -0.875000 0.250000 1.500000 +v -0.875000 0.250000 -1.500000 +v -1.125000 0.250000 -1.500000 +v 1.125000 0.125000 1.500000 +v 1.125000 0.125000 -1.500000 +v 0.875000 0.125000 1.500000 +v 0.875000 0.125000 -1.500000 +v 0.875000 0.250000 1.500000 +v 1.125000 0.250000 1.500000 +v 1.125000 0.250000 -1.500000 +v 0.875000 0.250000 -1.500000 +v -1.250000 0.250000 1.250000 +v 1.250000 0.250000 1.250000 +v -0.250000 0.250000 -1.250000 +v 1.250000 0.250000 -1.250000 +v -0.250000 0.750000 -1.250000 +v -1.250000 0.750000 1.250000 +v 1.250000 0.750000 1.250000 +v 1.250000 0.750000 -1.250000 +v -1.250000 0.250000 0.750000 +v 1.250000 0.250000 0.750000 +v -1.250000 0.750000 0.750000 +v 1.250000 0.750000 0.750000 +v -1.250000 0.250000 -1.250000 +v -1.250000 0.750000 -1.250000 +v -0.750000 0.250000 -1.250000 +v -0.750000 0.750000 -1.250000 +v -1.250000 0.750000 0.250000 +v -1.250000 0.250000 0.250000 +v -0.750000 0.750000 0.250000 +v -0.750000 0.250000 0.250000 +v 1.250000 0.250000 0.250000 +v -0.250000 0.250000 0.250000 +v 1.250000 0.750000 0.250000 +v -0.250000 0.750000 0.250000 +v -0.000000 1.250000 -1.375000 +v -0.526190 1.250000 -1.270334 +v -0.972272 1.250000 -0.972272 +v -1.270334 1.250000 -0.526190 +v -1.375000 1.250000 0.000000 +v -1.270334 1.250000 0.526190 +v -0.972272 1.250000 0.972272 +v -0.526190 1.250000 1.270334 +v -0.000000 1.250000 1.375000 +v 0.526189 1.250000 1.270334 +v 0.972271 1.250000 0.972272 +v 1.270334 1.250000 0.526190 +v 1.375000 1.250000 0.000000 +v 1.270334 1.250000 -0.526190 +v 0.972271 1.250000 -0.972272 +v 0.526189 1.250000 -1.270335 +v -0.000000 1.250000 -1.125000 +v -0.430519 1.250000 -1.039364 +v -0.795495 1.250000 -0.795495 +v -1.039365 1.250000 -0.430519 +v -1.125000 1.250000 0.000000 +v -1.039365 1.250000 0.430519 +v -0.795495 1.250000 0.795495 +v -0.430519 1.250000 1.039364 +v -0.000000 1.250000 1.125000 +v 0.430518 1.250000 1.039365 +v 0.795495 1.250000 0.795496 +v 1.039364 1.250000 0.430519 +v 1.125000 1.250000 0.000000 +v 1.039364 1.250000 -0.430519 +v 0.795495 1.250000 -0.795496 +v 0.430518 1.250000 -1.039365 +v -0.526190 1.000000 -1.270334 +v -0.000000 1.000000 -1.375000 +v -0.972272 1.000000 -0.972272 +v -1.270334 1.000000 -0.526190 +v -1.375000 1.000000 0.000000 +v -1.270334 1.000000 0.526190 +v -0.972272 1.000000 0.972272 +v -0.526190 1.000000 1.270334 +v -0.000000 1.000000 1.375000 +v 0.526189 1.000000 1.270334 +v 0.972271 1.000000 0.972272 +v 1.270334 1.000000 0.526190 +v 1.375000 1.000000 0.000000 +v 1.270334 1.000000 -0.526190 +v 0.972271 1.000000 -0.972272 +v 0.526189 1.000000 -1.270335 +v -0.430519 1.000000 -1.039364 +v -0.000000 1.000000 -1.125000 +v -0.795495 1.000000 -0.795495 +v -1.039365 1.000000 -0.430519 +v -1.125000 1.000000 0.000000 +v -1.039365 1.000000 0.430519 +v -0.795495 1.000000 0.795495 +v -0.430519 1.000000 1.039364 +v -0.000000 1.000000 1.125000 +v 0.430518 1.000000 1.039365 +v 0.795495 1.000000 0.795496 +v 1.039364 1.000000 0.430519 +v 1.125000 1.000000 0.000000 +v 1.039364 1.000000 -0.430519 +v 0.795495 1.000000 -0.795496 +v 0.430518 1.000000 -1.039365 +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.250000 0.875000 -0.250000 +v -0.250000 0.875000 0.250000 +v 0.250000 0.875000 0.250000 +v 0.250000 0.875000 -0.250000 +v 0.812500 0.750000 -0.812500 +v 1.187500 0.750000 -0.812500 +v 0.812500 0.750000 -1.187500 +v 1.187500 0.750000 -1.187500 +v 1.125000 1.062500 -1.125000 +v 0.875000 1.062500 -1.125000 +v 1.125000 1.062500 -0.875000 +v 0.875000 1.062500 -0.875000 +v 0.875000 1.062500 1.125000 +v 1.125000 1.062500 1.125000 +v 0.875000 1.062500 0.875000 +v 1.125000 1.062500 0.875000 +v 1.187500 0.750000 0.812500 +v 0.812500 0.750000 0.812500 +v 1.187500 0.750000 1.187500 +v 0.812500 0.750000 1.187500 +v -1.187500 0.750000 -0.812500 +v -0.812500 0.750000 -0.812500 +v -1.187500 0.750000 -1.187500 +v -0.812500 0.750000 -1.187500 +v -0.875000 1.062500 -1.125000 +v -1.125000 1.062500 -1.125000 +v -0.875000 1.062500 -0.875000 +v -1.125000 1.062500 -0.875000 +v -1.125000 1.062500 1.125000 +v -0.875000 1.062500 1.125000 +v -1.125000 1.062500 0.875000 +v -0.875000 1.062500 0.875000 +v -0.812500 0.750000 0.812500 +v -1.187500 0.750000 0.812500 +v -0.812500 0.750000 1.187500 +v -1.187500 0.750000 1.187500 +v -0.375000 0.875000 -0.375000 +v -0.375000 0.875000 0.375000 +v 0.375000 0.875000 0.375000 +v 0.375000 0.875000 -0.375000 +v -0.250000 0.750000 -0.250000 +v -0.250000 0.750000 0.250000 +v 0.250000 0.750000 0.250000 +v 0.250000 0.750000 -0.250000 +v -0.839690 0.812500 0.928078 +v 0.928077 0.812500 -0.839689 +v -0.928078 0.812500 0.839689 +v 0.839689 0.812500 -0.928078 +v -0.928078 0.937500 0.839689 +v -0.839690 0.937500 0.928078 +v 0.928077 0.937500 -0.839689 +v 0.839689 0.937500 -0.928078 +v 0.928077 0.812500 0.839689 +v -0.839690 0.812500 -0.928078 +v 0.839689 0.812500 0.928078 +v -0.928078 0.812500 -0.839689 +v 0.839689 0.937500 0.928078 +v 0.928077 0.937500 0.839689 +v -0.839690 0.937500 -0.928078 +v -0.928078 0.937500 -0.839689 +v 1.250000 0.437500 0.875000 +v 1.250000 0.562500 0.875000 +v -1.250000 0.500000 0.250000 +v 1.250000 0.500000 0.250000 +v -1.250000 0.323223 0.323223 +v 1.250000 0.323223 0.323223 +v -1.250000 0.250000 0.500000 +v 1.250000 0.250000 0.500000 +v -1.250000 0.323223 0.676777 +v 1.250000 0.323223 0.676777 +v -1.250000 0.500000 0.750000 +v 1.250000 0.500000 0.750000 +v -1.250000 0.676777 0.676777 +v 1.250000 0.676777 0.676777 +v -1.250000 0.750000 0.500000 +v 1.250000 0.750000 0.500000 +v -1.250000 0.676777 0.323223 +v 1.250000 0.676777 0.323223 +v 1.250000 0.562500 0.125000 +v 1.250000 0.437500 0.125000 +v 1.375000 0.437500 0.125000 +v 1.375000 0.562500 0.125000 +v 1.375000 0.437500 0.875000 +v 1.375000 0.562500 0.875000 +v -1.250001 0.437500 0.125000 +v -1.250001 0.562500 0.125000 +v -1.250001 0.562500 0.875000 +v -1.250001 0.437500 0.875000 +v -1.375001 0.437500 0.875000 +v -1.375001 0.562500 0.875000 +v -1.375001 0.437500 0.125000 +v -1.375001 0.562500 0.125000 +v -1.187500 1.000000 -1.187500 +v -1.187500 1.000000 -0.812500 +v -0.812500 1.000000 -0.812500 +v -0.812500 1.000000 -1.187500 +v 1.187500 1.000000 -1.187500 +v 0.812500 1.000000 -1.187500 +v 1.187500 1.000000 -0.812500 +v 0.812500 1.000000 -0.812500 +v 0.812500 1.000000 0.812500 +v 0.812500 1.000000 1.187500 +v 1.187500 1.000000 1.187500 +v 1.187500 1.000000 0.812500 +v -1.187500 1.000000 0.812500 +v -1.187500 1.000000 1.187500 +v -0.812500 1.000000 1.187500 +v -0.812500 1.000000 0.812500 +v 1.500000 0.687500 -0.812500 +v 1.500000 0.312500 -0.812500 +v 1.500000 0.687500 -1.187500 +v 1.500000 0.312500 -1.187500 +v 1.375000 0.625000 -1.125000 +v 1.375000 0.625000 -0.875000 +v 1.375000 0.375000 -0.875000 +v 1.375000 0.375000 -1.125000 +v 1.375000 0.687500 -1.187500 +v 1.375000 0.687500 -0.812500 +v 1.375000 0.312500 -0.812500 +v 1.375000 0.312500 -1.187500 +v 1.250000 0.625000 -1.125000 +v 1.250000 0.625000 -0.875000 +v 1.250000 0.375000 -0.875000 +v 1.250000 0.375000 -1.125000 +v 1.500000 0.687500 1.187500 +v 1.500000 0.312500 1.187500 +v 1.500000 0.687500 0.812500 +v 1.500000 0.312500 0.812500 +v 1.375000 0.625000 0.875000 +v 1.375000 0.625000 1.125000 +v 1.375000 0.375000 1.125000 +v 1.375000 0.375000 0.875000 +v 1.375000 0.687500 0.812500 +v 1.375000 0.687500 1.187500 +v 1.375000 0.312500 1.187500 +v 1.375000 0.312500 0.812500 +v 1.250000 0.625000 0.875000 +v 1.250000 0.625000 1.125000 +v 1.250000 0.375000 1.125000 +v 1.250000 0.375000 0.875000 +v -1.500000 0.687500 -0.187500 +v -1.500000 0.312500 -0.187500 +v -1.500000 0.687500 0.187500 +v -1.500000 0.312500 0.187500 +v -1.375000 0.625000 0.125000 +v -1.375000 0.625000 -0.125000 +v -1.375000 0.375000 -0.125000 +v -1.375000 0.375000 0.125000 +v -1.375000 0.687500 0.187500 +v -1.375000 0.687500 -0.187500 +v -1.375000 0.312500 -0.187500 +v -1.375000 0.312500 0.187500 +v -1.250000 0.625000 0.125000 +v -1.250000 0.625000 -0.125000 +v -1.250000 0.375000 -0.125000 +v -1.250000 0.375000 0.125000 +v -1.500000 0.687500 0.812500 +v -1.500000 0.312500 0.812500 +v -1.500000 0.687500 1.187500 +v -1.500000 0.312500 1.187500 +v -1.375000 0.625000 1.125000 +v -1.375000 0.625000 0.875000 +v -1.375000 0.375000 0.875000 +v -1.375000 0.375000 1.125000 +v -1.375000 0.687500 1.187500 +v -1.375000 0.687500 0.812500 +v -1.375000 0.312500 0.812500 +v -1.375000 0.312500 1.187500 +v -1.250000 0.625000 1.125000 +v -1.250000 0.625000 0.875000 +v -1.250000 0.375000 0.875000 +v -1.250000 0.375000 1.125000 +v -1.500000 0.687500 -1.187500 +v -1.500000 0.312500 -1.187500 +v -1.500000 0.687500 -0.812500 +v -1.500000 0.312500 -0.812500 +v -1.375000 0.625000 -0.875000 +v -1.375000 0.625000 -1.125000 +v -1.375000 0.375000 -1.125000 +v -1.375000 0.375000 -0.875000 +v -1.375000 0.687500 -0.812500 +v -1.375000 0.687500 -1.187500 +v -1.375000 0.312500 -1.187500 +v -1.375000 0.312500 -0.812500 +v -1.250000 0.625000 -0.875000 +v -1.250000 0.625000 -1.125000 +v -1.250000 0.375000 -1.125000 +v -1.250000 0.375000 -0.875000 +v 0.187500 0.687500 -1.500000 +v 0.187500 0.312500 -1.500000 +v -0.187500 0.687500 -1.500000 +v -0.187500 0.312500 -1.500000 +v -0.125000 0.625000 -1.375000 +v 0.125000 0.625000 -1.375000 +v 0.125000 0.375000 -1.375000 +v -0.125000 0.375000 -1.375000 +v -0.187500 0.687500 -1.375000 +v 0.187500 0.687500 -1.375000 +v 0.187500 0.312500 -1.375000 +v -0.187500 0.312500 -1.375000 +v -0.125000 0.625000 -1.250000 +v 0.125000 0.625000 -1.250000 +v 0.125000 0.375000 -1.250000 +v -0.125000 0.375000 -1.250000 +v -0.812500 0.687500 -1.500000 +v -0.812500 0.312500 -1.500000 +v -1.187500 0.687500 -1.500000 +v -1.187500 0.312500 -1.500000 +v -1.125000 0.625000 -1.375000 +v -0.875000 0.625000 -1.375000 +v -0.875000 0.375000 -1.375000 +v -1.125000 0.375000 -1.375000 +v -1.187500 0.687500 -1.375000 +v -0.812500 0.687500 -1.375000 +v -0.812500 0.312500 -1.375000 +v -1.187500 0.312500 -1.375000 +v -1.125000 0.625000 -1.250000 +v -0.875000 0.625000 -1.250000 +v -0.875000 0.375000 -1.250000 +v -1.125000 0.375000 -1.250000 +v 1.187500 0.687500 -1.500000 +v 1.187500 0.312500 -1.500000 +v 0.812500 0.687500 -1.500000 +v 0.812500 0.312500 -1.500000 +v 0.875000 0.625000 -1.375000 +v 1.125000 0.625000 -1.375000 +v 1.125000 0.375000 -1.375000 +v 0.875000 0.375000 -1.375000 +v 0.812500 0.687500 -1.375000 +v 1.187500 0.687500 -1.375000 +v 1.187500 0.312500 -1.375000 +v 0.812500 0.312500 -1.375000 +v 0.875000 0.625000 -1.250000 +v 1.125000 0.625000 -1.250000 +v 1.125000 0.375000 -1.250000 +v 0.875000 0.375000 -1.250000 +v -0.187500 0.687500 1.500000 +v -0.187500 0.312500 1.500000 +v 0.187500 0.687500 1.500000 +v 0.187500 0.312500 1.500000 +v 0.125000 0.625000 1.375000 +v -0.125000 0.625000 1.375000 +v -0.125000 0.375000 1.375000 +v 0.125000 0.375000 1.375000 +v 0.187500 0.687500 1.375000 +v -0.187500 0.687500 1.375000 +v -0.187500 0.312500 1.375000 +v 0.187500 0.312500 1.375000 +v 0.125000 0.625000 1.250000 +v -0.125000 0.625000 1.250000 +v -0.125000 0.375000 1.250000 +v 0.125000 0.375000 1.250000 +v 0.812500 0.687500 1.500000 +v 0.812500 0.312500 1.500000 +v 1.187500 0.687500 1.500000 +v 1.187500 0.312500 1.500000 +v 1.125000 0.625000 1.375000 +v 0.875000 0.625000 1.375000 +v 0.875000 0.375000 1.375000 +v 1.125000 0.375000 1.375000 +v 1.187500 0.687500 1.375000 +v 0.812500 0.687500 1.375000 +v 0.812500 0.312500 1.375000 +v 1.187500 0.312500 1.375000 +v 1.125000 0.625000 1.250000 +v 0.875000 0.625000 1.250000 +v 0.875000 0.375000 1.250000 +v 1.125000 0.375000 1.250000 +v -1.187500 0.687500 1.500000 +v -1.187500 0.312500 1.500000 +v -0.812500 0.687500 1.500000 +v -0.812500 0.312500 1.500000 +v -0.875000 0.625000 1.375000 +v -1.125000 0.625000 1.375000 +v -1.125000 0.375000 1.375000 +v -0.875000 0.375000 1.375000 +v -0.812500 0.687500 1.375000 +v -1.187500 0.687500 1.375000 +v -1.187500 0.312500 1.375000 +v -0.812500 0.312500 1.375000 +v -0.875000 0.625000 1.250000 +v -1.125000 0.625000 1.250000 +v -1.125000 0.375000 1.250000 +v -0.875000 0.375000 1.250000 +vt 0.473684 0.851852 +vt 0.210526 0.870370 +vt 0.210526 0.851852 +vt 0.421053 0.962963 +vt 0.394737 0.925926 +vt 0.421053 0.925926 +vt 0.394737 0.962963 +vt 0.368421 0.925926 +vt 0.368421 0.962963 +vt 0.342105 0.925926 +vt 0.447368 0.962963 +vt 0.447368 0.925926 +vt 0.342105 0.888889 +vt 0.368421 0.888889 +vt 0.368421 1.000000 +vt 0.342105 0.962963 +vt 0.421053 0.962963 +vt 0.394737 0.925926 +vt 0.421053 0.925926 +vt 0.394737 0.962963 +vt 0.368421 0.925926 +vt 0.368421 0.962963 +vt 0.342105 0.925926 +vt 0.447368 0.962963 +vt 0.447368 0.925926 +vt 0.342105 0.888889 +vt 0.368421 0.888889 +vt 0.368421 1.000000 +vt 0.342105 0.962963 +vt 0.421053 0.962963 +vt 0.394737 0.925926 +vt 0.421053 0.925926 +vt 0.394737 0.962963 +vt 0.368421 0.925926 +vt 0.368421 0.962963 +vt 0.342105 0.925926 +vt 0.447368 0.962963 +vt 0.447368 0.925926 +vt 0.342105 0.888889 +vt 0.368421 0.888889 +vt 0.368421 1.000000 +vt 0.342105 0.962963 +vt 0.421053 0.962963 +vt 0.394737 0.925926 +vt 0.421053 0.925926 +vt 0.394737 0.962963 +vt 0.368421 0.925926 +vt 0.368421 0.962963 +vt 0.342105 0.925926 +vt 0.447368 0.962963 +vt 0.447368 0.925926 +vt 0.342105 0.888889 +vt 0.368421 0.888889 +vt 0.368421 1.000000 +vt 0.342105 0.962963 +vt 0.473684 0.833333 +vt 0.473684 0.870370 +vt 0.210526 0.888889 +vt 0.210526 0.814815 +vt 0.473684 0.814815 +vt 0.210526 0.833333 +vt 0.473684 0.814815 +vt 0.473684 0.833333 +vt 0.210526 0.851852 +vt 0.210526 0.888889 +vt 0.473684 0.870370 +vt 0.473684 0.888889 +vt 0.210526 0.870370 +vt 0.473684 0.851852 +vt 0.210526 0.870370 +vt 0.210526 0.851852 +vt 0.473684 0.833333 +vt 0.473684 0.870370 +vt 0.210526 0.888889 +vt 0.210526 0.814815 +vt 0.473684 0.814815 +vt 0.210526 0.833333 +vt 0.473684 0.814815 +vt 0.473684 0.833333 +vt 0.210526 0.851852 +vt 0.210526 0.888889 +vt 0.473684 0.870370 +vt 0.473684 0.888889 +vt 0.210526 0.870370 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.013158 0.888889 +vt 0.328947 0.925926 +vt 0.013158 0.925926 +vt 0.328947 0.944444 +vt 0.013158 0.981481 +vt 0.013158 0.944444 +vt 0.013158 1.000000 +vt 0.328947 0.981481 +vt 0.328947 1.000000 +vt 0.342105 0.981481 +vt 0.342105 0.944444 +vt -0.000000 0.944444 +vt -0.000000 0.981481 +vt 0.013158 0.888889 +vt 0.328947 0.925926 +vt 0.013158 0.925926 +vt 0.328947 0.944444 +vt 0.013158 0.981481 +vt 0.013158 0.944444 +vt 0.013158 1.000000 +vt 0.328947 0.981481 +vt 0.328947 1.000000 +vt 0.342105 0.981481 +vt 0.342105 0.944444 +vt -0.000000 0.944444 +vt -0.000000 0.981481 +vt 0.013158 0.888889 +vt 0.328947 0.925926 +vt 0.013158 0.925926 +vt 0.328947 0.944444 +vt 0.013158 0.981481 +vt 0.013158 0.944444 +vt 0.013158 1.000000 +vt 0.328947 0.981481 +vt 0.328947 1.000000 +vt 0.342105 0.981481 +vt 0.342105 0.944444 +vt -0.000000 0.944444 +vt -0.000000 0.981481 +vt 0.315789 0.370370 +vt 0.368421 0.740741 +vt 0.315789 0.740741 +vt 0.473684 0.740741 +vt 0.421053 0.370370 +vt 0.473684 0.370370 +vt 0.368421 0.814815 +vt 0.315789 0.814815 +vt 0.263158 0.814815 +vt 0.210526 0.592593 +vt 0.263158 0.592593 +vt 0.263158 0.370370 +vt 0.368421 0.370370 +vt 0.315789 0.296296 +vt 0.684211 0.518519 +vt 0.736842 0.444444 +vt 0.736842 0.518519 +vt 0.473684 0.444444 +vt 0.526316 0.518519 +vt 0.473684 0.518519 +vt 0.684211 0.370370 +vt 0.526316 0.296296 +vt 0.684211 0.296296 +vt 0.684211 0.592593 +vt 0.526316 0.444444 +vt 0.684211 0.444444 +vt 0.526316 0.370370 +vt 0.052632 0.592593 +vt -0.000000 0.814815 +vt -0.000000 0.592593 +vt 0.210526 0.888889 +vt 0.052632 0.814815 +vt 0.210526 0.814815 +vt 0.210526 0.518519 +vt 0.052632 0.296296 +vt 0.210526 0.296296 +vt 0.052632 0.518519 +vt 0.263158 0.074074 +vt 0.312500 0.111111 +vt 0.266447 0.111111 +vt 0.210526 0.074074 +vt 0.259868 0.111111 +vt 0.213816 0.111111 +vt 0.157895 0.074074 +vt 0.207237 0.111111 +vt 0.161184 0.111111 +vt 0.105263 0.074074 +vt 0.154605 0.111111 +vt 0.108553 0.111111 +vt 0.052632 0.074074 +vt 0.101974 0.111111 +vt 0.055921 0.111111 +vt -0.000000 0.074074 +vt 0.049342 0.111111 +vt 0.003289 0.111111 +vt 0.842105 0.074074 +vt 0.792763 0.111111 +vt 0.789474 0.074074 +vt 0.740132 0.111111 +vt 0.736842 0.074074 +vt 0.687500 0.111111 +vt 0.684211 0.074074 +vt 0.634869 0.111111 +vt 0.631579 0.074074 +vt 0.582237 0.111111 +vt 0.578947 0.074074 +vt 0.529605 0.111111 +vt 0.526316 0.074074 +vt 0.476974 0.111111 +vt 0.473684 0.074074 +vt 0.424342 0.111111 +vt 0.421053 0.074074 +vt 0.371711 0.111111 +vt 0.368421 0.074074 +vt 0.315789 0.074074 +vt 0.365132 0.111111 +vt 0.319079 0.111111 +vt 0.263158 0.037037 +vt 0.312500 0.000000 +vt 0.315789 0.037037 +vt 0.210526 0.037037 +vt 0.259868 0.000000 +vt 0.157895 0.037037 +vt 0.207237 0.000000 +vt 0.105263 0.037037 +vt 0.154605 0.000000 +vt 0.052632 0.037037 +vt 0.101974 0.000000 +vt -0.000000 0.037037 +vt 0.049342 0.000000 +vt 0.799342 0.000000 +vt 0.842105 0.037037 +vt 0.789474 0.037037 +vt 0.746711 0.000000 +vt 0.736842 0.037037 +vt 0.694079 0.000000 +vt 0.684211 0.037037 +vt 0.641447 0.000000 +vt 0.631579 0.037037 +vt 0.588816 0.000000 +vt 0.578947 0.037037 +vt 0.536184 0.000000 +vt 0.526316 0.037037 +vt 0.476974 0.000000 +vt 0.473684 0.037037 +vt 0.424342 0.000000 +vt 0.421053 0.037037 +vt 0.371711 0.000000 +vt 0.368421 0.037037 +vt 0.365132 0.000000 +vt 0.578947 0.722222 +vt 0.657895 0.833333 +vt 0.578947 0.833333 +vt 0.592105 0.685185 +vt 0.644737 0.666667 +vt 0.644737 0.685185 +vt 0.578947 0.851852 +vt 0.657895 0.722222 +vt 0.671053 0.833333 +vt 0.565789 0.722222 +vt 0.657895 0.703704 +vt 0.855263 0.444444 +vt 0.815789 0.481481 +vt 0.815789 0.444444 +vt 0.776316 0.444444 +vt 0.736842 0.481481 +vt 0.736842 0.444444 +vt 0.855263 0.444444 +vt 0.815789 0.481481 +vt 0.815789 0.444444 +vt 0.776316 0.481481 +vt 0.776316 0.444444 +vt 0.894737 0.444444 +vt 0.855263 0.481481 +vt 0.743421 0.490741 +vt 0.769737 0.527778 +vt 0.743421 0.527778 +vt 0.743421 0.490741 +vt 0.769737 0.527778 +vt 0.743421 0.527778 +vt 0.894737 0.444444 +vt 0.855263 0.481481 +vt 0.855263 0.444444 +vt 0.815789 0.444444 +vt 0.776316 0.481481 +vt 0.776316 0.444444 +vt 0.815789 0.481481 +vt 0.776316 0.444444 +vt 0.736842 0.481481 +vt 0.736842 0.444444 +vt 0.855263 0.444444 +vt 0.815789 0.481481 +vt 0.815789 0.444444 +vt 0.776316 0.481481 +vt 0.894737 0.444444 +vt 0.855263 0.481481 +vt 0.743421 0.490741 +vt 0.769737 0.527778 +vt 0.743421 0.527778 +vt 0.736842 0.481481 +vt 0.736842 0.444444 +vt 0.776316 0.481481 +vt 0.894737 0.444444 +vt 0.855263 0.481481 +vt 0.743421 0.490741 +vt 0.769737 0.527778 +vt 0.743421 0.527778 +vt 0.736842 0.481481 +vt 0.736842 0.444444 +vt 0.592105 0.870370 +vt 0.657895 0.851852 +vt 0.644737 0.870370 +vt 0.552632 0.740741 +vt 0.565789 0.833333 +vt 0.552632 0.814815 +vt 0.578947 0.703704 +vt 0.684211 0.814815 +vt 0.671053 0.722222 +vt 0.684211 0.740741 +vt 0.644737 0.592593 +vt 0.592105 0.666667 +vt 0.592105 0.592593 +vt 0.592105 0.888889 +vt 0.697368 0.814815 +vt 0.539474 0.740741 +vt 0.736842 0.370370 +vt 1.000000 0.388889 +vt 0.736842 0.388889 +vt 0.736842 0.407407 +vt 1.000000 0.425926 +vt 0.736842 0.425926 +vt 0.736842 0.444444 +vt 1.000000 0.444444 +vt 0.736842 0.370370 +vt 1.000000 0.388889 +vt 0.736842 0.388889 +vt 0.736842 0.407407 +vt 1.000000 0.425926 +vt 0.736842 0.425926 +vt 0.736842 0.444444 +vt 1.000000 0.444444 +vt 0.447368 0.351852 +vt 0.526316 0.333333 +vt 0.526316 0.351852 +vt 0.447368 0.314815 +vt 0.526316 0.333333 +vt 0.447368 0.333333 +vt 0.526316 0.296296 +vt 0.447368 0.314815 +vt 0.447368 0.296296 +vt 0.526316 0.296296 +vt 0.447368 0.296296 +vt 0.447368 0.333333 +vt 0.737094 0.333333 +vt 0.744728 0.307394 +vt 0.763158 0.296650 +vt 0.447368 0.351852 +vt 0.526316 0.351852 +vt 0.834220 0.307394 +vt 0.834220 0.359272 +vt 0.797359 0.359272 +vt 0.822368 0.490741 +vt 0.848684 0.490741 +vt 0.861842 0.490741 +vt 0.894737 0.481481 +vt 0.888158 0.490741 +vt 0.769737 0.490741 +vt 0.782895 0.490741 +vt 0.809211 0.490741 +vt 0.782895 0.490741 +vt 0.809211 0.490741 +vt 0.769737 0.490741 +vt 0.861842 0.490741 +vt 0.894737 0.481481 +vt 0.888158 0.490741 +vt 0.822368 0.490741 +vt 0.848684 0.490741 +vt 0.822368 0.490741 +vt 0.848684 0.490741 +vt 0.861842 0.490741 +vt 0.894737 0.481481 +vt 0.888158 0.490741 +vt 0.769737 0.490741 +vt 0.782895 0.490741 +vt 0.809211 0.490741 +vt 0.822368 0.490741 +vt 0.848684 0.490741 +vt 0.861842 0.490741 +vt 0.894737 0.481481 +vt 0.888158 0.490741 +vt 0.769737 0.490741 +vt 0.782895 0.490741 +vt 0.809211 0.490741 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.539474 0.740741 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.539474 0.740741 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.546053 0.712963 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.506579 0.638889 +vt 0.546053 0.694444 +vt 0.506579 0.694444 +vt 0.513158 0.611111 +vt 0.539474 0.592593 +vt 0.539474 0.611111 +vt 0.546053 0.638889 +vt 0.559211 0.694444 +vt 0.493421 0.638889 +vt 0.546053 0.620370 +vt 0.546053 0.712963 +vt 0.506579 0.712963 +vt 0.513158 0.722222 +vt 0.539474 0.722222 +vt 0.486842 0.648148 +vt 0.493421 0.694444 +vt 0.486842 0.685185 +vt 0.506579 0.620370 +vt 0.565789 0.685185 +vt 0.559211 0.638889 +vt 0.565789 0.648148 +vt 0.539474 0.740741 +vt 0.513158 0.740741 +vt 0.578947 0.685185 +vt 0.473684 0.648148 +vt 0.342105 1.000000 +vt 0.342105 1.000000 +vt 0.342105 1.000000 +vt 0.342105 1.000000 +vt 0.210526 0.833333 +vt 0.473684 0.888889 +vt 0.210526 0.814815 +vt 0.473684 0.851852 +vt 0.210526 0.833333 +vt 0.473684 0.888889 +vt 0.210526 0.814815 +vt 0.473684 0.851852 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.328947 0.888889 +vt 0.328947 0.888889 +vt 0.328947 0.888889 +vt 0.421053 0.740741 +vt 0.263158 0.740741 +vt 0.368421 0.296296 +vt 0.526316 0.592593 +vt 0.052632 0.888889 +vt 0.838816 0.111111 +vt 0.786184 0.111111 +vt 0.733553 0.111111 +vt 0.680921 0.111111 +vt 0.628289 0.111111 +vt 0.575658 0.111111 +vt 0.523026 0.111111 +vt 0.470395 0.111111 +vt 0.417763 0.111111 +vt 0.266447 0.000000 +vt 0.213816 0.000000 +vt 0.161184 0.000000 +vt 0.108553 0.000000 +vt 0.055921 0.000000 +vt 0.003289 0.000000 +vt 0.838816 0.000000 +vt 0.786184 0.000000 +vt 0.733553 0.000000 +vt 0.680921 0.000000 +vt 0.628289 0.000000 +vt 0.575658 0.000000 +vt 0.523026 0.000000 +vt 0.470395 0.000000 +vt 0.417763 0.000000 +vt 0.319079 0.000000 +vt 0.644737 0.888889 +vt 0.697368 0.740741 +vt 0.539474 0.814815 +vt 1.000000 0.370370 +vt 1.000000 0.407407 +vt 1.000000 0.370370 +vt 1.000000 0.407407 +vt 0.526316 0.314815 +vt 0.526316 0.314815 +vt 0.781588 0.307394 +vt 0.789223 0.333333 +vt 0.781588 0.359272 +vt 0.763158 0.370016 +vt 0.744728 0.359272 +vt 0.789725 0.333333 +vt 0.797359 0.307394 +vt 0.815790 0.296650 +vt 0.841854 0.333333 +vt 0.815790 0.370017 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.539474 0.740741 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.513158 0.592593 +vt 0.578947 0.648148 +vt 0.473684 0.685185 +vt 0.055921 0.148148 +vt 0.108553 0.148148 +vt 0.161184 0.148148 +vt 0.213816 0.148148 +vt 0.266447 0.148148 +vt 0.319079 0.148148 +vt 0.371711 0.148148 +vt 0.424342 0.148148 +vt 0.476974 0.148148 +vt 0.634869 0.148148 +vt 0.529605 0.148148 +vt 0.687500 0.148148 +vt 0.582237 0.148148 +vt 0.740132 0.148148 +vt 0.792763 0.148148 +vt 0.003289 0.148148 +vt 0.960526 0.000000 +vt 0.980263 0.370370 +vt 0.960526 0.370370 +vt 0.980263 0.000000 +vt 1.000000 0.370370 +vt 0.842105 0.000000 +vt 0.861842 0.370370 +vt 0.842105 0.370370 +vt 0.861842 0.000000 +vt 0.881579 0.370370 +vt 0.881579 0.000000 +vt 0.901316 0.370370 +vt 0.901316 0.000000 +vt 0.921053 0.370370 +vt 0.921053 0.000000 +vt 0.940789 0.370370 +vt 0.940789 0.000000 +vt 0.101974 0.148148 +vt 0.154605 0.148148 +vt 0.207237 0.148148 +vt 0.259868 0.148148 +vt 0.312500 0.148148 +vt 0.365132 0.148148 +vt 0.417763 0.148148 +vt 0.470395 0.148148 +vt 0.523026 0.148148 +vt 0.680921 0.148148 +vt 0.575658 0.148148 +vt 0.733553 0.148148 +vt 0.628289 0.148148 +vt 0.786184 0.148148 +vt 0.838816 0.148148 +vt 0.049342 0.148148 +vt 1.000000 0.000000 +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.0000 1.0000 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.7071 0.7071 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.3827 0.0000 0.9239 +vn 0.9239 0.0000 -0.3827 +vn 0.3827 0.0000 0.9239 +vn 0.3827 0.0000 -0.9239 +vn 0.9239 0.0000 0.3827 +vn -0.3827 0.0000 -0.9239 +vn -0.9239 0.0000 -0.3827 +vn -0.9239 0.0000 0.3827 +vn -0.0000 -0.7071 -0.7071 +vn -0.0000 -0.7071 0.7071 +s off +f 574/997/107 572/998/107 573/999/107 +f 576/1000/108 577/1001/108 575/1002/108 +f 578/1003/109 581/1004/109 577/1001/109 +f 582/1005/107 579/1006/107 581/1004/107 +f 580/1007/110 575/1002/110 579/1008/110 +f 581/1004/111 575/1009/111 577/1010/111 +f 578/1011/112 580/1012/112 582/1005/112 +f 584/1013/108 585/1014/108 583/1015/108 +f 586/1016/109 589/1017/109 585/1014/109 +f 590/1018/107 587/1019/107 589/1017/107 +f 588/1020/110 583/1015/110 587/1021/110 +f 589/1017/111 583/1022/111 585/1023/111 +f 586/1024/112 588/1025/112 590/1018/112 +f 592/1026/108 593/1027/108 591/1028/108 +f 594/1029/109 597/1030/109 593/1027/109 +f 598/1031/107 595/1032/107 597/1030/107 +f 596/1033/110 591/1028/110 595/1034/110 +f 597/1030/111 591/1035/111 593/1036/111 +f 594/1037/112 596/1038/112 598/1031/112 +f 600/1039/108 601/1040/108 599/1041/108 +f 602/1042/109 605/1043/109 601/1040/109 +f 606/1044/107 603/1045/107 605/1043/107 +f 604/1046/110 599/1041/110 603/1047/110 +f 605/1043/111 599/1048/111 601/1049/111 +f 602/1050/112 604/1051/112 606/1044/112 +f 573/999/111 610/1052/111 574/997/111 +f 571/1053/112 608/1054/112 572/998/112 +f 610/1052/108 608/1055/108 607/1056/108 +f 614/1057/107 612/1058/107 613/1059/107 +f 613/1059/111 618/1060/111 614/1057/111 +f 611/1061/112 616/1062/112 612/1063/112 +f 618/1060/108 616/1062/108 615/1064/108 +f 622/1065/109 620/1066/109 621/1067/109 +f 621/1067/111 626/1068/111 622/1065/111 +f 619/1069/112 624/1070/112 620/1066/112 +f 626/1068/110 624/1071/110 623/1072/110 +f 630/1073/109 628/1074/109 629/1075/109 +f 629/1075/111 634/1076/111 630/1073/111 +f 627/1077/112 632/1078/112 628/1079/112 +f 634/1076/110 632/1078/110 631/1080/110 +f 636/1081/107 637/1082/107 635/1083/107 +f 641/1084/111 650/1085/111 642/1086/111 +f 638/1087/109 643/1088/109 637/1082/109 +f 635/1083/110 645/1089/110 636/1081/110 +f 636/1081/111 646/1090/111 638/1087/111 +f 637/1082/112 644/1091/112 635/1083/112 +f 640/1092/108 643/1093/108 639/1094/108 +f 641/1095/108 644/1096/108 640/1097/108 +f 642/1086/108 645/1098/108 641/1084/108 +f 639/1099/108 646/1100/108 642/1101/108 +f 639/1094/112 648/1102/112 640/1092/112 +f 642/1101/109 647/1103/109 639/1099/109 +f 640/1097/110 649/1104/110 641/1095/110 +f 653/1105/111 652/1106/111 651/1107/111 +f 657/1108/112 655/1109/112 656/1110/112 +f 653/1111/108 658/1112/108 654/1113/108 +f 652/1106/107 656/1110/107 651/1107/107 +f 654/1114/109 657/1108/109 652/1115/109 +f 651/1116/110 655/1109/110 653/1117/110 +f 661/1118/111 660/1119/111 659/1120/111 +f 665/1121/112 663/1122/112 664/1123/112 +f 661/1124/108 666/1125/108 662/1126/108 +f 660/1119/107 664/1123/107 659/1120/107 +f 662/1127/109 665/1121/109 660/1128/109 +f 659/1129/110 663/1122/110 661/1130/110 +f 669/1131/111 668/1132/111 667/1133/111 +f 673/1134/112 671/1135/112 672/1136/112 +f 669/1137/108 674/1138/108 670/1139/108 +f 668/1132/107 672/1136/107 667/1133/107 +f 670/1140/109 673/1134/109 668/1141/109 +f 667/1142/110 671/1135/110 669/1143/110 +f 675/1144/111 684/1145/111 676/1146/111 +f 681/1147/112 685/1148/112 680/1149/112 +f 676/1146/107 686/1150/107 681/1151/107 +f 677/1152/109 682/1153/109 678/1154/109 +f 676/1146/110 680/1155/110 675/1144/110 +f 685/1148/109 684/1145/109 683/1156/109 +f 680/1157/108 683/1156/108 675/1144/108 +f 688/1158/109 689/1159/109 687/1160/109 +f 694/1161/110 691/1162/110 692/1163/110 +f 689/1164/111 692/1165/111 687/1166/111 +f 687/1167/108 691/1162/108 688/1158/108 +f 688/1158/112 693/1168/112 690/1169/112 +f 690/1169/107 694/1170/107 689/1164/107 +f 697/1171/110 696/1172/110 695/1173/110 +f 677/1174/108 698/1175/108 679/1176/108 +f 679/1176/112 697/1171/112 682/1153/112 +f 678/1177/111 696/1178/111 677/1179/111 +f 682/1153/107 695/1180/107 678/1177/107 +f 708/1181/112 725/1182/112 724/1183/112 +f 707/1184/112 724/1185/112 723/1186/112 +f 706/1187/112 723/1188/112 722/1189/112 +f 705/1190/112 722/1191/112 721/1192/112 +f 704/1193/112 721/1194/112 720/1195/112 +f 703/1196/112 720/1197/112 719/1198/112 +f 703/1199/112 718/1200/112 702/1201/112 +f 702/1201/112 717/1202/112 701/1203/112 +f 701/1203/112 716/1204/112 700/1205/112 +f 700/1205/112 715/1206/112 699/1207/112 +f 699/1207/112 730/1208/112 714/1209/112 +f 714/1209/112 729/1210/112 713/1211/112 +f 713/1211/112 728/1212/112 712/1213/112 +f 712/1213/112 727/1214/112 711/1215/112 +f 711/1215/112 726/1216/112 710/1217/112 +f 709/1218/112 726/1219/112 725/1220/112 +f 740/1221/111 757/1222/111 741/1223/111 +f 739/1224/111 756/1225/111 740/1221/111 +f 738/1226/111 755/1227/111 739/1224/111 +f 737/1228/111 754/1229/111 738/1226/111 +f 736/1230/111 753/1231/111 737/1228/111 +f 735/1232/111 752/1233/111 736/1230/111 +f 750/1234/111 735/1235/111 734/1236/111 +f 749/1237/111 734/1236/111 733/1238/111 +f 747/1239/111 733/1238/111 731/1240/111 +f 748/1241/111 731/1240/111 732/1242/111 +f 762/1243/111 732/1242/111 746/1244/111 +f 761/1245/111 746/1244/111 745/1246/111 +f 760/1247/111 745/1246/111 744/1248/111 +f 759/1249/111 744/1248/111 743/1250/111 +f 758/1251/111 743/1250/111 742/1252/111 +f 741/1223/111 758/1253/111 742/1252/111 +f 764/1254/112 765/1255/112 763/1256/112 +f 769/1257/107 810/1258/107 770/1259/107 +f 765/1255/108 804/1260/108 763/1256/108 +f 766/1261/109 803/1262/109 765/1255/109 +f 763/1256/110 805/1263/110 764/1254/110 +f 764/1254/107 806/1264/107 766/1261/107 +f 802/1265/108 871/1266/108 800/1267/108 +f 799/1268/107 873/1269/107 801/1270/107 +f 787/1271/108 859/1272/108 789/1273/108 +f 789/1273/109 862/1274/109 790/1275/109 +f 788/1276/110 860/1277/110 787/1271/110 +f 793/1278/112 792/1279/112 794/1280/112 +f 777/1281/112 776/1282/112 778/1283/112 +f 772/1284/110 866/1285/110 771/1286/110 +f 773/1287/109 863/1288/109 774/1289/109 +f 771/1286/108 864/1290/108 773/1287/108 +f 783/1291/107 869/1292/107 785/1293/107 +f 786/1294/108 867/1295/108 784/1296/108 +f 784/1296/109 870/1297/109 783/1291/109 +f 785/1298/110 868/1299/110 786/1294/110 +f 780/1300/112 781/1301/112 779/1302/112 +f 774/1289/107 865/1303/107 772/1304/107 +f 800/1267/109 874/1305/109 799/1268/109 +f 801/1306/110 872/1307/110 802/1265/110 +f 796/1308/112 797/1309/112 795/1310/112 +f 790/1275/107 861/1311/107 788/1312/107 +f 768/1313/111 803/1314/111 767/1315/111 +f 769/1316/111 804/1317/111 768/1318/111 +f 770/1259/111 805/1319/111 769/1257/111 +f 767/1320/111 806/1321/111 770/1322/111 +f 807/1323/111 809/1324/111 808/1325/111 +f 767/1315/108 808/1326/108 768/1313/108 +f 770/1322/109 807/1327/109 767/1320/109 +f 768/1318/110 809/1328/110 769/1316/110 +f 813/1329/111 812/1330/111 811/1331/111 +f 816/1332/112 818/1333/112 815/1334/112 +f 812/1330/113 816/1332/113 811/1331/113 +f 813/1335/114 818/1333/114 814/1336/114 +f 821/1337/111 820/1338/111 819/1339/111 +f 824/1340/112 826/1341/112 823/1342/112 +f 820/1338/115 824/1340/115 819/1339/115 +f 821/1343/116 826/1341/116 822/1344/116 +f 828/1345/112 848/1346/112 845/1347/112 +f 857/1348/108 856/1349/108 858/1350/108 +f 846/1351/111 849/1352/111 827/1353/111 +f 854/1354/111 857/1348/111 851/1355/111 +f 849/1352/107 848/1346/107 850/1356/107 +f 838/1357/107 836/1358/107 834/1359/107 +f 852/1360/112 856/1349/112 853/1361/112 +f 835/1362/108 839/1363/108 843/1364/108 +f 792/1365/117 860/1277/117 794/1366/117 +f 794/1367/118 861/1368/118 793/1369/118 +f 793/1278/119 862/1274/119 791/1370/119 +f 791/1371/120 859/1272/120 792/1372/120 +f 775/1373/120 864/1290/120 776/1374/120 +f 777/1281/119 863/1288/119 775/1375/119 +f 778/1376/118 865/1377/118 777/1378/118 +f 776/1379/117 866/1285/117 778/1380/117 +f 781/1381/117 868/1299/117 779/1382/117 +f 779/1383/118 869/1384/118 780/1385/118 +f 780/1300/119 870/1297/119 782/1386/119 +f 782/1387/120 867/1295/120 781/1388/120 +f 797/1389/117 872/1307/117 795/1390/117 +f 795/1391/118 873/1392/118 796/1393/118 +f 796/1308/119 874/1305/119 798/1394/119 +f 798/1395/120 871/1266/120 797/1396/120 +f 876/1397/107 877/1398/107 875/1399/107 +f 881/1400/111 890/1401/111 882/1402/111 +f 878/1403/109 883/1404/109 877/1398/109 +f 875/1399/110 885/1405/110 876/1397/110 +f 876/1397/111 886/1406/111 878/1403/111 +f 877/1398/112 884/1407/112 875/1399/112 +f 880/1408/108 883/1409/108 879/1410/108 +f 881/1411/108 884/1412/108 880/1413/108 +f 882/1402/108 885/1414/108 881/1400/108 +f 879/1415/108 886/1416/108 882/1417/108 +f 879/1410/112 888/1418/112 880/1408/112 +f 882/1417/109 887/1419/109 879/1415/109 +f 880/1413/110 889/1420/110 881/1411/110 +f 892/1421/107 893/1422/107 891/1423/107 +f 897/1424/111 906/1425/111 898/1426/111 +f 894/1427/109 899/1428/109 893/1422/109 +f 891/1423/110 901/1429/110 892/1421/110 +f 892/1421/111 902/1430/111 894/1427/111 +f 893/1422/112 900/1431/112 891/1423/112 +f 896/1432/108 899/1433/108 895/1434/108 +f 897/1435/108 900/1436/108 896/1437/108 +f 898/1426/108 901/1438/108 897/1424/108 +f 895/1439/108 902/1440/108 898/1441/108 +f 895/1434/112 904/1442/112 896/1432/112 +f 898/1441/109 903/1443/109 895/1439/109 +f 896/1437/110 905/1444/110 897/1435/110 +f 908/1445/108 909/1446/108 907/1447/108 +f 913/1448/111 922/1449/111 914/1450/111 +f 910/1451/110 915/1452/110 909/1446/110 +f 907/1447/109 917/1453/109 908/1445/109 +f 908/1445/111 918/1454/111 910/1451/111 +f 909/1446/112 916/1455/112 907/1447/112 +f 912/1456/107 915/1457/107 911/1458/107 +f 913/1459/107 916/1460/107 912/1461/107 +f 914/1450/107 917/1462/107 913/1448/107 +f 911/1463/107 918/1464/107 914/1465/107 +f 911/1458/112 920/1466/112 912/1456/112 +f 914/1465/110 919/1467/110 911/1463/110 +f 912/1461/109 921/1468/109 913/1459/109 +f 924/1469/108 925/1470/108 923/1471/108 +f 929/1472/111 938/1473/111 930/1474/111 +f 926/1475/110 931/1476/110 925/1470/110 +f 923/1471/109 933/1477/109 924/1469/109 +f 924/1469/111 934/1478/111 926/1475/111 +f 925/1470/112 932/1479/112 923/1471/112 +f 928/1480/107 931/1481/107 927/1482/107 +f 929/1483/107 932/1484/107 928/1485/107 +f 930/1474/107 933/1486/107 929/1472/107 +f 927/1487/107 934/1488/107 930/1489/107 +f 927/1482/112 936/1490/112 928/1480/112 +f 930/1489/110 935/1491/110 927/1487/110 +f 928/1485/109 937/1492/109 929/1483/109 +f 940/1493/108 941/1494/108 939/1495/108 +f 945/1496/111 954/1497/111 946/1498/111 +f 942/1499/110 947/1500/110 941/1494/110 +f 939/1495/109 949/1501/109 940/1493/109 +f 940/1493/111 950/1502/111 942/1499/111 +f 941/1494/112 948/1503/112 939/1495/112 +f 944/1504/107 947/1505/107 943/1506/107 +f 945/1507/107 948/1508/107 944/1509/107 +f 946/1498/107 949/1510/107 945/1496/107 +f 943/1511/107 950/1512/107 946/1513/107 +f 943/1506/112 952/1514/112 944/1504/112 +f 946/1513/110 951/1515/110 943/1511/110 +f 944/1509/109 953/1516/109 945/1507/109 +f 956/1517/109 957/1518/109 955/1519/109 +f 961/1520/111 970/1521/111 962/1522/111 +f 958/1523/108 963/1524/108 957/1518/108 +f 955/1519/107 965/1525/107 956/1517/107 +f 956/1517/111 966/1526/111 958/1523/111 +f 957/1518/112 964/1527/112 955/1519/112 +f 960/1528/110 963/1529/110 959/1530/110 +f 961/1531/110 964/1532/110 960/1533/110 +f 962/1522/110 965/1534/110 961/1520/110 +f 959/1535/110 966/1536/110 962/1537/110 +f 959/1530/112 968/1538/112 960/1528/112 +f 962/1537/108 967/1539/108 959/1535/108 +f 960/1533/107 969/1540/107 961/1531/107 +f 972/1541/109 973/1542/109 971/1543/109 +f 977/1544/111 986/1545/111 978/1546/111 +f 974/1547/108 979/1548/108 973/1542/108 +f 971/1543/107 981/1549/107 972/1541/107 +f 972/1541/111 982/1550/111 974/1547/111 +f 973/1542/112 980/1551/112 971/1543/112 +f 976/1552/110 979/1553/110 975/1554/110 +f 977/1555/110 980/1556/110 976/1557/110 +f 978/1546/110 981/1558/110 977/1544/110 +f 975/1559/110 982/1560/110 978/1561/110 +f 975/1554/112 984/1562/112 976/1552/112 +f 978/1561/108 983/1563/108 975/1559/108 +f 976/1557/107 985/1564/107 977/1555/107 +f 988/1565/109 989/1566/109 987/1567/109 +f 993/1568/111 1002/1569/111 994/1570/111 +f 990/1571/108 995/1572/108 989/1566/108 +f 987/1567/107 997/1573/107 988/1565/107 +f 988/1565/111 998/1574/111 990/1571/111 +f 989/1566/112 996/1575/112 987/1567/112 +f 992/1576/110 995/1577/110 991/1578/110 +f 993/1579/110 996/1580/110 992/1581/110 +f 994/1570/110 997/1582/110 993/1568/110 +f 991/1583/110 998/1584/110 994/1585/110 +f 992/1576/112 999/1586/112 1000/1587/112 +f 994/1585/108 999/1588/108 991/1583/108 +f 992/1581/107 1001/1589/107 993/1579/107 +f 1004/1590/110 1005/1591/110 1003/1592/110 +f 1009/1593/111 1018/1594/111 1010/1595/111 +f 1006/1596/107 1011/1597/107 1005/1591/107 +f 1003/1592/108 1013/1598/108 1004/1590/108 +f 1004/1590/111 1014/1599/111 1006/1596/111 +f 1005/1591/112 1012/1600/112 1003/1592/112 +f 1008/1601/109 1011/1602/109 1007/1603/109 +f 1009/1604/109 1012/1605/109 1008/1606/109 +f 1010/1595/109 1013/1607/109 1009/1593/109 +f 1007/1608/109 1014/1609/109 1010/1610/109 +f 1008/1601/112 1015/1611/112 1016/1612/112 +f 1010/1610/107 1015/1613/107 1007/1608/107 +f 1008/1606/108 1017/1614/108 1009/1604/108 +f 1020/1615/110 1021/1616/110 1019/1617/110 +f 1025/1618/111 1034/1619/111 1026/1620/111 +f 1022/1621/107 1027/1622/107 1021/1616/107 +f 1019/1617/108 1029/1623/108 1020/1615/108 +f 1020/1615/111 1030/1624/111 1022/1621/111 +f 1021/1616/112 1028/1625/112 1019/1617/112 +f 1024/1626/109 1027/1627/109 1023/1628/109 +f 1025/1629/109 1028/1630/109 1024/1631/109 +f 1026/1620/109 1029/1632/109 1025/1618/109 +f 1023/1633/109 1030/1634/109 1026/1635/109 +f 1023/1628/112 1032/1636/112 1024/1626/112 +f 1026/1635/107 1031/1637/107 1023/1633/107 +f 1024/1631/108 1033/1638/108 1025/1629/108 +f 1036/1639/110 1037/1640/110 1035/1641/110 +f 1041/1642/111 1050/1643/111 1042/1644/111 +f 1038/1645/107 1043/1646/107 1037/1640/107 +f 1035/1641/108 1045/1647/108 1036/1639/108 +f 1036/1639/111 1046/1648/111 1038/1645/111 +f 1035/1641/112 1043/1649/112 1044/1650/112 +f 1040/1651/109 1043/1649/109 1039/1652/109 +f 1041/1653/109 1044/1654/109 1040/1655/109 +f 1042/1644/109 1045/1656/109 1041/1642/109 +f 1039/1657/109 1046/1658/109 1042/1659/109 +f 1040/1651/112 1047/1660/112 1048/1661/112 +f 1042/1659/107 1047/1662/107 1039/1657/107 +f 1040/1655/108 1049/1663/108 1041/1653/108 +f 574/997/107 571/1053/107 572/998/107 +f 576/1000/108 578/1003/108 577/1001/108 +f 578/1003/109 582/1005/109 581/1004/109 +f 582/1005/107 580/1012/107 579/1006/107 +f 580/1007/110 576/1000/110 575/1002/110 +f 581/1004/111 579/1006/111 575/1009/111 +f 578/1011/112 576/1664/112 580/1012/112 +f 584/1013/108 586/1016/108 585/1014/108 +f 586/1016/109 590/1018/109 589/1017/109 +f 590/1018/107 588/1025/107 587/1019/107 +f 588/1020/110 584/1013/110 583/1015/110 +f 589/1017/111 587/1019/111 583/1022/111 +f 586/1024/112 584/1665/112 588/1025/112 +f 592/1026/108 594/1029/108 593/1027/108 +f 594/1029/109 598/1031/109 597/1030/109 +f 598/1031/107 596/1038/107 595/1032/107 +f 596/1033/110 592/1026/110 591/1028/110 +f 597/1030/111 595/1032/111 591/1035/111 +f 594/1037/112 592/1666/112 596/1038/112 +f 600/1039/108 602/1042/108 601/1040/108 +f 602/1042/109 606/1044/109 605/1043/109 +f 606/1044/107 604/1051/107 603/1045/107 +f 604/1046/110 600/1039/110 599/1041/110 +f 605/1043/111 603/1045/111 599/1048/111 +f 602/1050/112 600/1667/112 604/1051/112 +f 573/999/111 609/1668/111 610/1052/111 +f 571/1053/112 607/1669/112 608/1054/112 +f 610/1052/108 609/1668/108 608/1055/108 +f 614/1057/107 611/1670/107 612/1058/107 +f 613/1059/111 617/1671/111 618/1060/111 +f 611/1061/112 615/1064/112 616/1062/112 +f 618/1060/108 617/1671/108 616/1062/108 +f 622/1065/109 619/1069/109 620/1066/109 +f 621/1067/111 625/1672/111 626/1068/111 +f 619/1069/112 623/1673/112 624/1070/112 +f 626/1068/110 625/1672/110 624/1071/110 +f 630/1073/109 627/1674/109 628/1074/109 +f 629/1075/111 633/1675/111 634/1076/111 +f 627/1077/112 631/1080/112 632/1078/112 +f 634/1076/110 633/1675/110 632/1078/110 +f 636/1081/107 638/1087/107 637/1082/107 +f 641/1084/111 649/1676/111 650/1085/111 +f 638/1087/109 646/1100/109 643/1088/109 +f 635/1083/110 644/1096/110 645/1089/110 +f 636/1081/111 645/1098/111 646/1090/111 +f 637/1082/112 643/1093/112 644/1091/112 +f 640/1092/108 644/1091/108 643/1093/108 +f 641/1095/108 645/1089/108 644/1096/108 +f 642/1086/108 646/1090/108 645/1098/108 +f 639/1099/108 643/1088/108 646/1100/108 +f 639/1094/112 647/1677/112 648/1102/112 +f 642/1101/109 650/1678/109 647/1103/109 +f 640/1097/110 648/1679/110 649/1104/110 +f 653/1105/111 654/1680/111 652/1106/111 +f 657/1108/112 658/1112/112 655/1109/112 +f 653/1111/108 655/1109/108 658/1112/108 +f 652/1106/107 657/1108/107 656/1110/107 +f 654/1114/109 658/1112/109 657/1108/109 +f 651/1116/110 656/1110/110 655/1109/110 +f 661/1118/111 662/1681/111 660/1119/111 +f 665/1121/112 666/1125/112 663/1122/112 +f 661/1124/108 663/1122/108 666/1125/108 +f 660/1119/107 665/1121/107 664/1123/107 +f 662/1127/109 666/1125/109 665/1121/109 +f 659/1129/110 664/1123/110 663/1122/110 +f 669/1131/111 670/1682/111 668/1132/111 +f 673/1134/112 674/1138/112 671/1135/112 +f 669/1137/108 671/1135/108 674/1138/108 +f 668/1132/107 673/1134/107 672/1136/107 +f 670/1140/109 674/1138/109 673/1134/109 +f 667/1142/110 672/1136/110 671/1135/110 +f 675/1144/111 683/1156/111 684/1145/111 +f 681/1147/112 686/1683/112 685/1148/112 +f 676/1146/107 684/1145/107 686/1150/107 +f 677/1152/109 679/1176/109 682/1153/109 +f 676/1146/110 681/1684/110 680/1155/110 +f 685/1148/109 686/1683/109 684/1145/109 +f 680/1157/108 685/1685/108 683/1156/108 +f 688/1158/109 690/1169/109 689/1159/109 +f 694/1161/110 693/1168/110 691/1162/110 +f 689/1164/111 694/1170/111 692/1165/111 +f 687/1167/108 692/1686/108 691/1162/108 +f 688/1158/112 691/1162/112 693/1168/112 +f 690/1169/107 693/1168/107 694/1170/107 +f 697/1171/110 698/1175/110 696/1172/110 +f 677/1174/108 696/1687/108 698/1175/108 +f 679/1176/112 698/1175/112 697/1171/112 +f 678/1177/111 695/1180/111 696/1178/111 +f 682/1153/107 697/1171/107 695/1180/107 +f 708/1181/112 709/1218/112 725/1182/112 +f 707/1184/112 708/1181/112 724/1185/112 +f 706/1187/112 707/1184/112 723/1188/112 +f 705/1190/112 706/1187/112 722/1191/112 +f 704/1193/112 705/1190/112 721/1194/112 +f 703/1196/112 704/1193/112 720/1197/112 +f 703/1199/112 719/1688/112 718/1200/112 +f 702/1201/112 718/1689/112 717/1202/112 +f 701/1203/112 717/1690/112 716/1204/112 +f 700/1205/112 716/1691/112 715/1206/112 +f 699/1207/112 715/1692/112 730/1208/112 +f 714/1209/112 730/1693/112 729/1210/112 +f 713/1211/112 729/1694/112 728/1212/112 +f 712/1213/112 728/1695/112 727/1214/112 +f 711/1215/112 727/1696/112 726/1216/112 +f 709/1218/112 710/1217/112 726/1219/112 +f 740/1221/111 756/1697/111 757/1222/111 +f 739/1224/111 755/1698/111 756/1225/111 +f 738/1226/111 754/1699/111 755/1227/111 +f 737/1228/111 753/1700/111 754/1229/111 +f 736/1230/111 752/1701/111 753/1231/111 +f 735/1232/111 751/1702/111 752/1233/111 +f 750/1234/111 751/1703/111 735/1235/111 +f 749/1237/111 750/1704/111 734/1236/111 +f 747/1239/111 749/1705/111 733/1238/111 +f 748/1241/111 747/1706/111 731/1240/111 +f 762/1243/111 748/1707/111 732/1242/111 +f 761/1245/111 762/1708/111 746/1244/111 +f 760/1247/111 761/1709/111 745/1246/111 +f 759/1249/111 760/1710/111 744/1248/111 +f 758/1251/111 759/1711/111 743/1250/111 +f 741/1223/111 757/1712/111 758/1253/111 +f 764/1254/112 766/1261/112 765/1255/112 +f 769/1257/107 809/1324/107 810/1258/107 +f 765/1255/108 803/1314/108 804/1260/108 +f 766/1261/109 806/1321/109 803/1262/109 +f 763/1256/110 804/1317/110 805/1263/110 +f 764/1254/107 805/1319/107 806/1264/107 +f 802/1265/108 872/1307/108 871/1266/108 +f 799/1268/107 874/1305/107 873/1269/107 +f 787/1271/108 860/1277/108 859/1272/108 +f 789/1273/109 859/1272/109 862/1274/109 +f 788/1276/110 861/1368/110 860/1277/110 +f 793/1278/112 791/1370/112 792/1279/112 +f 777/1281/112 775/1375/112 776/1282/112 +f 772/1284/110 865/1377/110 866/1285/110 +f 773/1287/109 864/1290/109 863/1288/109 +f 771/1286/108 866/1285/108 864/1290/108 +f 783/1291/107 870/1297/107 869/1292/107 +f 786/1294/108 868/1299/108 867/1295/108 +f 784/1296/109 867/1295/109 870/1297/109 +f 785/1298/110 869/1384/110 868/1299/110 +f 780/1300/112 782/1386/112 781/1301/112 +f 774/1289/107 863/1288/107 865/1303/107 +f 800/1267/109 871/1266/109 874/1305/109 +f 801/1306/110 873/1392/110 872/1307/110 +f 796/1308/112 798/1394/112 797/1309/112 +f 790/1275/107 862/1274/107 861/1311/107 +f 768/1313/111 804/1260/111 803/1314/111 +f 769/1316/111 805/1263/111 804/1317/111 +f 770/1259/111 806/1264/111 805/1319/111 +f 767/1320/111 803/1262/111 806/1321/111 +f 807/1323/111 810/1258/111 809/1324/111 +f 767/1315/108 807/1713/108 808/1326/108 +f 770/1322/109 810/1714/109 807/1327/109 +f 768/1318/110 808/1715/110 809/1328/110 +f 813/1329/111 814/1716/111 812/1330/111 +f 816/1332/112 817/1717/112 818/1333/112 +f 812/1330/113 817/1717/113 816/1332/113 +f 813/1335/114 815/1334/114 818/1333/114 +f 821/1337/111 822/1718/111 820/1338/111 +f 824/1340/112 825/1719/112 826/1341/112 +f 820/1338/115 825/1719/115 824/1340/115 +f 821/1343/116 823/1342/116 826/1341/116 +f 828/1345/112 850/1356/112 848/1346/112 +f 857/1348/108 855/1720/108 856/1349/108 +f 846/1351/111 847/1721/111 849/1352/111 +f 854/1354/111 855/1720/111 857/1348/111 +f 849/1352/107 847/1721/107 848/1346/107 +f 834/1359/107 832/1722/107 830/1723/107 +f 830/1723/107 844/1724/107 834/1359/107 +f 844/1724/107 842/1725/107 834/1359/107 +f 842/1725/107 840/1726/107 834/1359/107 +f 840/1726/107 838/1357/107 834/1359/107 +f 852/1360/112 858/1350/112 856/1349/112 +f 843/1364/108 829/1727/108 831/1728/108 +f 831/1728/108 833/1729/108 835/1362/108 +f 835/1362/108 837/1730/108 839/1363/108 +f 839/1363/108 841/1731/108 843/1364/108 +f 843/1364/108 831/1728/108 835/1362/108 +f 792/1365/117 859/1272/117 860/1277/117 +f 794/1367/118 860/1277/118 861/1368/118 +f 793/1278/119 861/1311/119 862/1274/119 +f 791/1371/120 862/1274/120 859/1272/120 +f 775/1373/120 863/1288/120 864/1290/120 +f 777/1281/119 865/1303/119 863/1288/119 +f 778/1376/118 866/1285/118 865/1377/118 +f 776/1379/117 864/1290/117 866/1285/117 +f 781/1381/117 867/1295/117 868/1299/117 +f 779/1383/118 868/1299/118 869/1384/118 +f 780/1300/119 869/1292/119 870/1297/119 +f 782/1387/120 870/1297/120 867/1295/120 +f 797/1389/117 871/1266/117 872/1307/117 +f 795/1391/118 872/1307/118 873/1392/118 +f 796/1308/119 873/1269/119 874/1305/119 +f 798/1395/120 874/1305/120 871/1266/120 +f 876/1397/107 878/1403/107 877/1398/107 +f 881/1400/111 889/1732/111 890/1401/111 +f 878/1403/109 886/1416/109 883/1404/109 +f 875/1399/110 884/1412/110 885/1405/110 +f 876/1397/111 885/1414/111 886/1406/111 +f 877/1398/112 883/1409/112 884/1407/112 +f 880/1408/108 884/1407/108 883/1409/108 +f 881/1411/108 885/1405/108 884/1412/108 +f 882/1402/108 886/1406/108 885/1414/108 +f 879/1415/108 883/1404/108 886/1416/108 +f 879/1410/112 887/1733/112 888/1418/112 +f 882/1417/109 890/1734/109 887/1419/109 +f 880/1413/110 888/1735/110 889/1420/110 +f 892/1421/107 894/1427/107 893/1422/107 +f 897/1424/111 905/1736/111 906/1425/111 +f 894/1427/109 902/1440/109 899/1428/109 +f 891/1423/110 900/1436/110 901/1429/110 +f 892/1421/111 901/1438/111 902/1430/111 +f 893/1422/112 899/1433/112 900/1431/112 +f 896/1432/108 900/1431/108 899/1433/108 +f 897/1435/108 901/1429/108 900/1436/108 +f 898/1426/108 902/1430/108 901/1438/108 +f 895/1439/108 899/1428/108 902/1440/108 +f 895/1434/112 903/1737/112 904/1442/112 +f 898/1441/109 906/1738/109 903/1443/109 +f 896/1437/110 904/1739/110 905/1444/110 +f 908/1445/108 910/1451/108 909/1446/108 +f 913/1448/111 921/1740/111 922/1449/111 +f 910/1451/110 918/1464/110 915/1452/110 +f 907/1447/109 916/1460/109 917/1453/109 +f 908/1445/111 917/1462/111 918/1454/111 +f 909/1446/112 915/1457/112 916/1455/112 +f 912/1456/107 916/1455/107 915/1457/107 +f 913/1459/107 917/1453/107 916/1460/107 +f 914/1450/107 918/1454/107 917/1462/107 +f 911/1463/107 915/1452/107 918/1464/107 +f 911/1458/112 919/1741/112 920/1466/112 +f 914/1465/110 922/1742/110 919/1467/110 +f 912/1461/109 920/1743/109 921/1468/109 +f 924/1469/108 926/1475/108 925/1470/108 +f 929/1472/111 937/1744/111 938/1473/111 +f 926/1475/110 934/1488/110 931/1476/110 +f 923/1471/109 932/1484/109 933/1477/109 +f 924/1469/111 933/1486/111 934/1478/111 +f 925/1470/112 931/1481/112 932/1479/112 +f 928/1480/107 932/1479/107 931/1481/107 +f 929/1483/107 933/1477/107 932/1484/107 +f 930/1474/107 934/1478/107 933/1486/107 +f 927/1487/107 931/1476/107 934/1488/107 +f 927/1482/112 935/1745/112 936/1490/112 +f 930/1489/110 938/1746/110 935/1491/110 +f 928/1485/109 936/1747/109 937/1492/109 +f 940/1493/108 942/1499/108 941/1494/108 +f 945/1496/111 953/1748/111 954/1497/111 +f 942/1499/110 950/1512/110 947/1500/110 +f 939/1495/109 948/1508/109 949/1501/109 +f 940/1493/111 949/1510/111 950/1502/111 +f 941/1494/112 947/1505/112 948/1503/112 +f 944/1504/107 948/1503/107 947/1505/107 +f 945/1507/107 949/1501/107 948/1508/107 +f 946/1498/107 950/1502/107 949/1510/107 +f 943/1511/107 947/1500/107 950/1512/107 +f 943/1506/112 951/1749/112 952/1514/112 +f 946/1513/110 954/1750/110 951/1515/110 +f 944/1509/109 952/1751/109 953/1516/109 +f 956/1517/109 958/1523/109 957/1518/109 +f 961/1520/111 969/1752/111 970/1521/111 +f 958/1523/108 966/1536/108 963/1524/108 +f 955/1519/107 964/1532/107 965/1525/107 +f 956/1517/111 965/1534/111 966/1526/111 +f 957/1518/112 963/1529/112 964/1527/112 +f 960/1528/110 964/1527/110 963/1529/110 +f 961/1531/110 965/1525/110 964/1532/110 +f 962/1522/110 966/1526/110 965/1534/110 +f 959/1535/110 963/1524/110 966/1536/110 +f 959/1530/112 967/1753/112 968/1538/112 +f 962/1537/108 970/1754/108 967/1539/108 +f 960/1533/107 968/1755/107 969/1540/107 +f 972/1541/109 974/1547/109 973/1542/109 +f 977/1544/111 985/1756/111 986/1545/111 +f 974/1547/108 982/1560/108 979/1548/108 +f 971/1543/107 980/1556/107 981/1549/107 +f 972/1541/111 981/1558/111 982/1550/111 +f 973/1542/112 979/1553/112 980/1551/112 +f 976/1552/110 980/1551/110 979/1553/110 +f 977/1555/110 981/1549/110 980/1556/110 +f 978/1546/110 982/1550/110 981/1558/110 +f 975/1559/110 979/1548/110 982/1560/110 +f 975/1554/112 983/1757/112 984/1562/112 +f 978/1561/108 986/1758/108 983/1563/108 +f 976/1557/107 984/1759/107 985/1564/107 +f 988/1565/109 990/1571/109 989/1566/109 +f 993/1568/111 1001/1760/111 1002/1569/111 +f 990/1571/108 998/1584/108 995/1572/108 +f 987/1567/107 996/1580/107 997/1573/107 +f 988/1565/111 997/1582/111 998/1574/111 +f 989/1566/112 995/1577/112 996/1575/112 +f 992/1576/110 996/1575/110 995/1577/110 +f 993/1579/110 997/1573/110 996/1580/110 +f 994/1570/110 998/1574/110 997/1582/110 +f 991/1583/110 995/1572/110 998/1584/110 +f 992/1576/112 991/1578/112 999/1586/112 +f 994/1585/108 1002/1761/108 999/1588/108 +f 992/1581/107 1000/1762/107 1001/1589/107 +f 1004/1590/110 1006/1596/110 1005/1591/110 +f 1009/1593/111 1017/1763/111 1018/1594/111 +f 1006/1596/107 1014/1609/107 1011/1597/107 +f 1003/1592/108 1012/1605/108 1013/1598/108 +f 1004/1590/111 1013/1607/111 1014/1599/111 +f 1005/1591/112 1011/1602/112 1012/1600/112 +f 1008/1601/109 1012/1600/109 1011/1602/109 +f 1009/1604/109 1013/1598/109 1012/1605/109 +f 1010/1595/109 1014/1599/109 1013/1607/109 +f 1007/1608/109 1011/1597/109 1014/1609/109 +f 1008/1601/112 1007/1603/112 1015/1611/112 +f 1010/1610/107 1018/1764/107 1015/1613/107 +f 1008/1606/108 1016/1765/108 1017/1614/108 +f 1020/1615/110 1022/1621/110 1021/1616/110 +f 1025/1618/111 1033/1766/111 1034/1619/111 +f 1022/1621/107 1030/1634/107 1027/1622/107 +f 1019/1617/108 1028/1630/108 1029/1623/108 +f 1020/1615/111 1029/1632/111 1030/1624/111 +f 1021/1616/112 1027/1627/112 1028/1625/112 +f 1024/1626/109 1028/1625/109 1027/1627/109 +f 1025/1629/109 1029/1623/109 1028/1630/109 +f 1026/1620/109 1030/1624/109 1029/1632/109 +f 1023/1633/109 1027/1622/109 1030/1634/109 +f 1023/1628/112 1031/1767/112 1032/1636/112 +f 1026/1635/107 1034/1768/107 1031/1637/107 +f 1024/1631/108 1032/1769/108 1033/1638/108 +f 1036/1639/110 1038/1645/110 1037/1640/110 +f 1041/1642/111 1049/1770/111 1050/1643/111 +f 1038/1645/107 1046/1658/107 1043/1646/107 +f 1035/1641/108 1044/1654/108 1045/1647/108 +f 1036/1639/111 1045/1656/111 1046/1648/111 +f 1035/1641/112 1037/1640/112 1043/1649/112 +f 1040/1651/109 1044/1650/109 1043/1649/109 +f 1041/1653/109 1045/1647/109 1044/1654/109 +f 1042/1644/109 1046/1648/109 1045/1656/109 +f 1039/1657/109 1043/1646/109 1046/1658/109 +f 1040/1651/112 1039/1652/112 1047/1660/112 +f 1042/1659/107 1050/1771/107 1047/1662/107 +f 1040/1655/108 1048/1772/108 1049/1663/108 +s 1 +f 706/1187/121 739/1224/110 707/1184/110 +f 721/1194/115 752/1773/122 720/1195/122 +f 707/1184/110 740/1221/123 708/1181/123 +f 722/1191/124 753/1774/115 721/1192/115 +f 708/1181/123 741/1223/113 709/1218/113 +f 723/1188/109 754/1775/124 722/1189/124 +f 709/1218/113 742/1252/125 710/1217/125 +f 724/1185/126 755/1776/109 723/1186/109 +f 710/1217/125 743/1250/107 711/1215/107 +f 725/1182/114 756/1777/126 724/1183/126 +f 711/1215/107 744/1248/122 712/1213/122 +f 726/1219/127 757/1778/114 725/1220/114 +f 712/1213/122 745/1246/115 713/1211/115 +f 699/1207/109 731/1240/126 700/1205/126 +f 727/1696/108 758/1779/127 726/1216/127 +f 713/1211/115 746/1244/124 714/1209/124 +f 700/1205/126 733/1238/114 701/1203/114 +f 728/1695/128 759/1780/108 727/1214/108 +f 714/1209/124 732/1242/109 699/1207/109 +f 701/1203/114 734/1236/127 702/1201/127 +f 729/1694/116 760/1781/128 728/1212/128 +f 716/1691/123 748/1782/110 715/1206/110 +f 702/1201/127 735/1235/108 703/1199/108 +f 730/1693/121 761/1783/116 729/1210/116 +f 717/1690/113 747/1784/123 716/1204/123 +f 703/1196/108 736/1230/128 704/1193/128 +f 715/1692/110 762/1785/121 730/1208/121 +f 718/1689/125 749/1786/113 717/1202/113 +f 704/1193/128 737/1228/116 705/1190/116 +f 719/1688/107 750/1787/125 718/1200/125 +f 705/1190/116 738/1226/121 706/1187/121 +f 720/1197/122 751/1788/107 719/1198/107 +f 830/1789/109 831/1790/129 829/1791/109 +f 832/1792/129 833/1793/111 831/1790/129 +f 834/1794/111 835/1795/130 833/1796/111 +f 836/1797/130 837/1798/110 835/1795/130 +f 838/1799/110 839/1800/118 837/1798/110 +f 840/1801/118 841/1802/112 839/1800/118 +f 842/1803/112 843/1804/120 841/1802/112 +f 844/1805/120 829/1791/109 843/1804/120 +f 706/1187/121 738/1226/121 739/1224/110 +f 721/1194/115 753/1806/115 752/1773/122 +f 707/1184/110 739/1224/110 740/1221/123 +f 722/1191/124 754/1807/124 753/1774/115 +f 708/1181/123 740/1221/123 741/1223/113 +f 723/1188/109 755/1808/109 754/1775/124 +f 709/1218/113 741/1223/113 742/1252/125 +f 724/1185/126 756/1809/126 755/1776/109 +f 710/1217/125 742/1252/125 743/1250/107 +f 725/1182/114 757/1810/114 756/1777/126 +f 711/1215/107 743/1250/107 744/1248/122 +f 726/1219/127 758/1811/127 757/1778/114 +f 712/1213/122 744/1248/122 745/1246/115 +f 699/1207/109 732/1242/109 731/1240/126 +f 727/1696/108 759/1812/108 758/1779/127 +f 713/1211/115 745/1246/115 746/1244/124 +f 700/1205/126 731/1240/126 733/1238/114 +f 728/1695/128 760/1813/128 759/1780/108 +f 714/1209/124 746/1244/124 732/1242/109 +f 701/1203/114 733/1238/114 734/1236/127 +f 729/1694/116 761/1814/116 760/1781/128 +f 716/1691/123 747/1815/123 748/1782/110 +f 702/1201/127 734/1236/127 735/1235/108 +f 730/1693/121 762/1816/121 761/1783/116 +f 717/1690/113 749/1817/113 747/1784/123 +f 703/1196/108 735/1232/108 736/1230/128 +f 715/1692/110 748/1818/110 762/1785/121 +f 718/1689/125 750/1819/125 749/1786/113 +f 704/1193/128 736/1230/128 737/1228/116 +f 719/1688/107 751/1820/107 750/1787/125 +f 705/1190/116 737/1228/116 738/1226/121 +f 720/1197/122 752/1821/122 751/1788/107 +f 830/1789/109 832/1792/129 831/1790/129 +f 832/1792/129 834/1822/111 833/1793/111 +f 834/1794/111 836/1797/130 835/1795/130 +f 836/1797/130 838/1799/110 837/1798/110 +f 838/1799/110 840/1801/118 839/1800/118 +f 840/1801/118 842/1803/112 841/1802/112 +f 842/1803/112 844/1805/120 843/1804/120 +f 844/1805/120 830/1789/109 829/1791/109 diff --git a/src/main/resources/assets/hbm/models/machines/purex.obj b/src/main/resources/assets/hbm/models/machines/purex.obj new file mode 100644 index 000000000..89faf9165 --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/purex.obj @@ -0,0 +1,8803 @@ +# Blender v2.79 (sub 0) OBJ File: 'purex.blend' +# www.blender.org +o Frame +v 2.375000 5.000000 -2.250000 +v 2.375000 5.000000 2.250000 +v 2.500000 5.000000 -2.250000 +v 2.500000 5.000000 2.250000 +v 2.375000 4.875000 -2.250000 +v 2.375000 4.875000 2.250000 +v 2.500000 4.875000 -2.250000 +v 2.500000 4.875000 2.250000 +v 2.500000 4.750000 2.500000 +v 2.500000 4.750000 2.250000 +v 2.250000 4.750000 2.500000 +v 2.250000 4.750000 2.250000 +v 2.500000 5.000000 2.500000 +v 2.500000 5.000000 2.250000 +v 2.250000 5.000000 2.500000 +v 2.250000 5.000000 2.250000 +v 2.500000 4.750000 -2.250000 +v 2.500000 4.750000 -2.500000 +v 2.250000 4.750000 -2.250000 +v 2.250000 4.750000 -2.500000 +v 2.500000 5.000000 -2.250000 +v 2.500000 5.000000 -2.500000 +v 2.250000 5.000000 -2.250000 +v 2.250000 5.000000 -2.500000 +v -2.250000 4.750000 2.500000 +v -2.250000 4.750000 2.250000 +v -2.500000 4.750000 2.500000 +v -2.500000 4.750000 2.250000 +v -2.250000 5.000000 2.500000 +v -2.250000 5.000000 2.250000 +v -2.500000 5.000000 2.500000 +v -2.500000 5.000000 2.250000 +v -2.250000 4.750000 -2.250000 +v -2.250000 4.750000 -2.500000 +v -2.500000 4.750000 -2.250000 +v -2.500000 4.750000 -2.500000 +v -2.250000 5.000000 -2.250000 +v -2.250000 5.000000 -2.500000 +v -2.500000 5.000000 -2.250000 +v -2.500000 5.000000 -2.500000 +v -2.500000 4.875000 -2.250000 +v -2.500000 4.875000 2.250000 +v -2.375000 4.875000 -2.250000 +v -2.375000 4.875000 2.250000 +v -2.500000 5.000000 -2.250000 +v -2.500000 5.000000 2.250000 +v -2.375000 5.000000 -2.250000 +v -2.375000 5.000000 2.250000 +v 2.250000 4.875000 -2.500000 +v -2.250000 4.875000 -2.500000 +v 2.250000 4.875000 -2.375000 +v -2.250000 4.875000 -2.375000 +v 2.250000 5.000000 -2.500000 +v -2.250000 5.000000 -2.500000 +v 2.250000 5.000000 -2.375000 +v -2.250000 5.000000 -2.375000 +v -2.250000 4.875000 2.500000 +v 2.250000 4.875000 2.500000 +v -2.250000 4.875000 2.375000 +v 2.250000 4.875000 2.375000 +v -2.250000 5.000000 2.500000 +v 2.250000 5.000000 2.500000 +v -2.250000 5.000000 2.375000 +v 2.250000 5.000000 2.375000 +v 2.375000 4.750000 2.500000 +v 2.375000 0.250000 2.500000 +v 2.500000 4.750000 2.500000 +v 2.500000 0.250000 2.500000 +v 2.375000 4.750000 2.375000 +v 2.375000 0.250000 2.375000 +v 2.500000 4.750000 2.375000 +v 2.500000 0.250000 2.375000 +v -2.500000 4.750000 2.375000 +v -2.500000 0.250000 2.375000 +v -2.375000 4.750000 2.375000 +v -2.375000 0.250000 2.375000 +v -2.500000 4.750000 2.500000 +v -2.500000 0.250000 2.500000 +v -2.375000 4.750000 2.500000 +v -2.375000 0.250000 2.500000 +v 2.375000 0.250000 -2.500000 +v 2.375000 4.750000 -2.500000 +v 2.500000 0.250000 -2.500000 +v 2.500000 4.750000 -2.500000 +v 2.375000 0.250000 -2.375000 +v 2.375000 4.750000 -2.375000 +v 2.500000 0.250000 -2.375000 +v 2.500000 4.750000 -2.375000 +v -2.500000 0.250000 -2.375000 +v -2.500000 4.750000 -2.375000 +v -2.375000 0.250000 -2.375000 +v -2.375000 4.750000 -2.375000 +v -2.500000 0.250000 -2.500000 +v -2.500000 4.750000 -2.500000 +v -2.375000 0.250000 -2.500000 +v -2.375000 4.750000 -2.500000 +vt 0.142857 0.247191 +vt 0.154762 0.269663 +vt 0.142857 0.269663 +vt 0.154762 0.292135 +vt 0.142857 0.314607 +vt 0.142857 0.292135 +vt 0.166667 0.269663 +vt 0.190476 0.269663 +vt 0.178571 0.292135 +vt 0.178571 0.269663 +vt 0.166667 0.292135 +vt 0.142857 0.247191 +vt 0.154762 0.269663 +vt 0.142857 0.269663 +vt 0.154762 0.292135 +vt 0.142857 0.314607 +vt 0.142857 0.292135 +vt 0.166667 0.269663 +vt 0.190476 0.269663 +vt 0.178571 0.292135 +vt 0.178571 0.269663 +vt 0.166667 0.292135 +vt 0.142857 0.247191 +vt 0.154762 0.269663 +vt 0.142857 0.269663 +vt 0.154762 0.292135 +vt 0.142857 0.314607 +vt 0.142857 0.292135 +vt 0.166667 0.269663 +vt 0.190476 0.269663 +vt 0.178571 0.292135 +vt 0.178571 0.269663 +vt 0.166667 0.292135 +vt 0.142857 0.247191 +vt 0.154762 0.269663 +vt 0.142857 0.269663 +vt 0.154762 0.292135 +vt 0.142857 0.314607 +vt 0.142857 0.292135 +vt 0.166667 0.269663 +vt 0.190476 0.269663 +vt 0.178571 0.292135 +vt 0.178571 0.269663 +vt 0.166667 0.292135 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.309524 0.505618 +vt 0.309524 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.539326 +vt 0.523810 0.516854 +vt 0.523810 0.528090 +vt 0.309524 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.309524 0.505618 +vt 0.309524 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.539326 +vt 0.523810 0.516854 +vt 0.523810 0.528090 +vt 0.309524 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.309524 0.505618 +vt 0.309524 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.539326 +vt 0.523810 0.516854 +vt 0.523810 0.528090 +vt 0.309524 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.309524 0.505618 +vt 0.309524 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.539326 +vt 0.523810 0.516854 +vt 0.523810 0.528090 +vt 0.309524 0.516854 +vt 0.523810 0.539326 +vt 0.309524 0.528090 +vt 0.523810 0.528090 +vt 0.523810 0.505618 +vt 0.309524 0.494382 +vt 0.523810 0.494382 +vt 0.309524 0.516854 +vt 0.309524 0.505618 +vt 0.523810 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.309524 0.505618 +vt 0.309524 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.539326 +vt 0.523810 0.516854 +vt 0.523810 0.528090 +vt 0.309524 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.309524 0.505618 +vt 0.309524 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.539326 +vt 0.523810 0.516854 +vt 0.523810 0.528090 +vt 0.309524 0.516854 +vt 0.523810 0.539326 +vt 0.309524 0.528090 +vt 0.523810 0.528090 +vt 0.523810 0.505618 +vt 0.309524 0.494382 +vt 0.523810 0.494382 +vt 0.309524 0.516854 +vt 0.309524 0.505618 +vt 0.523810 0.516854 +vt 0.154762 0.247191 +vt 0.154762 0.314607 +vt 0.190476 0.292135 +vt 0.154762 0.247191 +vt 0.154762 0.314607 +vt 0.190476 0.292135 +vt 0.154762 0.247191 +vt 0.154762 0.314607 +vt 0.190476 0.292135 +vt 0.154762 0.247191 +vt 0.154762 0.314607 +vt 0.190476 0.292135 +vt 0.523810 0.494382 +vt 0.523810 0.494382 +vt 0.523810 0.494382 +vt 0.523810 0.494382 +vt 0.309524 0.539326 +vt 0.523810 0.494382 +vt 0.523810 0.494382 +vt 0.309524 0.539326 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +s off +f 11/1/1 10/2/1 9/3/1 +f 14/4/2 15/5/2 13/6/2 +f 12/7/3 14/4/3 10/2/3 +f 10/2/4 13/6/4 9/3/4 +f 9/8/5 15/9/5 11/10/5 +f 11/10/6 16/11/6 12/7/6 +f 19/12/1 18/13/1 17/14/1 +f 22/15/2 23/16/2 21/17/2 +f 20/18/3 22/15/3 18/13/3 +f 18/13/4 21/17/4 17/14/4 +f 17/19/5 23/20/5 19/21/5 +f 19/21/6 24/22/6 20/18/6 +f 27/23/1 26/24/1 25/25/1 +f 30/26/2 31/27/2 29/28/2 +f 28/29/3 30/26/3 26/24/3 +f 26/24/4 29/28/4 25/25/4 +f 25/30/5 31/31/5 27/32/5 +f 27/32/6 32/33/6 28/29/6 +f 35/34/1 34/35/1 33/36/1 +f 38/37/2 39/38/2 37/39/2 +f 36/40/3 38/37/3 34/35/3 +f 34/35/4 37/39/4 33/36/4 +f 33/41/5 39/42/5 35/43/5 +f 35/43/6 40/44/6 36/40/6 +f 6/45/1 7/46/1 8/47/1 +f 2/48/6 5/49/6 6/50/6 +f 3/51/4 8/47/4 7/46/4 +f 1/52/2 4/53/2 3/51/2 +f 43/54/1 42/55/1 41/56/1 +f 47/57/4 44/58/4 43/59/4 +f 46/60/6 41/56/6 42/55/6 +f 48/61/2 45/62/2 46/60/2 +f 51/63/1 50/64/1 49/65/1 +f 55/66/5 52/67/5 51/68/5 +f 54/69/3 49/65/3 50/64/3 +f 56/70/2 53/71/2 54/69/2 +f 59/72/1 58/73/1 57/74/1 +f 63/75/3 60/76/3 59/77/3 +f 62/78/5 57/74/5 58/73/5 +f 64/79/2 61/80/2 62/78/2 +f 70/81/3 71/82/3 72/83/3 +f 66/84/6 69/85/6 70/86/6 +f 67/87/4 72/83/4 71/82/4 +f 65/88/5 68/89/5 67/87/5 +f 75/90/3 74/91/3 73/92/3 +f 79/93/4 76/94/4 75/95/4 +f 78/96/6 73/92/6 74/91/6 +f 80/97/5 77/98/5 78/96/5 +f 86/99/5 87/100/5 88/101/5 +f 82/102/6 85/103/6 86/104/6 +f 83/105/4 88/101/4 87/100/4 +f 81/106/3 84/107/3 83/105/3 +f 91/108/5 90/109/5 89/110/5 +f 95/111/4 92/112/4 91/113/4 +f 94/114/6 89/110/6 90/109/6 +f 96/115/3 93/116/3 94/114/3 +f 11/1/1 12/117/1 10/2/1 +f 14/4/2 16/118/2 15/5/2 +f 12/7/3 16/11/3 14/4/3 +f 10/2/4 14/4/4 13/6/4 +f 9/8/5 13/119/5 15/9/5 +f 11/10/6 15/9/6 16/11/6 +f 19/12/1 20/120/1 18/13/1 +f 22/15/2 24/121/2 23/16/2 +f 20/18/3 24/22/3 22/15/3 +f 18/13/4 22/15/4 21/17/4 +f 17/19/5 21/122/5 23/20/5 +f 19/21/6 23/20/6 24/22/6 +f 27/23/1 28/123/1 26/24/1 +f 30/26/2 32/124/2 31/27/2 +f 28/29/3 32/33/3 30/26/3 +f 26/24/4 30/26/4 29/28/4 +f 25/30/5 29/125/5 31/31/5 +f 27/32/6 31/31/6 32/33/6 +f 35/34/1 36/126/1 34/35/1 +f 38/37/2 40/127/2 39/38/2 +f 36/40/3 40/44/3 38/37/3 +f 34/35/4 38/37/4 37/39/4 +f 33/41/5 37/128/5 39/42/5 +f 35/43/6 39/42/6 40/44/6 +f 6/45/1 5/129/1 7/46/1 +f 2/48/6 1/52/6 5/49/6 +f 3/51/4 4/53/4 8/47/4 +f 1/52/2 2/48/2 4/53/2 +f 43/54/1 44/130/1 42/55/1 +f 47/57/4 48/61/4 44/58/4 +f 46/60/6 45/62/6 41/56/6 +f 48/61/2 47/57/2 45/62/2 +f 51/63/1 52/131/1 50/64/1 +f 55/66/5 56/70/5 52/67/5 +f 54/69/3 53/71/3 49/65/3 +f 56/70/2 55/66/2 53/71/2 +f 59/72/1 60/132/1 58/73/1 +f 63/75/3 64/79/3 60/76/3 +f 62/78/5 61/80/5 57/74/5 +f 64/79/2 63/75/2 61/80/2 +f 70/81/3 69/133/3 71/82/3 +f 66/84/6 65/88/6 69/85/6 +f 67/87/4 68/89/4 72/83/4 +f 65/88/5 66/84/5 68/89/5 +f 75/90/3 76/134/3 74/91/3 +f 79/93/4 80/97/4 76/94/4 +f 78/96/6 77/98/6 73/92/6 +f 80/97/5 79/93/5 77/98/5 +f 86/99/5 85/135/5 87/100/5 +f 82/102/6 81/106/6 85/103/6 +f 83/105/4 84/107/4 88/101/4 +f 81/106/3 82/102/3 84/107/3 +f 91/108/5 92/136/5 90/109/5 +f 95/111/4 96/115/4 92/112/4 +f 94/114/6 93/116/6 89/110/6 +f 96/115/3 95/111/3 93/116/3 +o Fan +v 1.500000 1.312500 2.250000 +v 1.445873 1.281250 2.250000 +v 1.445873 1.218750 2.250000 +v 1.500000 1.187500 2.250000 +v 1.554127 1.218750 2.250000 +v 1.554127 1.281250 2.250000 +v 1.500000 1.312500 2.374999 +v 1.445873 1.281250 2.374999 +v 1.445873 1.218750 2.374999 +v 1.500000 1.187500 2.374999 +v 1.554127 1.218750 2.374999 +v 1.554127 1.281250 2.374999 +v 1.499078 1.311968 2.305412 +v 1.446796 1.281783 2.321589 +v 1.462713 1.540972 2.283170 +v 1.266654 1.427778 2.343830 +v 1.554127 1.219815 2.305412 +v 1.554127 1.280185 2.321589 +v 1.462713 0.959028 2.343830 +v 1.266654 1.072222 2.283170 +v 1.499078 1.188032 2.321589 +v 1.446795 1.218218 2.305412 +v 1.770633 1.136806 2.283170 +v 1.770633 1.363194 2.343830 +vt 0.309524 0.910112 +vt 0.306548 0.921348 +vt 0.306548 0.910112 +vt 0.321429 0.910112 +vt 0.318452 0.921348 +vt 0.318452 0.910112 +vt 0.315476 0.910112 +vt 0.312500 0.921348 +vt 0.312500 0.910112 +vt 0.309524 0.921348 +vt 0.303571 0.921348 +vt 0.303571 0.910112 +vt 0.315476 0.921348 +vt 0.309083 0.929729 +vt 0.306548 0.932492 +vt 0.304012 0.924203 +vt 0.291667 0.915730 +vt 0.303571 0.932584 +vt 0.291667 0.926966 +vt 0.291667 0.915730 +vt 0.303571 0.932584 +vt 0.291667 0.926966 +vt 0.303571 0.910112 +vt 0.291667 0.926966 +vt 0.291667 0.915730 +vt 0.321429 0.921348 +vt 0.304012 0.929729 +vt 0.306548 0.921440 +vt 0.309083 0.924203 +vt 0.303571 0.910112 +vt 0.303571 0.910112 +vt 0.303571 0.932584 +vn 1.0000 0.0000 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn -1.0000 -0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -0.2588 0.9659 +vn -0.2241 0.1294 0.9659 +vn 0.2241 0.1294 0.9659 +s off +f 102/137/7 107/138/7 101/139/7 +f 100/140/8 105/141/8 99/142/8 +f 98/143/9 103/144/9 97/145/9 +f 97/145/10 108/146/10 102/137/10 +f 101/139/11 106/147/11 100/148/11 +f 99/142/12 104/149/12 98/143/12 +f 108/150/13 103/151/13 105/152/13 +f 113/153/14 120/154/14 114/155/14 +f 118/156/15 115/157/15 117/158/15 +f 111/159/16 110/160/16 109/161/16 +f 102/137/7 108/146/7 107/138/7 +f 100/140/8 106/162/8 105/141/8 +f 98/143/9 104/149/9 103/144/9 +f 97/145/10 103/144/10 108/146/10 +f 101/139/11 107/138/11 106/147/11 +f 99/142/12 105/141/12 104/149/12 +f 103/151/13 104/163/13 105/152/13 +f 105/152/13 106/164/13 107/165/13 +f 107/165/13 108/150/13 105/152/13 +f 113/153/14 119/166/14 120/154/14 +f 118/156/15 116/167/15 115/157/15 +f 111/159/16 112/168/16 110/160/16 +o Pump +v -0.250000 1.875000 -1.500000 +v -0.250000 1.941987 -1.250000 +v -0.250000 2.125000 -1.066987 +v -0.250000 2.375000 -1.000000 +v -0.250000 2.625000 -1.066987 +v -0.250000 2.808013 -1.250000 +v -0.250000 2.875000 -1.500000 +v -0.250000 2.808013 -1.750000 +v -0.250000 2.625000 -1.933012 +v -0.250000 2.375000 -2.000000 +v -0.250000 1.941987 -1.750000 +v -0.250000 2.125000 -1.933012 +v -0.250000 1.625000 -1.500000 +v -0.250000 1.725481 -1.125000 +v -0.250000 2.000000 -0.850481 +v -0.250000 2.375000 -0.750000 +v -0.250000 2.750000 -0.850481 +v -0.250000 3.024519 -1.125000 +v -0.250000 3.125000 -1.500000 +v -0.250000 3.024519 -1.875000 +v -0.250000 2.750000 -2.149519 +v -0.250000 2.375000 -2.250000 +v -0.250000 1.725481 -1.875000 +v -0.250000 2.000000 -2.149519 +v 0.250000 2.000000 -2.149519 +v 0.250000 1.725481 -1.875000 +v 0.250000 2.375000 -2.250000 +v 0.250000 2.750000 -2.149519 +v 0.250000 3.024519 -1.875000 +v 0.250000 3.125000 -1.500000 +v 0.250000 3.024519 -1.125000 +v 0.250000 2.750000 -0.850481 +v 0.250000 2.375000 -0.750000 +v 0.250000 2.000000 -0.850481 +v 0.250000 1.725481 -1.125000 +v 0.250000 1.625000 -1.500000 +v 0.250000 2.125000 -1.933012 +v 0.250000 1.941987 -1.750000 +v 0.250000 2.375000 -2.000000 +v 0.250000 2.625000 -1.933012 +v 0.250000 2.808013 -1.750000 +v 0.250000 2.875000 -1.500000 +v 0.250000 2.808013 -1.250000 +v 0.250000 2.625000 -1.066987 +v 0.250000 2.375000 -1.000000 +v 0.250000 2.125000 -1.066987 +v 0.250000 1.941987 -1.250000 +v 0.250000 1.875000 -1.500000 +vt 0.452381 0.578652 +vt 0.440476 0.606742 +vt 0.440476 0.573034 +vt 0.452381 0.544944 +vt 0.440476 0.539326 +vt 0.452381 0.915730 +vt 0.440476 0.943820 +vt 0.440476 0.910112 +vt 0.452381 0.882023 +vt 0.440476 0.876405 +vt 0.440476 0.842697 +vt 0.452381 0.870786 +vt 0.416667 0.606742 +vt 0.404762 0.634831 +vt 0.404762 0.612360 +vt 0.416667 0.674157 +vt 0.404762 0.646067 +vt 0.416667 0.640449 +vt 0.416667 0.707865 +vt 0.404762 0.679775 +vt 0.416667 0.741573 +vt 0.404762 0.713483 +vt 0.416667 0.775281 +vt 0.404762 0.747191 +vt 0.404762 0.803371 +vt 0.404762 0.780899 +vt 0.416667 0.808989 +vt 0.404762 0.837079 +vt 0.404762 0.814607 +vt 0.416667 0.842697 +vt 0.404762 0.870786 +vt 0.404762 0.848315 +vt 0.416667 0.876405 +vt 0.404762 0.904494 +vt 0.404762 0.882023 +vt 0.416667 0.943820 +vt 0.404762 0.915730 +vt 0.416667 0.910112 +vt 0.416667 0.573034 +vt 0.404762 0.544944 +vt 0.416667 0.539326 +vt 0.404762 0.578652 +vt 0.440476 0.808989 +vt 0.452381 0.837079 +vt 0.440476 0.775281 +vt 0.452381 0.803371 +vt 0.452381 0.747191 +vt 0.440476 0.741573 +vt 0.452381 0.713483 +vt 0.440476 0.707865 +vt 0.452381 0.679775 +vt 0.440476 0.674157 +vt 0.452381 0.646067 +vt 0.440476 0.640449 +vt 0.452381 0.634831 +vt 0.452381 0.601124 +vt 0.452381 0.567416 +vt 0.452381 0.938202 +vt 0.452381 0.904494 +vt 0.452381 0.848315 +vt 0.404762 0.668539 +vt 0.404762 0.702247 +vt 0.404762 0.735955 +vt 0.404762 0.769663 +vt 0.404762 0.938202 +vt 0.404762 0.567416 +vt 0.404762 0.601124 +vt 0.452381 0.814607 +vt 0.452381 0.780899 +vt 0.452381 0.769663 +vt 0.452381 0.735955 +vt 0.452381 0.702247 +vt 0.452381 0.668539 +vt 0.452381 0.612360 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -0.5000 -0.8660 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +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.0000 1.0000 -0.0000 +vn 0.0000 0.8660 -0.5000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.5000 -0.8660 +vn 0.0000 -0.8660 0.5000 +s off +f 131/169/17 144/170/17 143/171/17 +f 121/172/17 143/171/17 133/173/17 +f 122/174/17 133/175/17 134/176/17 +f 123/177/17 134/176/17 135/178/17 +f 136/179/17 123/180/17 135/178/17 +f 145/181/18 159/182/18 157/183/18 +f 148/184/18 159/185/18 147/186/18 +f 149/187/18 160/188/18 148/184/18 +f 150/189/18 161/190/18 149/187/18 +f 151/191/18 162/192/18 150/189/18 +f 151/191/18 164/193/18 163/194/18 +f 152/195/18 165/196/18 164/197/18 +f 153/198/18 166/199/18 165/200/18 +f 154/201/18 167/202/18 166/203/18 +f 156/204/18 167/205/18 155/206/18 +f 146/207/18 168/208/18 156/209/18 +f 145/181/18 158/210/18 146/207/18 +f 137/211/17 124/212/17 136/179/17 +f 138/213/17 125/214/17 137/211/17 +f 127/215/17 138/213/17 139/216/17 +f 128/217/17 139/216/17 140/218/17 +f 129/219/17 140/218/17 141/220/17 +f 130/221/17 141/220/17 142/222/17 +f 144/170/17 130/223/17 142/222/17 +f 131/169/17 132/224/17 144/170/17 +f 121/172/17 131/225/17 143/171/17 +f 122/174/17 121/226/17 133/175/17 +f 123/177/17 122/227/17 134/176/17 +f 136/179/17 124/228/17 123/180/17 +f 145/181/18 147/186/18 159/182/18 +f 148/184/18 160/229/18 159/185/18 +f 149/187/18 161/230/18 160/188/18 +f 150/189/18 162/231/18 161/190/18 +f 151/191/18 163/232/18 162/192/18 +f 151/191/18 152/195/18 164/193/18 +f 152/195/18 153/198/18 165/196/18 +f 153/198/18 154/201/18 166/199/18 +f 154/201/18 155/206/18 167/202/18 +f 156/204/18 168/233/18 167/205/18 +f 146/207/18 158/234/18 168/208/18 +f 145/181/18 157/235/18 158/210/18 +f 137/211/17 125/236/17 124/212/17 +f 138/213/17 126/237/17 125/214/17 +f 127/215/17 126/238/17 138/213/17 +f 128/217/17 127/239/17 139/216/17 +f 129/219/17 128/240/17 140/218/17 +f 130/221/17 129/241/17 141/220/17 +f 144/170/17 132/242/17 130/223/17 +s 1 +f 145/181/19 142/222/20 147/186/20 +f 153/198/21 135/178/22 154/201/22 +f 146/207/23 144/170/19 145/181/19 +f 152/195/24 136/179/21 153/198/21 +f 151/191/25 137/211/24 152/195/24 +f 150/189/26 138/213/25 151/191/25 +f 149/187/27 139/216/26 150/189/26 +f 156/209/28 143/171/23 146/207/23 +f 148/184/29 140/218/27 149/187/27 +f 155/206/30 133/175/28 156/204/28 +f 147/186/20 141/220/29 148/184/29 +f 154/201/22 134/176/30 155/206/30 +f 145/181/19 144/170/19 142/222/20 +f 153/198/21 136/179/21 135/178/22 +f 146/207/23 143/171/23 144/170/19 +f 152/195/24 137/211/24 136/179/21 +f 151/191/25 138/213/25 137/211/24 +f 150/189/26 139/216/26 138/213/25 +f 149/187/27 140/218/27 139/216/26 +f 156/209/28 133/173/28 143/171/23 +f 148/184/29 141/220/29 140/218/27 +f 155/206/30 134/176/30 133/175/28 +f 147/186/20 142/222/20 141/220/29 +f 154/201/22 135/178/22 134/176/30 +o Base +v 2.500000 0.000000 2.500000 +v 2.500000 0.000000 2.250000 +v 2.250000 0.000000 2.500000 +v 2.250000 0.000000 2.250000 +v 2.500000 0.250000 2.500000 +v 2.500000 0.250000 2.250000 +v 2.250000 0.250000 2.500000 +v 2.250000 0.250000 2.250000 +v 2.500000 0.000000 -2.250000 +v 2.500000 0.000000 -2.500000 +v 2.250000 0.000000 -2.250000 +v 2.250000 0.000000 -2.500000 +v 2.500000 0.250000 -2.250000 +v 2.500000 0.250000 -2.500000 +v 2.250000 0.250000 -2.250000 +v 2.250000 0.250000 -2.500000 +v -2.250000 0.000000 2.500000 +v -2.250000 0.000000 2.250000 +v -2.500000 0.000000 2.500000 +v -2.500000 0.000000 2.250000 +v -2.250000 0.250000 2.500000 +v -2.250000 0.250000 2.250000 +v -2.500000 0.250000 2.500000 +v -2.500000 0.250000 2.250000 +v -2.250000 0.000000 -2.250000 +v -2.250000 0.000000 -2.500000 +v -2.500000 0.000000 -2.250000 +v -2.500000 0.000000 -2.500000 +v -2.250000 0.250000 -2.250000 +v -2.250000 0.250000 -2.500000 +v -2.500000 0.250000 -2.250000 +v -2.500000 0.250000 -2.500000 +v 2.500000 0.000000 2.250000 +v 2.500000 0.000000 -2.250000 +v 2.375000 0.000000 2.250000 +v 2.375000 0.000000 -2.250000 +v 2.500000 0.125000 2.250000 +v 2.500000 0.125000 -2.250000 +v 2.375000 0.125000 2.250000 +v 2.375000 0.125000 -2.250000 +v -2.500000 0.000000 -2.250000 +v -2.500000 0.000000 2.250000 +v -2.375000 0.000000 -2.250000 +v -2.375000 0.000000 2.250000 +v -2.500000 0.125000 -2.250000 +v -2.500000 0.125000 2.250000 +v -2.375000 0.125000 -2.250000 +v -2.375000 0.125000 2.250000 +v 2.250000 0.000000 -2.500000 +v -2.250000 0.000000 -2.500000 +v 2.250000 0.000000 -2.375000 +v -2.250000 0.000000 -2.375000 +v 2.250000 0.125000 -2.500000 +v -2.250000 0.125000 -2.500000 +v 2.250000 0.125000 -2.375000 +v -2.250000 0.125000 -2.375000 +v -2.250000 0.000000 2.500000 +v 2.250000 0.000000 2.500000 +v -2.250000 0.000000 2.375000 +v 2.250000 0.000000 2.375000 +v -2.250000 0.125000 2.500000 +v 2.250000 0.125000 2.500000 +v -2.250000 0.125000 2.375000 +v 2.250000 0.125000 2.375000 +v 1.875000 0.125000 2.500000 +v 2.125000 0.125000 2.500000 +v 1.875000 0.125000 -2.500000 +v 2.125000 0.125000 -2.500000 +v 1.875000 0.250000 -2.500000 +v 1.875000 0.250000 2.500000 +v 2.125000 0.250000 2.500000 +v 2.125000 0.250000 -2.500000 +v -2.250000 0.250000 2.250000 +v 0.250000 0.250000 2.250000 +v -2.250000 0.250000 -0.250000 +v 0.250000 0.250000 -0.250000 +v -2.250000 0.750000 -0.250000 +v -2.250000 0.750000 2.250000 +v 0.250000 0.750000 2.250000 +v 0.250000 0.750000 -0.250000 +v 0.750000 0.250000 2.250000 +v 0.750000 0.250000 -0.250000 +v 0.750000 0.750000 2.250000 +v 0.750000 0.750000 -0.250000 +v 2.250000 0.250000 2.250000 +v 2.250000 0.250000 -0.250000 +v 2.250000 0.750000 2.250000 +v 2.250000 0.750000 -0.250000 +v -2.250000 0.250000 -0.750000 +v -2.000000 0.750000 -1.000000 +v 2.250000 0.250000 -0.750000 +v 2.000000 0.750000 -1.000000 +v -2.000000 0.750000 -2.000000 +v -2.250000 0.250000 -2.250000 +v 2.250000 0.250000 -2.250000 +v 2.000000 0.750000 -2.000000 +v -1.750000 0.750000 1.000000 +v -2.125000 0.750000 1.100481 +v -2.399519 0.750000 1.375000 +v -2.500000 0.750000 1.750000 +v -2.399519 0.750000 2.125000 +v -2.125000 0.750000 2.399519 +v -1.750000 0.750000 2.500000 +v -1.375000 0.750000 2.399519 +v -1.100481 0.750000 2.125000 +v -1.000000 0.750000 1.750000 +v -1.100481 0.750000 1.375000 +v -1.375000 0.750000 1.100481 +v -2.125000 3.750000 1.100481 +v -1.750000 3.750000 1.000000 +v -2.399519 3.750000 1.375000 +v -2.500000 3.750000 1.750000 +v -2.399519 3.750000 2.125000 +v -2.125000 3.750000 2.399519 +v -1.750000 3.750000 2.500000 +v -1.375000 3.750000 2.399519 +v -1.100481 3.750000 2.125000 +v -1.000000 3.750000 1.750000 +v -1.100481 3.750000 1.375000 +v -1.375000 3.750000 1.100481 +v -1.750000 0.750000 -0.500000 +v -2.125000 0.750000 -0.399519 +v -2.399519 0.750000 -0.125000 +v -2.500000 0.750000 0.250000 +v -2.399519 0.750000 0.625000 +v -2.125000 0.750000 0.899519 +v -1.750000 0.750000 1.000000 +v -1.375000 0.750000 0.899519 +v -1.100481 0.750000 0.625000 +v -1.000000 0.750000 0.250000 +v -1.100481 0.750000 -0.125000 +v -1.375000 0.750000 -0.399519 +v -2.125000 3.750000 -0.399519 +v -1.750000 3.750000 -0.500000 +v -2.399519 3.750000 -0.125000 +v -2.500000 3.750000 0.250000 +v -2.399519 3.750000 0.625000 +v -2.125000 3.750000 0.899519 +v -1.750000 3.750000 1.000000 +v -1.375000 3.750000 0.899519 +v -1.100481 3.750000 0.625000 +v -1.000000 3.750000 0.250000 +v -1.100481 3.750000 -0.125000 +v -1.375000 3.750000 -0.399519 +v -0.250000 0.750000 1.000000 +v -0.625000 0.750000 1.100481 +v -0.899519 0.750000 1.375000 +v -1.000000 0.750000 1.750000 +v -0.899519 0.750000 2.125000 +v -0.625000 0.750000 2.399519 +v -0.250000 0.750000 2.500000 +v 0.125000 0.750000 2.399519 +v 0.399519 0.750000 2.125000 +v 0.500000 0.750000 1.750000 +v 0.399519 0.750000 1.375000 +v 0.125000 0.750000 1.100481 +v -0.625000 3.750000 1.100481 +v -0.250000 3.750000 1.000000 +v -0.899519 3.750000 1.375000 +v -1.000000 3.750000 1.750000 +v -0.899519 3.750000 2.125000 +v -0.625000 3.750000 2.399519 +v -0.250000 3.750000 2.500000 +v 0.125000 3.750000 2.399519 +v 0.399519 3.750000 2.125000 +v 0.500000 3.750000 1.750000 +v 0.399519 3.750000 1.375000 +v 0.125001 3.750000 1.100481 +v -0.250000 0.750000 -0.500000 +v -0.625000 0.750000 -0.399519 +v -0.899519 0.750000 -0.125000 +v -1.000000 0.750000 0.250000 +v -0.899519 0.750000 0.625000 +v -0.625000 0.750000 0.899519 +v -0.250000 0.750000 1.000000 +v 0.125000 0.750000 0.899519 +v 0.399519 0.750000 0.625000 +v 0.500000 0.750000 0.250000 +v 0.399519 0.750000 -0.125000 +v 0.125000 0.750000 -0.399519 +v -0.625000 3.750000 -0.399519 +v -0.250000 3.750000 -0.500000 +v -0.899519 3.750000 -0.125000 +v -1.000000 3.750000 0.250000 +v -0.899519 3.750000 0.625000 +v -0.625000 3.750000 0.899519 +v -0.250000 3.750000 1.000000 +v 0.125000 3.750000 0.899519 +v 0.399519 3.750000 0.625000 +v 0.500000 3.750000 0.250000 +v 0.399519 3.750000 -0.125000 +v 0.125001 3.750000 -0.399519 +v 1.000000 0.750000 2.250000 +v 1.000000 0.750000 -0.250000 +v 2.000000 0.750000 2.250000 +v 2.000000 0.750000 -0.250000 +v 1.000000 1.750000 2.250000 +v 1.000000 1.750000 -0.250000 +v 2.000000 1.750000 2.250000 +v 2.000000 1.750000 -0.250000 +v 1.125000 0.875000 2.250000 +v 1.875000 0.875000 2.250000 +v 1.125000 1.625000 2.250000 +v 1.875000 1.625000 2.250000 +v 1.187500 0.937500 2.375000 +v 1.812500 0.937500 2.375000 +v 1.187500 1.562500 2.375000 +v 1.812500 1.562500 2.375000 +v 1.125000 0.875000 2.375000 +v 1.875000 0.875000 2.375000 +v 1.125000 1.625000 2.375000 +v 1.875000 1.625000 2.375000 +v 1.187500 0.937500 2.250000 +v 1.812500 0.937500 2.250000 +v 1.187500 1.562500 2.250000 +v 1.812500 1.562500 2.250000 +v -0.250000 3.750000 1.750000 +v -0.338388 3.750000 1.786612 +v -0.375000 3.750000 1.875000 +v -0.338388 3.750000 1.963388 +v -0.250000 3.750000 2.000000 +v -0.161611 3.750000 1.963388 +v -0.125000 3.750000 1.875000 +v -0.161611 3.750000 1.786612 +v -0.250000 4.000000 1.750000 +v -0.338388 4.000000 1.786612 +v -0.375000 4.000000 1.875000 +v -0.338388 4.000000 1.963388 +v -0.250000 4.000000 2.000000 +v -0.161611 4.000000 1.963388 +v -0.125000 4.000000 1.875000 +v -0.161611 4.000000 1.786612 +v -0.213388 4.088388 1.750000 +v -0.275888 4.150888 1.786612 +v -0.301776 4.176777 1.875000 +v -0.275888 4.150888 1.963388 +v -0.213388 4.088388 2.000000 +v -0.150888 4.025888 1.963388 +v -0.150888 4.025888 1.786612 +v -0.125000 4.125000 1.750000 +v -0.125000 4.213388 1.786612 +v -0.125000 4.250000 1.875000 +v -0.125000 4.213388 1.963388 +v -0.125000 4.125000 2.000000 +v -0.125000 4.036612 1.963388 +v -0.125000 4.036612 1.786612 +v 1.250000 1.750000 2.000000 +v 1.338388 1.750000 1.963388 +v 1.375000 1.750000 1.875000 +v 1.338388 1.750000 1.786612 +v 1.250000 1.750000 1.750000 +v 1.161612 1.750000 1.786612 +v 1.125000 1.750000 1.875000 +v 1.161612 1.750000 1.963388 +v 1.250000 4.000000 2.000000 +v 1.338388 4.000000 1.963388 +v 1.375000 4.000000 1.875000 +v 1.338388 4.000000 1.786612 +v 1.250000 4.000000 1.750000 +v 1.161612 4.000000 1.786612 +v 1.125000 4.000000 1.875000 +v 1.161612 4.000000 1.963388 +v 1.213388 4.088388 2.000000 +v 1.275888 4.150888 1.963388 +v 1.301777 4.176777 1.875000 +v 1.275888 4.150888 1.786612 +v 1.213388 4.088388 1.750000 +v 1.150888 4.025888 1.786612 +v 1.150888 4.025888 1.963388 +v 1.125000 4.125000 2.000000 +v 1.125000 4.213388 1.963388 +v 1.125000 4.250000 1.875000 +v 1.125000 4.213388 1.786612 +v 1.125000 4.125000 1.750000 +v 1.125000 4.036612 1.786612 +v 1.125000 4.036612 1.963388 +v -1.750000 3.750000 1.750000 +v -1.838388 3.750000 1.786612 +v -1.875000 3.750000 1.875000 +v -1.838388 3.750000 1.963388 +v -1.750000 3.750000 2.000000 +v -1.661611 3.750000 1.963388 +v -1.625000 3.750000 1.875000 +v -1.661611 3.750000 1.786612 +v -1.750000 4.250000 1.750000 +v -1.838388 4.250000 1.786612 +v -1.875000 4.250000 1.875000 +v -1.838388 4.250000 1.963388 +v -1.750000 4.250000 2.000000 +v -1.661611 4.250000 1.963388 +v -1.625000 4.250000 1.875000 +v -1.661611 4.250000 1.786612 +v -1.713388 4.338388 1.750000 +v -1.775888 4.400888 1.786612 +v -1.801777 4.426777 1.875000 +v -1.775888 4.400888 1.963388 +v -1.713388 4.338388 2.000000 +v -1.650888 4.275888 1.963388 +v -1.650888 4.275888 1.786612 +v -1.625000 4.375000 1.750000 +v -1.625000 4.463388 1.786612 +v -1.625000 4.500000 1.875000 +v -1.625000 4.463388 1.963388 +v -1.625000 4.375000 2.000000 +v -1.625000 4.286612 1.963388 +v -1.625000 4.286612 1.786612 +v 1.750000 1.750000 2.000000 +v 1.838388 1.750000 1.963388 +v 1.875000 1.750000 1.875000 +v 1.838388 1.750000 1.786612 +v 1.750000 1.750000 1.750000 +v 1.661612 1.750000 1.786612 +v 1.625000 1.750000 1.875000 +v 1.661612 1.750000 1.963388 +v 1.750000 4.250000 2.000000 +v 1.838388 4.250000 1.963388 +v 1.875000 4.250000 1.875000 +v 1.838388 4.250000 1.786612 +v 1.750000 4.250000 1.750000 +v 1.661612 4.250000 1.786612 +v 1.625000 4.250000 1.875000 +v 1.661612 4.250000 1.963388 +v 1.713388 4.338388 2.000000 +v 1.775888 4.400888 1.963388 +v 1.801777 4.426777 1.875000 +v 1.775888 4.400888 1.786612 +v 1.713388 4.338388 1.750000 +v 1.650888 4.275888 1.786612 +v 1.650888 4.275888 1.963388 +v 1.625000 4.375000 2.000000 +v 1.625000 4.463388 1.963388 +v 1.625000 4.500000 1.875000 +v 1.625000 4.463388 1.786612 +v 1.625000 4.375000 1.750000 +v 1.625000 4.286612 1.786612 +v 1.625000 4.286612 1.963388 +v 1.875000 2.125000 1.750000 +v 1.875000 2.213388 1.786612 +v 1.875000 2.250000 1.875000 +v 1.875000 2.213388 1.963388 +v 1.875000 2.125000 2.000000 +v 1.875000 2.036612 1.963388 +v 1.875000 2.000000 1.875000 +v 1.875000 2.036612 1.786612 +v 1.937500 2.213388 1.786612 +v 1.937500 2.125000 1.750000 +v 1.937500 2.250000 1.875000 +v 1.937500 2.213388 1.963388 +v 1.937500 2.125000 2.000000 +v 1.937500 2.036612 1.963388 +v 1.937500 2.000000 1.875000 +v 1.937500 2.036612 1.786612 +v 1.125000 2.750000 2.000000 +v 1.875000 2.750000 2.000000 +v 1.125000 2.750000 1.500000 +v 1.875000 2.750000 1.500000 +v 1.125000 3.250000 1.500000 +v 1.125000 3.250000 2.000000 +v 1.875000 3.250000 2.000000 +v 1.875000 3.250000 1.500000 +v 1.187500 1.500000 2.375000 +v 1.812500 1.500000 2.375000 +v 1.187500 1.437500 2.375000 +v 1.812500 1.437500 2.375000 +v 1.187500 1.375000 2.375000 +v 1.812500 1.375000 2.375000 +v 1.187500 1.312500 2.375000 +v 1.812500 1.312500 2.375000 +v 1.187500 1.187500 2.375000 +v 1.812500 1.187500 2.375000 +v 1.187500 1.125000 2.375000 +v 1.812500 1.125000 2.375000 +v 1.187500 1.062500 2.375000 +v 1.812500 1.062500 2.375000 +v 1.187500 1.000000 2.375000 +v 1.812500 1.000000 2.375000 +v 2.500000 0.687500 0.187500 +v 2.500000 0.312500 0.187500 +v 2.500000 0.687500 -0.187500 +v 2.500000 0.312500 -0.187500 +v 2.375000 0.625000 -0.125000 +v 2.375000 0.625000 0.125000 +v 2.375000 0.375000 0.125000 +v 2.375000 0.375000 -0.125000 +v 2.375000 0.687500 -0.187500 +v 2.375000 0.687500 0.187500 +v 2.375000 0.312500 0.187500 +v 2.375000 0.312500 -0.187500 +v 2.250000 0.625000 -0.125000 +v 2.250000 0.625000 0.125000 +v 2.250000 0.375000 0.125000 +v 2.250000 0.375000 -0.125000 +v -2.250000 0.750000 -0.750000 +v 2.250000 0.750000 -0.750000 +v -2.250000 0.750000 -2.250000 +v 2.250000 0.750000 -2.250000 +v -2.000000 0.875000 -1.000000 +v 2.000000 0.875000 -1.000000 +v -2.000000 0.875000 -2.000000 +v 2.000000 0.875000 -2.000000 +v -2.250000 0.875000 -0.750000 +v 2.250000 0.875000 -0.750000 +v -2.250000 0.875000 -2.250000 +v 2.250000 0.875000 -2.250000 +v -2.250000 1.625000 -0.750000 +v 2.250000 1.625000 -0.750000 +v -2.250000 1.625000 -2.250000 +v 2.250000 1.625000 -2.250000 +v 1.250000 2.375000 -2.250000 +v 1.250000 2.750000 -2.149519 +v 1.250000 3.024519 -1.875000 +v 1.250000 3.125000 -1.500000 +v 1.250000 3.024519 -1.125000 +v 1.250000 2.750000 -0.850481 +v 1.250000 2.375000 -0.750000 +v 1.250000 2.000000 -0.850481 +v 1.250000 1.725481 -1.125000 +v 1.250000 1.625000 -1.500000 +v 1.250000 1.725481 -1.875000 +v 1.250000 2.000000 -2.149519 +v -1.250000 2.375000 -2.250000 +v -1.250000 2.750000 -2.149519 +v -1.250000 3.024519 -1.875000 +v -1.250000 3.125000 -1.500000 +v -1.250000 3.024519 -1.125000 +v -1.250000 2.750000 -0.850481 +v -1.250000 2.375000 -0.750000 +v -1.250000 2.000000 -0.850481 +v -1.250000 1.725481 -1.125000 +v -1.250000 1.625000 -1.500000 +v -1.250000 1.725481 -1.875000 +v -1.250000 2.000000 -2.149519 +v 1.500000 2.375000 -2.250000 +v 1.500000 2.750000 -2.149519 +v 1.500000 3.024519 -1.875000 +v 1.500000 3.125000 -1.500000 +v 1.500000 3.024519 -1.125000 +v 1.500000 2.750000 -0.850481 +v 1.500000 2.375000 -0.750000 +v 1.500000 2.000000 -0.850481 +v 1.500000 1.725481 -1.125000 +v 1.500000 1.625000 -1.500000 +v 1.500000 1.725481 -1.875000 +v 1.500000 2.000000 -2.149519 +v -1.500000 2.375000 -2.250000 +v -1.500000 2.750000 -2.149519 +v -1.500000 3.024519 -1.875000 +v -1.500000 3.125000 -1.500000 +v -1.500000 3.024519 -1.125000 +v -1.500000 2.750000 -0.850481 +v -1.500000 2.375000 -0.750000 +v -1.500000 2.000000 -0.850481 +v -1.500000 1.725481 -1.125000 +v -1.500000 1.625000 -1.500000 +v -1.500000 1.725481 -1.875000 +v -1.500000 2.000000 -2.149519 +v 1.000000 2.375000 -2.000000 +v 1.000000 2.625000 -1.933013 +v 1.000000 2.808013 -1.750000 +v 1.000000 2.875000 -1.500000 +v 1.000000 2.808013 -1.250000 +v 1.000000 2.625000 -1.066987 +v 1.000000 2.375000 -1.000000 +v 1.000000 2.125000 -1.066987 +v 1.000000 1.941987 -1.250000 +v 1.000000 1.875000 -1.500000 +v 1.000000 1.941987 -1.750000 +v 1.000000 2.125000 -1.933012 +v 1.750000 2.375000 -2.000000 +v 1.750000 2.625000 -1.933013 +v 1.750000 2.808013 -1.750000 +v 1.750000 2.875000 -1.500000 +v 1.750000 2.808013 -1.250000 +v 1.750000 2.625000 -1.066987 +v 1.750000 2.375000 -1.000000 +v 1.750000 2.125000 -1.066987 +v 1.750000 1.941987 -1.250000 +v 1.750000 1.875000 -1.500000 +v 1.750000 1.941987 -1.750000 +v 1.750000 2.125000 -1.933012 +v 1.000000 2.375000 -2.250000 +v 1.000000 2.750000 -2.149519 +v 1.000000 3.024519 -1.875000 +v 1.000000 3.125000 -1.500000 +v 1.000000 3.024519 -1.125000 +v 1.000000 2.750000 -0.850481 +v 1.000000 2.375000 -0.750000 +v 1.000000 2.000000 -0.850481 +v 1.000000 1.725481 -1.125000 +v 1.000000 1.625000 -1.500000 +v 1.000000 1.725481 -1.875000 +v 1.000000 2.000000 -2.149519 +v 0.750000 2.375000 -2.250000 +v 0.750000 2.750000 -2.149519 +v 0.750000 3.024519 -1.875000 +v 0.750000 3.125000 -1.500000 +v 0.750000 3.024519 -1.125000 +v 0.750000 2.750000 -0.850481 +v 0.750000 2.375000 -0.750000 +v 0.750000 2.000000 -0.850481 +v 0.750000 1.725481 -1.125000 +v 0.750000 1.625000 -1.500000 +v 0.750000 1.725481 -1.875000 +v 0.750000 2.000000 -2.149519 +v 0.750000 2.375000 -2.000000 +v 0.750000 2.625000 -1.933013 +v 0.750000 2.808013 -1.750000 +v 0.750000 2.875000 -1.500000 +v 0.750000 2.808013 -1.250000 +v 0.750000 2.625000 -1.066987 +v 0.750000 2.375000 -1.000000 +v 0.750000 2.125000 -1.066987 +v 0.750000 1.941987 -1.250000 +v 0.750000 1.875000 -1.500000 +v 0.750000 1.941987 -1.750000 +v 0.750000 2.125000 -1.933012 +v -0.750000 2.375000 -2.000000 +v -0.750000 2.625000 -1.933013 +v -0.750000 2.808013 -1.750000 +v -0.750000 2.875000 -1.500000 +v -0.750000 2.808013 -1.250000 +v -0.750000 2.625000 -1.066987 +v -0.750000 2.375000 -1.000000 +v -0.750000 2.125000 -1.066987 +v -0.750000 1.941987 -1.250000 +v -0.750000 1.875000 -1.500000 +v -0.750000 1.941987 -1.750000 +v -0.750000 2.125000 -1.933012 +v -0.750000 2.375000 -2.250000 +v -0.750000 2.750000 -2.149519 +v -0.750000 3.024519 -1.875000 +v -0.750000 3.125000 -1.500000 +v -0.750000 3.024519 -1.125000 +v -0.750000 2.750000 -0.850481 +v -0.750000 2.375000 -0.750000 +v -0.750000 2.000000 -0.850481 +v -0.750000 1.725481 -1.125000 +v -0.750000 1.625000 -1.500000 +v -0.750000 1.725481 -1.875000 +v -0.750000 2.000000 -2.149519 +v -1.000000 2.375000 -2.250000 +v -1.000000 2.750000 -2.149519 +v -1.000000 3.024519 -1.875000 +v -1.000000 3.125000 -1.500000 +v -1.000000 3.024519 -1.125000 +v -1.000000 2.750000 -0.850481 +v -1.000000 2.375000 -0.750000 +v -1.000000 2.000000 -0.850481 +v -1.000000 1.725481 -1.125000 +v -1.000000 1.625000 -1.500000 +v -1.000000 1.725481 -1.875000 +v -1.000000 2.000000 -2.149519 +v -1.000000 2.375000 -2.000000 +v -1.000000 2.625000 -1.933013 +v -1.000000 2.808013 -1.750000 +v -1.000000 2.875000 -1.500000 +v -1.000000 2.808013 -1.250000 +v -1.000000 2.625000 -1.066987 +v -1.000000 2.375000 -1.000000 +v -1.000000 2.125000 -1.066987 +v -1.000000 1.941987 -1.250000 +v -1.000000 1.875000 -1.500000 +v -1.000000 1.941987 -1.750000 +v -1.000000 2.125000 -1.933012 +v -1.750000 2.375000 -2.000000 +v -1.750000 2.625000 -1.933013 +v -1.750000 2.808013 -1.750000 +v -1.750000 2.875000 -1.500000 +v -1.750000 2.808013 -1.250000 +v -1.750000 2.625000 -1.066987 +v -1.750000 2.375000 -1.000000 +v -1.750000 2.125000 -1.066987 +v -1.750000 1.941987 -1.250000 +v -1.750000 1.875000 -1.500000 +v -1.750000 1.941987 -1.750000 +v -1.750000 2.125000 -1.933012 +v 0.812500 2.375000 -0.750000 +v 0.937500 2.375000 -0.750000 +v 0.812500 2.375000 -2.250000 +v 0.937500 2.375000 -2.250000 +v 0.812500 1.625000 -0.750000 +v 0.937500 1.625000 -0.750000 +v 0.812500 1.625000 -2.250000 +v 0.937500 1.625000 -2.250000 +v 1.312500 2.375000 -0.750000 +v 1.437500 2.375000 -0.750000 +v 1.312500 2.375000 -2.250000 +v 1.437500 2.375000 -2.250000 +v 1.312500 1.625000 -0.750000 +v 1.437500 1.625000 -0.750000 +v 1.312500 1.625000 -2.250000 +v 1.437500 1.625000 -2.250000 +v -1.437500 2.375000 -0.750000 +v -1.312500 2.375000 -0.750000 +v -1.437500 2.375000 -2.250000 +v -1.312500 2.375000 -2.250000 +v -1.437500 1.625000 -0.750000 +v -1.312500 1.625000 -0.750000 +v -1.437500 1.625000 -2.250000 +v -1.312500 1.625000 -2.250000 +v -0.937500 2.375000 -0.750000 +v -0.812500 2.375000 -0.750000 +v -0.937500 2.375000 -2.250000 +v -0.812500 2.375000 -2.250000 +v -0.937500 1.625000 -0.750000 +v -0.812500 1.625000 -0.750000 +v -0.937500 1.625000 -2.250000 +v -0.812500 1.625000 -2.250000 +v -2.125000 3.750000 0.125000 +v -2.088388 3.750000 0.213388 +v -2.000000 3.750000 0.250000 +v -1.911612 3.750000 0.213388 +v -1.875000 3.750000 0.125000 +v -1.911612 3.750000 0.036612 +v -2.000000 3.750000 0.000000 +v -2.088388 3.750000 0.036612 +v -2.125000 4.000000 0.125000 +v -2.088388 4.000000 0.213388 +v -2.000000 4.000000 0.250000 +v -1.911612 4.000000 0.213388 +v -1.875000 4.000000 0.125000 +v -1.911612 4.000000 0.036612 +v -2.000000 4.000000 0.000000 +v -2.088388 4.000000 0.036612 +v -2.125000 4.088388 0.088388 +v -2.088388 4.150888 0.150888 +v -2.000000 4.176777 0.176777 +v -1.911612 4.150888 0.150888 +v -1.875000 4.088388 0.088388 +v -1.911612 4.025888 0.025888 +v -2.088388 4.025888 0.025888 +v -2.125000 4.125000 0.000000 +v -2.088388 4.213388 0.000000 +v -2.000000 4.250000 0.000000 +v -1.911612 4.213388 0.000000 +v -1.875000 4.125000 0.000000 +v -1.911612 4.036612 0.000000 +v -2.088388 4.036612 0.000000 +v -1.875000 2.500000 -1.250000 +v -1.911612 2.500000 -1.338388 +v -2.000000 2.500000 -1.375000 +v -2.088388 2.500000 -1.338388 +v -2.125000 2.500000 -1.250000 +v -2.088388 2.500000 -1.161612 +v -2.000000 2.500000 -1.125000 +v -1.911612 2.500000 -1.161612 +v -1.875000 4.000000 -1.250000 +v -1.911612 4.000000 -1.338388 +v -2.000000 4.000000 -1.375000 +v -2.088388 4.000000 -1.338388 +v -2.125000 4.000000 -1.250000 +v -2.088388 4.000000 -1.161612 +v -2.000000 4.000000 -1.125000 +v -1.911612 4.000000 -1.161612 +v -1.875000 4.088388 -1.213388 +v -1.911612 4.150888 -1.275888 +v -2.000000 4.176777 -1.301777 +v -2.088388 4.150888 -1.275888 +v -2.125000 4.088388 -1.213388 +v -2.088388 4.025888 -1.150888 +v -1.911612 4.025888 -1.150888 +v -1.875000 4.125000 -1.125000 +v -1.911611 4.213388 -1.125000 +v -2.000000 4.250000 -1.125000 +v -2.088388 4.213388 -1.125000 +v -2.125000 4.125000 -1.125000 +v -2.088388 4.036612 -1.125000 +v -1.911611 4.036612 -1.125000 +v -2.125000 3.750000 1.625000 +v -2.088388 3.750000 1.713388 +v -2.000000 3.750000 1.750000 +v -1.911611 3.750000 1.713388 +v -1.875000 3.750000 1.625000 +v -1.911611 3.750000 1.536612 +v -2.000000 3.750000 1.500000 +v -2.088388 3.750000 1.536612 +v -2.125000 4.250000 1.625000 +v -2.088388 4.250000 1.713388 +v -2.000000 4.250000 1.750000 +v -1.911611 4.250000 1.713388 +v -1.875000 4.250000 1.625000 +v -1.911611 4.250000 1.536612 +v -2.000000 4.250000 1.500000 +v -2.088388 4.250000 1.536612 +v -2.125000 4.338388 1.588388 +v -2.088388 4.400888 1.650888 +v -2.000000 4.426777 1.676777 +v -1.911611 4.400888 1.650888 +v -1.875000 4.338388 1.588388 +v -1.911611 4.275888 1.525888 +v -2.088388 4.275888 1.525888 +v -2.125000 4.375000 1.500000 +v -2.088388 4.463388 1.500000 +v -2.000000 4.500000 1.500000 +v -1.911611 4.463388 1.500000 +v -1.875000 4.375000 1.500000 +v -1.911611 4.286612 1.500000 +v -2.088388 4.286612 1.500000 +v -1.875000 2.500000 -1.750000 +v -1.911612 2.500000 -1.838388 +v -2.000000 2.500000 -1.875000 +v -2.088388 2.500000 -1.838388 +v -2.125000 2.500000 -1.750000 +v -2.088388 2.500000 -1.661612 +v -2.000000 2.500000 -1.625000 +v -1.911612 2.500000 -1.661612 +v -1.875000 4.250000 -1.750000 +v -1.911612 4.250000 -1.838388 +v -2.000000 4.250000 -1.875000 +v -2.088388 4.250000 -1.838388 +v -2.125000 4.250000 -1.750000 +v -2.088388 4.250000 -1.661612 +v -2.000000 4.250000 -1.625000 +v -1.911612 4.250000 -1.661612 +v -1.875000 4.338388 -1.713388 +v -1.911612 4.400888 -1.775888 +v -2.000000 4.426777 -1.801777 +v -2.088388 4.400888 -1.775888 +v -2.125000 4.338388 -1.713388 +v -2.088388 4.275888 -1.650888 +v -1.911612 4.275888 -1.650888 +v -1.875000 4.375000 -1.625000 +v -1.911611 4.463388 -1.625000 +v -2.000000 4.500000 -1.625000 +v -2.088388 4.463388 -1.625000 +v -2.125000 4.375000 -1.625000 +v -2.088388 4.286612 -1.625000 +v -1.911611 4.286612 -1.625000 +v -1.900888 2.474112 -1.338388 +v -1.963388 2.411612 -1.375000 +v -2.025888 2.349112 -1.338388 +v -2.051777 2.323223 -1.250000 +v -2.025888 2.349112 -1.161612 +v -1.963388 2.411612 -1.125000 +v -1.900888 2.474112 -1.161612 +v -1.900888 2.474112 -1.838388 +v -1.963388 2.411612 -1.875000 +v -2.025888 2.349112 -1.838388 +v -2.051777 2.323223 -1.750000 +v -2.025888 2.349112 -1.661612 +v -1.963388 2.411612 -1.625000 +v -1.900888 2.474112 -1.661612 +v -1.875000 2.463388 -1.338388 +v -1.875000 2.375000 -1.375000 +v -1.875000 2.286612 -1.338388 +v -1.875000 2.250000 -1.250000 +v -1.875000 2.286612 -1.161612 +v -1.875000 2.375000 -1.125000 +v -1.875000 2.463388 -1.161612 +v -1.875000 2.463388 -1.838388 +v -1.875000 2.375000 -1.875000 +v -1.875000 2.286612 -1.838388 +v -1.875000 2.250000 -1.750000 +v -1.875000 2.286612 -1.661612 +v -1.875000 2.375000 -1.625000 +v -1.875000 2.463388 -1.661612 +v -1.750000 2.500000 -1.250000 +v -1.750000 2.500000 -1.750000 +v -1.750000 2.463388 -1.338388 +v -1.750000 2.375000 -1.375000 +v -1.750000 2.286612 -1.338388 +v -1.750000 2.250000 -1.250000 +v -1.750000 2.286612 -1.161612 +v -1.750000 2.375000 -1.125000 +v -1.750000 2.463388 -1.161612 +v -1.750000 2.463388 -1.838388 +v -1.750000 2.375000 -1.875000 +v -1.750000 2.286612 -1.838388 +v -1.750000 2.250000 -1.750000 +v -1.750000 2.286612 -1.661612 +v -1.750000 2.375000 -1.625000 +v -1.750000 2.463388 -1.661612 +v 1.000000 2.937500 -1.562500 +v 1.000000 3.062500 -1.562500 +v 1.000000 2.937500 -1.437500 +v 1.000000 3.062500 -1.437500 +v 1.250000 2.937500 -1.562500 +v 1.250000 3.062500 -1.562500 +v 1.250000 2.937500 -1.437500 +v 1.250000 3.062500 -1.437500 +v 1.000000 1.812500 -1.437500 +v 1.000000 1.687500 -1.437500 +v 1.000000 1.812500 -1.562500 +v 1.000000 1.687500 -1.562500 +v 1.250000 1.812500 -1.437500 +v 1.250000 1.687500 -1.437500 +v 1.250000 1.812500 -1.562500 +v 1.250000 1.687500 -1.562500 +v 1.000000 2.437500 -0.937500 +v 1.000000 2.437500 -0.812500 +v 1.000000 2.312500 -0.937500 +v 1.000000 2.312500 -0.812500 +v 1.250000 2.437500 -0.937500 +v 1.250000 2.437500 -0.812500 +v 1.250000 2.312500 -0.937500 +v 1.250000 2.312500 -0.812500 +v 1.000000 2.312500 -2.062500 +v 1.000000 2.312500 -2.187500 +v 1.000000 2.437500 -2.062500 +v 1.000000 2.437500 -2.187500 +v 1.250000 2.312500 -2.062500 +v 1.250000 2.312500 -2.187500 +v 1.250000 2.437500 -2.062500 +v 1.250000 2.437500 -2.187500 +v 1.000000 2.893389 -1.272877 +v 1.000000 3.001642 -1.210377 +v 1.000000 2.830889 -1.164623 +v 1.000000 2.939142 -1.102123 +v 1.250000 2.893389 -1.272877 +v 1.250000 3.001642 -1.210377 +v 1.250000 2.830889 -1.164623 +v 1.250000 2.939142 -1.102123 +v 1.000000 1.856611 -1.727123 +v 1.000000 1.748358 -1.789623 +v 1.000000 1.919111 -1.835376 +v 1.000000 1.810858 -1.897876 +v 1.250000 1.856611 -1.727123 +v 1.250000 1.748358 -1.789623 +v 1.250000 1.919111 -1.835376 +v 1.250000 1.810858 -1.897876 +v 1.000000 2.147877 -0.981611 +v 1.000000 2.085377 -0.873358 +v 1.000000 2.039624 -1.044111 +v 1.000000 1.977124 -0.935858 +v 1.250000 2.147877 -0.981611 +v 1.250000 2.085377 -0.873358 +v 1.250000 2.039624 -1.044111 +v 1.250000 1.977124 -0.935858 +v 1.000000 2.602123 -2.018389 +v 1.000000 2.664623 -2.126642 +v 1.000000 2.710377 -1.955889 +v 1.000000 2.772877 -2.064142 +v 1.250000 2.602123 -2.018389 +v 1.250000 2.664623 -2.126642 +v 1.250000 2.710377 -1.955889 +v 1.250000 2.772877 -2.064142 +v 1.000000 2.710377 -1.044111 +v 1.000000 2.772877 -0.935858 +v 1.000000 2.602124 -0.981611 +v 1.000000 2.664623 -0.873358 +v 1.250000 2.710377 -1.044111 +v 1.250000 2.772877 -0.935858 +v 1.250000 2.602124 -0.981611 +v 1.250000 2.664623 -0.873358 +v 1.000000 2.039624 -1.955889 +v 1.000000 1.977124 -2.064142 +v 1.000000 2.147877 -2.018389 +v 1.000000 2.085377 -2.126642 +v 1.250000 2.039624 -1.955889 +v 1.250000 1.977124 -2.064142 +v 1.250000 2.147877 -2.018389 +v 1.250000 2.085377 -2.126642 +v 1.000000 1.919111 -1.164623 +v 1.000000 1.810858 -1.102123 +v 1.000000 1.856611 -1.272877 +v 1.000000 1.748358 -1.210377 +v 1.250000 1.919111 -1.164623 +v 1.250000 1.810858 -1.102123 +v 1.250000 1.856611 -1.272877 +v 1.250000 1.748358 -1.210377 +v 1.000000 2.830889 -1.835376 +v 1.000000 2.939142 -1.897876 +v 1.000000 2.893389 -1.727123 +v 1.000000 3.001642 -1.789623 +v 1.250000 2.830889 -1.835376 +v 1.250000 2.939142 -1.897876 +v 1.250000 2.893389 -1.727123 +v 1.250000 3.001642 -1.789623 +v -1.250000 2.937500 -1.562500 +v -1.250000 3.062500 -1.562500 +v -1.250000 2.937500 -1.437500 +v -1.250000 3.062500 -1.437500 +v -1.000000 2.937500 -1.562500 +v -1.000000 3.062500 -1.562500 +v -1.000000 2.937500 -1.437500 +v -1.000000 3.062500 -1.437500 +v -1.250000 1.812500 -1.437500 +v -1.250000 1.687500 -1.437500 +v -1.250000 1.812500 -1.562500 +v -1.250000 1.687500 -1.562500 +v -1.000000 1.812500 -1.437500 +v -1.000000 1.687500 -1.437500 +v -1.000000 1.812500 -1.562500 +v -1.000000 1.687500 -1.562500 +v -1.250000 2.437500 -0.937500 +v -1.250000 2.437500 -0.812500 +v -1.250000 2.312500 -0.937500 +v -1.250000 2.312500 -0.812500 +v -1.000000 2.437500 -0.937500 +v -1.000000 2.437500 -0.812500 +v -1.000000 2.312500 -0.937500 +v -1.000000 2.312500 -0.812500 +v -1.250000 2.312500 -2.062500 +v -1.250000 2.312500 -2.187500 +v -1.250000 2.437500 -2.062500 +v -1.250000 2.437500 -2.187500 +v -1.000000 2.312500 -2.062500 +v -1.000000 2.312500 -2.187500 +v -1.000000 2.437500 -2.062500 +v -1.000000 2.437500 -2.187500 +v -1.250000 2.893389 -1.272877 +v -1.250000 3.001642 -1.210377 +v -1.250000 2.830889 -1.164623 +v -1.250000 2.939142 -1.102123 +v -1.000000 2.893389 -1.272877 +v -1.000000 3.001642 -1.210377 +v -1.000000 2.830889 -1.164623 +v -1.000000 2.939142 -1.102123 +v -1.250000 1.856611 -1.727123 +v -1.250000 1.748358 -1.789623 +v -1.250000 1.919111 -1.835376 +v -1.250000 1.810858 -1.897876 +v -1.000000 1.856611 -1.727123 +v -1.000000 1.748358 -1.789623 +v -1.000000 1.919111 -1.835376 +v -1.000000 1.810858 -1.897876 +v -1.250000 2.147877 -0.981611 +v -1.250000 2.085377 -0.873358 +v -1.250000 2.039624 -1.044111 +v -1.250000 1.977124 -0.935858 +v -1.000000 2.147877 -0.981611 +v -1.000000 2.085377 -0.873358 +v -1.000000 2.039624 -1.044111 +v -1.000000 1.977124 -0.935858 +v -1.250000 2.602123 -2.018389 +v -1.250000 2.664623 -2.126642 +v -1.250000 2.710377 -1.955889 +v -1.250000 2.772877 -2.064142 +v -1.000000 2.602123 -2.018389 +v -1.000000 2.664623 -2.126642 +v -1.000000 2.710377 -1.955889 +v -1.000000 2.772877 -2.064142 +v -1.250000 2.710377 -1.044111 +v -1.250000 2.772877 -0.935858 +v -1.250000 2.602124 -0.981611 +v -1.250000 2.664623 -0.873358 +v -1.000000 2.710377 -1.044111 +v -1.000000 2.772877 -0.935858 +v -1.000000 2.602124 -0.981611 +v -1.000000 2.664623 -0.873358 +v -1.250000 2.039624 -1.955889 +v -1.250000 1.977124 -2.064142 +v -1.250000 2.147877 -2.018389 +v -1.250000 2.085377 -2.126642 +v -1.000000 2.039624 -1.955889 +v -1.000000 1.977124 -2.064142 +v -1.000000 2.147877 -2.018389 +v -1.000000 2.085377 -2.126642 +v -1.250000 1.919111 -1.164623 +v -1.250000 1.810858 -1.102123 +v -1.250000 1.856611 -1.272877 +v -1.250000 1.748358 -1.210377 +v -1.000000 1.919111 -1.164623 +v -1.000000 1.810858 -1.102123 +v -1.000000 1.856611 -1.272877 +v -1.000000 1.748358 -1.210377 +v -1.250000 2.830889 -1.835376 +v -1.250000 2.939142 -1.897876 +v -1.250000 2.893389 -1.727123 +v -1.250000 3.001642 -1.789623 +v -1.000000 2.830889 -1.835376 +v -1.000000 2.939142 -1.897876 +v -1.000000 2.893389 -1.727123 +v -1.000000 3.001642 -1.789623 +v 1.911612 2.250000 -1.661612 +v 2.000000 2.250000 -1.625000 +v 2.088388 2.250000 -1.661612 +v 2.125000 2.250000 -1.750000 +v 2.088388 2.250000 -1.838388 +v 2.000000 2.250000 -1.875000 +v 1.911612 2.250000 -1.838388 +v 1.875000 2.250000 -1.750000 +v 1.911612 2.250000 -1.161612 +v 2.000000 2.250000 -1.125000 +v 2.088388 2.250000 -1.161612 +v 2.125000 2.250000 -1.250000 +v 2.088388 2.250000 -1.338388 +v 2.000000 2.250000 -1.375000 +v 1.911612 2.250000 -1.338388 +v 1.875000 2.250000 -1.250000 +v 1.900888 2.275888 -1.338388 +v 1.963388 2.338388 -1.375000 +v 2.025888 2.400888 -1.338388 +v 2.051777 2.426777 -1.250000 +v 2.025888 2.400888 -1.161612 +v 1.963388 2.338388 -1.125000 +v 1.900888 2.275888 -1.161612 +v 1.900888 2.275888 -1.838388 +v 1.963388 2.338388 -1.875000 +v 2.025888 2.400888 -1.838388 +v 2.051777 2.426777 -1.750000 +v 2.025888 2.400888 -1.661612 +v 1.963388 2.338388 -1.625000 +v 1.900888 2.275888 -1.661612 +v 1.875000 2.286612 -1.338388 +v 1.875000 2.375000 -1.375000 +v 1.875000 2.463388 -1.338388 +v 1.875000 2.500000 -1.250000 +v 1.875000 2.463388 -1.161612 +v 1.875000 2.375000 -1.125000 +v 1.875000 2.286612 -1.161612 +v 1.875000 2.286612 -1.838388 +v 1.875000 2.375000 -1.875000 +v 1.875000 2.463388 -1.838388 +v 1.875000 2.500000 -1.750000 +v 1.875000 2.463388 -1.661612 +v 1.875000 2.375000 -1.625000 +v 1.875000 2.286612 -1.661612 +v 1.750000 2.250000 -1.250000 +v 1.750000 2.250000 -1.750000 +v 1.750000 2.286612 -1.338388 +v 1.750000 2.375000 -1.375000 +v 1.750000 2.463388 -1.338388 +v 1.750000 2.500000 -1.250000 +v 1.750000 2.463388 -1.161612 +v 1.750000 2.375000 -1.125000 +v 1.750000 2.286612 -1.161612 +v 1.750000 2.286612 -1.838388 +v 1.750000 2.375000 -1.875000 +v 1.750000 2.463388 -1.838388 +v 1.750000 2.500000 -1.750000 +v 1.750000 2.463388 -1.661612 +v 1.750000 2.375000 -1.625000 +v 1.750000 2.286612 -1.661612 +v 1.911612 1.625000 -1.661612 +v 2.000000 1.625000 -1.625000 +v 2.088388 1.625000 -1.661612 +v 2.125000 1.625000 -1.750000 +v 2.088388 1.625000 -1.838388 +v 2.000000 1.625000 -1.875000 +v 1.911612 1.625000 -1.838388 +v 1.875000 1.625000 -1.750000 +v 1.911612 1.625000 -1.161612 +v 2.000000 1.625000 -1.125000 +v 2.088388 1.625000 -1.161612 +v 2.125000 1.625000 -1.250000 +v 2.088388 1.625000 -1.338388 +v 2.000000 1.625000 -1.375000 +v 1.911612 1.625000 -1.338388 +v 1.875000 1.625000 -1.250000 +v 1.750000 1.562500 -0.250000 +v 1.661612 1.525888 -0.250000 +v 1.625000 1.437500 -0.250000 +v 1.661612 1.349112 -0.250000 +v 1.750000 1.312500 -0.250000 +v 1.838388 1.349112 -0.250000 +v 1.875000 1.437500 -0.250000 +v 1.838388 1.525888 -0.250000 +v 1.750000 1.562500 -0.750000 +v 1.661612 1.525888 -0.750000 +v 1.625000 1.437500 -0.750000 +v 1.661612 1.349112 -0.750000 +v 1.750000 1.312500 -0.750000 +v 1.838388 1.349112 -0.750000 +v 1.875000 1.437500 -0.750000 +v 1.838388 1.525888 -0.750000 +v 1.750000 1.187500 -0.250000 +v 1.661612 1.150888 -0.250000 +v 1.625000 1.062500 -0.250000 +v 1.661612 0.974112 -0.250000 +v 1.750000 0.937500 -0.250000 +v 1.838388 0.974112 -0.250000 +v 1.875000 1.062500 -0.250000 +v 1.838388 1.150888 -0.250000 +v 1.750000 1.187500 -0.750000 +v 1.661612 1.150888 -0.750000 +v 1.625000 1.062500 -0.750000 +v 1.661612 0.974112 -0.750000 +v 1.750000 0.937500 -0.750000 +v 1.838388 0.974112 -0.750000 +v 1.875000 1.062500 -0.750000 +v 1.838388 1.150888 -0.750000 +v 1.250000 1.562500 -0.250000 +v 1.161612 1.525888 -0.250000 +v 1.125000 1.437500 -0.250000 +v 1.161612 1.349112 -0.250000 +v 1.250000 1.312500 -0.250000 +v 1.338388 1.349112 -0.250000 +v 1.375000 1.437500 -0.250000 +v 1.338388 1.525888 -0.250000 +v 1.250000 1.562500 -0.750000 +v 1.161612 1.525888 -0.750000 +v 1.125000 1.437500 -0.750000 +v 1.161612 1.349112 -0.750000 +v 1.250000 1.312500 -0.750000 +v 1.338388 1.349112 -0.750000 +v 1.375000 1.437500 -0.750000 +v 1.338388 1.525888 -0.750000 +v 1.250000 1.187500 -0.250000 +v 1.161612 1.150888 -0.250000 +v 1.125000 1.062500 -0.250000 +v 1.161612 0.974112 -0.250000 +v 1.250000 0.937500 -0.250000 +v 1.338388 0.974112 -0.250000 +v 1.375000 1.062500 -0.250000 +v 1.338388 1.150888 -0.250000 +v 1.250000 1.187500 -0.750000 +v 1.161612 1.150888 -0.750000 +v 1.125000 1.062500 -0.750000 +v 1.161612 0.974112 -0.750000 +v 1.250000 0.937500 -0.750000 +v 1.338388 0.974112 -0.750000 +v 1.375000 1.062500 -0.750000 +v 1.338388 1.150888 -0.750000 +v -0.750000 2.937500 -1.562500 +v -0.750000 3.062500 -1.562500 +v -0.750000 2.937500 -1.437500 +v -0.750000 3.062500 -1.437500 +v -0.750000 1.812500 -1.437500 +v -0.750000 1.687500 -1.437500 +v -0.750000 1.812500 -1.562500 +v -0.750000 1.687500 -1.562500 +v -0.750000 2.437500 -0.937500 +v -0.750000 2.437500 -0.812500 +v -0.750000 2.312500 -0.937500 +v -0.750000 2.312500 -0.812500 +v -0.750000 2.312500 -2.062500 +v -0.750000 2.312500 -2.187500 +v -0.750000 2.437500 -2.062500 +v -0.750000 2.437500 -2.187500 +v -0.750000 2.893389 -1.272877 +v -0.750000 3.001642 -1.210377 +v -0.750000 2.830889 -1.164623 +v -0.750000 2.939142 -1.102123 +v -0.750000 1.856611 -1.727123 +v -0.750000 1.748358 -1.789623 +v -0.750000 1.919111 -1.835376 +v -0.750000 1.810858 -1.897876 +v -0.750000 2.147877 -0.981611 +v -0.750000 2.085377 -0.873358 +v -0.750000 2.039624 -1.044111 +v -0.750000 1.977124 -0.935858 +v -0.750000 2.602123 -2.018389 +v -0.750000 2.664623 -2.126642 +v -0.750000 2.710377 -1.955889 +v -0.750000 2.772877 -2.064142 +v -0.750000 2.710377 -1.044111 +v -0.750000 2.772877 -0.935858 +v -0.750000 2.602124 -0.981611 +v -0.750000 2.664623 -0.873358 +v -0.750000 2.039624 -1.955889 +v -0.750000 1.977124 -2.064142 +v -0.750000 2.147877 -2.018389 +v -0.750000 2.085377 -2.126642 +v -0.750000 1.919111 -1.164623 +v -0.750000 1.810858 -1.102123 +v -0.750000 1.856611 -1.272877 +v -0.750000 1.748358 -1.210377 +v -0.750000 2.830889 -1.835376 +v -0.750000 2.939142 -1.897876 +v -0.750000 2.893389 -1.727123 +v -0.750000 3.001642 -1.789623 +v 0.750000 2.937500 -1.562500 +v 0.750000 3.062500 -1.562500 +v 0.750000 2.937500 -1.437500 +v 0.750000 3.062500 -1.437500 +v 0.750000 1.812500 -1.437500 +v 0.750000 1.687500 -1.437500 +v 0.750000 1.812500 -1.562500 +v 0.750000 1.687500 -1.562500 +v 0.750000 2.437500 -0.937500 +v 0.750000 2.437500 -0.812500 +v 0.750000 2.312500 -0.937500 +v 0.750000 2.312500 -0.812500 +v 0.750000 2.312500 -2.062500 +v 0.750000 2.312500 -2.187500 +v 0.750000 2.437500 -2.062500 +v 0.750000 2.437500 -2.187500 +v 0.750000 2.893389 -1.272877 +v 0.750000 3.001642 -1.210377 +v 0.750000 2.830889 -1.164623 +v 0.750000 2.939142 -1.102123 +v 0.750000 1.856611 -1.727123 +v 0.750000 1.748358 -1.789623 +v 0.750000 1.919111 -1.835376 +v 0.750000 1.810858 -1.897876 +v 0.750000 2.147877 -0.981611 +v 0.750000 2.085377 -0.873358 +v 0.750000 2.039624 -1.044111 +v 0.750000 1.977124 -0.935858 +v 0.750000 2.602123 -2.018389 +v 0.750000 2.664623 -2.126642 +v 0.750000 2.710377 -1.955889 +v 0.750000 2.772877 -2.064142 +v 0.750000 2.710377 -1.044111 +v 0.750000 2.772877 -0.935858 +v 0.750000 2.602124 -0.981611 +v 0.750000 2.664623 -0.873358 +v 0.750000 2.039624 -1.955889 +v 0.750000 1.977124 -2.064142 +v 0.750000 2.147877 -2.018389 +v 0.750000 2.085377 -2.126642 +v 0.750000 1.919111 -1.164623 +v 0.750000 1.810858 -1.102123 +v 0.750000 1.856611 -1.272877 +v 0.750000 1.748358 -1.210377 +v 0.750000 2.830889 -1.835376 +v 0.750000 2.939142 -1.897876 +v 0.750000 2.893389 -1.727123 +v 0.750000 3.001642 -1.789623 +v 0.875000 0.125000 2.500000 +v 1.125000 0.125000 2.500000 +v 0.875000 0.125000 -2.500000 +v 1.125000 0.125000 -2.500000 +v 0.875000 0.250000 -2.500000 +v 0.875000 0.250000 2.500000 +v 1.125000 0.250000 2.500000 +v 1.125000 0.250000 -2.500000 +v -0.125000 0.125000 2.500000 +v 0.125000 0.125000 2.500000 +v -0.125000 0.125000 -2.500000 +v 0.125000 0.125000 -2.500000 +v -0.125000 0.250000 -2.500000 +v -0.125000 0.250000 2.500000 +v 0.125000 0.250000 2.500000 +v 0.125000 0.250000 -2.500000 +v -1.125000 0.125000 2.500000 +v -0.875000 0.125000 2.500000 +v -1.125000 0.125000 -2.500000 +v -0.875000 0.125000 -2.500000 +v -1.125000 0.250000 -2.500000 +v -1.125000 0.250000 2.500000 +v -0.875000 0.250000 2.500000 +v -0.875000 0.250000 -2.500000 +v -2.125000 0.125000 2.500000 +v -1.875000 0.125000 2.500000 +v -2.125000 0.125000 -2.500000 +v -1.875000 0.125000 -2.500000 +v -2.125000 0.250000 -2.500000 +v -2.125000 0.250000 2.500000 +v -1.875000 0.250000 2.500000 +v -1.875000 0.250000 -2.500000 +v 2.500000 0.687500 -0.812500 +v 2.500000 0.312500 -0.812500 +v 2.500000 0.687500 -1.187500 +v 2.500000 0.312500 -1.187500 +v 2.375000 0.625000 -1.125000 +v 2.375000 0.625000 -0.875000 +v 2.375000 0.375000 -0.875000 +v 2.375000 0.375000 -1.125000 +v 2.375000 0.687500 -1.187500 +v 2.375000 0.687500 -0.812500 +v 2.375000 0.312500 -0.812500 +v 2.375000 0.312500 -1.187500 +v 2.250000 0.625000 -1.125000 +v 2.250000 0.625000 -0.875000 +v 2.250000 0.375000 -0.875000 +v 2.250000 0.375000 -1.125000 +v 2.500000 0.687500 -1.812500 +v 2.500000 0.312500 -1.812500 +v 2.500000 0.687500 -2.187500 +v 2.500000 0.312500 -2.187500 +v 2.375000 0.625000 -2.125000 +v 2.375000 0.625000 -1.875000 +v 2.375000 0.375000 -1.875000 +v 2.375000 0.375000 -2.125000 +v 2.375000 0.687500 -2.187500 +v 2.375000 0.687500 -1.812500 +v 2.375000 0.312500 -1.812500 +v 2.375000 0.312500 -2.187500 +v 2.250000 0.625000 -2.125000 +v 2.250000 0.625000 -1.875000 +v 2.250000 0.375000 -1.875000 +v 2.250000 0.375000 -2.125000 +v 2.500000 0.687500 2.187500 +v 2.500000 0.312500 2.187500 +v 2.500000 0.687500 1.812500 +v 2.500000 0.312500 1.812500 +v 2.375000 0.625000 1.875000 +v 2.375000 0.625000 2.125000 +v 2.375000 0.375000 2.125000 +v 2.375000 0.375000 1.875000 +v 2.375000 0.687500 1.812500 +v 2.375000 0.687500 2.187500 +v 2.375000 0.312500 2.187500 +v 2.375000 0.312500 1.812500 +v 2.250000 0.625000 1.875000 +v 2.250000 0.625000 2.125000 +v 2.250000 0.375000 2.125000 +v 2.250000 0.375000 1.875000 +v 2.500000 0.687500 1.187500 +v 2.500000 0.312500 1.187500 +v 2.500000 0.687500 0.812500 +v 2.500000 0.312500 0.812500 +v 2.375000 0.625000 0.875000 +v 2.375000 0.625000 1.125000 +v 2.375000 0.375000 1.125000 +v 2.375000 0.375000 0.875000 +v 2.375000 0.687500 0.812500 +v 2.375000 0.687500 1.187500 +v 2.375000 0.312500 1.187500 +v 2.375000 0.312500 0.812500 +v 2.250000 0.625000 0.875000 +v 2.250000 0.625000 1.125000 +v 2.250000 0.375000 1.125000 +v 2.250000 0.375000 0.875000 +v -2.500000 0.687500 -0.187500 +v -2.500000 0.312500 -0.187500 +v -2.500000 0.687500 0.187500 +v -2.500000 0.312500 0.187500 +v -2.375000 0.625000 0.125000 +v -2.375000 0.625000 -0.125000 +v -2.375000 0.375000 -0.125000 +v -2.375000 0.375000 0.125000 +v -2.375000 0.687500 0.187500 +v -2.375000 0.687500 -0.187500 +v -2.375000 0.312500 -0.187500 +v -2.375000 0.312500 0.187500 +v -2.250000 0.625000 0.125000 +v -2.250000 0.625000 -0.125000 +v -2.250000 0.375000 -0.125000 +v -2.250000 0.375000 0.125000 +v -2.500000 0.687500 0.812500 +v -2.500000 0.312500 0.812500 +v -2.500000 0.687500 1.187500 +v -2.500000 0.312500 1.187500 +v -2.375000 0.625000 1.125000 +v -2.375000 0.625000 0.875000 +v -2.375000 0.375000 0.875000 +v -2.375000 0.375000 1.125000 +v -2.375000 0.687500 1.187500 +v -2.375000 0.687500 0.812500 +v -2.375000 0.312500 0.812500 +v -2.375000 0.312500 1.187500 +v -2.250000 0.625000 1.125000 +v -2.250000 0.625000 0.875000 +v -2.250000 0.375000 0.875000 +v -2.250000 0.375000 1.125000 +v -2.500000 0.687500 1.812500 +v -2.500000 0.312500 1.812500 +v -2.500000 0.687500 2.187500 +v -2.500000 0.312500 2.187500 +v -2.375000 0.625000 2.125000 +v -2.375000 0.625000 1.875000 +v -2.375000 0.375000 1.875000 +v -2.375000 0.375000 2.125000 +v -2.375000 0.687500 2.187500 +v -2.375000 0.687500 1.812500 +v -2.375000 0.312500 1.812500 +v -2.375000 0.312500 2.187500 +v -2.250000 0.625000 2.125000 +v -2.250000 0.625000 1.875000 +v -2.250000 0.375000 1.875000 +v -2.250000 0.375000 2.125000 +v -2.500000 0.687500 -2.187500 +v -2.500000 0.312500 -2.187500 +v -2.500000 0.687500 -1.812500 +v -2.500000 0.312500 -1.812500 +v -2.375000 0.625000 -1.875000 +v -2.375000 0.625000 -2.125000 +v -2.375000 0.375000 -2.125000 +v -2.375000 0.375000 -1.875000 +v -2.375000 0.687500 -1.812500 +v -2.375000 0.687500 -2.187500 +v -2.375000 0.312500 -2.187500 +v -2.375000 0.312500 -1.812500 +v -2.250000 0.625000 -1.875000 +v -2.250000 0.625000 -2.125000 +v -2.250000 0.375000 -2.125000 +v -2.250000 0.375000 -1.875000 +v -2.500000 0.687500 -1.187500 +v -2.500000 0.312500 -1.187500 +v -2.500000 0.687500 -0.812500 +v -2.500000 0.312500 -0.812500 +v -2.375000 0.625000 -0.875000 +v -2.375000 0.625000 -1.125000 +v -2.375000 0.375000 -1.125000 +v -2.375000 0.375000 -0.875000 +v -2.375000 0.687500 -0.812500 +v -2.375000 0.687500 -1.187500 +v -2.375000 0.312500 -1.187500 +v -2.375000 0.312500 -0.812500 +v -2.250000 0.625000 -0.875000 +v -2.250000 0.625000 -1.125000 +v -2.250000 0.375000 -1.125000 +v -2.250000 0.375000 -0.875000 +v 0.187500 0.687500 -2.500000 +v 0.187500 0.312500 -2.500000 +v -0.187500 0.687500 -2.500000 +v -0.187500 0.312500 -2.500000 +v -0.125000 0.625000 -2.375000 +v 0.125000 0.625000 -2.375000 +v 0.125000 0.375000 -2.375000 +v -0.125000 0.375000 -2.375000 +v -0.187500 0.687500 -2.375000 +v 0.187500 0.687500 -2.375000 +v 0.187500 0.312500 -2.375000 +v -0.187500 0.312500 -2.375000 +v -0.125000 0.625000 -2.250000 +v 0.125000 0.625000 -2.250000 +v 0.125000 0.375000 -2.250000 +v -0.125000 0.375000 -2.250000 +v -0.812500 0.687500 -2.500000 +v -0.812500 0.312500 -2.500000 +v -1.187500 0.687500 -2.500000 +v -1.187500 0.312500 -2.500000 +v -1.125000 0.625000 -2.375000 +v -0.875000 0.625000 -2.375000 +v -0.875000 0.375000 -2.375000 +v -1.125000 0.375000 -2.375000 +v -1.187500 0.687500 -2.375000 +v -0.812500 0.687500 -2.375000 +v -0.812500 0.312500 -2.375000 +v -1.187500 0.312500 -2.375000 +v -1.125000 0.625000 -2.250000 +v -0.875000 0.625000 -2.250000 +v -0.875000 0.375000 -2.250000 +v -1.125000 0.375000 -2.250000 +v -1.812500 0.687500 -2.500000 +v -1.812500 0.312500 -2.500000 +v -2.187500 0.687500 -2.500000 +v -2.187500 0.312500 -2.500000 +v -2.125000 0.625000 -2.375000 +v -1.875000 0.625000 -2.375000 +v -1.875000 0.375000 -2.375000 +v -2.125000 0.375000 -2.375000 +v -2.187500 0.687500 -2.375000 +v -1.812500 0.687500 -2.375000 +v -1.812500 0.312500 -2.375000 +v -2.187500 0.312500 -2.375000 +v -2.125000 0.625000 -2.250000 +v -1.875000 0.625000 -2.250000 +v -1.875000 0.375000 -2.250000 +v -2.125000 0.375000 -2.250000 +v 2.187500 0.687500 -2.500000 +v 2.187500 0.312500 -2.500000 +v 1.812500 0.687500 -2.500000 +v 1.812500 0.312500 -2.500000 +v 1.875000 0.625000 -2.375000 +v 2.125000 0.625000 -2.375000 +v 2.125000 0.375000 -2.375000 +v 1.875000 0.375000 -2.375000 +v 1.812500 0.687500 -2.375000 +v 2.187500 0.687500 -2.375000 +v 2.187500 0.312500 -2.375000 +v 1.812500 0.312500 -2.375000 +v 1.875000 0.625000 -2.250000 +v 2.125000 0.625000 -2.250000 +v 2.125000 0.375000 -2.250000 +v 1.875000 0.375000 -2.250000 +v 1.187500 0.687500 -2.500000 +v 1.187500 0.312500 -2.500000 +v 0.812500 0.687500 -2.500000 +v 0.812500 0.312500 -2.500000 +v 0.875000 0.625000 -2.375000 +v 1.125000 0.625000 -2.375000 +v 1.125000 0.375000 -2.375000 +v 0.875000 0.375000 -2.375000 +v 0.812500 0.687500 -2.375000 +v 1.187500 0.687500 -2.375000 +v 1.187500 0.312500 -2.375000 +v 0.812500 0.312500 -2.375000 +v 0.875000 0.625000 -2.250000 +v 1.125000 0.625000 -2.250000 +v 1.125000 0.375000 -2.250000 +v 0.875000 0.375000 -2.250000 +v -0.187500 0.687500 2.500000 +v -0.187500 0.312500 2.500000 +v 0.187500 0.687500 2.500000 +v 0.187500 0.312500 2.500000 +v 0.125000 0.625000 2.375000 +v -0.125000 0.625000 2.375000 +v -0.125000 0.375000 2.375000 +v 0.125000 0.375000 2.375000 +v 0.187500 0.687500 2.375000 +v -0.187500 0.687500 2.375000 +v -0.187500 0.312500 2.375000 +v 0.187500 0.312500 2.375000 +v 0.125000 0.625000 2.250000 +v -0.125000 0.625000 2.250000 +v -0.125000 0.375000 2.250000 +v 0.125000 0.375000 2.250000 +v 0.812500 0.687500 2.500000 +v 0.812500 0.312500 2.500000 +v 1.187500 0.687500 2.500000 +v 1.187500 0.312500 2.500000 +v 1.125000 0.625000 2.375000 +v 0.875000 0.625000 2.375000 +v 0.875000 0.375000 2.375000 +v 1.125000 0.375000 2.375000 +v 1.187500 0.687500 2.375000 +v 0.812500 0.687500 2.375000 +v 0.812500 0.312500 2.375000 +v 1.187500 0.312500 2.375000 +v 1.125000 0.625000 2.250000 +v 0.875000 0.625000 2.250000 +v 0.875000 0.375000 2.250000 +v 1.125000 0.375000 2.250000 +v 1.812500 0.687500 2.500000 +v 1.812500 0.312500 2.500000 +v 2.187500 0.687500 2.500000 +v 2.187500 0.312500 2.500000 +v 2.125000 0.625000 2.375000 +v 1.875000 0.625000 2.375000 +v 1.875000 0.375000 2.375000 +v 2.125000 0.375000 2.375000 +v 2.187500 0.687500 2.375000 +v 1.812500 0.687500 2.375000 +v 1.812500 0.312500 2.375000 +v 2.187500 0.312500 2.375000 +v 2.125000 0.625000 2.250000 +v 1.875000 0.625000 2.250000 +v 1.875000 0.375000 2.250000 +v 2.125000 0.375000 2.250000 +v -2.187500 0.687500 2.500000 +v -2.187500 0.312500 2.500000 +v -1.812500 0.687500 2.500000 +v -1.812500 0.312500 2.500000 +v -1.875000 0.625000 2.375000 +v -2.125000 0.625000 2.375000 +v -2.125000 0.375000 2.375000 +v -1.875000 0.375000 2.375000 +v -1.812500 0.687500 2.375000 +v -2.187500 0.687500 2.375000 +v -2.187500 0.312500 2.375000 +v -1.812500 0.312500 2.375000 +v -1.875000 0.625000 2.250000 +v -2.125000 0.625000 2.250000 +v -2.125000 0.375000 2.250000 +v -1.875000 0.375000 2.250000 +v -1.187500 0.687500 2.500000 +v -1.187500 0.312500 2.500000 +v -0.812500 0.687500 2.500000 +v -0.812500 0.312500 2.500000 +v -0.875000 0.625000 2.375000 +v -1.125000 0.625000 2.375000 +v -1.125000 0.375000 2.375000 +v -0.875000 0.375000 2.375000 +v -0.812500 0.687500 2.375000 +v -1.187500 0.687500 2.375000 +v -1.187500 0.312500 2.375000 +v -0.812500 0.312500 2.375000 +v -0.875000 0.625000 2.250000 +v -1.125000 0.625000 2.250000 +v -1.125000 0.375000 2.250000 +v -0.875000 0.375000 2.250000 +v -0.250000 3.750000 1.500000 +v -0.338388 3.750000 1.536612 +v -0.375000 3.750000 1.625000 +v -0.338388 3.750000 1.713388 +v -0.250000 3.750000 1.750000 +v -0.161611 3.750000 1.713388 +v -0.125000 3.750000 1.625000 +v -0.161611 3.750000 1.536612 +v -0.250000 4.000000 1.500000 +v -0.338388 4.000000 1.536612 +v -0.375000 4.000000 1.625000 +v -0.338388 4.000000 1.713388 +v -0.250000 4.000000 1.750000 +v -0.161611 4.000000 1.713388 +v -0.125000 4.000000 1.625000 +v -0.161611 4.000000 1.536612 +v -0.213388 4.088388 1.500000 +v -0.275888 4.150888 1.536612 +v -0.301776 4.176777 1.625000 +v -0.275888 4.150888 1.713388 +v -0.213388 4.088388 1.750000 +v -0.150888 4.025888 1.713388 +v -0.150888 4.025888 1.536612 +v -0.125000 4.125000 1.500000 +v -0.125000 4.213388 1.536612 +v -0.125000 4.250000 1.625000 +v -0.125000 4.213388 1.713388 +v -0.125000 4.125000 1.750000 +v -0.125000 4.036612 1.713388 +v -0.125000 4.036612 1.536612 +v 1.250000 1.750000 1.750000 +v 1.338388 1.750000 1.713388 +v 1.375000 1.750000 1.625000 +v 1.338388 1.750000 1.536612 +v 1.250000 1.750000 1.500000 +v 1.161612 1.750000 1.536612 +v 1.125000 1.750000 1.625000 +v 1.161612 1.750000 1.713388 +v 1.250000 4.000000 1.750000 +v 1.338388 4.000000 1.713388 +v 1.375000 4.000000 1.625000 +v 1.338388 4.000000 1.536612 +v 1.250000 4.000000 1.500000 +v 1.161612 4.000000 1.536612 +v 1.125000 4.000000 1.625000 +v 1.161612 4.000000 1.713388 +v 1.213388 4.088388 1.750000 +v 1.275888 4.150888 1.713388 +v 1.301777 4.176777 1.625000 +v 1.275888 4.150888 1.536612 +v 1.213388 4.088388 1.500000 +v 1.150888 4.025888 1.536612 +v 1.150888 4.025888 1.713388 +v 1.125000 4.125000 1.750000 +v 1.125000 4.213388 1.713388 +v 1.125000 4.250000 1.625000 +v 1.125000 4.213388 1.536612 +v 1.125000 4.125000 1.500000 +v 1.125000 4.036612 1.536612 +v 1.125000 4.036612 1.713388 +v -1.750000 3.750000 1.500000 +v -1.838388 3.750000 1.536612 +v -1.875000 3.750000 1.625000 +v -1.838388 3.750000 1.713388 +v -1.750000 3.750000 1.750000 +v -1.661611 3.750000 1.713388 +v -1.625000 3.750000 1.625000 +v -1.661611 3.750000 1.536612 +v -1.750000 4.250000 1.500000 +v -1.838388 4.250000 1.536612 +v -1.875000 4.250000 1.625000 +v -1.838388 4.250000 1.713388 +v -1.750000 4.250000 1.750000 +v -1.661611 4.250000 1.713388 +v -1.625000 4.250000 1.625000 +v -1.661611 4.250000 1.536612 +v -1.713388 4.338388 1.500000 +v -1.775888 4.400888 1.536612 +v -1.801777 4.426777 1.625000 +v -1.775888 4.400888 1.713388 +v -1.713388 4.338388 1.750000 +v -1.650888 4.275888 1.713388 +v -1.650888 4.275888 1.536612 +v -1.625000 4.375000 1.500000 +v -1.625000 4.463388 1.536612 +v -1.625000 4.500000 1.625000 +v -1.625000 4.463388 1.713388 +v -1.625000 4.375000 1.750000 +v -1.625000 4.286612 1.713388 +v -1.625000 4.286612 1.536612 +v 1.750000 1.750000 1.750000 +v 1.838388 1.750000 1.713388 +v 1.875000 1.750000 1.625000 +v 1.838388 1.750000 1.536612 +v 1.750000 1.750000 1.500000 +v 1.661612 1.750000 1.536612 +v 1.625000 1.750000 1.625000 +v 1.661612 1.750000 1.713388 +v 1.750000 4.250000 1.750000 +v 1.838388 4.250000 1.713388 +v 1.875000 4.250000 1.625000 +v 1.838388 4.250000 1.536612 +v 1.750000 4.250000 1.500000 +v 1.661612 4.250000 1.536612 +v 1.625000 4.250000 1.625000 +v 1.661612 4.250000 1.713388 +v 1.713388 4.338388 1.750000 +v 1.775888 4.400888 1.713388 +v 1.801777 4.426777 1.625000 +v 1.775888 4.400888 1.536612 +v 1.713388 4.338388 1.500000 +v 1.650888 4.275888 1.536612 +v 1.650888 4.275888 1.713388 +v 1.625000 4.375000 1.750000 +v 1.625000 4.463388 1.713388 +v 1.625000 4.500000 1.625000 +v 1.625000 4.463388 1.536612 +v 1.625000 4.375000 1.500000 +v 1.625000 4.286612 1.536612 +v 1.625000 4.286612 1.713388 +v -0.250000 3.750000 0.250000 +v -0.338388 3.750000 0.286612 +v -0.375000 3.750000 0.375000 +v -0.338388 3.750000 0.463388 +v -0.250000 3.750000 0.500000 +v -0.161611 3.750000 0.463388 +v -0.125000 3.750000 0.375000 +v -0.161611 3.750000 0.286612 +v -0.250000 4.000000 0.250000 +v -0.338388 4.000000 0.286612 +v -0.375000 4.000000 0.375000 +v -0.338388 4.000000 0.463388 +v -0.250000 4.000000 0.500000 +v -0.161611 4.000000 0.463388 +v -0.125000 4.000000 0.375000 +v -0.161611 4.000000 0.286612 +v -0.213388 4.088388 0.250000 +v -0.275888 4.150888 0.286612 +v -0.301776 4.176777 0.375000 +v -0.275888 4.150888 0.463388 +v -0.213388 4.088388 0.500000 +v -0.150888 4.025888 0.463388 +v -0.150888 4.025888 0.286612 +v -0.125000 4.125000 0.250000 +v -0.125000 4.213388 0.286612 +v -0.125000 4.250000 0.375000 +v -0.125000 4.213388 0.463388 +v -0.125000 4.125000 0.500000 +v -0.125000 4.036612 0.463388 +v -0.125000 4.036612 0.286612 +v 1.250000 1.750000 0.500000 +v 1.338388 1.750000 0.463388 +v 1.375000 1.750000 0.375000 +v 1.338388 1.750000 0.286612 +v 1.250000 1.750000 0.250000 +v 1.161612 1.750000 0.286612 +v 1.125000 1.750000 0.375000 +v 1.161612 1.750000 0.463388 +v 1.250000 4.000000 0.500000 +v 1.338388 4.000000 0.463388 +v 1.375000 4.000000 0.375000 +v 1.338388 4.000000 0.286612 +v 1.250000 4.000000 0.250000 +v 1.161612 4.000000 0.286612 +v 1.125000 4.000000 0.375000 +v 1.161612 4.000000 0.463388 +v 1.213388 4.088388 0.500000 +v 1.275888 4.150888 0.463388 +v 1.301777 4.176777 0.375000 +v 1.275888 4.150888 0.286612 +v 1.213388 4.088388 0.250000 +v 1.150888 4.025888 0.286612 +v 1.150888 4.025888 0.463388 +v 1.125000 4.125000 0.500000 +v 1.125000 4.213388 0.463388 +v 1.125000 4.250000 0.375000 +v 1.125000 4.213388 0.286612 +v 1.125000 4.125000 0.250000 +v 1.125000 4.036612 0.286612 +v 1.125000 4.036612 0.463388 +v -1.750000 3.750000 0.250000 +v -1.838388 3.750000 0.286612 +v -1.875000 3.750000 0.375000 +v -1.838388 3.750000 0.463388 +v -1.750000 3.750000 0.500000 +v -1.661611 3.750000 0.463388 +v -1.625000 3.750000 0.375000 +v -1.661611 3.750000 0.286612 +v -1.750000 4.250000 0.250000 +v -1.838388 4.250000 0.286612 +v -1.875000 4.250000 0.375000 +v -1.838388 4.250000 0.463388 +v -1.750000 4.250000 0.500000 +v -1.661611 4.250000 0.463388 +v -1.625000 4.250000 0.375000 +v -1.661611 4.250000 0.286612 +v -1.713388 4.338388 0.250000 +v -1.775888 4.400888 0.286612 +v -1.801777 4.426777 0.375000 +v -1.775888 4.400888 0.463388 +v -1.713388 4.338388 0.500000 +v -1.650888 4.275888 0.463388 +v -1.650888 4.275888 0.286612 +v -1.625000 4.375000 0.250000 +v -1.625000 4.463388 0.286612 +v -1.625000 4.500000 0.375000 +v -1.625000 4.463388 0.463388 +v -1.625000 4.375000 0.500000 +v -1.625000 4.286612 0.463388 +v -1.625000 4.286612 0.286612 +v 1.750000 1.750000 0.500000 +v 1.838388 1.750000 0.463388 +v 1.875000 1.750000 0.375000 +v 1.838388 1.750000 0.286612 +v 1.750000 1.750000 0.250000 +v 1.661612 1.750000 0.286612 +v 1.625000 1.750000 0.375000 +v 1.661612 1.750000 0.463388 +v 1.750000 4.250000 0.500000 +v 1.838388 4.250000 0.463388 +v 1.875000 4.250000 0.375000 +v 1.838388 4.250000 0.286612 +v 1.750000 4.250000 0.250000 +v 1.661612 4.250000 0.286612 +v 1.625000 4.250000 0.375000 +v 1.661612 4.250000 0.463388 +v 1.713388 4.338388 0.500000 +v 1.775888 4.400888 0.463388 +v 1.801777 4.426777 0.375000 +v 1.775888 4.400888 0.286612 +v 1.713388 4.338388 0.250000 +v 1.650888 4.275888 0.286612 +v 1.650888 4.275888 0.463388 +v 1.625000 4.375000 0.500000 +v 1.625000 4.463388 0.463388 +v 1.625000 4.500000 0.375000 +v 1.625000 4.463388 0.286612 +v 1.625000 4.375000 0.250000 +v 1.625000 4.286612 0.286612 +v 1.625000 4.286612 0.463388 +v 1.125000 2.750000 0.500000 +v 1.875000 2.750000 0.500000 +v 1.125000 2.750000 0.000000 +v 1.875000 2.750000 0.000000 +v 1.125000 3.250000 0.000000 +v 1.125000 3.250000 0.500000 +v 1.875000 3.250000 0.500000 +v 1.875000 3.250000 0.000000 +v -0.250000 3.750000 0.000000 +v -0.338388 3.750000 0.036612 +v -0.375000 3.750000 0.125000 +v -0.338388 3.750000 0.213388 +v -0.250000 3.750000 0.250000 +v -0.161611 3.750000 0.213388 +v -0.125000 3.750000 0.125000 +v -0.161611 3.750000 0.036612 +v -0.250000 4.000000 0.000000 +v -0.338388 4.000000 0.036612 +v -0.375000 4.000000 0.125000 +v -0.338388 4.000000 0.213388 +v -0.250000 4.000000 0.250000 +v -0.161611 4.000000 0.213388 +v -0.125000 4.000000 0.125000 +v -0.161611 4.000000 0.036612 +v -0.213388 4.088388 0.000000 +v -0.275888 4.150888 0.036612 +v -0.301776 4.176777 0.125000 +v -0.275888 4.150888 0.213388 +v -0.213388 4.088388 0.250000 +v -0.150888 4.025888 0.213388 +v -0.150888 4.025888 0.036612 +v -0.125000 4.125000 0.000000 +v -0.125000 4.213388 0.036612 +v -0.125000 4.250000 0.125000 +v -0.125000 4.213388 0.213388 +v -0.125000 4.125000 0.250000 +v -0.125000 4.036612 0.213388 +v -0.125000 4.036612 0.036612 +v 1.250000 1.750000 0.250000 +v 1.338388 1.750000 0.213388 +v 1.375000 1.750000 0.125000 +v 1.338388 1.750000 0.036612 +v 1.250000 1.750000 0.000000 +v 1.161612 1.750000 0.036612 +v 1.125000 1.750000 0.125000 +v 1.161612 1.750000 0.213388 +v 1.250000 4.000000 0.250000 +v 1.338388 4.000000 0.213388 +v 1.375000 4.000000 0.125000 +v 1.338388 4.000000 0.036612 +v 1.250000 4.000000 0.000000 +v 1.161612 4.000000 0.036612 +v 1.125000 4.000000 0.125000 +v 1.161612 4.000000 0.213388 +v 1.213388 4.088388 0.250000 +v 1.275888 4.150888 0.213388 +v 1.301777 4.176777 0.125000 +v 1.275888 4.150888 0.036612 +v 1.213388 4.088388 0.000000 +v 1.150888 4.025888 0.036612 +v 1.150888 4.025888 0.213388 +v 1.125000 4.125000 0.250000 +v 1.125000 4.213388 0.213388 +v 1.125000 4.250000 0.125000 +v 1.125000 4.213388 0.036612 +v 1.125000 4.125000 0.000000 +v 1.125000 4.036612 0.036612 +v 1.125000 4.036612 0.213388 +v -1.750000 3.750000 0.000000 +v -1.838388 3.750000 0.036612 +v -1.875000 3.750000 0.125000 +v -1.838388 3.750000 0.213388 +v -1.750000 3.750000 0.250000 +v -1.661611 3.750000 0.213388 +v -1.625000 3.750000 0.125000 +v -1.661611 3.750000 0.036612 +v -1.750000 4.250000 0.000000 +v -1.838388 4.250000 0.036612 +v -1.875000 4.250000 0.125000 +v -1.838388 4.250000 0.213388 +v -1.750000 4.250000 0.250000 +v -1.661611 4.250000 0.213388 +v -1.625000 4.250000 0.125000 +v -1.661611 4.250000 0.036612 +v -1.713388 4.338388 0.000000 +v -1.775888 4.400888 0.036612 +v -1.801777 4.426777 0.125000 +v -1.775888 4.400888 0.213388 +v -1.713388 4.338388 0.250000 +v -1.650888 4.275888 0.213388 +v -1.650888 4.275888 0.036612 +v -1.625000 4.375000 0.000000 +v -1.625000 4.463388 0.036612 +v -1.625000 4.500000 0.125000 +v -1.625000 4.463388 0.213388 +v -1.625000 4.375000 0.250000 +v -1.625000 4.286612 0.213388 +v -1.625000 4.286612 0.036612 +v 1.750000 1.750000 0.250000 +v 1.838388 1.750000 0.213388 +v 1.875000 1.750000 0.125000 +v 1.838388 1.750000 0.036612 +v 1.750000 1.750000 0.000000 +v 1.661612 1.750000 0.036612 +v 1.625000 1.750000 0.125000 +v 1.661612 1.750000 0.213388 +v 1.750000 4.250000 0.250000 +v 1.838388 4.250000 0.213388 +v 1.875000 4.250000 0.125000 +v 1.838388 4.250000 0.036612 +v 1.750000 4.250000 0.000000 +v 1.661612 4.250000 0.036612 +v 1.625000 4.250000 0.125000 +v 1.661612 4.250000 0.213388 +v 1.713388 4.338388 0.250000 +v 1.775888 4.400888 0.213388 +v 1.801777 4.426777 0.125000 +v 1.775888 4.400888 0.036612 +v 1.713388 4.338388 0.000000 +v 1.650888 4.275888 0.036612 +v 1.650888 4.275888 0.213388 +v 1.625000 4.375000 0.250000 +v 1.625000 4.463388 0.213388 +v 1.625000 4.500000 0.125000 +v 1.625000 4.463388 0.036612 +v 1.625000 4.375000 0.000000 +v 1.625000 4.286612 0.036612 +v 1.625000 4.286612 0.213388 +v 1.875000 2.125000 0.000000 +v 1.875000 2.213388 0.036612 +v 1.875000 2.250000 0.125000 +v 1.875000 2.213388 0.213388 +v 1.875000 2.125000 0.250000 +v 1.875000 2.036612 0.213388 +v 1.875000 2.000000 0.125000 +v 1.875000 2.036612 0.036612 +v 1.937500 2.213388 0.036612 +v 1.937500 2.125000 0.000000 +v 1.937500 2.250000 0.125000 +v 1.937500 2.213388 0.213388 +v 1.937500 2.125000 0.250000 +v 1.937500 2.036612 0.213388 +v 1.937500 2.000000 0.125000 +v 1.937500 2.036612 0.036612 +v 1.875000 2.375000 1.500000 +v 1.875000 2.463388 1.536612 +v 1.875000 2.500000 1.625000 +v 1.875000 2.463388 1.713388 +v 1.875000 2.375000 1.750000 +v 1.875000 2.286612 1.713388 +v 1.875000 2.250000 1.625000 +v 1.875000 2.286612 1.536612 +v 1.937500 2.463388 1.536612 +v 1.937500 2.375000 1.500000 +v 1.937500 2.500000 1.625000 +v 1.937500 2.463388 1.713388 +v 1.937500 2.375000 1.750000 +v 1.937500 2.286612 1.713388 +v 1.937500 2.250000 1.625000 +v 1.937500 2.286612 1.536612 +v 1.125000 2.750000 2.000000 +v 1.875000 2.750000 2.000000 +v 1.125000 2.750000 1.500000 +v 1.875000 2.750000 1.500000 +v 1.125000 3.250000 1.500000 +v 1.125000 3.250000 2.000000 +v 1.875000 3.250000 2.000000 +v 1.875000 3.250000 1.500000 +v 1.125000 2.750000 0.500000 +v 1.875000 2.750000 0.500000 +v 1.125000 2.750000 0.000000 +v 1.875000 2.750000 0.000000 +v 1.125000 3.250000 0.000000 +v 1.125000 3.250000 0.500000 +v 1.875000 3.250000 0.500000 +v 1.875000 3.250000 0.000000 +vt 0.142857 0.247191 +vt 0.154762 0.269663 +vt 0.142857 0.269663 +vt 0.154762 0.292135 +vt 0.142857 0.314607 +vt 0.142857 0.292135 +vt 0.166667 0.269663 +vt 0.190476 0.269663 +vt 0.178571 0.292135 +vt 0.178571 0.269663 +vt 0.166667 0.292135 +vt 0.142857 0.247191 +vt 0.154762 0.269663 +vt 0.142857 0.269663 +vt 0.154762 0.292135 +vt 0.142857 0.314607 +vt 0.142857 0.292135 +vt 0.166667 0.269663 +vt 0.190476 0.269663 +vt 0.178571 0.292135 +vt 0.178571 0.269663 +vt 0.166667 0.292135 +vt 0.142857 0.247191 +vt 0.154762 0.269663 +vt 0.142857 0.269663 +vt 0.154762 0.292135 +vt 0.142857 0.314607 +vt 0.142857 0.292135 +vt 0.166667 0.269663 +vt 0.190476 0.269663 +vt 0.178571 0.292135 +vt 0.178571 0.269663 +vt 0.166667 0.292135 +vt 0.142857 0.247191 +vt 0.154762 0.269663 +vt 0.142857 0.269663 +vt 0.154762 0.292135 +vt 0.142857 0.314607 +vt 0.142857 0.292135 +vt 0.166667 0.269663 +vt 0.190476 0.269663 +vt 0.178571 0.292135 +vt 0.178571 0.269663 +vt 0.166667 0.292135 +vt 0.309524 0.505618 +vt 0.523810 0.516854 +vt 0.309524 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.523810 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.528090 +vt 0.309524 0.505618 +vt 0.523810 0.516854 +vt 0.309524 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.523810 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.528090 +vt 0.309524 0.505618 +vt 0.523810 0.516854 +vt 0.309524 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.523810 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.528090 +vt 0.309524 0.505618 +vt 0.523810 0.516854 +vt 0.309524 0.516854 +vt 0.309524 0.494382 +vt 0.523810 0.505618 +vt 0.523810 0.528090 +vt 0.523810 0.539326 +vt 0.309524 0.528090 +vt 0.523810 0.011236 +vt 0.535714 0.460674 +vt 0.523810 0.460674 +vt 0.541667 0.460674 +vt 0.553571 0.011236 +vt 0.553571 0.460674 +vt 0.559524 0.460674 +vt 0.559524 0.011236 +vt 0.553571 -0.000000 +vt 0.541667 0.011236 +vt 0.541667 -0.000000 +vt 0.541667 0.471910 +vt 0.553571 0.471910 +vt 0.535714 0.011236 +vt 0.309524 0.314607 +vt 0.190476 0.539326 +vt 0.190476 0.314607 +vt 0.190476 0.044944 +vt 0.309524 0.269663 +vt 0.190476 0.269663 +vt 0.309524 0.000000 +vt 0.190476 0.000000 +vt 0.333333 0.269663 +vt 0.309524 0.044944 +vt 0.333333 0.044944 +vt 0.166667 0.044944 +vt 0.166667 0.269663 +vt 0.023810 0.179775 +vt 0.142857 0.224719 +vt 0.023810 0.224719 +vt 0.142857 -0.000000 +vt 0.023810 0.044944 +vt 0.023810 -0.000000 +vt -0.000000 0.179775 +vt 0.142857 0.044944 +vt 0.142857 0.179775 +vt 0.166667 0.044944 +vt 0.166667 0.179775 +vt 0.023810 0.359551 +vt 0.333333 0.044944 +vt 0.357143 0.449438 +vt 0.333333 0.449438 +vt 0.428571 0.449438 +vt 0.452381 0.044944 +vt 0.452381 0.449438 +vt 0.238095 0.955056 +vt 0.190476 0.943820 +vt 0.238095 0.943820 +vt 0.428571 0.494382 +vt 0.357143 0.494382 +vt 0.523810 0.449438 +vt 0.523810 0.044944 +vt 0.357143 0.000000 +vt 0.428571 0.044944 +vt 0.357143 0.044944 +vt 0.773862 0.606741 +vt 0.791693 0.548444 +vt 0.827355 0.548444 +vt 0.791693 0.683275 +vt 0.827355 0.683275 +vt 0.845186 0.741573 +vt 0.845291 0.606741 +vt 0.863122 0.548444 +vt 0.898783 0.548444 +vt 0.863122 0.683275 +vt 0.898783 0.683275 +vt 0.916614 0.741573 +vt 0.702434 0.606741 +vt 0.720264 0.548444 +vt 0.755926 0.548444 +vt 0.720265 0.799871 +vt 0.720264 0.683275 +vt 0.773757 0.741573 +vt 0.916719 0.606741 +vt 0.934550 0.548444 +vt 0.970212 0.548444 +vt 0.934550 0.799871 +vt 0.934550 0.683275 +vt 0.988043 0.741573 +vt 0.535714 0.719101 +vt 0.654762 0.629214 +vt 0.654762 0.719101 +vt 0.702381 0.719101 +vt 0.702381 0.629214 +vt 0.535714 0.808989 +vt 0.654762 0.808989 +vt 0.488095 0.629214 +vt 0.488095 0.719101 +vt 0.654762 0.539326 +vt 0.535714 0.629214 +vt 0.535714 0.539326 +vt 0.151786 0.971910 +vt 0.122024 0.983146 +vt 0.122024 0.971910 +vt 0.226190 0.955056 +vt 0.190476 0.966292 +vt 0.190476 0.955056 +vt 0.261905 0.955056 +vt 0.226190 0.966292 +vt 0.154762 0.955056 +vt 0.119048 0.966292 +vt 0.119048 0.955056 +vt 0.154762 0.966292 +vt 0.193452 0.971910 +vt 0.223214 0.971910 +vt 0.229167 0.971910 +vt 0.261905 0.966292 +vt 0.258929 0.971910 +vt 0.157738 0.971910 +vt 0.187500 0.971910 +vt 0.157738 0.983146 +vt 0.193452 0.983146 +vt 0.229167 0.983146 +vt 0.422619 0.949451 +vt 0.428565 0.960674 +vt 0.422619 0.971897 +vt 0.410715 0.971897 +vt 0.404769 0.960674 +vt 0.410715 0.949451 +vt 0.095238 0.955056 +vt 0.059524 1.000000 +vt 0.059524 0.955056 +vt 0.035714 0.955056 +vt 0.000000 1.000000 +vt 0.000000 0.955056 +vt 0.035714 1.000000 +vt 0.119048 0.955056 +vt 0.095238 1.000000 +vt 0.261905 0.932584 +vt 0.291667 0.926966 +vt 0.291667 0.932584 +vt 0.261905 0.926966 +vt 0.291667 0.921348 +vt 0.291667 0.926966 +vt 0.261905 0.921348 +vt 0.291667 0.915730 +vt 0.291667 0.921348 +vt 0.261905 0.915730 +vt 0.291667 0.910112 +vt 0.291667 0.915730 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.190476 0.955056 +vt 0.000000 0.943820 +vt 0.190476 0.943820 +vt 0.238095 0.955056 +vt 0.238095 0.943820 +vt 0.000000 0.955056 +vt 0.000000 0.943820 +vt 0.107143 0.786517 +vt 0.035714 0.382022 +vt 0.107143 0.382022 +vt 0.035714 0.853933 +vt 0.107143 0.786517 +vt 0.107143 0.853933 +vt 0.000000 0.382022 +vt 0.035714 0.786517 +vt -0.000000 0.786517 +vt 0.035714 0.853933 +vt 0.107143 0.786517 +vt 0.107143 0.853933 +vt 0.000000 0.382022 +vt 0.035714 0.786517 +vt 0.000000 0.786517 +vt 0.107143 0.382022 +vt 0.035714 0.382022 +vt 0.226190 0.679775 +vt 0.238095 0.707865 +vt 0.226190 0.702247 +vt 0.238095 0.640449 +vt 0.226190 0.668539 +vt 0.226190 0.646067 +vt 0.226190 0.612360 +vt 0.226190 0.634831 +vt 0.226190 0.578652 +vt 0.238095 0.606742 +vt 0.226190 0.601124 +vt 0.226190 0.544944 +vt 0.238095 0.573034 +vt 0.226190 0.567416 +vt 0.226190 0.915730 +vt 0.238095 0.943820 +vt 0.226190 0.938202 +vt 0.226190 0.882023 +vt 0.238095 0.910112 +vt 0.226190 0.904494 +vt 0.238095 0.842697 +vt 0.226190 0.870786 +vt 0.226190 0.848315 +vt 0.226190 0.814607 +vt 0.226190 0.837079 +vt 0.238095 0.775281 +vt 0.226190 0.803371 +vt 0.226190 0.780899 +vt 0.238095 0.741573 +vt 0.226190 0.769663 +vt 0.226190 0.747191 +vt 0.226190 0.735955 +vt 0.226190 0.713483 +vt 0.261905 0.679775 +vt 0.250000 0.707865 +vt 0.250000 0.674157 +vt 0.261905 0.713483 +vt 0.250000 0.741573 +vt 0.261905 0.747191 +vt 0.250000 0.775281 +vt 0.261905 0.803371 +vt 0.250000 0.808989 +vt 0.261905 0.814607 +vt 0.250000 0.842697 +vt 0.261905 0.870786 +vt 0.250000 0.876405 +vt 0.261905 0.882023 +vt 0.250000 0.910112 +vt 0.261905 0.915730 +vt 0.250000 0.943820 +vt 0.261905 0.544944 +vt 0.250000 0.573034 +vt 0.250000 0.539326 +vt 0.261905 0.578652 +vt 0.250000 0.606742 +vt 0.261905 0.612360 +vt 0.250000 0.640449 +vt 0.261905 0.668539 +vt 0.333333 0.679775 +vt 0.345238 0.707865 +vt 0.333333 0.702247 +vt 0.345238 0.640449 +vt 0.333333 0.668539 +vt 0.333333 0.646067 +vt 0.333333 0.612360 +vt 0.333333 0.634831 +vt 0.333333 0.578652 +vt 0.345238 0.606742 +vt 0.333333 0.601124 +vt 0.333333 0.544944 +vt 0.345238 0.573034 +vt 0.333333 0.567416 +vt 0.333333 0.915730 +vt 0.345238 0.943820 +vt 0.333333 0.938202 +vt 0.333333 0.882023 +vt 0.345238 0.910112 +vt 0.333333 0.904494 +vt 0.345238 0.842697 +vt 0.333333 0.870786 +vt 0.333333 0.848315 +vt 0.333333 0.814607 +vt 0.333333 0.837079 +vt 0.345238 0.775281 +vt 0.333333 0.803371 +vt 0.333333 0.780899 +vt 0.345238 0.741573 +vt 0.333333 0.769663 +vt 0.333333 0.747191 +vt 0.333333 0.735955 +vt 0.333333 0.713483 +vt 0.369048 0.679775 +vt 0.357143 0.707865 +vt 0.357143 0.674157 +vt 0.369048 0.713483 +vt 0.357143 0.741573 +vt 0.369048 0.747191 +vt 0.357143 0.775281 +vt 0.369048 0.803371 +vt 0.357143 0.808989 +vt 0.369048 0.814607 +vt 0.357143 0.842697 +vt 0.369048 0.870786 +vt 0.357143 0.876405 +vt 0.369048 0.882023 +vt 0.357143 0.910112 +vt 0.369048 0.915730 +vt 0.357143 0.943820 +vt 0.369048 0.544944 +vt 0.357143 0.573034 +vt 0.357143 0.539326 +vt 0.369048 0.578652 +vt 0.357143 0.606742 +vt 0.369048 0.612360 +vt 0.357143 0.640449 +vt 0.369048 0.668539 +vt 0.154774 0.623152 +vt 0.154774 0.545387 +vt 0.190452 0.584270 +vt 0.178559 0.635275 +vt 0.190452 0.674157 +vt 0.154774 0.713040 +vt 0.041667 0.921348 +vt 0.113095 0.853933 +vt 0.113095 0.921348 +vt 0.119048 0.921348 +vt 0.190476 0.853933 +vt 0.190476 0.921348 +vt 0.119048 0.853933 +vt 0.035714 0.921348 +vt 0.041667 0.853933 +vt 0.041667 0.921348 +vt 0.113095 0.853933 +vt 0.113095 0.921348 +vt 0.119048 0.921348 +vt 0.190476 0.853933 +vt 0.190476 0.921348 +vt 0.119048 0.853933 +vt 0.035714 0.921348 +vt 0.041667 0.853933 +vt 0.041667 0.921348 +vt 0.113095 0.853933 +vt 0.113095 0.921348 +vt 0.119048 0.921348 +vt 0.190476 0.853933 +vt 0.190476 0.921348 +vt 0.119048 0.853933 +vt 0.035714 0.921348 +vt 0.041667 0.853933 +vt 0.041667 0.921348 +vt 0.113095 0.853933 +vt 0.113095 0.921348 +vt 0.119048 0.921348 +vt 0.190476 0.853933 +vt 0.190476 0.921348 +vt 0.119048 0.853933 +vt 0.035714 0.921348 +vt 0.041667 0.853933 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.428571 0.471910 +vt 0.440476 0.460674 +vt 0.440476 0.471910 +vt 0.428571 0.483146 +vt 0.440476 0.483146 +vt 0.428571 0.460674 +vt 0.440476 0.449438 +vt 0.428571 0.494382 +vt 0.440476 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.511905 0.471910 +vt 0.523810 0.460674 +vt 0.523810 0.471910 +vt 0.511905 0.483146 +vt 0.523810 0.483146 +vt 0.511905 0.460674 +vt 0.523810 0.449438 +vt 0.511905 0.494382 +vt 0.523810 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.511905 0.460674 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.483146 +vt 0.511905 0.471910 +vt 0.511905 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.483146 +vt 0.511905 0.471910 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.483146 +vt 0.440476 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.511905 0.471910 +vt 0.440476 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.511905 0.460674 +vt 0.440476 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.494382 +vt 0.511905 0.483146 +vt 0.511905 0.494382 +vt 0.440476 0.460674 +vt 0.511905 0.449438 +vt 0.440476 0.471910 +vt 0.440476 0.483146 +vt 0.440476 0.483146 +vt 0.440476 0.494382 +vt 0.511905 0.494382 +vt 0.523810 0.011236 +vt 0.535714 0.460674 +vt 0.523810 0.460674 +vt 0.541667 0.460674 +vt 0.553571 0.011236 +vt 0.553571 0.460674 +vt 0.559524 0.460674 +vt 0.559524 0.011236 +vt 0.553571 -0.000000 +vt 0.541667 0.011236 +vt 0.541667 -0.000000 +vt 0.541667 0.471910 +vt 0.553571 0.471910 +vt 0.535714 0.011236 +vt 0.523810 0.011236 +vt 0.535714 0.460674 +vt 0.523810 0.460674 +vt 0.541667 0.460674 +vt 0.553571 0.011236 +vt 0.553571 0.460674 +vt 0.559524 0.460674 +vt 0.559524 0.011236 +vt 0.553571 -0.000000 +vt 0.541667 0.011236 +vt 0.541667 -0.000000 +vt 0.541667 0.471910 +vt 0.553571 0.471910 +vt 0.535714 0.011236 +vt 0.523810 0.011236 +vt 0.535714 0.460674 +vt 0.523810 0.460674 +vt 0.541667 0.460674 +vt 0.553571 0.011236 +vt 0.553571 0.460674 +vt 0.559524 0.460674 +vt 0.559524 0.011236 +vt 0.553571 -0.000000 +vt 0.541667 0.011236 +vt 0.541667 -0.000000 +vt 0.541667 0.471910 +vt 0.553571 0.471910 +vt 0.535714 0.011236 +vt 0.523810 0.011236 +vt 0.535714 0.460674 +vt 0.523810 0.460674 +vt 0.541667 0.460674 +vt 0.553571 0.011236 +vt 0.553571 0.460674 +vt 0.559524 0.460674 +vt 0.559524 0.011236 +vt 0.553571 -0.000000 +vt 0.541667 0.011236 +vt 0.541667 -0.000000 +vt 0.541667 0.471910 +vt 0.553571 0.471910 +vt 0.535714 0.011236 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.175595 0.365169 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.175595 0.365169 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.172619 0.382022 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.157738 0.320225 +vt 0.175595 0.353933 +vt 0.157738 0.353933 +vt 0.160714 0.303371 +vt 0.172619 0.292135 +vt 0.172619 0.303371 +vt 0.175595 0.320225 +vt 0.181548 0.353933 +vt 0.151786 0.320225 +vt 0.175595 0.308989 +vt 0.157738 0.365169 +vt 0.160714 0.370787 +vt 0.175595 0.365169 +vt 0.172619 0.370787 +vt 0.148810 0.325843 +vt 0.151786 0.353933 +vt 0.148810 0.348315 +vt 0.157738 0.308989 +vt 0.184524 0.348315 +vt 0.181548 0.320225 +vt 0.184524 0.325843 +vt 0.160714 0.382022 +vt 0.190476 0.348315 +vt 0.142857 0.325843 +vt 0.095238 0.955056 +vt 0.059524 1.000000 +vt 0.059524 0.955056 +vt 0.035714 0.955056 +vt 0.000000 1.000000 +vt 0.000000 0.955056 +vt 0.035714 1.000000 +vt 0.119048 0.955056 +vt 0.095238 1.000000 +vt 0.422619 0.949451 +vt 0.428565 0.960674 +vt 0.422619 0.971897 +vt 0.410715 0.971897 +vt 0.404769 0.960674 +vt 0.410715 0.949451 +vt 0.422619 0.949451 +vt 0.428565 0.960674 +vt 0.422619 0.971897 +vt 0.404769 0.960674 +vt 0.410715 0.949451 +vt 0.416660 0.960674 +vt 0.059524 1.000000 +vt 0.095238 0.955056 +vt 0.059524 0.955056 +vt 0.000000 1.000000 +vt 0.035714 0.955056 +vt 0.000000 0.955056 +vt 0.035714 1.000000 +vt 0.095238 1.000000 +vt 0.119048 0.955056 +vt 0.059524 1.000000 +vt 0.095238 0.955056 +vt 0.059524 0.955056 +vt 0.000000 1.000000 +vt 0.035714 0.955056 +vt 0.000000 0.955056 +vt 0.035714 1.000000 +vt 0.095238 1.000000 +vt 0.119048 0.955056 +vt 0.154762 0.247191 +vt 0.154762 0.314607 +vt 0.190476 0.292135 +vt 0.154762 0.247191 +vt 0.154762 0.314607 +vt 0.190476 0.292135 +vt 0.154762 0.247191 +vt 0.154762 0.314607 +vt 0.190476 0.292135 +vt 0.154762 0.247191 +vt 0.154762 0.314607 +vt 0.190476 0.292135 +vt 0.523810 0.494382 +vt 0.309524 0.539326 +vt 0.523810 0.494382 +vt 0.309524 0.539326 +vt 0.523810 0.494382 +vt 0.309524 0.539326 +vt 0.523810 0.494382 +vt 0.309524 0.539326 +vt 0.309524 0.539326 +vt -0.000000 0.044944 +vt 0.142857 0.359551 +vt 0.190476 0.955056 +vt 0.428571 0.000000 +vt 0.840408 0.573083 +vt 0.827355 0.665039 +vt 0.845186 0.606742 +vt 0.840408 0.640400 +vt 0.809524 0.674058 +vt 0.791693 0.665039 +vt 0.778640 0.640400 +vt 0.778640 0.573083 +vt 0.809524 0.539425 +vt 0.840408 0.775231 +vt 0.827355 0.799871 +vt 0.809524 0.808889 +vt 0.791693 0.799871 +vt 0.778640 0.775231 +vt 0.773862 0.741573 +vt 0.778640 0.707915 +vt 0.809524 0.674256 +vt 0.840408 0.707915 +vt 0.911837 0.573083 +vt 0.898783 0.665039 +vt 0.916614 0.606742 +vt 0.911837 0.640400 +vt 0.880953 0.674058 +vt 0.863122 0.665039 +vt 0.850069 0.640400 +vt 0.850069 0.573083 +vt 0.880953 0.539425 +vt 0.911836 0.775231 +vt 0.898783 0.799871 +vt 0.880953 0.808889 +vt 0.863122 0.799871 +vt 0.850069 0.775231 +vt 0.845291 0.741573 +vt 0.850069 0.707915 +vt 0.880953 0.674256 +vt 0.911836 0.707915 +vt 0.768979 0.573083 +vt 0.755926 0.665039 +vt 0.773757 0.606742 +vt 0.768979 0.640400 +vt 0.738095 0.674058 +vt 0.720265 0.665039 +vt 0.707211 0.640400 +vt 0.707211 0.573083 +vt 0.738096 0.539425 +vt 0.768979 0.775231 +vt 0.755926 0.799871 +vt 0.738095 0.808889 +vt 0.707211 0.775231 +vt 0.702434 0.741573 +vt 0.707211 0.707915 +vt 0.738095 0.674256 +vt 0.755926 0.683275 +vt 0.768979 0.707915 +vt 0.983265 0.573083 +vt 0.970212 0.665039 +vt 0.988043 0.606742 +vt 0.983265 0.640400 +vt 0.952381 0.674058 +vt 0.934550 0.665039 +vt 0.921497 0.640400 +vt 0.921497 0.573083 +vt 0.952381 0.539425 +vt 0.983265 0.775231 +vt 0.970212 0.799871 +vt 0.952381 0.808889 +vt 0.921497 0.775231 +vt 0.916719 0.741573 +vt 0.921497 0.707915 +vt 0.952381 0.674256 +vt 0.970212 0.683275 +vt 0.983265 0.707915 +vt 0.151786 0.983146 +vt 0.187500 0.983146 +vt 0.223214 0.983146 +vt 0.258929 0.983146 +vt 0.418415 0.968610 +vt 0.416674 0.960674 +vt 0.418415 0.952738 +vt 0.426823 0.952738 +vt 0.426823 0.968610 +vt 0.416660 0.960674 +vt 0.414919 0.968610 +vt 0.406511 0.968610 +vt 0.406511 0.952738 +vt 0.414919 0.952738 +vt 0.119048 1.000000 +vt 0.261905 0.926966 +vt 0.261905 0.921348 +vt 0.261905 0.915730 +vt 0.261905 0.910112 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.000000 0.955056 +vt 0.035714 0.786517 +vt 0.035714 0.382022 +vt 0.238095 0.674157 +vt 0.238095 0.539326 +vt 0.238095 0.876405 +vt 0.238095 0.808989 +vt 0.261905 0.702247 +vt 0.261905 0.735955 +vt 0.261905 0.769663 +vt 0.261905 0.780899 +vt 0.261905 0.837079 +vt 0.261905 0.848315 +vt 0.261905 0.904494 +vt 0.261905 0.938202 +vt 0.261905 0.567416 +vt 0.261905 0.601124 +vt 0.261905 0.634831 +vt 0.261905 0.646067 +vt 0.345238 0.674157 +vt 0.345238 0.539326 +vt 0.345238 0.876405 +vt 0.345238 0.808989 +vt 0.369048 0.702247 +vt 0.369048 0.735955 +vt 0.369048 0.769663 +vt 0.369048 0.780899 +vt 0.369048 0.837079 +vt 0.369048 0.848315 +vt 0.369048 0.904494 +vt 0.369048 0.938202 +vt 0.369048 0.567416 +vt 0.369048 0.601124 +vt 0.369048 0.634831 +vt 0.369048 0.646067 +vt 0.187265 0.606718 +vt 0.178559 0.623152 +vt 0.166667 0.629167 +vt 0.146068 0.606719 +vt 0.142882 0.584270 +vt 0.146068 0.561821 +vt 0.166667 0.539372 +vt 0.178559 0.545387 +vt 0.187265 0.561821 +vt 0.146068 0.696606 +vt 0.142882 0.674157 +vt 0.146068 0.651709 +vt 0.154774 0.635275 +vt 0.166667 0.629260 +vt 0.187265 0.651709 +vt 0.187265 0.696606 +vt 0.178559 0.713040 +vt 0.166667 0.719055 +vt 0.035714 0.853933 +vt 0.035714 0.853933 +vt 0.035714 0.853933 +vt 0.035714 0.853933 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.428571 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.511905 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.440476 0.449438 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.160714 0.292135 +vt 0.172619 0.382022 +vt 0.190476 0.325843 +vt 0.142857 0.348315 +vt 0.119048 1.000000 +vt 0.418415 0.968610 +vt 0.416674 0.960674 +vt 0.418415 0.952738 +vt 0.426823 0.952738 +vt 0.426823 0.968610 +vt 0.416660 0.960674 +vt 0.414919 0.968610 +vt 0.406511 0.968610 +vt 0.406511 0.952738 +vt 0.414919 0.952738 +vt 0.418415 0.968610 +vt 0.416674 0.960674 +vt 0.418415 0.952738 +vt 0.426823 0.952738 +vt 0.426823 0.968610 +vt 0.414919 0.968610 +vt 0.410715 0.971897 +vt 0.406511 0.968610 +vt 0.406511 0.952738 +vt 0.414919 0.952738 +vt 0.119048 1.000000 +vt 0.119048 1.000000 +vt 0.577381 0.269663 +vt 0.559524 0.539326 +vt 0.559524 0.269663 +vt 0.702381 0.269663 +vt 0.684524 0.539326 +vt 0.684524 0.269663 +vt 0.738095 0.269663 +vt 0.720238 0.539326 +vt 0.720238 0.269663 +vt 0.648810 0.269663 +vt 0.630952 0.539326 +vt 0.630952 0.269663 +vt 0.595238 0.269663 +vt 0.577381 0.539326 +vt 0.702381 0.539326 +vt 0.755952 0.269663 +vt 0.738095 0.539326 +vt 0.666667 0.269663 +vt 0.648810 0.539326 +vt 0.613095 0.269663 +vt 0.595238 0.539326 +vt 0.773810 0.269663 +vt 0.755952 0.539326 +vt 0.666667 0.539326 +vt 0.613095 0.539326 +vt 0.773810 0.269663 +vt 0.791667 0.539326 +vt 0.773810 0.539326 +vt 0.916667 0.269663 +vt 0.898810 0.539326 +vt 0.898810 0.269663 +vt 0.952381 0.269663 +vt 0.934524 0.539326 +vt 0.934524 0.269663 +vt 0.863095 0.269663 +vt 0.845238 0.539326 +vt 0.845238 0.269663 +vt 0.791667 0.269663 +vt 0.809524 0.539326 +vt 0.916667 0.539326 +vt 0.970238 0.269663 +vt 0.952381 0.539326 +vt 0.880952 0.269663 +vt 0.863095 0.539326 +vt 0.827381 0.269663 +vt 0.809524 0.269663 +vt 0.988095 0.269663 +vt 0.970238 0.539326 +vt 0.880952 0.539326 +vt 0.827381 0.539326 +vt 0.577381 0.000000 +vt 0.559524 0.269663 +vt 0.559524 0.000000 +vt 0.702381 0.000000 +vt 0.684524 0.269663 +vt 0.684524 0.000000 +vt 0.738095 0.000000 +vt 0.720238 0.269663 +vt 0.720238 0.000000 +vt 0.648810 0.000000 +vt 0.630952 0.269663 +vt 0.630952 0.000000 +vt 0.595238 0.000000 +vt 0.577381 0.269663 +vt 0.702381 0.269663 +vt 0.755952 0.000000 +vt 0.738095 0.269663 +vt 0.666667 0.000000 +vt 0.648810 0.269663 +vt 0.613095 0.000000 +vt 0.595238 0.269663 +vt 0.773810 0.000000 +vt 0.755952 0.269663 +vt 0.666667 0.269663 +vt 0.613095 0.269663 +vt 0.791667 0.000000 +vt 0.773810 0.269663 +vt 0.773810 0.000000 +vt 0.916667 0.000000 +vt 0.898810 0.269663 +vt 0.898810 0.000000 +vt 0.952381 0.000000 +vt 0.934524 0.269663 +vt 0.934524 0.000000 +vt 0.863095 0.000000 +vt 0.845238 0.269663 +vt 0.845238 0.000000 +vt 0.809524 0.000000 +vt 0.791667 0.269663 +vt 0.916667 0.269663 +vt 0.970238 0.269663 +vt 0.952381 0.269663 +vt 0.880952 0.000000 +vt 0.863095 0.269663 +vt 0.827381 0.000000 +vt 0.809524 0.269663 +vt 0.988095 0.000000 +vt 0.970238 0.000000 +vt 0.880952 0.269663 +vt 0.827381 0.269663 +vt 0.785714 0.887640 +vt 0.797619 0.898876 +vt 0.785714 0.898876 +vt 0.785714 0.820225 +vt 0.797619 0.831461 +vt 0.785714 0.831461 +vt 0.785714 0.842697 +vt 0.797619 0.853933 +vt 0.785714 0.853933 +vt 0.785714 0.865169 +vt 0.797619 0.876405 +vt 0.785714 0.876405 +vt 0.797619 0.887640 +vt 0.785714 0.808989 +vt 0.797619 0.820225 +vt 0.797619 0.842697 +vt 0.797619 0.865169 +vt 0.800595 0.876405 +vt 0.806548 0.865169 +vt 0.806548 0.876405 +vt 0.806548 0.887640 +vt 0.803571 0.887640 +vt 0.800595 0.831461 +vt 0.806548 0.842697 +vt 0.803571 0.820225 +vt 0.806548 0.831461 +vt 0.806548 0.853933 +vt 0.806548 0.820225 +vt 0.812500 0.831461 +vt 0.815476 0.842697 +vt 0.815476 0.853933 +vt 0.815476 0.865169 +vt 0.812500 0.876405 +vt 0.809524 0.887640 +vt 0.806548 0.808989 +vt 0.809524 0.820225 +vt 0.806548 0.898876 +vt 1.000000 0.820225 +vt 0.892857 0.808989 +vt 1.000000 0.808989 +vt 1.000000 0.887640 +vt 0.892857 0.876405 +vt 1.000000 0.876405 +vt 1.000000 0.865169 +vt 0.892857 0.853933 +vt 1.000000 0.853933 +vt 1.000000 0.842697 +vt 0.892857 0.831461 +vt 1.000000 0.831461 +vt 0.892857 0.820225 +vt 1.000000 0.898876 +vt 0.892857 0.887640 +vt 0.892857 0.865169 +vt 0.892857 0.842697 +vt 0.889881 0.831461 +vt 0.883929 0.842697 +vt 0.883929 0.831461 +vt 0.883929 0.820225 +vt 0.886905 0.820225 +vt 0.889881 0.876405 +vt 0.883929 0.865169 +vt 0.883929 0.853933 +vt 0.883929 0.887640 +vt 0.883929 0.876405 +vt 0.877976 0.876405 +vt 0.875000 0.865169 +vt 0.875000 0.853933 +vt 0.877976 0.831461 +vt 0.880952 0.820225 +vt 0.875000 0.842697 +vt 0.886905 0.887640 +vt 0.883929 0.898876 +vt 0.880952 0.887640 +vt 0.883929 0.808989 +vt 0.875000 0.831461 +vt 0.815476 0.831461 +vt 0.875000 0.820225 +vt 0.815476 0.820225 +vt 0.875000 0.808989 +vt 0.815476 0.808989 +vt 0.815476 0.898876 +vt 0.875000 0.887640 +vt 0.875000 0.898876 +vt 0.875000 0.876405 +vt 0.815476 0.887640 +vt 0.815476 0.876405 +vt 0.452381 0.887640 +vt 0.476190 0.898876 +vt 0.452381 0.898876 +vt 0.452381 0.820225 +vt 0.476190 0.831461 +vt 0.452381 0.831461 +vt 0.452381 0.842697 +vt 0.476190 0.853933 +vt 0.452381 0.853933 +vt 0.452381 0.865169 +vt 0.476190 0.876405 +vt 0.452381 0.876405 +vt 0.476190 0.887640 +vt 0.452381 0.808989 +vt 0.476190 0.820225 +vt 0.476190 0.842697 +vt 0.476190 0.865169 +vt 0.479167 0.876405 +vt 0.485119 0.865169 +vt 0.485119 0.876405 +vt 0.485119 0.887640 +vt 0.482143 0.887640 +vt 0.485119 0.831461 +vt 0.485119 0.842697 +vt 0.485119 0.853933 +vt 0.479167 0.831461 +vt 0.485119 0.820225 +vt 0.491071 0.831461 +vt 0.494048 0.853933 +vt 0.491071 0.876405 +vt 0.488095 0.887640 +vt 0.494048 0.842697 +vt 0.494048 0.865169 +vt 0.482143 0.820225 +vt 0.485119 0.808989 +vt 0.488095 0.820225 +vt 0.485119 0.898876 +vt 0.785714 0.820225 +vt 0.666667 0.808989 +vt 0.785714 0.808989 +vt 0.785714 0.887640 +vt 0.666667 0.876405 +vt 0.785714 0.876405 +vt 0.785714 0.865169 +vt 0.666667 0.853933 +vt 0.785714 0.853933 +vt 0.785714 0.842697 +vt 0.666667 0.831461 +vt 0.785714 0.831461 +vt 0.666667 0.820225 +vt 0.785714 0.898876 +vt 0.666667 0.887640 +vt 0.666667 0.865169 +vt 0.666667 0.842697 +vt 0.663690 0.831461 +vt 0.657738 0.842697 +vt 0.657738 0.831461 +vt 0.657738 0.820225 +vt 0.660714 0.820225 +vt 0.663690 0.876405 +vt 0.657738 0.865169 +vt 0.657738 0.853933 +vt 0.657738 0.887640 +vt 0.657738 0.876405 +vt 0.651786 0.876405 +vt 0.648810 0.853933 +vt 0.648810 0.842697 +vt 0.651786 0.831461 +vt 0.654762 0.820225 +vt 0.648810 0.865169 +vt 0.660714 0.887640 +vt 0.657738 0.898876 +vt 0.654762 0.887640 +vt 0.657738 0.808989 +vt 0.648810 0.831461 +vt 0.494048 0.831461 +vt 0.648810 0.820225 +vt 0.494048 0.820225 +vt 0.648810 0.808989 +vt 0.494048 0.808989 +vt 0.494048 0.898876 +vt 0.648810 0.887640 +vt 0.648810 0.898876 +vt 0.648810 0.876405 +vt 0.494048 0.887640 +vt 0.494048 0.876405 +vt 0.404762 0.949438 +vt 0.410714 0.943820 +vt 0.410714 0.949438 +vt 0.416667 0.949438 +vt 0.422619 0.943820 +vt 0.422619 0.949438 +vt 0.428571 0.949438 +vt 0.434524 0.943820 +vt 0.434524 0.949438 +vt 0.446429 0.949438 +vt 0.452381 0.943820 +vt 0.452381 0.949438 +vt 0.416667 0.943820 +vt 0.428571 0.943820 +vt 0.440476 0.943820 +vt 0.440476 0.949438 +vt 0.446429 0.943820 +vt 0.214286 0.741573 +vt 0.202381 0.707865 +vt 0.214286 0.707865 +vt 0.214286 0.573034 +vt 0.202381 0.539326 +vt 0.214286 0.539326 +vt 0.214286 0.876405 +vt 0.202381 0.842697 +vt 0.214286 0.842697 +vt 0.214286 0.775281 +vt 0.202381 0.741573 +vt 0.214286 0.606742 +vt 0.202381 0.573034 +vt 0.214286 0.674157 +vt 0.202381 0.640449 +vt 0.214286 0.640449 +vt 0.214286 0.910112 +vt 0.202381 0.876405 +vt 0.214286 0.808989 +vt 0.202381 0.775281 +vt 0.202381 0.606742 +vt 0.202381 0.674157 +vt 0.214286 0.943820 +vt 0.202381 0.910112 +vt 0.202381 0.808989 +vt 0.392857 0.640449 +vt 0.380952 0.674157 +vt 0.380952 0.640449 +vt 0.392857 0.876405 +vt 0.380952 0.910112 +vt 0.380952 0.876405 +vt 0.392857 0.775281 +vt 0.380952 0.808989 +vt 0.380952 0.775281 +vt 0.392857 0.606742 +vt 0.380952 0.606742 +vt 0.392857 0.674157 +vt 0.380952 0.707865 +vt 0.392857 0.910112 +vt 0.380952 0.943820 +vt 0.392857 0.808989 +vt 0.380952 0.842697 +vt 0.392857 0.707865 +vt 0.380952 0.741573 +vt 0.392857 0.539326 +vt 0.380952 0.573034 +vt 0.380952 0.539326 +vt 0.392857 0.842697 +vt 0.392857 0.741573 +vt 0.392857 0.573034 +vt 0.190476 0.668539 +vt 0.190476 0.646067 +vt 0.190476 0.679775 +vt 0.190476 0.713483 +vt 0.190476 0.769663 +vt 0.190476 0.747191 +vt 0.190476 0.780899 +vt 0.190476 0.814607 +vt 0.190476 0.870786 +vt 0.190476 0.848315 +vt 0.190476 0.882023 +vt 0.202381 0.943820 +vt 0.190476 0.915730 +vt 0.190476 0.544944 +vt 0.190476 0.578652 +vt 0.190476 0.612360 +vt 0.333333 0.629214 +vt 0.261905 0.651685 +vt 0.261905 0.629214 +vt 0.333333 0.651685 +vt 0.261905 0.674157 +vt 0.333333 0.674157 +vt 0.261905 0.696629 +vt 0.333333 0.696629 +vt 0.261905 0.719101 +vt 0.333333 0.719101 +vt 0.261905 0.741573 +vt 0.333333 0.741573 +vt 0.261905 0.764045 +vt 0.333333 0.764045 +vt 0.261905 0.786517 +vt 0.333333 0.786517 +vt 0.261905 0.808989 +vt 0.333333 0.539326 +vt 0.261905 0.561798 +vt 0.261905 0.539326 +vt 0.333333 0.561798 +vt 0.261905 0.584270 +vt 0.333333 0.584270 +vt 0.261905 0.606742 +vt 0.333333 0.606742 +vt 0.404762 0.702247 +vt 0.404762 0.713483 +vt 0.404762 0.769663 +vt 0.404762 0.780899 +vt 0.404762 0.814607 +vt 0.404762 0.870786 +vt 0.404762 0.882023 +vt 0.404762 0.915730 +vt 0.392857 0.943820 +vt 0.404762 0.544944 +vt 0.404762 0.578652 +vt 0.404762 0.612360 +vt 0.404762 0.668539 +vt 0.767857 0.977528 +vt 0.779762 0.988764 +vt 0.767857 0.988764 +vt 0.767857 0.910112 +vt 0.779762 0.921348 +vt 0.767857 0.921348 +vt 0.767857 0.932584 +vt 0.779762 0.943820 +vt 0.767857 0.943820 +vt 0.767857 0.955056 +vt 0.779762 0.966292 +vt 0.767857 0.966292 +vt 0.779762 0.977528 +vt 0.767857 0.898876 +vt 0.779762 0.910112 +vt 0.779762 0.932584 +vt 0.779762 0.955056 +vt 0.788690 0.966292 +vt 0.782738 0.966292 +vt 0.788690 0.977528 +vt 0.785714 0.977528 +vt 0.788690 0.921348 +vt 0.788690 0.932584 +vt 0.788690 0.955056 +vt 0.782738 0.921348 +vt 0.788690 0.910112 +vt 0.788690 0.943820 +vt 0.794643 0.921348 +vt 0.797619 0.932584 +vt 0.797619 0.943820 +vt 0.797619 0.955056 +vt 0.794643 0.966292 +vt 0.791667 0.977528 +vt 0.785714 0.910112 +vt 0.788690 0.898876 +vt 0.791667 0.910112 +vt 0.788690 0.988764 +vt 0.940476 0.910112 +vt 0.869048 0.898876 +vt 0.940476 0.898876 +vt 0.940476 0.977528 +vt 0.869048 0.966292 +vt 0.940476 0.966292 +vt 0.940476 0.955056 +vt 0.869048 0.943820 +vt 0.940476 0.943820 +vt 0.940476 0.932584 +vt 0.869048 0.921348 +vt 0.940476 0.921348 +vt 0.869048 0.910112 +vt 0.940476 0.988764 +vt 0.869048 0.977528 +vt 0.869048 0.955056 +vt 0.869048 0.932584 +vt 0.866071 0.921348 +vt 0.860119 0.932584 +vt 0.860119 0.921348 +vt 0.860119 0.910112 +vt 0.863095 0.910112 +vt 0.866071 0.966292 +vt 0.860119 0.955056 +vt 0.860119 0.977528 +vt 0.860119 0.966292 +vt 0.860119 0.943820 +vt 0.854167 0.966292 +vt 0.851190 0.955056 +vt 0.851190 0.943820 +vt 0.851190 0.932584 +vt 0.854167 0.921348 +vt 0.857143 0.910112 +vt 0.863095 0.977528 +vt 0.860119 0.988764 +vt 0.857143 0.977528 +vt 0.860119 0.898876 +vt 0.851190 0.921348 +vt 0.797619 0.921348 +vt 0.851190 0.910112 +vt 0.797619 0.910112 +vt 0.851190 0.898876 +vt 0.797619 0.898876 +vt 0.797619 0.977528 +vt 0.851190 0.988764 +vt 0.797619 0.988764 +vt 0.851190 0.966292 +vt 0.797619 0.966292 +vt 0.452381 0.977528 +vt 0.476190 0.988764 +vt 0.452381 0.988764 +vt 0.452381 0.910112 +vt 0.476190 0.921348 +vt 0.452381 0.921348 +vt 0.452381 0.932584 +vt 0.476190 0.943820 +vt 0.452381 0.943820 +vt 0.452381 0.955056 +vt 0.476190 0.966292 +vt 0.452381 0.966292 +vt 0.476190 0.977528 +vt 0.452381 0.898876 +vt 0.476190 0.910112 +vt 0.476190 0.932584 +vt 0.476190 0.955056 +vt 0.485119 0.966292 +vt 0.479167 0.966292 +vt 0.485119 0.977528 +vt 0.482143 0.977528 +vt 0.479167 0.921348 +vt 0.485119 0.932584 +vt 0.485119 0.955056 +vt 0.485119 0.910112 +vt 0.485119 0.921348 +vt 0.485119 0.943820 +vt 0.491071 0.921348 +vt 0.494048 0.943820 +vt 0.494048 0.955056 +vt 0.491071 0.966292 +vt 0.488095 0.977528 +vt 0.494048 0.932584 +vt 0.482143 0.910112 +vt 0.485119 0.898876 +vt 0.488095 0.910112 +vt 0.485119 0.988764 +vt 0.744048 0.910112 +vt 0.660714 0.898876 +vt 0.744048 0.898876 +vt 0.744048 0.977528 +vt 0.660714 0.966292 +vt 0.744048 0.966292 +vt 0.744048 0.955056 +vt 0.660714 0.943820 +vt 0.744048 0.943820 +vt 0.744048 0.932584 +vt 0.660714 0.921348 +vt 0.744048 0.921348 +vt 0.660714 0.910112 +vt 0.744048 0.988764 +vt 0.660714 0.977528 +vt 0.660714 0.955056 +vt 0.660714 0.932584 +vt 0.651786 0.921348 +vt 0.657738 0.921348 +vt 0.651786 0.910112 +vt 0.654762 0.910112 +vt 0.657738 0.966292 +vt 0.651786 0.955056 +vt 0.651786 0.932584 +vt 0.651786 0.977528 +vt 0.651786 0.966292 +vt 0.651786 0.943820 +vt 0.645833 0.966292 +vt 0.642857 0.943820 +vt 0.642857 0.932584 +vt 0.645833 0.921348 +vt 0.648810 0.910112 +vt 0.642857 0.955056 +vt 0.654762 0.977528 +vt 0.651786 0.988764 +vt 0.648810 0.977528 +vt 0.651786 0.898876 +vt 0.642857 0.921348 +vt 0.494048 0.921348 +vt 0.642857 0.910112 +vt 0.494048 0.910112 +vt 0.642857 0.898876 +vt 0.494048 0.898876 +vt 0.494048 0.977528 +vt 0.642857 0.988764 +vt 0.494048 0.988764 +vt 0.642857 0.966292 +vt 0.494048 0.966292 +vt 0.943452 0.898876 +vt 0.949405 0.910112 +vt 0.946429 0.910112 +vt 0.747024 0.898876 +vt 0.752976 0.910112 +vt 0.750000 0.910112 +vt 0.949405 0.966292 +vt 0.752976 0.955056 +vt 0.752976 0.966292 +vt 0.949405 0.977528 +vt 0.752976 0.977528 +vt 0.943452 0.943820 +vt 0.949405 0.932584 +vt 0.949405 0.943820 +vt 0.750000 0.932584 +vt 0.752976 0.943820 +vt 0.747024 0.943820 +vt 0.949405 0.988764 +vt 0.943452 0.988764 +vt 0.752976 0.988764 +vt 0.747024 0.988764 +vt 0.949405 0.955056 +vt 0.949405 0.898876 +vt 0.952381 0.910112 +vt 0.958333 0.966292 +vt 0.761905 0.977528 +vt 0.755952 0.932584 +vt 0.758929 0.943820 +vt 0.958333 0.977528 +vt 0.758929 0.988764 +vt 0.952381 0.932584 +vt 0.955357 0.943820 +vt 0.761905 0.955056 +vt 0.955357 0.988764 +vt 0.752976 0.898876 +vt 0.755952 0.910112 +vt 0.958333 0.955056 +vt 0.761905 0.966292 +vt 0.752976 0.921348 +vt 0.752976 0.932584 +vt 0.949405 0.921348 +vt 0.946429 0.932584 +vt 0.767857 0.966292 +vt 0.958333 0.943820 +vt 0.964286 0.955056 +vt 0.958333 0.921348 +vt 0.964286 0.932584 +vt 0.958333 0.932584 +vt 0.767857 0.977528 +vt 0.964286 0.966292 +vt 0.761905 0.988764 +vt 0.767857 0.988764 +vt 0.964286 0.977528 +vt 0.964286 0.910112 +vt 0.964286 0.921348 +vt 0.761905 0.898876 +vt 0.767857 0.910112 +vt 0.761905 0.910112 +vt 0.958333 0.988764 +vt 0.964286 0.988764 +vt 0.761905 0.921348 +vt 0.767857 0.932584 +vt 0.761905 0.932584 +vt 0.958333 0.898876 +vt 0.958333 0.910112 +vt 0.761905 0.943820 +vt 0.767857 0.943820 +vt 0.767857 0.921348 +vt 0.767857 0.955056 +vt 0.964286 0.943820 +vt 0.297619 0.870786 +vt 0.303571 0.882023 +vt 0.297619 0.882023 +vt 0.297619 0.870786 +vt 0.303571 0.882023 +vt 0.297619 0.882023 +vt 0.285714 0.865169 +vt 0.279762 0.882023 +vt 0.279762 0.865169 +vt 0.285714 0.865169 +vt 0.279762 0.882023 +vt 0.279762 0.865169 +vt 0.291667 0.865169 +vt 0.285714 0.882023 +vt 0.291667 0.865169 +vt 0.285714 0.882023 +vt 0.273810 0.870786 +vt 0.267857 0.882023 +vt 0.267857 0.876405 +vt 0.273810 0.870786 +vt 0.267857 0.882023 +vt 0.267857 0.876405 +vt 0.273810 0.882023 +vt 0.273810 0.882023 +vt 0.291667 0.882023 +vt 0.291667 0.882023 +vt 0.273810 0.893258 +vt 0.267857 0.887640 +vt 0.285714 0.898876 +vt 0.279762 0.898876 +vt 0.297619 0.893258 +vt 0.279762 0.898876 +vt 0.273810 0.893258 +vt 0.297619 0.893258 +vt 0.291667 0.898876 +vt 0.267857 0.887640 +vt 0.291667 0.898876 +vt 0.285714 0.898876 +vt 0.309524 0.882023 +vt 0.303571 0.876405 +vt 0.303571 0.887640 +vt 0.261905 0.882023 +vt 0.309524 0.882023 +vt 0.303571 0.876405 +vt 0.303571 0.887640 +vt 0.261905 0.882023 +vt 0.285714 0.910112 +vt 0.297619 0.898876 +vt 0.291667 0.910112 +vt 0.309524 0.898876 +vt 0.303571 0.910112 +vt 0.303571 0.898876 +vt 0.279762 0.910112 +vt 0.285714 0.910112 +vt 0.273810 0.910112 +vt 0.273810 0.898876 +vt 0.279762 0.910112 +vt 0.267857 0.898876 +vt 0.261905 0.910112 +vt 0.261905 0.898876 +vt 0.267857 0.910112 +vt 0.267857 0.898876 +vt 0.273810 0.910112 +vt 0.273810 0.898876 +vt 0.309524 0.898876 +vt 0.303571 0.910112 +vt 0.303571 0.898876 +vt 0.267857 0.910112 +vt 0.297619 0.910112 +vt 0.297619 0.898876 +vt 0.261905 0.910112 +vt 0.261905 0.898876 +vt 0.291667 0.910112 +vt 0.297619 0.910112 +vt 0.297619 0.808989 +vt 0.297619 0.865169 +vt 0.297619 0.865169 +vt 0.303571 0.808989 +vt 0.303571 0.865169 +vt 0.303571 0.808989 +vt 0.303571 0.865169 +vt 0.309524 0.808989 +vt 0.309524 0.865169 +vt 0.261905 0.865169 +vt 0.267857 0.808989 +vt 0.267857 0.865169 +vt 0.309524 0.808989 +vt 0.309524 0.865169 +vt 0.261905 0.865169 +vt 0.267857 0.808989 +vt 0.267857 0.865169 +vt 0.273810 0.808989 +vt 0.273810 0.865169 +vt 0.273810 0.808989 +vt 0.273810 0.865169 +vt 0.279762 0.808989 +vt 0.279762 0.808989 +vt 0.285714 0.808989 +vt 0.285714 0.808989 +vt 0.291667 0.808989 +vt 0.291667 0.808989 +vt 0.297619 0.808989 +vt 0.511905 0.606742 +vt 0.488095 0.617977 +vt 0.488095 0.606742 +vt 0.511905 0.584270 +vt 0.488095 0.595506 +vt 0.488095 0.584270 +vt 0.511905 0.573034 +vt 0.488095 0.573034 +vt 0.511905 0.550562 +vt 0.488095 0.561798 +vt 0.488095 0.550562 +vt 0.511905 0.617977 +vt 0.488095 0.629214 +vt 0.511905 0.595506 +vt 0.511905 0.561798 +vt 0.511905 0.539326 +vt 0.488095 0.539326 +vt 0.511905 0.606742 +vt 0.488095 0.617977 +vt 0.488095 0.606742 +vt 0.511905 0.584270 +vt 0.488095 0.595506 +vt 0.488095 0.584270 +vt 0.511905 0.573034 +vt 0.488095 0.573034 +vt 0.511905 0.550562 +vt 0.488095 0.561798 +vt 0.488095 0.550562 +vt 0.511905 0.617977 +vt 0.488095 0.629214 +vt 0.511905 0.595506 +vt 0.511905 0.561798 +vt 0.511905 0.539326 +vt 0.488095 0.539326 +vt 0.511905 0.606742 +vt 0.488095 0.617977 +vt 0.488095 0.606742 +vt 0.511905 0.584270 +vt 0.488095 0.595506 +vt 0.488095 0.584270 +vt 0.511905 0.573034 +vt 0.488095 0.573034 +vt 0.511905 0.550562 +vt 0.488095 0.561798 +vt 0.488095 0.550562 +vt 0.511905 0.617977 +vt 0.488095 0.629214 +vt 0.511905 0.595506 +vt 0.511905 0.561798 +vt 0.511905 0.539326 +vt 0.488095 0.539326 +vt 0.511905 0.606742 +vt 0.488095 0.617977 +vt 0.488095 0.606742 +vt 0.511905 0.584270 +vt 0.488095 0.595506 +vt 0.488095 0.584270 +vt 0.511905 0.573034 +vt 0.488095 0.573034 +vt 0.511905 0.550562 +vt 0.488095 0.561798 +vt 0.488095 0.550562 +vt 0.511905 0.617977 +vt 0.488095 0.629214 +vt 0.511905 0.595506 +vt 0.511905 0.561798 +vt 0.511905 0.539326 +vt 0.488095 0.539326 +vt 0.785714 0.887640 +vt 0.797619 0.898876 +vt 0.785714 0.898876 +vt 0.785714 0.820225 +vt 0.797619 0.831461 +vt 0.785714 0.831461 +vt 0.785714 0.842697 +vt 0.797619 0.853933 +vt 0.785714 0.853933 +vt 0.785714 0.865169 +vt 0.797619 0.876405 +vt 0.785714 0.876405 +vt 0.797619 0.887640 +vt 0.785714 0.808989 +vt 0.797619 0.820225 +vt 0.797619 0.842697 +vt 0.797619 0.865169 +vt 0.800595 0.876405 +vt 0.806548 0.865169 +vt 0.806548 0.876405 +vt 0.806548 0.887640 +vt 0.803571 0.887640 +vt 0.806548 0.831461 +vt 0.806548 0.842697 +vt 0.803571 0.820225 +vt 0.800595 0.831461 +vt 0.806548 0.853933 +vt 0.806548 0.820225 +vt 0.812500 0.831461 +vt 0.815476 0.842697 +vt 0.815476 0.853933 +vt 0.815476 0.865169 +vt 0.812500 0.876405 +vt 0.809524 0.887640 +vt 0.806548 0.808989 +vt 0.809524 0.820225 +vt 0.806548 0.898876 +vt 1.000000 0.820225 +vt 0.892857 0.808989 +vt 1.000000 0.808989 +vt 1.000000 0.887640 +vt 0.892857 0.876405 +vt 1.000000 0.876405 +vt 1.000000 0.865169 +vt 0.892857 0.853933 +vt 1.000000 0.853933 +vt 1.000000 0.842697 +vt 0.892857 0.831461 +vt 1.000000 0.831461 +vt 0.892857 0.820225 +vt 1.000000 0.898876 +vt 0.892857 0.887640 +vt 0.892857 0.865169 +vt 0.892857 0.842697 +vt 0.889881 0.831461 +vt 0.883929 0.842697 +vt 0.883929 0.831461 +vt 0.883929 0.820225 +vt 0.886905 0.820225 +vt 0.883929 0.876405 +vt 0.883929 0.865169 +vt 0.886905 0.887640 +vt 0.889881 0.876405 +vt 0.883929 0.853933 +vt 0.883929 0.887640 +vt 0.877976 0.876405 +vt 0.875000 0.853933 +vt 0.875000 0.842697 +vt 0.877976 0.831461 +vt 0.880952 0.820225 +vt 0.875000 0.865169 +vt 0.883929 0.898876 +vt 0.880952 0.887640 +vt 0.883929 0.808989 +vt 0.875000 0.831461 +vt 0.815476 0.831461 +vt 0.875000 0.820225 +vt 0.815476 0.820225 +vt 0.875000 0.808989 +vt 0.815476 0.808989 +vt 0.815476 0.898876 +vt 0.875000 0.887640 +vt 0.875000 0.898876 +vt 0.875000 0.876405 +vt 0.815476 0.887640 +vt 0.815476 0.876405 +vt 0.452381 0.887640 +vt 0.476190 0.898876 +vt 0.452381 0.898876 +vt 0.452381 0.820225 +vt 0.476190 0.831461 +vt 0.452381 0.831461 +vt 0.452381 0.842697 +vt 0.476190 0.853933 +vt 0.452381 0.853933 +vt 0.452381 0.865169 +vt 0.476190 0.876405 +vt 0.452381 0.876405 +vt 0.476190 0.887640 +vt 0.452381 0.808989 +vt 0.476190 0.820225 +vt 0.476190 0.842697 +vt 0.476190 0.865169 +vt 0.479167 0.876405 +vt 0.485119 0.865169 +vt 0.485119 0.876405 +vt 0.485119 0.887640 +vt 0.482143 0.887640 +vt 0.485119 0.831461 +vt 0.485119 0.842697 +vt 0.482143 0.820225 +vt 0.479167 0.831461 +vt 0.485119 0.853933 +vt 0.485119 0.820225 +vt 0.491071 0.831461 +vt 0.494048 0.842697 +vt 0.494048 0.853933 +vt 0.494048 0.865169 +vt 0.491071 0.876405 +vt 0.488095 0.887640 +vt 0.485119 0.808989 +vt 0.488095 0.820225 +vt 0.485119 0.898876 +vt 0.785714 0.820225 +vt 0.666667 0.808989 +vt 0.785714 0.808989 +vt 0.785714 0.887640 +vt 0.666667 0.876405 +vt 0.785714 0.876405 +vt 0.785714 0.865169 +vt 0.666667 0.853933 +vt 0.785714 0.853933 +vt 0.785714 0.842697 +vt 0.666667 0.831461 +vt 0.785714 0.831461 +vt 0.666667 0.820225 +vt 0.785714 0.898876 +vt 0.666667 0.887640 +vt 0.666667 0.865169 +vt 0.666667 0.842697 +vt 0.663690 0.831461 +vt 0.657738 0.842697 +vt 0.657738 0.831461 +vt 0.657738 0.820225 +vt 0.660714 0.820225 +vt 0.657738 0.876405 +vt 0.657738 0.865169 +vt 0.657738 0.853933 +vt 0.663690 0.876405 +vt 0.657738 0.887640 +vt 0.651786 0.876405 +vt 0.648810 0.865169 +vt 0.648810 0.853933 +vt 0.648810 0.842697 +vt 0.651786 0.831461 +vt 0.654762 0.820225 +vt 0.660714 0.887640 +vt 0.657738 0.898876 +vt 0.654762 0.887640 +vt 0.657738 0.808989 +vt 0.648810 0.831461 +vt 0.494048 0.831461 +vt 0.648810 0.820225 +vt 0.494048 0.820225 +vt 0.648810 0.808989 +vt 0.494048 0.808989 +vt 0.494048 0.887640 +vt 0.648810 0.898876 +vt 0.494048 0.898876 +vt 0.648810 0.876405 +vt 0.494048 0.876405 +vt 0.785714 0.887640 +vt 0.797619 0.898876 +vt 0.785714 0.898876 +vt 0.785714 0.820225 +vt 0.797619 0.831461 +vt 0.785714 0.831461 +vt 0.785714 0.842697 +vt 0.797619 0.853933 +vt 0.785714 0.853933 +vt 0.785714 0.865169 +vt 0.797619 0.876405 +vt 0.785714 0.876405 +vt 0.797619 0.887640 +vt 0.785714 0.808989 +vt 0.797619 0.820225 +vt 0.797619 0.842697 +vt 0.797619 0.865169 +vt 0.800595 0.876405 +vt 0.806548 0.865169 +vt 0.806548 0.876405 +vt 0.806548 0.887640 +vt 0.803571 0.887640 +vt 0.806548 0.831461 +vt 0.806548 0.842697 +vt 0.800595 0.831461 +vt 0.806548 0.820225 +vt 0.806548 0.853933 +vt 0.812500 0.831461 +vt 0.815476 0.842697 +vt 0.815476 0.853933 +vt 0.815476 0.865169 +vt 0.812500 0.876405 +vt 0.809524 0.887640 +vt 0.803571 0.820225 +vt 0.806548 0.808989 +vt 0.809524 0.820225 +vt 0.806548 0.898876 +vt 1.000000 0.820225 +vt 0.892857 0.808989 +vt 1.000000 0.808989 +vt 1.000000 0.887640 +vt 0.892857 0.876405 +vt 1.000000 0.876405 +vt 1.000000 0.865169 +vt 0.892857 0.853933 +vt 1.000000 0.853933 +vt 1.000000 0.842697 +vt 0.892857 0.831461 +vt 1.000000 0.831461 +vt 0.892857 0.820225 +vt 1.000000 0.898876 +vt 0.892857 0.887640 +vt 0.892857 0.865169 +vt 0.892857 0.842697 +vt 0.889881 0.831461 +vt 0.883929 0.842697 +vt 0.883929 0.831461 +vt 0.883929 0.820225 +vt 0.886905 0.820225 +vt 0.889881 0.876405 +vt 0.883929 0.865169 +vt 0.886905 0.887640 +vt 0.883929 0.876405 +vt 0.883929 0.853933 +vt 0.883929 0.887640 +vt 0.877976 0.876405 +vt 0.875000 0.865169 +vt 0.875000 0.853933 +vt 0.877976 0.831461 +vt 0.880952 0.820225 +vt 0.875000 0.842697 +vt 0.883929 0.898876 +vt 0.880952 0.887640 +vt 0.883929 0.808989 +vt 0.875000 0.831461 +vt 0.815476 0.831461 +vt 0.875000 0.820225 +vt 0.815476 0.820225 +vt 0.875000 0.808989 +vt 0.815476 0.808989 +vt 0.815476 0.898876 +vt 0.875000 0.887640 +vt 0.875000 0.898876 +vt 0.875000 0.876405 +vt 0.815476 0.887640 +vt 0.815476 0.876405 +vt 0.452381 0.887640 +vt 0.476190 0.898876 +vt 0.452381 0.898876 +vt 0.452381 0.820225 +vt 0.476190 0.831461 +vt 0.452381 0.831461 +vt 0.452381 0.842697 +vt 0.476190 0.853933 +vt 0.452381 0.853933 +vt 0.452381 0.865169 +vt 0.476190 0.876405 +vt 0.452381 0.876405 +vt 0.476190 0.887640 +vt 0.452381 0.808989 +vt 0.476190 0.820225 +vt 0.476190 0.842697 +vt 0.476190 0.865169 +vt 0.485119 0.876405 +vt 0.479167 0.876405 +vt 0.485119 0.887640 +vt 0.482143 0.887640 +vt 0.479167 0.831461 +vt 0.485119 0.842697 +vt 0.485119 0.865169 +vt 0.485119 0.820225 +vt 0.485119 0.831461 +vt 0.485119 0.853933 +vt 0.491071 0.831461 +vt 0.494048 0.842697 +vt 0.494048 0.853933 +vt 0.494048 0.865169 +vt 0.491071 0.876405 +vt 0.488095 0.887640 +vt 0.482143 0.820225 +vt 0.485119 0.808989 +vt 0.488095 0.820225 +vt 0.485119 0.898876 +vt 0.785714 0.820225 +vt 0.666667 0.808989 +vt 0.785714 0.808989 +vt 0.785714 0.887640 +vt 0.666667 0.876405 +vt 0.785714 0.876405 +vt 0.785714 0.865169 +vt 0.666667 0.853933 +vt 0.785714 0.853933 +vt 0.785714 0.842697 +vt 0.666667 0.831461 +vt 0.785714 0.831461 +vt 0.666667 0.820225 +vt 0.785714 0.898876 +vt 0.666667 0.887640 +vt 0.666667 0.865169 +vt 0.666667 0.842697 +vt 0.663690 0.831461 +vt 0.657738 0.842697 +vt 0.657738 0.831461 +vt 0.660714 0.820225 +vt 0.657738 0.820225 +vt 0.663690 0.876405 +vt 0.657738 0.865169 +vt 0.657738 0.887640 +vt 0.657738 0.876405 +vt 0.657738 0.853933 +vt 0.651786 0.876405 +vt 0.648810 0.853933 +vt 0.648810 0.842697 +vt 0.651786 0.831461 +vt 0.654762 0.820225 +vt 0.648810 0.865169 +vt 0.660714 0.887640 +vt 0.657738 0.898876 +vt 0.654762 0.887640 +vt 0.657738 0.808989 +vt 0.648810 0.831461 +vt 0.494048 0.831461 +vt 0.648810 0.820225 +vt 0.494048 0.820225 +vt 0.648810 0.808989 +vt 0.494048 0.808989 +vt 0.494048 0.887640 +vt 0.648810 0.898876 +vt 0.494048 0.898876 +vt 0.648810 0.876405 +vt 0.494048 0.876405 +vt 0.785714 0.887640 +vt 0.797619 0.898876 +vt 0.785714 0.898876 +vt 0.785714 0.820225 +vt 0.797619 0.831461 +vt 0.785714 0.831461 +vt 0.785714 0.842697 +vt 0.797619 0.853933 +vt 0.785714 0.853933 +vt 0.785714 0.865169 +vt 0.797619 0.876405 +vt 0.785714 0.876405 +vt 0.797619 0.887640 +vt 0.785714 0.808989 +vt 0.797619 0.820225 +vt 0.797619 0.842697 +vt 0.797619 0.865169 +vt 0.800595 0.876405 +vt 0.806548 0.865169 +vt 0.806548 0.876405 +vt 0.806548 0.887640 +vt 0.803571 0.887640 +vt 0.806548 0.831461 +vt 0.806548 0.842697 +vt 0.800595 0.831461 +vt 0.806548 0.820225 +vt 0.806548 0.853933 +vt 0.812500 0.831461 +vt 0.815476 0.842697 +vt 0.815476 0.853933 +vt 0.815476 0.865169 +vt 0.812500 0.876405 +vt 0.809524 0.887640 +vt 0.803571 0.820225 +vt 0.806548 0.808989 +vt 0.809524 0.820225 +vt 0.806548 0.898876 +vt 1.000000 0.820225 +vt 0.892857 0.808989 +vt 1.000000 0.808989 +vt 1.000000 0.887640 +vt 0.892857 0.876405 +vt 1.000000 0.876405 +vt 1.000000 0.865169 +vt 0.892857 0.853933 +vt 1.000000 0.853933 +vt 1.000000 0.842697 +vt 0.892857 0.831461 +vt 1.000000 0.831461 +vt 0.892857 0.820225 +vt 1.000000 0.898876 +vt 0.892857 0.887640 +vt 0.892857 0.865169 +vt 0.892857 0.842697 +vt 0.889881 0.831461 +vt 0.883929 0.842697 +vt 0.883929 0.831461 +vt 0.883929 0.820225 +vt 0.886905 0.820225 +vt 0.889881 0.876405 +vt 0.883929 0.865169 +vt 0.883929 0.853933 +vt 0.883929 0.887640 +vt 0.883929 0.876405 +vt 0.877976 0.876405 +vt 0.875000 0.865169 +vt 0.875000 0.853933 +vt 0.875000 0.842697 +vt 0.877976 0.831461 +vt 0.880952 0.820225 +vt 0.886905 0.887640 +vt 0.883929 0.898876 +vt 0.880952 0.887640 +vt 0.883929 0.808989 +vt 0.875000 0.831461 +vt 0.815476 0.831461 +vt 0.875000 0.820225 +vt 0.815476 0.820225 +vt 0.875000 0.808989 +vt 0.815476 0.808989 +vt 0.815476 0.898876 +vt 0.875000 0.887640 +vt 0.875000 0.898876 +vt 0.875000 0.876405 +vt 0.815476 0.887640 +vt 0.815476 0.876405 +vt 0.452381 0.887640 +vt 0.476190 0.898876 +vt 0.452381 0.898876 +vt 0.452381 0.820225 +vt 0.476190 0.831461 +vt 0.452381 0.831461 +vt 0.452381 0.842697 +vt 0.476190 0.853933 +vt 0.452381 0.853933 +vt 0.452381 0.865169 +vt 0.476190 0.876405 +vt 0.452381 0.876405 +vt 0.476190 0.887640 +vt 0.452381 0.808989 +vt 0.476190 0.820225 +vt 0.476190 0.842697 +vt 0.476190 0.865169 +vt 0.485119 0.876405 +vt 0.479167 0.876405 +vt 0.482143 0.887640 +vt 0.485119 0.887640 +vt 0.485119 0.831461 +vt 0.485119 0.842697 +vt 0.485119 0.865169 +vt 0.479167 0.831461 +vt 0.485119 0.820225 +vt 0.485119 0.853933 +vt 0.491071 0.831461 +vt 0.494048 0.853933 +vt 0.494048 0.865169 +vt 0.491071 0.876405 +vt 0.488095 0.887640 +vt 0.494048 0.842697 +vt 0.482143 0.820225 +vt 0.485119 0.808989 +vt 0.488095 0.820225 +vt 0.485119 0.898876 +vt 0.785714 0.820225 +vt 0.666667 0.808989 +vt 0.785714 0.808989 +vt 0.785714 0.887640 +vt 0.666667 0.876405 +vt 0.785714 0.876405 +vt 0.785714 0.865169 +vt 0.666667 0.853933 +vt 0.785714 0.853933 +vt 0.785714 0.842697 +vt 0.666667 0.831461 +vt 0.785714 0.831461 +vt 0.666667 0.820225 +vt 0.785714 0.898876 +vt 0.666667 0.887640 +vt 0.666667 0.865169 +vt 0.666667 0.842697 +vt 0.663690 0.831461 +vt 0.657738 0.842697 +vt 0.657738 0.831461 +vt 0.657738 0.820225 +vt 0.660714 0.820225 +vt 0.657738 0.876405 +vt 0.657738 0.865169 +vt 0.657738 0.853933 +vt 0.663690 0.876405 +vt 0.657738 0.887640 +vt 0.651786 0.876405 +vt 0.648810 0.853933 +vt 0.648810 0.842697 +vt 0.651786 0.831461 +vt 0.654762 0.820225 +vt 0.648810 0.865169 +vt 0.660714 0.887640 +vt 0.657738 0.898876 +vt 0.654762 0.887640 +vt 0.657738 0.808989 +vt 0.648810 0.831461 +vt 0.494048 0.831461 +vt 0.648810 0.820225 +vt 0.494048 0.820225 +vt 0.648810 0.808989 +vt 0.494048 0.808989 +vt 0.494048 0.887640 +vt 0.648810 0.898876 +vt 0.494048 0.898876 +vt 0.648810 0.876405 +vt 0.494048 0.876405 +vt 0.404762 0.949438 +vt 0.410714 0.943820 +vt 0.410714 0.949438 +vt 0.416667 0.949438 +vt 0.422619 0.943820 +vt 0.422619 0.949438 +vt 0.428571 0.949438 +vt 0.434524 0.943820 +vt 0.434524 0.949438 +vt 0.446429 0.949438 +vt 0.452381 0.943820 +vt 0.452381 0.949438 +vt 0.416667 0.943820 +vt 0.428571 0.943820 +vt 0.440476 0.943820 +vt 0.440476 0.949438 +vt 0.446429 0.943820 +vt 0.404762 0.949438 +vt 0.410714 0.943820 +vt 0.410714 0.949438 +vt 0.416667 0.949438 +vt 0.422619 0.943820 +vt 0.422619 0.949438 +vt 0.428571 0.949438 +vt 0.434524 0.943820 +vt 0.434524 0.949438 +vt 0.446429 0.949438 +vt 0.452381 0.943820 +vt 0.452381 0.949438 +vt 0.416667 0.943820 +vt 0.428571 0.943820 +vt 0.440476 0.943820 +vt 0.440476 0.949438 +vt 0.446429 0.943820 +vt 0.773810 0.539326 +vt 0.988095 0.539326 +vt 0.773810 0.269663 +vt 0.988095 0.269663 +vt 0.797619 0.808989 +vt 0.892857 0.898876 +vt 0.476190 0.808989 +vt 0.666667 0.898876 +vt 0.404762 0.943820 +vt 0.190476 0.702247 +vt 0.190476 0.735955 +vt 0.190476 0.803371 +vt 0.190476 0.837079 +vt 0.190476 0.904494 +vt 0.190476 0.938202 +vt 0.190476 0.567416 +vt 0.190476 0.601124 +vt 0.190476 0.634831 +vt 0.333333 0.808989 +vt 0.404762 0.679775 +vt 0.404762 0.735955 +vt 0.404762 0.747191 +vt 0.404762 0.803371 +vt 0.404762 0.837079 +vt 0.404762 0.848315 +vt 0.404762 0.904494 +vt 0.404762 0.938202 +vt 0.404762 0.567416 +vt 0.404762 0.601124 +vt 0.404762 0.634831 +vt 0.404762 0.646067 +vt 0.779762 0.898876 +vt 0.869048 0.988764 +vt 0.851190 0.977528 +vt 0.476190 0.898876 +vt 0.660714 0.988764 +vt 0.642857 0.977528 +vt 0.955357 0.898876 +vt 0.758929 0.898876 +vt 0.767857 0.898876 +vt 0.964286 0.898876 +vt 0.309524 0.910112 +vt 0.309524 0.910112 +vt 0.261905 0.808989 +vt 0.261905 0.808989 +vt 0.511905 0.629214 +vt 0.511905 0.629214 +vt 0.511905 0.629214 +vt 0.511905 0.629214 +vt 0.797619 0.808989 +vt 0.892857 0.898876 +vt 0.476190 0.808989 +vt 0.666667 0.898876 +vt 0.648810 0.887640 +vt 0.797619 0.808989 +vt 0.892857 0.898876 +vt 0.476190 0.808989 +vt 0.666667 0.898876 +vt 0.648810 0.887640 +vt 0.797619 0.808989 +vt 0.892857 0.898876 +vt 0.476190 0.808989 +vt 0.666667 0.898876 +vt 0.648810 0.887640 +vt 0.404762 0.943820 +vt 0.404762 0.943820 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.5000 -0.8660 +vn 0.0000 0.8660 0.5000 +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.8660 0.0000 0.5000 +vn 0.5000 -0.0000 -0.8660 +vn 0.8660 -0.0000 -0.5000 +vn -0.5000 0.0000 -0.8660 +vn 0.8660 0.0000 0.5000 +vn 0.5000 0.0000 0.8660 +vn -0.5000 0.0000 0.8660 +vn -0.8660 0.0000 -0.5000 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 -0.7071 -0.0000 +vn 0.7071 0.0000 0.7071 +vn -0.0473 0.0196 0.9987 +vn -0.7071 0.0000 0.7071 +vn -0.9824 0.1866 -0.0000 +vn -0.7071 0.0000 -0.7071 +vn -0.0473 0.0196 -0.9987 +vn 0.6737 -0.1363 -0.7263 +vn 0.6737 -0.1363 0.7263 +vn -0.7194 0.1448 0.6794 +vn -0.7194 0.1448 -0.6794 +vn -0.5294 0.5294 -0.6630 +vn -0.0671 0.0671 -0.9955 +vn 0.4617 -0.4617 -0.7574 +vn -0.5294 0.5294 0.6630 +vn -0.0671 0.0671 0.9955 +vn -0.7071 0.7071 -0.0000 +vn 0.4617 -0.4617 0.7574 +vn -0.0196 0.0473 0.9987 +vn -0.1448 0.7194 0.6794 +vn -0.1866 0.9824 -0.0000 +vn -0.1448 0.7194 -0.6794 +vn -0.0196 0.0473 -0.9987 +vn 0.1363 -0.6737 -0.7263 +vn 0.1363 -0.6737 0.7263 +vn -0.7071 -0.7071 -0.0000 +vn 0.0473 0.0196 -0.9987 +vn 0.9824 0.1866 0.0000 +vn 0.0473 0.0196 0.9987 +vn -0.6737 -0.1363 0.7263 +vn -0.6737 -0.1363 -0.7263 +vn 0.7194 0.1448 -0.6794 +vn 0.7194 0.1448 0.6794 +vn 0.5294 0.5294 0.6630 +vn 0.0671 0.0671 0.9955 +vn -0.4617 -0.4617 0.7574 +vn 0.5294 0.5293 -0.6630 +vn 0.7071 0.7071 -0.0000 +vn -0.4617 -0.4617 -0.7574 +vn 0.0671 0.0671 -0.9955 +vn 0.0196 0.0473 -0.9987 +vn 0.1448 0.7194 -0.6794 +vn 0.1866 0.9824 0.0000 +vn 0.0196 0.0473 0.9987 +vn -0.1363 -0.6737 0.7263 +vn 0.1448 0.7194 0.6794 +vn -0.1363 -0.6737 -0.7263 +vn 0.5294 0.5294 -0.6630 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 -0.7071 -0.7071 +vn -0.7071 0.3536 -0.6124 +vn -0.7071 0.6124 -0.3536 +vn -0.7071 0.6124 0.3536 +vn -0.7071 0.3536 0.6124 +vn -0.7071 -0.3536 0.6124 +vn -0.7071 -0.6124 0.3536 +vn -0.7071 -0.6124 -0.3536 +vn -0.7071 -0.3536 -0.6124 +vn 0.7071 0.3536 -0.6124 +vn 0.7071 0.6124 -0.3536 +vn 0.7071 0.6124 0.3536 +vn 0.7071 0.3536 0.6124 +vn 0.7071 -0.3536 0.6124 +vn 0.7071 -0.6124 0.3536 +vn 0.7071 -0.6124 -0.3536 +vn 0.7071 -0.3536 -0.6124 +vn 0.9987 0.0196 0.0473 +vn -0.0000 0.1866 0.9824 +vn -0.9987 0.0196 0.0473 +vn -0.7263 -0.1363 -0.6737 +vn 0.7263 -0.1363 -0.6737 +vn 0.6794 0.1448 0.7194 +vn -0.6794 0.1448 0.7194 +vn -0.9955 0.0671 0.0671 +vn -0.7574 -0.4617 -0.4617 +vn 0.9955 0.0671 0.0671 +vn 0.6630 0.5294 0.5294 +vn -0.6630 0.5293 0.5294 +vn 0.7574 -0.4617 -0.4617 +vn 0.9987 0.0473 0.0196 +vn 0.6794 0.7194 0.1448 +vn -0.0000 0.9824 0.1866 +vn -0.6794 0.7194 0.1448 +vn -0.9987 0.0473 0.0196 +vn -0.7263 -0.6737 -0.1363 +vn 0.7263 -0.6737 -0.1363 +vn 0.6737 0.1363 0.7263 +vn -0.0473 -0.0196 0.9987 +vn -0.7194 -0.1448 0.6794 +vn -0.9987 0.0196 -0.0473 +vn -0.9824 -0.1866 0.0000 +vn -0.7194 -0.1448 -0.6794 +vn 0.0000 0.1866 -0.9824 +vn -0.0473 -0.0196 -0.9987 +vn 0.6737 0.1363 -0.7263 +vn 0.9987 0.0196 -0.0473 +vn 0.7263 -0.1363 0.6737 +vn -0.7263 -0.1363 0.6737 +vn -0.6794 0.1448 -0.7194 +vn 0.6794 0.1448 -0.7194 +vn 0.6630 0.5293 -0.5294 +vn 0.9955 0.0671 -0.0671 +vn 0.7574 -0.4617 0.4617 +vn -0.6630 0.5294 -0.5294 +vn -0.7574 -0.4617 0.4617 +vn -0.9955 0.0671 -0.0671 +vn -0.9987 0.0473 -0.0196 +vn -0.6794 0.7194 -0.1448 +vn 0.0000 0.9824 -0.1866 +vn 0.6794 0.7194 -0.1448 +vn 0.9987 0.0473 -0.0196 +vn 0.7263 -0.6737 0.1363 +vn -0.7263 -0.6737 0.1363 +vn -0.6630 0.5294 0.5294 +vn 0.6630 0.5294 -0.5294 +vn 0.4617 0.4617 0.7574 +vn -0.5294 -0.5294 -0.6630 +vn -0.5294 -0.5294 0.6630 +vn 0.4617 0.4617 -0.7574 +vn -0.0671 -0.0671 -0.9955 +vn -0.0671 -0.0671 0.9955 +vn 0.1363 0.6737 0.7263 +vn -0.1866 -0.9824 0.0000 +vn -0.1448 -0.7194 0.6794 +vn 0.1363 0.6737 -0.7263 +vn -0.0196 -0.0473 -0.9987 +vn -0.0196 -0.0473 0.9987 +vn -0.1448 -0.7194 -0.6794 +vn 0.5293 0.5293 -0.6630 +s off +f 171/243/31 170/244/31 169/245/31 +f 174/246/32 175/247/32 173/248/32 +f 172/249/33 174/246/33 170/244/33 +f 170/244/34 173/248/34 169/245/34 +f 169/250/35 175/251/35 171/252/35 +f 171/252/36 176/253/36 172/249/36 +f 179/254/31 178/255/31 177/256/31 +f 182/257/32 183/258/32 181/259/32 +f 180/260/33 182/257/33 178/255/33 +f 178/255/34 181/259/34 177/256/34 +f 177/261/35 183/262/35 179/263/35 +f 179/263/36 184/264/36 180/260/36 +f 187/265/31 186/266/31 185/267/31 +f 190/268/32 191/269/32 189/270/32 +f 188/271/33 190/268/33 186/266/33 +f 186/266/34 189/270/34 185/267/34 +f 185/272/35 191/273/35 187/274/35 +f 187/274/36 192/275/36 188/271/36 +f 195/276/31 194/277/31 193/278/31 +f 198/279/32 199/280/32 197/281/32 +f 196/282/33 198/279/33 194/277/33 +f 194/277/34 197/281/34 193/278/34 +f 193/283/35 199/284/35 195/285/35 +f 195/285/36 200/286/36 196/282/36 +f 203/287/31 202/288/31 201/289/31 +f 207/290/36 204/291/36 203/287/36 +f 206/292/34 201/289/34 202/288/34 +f 208/293/32 205/294/32 206/292/32 +f 211/295/31 210/296/31 209/297/31 +f 215/298/34 212/299/34 211/295/34 +f 214/300/36 209/297/36 210/296/36 +f 216/301/32 213/302/32 214/300/32 +f 219/303/31 218/304/31 217/305/31 +f 223/306/35 220/307/35 219/303/35 +f 222/308/33 217/305/33 218/304/33 +f 224/309/32 221/310/32 222/308/32 +f 227/311/31 226/312/31 225/313/31 +f 231/314/33 228/315/33 227/311/33 +f 230/316/35 225/313/35 226/312/35 +f 232/317/32 229/318/32 230/316/32 +f 235/319/31 234/320/31 233/321/31 +f 239/322/32 237/323/32 238/324/32 +f 233/325/36 237/323/36 235/326/36 +f 235/327/33 240/328/33 236/329/33 +f 234/330/35 238/324/35 233/331/35 +f 236/332/34 239/322/34 234/320/34 +f 243/333/31 242/334/31 241/335/31 +f 247/336/32 245/337/32 246/338/32 +f 244/339/34 247/336/34 242/340/34 +f 241/335/36 245/337/36 243/333/36 +f 243/341/33 248/342/33 244/343/33 +f 242/344/35 246/338/35 241/345/35 +f 251/346/36 250/347/36 249/348/36 +f 254/349/34 255/350/34 253/351/34 +f 249/352/35 255/350/35 251/346/35 +f 251/346/32 256/353/32 252/354/32 +f 252/354/33 254/355/33 250/356/33 +f 250/347/31 253/357/31 249/348/31 +f 259/358/35 561/359/35 257/360/35 +f 563/361/33 263/362/33 262/363/33 +f 565/364/36 261/365/36 258/366/36 +f 561/359/36 262/367/36 257/368/36 +f 257/369/31 263/362/31 259/370/31 +f 259/371/34 564/372/34 562/373/34 +f 271/374/31 269/375/31 267/376/31 +f 285/377/32 287/378/32 278/379/32 +f 295/380/31 293/381/31 291/382/31 +f 309/383/32 311/384/32 302/385/32 +f 319/386/31 317/387/31 315/388/31 +f 329/389/32 333/390/32 326/391/32 +f 343/392/31 341/393/31 339/394/31 +f 353/395/32 357/396/32 350/397/32 +f 365/398/32 368/399/32 366/400/32 +f 362/401/33 368/399/33 364/402/33 +f 361/403/36 366/400/36 362/404/36 +f 363/405/35 365/398/35 361/406/35 +f 364/407/34 367/408/34 363/409/34 +f 374/410/32 381/411/32 373/412/32 +f 371/413/32 380/414/32 372/415/32 +f 369/416/36 379/417/36 371/413/36 +f 370/418/31 377/419/31 369/420/31 +f 372/415/34 378/421/34 370/418/34 +f 373/412/35 378/421/35 374/410/35 +f 376/422/35 379/417/35 375/423/35 +f 375/424/35 377/425/35 373/426/35 +f 374/427/35 380/414/35 376/428/35 +f 376/428/36 382/429/36 374/427/36 +f 375/423/31 384/430/31 376/422/31 +f 373/426/34 383/431/34 375/424/34 +f 511/432/36 509/433/36 507/434/36 +f 515/435/34 517/436/34 519/437/34 +f 523/438/33 528/439/33 524/440/33 +f 522/441/35 526/442/35 521/443/35 +f 524/440/34 527/444/34 522/441/34 +f 521/445/36 525/446/36 523/438/36 +f 529/447/35 532/448/35 530/449/35 +f 533/450/35 536/451/35 534/452/35 +f 537/453/35 540/454/35 538/455/35 +f 541/456/35 544/457/35 542/458/35 +f 546/459/34 547/460/34 545/461/34 +f 551/462/31 560/463/31 552/464/31 +f 548/465/33 553/466/33 547/460/33 +f 545/461/35 555/467/35 546/459/35 +f 546/459/31 556/468/31 548/465/31 +f 547/460/32 554/469/32 545/461/32 +f 550/470/36 553/471/36 549/472/36 +f 551/473/36 554/474/36 550/475/36 +f 552/464/36 555/476/36 551/462/36 +f 549/477/36 556/478/36 552/479/36 +f 549/472/32 558/480/32 550/470/32 +f 552/479/33 557/481/33 549/477/33 +f 550/475/35 559/482/35 551/473/35 +f 566/483/35 258/484/35 260/485/35 +f 568/486/34 260/485/34 264/487/34 +f 261/365/33 568/488/33 264/489/33 +f 564/372/32 561/359/32 562/373/32 +f 569/490/31 572/491/31 570/492/31 +f 572/493/34 574/494/34 570/495/34 +f 570/496/35 573/497/35 569/498/35 +f 569/499/36 575/500/36 571/501/36 +f 571/502/33 576/503/33 572/504/33 +f 576/505/32 573/497/32 574/506/32 +f 626/507/34 651/508/34 627/509/34 +f 649/510/34 626/511/34 625/512/34 +f 636/513/34 649/510/34 625/514/34 +f 635/515/34 660/516/34 636/517/34 +f 634/518/34 659/519/34 635/520/34 +f 633/521/34 658/522/34 634/523/34 +f 632/524/34 657/525/34 633/526/34 +f 655/527/34 632/528/34 631/529/34 +f 630/530/34 655/527/34 631/531/34 +f 653/532/34 630/533/34 629/534/34 +f 652/535/34 629/536/34 628/537/34 +f 651/508/34 628/538/34 627/539/34 +f 674/540/36 663/541/36 662/542/36 +f 675/543/36 664/544/36 663/541/36 +f 676/545/36 665/546/36 664/544/36 +f 665/546/36 678/547/36 666/548/36 +f 678/549/36 667/550/36 666/548/36 +f 667/550/36 680/551/36 668/552/36 +f 680/553/36 669/554/36 668/552/36 +f 681/555/36 670/556/36 669/554/36 +f 682/557/36 671/558/36 670/559/36 +f 683/560/36 672/561/36 671/558/36 +f 684/562/36 661/563/36 672/561/36 +f 661/563/36 674/564/36 662/542/36 +f 686/565/34 699/566/34 687/567/34 +f 697/568/34 686/569/34 685/570/34 +f 696/571/34 697/568/34 685/572/34 +f 695/573/34 708/574/34 696/575/34 +f 694/576/34 707/577/34 695/578/34 +f 693/579/34 706/580/34 694/581/34 +f 692/582/34 705/583/34 693/584/34 +f 703/585/34 692/586/34 691/587/34 +f 690/588/34 703/585/34 691/589/34 +f 701/590/34 690/591/34 689/592/34 +f 700/593/34 689/594/34 688/595/34 +f 699/566/34 688/596/34 687/597/34 +f 722/598/36 711/599/36 710/600/36 +f 723/601/36 712/602/36 711/599/36 +f 724/603/36 713/604/36 712/602/36 +f 713/604/36 726/605/36 714/606/36 +f 726/607/36 715/608/36 714/606/36 +f 715/608/36 728/609/36 716/610/36 +f 728/611/36 717/612/36 716/610/36 +f 729/613/36 718/614/36 717/612/36 +f 730/615/36 719/616/36 718/617/36 +f 731/618/36 720/619/36 719/616/36 +f 732/620/36 709/621/36 720/619/36 +f 709/621/36 722/622/36 710/600/36 +f 641/623/34 645/624/34 637/625/34 +f 741/626/36 739/627/36 735/628/36 +f 746/629/34 752/630/34 748/631/34 +f 747/632/36 749/633/36 745/634/36 +f 748/631/33 751/635/33 747/632/33 +f 745/636/35 750/637/35 746/629/35 +f 754/638/34 760/639/34 756/640/34 +f 755/641/36 757/642/36 753/643/36 +f 756/640/33 759/644/33 755/641/33 +f 753/645/35 758/646/35 754/638/35 +f 762/647/34 768/648/34 764/649/34 +f 763/650/36 765/651/36 761/652/36 +f 764/649/33 767/653/33 763/650/33 +f 761/654/35 766/655/35 762/647/35 +f 770/656/34 776/657/34 772/658/34 +f 771/659/36 773/660/36 769/661/36 +f 772/658/33 775/662/33 771/659/33 +f 769/663/35 774/664/35 770/656/35 +f 946/665/33 941/666/33 942/667/33 +f 948/668/32 942/667/32 944/669/32 +f 945/670/31 943/671/31 941/666/31 +f 947/672/35 944/669/35 943/673/35 +f 954/674/35 949/675/35 950/676/35 +f 956/677/31 950/676/31 952/678/31 +f 953/679/32 951/680/32 949/675/32 +f 955/681/33 952/678/33 951/682/33 +f 962/683/32 957/684/32 958/685/32 +f 964/686/35 958/685/35 960/687/35 +f 961/688/33 959/689/33 957/684/33 +f 963/690/31 960/687/31 959/691/31 +f 970/692/31 965/693/31 966/694/31 +f 972/695/33 966/694/33 968/696/33 +f 969/697/35 967/698/35 965/693/35 +f 971/699/32 968/696/32 967/700/32 +f 978/701/37 973/702/37 974/703/37 +f 980/704/38 974/703/38 976/705/38 +f 977/706/39 975/707/39 973/702/39 +f 979/708/40 976/705/40 975/709/40 +f 986/710/40 981/711/40 982/712/40 +f 988/713/39 982/712/39 984/714/39 +f 985/715/38 983/716/38 981/711/38 +f 987/717/37 984/714/37 983/718/37 +f 994/719/38 989/720/38 990/721/38 +f 996/722/40 990/721/40 992/723/40 +f 993/724/37 991/725/37 989/720/37 +f 995/726/39 992/723/39 991/727/39 +f 1002/728/39 997/729/39 998/730/39 +f 1004/731/37 998/730/37 1000/732/37 +f 1001/733/40 999/734/40 997/729/40 +f 1003/735/38 1000/732/38 999/736/38 +f 1010/737/41 1005/738/41 1006/739/41 +f 1012/740/42 1006/739/42 1008/741/42 +f 1009/742/43 1007/743/43 1005/738/43 +f 1011/744/44 1008/741/44 1007/745/44 +f 1018/746/44 1013/747/44 1014/748/44 +f 1020/749/43 1014/748/43 1016/750/43 +f 1017/751/42 1015/752/42 1013/747/42 +f 1019/753/41 1016/750/41 1015/754/41 +f 1026/755/42 1021/756/42 1022/757/42 +f 1028/758/44 1022/757/44 1024/759/44 +f 1025/760/41 1023/761/41 1021/756/41 +f 1027/762/43 1024/759/43 1023/763/43 +f 1034/764/43 1029/765/43 1030/766/43 +f 1036/767/41 1030/766/41 1032/768/41 +f 1033/769/44 1031/770/44 1029/765/44 +f 1035/771/42 1032/768/42 1031/772/42 +f 1042/773/33 1037/774/33 1038/775/33 +f 1044/776/32 1038/775/32 1040/777/32 +f 1041/778/31 1039/779/31 1037/774/31 +f 1043/780/35 1040/777/35 1039/781/35 +f 1050/782/35 1045/783/35 1046/784/35 +f 1052/785/31 1046/784/31 1048/786/31 +f 1049/787/32 1047/788/32 1045/783/32 +f 1051/789/33 1048/786/33 1047/790/33 +f 1058/791/32 1053/792/32 1054/793/32 +f 1060/794/35 1054/793/35 1056/795/35 +f 1057/796/33 1055/797/33 1053/792/33 +f 1059/798/31 1056/795/31 1055/799/31 +f 1066/800/31 1061/801/31 1062/802/31 +f 1068/803/33 1062/802/33 1064/804/33 +f 1065/805/35 1063/806/35 1061/801/35 +f 1067/807/32 1064/804/32 1063/808/32 +f 1074/809/37 1069/810/37 1070/811/37 +f 1076/812/38 1070/811/38 1072/813/38 +f 1073/814/39 1071/815/39 1069/810/39 +f 1075/816/40 1072/813/40 1071/817/40 +f 1082/818/40 1077/819/40 1078/820/40 +f 1084/821/39 1078/820/39 1080/822/39 +f 1081/823/38 1079/824/38 1077/819/38 +f 1083/825/37 1080/822/37 1079/826/37 +f 1090/827/38 1085/828/38 1086/829/38 +f 1092/830/40 1086/829/40 1088/831/40 +f 1089/832/37 1087/833/37 1085/828/37 +f 1091/834/39 1088/831/39 1087/835/39 +f 1098/836/39 1093/837/39 1094/838/39 +f 1100/839/37 1094/838/37 1096/840/37 +f 1097/841/40 1095/842/40 1093/837/40 +f 1099/843/38 1096/840/38 1095/844/38 +f 1106/845/41 1101/846/41 1102/847/41 +f 1108/848/42 1102/847/42 1104/849/42 +f 1105/850/43 1103/851/43 1101/846/43 +f 1107/852/44 1104/849/44 1103/853/44 +f 1114/854/44 1109/855/44 1110/856/44 +f 1116/857/43 1110/856/43 1112/858/43 +f 1113/859/42 1111/860/42 1109/855/42 +f 1115/861/41 1112/858/41 1111/862/41 +f 1122/863/42 1117/864/42 1118/865/42 +f 1124/866/44 1118/865/44 1120/867/44 +f 1121/868/41 1119/869/41 1117/864/41 +f 1123/870/43 1120/867/43 1119/871/43 +f 1130/872/43 1125/873/43 1126/874/43 +f 1132/875/41 1126/874/41 1128/876/41 +f 1129/877/44 1127/878/44 1125/873/44 +f 1131/879/42 1128/876/42 1127/880/42 +f 1341/881/38 1295/882/38 1293/883/38 +f 1330/884/32 1281/885/32 1282/886/32 +f 1356/887/42 1306/888/42 1308/889/42 +f 1343/890/37 1296/891/37 1295/892/37 +f 1329/893/33 1283/894/33 1281/885/33 +f 1358/895/44 1309/896/44 1310/897/44 +f 1344/898/39 1294/899/39 1296/891/39 +f 1331/900/31 1284/901/31 1283/902/31 +f 1357/903/42 1311/904/42 1309/896/42 +f 1346/905/38 1297/906/38 1298/907/38 +f 1332/908/35 1282/886/35 1284/901/35 +f 1359/909/41 1312/910/41 1311/911/41 +f 1345/912/37 1299/913/37 1297/906/37 +f 1334/914/31 1285/915/31 1286/916/31 +f 1360/917/43 1310/897/43 1312/910/43 +f 1347/918/39 1300/919/39 1299/920/39 +f 1333/921/35 1287/922/35 1285/915/35 +f 1362/923/42 1313/924/42 1314/925/42 +f 1322/926/33 1273/927/33 1274/928/33 +f 1348/929/40 1298/907/40 1300/919/40 +f 1335/930/32 1288/931/32 1287/932/32 +f 1361/933/41 1315/934/41 1313/924/41 +f 1321/935/31 1275/936/31 1273/927/31 +f 1350/937/39 1301/938/39 1302/939/39 +f 1336/940/33 1286/916/33 1288/931/33 +f 1363/941/43 1316/942/43 1315/943/43 +f 1323/944/35 1276/945/35 1275/946/35 +f 1349/947/40 1303/948/40 1301/938/40 +f 1338/949/37 1289/950/37 1290/951/37 +f 1364/952/44 1314/925/44 1316/942/44 +f 1324/953/32 1274/928/32 1276/945/32 +f 1351/954/38 1304/955/38 1303/956/38 +f 1337/957/39 1291/958/39 1289/950/39 +f 1366/959/43 1317/960/43 1318/961/43 +f 1326/962/35 1277/963/35 1278/964/35 +f 1352/965/37 1302/939/37 1304/955/37 +f 1339/966/40 1292/967/40 1291/968/40 +f 1365/969/44 1319/970/44 1317/960/44 +f 1325/971/32 1279/972/32 1277/963/32 +f 1354/973/41 1305/974/41 1306/888/41 +f 1340/975/38 1290/951/38 1292/967/38 +f 1367/976/42 1320/977/42 1319/978/42 +f 1327/979/33 1280/980/33 1279/981/33 +f 1353/982/43 1307/983/43 1305/974/43 +f 1342/984/40 1293/883/40 1294/899/40 +f 1368/985/41 1318/961/41 1320/977/41 +f 1328/986/31 1278/964/31 1280/980/31 +f 1355/987/44 1308/889/44 1307/988/44 +f 1371/989/31 1370/990/31 1369/991/31 +f 1375/992/32 1373/993/32 1374/994/32 +f 1369/995/36 1373/993/36 1371/996/36 +f 1371/997/33 1376/998/33 1372/999/33 +f 1370/1000/35 1374/994/35 1369/1001/35 +f 1372/1002/34 1375/992/34 1370/990/34 +f 1379/1003/31 1378/1004/31 1377/1005/31 +f 1383/1006/32 1381/1007/32 1382/1008/32 +f 1377/1009/36 1381/1007/36 1379/1010/36 +f 1379/1011/33 1384/1012/33 1380/1013/33 +f 1378/1014/35 1382/1008/35 1377/1015/35 +f 1380/1016/34 1383/1006/34 1378/1004/34 +f 1387/1017/31 1386/1018/31 1385/1019/31 +f 1391/1020/32 1389/1021/32 1390/1022/32 +f 1385/1023/36 1389/1021/36 1387/1024/36 +f 1387/1025/33 1392/1026/33 1388/1027/33 +f 1386/1028/35 1390/1022/35 1385/1029/35 +f 1388/1030/34 1391/1020/34 1386/1018/34 +f 1395/1031/31 1394/1032/31 1393/1033/31 +f 1399/1034/32 1397/1035/32 1398/1036/32 +f 1393/1037/36 1397/1035/36 1395/1038/36 +f 1395/1039/33 1400/1040/33 1396/1041/33 +f 1394/1042/35 1398/1036/35 1393/1043/35 +f 1396/1044/34 1399/1034/34 1394/1032/34 +f 1402/1045/34 1403/1046/34 1401/1047/34 +f 1407/1048/31 1416/1049/31 1408/1050/31 +f 1404/1051/33 1409/1052/33 1403/1046/33 +f 1401/1047/35 1411/1053/35 1402/1045/35 +f 1402/1045/31 1412/1054/31 1404/1051/31 +f 1403/1046/32 1410/1055/32 1401/1047/32 +f 1406/1056/36 1409/1057/36 1405/1058/36 +f 1407/1059/36 1410/1060/36 1406/1061/36 +f 1408/1050/36 1411/1062/36 1407/1048/36 +f 1405/1063/36 1412/1064/36 1408/1065/36 +f 1405/1058/32 1414/1066/32 1406/1056/32 +f 1408/1065/33 1413/1067/33 1405/1063/33 +f 1406/1061/35 1415/1068/35 1407/1059/35 +f 1418/1069/34 1419/1070/34 1417/1071/34 +f 1423/1072/31 1432/1073/31 1424/1074/31 +f 1420/1075/33 1425/1076/33 1419/1070/33 +f 1417/1071/35 1427/1077/35 1418/1069/35 +f 1418/1069/31 1428/1078/31 1420/1075/31 +f 1419/1070/32 1426/1079/32 1417/1071/32 +f 1422/1080/36 1425/1081/36 1421/1082/36 +f 1423/1083/36 1426/1084/36 1422/1085/36 +f 1424/1074/36 1427/1086/36 1423/1072/36 +f 1421/1087/36 1428/1088/36 1424/1089/36 +f 1421/1082/32 1430/1090/32 1422/1080/32 +f 1424/1089/33 1429/1091/33 1421/1087/33 +f 1422/1085/35 1431/1092/35 1423/1083/35 +f 1434/1093/34 1435/1094/34 1433/1095/34 +f 1439/1096/31 1448/1097/31 1440/1098/31 +f 1436/1099/33 1441/1100/33 1435/1094/33 +f 1433/1095/35 1443/1101/35 1434/1093/35 +f 1434/1093/31 1444/1102/31 1436/1099/31 +f 1435/1094/32 1442/1103/32 1433/1095/32 +f 1438/1104/36 1441/1105/36 1437/1106/36 +f 1439/1107/36 1442/1108/36 1438/1109/36 +f 1440/1098/36 1443/1110/36 1439/1096/36 +f 1437/1111/36 1444/1112/36 1440/1113/36 +f 1437/1106/32 1446/1114/32 1438/1104/32 +f 1440/1113/33 1445/1115/33 1437/1111/33 +f 1438/1109/35 1447/1116/35 1439/1107/35 +f 1450/1117/34 1451/1118/34 1449/1119/34 +f 1455/1120/31 1464/1121/31 1456/1122/31 +f 1452/1123/33 1457/1124/33 1451/1118/33 +f 1449/1119/35 1459/1125/35 1450/1117/35 +f 1450/1117/31 1460/1126/31 1452/1123/31 +f 1451/1118/32 1458/1127/32 1449/1119/32 +f 1454/1128/36 1457/1129/36 1453/1130/36 +f 1455/1131/36 1458/1132/36 1454/1133/36 +f 1456/1122/36 1459/1134/36 1455/1120/36 +f 1453/1135/36 1460/1136/36 1456/1137/36 +f 1453/1130/32 1462/1138/32 1454/1128/32 +f 1456/1137/33 1461/1139/33 1453/1135/33 +f 1454/1133/35 1463/1140/35 1455/1131/35 +f 1466/1141/36 1467/1142/36 1465/1143/36 +f 1471/1144/31 1480/1145/31 1472/1146/31 +f 1468/1147/35 1473/1148/35 1467/1142/35 +f 1465/1143/33 1475/1149/33 1466/1141/33 +f 1466/1141/31 1476/1150/31 1468/1147/31 +f 1465/1143/32 1473/1151/32 1474/1152/32 +f 1470/1153/34 1473/1151/34 1469/1154/34 +f 1471/1155/34 1474/1156/34 1470/1157/34 +f 1472/1146/34 1475/1158/34 1471/1144/34 +f 1469/1159/34 1476/1160/34 1472/1161/34 +f 1469/1154/32 1478/1162/32 1470/1153/32 +f 1472/1161/35 1477/1163/35 1469/1159/35 +f 1470/1157/33 1479/1164/33 1471/1155/33 +f 1482/1165/36 1483/1166/36 1481/1167/36 +f 1487/1168/31 1496/1169/31 1488/1170/31 +f 1484/1171/35 1489/1172/35 1483/1166/35 +f 1481/1167/33 1491/1173/33 1482/1165/33 +f 1482/1165/31 1492/1174/31 1484/1171/31 +f 1483/1166/32 1490/1175/32 1481/1167/32 +f 1486/1176/34 1489/1177/34 1485/1178/34 +f 1487/1179/34 1490/1180/34 1486/1181/34 +f 1488/1170/34 1491/1182/34 1487/1168/34 +f 1485/1183/34 1492/1184/34 1488/1185/34 +f 1485/1178/32 1494/1186/32 1486/1176/32 +f 1488/1185/35 1493/1187/35 1485/1183/35 +f 1486/1181/33 1495/1188/33 1487/1179/33 +f 1498/1189/36 1499/1190/36 1497/1191/36 +f 1503/1192/31 1512/1193/31 1504/1194/31 +f 1500/1195/35 1505/1196/35 1499/1190/35 +f 1497/1191/33 1507/1197/33 1498/1189/33 +f 1498/1189/31 1508/1198/31 1500/1195/31 +f 1499/1190/32 1506/1199/32 1497/1191/32 +f 1502/1200/34 1505/1201/34 1501/1202/34 +f 1503/1203/34 1506/1204/34 1502/1205/34 +f 1504/1194/34 1507/1206/34 1503/1192/34 +f 1501/1207/34 1508/1208/34 1504/1209/34 +f 1501/1202/32 1510/1210/32 1502/1200/32 +f 1504/1209/35 1509/1211/35 1501/1207/35 +f 1502/1205/33 1511/1212/33 1503/1203/33 +f 1514/1213/36 1515/1214/36 1513/1215/36 +f 1519/1216/31 1528/1217/31 1520/1218/31 +f 1516/1219/35 1521/1220/35 1515/1214/35 +f 1513/1215/33 1523/1221/33 1514/1213/33 +f 1514/1213/31 1524/1222/31 1516/1219/31 +f 1515/1214/32 1522/1223/32 1513/1215/32 +f 1518/1224/34 1521/1225/34 1517/1226/34 +f 1519/1227/34 1522/1228/34 1518/1229/34 +f 1520/1218/34 1523/1230/34 1519/1216/34 +f 1517/1231/34 1524/1232/34 1520/1233/34 +f 1517/1226/32 1526/1234/32 1518/1224/32 +f 1520/1233/35 1525/1235/35 1517/1231/35 +f 1518/1229/33 1527/1236/33 1519/1227/33 +f 1530/1237/36 1531/1238/36 1529/1239/36 +f 1535/1240/31 1544/1241/31 1536/1242/31 +f 1532/1243/35 1537/1244/35 1531/1238/35 +f 1529/1239/33 1539/1245/33 1530/1237/33 +f 1530/1237/31 1540/1246/31 1532/1243/31 +f 1531/1238/32 1538/1247/32 1529/1239/32 +f 1534/1248/34 1537/1249/34 1533/1250/34 +f 1535/1251/34 1538/1252/34 1534/1253/34 +f 1536/1242/34 1539/1254/34 1535/1240/34 +f 1533/1255/34 1540/1256/34 1536/1257/34 +f 1533/1250/32 1542/1258/32 1534/1248/32 +f 1536/1257/35 1541/1259/35 1533/1255/35 +f 1534/1253/33 1543/1260/33 1535/1251/33 +f 1546/1261/33 1547/1262/33 1545/1263/33 +f 1551/1264/31 1560/1265/31 1552/1266/31 +f 1548/1267/36 1553/1268/36 1547/1262/36 +f 1545/1263/34 1555/1269/34 1546/1261/34 +f 1546/1261/31 1556/1270/31 1548/1267/31 +f 1547/1262/32 1554/1271/32 1545/1263/32 +f 1550/1272/35 1553/1273/35 1549/1274/35 +f 1551/1275/35 1554/1276/35 1550/1277/35 +f 1552/1266/35 1555/1278/35 1551/1264/35 +f 1549/1279/35 1556/1280/35 1552/1281/35 +f 1549/1274/32 1558/1282/32 1550/1272/32 +f 1552/1281/36 1557/1283/36 1549/1279/36 +f 1550/1277/34 1559/1284/34 1551/1275/34 +f 1562/1285/33 1563/1286/33 1561/1287/33 +f 1567/1288/31 1576/1289/31 1568/1290/31 +f 1564/1291/36 1569/1292/36 1563/1286/36 +f 1561/1287/34 1571/1293/34 1562/1285/34 +f 1562/1285/31 1572/1294/31 1564/1291/31 +f 1563/1286/32 1570/1295/32 1561/1287/32 +f 1566/1296/35 1569/1297/35 1565/1298/35 +f 1567/1299/35 1570/1300/35 1566/1301/35 +f 1568/1290/35 1571/1302/35 1567/1288/35 +f 1565/1303/35 1572/1304/35 1568/1305/35 +f 1565/1298/32 1574/1306/32 1566/1296/32 +f 1568/1305/36 1573/1307/36 1565/1303/36 +f 1566/1301/34 1575/1308/34 1567/1299/34 +f 1578/1309/33 1579/1310/33 1577/1311/33 +f 1583/1312/31 1592/1313/31 1584/1314/31 +f 1580/1315/36 1585/1316/36 1579/1310/36 +f 1577/1311/34 1587/1317/34 1578/1309/34 +f 1578/1309/31 1588/1318/31 1580/1315/31 +f 1579/1310/32 1586/1319/32 1577/1311/32 +f 1582/1320/35 1585/1321/35 1581/1322/35 +f 1583/1323/35 1586/1324/35 1582/1325/35 +f 1584/1314/35 1587/1326/35 1583/1312/35 +f 1581/1327/35 1588/1328/35 1584/1329/35 +f 1581/1322/32 1590/1330/32 1582/1320/32 +f 1584/1329/36 1589/1331/36 1581/1327/36 +f 1582/1325/34 1591/1332/34 1583/1323/34 +f 1594/1333/33 1595/1334/33 1593/1335/33 +f 1599/1336/31 1608/1337/31 1600/1338/31 +f 1596/1339/36 1601/1340/36 1595/1334/36 +f 1593/1335/34 1603/1341/34 1594/1333/34 +f 1594/1333/31 1604/1342/31 1596/1339/31 +f 1595/1334/32 1602/1343/32 1593/1335/32 +f 1598/1344/35 1601/1345/35 1597/1346/35 +f 1599/1347/35 1602/1348/35 1598/1349/35 +f 1600/1338/35 1603/1350/35 1599/1336/35 +f 1597/1351/35 1604/1352/35 1600/1353/35 +f 1597/1346/32 1606/1354/32 1598/1344/32 +f 1600/1353/36 1605/1355/36 1597/1351/36 +f 1598/1349/34 1607/1356/34 1599/1347/34 +f 1610/1357/33 1611/1358/33 1609/1359/33 +f 1615/1360/31 1624/1361/31 1616/1362/31 +f 1612/1363/36 1617/1364/36 1611/1358/36 +f 1609/1359/34 1619/1365/34 1610/1357/34 +f 1610/1357/31 1620/1366/31 1612/1363/31 +f 1611/1358/32 1618/1367/32 1609/1359/32 +f 1614/1368/35 1617/1369/35 1613/1370/35 +f 1615/1371/35 1618/1372/35 1614/1373/35 +f 1616/1362/35 1619/1374/35 1615/1360/35 +f 1613/1375/35 1620/1376/35 1616/1377/35 +f 1613/1370/32 1622/1378/32 1614/1368/32 +f 1616/1377/36 1621/1379/36 1613/1375/36 +f 1614/1373/34 1623/1380/34 1615/1371/34 +f 1626/1381/35 1627/1382/35 1625/1383/35 +f 1631/1384/31 1640/1385/31 1632/1386/31 +f 1628/1387/34 1633/1388/34 1627/1382/34 +f 1625/1383/36 1635/1389/36 1626/1381/36 +f 1626/1381/31 1636/1390/31 1628/1387/31 +f 1627/1382/32 1634/1391/32 1625/1383/32 +f 1630/1392/33 1633/1393/33 1629/1394/33 +f 1631/1395/33 1634/1396/33 1630/1397/33 +f 1632/1386/33 1635/1398/33 1631/1384/33 +f 1629/1399/33 1636/1400/33 1632/1401/33 +f 1629/1394/32 1638/1402/32 1630/1392/32 +f 1632/1401/34 1637/1403/34 1629/1399/34 +f 1630/1397/36 1639/1404/36 1631/1395/36 +f 1642/1405/35 1643/1406/35 1641/1407/35 +f 1647/1408/31 1656/1409/31 1648/1410/31 +f 1644/1411/34 1649/1412/34 1643/1406/34 +f 1641/1407/36 1651/1413/36 1642/1405/36 +f 1642/1405/31 1652/1414/31 1644/1411/31 +f 1643/1406/32 1650/1415/32 1641/1407/32 +f 1646/1416/33 1649/1417/33 1645/1418/33 +f 1647/1419/33 1650/1420/33 1646/1421/33 +f 1648/1410/33 1651/1422/33 1647/1408/33 +f 1645/1423/33 1652/1424/33 1648/1425/33 +f 1645/1418/32 1654/1426/32 1646/1416/32 +f 1648/1425/34 1653/1427/34 1645/1423/34 +f 1646/1421/36 1655/1428/36 1647/1419/36 +f 1658/1429/35 1659/1430/35 1657/1431/35 +f 1663/1432/31 1672/1433/31 1664/1434/31 +f 1660/1435/34 1665/1436/34 1659/1430/34 +f 1657/1431/36 1667/1437/36 1658/1429/36 +f 1658/1429/31 1668/1438/31 1660/1435/31 +f 1659/1430/32 1666/1439/32 1657/1431/32 +f 1662/1440/33 1665/1441/33 1661/1442/33 +f 1663/1443/33 1666/1444/33 1662/1445/33 +f 1664/1434/33 1667/1446/33 1663/1432/33 +f 1661/1447/33 1668/1448/33 1664/1449/33 +f 1661/1442/32 1670/1450/32 1662/1440/32 +f 1664/1449/34 1669/1451/34 1661/1447/34 +f 1662/1445/36 1671/1452/36 1663/1443/36 +f 1674/1453/35 1675/1454/35 1673/1455/35 +f 1679/1456/31 1688/1457/31 1680/1458/31 +f 1676/1459/34 1681/1460/34 1675/1454/34 +f 1673/1455/36 1683/1461/36 1674/1453/36 +f 1674/1453/31 1684/1462/31 1676/1459/31 +f 1673/1455/32 1681/1463/32 1682/1464/32 +f 1678/1465/33 1681/1463/33 1677/1466/33 +f 1679/1467/33 1682/1468/33 1678/1469/33 +f 1680/1458/33 1683/1470/33 1679/1456/33 +f 1677/1471/33 1684/1472/33 1680/1473/33 +f 1678/1465/32 1685/1474/32 1686/1475/32 +f 1680/1473/34 1685/1476/34 1677/1471/34 +f 1678/1469/36 1687/1477/36 1679/1467/36 +f 1690/1478/35 1691/1479/35 1689/1480/35 +f 1695/1481/31 1704/1482/31 1696/1483/31 +f 1692/1484/34 1697/1485/34 1691/1479/34 +f 1689/1480/36 1699/1486/36 1690/1478/36 +f 1690/1478/31 1700/1487/31 1692/1484/31 +f 1691/1479/32 1698/1488/32 1689/1480/32 +f 1694/1489/33 1697/1490/33 1693/1491/33 +f 1695/1492/33 1698/1493/33 1694/1494/33 +f 1696/1483/33 1699/1495/33 1695/1481/33 +f 1693/1496/33 1700/1497/33 1696/1498/33 +f 1693/1491/32 1702/1499/32 1694/1489/32 +f 1696/1498/34 1701/1500/34 1693/1496/34 +f 1694/1494/36 1703/1501/36 1695/1492/36 +f 1947/1502/33 1952/1503/33 1948/1504/33 +f 1946/1505/35 1950/1506/35 1945/1507/35 +f 1948/1504/34 1951/1508/34 1946/1505/34 +f 1945/1509/36 1949/1510/36 1947/1502/36 +f 2079/1511/36 2077/1512/36 2075/1513/36 +f 2083/1514/34 2085/1515/34 2087/1516/34 +f 2095/1517/36 2093/1518/36 2091/1519/36 +f 2101/1520/34 2103/1521/34 2098/1522/34 +f 2112/1523/35 2107/1524/35 2108/1525/35 +f 2110/1526/33 2106/1527/33 2105/1528/33 +f 2111/1529/36 2108/1525/36 2106/1527/36 +f 2109/1530/34 2105/1531/34 2107/1524/34 +f 2120/1532/35 2115/1533/35 2116/1534/35 +f 2118/1535/33 2114/1536/33 2113/1537/33 +f 2119/1538/36 2116/1534/36 2114/1536/36 +f 2117/1539/34 2113/1540/34 2115/1533/34 +f 171/243/31 172/1541/31 170/244/31 +f 174/246/32 176/1542/32 175/247/32 +f 172/249/33 176/253/33 174/246/33 +f 170/244/34 174/246/34 173/248/34 +f 169/250/35 173/1543/35 175/251/35 +f 171/252/36 175/251/36 176/253/36 +f 179/254/31 180/1544/31 178/255/31 +f 182/257/32 184/1545/32 183/258/32 +f 180/260/33 184/264/33 182/257/33 +f 178/255/34 182/257/34 181/259/34 +f 177/261/35 181/1546/35 183/262/35 +f 179/263/36 183/262/36 184/264/36 +f 187/265/31 188/1547/31 186/266/31 +f 190/268/32 192/1548/32 191/269/32 +f 188/271/33 192/275/33 190/268/33 +f 186/266/34 190/268/34 189/270/34 +f 185/272/35 189/1549/35 191/273/35 +f 187/274/36 191/273/36 192/275/36 +f 195/276/31 196/1550/31 194/277/31 +f 198/279/32 200/1551/32 199/280/32 +f 196/282/33 200/286/33 198/279/33 +f 194/277/34 198/279/34 197/281/34 +f 193/283/35 197/1552/35 199/284/35 +f 195/285/36 199/284/36 200/286/36 +f 203/287/31 204/291/31 202/288/31 +f 207/290/36 208/1553/36 204/291/36 +f 206/292/34 205/294/34 201/289/34 +f 208/293/32 207/1554/32 205/294/32 +f 211/295/31 212/299/31 210/296/31 +f 215/298/34 216/1555/34 212/299/34 +f 214/300/36 213/302/36 209/297/36 +f 216/301/32 215/1556/32 213/302/32 +f 219/303/31 220/307/31 218/304/31 +f 223/306/35 224/1557/35 220/307/35 +f 222/308/33 221/310/33 217/305/33 +f 224/309/32 223/1558/32 221/310/32 +f 227/311/31 228/315/31 226/312/31 +f 231/314/33 232/1559/33 228/315/33 +f 230/316/35 229/318/35 225/313/35 +f 232/317/32 231/1560/32 229/318/32 +f 235/319/31 236/332/31 234/320/31 +f 239/322/32 240/328/32 237/323/32 +f 233/325/36 238/324/36 237/323/36 +f 235/327/33 237/323/33 240/328/33 +f 234/330/35 239/322/35 238/324/35 +f 236/332/34 240/328/34 239/322/34 +f 243/333/31 244/1561/31 242/334/31 +f 247/336/32 248/342/32 245/337/32 +f 244/339/34 248/342/34 247/336/34 +f 241/335/36 246/338/36 245/337/36 +f 243/341/33 245/337/33 248/342/33 +f 242/344/35 247/336/35 246/338/35 +f 251/346/36 252/354/36 250/347/36 +f 254/349/34 256/353/34 255/350/34 +f 249/352/35 253/1562/35 255/350/35 +f 251/346/32 255/350/32 256/353/32 +f 252/354/33 256/353/33 254/355/33 +f 250/347/31 254/1563/31 253/357/31 +f 259/358/35 562/373/35 561/359/35 +f 563/361/33 564/372/33 263/362/33 +f 565/364/36 567/1564/36 261/365/36 +f 561/359/36 563/361/36 262/367/36 +f 257/369/31 262/363/31 263/362/31 +f 259/371/34 263/1565/34 564/372/34 +f 267/376/31 266/1566/31 275/1567/31 +f 266/1566/31 265/1568/31 275/1567/31 +f 265/1568/31 276/1569/31 275/1567/31 +f 275/1567/31 274/1570/31 273/1571/31 +f 273/1571/31 272/1572/31 271/374/31 +f 271/374/31 270/1573/31 269/375/31 +f 269/375/31 268/1574/31 267/376/31 +f 275/1567/31 273/1571/31 267/376/31 +f 273/1571/31 271/374/31 267/376/31 +f 278/379/32 277/1575/32 279/1576/32 +f 279/1576/32 280/1577/32 281/1578/32 +f 281/1578/32 282/1579/32 283/1580/32 +f 283/1580/32 284/1581/32 281/1578/32 +f 284/1581/32 285/377/32 281/1578/32 +f 285/377/32 286/1582/32 287/378/32 +f 287/378/32 288/1583/32 278/379/32 +f 278/379/32 279/1576/32 285/377/32 +f 279/1576/32 281/1578/32 285/377/32 +f 291/382/31 290/1584/31 299/1585/31 +f 290/1584/31 289/1586/31 299/1585/31 +f 289/1586/31 300/1587/31 299/1585/31 +f 299/1585/31 298/1588/31 297/1589/31 +f 297/1589/31 296/1590/31 295/380/31 +f 295/380/31 294/1591/31 293/381/31 +f 293/381/31 292/1592/31 291/382/31 +f 299/1585/31 297/1589/31 291/382/31 +f 297/1589/31 295/380/31 291/382/31 +f 302/385/32 301/1593/32 303/1594/32 +f 303/1594/32 304/1595/32 305/1596/32 +f 305/1596/32 306/1597/32 307/1598/32 +f 307/1598/32 308/1599/32 305/1596/32 +f 308/1599/32 309/383/32 305/1596/32 +f 309/383/32 310/1600/32 311/384/32 +f 311/384/32 312/1601/32 302/385/32 +f 302/385/32 303/1594/32 309/383/32 +f 303/1594/32 305/1596/32 309/383/32 +f 315/388/31 314/1602/31 323/1603/31 +f 314/1602/31 313/1604/31 323/1603/31 +f 313/1604/31 324/1605/31 323/1603/31 +f 323/1603/31 322/1606/31 321/1607/31 +f 321/1607/31 320/1608/31 319/386/31 +f 319/386/31 318/1609/31 317/387/31 +f 317/387/31 316/1610/31 315/388/31 +f 323/1603/31 321/1607/31 315/388/31 +f 321/1607/31 319/386/31 315/388/31 +f 326/391/32 325/1611/32 327/1612/32 +f 327/1612/32 328/1613/32 329/389/32 +f 329/389/32 330/1614/32 331/1615/32 +f 331/1615/32 332/1616/32 329/389/32 +f 332/1616/32 333/390/32 329/389/32 +f 333/390/32 334/1617/32 326/391/32 +f 334/1617/32 335/1618/32 326/391/32 +f 335/1618/32 336/1619/32 326/391/32 +f 326/391/32 327/1612/32 329/389/32 +f 339/394/31 338/1620/31 347/1621/31 +f 338/1620/31 337/1622/31 347/1621/31 +f 337/1622/31 348/1623/31 347/1621/31 +f 347/1621/31 346/1624/31 345/1625/31 +f 345/1625/31 344/1626/31 343/392/31 +f 343/392/31 342/1627/31 341/393/31 +f 341/393/31 340/1628/31 339/394/31 +f 347/1621/31 345/1625/31 339/394/31 +f 345/1625/31 343/392/31 339/394/31 +f 350/397/32 349/1629/32 351/1630/32 +f 351/1630/32 352/1631/32 353/395/32 +f 353/395/32 354/1632/32 355/1633/32 +f 355/1633/32 356/1634/32 353/395/32 +f 356/1634/32 357/396/32 353/395/32 +f 357/396/32 358/1635/32 350/397/32 +f 358/1635/32 359/1636/32 350/397/32 +f 359/1636/32 360/1637/32 350/397/32 +f 350/397/32 351/1630/32 353/395/32 +f 365/398/32 367/408/32 368/399/32 +f 362/401/33 366/400/33 368/399/33 +f 361/403/36 365/398/36 366/400/36 +f 363/405/35 367/408/35 365/398/35 +f 364/407/34 368/399/34 367/408/34 +f 374/410/32 382/1638/32 381/411/32 +f 371/413/32 379/417/32 380/414/32 +f 369/416/36 377/425/36 379/417/36 +f 370/418/31 378/421/31 377/419/31 +f 372/415/34 380/414/34 378/421/34 +f 373/412/35 377/419/35 378/421/35 +f 376/422/35 380/414/35 379/417/35 +f 375/424/35 379/417/35 377/425/35 +f 374/427/35 378/421/35 380/414/35 +f 376/428/36 384/1639/36 382/429/36 +f 375/423/31 383/1640/31 384/430/31 +f 373/426/34 381/1641/34 383/431/34 +f 507/434/36 506/1642/36 505/1643/36 +f 505/1643/36 512/1644/36 511/432/36 +f 511/432/36 510/1645/36 509/433/36 +f 509/433/36 508/1646/36 507/434/36 +f 507/434/36 505/1643/36 511/432/36 +f 514/1647/34 513/1648/34 515/435/34 +f 515/435/34 516/1649/34 517/436/34 +f 517/436/34 518/1650/34 519/437/34 +f 519/437/34 520/1651/34 514/1647/34 +f 514/1647/34 515/435/34 519/437/34 +f 523/438/33 525/446/33 528/439/33 +f 522/441/35 527/444/35 526/442/35 +f 524/440/34 528/439/34 527/444/34 +f 521/445/36 526/1652/36 525/446/36 +f 529/447/35 531/1653/35 532/448/35 +f 533/450/35 535/1654/35 536/451/35 +f 537/453/35 539/1655/35 540/454/35 +f 541/456/35 543/1656/35 544/457/35 +f 546/459/34 548/465/34 547/460/34 +f 551/462/31 559/1657/31 560/463/31 +f 548/465/33 556/478/33 553/466/33 +f 545/461/35 554/474/35 555/467/35 +f 546/459/31 555/476/31 556/468/31 +f 547/460/32 553/471/32 554/469/32 +f 550/470/36 554/469/36 553/471/36 +f 551/473/36 555/467/36 554/474/36 +f 552/464/36 556/468/36 555/476/36 +f 549/477/36 553/466/36 556/478/36 +f 549/472/32 557/1658/32 558/480/32 +f 552/479/33 560/1659/33 557/481/33 +f 550/475/35 558/1660/35 559/482/35 +f 566/483/35 565/1661/35 258/484/35 +f 568/486/34 566/483/34 260/485/34 +f 261/365/33 567/1564/33 568/488/33 +f 564/372/32 563/361/32 561/359/32 +f 569/490/31 571/1662/31 572/491/31 +f 572/493/34 576/503/34 574/494/34 +f 570/496/35 574/506/35 573/497/35 +f 569/499/36 573/497/36 575/500/36 +f 571/502/33 575/1663/33 576/503/33 +f 576/505/32 575/500/32 573/497/32 +f 626/507/34 650/1664/34 651/508/34 +f 649/510/34 650/1664/34 626/511/34 +f 636/513/34 660/516/34 649/510/34 +f 635/515/34 659/519/34 660/516/34 +f 634/518/34 658/1665/34 659/519/34 +f 633/521/34 657/525/34 658/522/34 +f 632/524/34 656/1666/34 657/525/34 +f 655/527/34 656/1666/34 632/528/34 +f 630/530/34 654/1667/34 655/527/34 +f 653/532/34 654/1667/34 630/533/34 +f 652/535/34 653/532/34 629/536/34 +f 651/508/34 652/535/34 628/538/34 +f 674/540/36 675/1668/36 663/541/36 +f 675/543/36 676/1669/36 664/544/36 +f 676/545/36 677/1670/36 665/546/36 +f 665/546/36 677/1671/36 678/547/36 +f 678/549/36 679/1672/36 667/550/36 +f 667/550/36 679/1673/36 680/551/36 +f 680/553/36 681/1674/36 669/554/36 +f 681/555/36 682/1675/36 670/556/36 +f 682/557/36 683/1676/36 671/558/36 +f 683/560/36 684/1677/36 672/561/36 +f 684/562/36 673/1678/36 661/563/36 +f 661/563/36 673/1679/36 674/564/36 +f 686/565/34 698/1680/34 699/566/34 +f 697/568/34 698/1680/34 686/569/34 +f 696/571/34 708/574/34 697/568/34 +f 695/573/34 707/577/34 708/574/34 +f 694/576/34 706/1681/34 707/577/34 +f 693/579/34 705/583/34 706/580/34 +f 692/582/34 704/1682/34 705/583/34 +f 703/585/34 704/1682/34 692/586/34 +f 690/588/34 702/1683/34 703/585/34 +f 701/590/34 702/1683/34 690/591/34 +f 700/593/34 701/590/34 689/594/34 +f 699/566/34 700/593/34 688/596/34 +f 722/598/36 723/1684/36 711/599/36 +f 723/601/36 724/1685/36 712/602/36 +f 724/603/36 725/1686/36 713/604/36 +f 713/604/36 725/1687/36 726/605/36 +f 726/607/36 727/1688/36 715/608/36 +f 715/608/36 727/1689/36 728/609/36 +f 728/611/36 729/1690/36 717/612/36 +f 729/613/36 730/1691/36 718/614/36 +f 730/615/36 731/1692/36 719/616/36 +f 731/618/36 732/1693/36 720/619/36 +f 732/620/36 721/1694/36 709/621/36 +f 709/621/36 721/1695/36 722/622/36 +f 637/625/34 638/1696/34 639/1697/34 +f 639/1697/34 640/1698/34 637/625/34 +f 640/1698/34 641/623/34 637/625/34 +f 641/623/34 642/1699/34 643/1700/34 +f 643/1700/34 644/1701/34 645/624/34 +f 645/624/34 646/1702/34 637/625/34 +f 646/1702/34 647/1703/34 637/625/34 +f 647/1703/34 648/1704/34 637/625/34 +f 641/623/34 643/1700/34 645/624/34 +f 735/628/36 734/1705/36 733/1706/36 +f 733/1706/36 744/1707/36 735/628/36 +f 744/1707/36 743/1708/36 735/628/36 +f 743/1708/36 742/1709/36 741/626/36 +f 741/626/36 740/1710/36 739/627/36 +f 739/627/36 738/1711/36 737/1712/36 +f 737/1712/36 736/1713/36 739/627/36 +f 736/1713/36 735/628/36 739/627/36 +f 743/1708/36 741/626/36 735/628/36 +f 746/629/34 750/637/34 752/630/34 +f 747/632/36 751/635/36 749/633/36 +f 748/631/33 752/630/33 751/635/33 +f 745/636/35 749/1714/35 750/637/35 +f 754/638/34 758/646/34 760/639/34 +f 755/641/36 759/644/36 757/642/36 +f 756/640/33 760/639/33 759/644/33 +f 753/645/35 757/1715/35 758/646/35 +f 762/647/34 766/655/34 768/648/34 +f 763/650/36 767/653/36 765/651/36 +f 764/649/33 768/648/33 767/653/33 +f 761/654/35 765/1716/35 766/655/35 +f 770/656/34 774/664/34 776/657/34 +f 771/659/36 775/662/36 773/660/36 +f 772/658/33 776/657/33 775/662/33 +f 769/663/35 773/1717/35 774/664/35 +f 946/665/33 945/670/33 941/666/33 +f 948/668/32 946/665/32 942/667/32 +f 945/670/31 947/1718/31 943/671/31 +f 947/672/35 948/668/35 944/669/35 +f 954/674/35 953/679/35 949/675/35 +f 956/677/31 954/674/31 950/676/31 +f 953/679/32 955/1719/32 951/680/32 +f 955/681/33 956/677/33 952/678/33 +f 962/683/32 961/688/32 957/684/32 +f 964/686/35 962/683/35 958/685/35 +f 961/688/33 963/1720/33 959/689/33 +f 963/690/31 964/686/31 960/687/31 +f 970/692/31 969/697/31 965/693/31 +f 972/695/33 970/692/33 966/694/33 +f 969/697/35 971/1721/35 967/698/35 +f 971/699/32 972/695/32 968/696/32 +f 978/701/37 977/706/37 973/702/37 +f 980/704/38 978/701/38 974/703/38 +f 977/706/39 979/1722/39 975/707/39 +f 979/708/40 980/704/40 976/705/40 +f 986/710/40 985/715/40 981/711/40 +f 988/713/39 986/710/39 982/712/39 +f 985/715/38 987/1723/38 983/716/38 +f 987/717/37 988/713/37 984/714/37 +f 994/719/38 993/724/38 989/720/38 +f 996/722/40 994/719/40 990/721/40 +f 993/724/37 995/1724/37 991/725/37 +f 995/726/39 996/722/39 992/723/39 +f 1002/728/39 1001/733/39 997/729/39 +f 1004/731/37 1002/728/37 998/730/37 +f 1001/733/40 1003/1725/40 999/734/40 +f 1003/735/38 1004/731/38 1000/732/38 +f 1010/737/41 1009/742/41 1005/738/41 +f 1012/740/42 1010/737/42 1006/739/42 +f 1009/742/43 1011/1726/43 1007/743/43 +f 1011/744/44 1012/740/44 1008/741/44 +f 1018/746/44 1017/751/44 1013/747/44 +f 1020/749/43 1018/746/43 1014/748/43 +f 1017/751/42 1019/1727/42 1015/752/42 +f 1019/753/41 1020/749/41 1016/750/41 +f 1026/755/42 1025/760/42 1021/756/42 +f 1028/758/44 1026/755/44 1022/757/44 +f 1025/760/41 1027/1728/41 1023/761/41 +f 1027/762/43 1028/758/43 1024/759/43 +f 1034/764/43 1033/769/43 1029/765/43 +f 1036/767/41 1034/764/41 1030/766/41 +f 1033/769/44 1035/1729/44 1031/770/44 +f 1035/771/42 1036/767/42 1032/768/42 +f 1042/773/33 1041/778/33 1037/774/33 +f 1044/776/32 1042/773/32 1038/775/32 +f 1041/778/31 1043/1730/31 1039/779/31 +f 1043/780/35 1044/776/35 1040/777/35 +f 1050/782/35 1049/787/35 1045/783/35 +f 1052/785/31 1050/782/31 1046/784/31 +f 1049/787/32 1051/1731/32 1047/788/32 +f 1051/789/33 1052/785/33 1048/786/33 +f 1058/791/32 1057/796/32 1053/792/32 +f 1060/794/35 1058/791/35 1054/793/35 +f 1057/796/33 1059/1732/33 1055/797/33 +f 1059/798/31 1060/794/31 1056/795/31 +f 1066/800/31 1065/805/31 1061/801/31 +f 1068/803/33 1066/800/33 1062/802/33 +f 1065/805/35 1067/1733/35 1063/806/35 +f 1067/807/32 1068/803/32 1064/804/32 +f 1074/809/37 1073/814/37 1069/810/37 +f 1076/812/38 1074/809/38 1070/811/38 +f 1073/814/39 1075/1734/39 1071/815/39 +f 1075/816/40 1076/812/40 1072/813/40 +f 1082/818/40 1081/823/40 1077/819/40 +f 1084/821/39 1082/818/39 1078/820/39 +f 1081/823/38 1083/1735/38 1079/824/38 +f 1083/825/37 1084/821/37 1080/822/37 +f 1090/827/38 1089/832/38 1085/828/38 +f 1092/830/40 1090/827/40 1086/829/40 +f 1089/832/37 1091/1736/37 1087/833/37 +f 1091/834/39 1092/830/39 1088/831/39 +f 1098/836/39 1097/841/39 1093/837/39 +f 1100/839/37 1098/836/37 1094/838/37 +f 1097/841/40 1099/1737/40 1095/842/40 +f 1099/843/38 1100/839/38 1096/840/38 +f 1106/845/41 1105/850/41 1101/846/41 +f 1108/848/42 1106/845/42 1102/847/42 +f 1105/850/43 1107/1738/43 1103/851/43 +f 1107/852/44 1108/848/44 1104/849/44 +f 1114/854/44 1113/859/44 1109/855/44 +f 1116/857/43 1114/854/43 1110/856/43 +f 1113/859/42 1115/1739/42 1111/860/42 +f 1115/861/41 1116/857/41 1112/858/41 +f 1122/863/42 1121/868/42 1117/864/42 +f 1124/866/44 1122/863/44 1118/865/44 +f 1121/868/41 1123/1740/41 1119/869/41 +f 1123/870/43 1124/866/43 1120/867/43 +f 1130/872/43 1129/877/43 1125/873/43 +f 1132/875/41 1130/872/41 1126/874/41 +f 1129/877/44 1131/1741/44 1127/878/44 +f 1131/879/42 1132/875/42 1128/876/42 +f 1341/881/38 1343/1742/38 1295/882/38 +f 1330/884/32 1329/893/32 1281/885/32 +f 1356/887/42 1354/973/42 1306/888/42 +f 1343/890/37 1344/898/37 1296/891/37 +f 1329/893/33 1331/1743/33 1283/894/33 +f 1358/895/44 1357/903/44 1309/896/44 +f 1344/898/39 1342/984/39 1294/899/39 +f 1331/900/31 1332/908/31 1284/901/31 +f 1357/903/42 1359/1744/42 1311/904/42 +f 1346/905/38 1345/912/38 1297/906/38 +f 1332/908/35 1330/884/35 1282/886/35 +f 1359/909/41 1360/917/41 1312/910/41 +f 1345/912/37 1347/1745/37 1299/913/37 +f 1334/914/31 1333/921/31 1285/915/31 +f 1360/917/43 1358/895/43 1310/897/43 +f 1347/918/39 1348/929/39 1300/919/39 +f 1333/921/35 1335/1746/35 1287/922/35 +f 1362/923/42 1361/933/42 1313/924/42 +f 1322/926/33 1321/935/33 1273/927/33 +f 1348/929/40 1346/905/40 1298/907/40 +f 1335/930/32 1336/940/32 1288/931/32 +f 1361/933/41 1363/1747/41 1315/934/41 +f 1321/935/31 1323/1748/31 1275/936/31 +f 1350/937/39 1349/947/39 1301/938/39 +f 1336/940/33 1334/914/33 1286/916/33 +f 1363/941/43 1364/952/43 1316/942/43 +f 1323/944/35 1324/953/35 1276/945/35 +f 1349/947/40 1351/1749/40 1303/948/40 +f 1338/949/37 1337/957/37 1289/950/37 +f 1364/952/44 1362/923/44 1314/925/44 +f 1324/953/32 1322/926/32 1274/928/32 +f 1351/954/38 1352/965/38 1304/955/38 +f 1337/957/39 1339/1750/39 1291/958/39 +f 1366/959/43 1365/969/43 1317/960/43 +f 1326/962/35 1325/971/35 1277/963/35 +f 1352/965/37 1350/937/37 1302/939/37 +f 1339/966/40 1340/975/40 1292/967/40 +f 1365/969/44 1367/1751/44 1319/970/44 +f 1325/971/32 1327/1752/32 1279/972/32 +f 1354/973/41 1353/982/41 1305/974/41 +f 1340/975/38 1338/949/38 1290/951/38 +f 1367/976/42 1368/985/42 1320/977/42 +f 1327/979/33 1328/986/33 1280/980/33 +f 1353/982/43 1355/1753/43 1307/983/43 +f 1342/984/40 1341/881/40 1293/883/40 +f 1368/985/41 1366/959/41 1318/961/41 +f 1328/986/31 1326/962/31 1278/964/31 +f 1355/987/44 1356/887/44 1308/889/44 +f 1371/989/31 1372/1002/31 1370/990/31 +f 1375/992/32 1376/998/32 1373/993/32 +f 1369/995/36 1374/994/36 1373/993/36 +f 1371/997/33 1373/993/33 1376/998/33 +f 1370/1000/35 1375/992/35 1374/994/35 +f 1372/1002/34 1376/998/34 1375/992/34 +f 1379/1003/31 1380/1016/31 1378/1004/31 +f 1383/1006/32 1384/1012/32 1381/1007/32 +f 1377/1009/36 1382/1008/36 1381/1007/36 +f 1379/1011/33 1381/1007/33 1384/1012/33 +f 1378/1014/35 1383/1006/35 1382/1008/35 +f 1380/1016/34 1384/1012/34 1383/1006/34 +f 1387/1017/31 1388/1030/31 1386/1018/31 +f 1391/1020/32 1392/1026/32 1389/1021/32 +f 1385/1023/36 1390/1022/36 1389/1021/36 +f 1387/1025/33 1389/1021/33 1392/1026/33 +f 1386/1028/35 1391/1020/35 1390/1022/35 +f 1388/1030/34 1392/1026/34 1391/1020/34 +f 1395/1031/31 1396/1044/31 1394/1032/31 +f 1399/1034/32 1400/1040/32 1397/1035/32 +f 1393/1037/36 1398/1036/36 1397/1035/36 +f 1395/1039/33 1397/1035/33 1400/1040/33 +f 1394/1042/35 1399/1034/35 1398/1036/35 +f 1396/1044/34 1400/1040/34 1399/1034/34 +f 1402/1045/34 1404/1051/34 1403/1046/34 +f 1407/1048/31 1415/1754/31 1416/1049/31 +f 1404/1051/33 1412/1064/33 1409/1052/33 +f 1401/1047/35 1410/1060/35 1411/1053/35 +f 1402/1045/31 1411/1062/31 1412/1054/31 +f 1403/1046/32 1409/1057/32 1410/1055/32 +f 1406/1056/36 1410/1055/36 1409/1057/36 +f 1407/1059/36 1411/1053/36 1410/1060/36 +f 1408/1050/36 1412/1054/36 1411/1062/36 +f 1405/1063/36 1409/1052/36 1412/1064/36 +f 1405/1058/32 1413/1755/32 1414/1066/32 +f 1408/1065/33 1416/1756/33 1413/1067/33 +f 1406/1061/35 1414/1757/35 1415/1068/35 +f 1418/1069/34 1420/1075/34 1419/1070/34 +f 1423/1072/31 1431/1758/31 1432/1073/31 +f 1420/1075/33 1428/1088/33 1425/1076/33 +f 1417/1071/35 1426/1084/35 1427/1077/35 +f 1418/1069/31 1427/1086/31 1428/1078/31 +f 1419/1070/32 1425/1081/32 1426/1079/32 +f 1422/1080/36 1426/1079/36 1425/1081/36 +f 1423/1083/36 1427/1077/36 1426/1084/36 +f 1424/1074/36 1428/1078/36 1427/1086/36 +f 1421/1087/36 1425/1076/36 1428/1088/36 +f 1421/1082/32 1429/1759/32 1430/1090/32 +f 1424/1089/33 1432/1760/33 1429/1091/33 +f 1422/1085/35 1430/1761/35 1431/1092/35 +f 1434/1093/34 1436/1099/34 1435/1094/34 +f 1439/1096/31 1447/1762/31 1448/1097/31 +f 1436/1099/33 1444/1112/33 1441/1100/33 +f 1433/1095/35 1442/1108/35 1443/1101/35 +f 1434/1093/31 1443/1110/31 1444/1102/31 +f 1435/1094/32 1441/1105/32 1442/1103/32 +f 1438/1104/36 1442/1103/36 1441/1105/36 +f 1439/1107/36 1443/1101/36 1442/1108/36 +f 1440/1098/36 1444/1102/36 1443/1110/36 +f 1437/1111/36 1441/1100/36 1444/1112/36 +f 1437/1106/32 1445/1763/32 1446/1114/32 +f 1440/1113/33 1448/1764/33 1445/1115/33 +f 1438/1109/35 1446/1765/35 1447/1116/35 +f 1450/1117/34 1452/1123/34 1451/1118/34 +f 1455/1120/31 1463/1766/31 1464/1121/31 +f 1452/1123/33 1460/1136/33 1457/1124/33 +f 1449/1119/35 1458/1132/35 1459/1125/35 +f 1450/1117/31 1459/1134/31 1460/1126/31 +f 1451/1118/32 1457/1129/32 1458/1127/32 +f 1454/1128/36 1458/1127/36 1457/1129/36 +f 1455/1131/36 1459/1125/36 1458/1132/36 +f 1456/1122/36 1460/1126/36 1459/1134/36 +f 1453/1135/36 1457/1124/36 1460/1136/36 +f 1453/1130/32 1461/1767/32 1462/1138/32 +f 1456/1137/33 1464/1768/33 1461/1139/33 +f 1454/1133/35 1462/1769/35 1463/1140/35 +f 1466/1141/36 1468/1147/36 1467/1142/36 +f 1471/1144/31 1479/1770/31 1480/1145/31 +f 1468/1147/35 1476/1160/35 1473/1148/35 +f 1465/1143/33 1474/1156/33 1475/1149/33 +f 1466/1141/31 1475/1158/31 1476/1150/31 +f 1465/1143/32 1467/1142/32 1473/1151/32 +f 1470/1153/34 1474/1152/34 1473/1151/34 +f 1471/1155/34 1475/1149/34 1474/1156/34 +f 1472/1146/34 1476/1150/34 1475/1158/34 +f 1469/1159/34 1473/1148/34 1476/1160/34 +f 1469/1154/32 1477/1771/32 1478/1162/32 +f 1472/1161/35 1480/1772/35 1477/1163/35 +f 1470/1157/33 1478/1773/33 1479/1164/33 +f 1482/1165/36 1484/1171/36 1483/1166/36 +f 1487/1168/31 1495/1774/31 1496/1169/31 +f 1484/1171/35 1492/1184/35 1489/1172/35 +f 1481/1167/33 1490/1180/33 1491/1173/33 +f 1482/1165/31 1491/1182/31 1492/1174/31 +f 1483/1166/32 1489/1177/32 1490/1175/32 +f 1486/1176/34 1490/1175/34 1489/1177/34 +f 1487/1179/34 1491/1173/34 1490/1180/34 +f 1488/1170/34 1492/1174/34 1491/1182/34 +f 1485/1183/34 1489/1172/34 1492/1184/34 +f 1485/1178/32 1493/1775/32 1494/1186/32 +f 1488/1185/35 1496/1776/35 1493/1187/35 +f 1486/1181/33 1494/1777/33 1495/1188/33 +f 1498/1189/36 1500/1195/36 1499/1190/36 +f 1503/1192/31 1511/1778/31 1512/1193/31 +f 1500/1195/35 1508/1208/35 1505/1196/35 +f 1497/1191/33 1506/1204/33 1507/1197/33 +f 1498/1189/31 1507/1206/31 1508/1198/31 +f 1499/1190/32 1505/1201/32 1506/1199/32 +f 1502/1200/34 1506/1199/34 1505/1201/34 +f 1503/1203/34 1507/1197/34 1506/1204/34 +f 1504/1194/34 1508/1198/34 1507/1206/34 +f 1501/1207/34 1505/1196/34 1508/1208/34 +f 1501/1202/32 1509/1779/32 1510/1210/32 +f 1504/1209/35 1512/1780/35 1509/1211/35 +f 1502/1205/33 1510/1781/33 1511/1212/33 +f 1514/1213/36 1516/1219/36 1515/1214/36 +f 1519/1216/31 1527/1782/31 1528/1217/31 +f 1516/1219/35 1524/1232/35 1521/1220/35 +f 1513/1215/33 1522/1228/33 1523/1221/33 +f 1514/1213/31 1523/1230/31 1524/1222/31 +f 1515/1214/32 1521/1225/32 1522/1223/32 +f 1518/1224/34 1522/1223/34 1521/1225/34 +f 1519/1227/34 1523/1221/34 1522/1228/34 +f 1520/1218/34 1524/1222/34 1523/1230/34 +f 1517/1231/34 1521/1220/34 1524/1232/34 +f 1517/1226/32 1525/1783/32 1526/1234/32 +f 1520/1233/35 1528/1784/35 1525/1235/35 +f 1518/1229/33 1526/1785/33 1527/1236/33 +f 1530/1237/36 1532/1243/36 1531/1238/36 +f 1535/1240/31 1543/1786/31 1544/1241/31 +f 1532/1243/35 1540/1256/35 1537/1244/35 +f 1529/1239/33 1538/1252/33 1539/1245/33 +f 1530/1237/31 1539/1254/31 1540/1246/31 +f 1531/1238/32 1537/1249/32 1538/1247/32 +f 1534/1248/34 1538/1247/34 1537/1249/34 +f 1535/1251/34 1539/1245/34 1538/1252/34 +f 1536/1242/34 1540/1246/34 1539/1254/34 +f 1533/1255/34 1537/1244/34 1540/1256/34 +f 1533/1250/32 1541/1787/32 1542/1258/32 +f 1536/1257/35 1544/1788/35 1541/1259/35 +f 1534/1253/33 1542/1789/33 1543/1260/33 +f 1546/1261/33 1548/1267/33 1547/1262/33 +f 1551/1264/31 1559/1790/31 1560/1265/31 +f 1548/1267/36 1556/1280/36 1553/1268/36 +f 1545/1263/34 1554/1276/34 1555/1269/34 +f 1546/1261/31 1555/1278/31 1556/1270/31 +f 1547/1262/32 1553/1273/32 1554/1271/32 +f 1550/1272/35 1554/1271/35 1553/1273/35 +f 1551/1275/35 1555/1269/35 1554/1276/35 +f 1552/1266/35 1556/1270/35 1555/1278/35 +f 1549/1279/35 1553/1268/35 1556/1280/35 +f 1549/1274/32 1557/1791/32 1558/1282/32 +f 1552/1281/36 1560/1792/36 1557/1283/36 +f 1550/1277/34 1558/1793/34 1559/1284/34 +f 1562/1285/33 1564/1291/33 1563/1286/33 +f 1567/1288/31 1575/1794/31 1576/1289/31 +f 1564/1291/36 1572/1304/36 1569/1292/36 +f 1561/1287/34 1570/1300/34 1571/1293/34 +f 1562/1285/31 1571/1302/31 1572/1294/31 +f 1563/1286/32 1569/1297/32 1570/1295/32 +f 1566/1296/35 1570/1295/35 1569/1297/35 +f 1567/1299/35 1571/1293/35 1570/1300/35 +f 1568/1290/35 1572/1294/35 1571/1302/35 +f 1565/1303/35 1569/1292/35 1572/1304/35 +f 1565/1298/32 1573/1795/32 1574/1306/32 +f 1568/1305/36 1576/1796/36 1573/1307/36 +f 1566/1301/34 1574/1797/34 1575/1308/34 +f 1578/1309/33 1580/1315/33 1579/1310/33 +f 1583/1312/31 1591/1798/31 1592/1313/31 +f 1580/1315/36 1588/1328/36 1585/1316/36 +f 1577/1311/34 1586/1324/34 1587/1317/34 +f 1578/1309/31 1587/1326/31 1588/1318/31 +f 1579/1310/32 1585/1321/32 1586/1319/32 +f 1582/1320/35 1586/1319/35 1585/1321/35 +f 1583/1323/35 1587/1317/35 1586/1324/35 +f 1584/1314/35 1588/1318/35 1587/1326/35 +f 1581/1327/35 1585/1316/35 1588/1328/35 +f 1581/1322/32 1589/1799/32 1590/1330/32 +f 1584/1329/36 1592/1800/36 1589/1331/36 +f 1582/1325/34 1590/1801/34 1591/1332/34 +f 1594/1333/33 1596/1339/33 1595/1334/33 +f 1599/1336/31 1607/1802/31 1608/1337/31 +f 1596/1339/36 1604/1352/36 1601/1340/36 +f 1593/1335/34 1602/1348/34 1603/1341/34 +f 1594/1333/31 1603/1350/31 1604/1342/31 +f 1595/1334/32 1601/1345/32 1602/1343/32 +f 1598/1344/35 1602/1343/35 1601/1345/35 +f 1599/1347/35 1603/1341/35 1602/1348/35 +f 1600/1338/35 1604/1342/35 1603/1350/35 +f 1597/1351/35 1601/1340/35 1604/1352/35 +f 1597/1346/32 1605/1803/32 1606/1354/32 +f 1600/1353/36 1608/1804/36 1605/1355/36 +f 1598/1349/34 1606/1805/34 1607/1356/34 +f 1610/1357/33 1612/1363/33 1611/1358/33 +f 1615/1360/31 1623/1806/31 1624/1361/31 +f 1612/1363/36 1620/1376/36 1617/1364/36 +f 1609/1359/34 1618/1372/34 1619/1365/34 +f 1610/1357/31 1619/1374/31 1620/1366/31 +f 1611/1358/32 1617/1369/32 1618/1367/32 +f 1614/1368/35 1618/1367/35 1617/1369/35 +f 1615/1371/35 1619/1365/35 1618/1372/35 +f 1616/1362/35 1620/1366/35 1619/1374/35 +f 1613/1375/35 1617/1364/35 1620/1376/35 +f 1613/1370/32 1621/1807/32 1622/1378/32 +f 1616/1377/36 1624/1808/36 1621/1379/36 +f 1614/1373/34 1622/1809/34 1623/1380/34 +f 1626/1381/35 1628/1387/35 1627/1382/35 +f 1631/1384/31 1639/1810/31 1640/1385/31 +f 1628/1387/34 1636/1400/34 1633/1388/34 +f 1625/1383/36 1634/1396/36 1635/1389/36 +f 1626/1381/31 1635/1398/31 1636/1390/31 +f 1627/1382/32 1633/1393/32 1634/1391/32 +f 1630/1392/33 1634/1391/33 1633/1393/33 +f 1631/1395/33 1635/1389/33 1634/1396/33 +f 1632/1386/33 1636/1390/33 1635/1398/33 +f 1629/1399/33 1633/1388/33 1636/1400/33 +f 1629/1394/32 1637/1811/32 1638/1402/32 +f 1632/1401/34 1640/1812/34 1637/1403/34 +f 1630/1397/36 1638/1813/36 1639/1404/36 +f 1642/1405/35 1644/1411/35 1643/1406/35 +f 1647/1408/31 1655/1814/31 1656/1409/31 +f 1644/1411/34 1652/1424/34 1649/1412/34 +f 1641/1407/36 1650/1420/36 1651/1413/36 +f 1642/1405/31 1651/1422/31 1652/1414/31 +f 1643/1406/32 1649/1417/32 1650/1415/32 +f 1646/1416/33 1650/1415/33 1649/1417/33 +f 1647/1419/33 1651/1413/33 1650/1420/33 +f 1648/1410/33 1652/1414/33 1651/1422/33 +f 1645/1423/33 1649/1412/33 1652/1424/33 +f 1645/1418/32 1653/1815/32 1654/1426/32 +f 1648/1425/34 1656/1816/34 1653/1427/34 +f 1646/1421/36 1654/1817/36 1655/1428/36 +f 1658/1429/35 1660/1435/35 1659/1430/35 +f 1663/1432/31 1671/1818/31 1672/1433/31 +f 1660/1435/34 1668/1448/34 1665/1436/34 +f 1657/1431/36 1666/1444/36 1667/1437/36 +f 1658/1429/31 1667/1446/31 1668/1438/31 +f 1659/1430/32 1665/1441/32 1666/1439/32 +f 1662/1440/33 1666/1439/33 1665/1441/33 +f 1663/1443/33 1667/1437/33 1666/1444/33 +f 1664/1434/33 1668/1438/33 1667/1446/33 +f 1661/1447/33 1665/1436/33 1668/1448/33 +f 1661/1442/32 1669/1819/32 1670/1450/32 +f 1664/1449/34 1672/1820/34 1669/1451/34 +f 1662/1445/36 1670/1821/36 1671/1452/36 +f 1674/1453/35 1676/1459/35 1675/1454/35 +f 1679/1456/31 1687/1822/31 1688/1457/31 +f 1676/1459/34 1684/1472/34 1681/1460/34 +f 1673/1455/36 1682/1468/36 1683/1461/36 +f 1674/1453/31 1683/1470/31 1684/1462/31 +f 1673/1455/32 1675/1454/32 1681/1463/32 +f 1678/1465/33 1682/1464/33 1681/1463/33 +f 1679/1467/33 1683/1461/33 1682/1468/33 +f 1680/1458/33 1684/1462/33 1683/1470/33 +f 1677/1471/33 1681/1460/33 1684/1472/33 +f 1678/1465/32 1677/1466/32 1685/1474/32 +f 1680/1473/34 1688/1823/34 1685/1476/34 +f 1678/1469/36 1686/1824/36 1687/1477/36 +f 1690/1478/35 1692/1484/35 1691/1479/35 +f 1695/1481/31 1703/1825/31 1704/1482/31 +f 1692/1484/34 1700/1497/34 1697/1485/34 +f 1689/1480/36 1698/1493/36 1699/1486/36 +f 1690/1478/31 1699/1495/31 1700/1487/31 +f 1691/1479/32 1697/1490/32 1698/1488/32 +f 1694/1489/33 1698/1488/33 1697/1490/33 +f 1695/1492/33 1699/1486/33 1698/1493/33 +f 1696/1483/33 1700/1487/33 1699/1495/33 +f 1693/1496/33 1697/1485/33 1700/1497/33 +f 1693/1491/32 1701/1826/32 1702/1499/32 +f 1696/1498/34 1704/1827/34 1701/1500/34 +f 1694/1494/36 1702/1828/36 1703/1501/36 +f 1947/1502/33 1949/1510/33 1952/1503/33 +f 1946/1505/35 1951/1508/35 1950/1506/35 +f 1948/1504/34 1952/1503/34 1951/1508/34 +f 1945/1509/36 1950/1829/36 1949/1510/36 +f 2075/1513/36 2074/1830/36 2073/1831/36 +f 2073/1831/36 2080/1832/36 2079/1511/36 +f 2079/1511/36 2078/1833/36 2077/1512/36 +f 2077/1512/36 2076/1834/36 2075/1513/36 +f 2075/1513/36 2073/1831/36 2079/1511/36 +f 2082/1835/34 2081/1836/34 2083/1514/34 +f 2083/1514/34 2084/1837/34 2085/1515/34 +f 2085/1515/34 2086/1838/34 2087/1516/34 +f 2087/1516/34 2088/1839/34 2082/1835/34 +f 2082/1835/34 2083/1514/34 2087/1516/34 +f 2091/1519/36 2090/1840/36 2089/1841/36 +f 2089/1841/36 2096/1842/36 2095/1517/36 +f 2095/1517/36 2094/1843/36 2093/1518/36 +f 2093/1518/36 2092/1844/36 2091/1519/36 +f 2091/1519/36 2089/1841/36 2095/1517/36 +f 2098/1522/34 2097/1845/34 2099/1846/34 +f 2099/1846/34 2100/1847/34 2101/1520/34 +f 2101/1520/34 2102/1848/34 2103/1521/34 +f 2103/1521/34 2104/1849/34 2098/1522/34 +f 2098/1522/34 2099/1846/34 2101/1520/34 +f 2112/1523/35 2109/1530/35 2107/1524/35 +f 2110/1526/33 2111/1529/33 2106/1527/33 +f 2111/1529/36 2112/1523/36 2108/1525/36 +f 2109/1530/34 2110/1850/34 2105/1531/34 +f 2120/1532/35 2117/1539/35 2115/1533/35 +f 2118/1535/33 2119/1538/33 2114/1536/33 +f 2119/1538/36 2120/1532/36 2116/1534/36 +f 2117/1539/34 2118/1851/34 2113/1540/34 +s 1 +f 269/1852/45 280/1853/36 268/1854/36 +f 276/1855/46 287/1856/47 275/1857/47 +f 266/1858/48 278/1859/33 265/1860/33 +f 273/1861/49 284/1862/50 272/1863/50 +f 270/1864/51 281/1865/45 269/1852/45 +f 265/1860/33 288/1866/46 276/1855/46 +f 267/1867/52 277/1868/48 266/1858/48 +f 274/1869/34 285/1870/49 273/1861/49 +f 271/1871/35 282/1872/51 270/1864/51 +f 268/1873/36 279/1874/52 267/1867/52 +f 275/1857/47 286/1875/34 274/1869/34 +f 272/1863/50 283/1876/35 271/1871/35 +f 292/1877/36 305/1878/45 304/1879/36 +f 300/1880/46 311/1881/47 299/1882/47 +f 290/1883/48 302/1884/33 289/1885/33 +f 297/1886/49 308/1887/50 296/1888/50 +f 293/1889/45 306/1890/51 305/1878/45 +f 289/1885/33 312/1891/46 300/1880/46 +f 291/1892/52 301/1893/48 290/1883/48 +f 298/1894/34 309/1895/49 297/1886/49 +f 295/1896/35 306/1890/51 294/1897/51 +f 292/1898/36 303/1899/52 291/1892/52 +f 298/1894/34 311/1881/47 310/1900/34 +f 296/1888/50 307/1901/35 295/1896/35 +f 317/1902/45 328/1903/36 316/1904/36 +f 324/1905/46 335/1906/47 323/1907/47 +f 314/1908/48 326/1909/33 313/1910/33 +f 321/1911/49 332/1912/50 320/1913/50 +f 318/1914/51 329/1915/45 317/1902/45 +f 313/1910/33 336/1916/46 324/1905/46 +f 315/1917/52 325/1918/48 314/1908/48 +f 322/1919/34 333/1920/49 321/1911/49 +f 319/1921/35 330/1922/51 318/1914/51 +f 316/1923/36 327/1924/52 315/1917/52 +f 323/1907/47 334/1925/34 322/1919/34 +f 320/1913/50 331/1926/35 319/1921/35 +f 341/1927/45 352/1928/36 340/1929/36 +f 348/1930/46 359/1931/47 347/1932/47 +f 338/1933/48 350/1934/33 337/1935/33 +f 345/1936/49 356/1937/50 344/1938/50 +f 342/1939/51 353/1940/45 341/1927/45 +f 337/1935/33 360/1941/46 348/1930/46 +f 338/1933/48 351/1942/52 349/1943/48 +f 346/1944/34 357/1945/49 345/1936/49 +f 343/1946/35 354/1947/51 342/1939/51 +f 340/1948/36 351/1942/52 339/1949/52 +f 346/1944/34 359/1931/47 358/1950/34 +f 344/1938/50 355/1951/35 343/1946/35 +f 392/1952/53 399/1953/54 391/1954/34 +f 390/1955/55 397/1956/56 389/1957/35 +f 388/1958/57 395/1959/58 387/1960/36 +f 386/1961/59 393/1962/60 385/1963/33 +f 385/1963/33 400/1964/61 392/1952/53 +f 391/1965/34 398/1966/62 390/1955/55 +f 389/1957/35 396/1967/63 388/1958/57 +f 387/1960/36 394/1968/64 386/1961/59 +f 393/1969/60 402/1970/65 401/1971/66 +f 393/1969/60 407/1972/67 400/1973/61 +f 397/1974/56 404/1975/68 396/1967/63 +f 395/1959/58 402/1970/65 394/1968/64 +f 398/1976/62 405/1977/69 397/1974/56 +f 396/1967/63 403/1978/70 395/1959/58 +f 406/1979/71 412/1980/72 405/1977/69 +f 403/1978/70 411/1981/73 410/1982/74 +f 401/1971/66 409/1983/75 408/1984/76 +f 407/1972/67 408/1984/76 414/1985/77 +f 405/1977/69 411/1981/73 404/1975/68 +f 403/1978/70 409/1983/75 402/1970/65 +f 398/1976/62 399/1986/54 406/1979/71 +f 406/1979/71 399/1986/54 413/1987/78 +f 400/1973/61 407/1972/67 399/1988/54 +f 407/1972/67 414/1985/77 399/1988/54 +f 422/1989/57 429/1990/79 421/1991/36 +f 420/1992/59 427/1993/80 419/1994/33 +f 418/1995/53 425/1996/81 417/1997/34 +f 416/1998/55 423/1999/82 415/2000/35 +f 415/2000/35 430/2001/83 422/1989/57 +f 421/2002/36 428/2003/84 420/1992/59 +f 419/1994/33 426/2004/85 418/1995/53 +f 417/1997/34 424/2005/86 416/1998/55 +f 423/2006/82 432/2007/87 431/2008/88 +f 423/2006/82 437/2009/89 430/2010/83 +f 427/2011/80 434/2012/90 426/2004/85 +f 424/2005/86 433/2013/91 432/2007/87 +f 427/2011/80 436/2014/92 435/2015/93 +f 426/2004/85 433/2013/91 425/1996/81 +f 436/2014/92 442/2016/94 435/2015/93 +f 433/2013/91 441/2017/95 440/2018/96 +f 432/2007/87 438/2019/97 431/2008/88 +f 431/2008/88 444/2020/98 437/2009/89 +f 435/2015/93 441/2017/95 434/2012/90 +f 433/2013/91 439/2021/99 432/2007/87 +f 428/2022/84 429/2023/79 436/2014/92 +f 436/2014/92 429/2023/79 443/2024/100 +f 430/2010/83 437/2009/89 429/2025/79 +f 437/2009/89 444/2020/98 429/2025/79 +f 440/2018/96 409/1983/75 410/1982/74 +f 439/2021/99 410/1982/74 411/1981/73 +f 438/2026/97 411/1981/73 412/2027/72 +f 444/2028/98 412/2027/72 413/2029/78 +f 429/2030/79 413/2029/78 399/2031/54 +f 399/2032/54 443/2033/100 429/2034/79 +f 442/2035/94 414/2036/77 408/2037/76 +f 441/2017/95 408/2037/76 409/1983/75 +f 452/2038/53 459/2039/54 451/2040/34 +f 450/2041/55 457/2042/56 449/2043/35 +f 448/2044/57 455/2045/58 447/2046/36 +f 446/2047/59 453/2048/60 445/2049/33 +f 445/2049/33 460/2050/61 452/2038/53 +f 451/2051/34 458/2052/62 450/2041/55 +f 449/2043/35 456/2053/63 448/2044/57 +f 447/2046/36 454/2054/64 446/2047/59 +f 453/2055/60 462/2056/65 461/2057/66 +f 453/2055/60 467/2058/67 460/2059/61 +f 456/2053/63 465/2060/69 464/2061/68 +f 454/2054/64 463/2062/70 462/2056/65 +f 457/2063/56 466/2064/71 465/2060/69 +f 455/2045/58 464/2061/68 463/2062/70 +f 466/2064/71 472/2065/72 465/2060/69 +f 464/2061/68 470/2066/74 463/2062/70 +f 462/2056/65 468/2067/76 461/2057/66 +f 467/2058/67 468/2067/76 474/2068/77 +f 465/2060/69 471/2069/73 464/2061/68 +f 463/2062/70 469/2070/75 462/2056/65 +f 458/2071/62 459/2072/54 466/2064/71 +f 466/2064/71 459/2072/54 473/2073/78 +f 460/2059/61 467/2058/67 459/2074/54 +f 467/2058/67 474/2068/77 459/2074/54 +f 482/2075/57 489/2076/79 481/2077/36 +f 480/2078/59 487/2079/80 479/2080/33 +f 478/2081/53 485/2082/81 477/2083/34 +f 476/2084/55 483/2085/82 475/2086/35 +f 475/2086/35 490/2087/83 482/2075/57 +f 481/2088/36 488/2089/84 480/2078/59 +f 479/2080/33 486/2090/85 478/2081/53 +f 477/2083/34 484/2091/86 476/2084/55 +f 483/2092/82 492/2093/87 491/2094/88 +f 483/2092/82 497/2095/89 490/2096/83 +f 487/2097/80 494/2098/101 486/2090/85 +f 484/2091/86 493/2099/91 492/2093/87 +f 487/2097/80 496/2100/92 495/2101/93 +f 486/2090/85 493/2099/91 485/2082/81 +f 496/2100/92 502/2102/94 495/2101/93 +f 494/2098/101 500/2103/96 493/2099/91 +f 491/2094/88 499/2104/99 498/2105/97 +f 497/2095/89 498/2105/97 504/2106/98 +f 494/2098/101 502/2102/94 501/2107/95 +f 493/2099/91 499/2104/99 492/2093/87 +f 488/2108/84 489/2109/79 496/2100/92 +f 496/2100/92 489/2109/79 503/2110/100 +f 490/2096/83 497/2095/89 489/2111/79 +f 497/2095/89 504/2106/98 489/2111/79 +f 500/2103/96 469/2070/75 470/2066/74 +f 471/2069/73 500/2103/96 470/2066/74 +f 498/2112/97 471/2069/73 472/2113/72 +f 504/2114/98 472/2113/72 473/2115/78 +f 489/2116/79 473/2115/78 459/2117/54 +f 459/2118/54 503/2119/100 489/2120/79 +f 502/2121/94 474/2122/77 468/2123/76 +f 501/2107/95 468/2123/76 469/2070/75 +f 511/2124/31 518/2125/102 510/2126/102 +f 509/2127/35 516/2128/103 508/2129/103 +f 507/2130/32 513/2131/104 506/2132/104 +f 512/2133/105 519/2134/31 511/2135/31 +f 510/2126/102 517/2136/35 509/2127/35 +f 508/2129/103 515/2137/32 507/2130/32 +f 506/2132/104 514/2138/33 505/2139/33 +f 505/2139/33 520/2140/105 512/2133/105 +f 580/2141/32 603/2142/41 579/2143/41 +f 587/2144/39 610/2145/31 586/2146/31 +f 584/2147/40 607/2148/35 583/2149/35 +f 581/2150/38 604/2151/32 580/2141/32 +f 588/2152/43 611/2153/39 587/2144/39 +f 578/2154/37 601/2155/33 577/2156/33 +f 585/2157/44 608/2158/40 584/2147/40 +f 582/2159/42 605/2160/38 581/2150/38 +f 577/2156/33 612/2161/43 588/2152/43 +f 579/2143/41 602/2162/37 578/2154/37 +f 586/2163/31 609/2164/44 585/2157/44 +f 583/2149/35 606/2165/42 582/2159/42 +f 613/2166/33 590/2167/37 589/2168/33 +f 620/2169/40 597/2170/44 596/2171/40 +f 617/2172/38 594/2173/42 593/2174/38 +f 624/2175/43 589/2168/33 600/2176/43 +f 614/2177/37 591/2178/41 590/2167/37 +f 621/2179/44 598/2180/31 597/2170/44 +f 618/2181/42 595/2182/35 594/2173/42 +f 615/2183/41 592/2184/32 591/2178/41 +f 622/2185/31 599/2186/39 598/2187/31 +f 619/2188/35 596/2171/40 595/2182/35 +f 616/2189/32 593/2174/38 592/2184/32 +f 623/2190/39 600/2176/43 599/2186/39 +f 626/507/106 579/2143/107 578/2154/106 +f 627/539/107 580/2141/70 579/2143/107 +f 580/2141/70 629/536/108 581/2150/108 +f 629/534/108 582/2159/109 581/2150/108 +f 630/530/109 583/2149/57 582/2159/109 +f 583/2149/57 632/528/110 584/2147/110 +f 632/524/110 585/2157/111 584/2147/110 +f 633/521/111 586/2163/79 585/2157/111 +f 634/518/79 587/2144/112 586/2146/79 +f 635/515/112 588/2152/113 587/2144/112 +f 588/2152/113 625/514/59 577/2156/59 +f 577/2156/59 626/511/106 578/2154/106 +f 601/2155/53 638/2191/114 637/2192/53 +f 603/2142/115 638/2193/114 602/2162/114 +f 604/2151/91 639/2194/115 603/2142/115 +f 604/2151/91 641/2195/116 640/2196/91 +f 606/2165/117 641/2197/116 605/2160/116 +f 607/2148/55 642/2198/117 606/2165/117 +f 607/2148/55 644/2199/118 643/2200/55 +f 609/2164/119 644/2201/118 608/2158/118 +f 610/2202/54 645/2203/119 609/2164/119 +f 611/2153/120 646/2204/54 610/2145/54 +f 612/2161/121 647/2205/120 611/2153/120 +f 601/2155/53 648/2206/121 612/2161/121 +f 658/1665/31 671/558/39 659/519/39 +f 655/527/35 668/552/40 656/1666/40 +f 652/535/32 665/546/38 653/532/38 +f 659/519/39 672/561/43 660/516/43 +f 649/510/33 662/542/37 650/1664/37 +f 656/1666/40 669/554/44 657/525/44 +f 653/532/38 666/548/42 654/1667/42 +f 660/516/43 661/563/33 649/510/33 +f 650/1664/37 663/541/41 651/508/41 +f 657/525/44 670/556/31 658/522/31 +f 654/1667/42 667/550/35 655/527/35 +f 651/508/41 664/544/32 652/535/32 +f 706/1681/31 719/616/39 707/577/39 +f 703/585/35 716/610/40 704/1682/40 +f 700/593/32 713/604/38 701/590/38 +f 707/577/39 720/619/43 708/574/43 +f 697/568/33 710/600/37 698/1680/37 +f 704/1682/40 717/612/44 705/583/44 +f 701/590/38 714/606/42 702/1683/42 +f 708/574/43 709/621/33 697/568/33 +f 698/1680/37 711/599/41 699/566/41 +f 705/583/44 718/614/31 706/580/31 +f 702/1683/42 715/608/35 703/585/35 +f 699/566/41 712/602/32 700/593/32 +f 591/2178/115 722/598/114 590/2167/114 +f 592/2184/91 723/601/115 591/2178/115 +f 592/2184/91 725/1686/116 724/603/91 +f 594/2173/117 725/1687/116 593/2174/116 +f 595/2182/55 726/607/117 594/2173/117 +f 595/2182/55 728/609/118 727/1689/55 +f 597/2170/119 728/611/118 596/2171/118 +f 598/2180/54 729/613/119 597/2170/119 +f 599/2186/120 730/615/54 598/2187/54 +f 600/2176/121 731/618/120 599/2186/120 +f 600/2176/121 721/1694/53 732/620/121 +f 589/2168/53 722/622/114 721/1695/53 +f 686/2207/37 675/2208/41 674/2209/37 +f 687/2210/41 676/2211/32 675/2208/41 +f 688/2212/32 677/2213/38 676/2211/32 +f 689/2214/38 678/2215/42 677/2213/38 +f 690/2216/42 679/2217/35 678/2215/42 +f 691/2218/35 680/2219/40 679/2217/35 +f 692/2220/40 681/2221/44 680/2219/40 +f 693/2222/44 682/2223/31 681/2221/44 +f 694/2224/31 683/2225/39 682/2226/31 +f 695/2227/39 684/2228/43 683/2225/39 +f 696/2229/43 673/2230/33 684/2228/43 +f 685/2231/33 674/2209/37 673/2230/33 +f 614/2177/106 735/2232/107 615/2183/107 +f 735/2233/107 616/2189/70 615/2183/107 +f 616/2189/70 737/2234/108 617/2172/108 +f 737/2235/108 618/2181/109 617/2172/108 +f 738/2236/109 619/2188/57 618/2181/109 +f 619/2188/57 740/2237/110 620/2169/110 +f 740/2238/110 621/2179/111 620/2169/110 +f 741/2239/111 622/2240/79 621/2179/111 +f 742/2241/79 623/2190/112 622/2185/79 +f 743/2242/112 624/2175/113 623/2190/112 +f 744/2243/113 613/2166/59 624/2175/113 +f 613/2166/59 734/2244/106 614/2177/106 +f 784/2245/59 791/2246/105 783/2247/33 +f 782/2248/53 789/2249/122 781/2250/34 +f 780/2251/55 787/2252/123 779/2253/35 +f 778/2254/57 785/2255/124 777/2256/36 +f 777/2256/36 792/2257/125 784/2245/59 +f 783/2258/33 790/2259/126 782/2248/53 +f 781/2250/34 788/2260/127 780/2251/55 +f 779/2253/35 786/2261/128 778/2254/57 +f 786/2261/128 793/2262/129 785/2263/124 +f 785/2263/124 799/2264/130 792/2265/125 +f 788/2260/127 797/2266/131 796/2267/132 +f 787/2252/123 794/2268/133 786/2261/128 +f 789/2269/122 798/2270/134 797/2266/131 +f 787/2252/123 796/2267/132 795/2271/103 +f 798/2270/134 804/2272/135 797/2266/131 +f 795/2271/103 803/2273/136 802/2274/137 +f 793/2262/129 801/2275/138 800/2276/139 +f 799/2264/130 800/2276/139 806/2277/140 +f 797/2266/131 803/2273/136 796/2267/132 +f 795/2271/103 801/2275/138 794/2268/133 +f 790/2278/126 791/2279/105 798/2270/134 +f 798/2270/134 791/2279/105 805/2280/141 +f 792/2265/125 799/2264/130 791/2281/105 +f 799/2264/130 806/2277/140 791/2281/105 +f 814/2282/142 821/2283/102 813/2284/143 +f 812/2285/144 819/2286/145 811/2287/146 +f 810/2288/147 817/2289/148 809/2290/149 +f 808/2291/150 815/2292/151 807/2293/91 +f 807/2293/91 822/2294/152 814/2282/142 +f 813/2295/143 820/2296/153 812/2285/144 +f 811/2287/146 818/2297/154 810/2288/147 +f 809/2290/149 816/2298/155 808/2291/150 +f 815/2299/151 824/2300/156 823/2301/157 +f 815/2299/151 829/2302/158 822/2303/152 +f 819/2304/145 826/2305/159 818/2297/154 +f 817/2289/148 824/2300/156 816/2298/155 +f 819/2304/145 828/2306/160 827/2307/161 +f 818/2297/154 825/2308/104 817/2289/148 +f 828/2306/160 834/2309/162 827/2307/161 +f 825/2308/104 833/2310/163 832/2311/164 +f 823/2301/157 831/2312/165 830/2313/166 +f 829/2302/158 830/2313/166 836/2314/167 +f 827/2307/161 833/2310/163 826/2305/159 +f 825/2308/104 831/2312/165 824/2300/156 +f 820/2315/153 821/2316/102 828/2306/160 +f 828/2306/160 821/2316/102 835/2317/168 +f 822/2303/152 829/2302/158 821/2318/102 +f 829/2302/158 836/2314/167 821/2318/102 +f 832/2311/164 801/2275/138 802/2274/137 +f 831/2312/165 802/2274/137 803/2273/136 +f 830/2319/166 803/2273/136 804/2320/135 +f 836/2321/167 804/2320/135 805/2322/141 +f 821/2323/102 805/2322/141 791/2324/105 +f 806/2325/140 821/2326/102 791/2327/105 +f 834/2328/162 806/2325/140 800/2329/139 +f 833/2310/163 800/2329/139 801/2275/138 +f 844/2330/59 851/2331/105 843/2332/33 +f 842/2333/53 849/2334/122 841/2335/34 +f 840/2336/55 847/2337/123 839/2338/35 +f 838/2339/57 845/2340/124 837/2341/36 +f 837/2341/36 852/2342/125 844/2330/59 +f 843/2343/33 850/2344/126 842/2333/53 +f 841/2335/34 848/2345/127 840/2336/55 +f 839/2338/35 846/2346/128 838/2339/57 +f 846/2346/128 853/2347/129 845/2348/124 +f 845/2348/124 859/2349/130 852/2350/125 +f 849/2351/122 856/2352/132 848/2345/127 +f 847/2337/123 854/2353/169 846/2346/128 +f 849/2351/122 858/2354/134 857/2355/131 +f 848/2345/127 855/2356/103 847/2337/123 +f 858/2354/134 864/2357/135 857/2355/131 +f 856/2352/132 862/2358/137 855/2356/103 +f 853/2347/129 861/2359/138 860/2360/139 +f 859/2349/130 860/2360/139 866/2361/140 +f 857/2355/131 863/2362/136 856/2352/132 +f 855/2356/103 861/2359/138 854/2353/169 +f 850/2363/126 851/2364/105 858/2354/134 +f 858/2354/134 851/2364/105 865/2365/141 +f 852/2350/125 859/2349/130 851/2366/105 +f 859/2349/130 866/2361/140 851/2366/105 +f 874/2367/142 881/2368/102 873/2369/143 +f 872/2370/144 879/2371/145 871/2372/146 +f 870/2373/147 877/2374/148 869/2375/149 +f 868/2376/150 875/2377/151 867/2378/91 +f 867/2378/91 882/2379/152 874/2367/142 +f 873/2380/143 880/2381/153 872/2370/144 +f 871/2372/146 878/2382/154 870/2373/147 +f 869/2375/149 876/2383/155 868/2376/150 +f 876/2383/155 883/2384/157 875/2385/151 +f 875/2385/151 889/2386/158 882/2387/152 +f 879/2388/145 886/2389/159 878/2382/154 +f 877/2374/148 884/2390/170 876/2383/155 +f 879/2388/145 888/2391/160 887/2392/161 +f 877/2374/148 886/2389/159 885/2393/104 +f 888/2391/160 894/2394/162 887/2392/161 +f 886/2389/159 892/2395/164 885/2393/104 +f 883/2384/157 891/2396/165 890/2397/166 +f 889/2386/158 890/2397/166 896/2398/167 +f 887/2392/161 893/2399/163 886/2389/159 +f 884/2390/170 892/2395/164 891/2396/165 +f 880/2400/153 881/2401/102 888/2391/160 +f 888/2391/160 881/2401/102 895/2402/168 +f 882/2387/152 889/2386/158 881/2403/102 +f 889/2386/158 896/2398/167 881/2403/102 +f 892/2395/164 861/2359/138 862/2358/137 +f 891/2396/165 862/2358/137 863/2362/136 +f 890/2404/166 863/2362/136 864/2405/135 +f 896/2406/167 864/2405/135 865/2407/141 +f 881/2408/102 865/2407/141 851/2409/105 +f 866/2410/140 881/2411/102 851/2412/105 +f 894/2413/162 866/2410/140 860/2414/139 +f 893/2399/163 860/2414/139 861/2359/138 +f 813/2415/143 903/2416/171 814/2417/142 +f 873/2418/143 910/2419/171 874/2420/142 +f 810/2288/147 900/2421/79 811/2287/146 +f 871/2372/146 906/2422/172 907/2423/79 +f 811/2287/146 901/2424/173 812/2285/144 +f 871/2372/146 908/2425/173 872/2370/144 +f 809/2426/149 897/2427/174 898/2428/175 +f 868/2429/150 905/2430/175 869/2431/149 +f 812/2285/144 902/2432/176 813/2433/143 +f 872/2370/144 909/2434/176 873/2435/143 +f 809/2426/149 899/2436/172 810/2288/147 +f 869/2431/149 906/2422/172 870/2373/147 +f 902/2437/176 917/2438/177 903/2416/171 +f 899/2436/172 914/2439/178 900/2421/79 +f 907/2423/79 922/2440/179 908/2425/173 +f 905/2430/175 918/2441/180 919/2442/181 +f 900/2421/79 915/2443/179 901/2424/173 +f 909/2434/176 922/2440/179 923/2444/182 +f 898/2428/175 911/2445/180 912/2446/181 +f 905/2430/175 920/2447/183 906/2422/172 +f 902/2432/176 915/2443/179 916/2448/182 +f 909/2449/176 924/2450/177 910/2419/171 +f 898/2428/175 913/2451/183 899/2436/172 +f 907/2423/79 920/2447/183 921/2452/178 +f 867/2453/91 904/2454/174 868/2429/150 +f 904/2454/174 867/2453/91 918/2441/180 +f 874/2420/142 910/2419/171 867/2453/91 +f 910/2419/171 924/2450/177 867/2453/91 +f 807/2455/91 897/2427/174 808/2456/150 +f 897/2427/174 807/2455/91 911/2445/180 +f 814/2417/142 903/2416/171 807/2455/91 +f 903/2416/171 917/2438/177 807/2455/91 +f 920/2447/183 937/2457/31 921/2452/178 +f 912/2458/181 929/2459/105 913/2451/183 +f 807/2460/91 927/2461/104 911/2462/180 +f 921/2452/178 938/2463/102 922/2440/179 +f 913/2451/183 930/2464/31 914/2439/178 +f 923/2465/182 938/2463/102 939/2466/35 +f 914/2439/178 931/2467/102 915/2443/179 +f 807/2460/91 933/2468/103 925/2469/32 +f 923/2470/182 940/2471/103 924/2472/177 +f 916/2473/182 931/2467/102 932/2474/35 +f 867/2475/91 934/2476/104 918/2477/180 +f 916/2478/182 933/2468/103 917/2479/177 +f 919/2480/181 934/2476/104 935/2481/33 +f 867/2475/91 940/2471/103 926/2482/32 +f 919/2480/181 936/2483/105 920/2447/183 +f 912/2458/181 927/2461/104 928/2484/33 +f 1138/2485/80 1156/2486/92 1157/2487/93 +f 1146/2488/80 1149/2489/92 1150/2490/93 +f 1136/2491/81 1160/2492/87 1135/2493/86 +f 1144/2494/81 1153/2495/87 1143/2496/86 +f 1137/2497/85 1159/2498/91 1136/2491/81 +f 1145/2499/85 1152/2500/91 1144/2494/81 +f 1134/2501/82 1162/2502/89 1133/2503/83 +f 1142/2504/82 1155/2505/89 1141/2506/83 +f 1142/2504/82 1153/2495/87 1154/2507/88 +f 1135/2493/86 1161/2508/88 1134/2501/82 +f 1145/2499/85 1150/2490/93 1151/2509/101 +f 1137/2497/85 1157/2487/93 1158/2510/101 +f 1155/2505/89 1168/2511/97 1169/2512/98 +f 1151/2509/101 1166/2513/96 1152/2500/91 +f 1159/2498/91 1174/2514/99 1160/2492/87 +f 1156/2486/92 1171/2515/94 1157/2487/93 +f 1152/2500/91 1167/2516/99 1153/2495/87 +f 1161/2508/88 1174/2514/99 1175/2517/97 +f 1149/2489/92 1164/2518/94 1150/2490/93 +f 1158/2510/101 1171/2515/94 1172/2519/95 +f 1154/2507/88 1167/2516/99 1168/2511/97 +f 1162/2502/89 1175/2517/97 1176/2520/98 +f 1151/2509/101 1164/2518/94 1165/2521/95 +f 1158/2510/101 1173/2522/96 1159/2498/91 +f 1140/2523/79 1156/2486/92 1139/2524/84 +f 1156/2486/92 1140/2523/79 1170/2525/100 +f 1133/2503/83 1162/2502/89 1140/2526/79 +f 1162/2502/89 1176/2520/98 1140/2526/79 +f 1148/2527/79 1149/2489/92 1147/2528/84 +f 1149/2489/92 1148/2527/79 1163/2529/100 +f 1141/2506/83 1155/2505/89 1148/2530/79 +f 1155/2505/89 1169/2512/98 1148/2530/79 +f 1172/2519/95 1189/2531/32 1173/2522/96 +f 1164/2532/94 1181/2533/104 1165/2521/95 +f 1148/2534/79 1179/2535/105 1163/2536/100 +f 1173/2522/96 1190/2537/103 1174/2514/99 +f 1165/2521/95 1182/2538/32 1166/2513/96 +f 1174/2514/99 1191/2539/35 1175/2540/97 +f 1166/2513/96 1183/2541/103 1167/2516/99 +f 1169/2542/98 1177/2543/31 1148/2544/79 +f 1175/2540/97 1192/2545/102 1176/2546/98 +f 1167/2516/99 1184/2547/35 1168/2548/97 +f 1140/2549/79 1186/2550/105 1170/2551/100 +f 1168/2548/97 1185/2552/102 1169/2542/98 +f 1170/2551/100 1187/2553/33 1171/2554/94 +f 1176/2546/98 1178/2555/31 1140/2556/79 +f 1171/2554/94 1188/2557/104 1172/2519/95 +f 1163/2536/100 1180/2558/33 1164/2532/94 +f 1145/2499/85 1206/2559/33 1146/2560/80 +f 1138/2561/80 1199/2562/59 1139/2563/84 +f 1146/2560/80 1207/2564/59 1147/2565/84 +f 1139/2563/84 1200/2566/36 1140/2567/79 +f 1140/2568/79 1193/2569/57 1133/2570/83 +f 1147/2565/84 1208/2571/36 1148/2572/79 +f 1148/2573/79 1201/2574/57 1141/2575/83 +f 1133/2570/83 1194/2576/35 1134/2577/82 +f 1141/2575/83 1202/2578/35 1142/2579/82 +f 1134/2577/82 1195/2580/55 1135/2493/86 +f 1142/2579/82 1203/2581/55 1143/2496/86 +f 1135/2493/86 1196/2582/34 1136/2491/81 +f 1143/2496/86 1204/2583/34 1144/2494/81 +f 1136/2491/81 1197/2584/53 1137/2497/85 +f 1144/2494/81 1205/2585/53 1145/2499/85 +f 1137/2497/85 1198/2586/33 1138/2561/80 +f 1219/2587/36 1212/2588/79 1211/2589/36 +f 1217/2590/32 1210/2591/70 1209/2592/32 +f 1224/2593/91 1209/2592/32 1216/2594/91 +f 1222/2595/54 1215/2596/34 1214/2597/54 +f 1220/2598/79 1213/2599/31 1212/2588/79 +f 1218/2600/70 1211/2589/36 1210/2591/70 +f 1223/2601/34 1216/2594/91 1215/2596/34 +f 1221/2602/31 1214/2597/54 1213/2603/31 +f 1235/2604/36 1228/2605/79 1227/2606/36 +f 1233/2607/32 1226/2608/70 1225/2609/32 +f 1240/2610/91 1225/2609/32 1232/2611/91 +f 1238/2612/54 1231/2613/34 1230/2614/54 +f 1236/2615/79 1229/2616/31 1228/2605/79 +f 1234/2617/70 1227/2606/36 1226/2608/70 +f 1239/2618/34 1232/2611/91 1231/2613/34 +f 1237/2619/31 1230/2614/54 1229/2620/31 +f 1251/2621/36 1244/2622/79 1243/2623/36 +f 1249/2624/32 1242/2625/70 1241/2626/32 +f 1256/2627/91 1241/2626/32 1248/2628/91 +f 1254/2629/54 1247/2630/34 1246/2631/54 +f 1252/2632/79 1245/2633/31 1244/2622/79 +f 1250/2634/70 1243/2623/36 1242/2625/70 +f 1255/2635/34 1248/2628/91 1247/2630/34 +f 1253/2636/31 1246/2631/54 1245/2637/31 +f 1267/2638/36 1260/2639/79 1259/2640/36 +f 1265/2641/32 1258/2642/70 1257/2643/32 +f 1272/2644/91 1257/2643/32 1264/2645/91 +f 1270/2646/54 1263/2647/34 1262/2648/54 +f 1268/2649/79 1261/2650/31 1260/2639/79 +f 1266/2651/70 1259/2640/36 1258/2642/70 +f 1271/2652/34 1264/2645/91 1263/2647/34 +f 1269/2653/31 1262/2648/54 1261/2654/31 +f 1712/2655/53 1719/2656/54 1711/2657/34 +f 1710/2658/55 1717/2659/56 1709/2660/35 +f 1708/2661/57 1715/2662/58 1707/2663/36 +f 1706/2664/59 1713/2665/60 1705/2666/33 +f 1705/2666/33 1720/2667/61 1712/2655/53 +f 1711/2668/34 1718/2669/62 1710/2658/55 +f 1709/2660/35 1716/2670/63 1708/2661/57 +f 1707/2663/36 1714/2671/64 1706/2664/59 +f 1713/2672/60 1722/2673/65 1721/2674/66 +f 1713/2672/60 1727/2675/67 1720/2676/61 +f 1716/2670/63 1725/2677/69 1724/2678/68 +f 1715/2662/58 1722/2673/65 1714/2671/64 +f 1718/2679/62 1725/2677/69 1717/2680/56 +f 1715/2662/58 1724/2678/68 1723/2681/70 +f 1726/2682/71 1732/2683/72 1725/2677/69 +f 1723/2681/70 1731/2684/73 1730/2685/74 +f 1721/2674/66 1729/2686/75 1728/2687/76 +f 1727/2675/67 1728/2687/76 1734/2688/77 +f 1725/2677/69 1731/2684/73 1724/2678/68 +f 1723/2681/70 1729/2686/75 1722/2673/65 +f 1718/2679/62 1719/2689/54 1726/2682/71 +f 1726/2682/71 1719/2689/54 1733/2690/78 +f 1720/2676/61 1727/2675/67 1719/2691/54 +f 1727/2675/67 1734/2688/77 1719/2691/54 +f 1742/2692/57 1749/2693/79 1741/2694/36 +f 1740/2695/59 1747/2696/80 1739/2697/33 +f 1738/2698/53 1745/2699/81 1737/2700/34 +f 1736/2701/55 1743/2702/82 1735/2703/35 +f 1735/2703/35 1750/2704/83 1742/2692/57 +f 1741/2705/36 1748/2706/84 1740/2695/59 +f 1739/2697/33 1746/2707/85 1738/2698/53 +f 1737/2700/34 1744/2708/86 1736/2701/55 +f 1743/2709/82 1752/2710/87 1751/2711/88 +f 1743/2709/82 1757/2712/89 1750/2713/83 +f 1746/2707/85 1755/2714/93 1754/2715/101 +f 1745/2699/81 1752/2710/87 1744/2708/86 +f 1748/2716/84 1755/2714/93 1747/2717/80 +f 1745/2699/81 1754/2715/101 1753/2718/91 +f 1756/2719/92 1762/2720/94 1755/2714/93 +f 1754/2715/101 1760/2721/96 1753/2718/91 +f 1751/2711/88 1759/2722/99 1758/2723/97 +f 1757/2712/89 1758/2723/97 1764/2724/98 +f 1755/2714/93 1761/2725/95 1754/2715/101 +f 1753/2718/91 1759/2722/99 1752/2710/87 +f 1748/2716/84 1749/2726/79 1756/2719/92 +f 1756/2719/92 1749/2726/79 1763/2727/100 +f 1750/2713/83 1757/2712/89 1749/2728/79 +f 1757/2712/89 1764/2724/98 1749/2728/79 +f 1760/2721/96 1729/2686/75 1730/2685/74 +f 1759/2722/99 1730/2685/74 1731/2684/73 +f 1758/2729/97 1731/2684/73 1732/2730/72 +f 1764/2731/98 1732/2730/72 1733/2732/78 +f 1749/2733/79 1733/2732/78 1719/2734/54 +f 1719/2735/54 1763/2736/100 1749/2737/79 +f 1762/2738/94 1734/2739/77 1728/2740/76 +f 1761/2725/95 1728/2740/76 1729/2686/75 +f 1772/2741/53 1779/2742/54 1771/2743/34 +f 1770/2744/55 1777/2745/56 1769/2746/35 +f 1768/2747/57 1775/2748/58 1767/2749/36 +f 1766/2750/59 1773/2751/60 1765/2752/33 +f 1765/2752/33 1780/2753/61 1772/2741/53 +f 1771/2754/34 1778/2755/62 1770/2744/55 +f 1769/2746/35 1776/2756/63 1768/2747/57 +f 1767/2749/36 1774/2757/64 1766/2750/59 +f 1773/2758/60 1782/2759/65 1781/2760/66 +f 1773/2758/60 1787/2761/67 1780/2762/61 +f 1776/2756/63 1785/2763/69 1784/2764/68 +f 1775/2748/58 1782/2759/65 1774/2757/64 +f 1778/2765/62 1785/2763/69 1777/2766/56 +f 1775/2748/58 1784/2764/68 1783/2767/70 +f 1786/2768/71 1792/2769/72 1785/2763/69 +f 1783/2767/70 1791/2770/73 1790/2771/74 +f 1781/2760/66 1789/2772/75 1788/2773/76 +f 1787/2761/67 1788/2773/76 1794/2774/77 +f 1785/2763/69 1791/2770/73 1784/2764/68 +f 1783/2767/70 1789/2772/75 1782/2759/65 +f 1778/2765/62 1779/2775/54 1786/2768/71 +f 1786/2768/71 1779/2775/54 1793/2776/78 +f 1780/2762/61 1787/2761/67 1779/2777/54 +f 1787/2761/67 1794/2774/77 1779/2777/54 +f 1802/2778/57 1809/2779/79 1801/2780/36 +f 1800/2781/59 1807/2782/80 1799/2783/33 +f 1798/2784/53 1805/2785/81 1797/2786/34 +f 1796/2787/55 1803/2788/82 1795/2789/35 +f 1795/2789/35 1810/2790/83 1802/2778/57 +f 1801/2791/36 1808/2792/84 1800/2781/59 +f 1799/2783/33 1806/2793/85 1798/2784/53 +f 1797/2786/34 1804/2794/86 1796/2787/55 +f 1803/2795/82 1812/2796/87 1811/2797/88 +f 1803/2795/82 1817/2798/89 1810/2799/83 +f 1806/2793/85 1815/2800/93 1814/2801/101 +f 1804/2794/86 1813/2802/91 1812/2796/87 +f 1807/2803/80 1816/2804/92 1815/2800/93 +f 1806/2793/85 1813/2802/91 1805/2785/81 +f 1816/2804/92 1822/2805/94 1815/2800/93 +f 1813/2802/91 1821/2806/95 1820/2807/96 +f 1811/2797/88 1819/2808/99 1818/2809/97 +f 1817/2798/89 1818/2809/97 1824/2810/98 +f 1815/2800/93 1821/2806/95 1814/2801/101 +f 1813/2802/91 1819/2808/99 1812/2796/87 +f 1808/2811/84 1809/2812/79 1816/2804/92 +f 1816/2804/92 1809/2812/79 1823/2813/100 +f 1810/2799/83 1817/2798/89 1809/2814/79 +f 1817/2798/89 1824/2810/98 1809/2814/79 +f 1820/2807/96 1789/2772/75 1790/2771/74 +f 1791/2770/73 1820/2807/96 1790/2771/74 +f 1818/2815/97 1791/2770/73 1792/2816/72 +f 1824/2817/98 1792/2816/72 1793/2818/78 +f 1809/2819/79 1793/2818/78 1779/2820/54 +f 1794/2821/77 1809/2822/79 1779/2823/54 +f 1822/2824/94 1794/2821/77 1788/2825/76 +f 1821/2806/95 1788/2825/76 1789/2772/75 +f 1832/2826/53 1839/2827/54 1831/2828/34 +f 1830/2829/55 1837/2830/56 1829/2831/35 +f 1828/2832/57 1835/2833/58 1827/2834/36 +f 1826/2835/59 1833/2836/60 1825/2837/33 +f 1825/2837/33 1840/2838/61 1832/2826/53 +f 1831/2839/34 1838/2840/62 1830/2829/55 +f 1829/2831/35 1836/2841/63 1828/2832/57 +f 1827/2834/36 1834/2842/64 1826/2835/59 +f 1833/2843/60 1842/2844/65 1841/2845/66 +f 1833/2843/60 1847/2846/67 1840/2847/61 +f 1836/2841/63 1845/2848/69 1844/2849/68 +f 1835/2833/58 1842/2844/65 1834/2842/64 +f 1837/2850/56 1846/2851/71 1845/2848/69 +f 1836/2841/63 1843/2852/70 1835/2833/58 +f 1846/2851/71 1852/2853/72 1845/2848/69 +f 1843/2852/70 1851/2854/73 1850/2855/74 +f 1841/2845/66 1849/2856/75 1848/2857/76 +f 1847/2846/67 1848/2857/76 1854/2858/77 +f 1845/2848/69 1851/2854/73 1844/2849/68 +f 1843/2852/70 1849/2856/75 1842/2844/65 +f 1838/2859/62 1839/2860/54 1846/2851/71 +f 1846/2851/71 1839/2860/54 1853/2861/78 +f 1840/2847/61 1847/2846/67 1839/2862/54 +f 1847/2846/67 1854/2858/77 1839/2862/54 +f 1862/2863/57 1869/2864/79 1861/2865/36 +f 1860/2866/59 1867/2867/80 1859/2868/33 +f 1858/2869/53 1865/2870/81 1857/2871/34 +f 1856/2872/55 1863/2873/82 1855/2874/35 +f 1855/2874/35 1870/2875/83 1862/2863/57 +f 1861/2876/36 1868/2877/84 1860/2866/59 +f 1859/2868/33 1866/2878/85 1858/2869/53 +f 1857/2871/34 1864/2879/86 1856/2872/55 +f 1863/2880/82 1872/2881/87 1871/2882/88 +f 1863/2880/82 1877/2883/89 1870/2884/83 +f 1867/2885/80 1874/2886/184 1866/2878/85 +f 1865/2870/81 1872/2881/87 1864/2879/86 +f 1868/2887/84 1875/2888/93 1867/2885/80 +f 1865/2870/81 1874/2886/184 1873/2889/91 +f 1876/2890/92 1882/2891/94 1875/2888/93 +f 1873/2889/91 1881/2892/95 1880/2893/96 +f 1872/2881/87 1878/2894/97 1871/2882/88 +f 1877/2883/89 1878/2894/97 1884/2895/98 +f 1875/2888/93 1881/2892/95 1874/2886/184 +f 1873/2889/91 1879/2896/99 1872/2881/87 +f 1868/2887/84 1869/2897/79 1876/2890/92 +f 1876/2890/92 1869/2897/79 1883/2898/100 +f 1870/2884/83 1877/2883/89 1869/2899/79 +f 1877/2883/89 1884/2895/98 1869/2899/79 +f 1880/2893/96 1849/2856/75 1850/2855/74 +f 1879/2896/99 1850/2855/74 1851/2854/73 +f 1878/2900/97 1851/2854/73 1852/2901/72 +f 1884/2902/98 1852/2901/72 1853/2903/78 +f 1869/2904/79 1853/2903/78 1839/2905/54 +f 1839/2906/54 1883/2907/100 1869/2908/79 +f 1882/2909/94 1854/2910/77 1848/2911/76 +f 1881/2892/95 1848/2911/76 1849/2856/75 +f 1892/2912/53 1899/2913/54 1891/2914/34 +f 1890/2915/55 1897/2916/56 1889/2917/35 +f 1888/2918/57 1895/2919/58 1887/2920/36 +f 1886/2921/59 1893/2922/60 1885/2923/33 +f 1885/2923/33 1900/2924/61 1892/2912/53 +f 1891/2925/34 1898/2926/62 1890/2915/55 +f 1889/2917/35 1896/2927/63 1888/2918/57 +f 1887/2920/36 1894/2928/64 1886/2921/59 +f 1894/2928/64 1901/2929/66 1893/2930/60 +f 1893/2930/60 1907/2931/67 1900/2932/61 +f 1897/2933/56 1904/2934/68 1896/2927/63 +f 1895/2919/58 1902/2935/65 1894/2928/64 +f 1897/2933/56 1906/2936/71 1905/2937/69 +f 1895/2919/58 1904/2934/68 1903/2938/70 +f 1906/2936/71 1912/2939/72 1905/2937/69 +f 1903/2938/70 1911/2940/73 1910/2941/74 +f 1901/2929/66 1909/2942/75 1908/2943/76 +f 1907/2931/67 1908/2943/76 1914/2944/77 +f 1905/2937/69 1911/2940/73 1904/2934/68 +f 1903/2938/70 1909/2942/75 1902/2935/65 +f 1898/2945/62 1899/2946/54 1906/2936/71 +f 1906/2936/71 1899/2946/54 1913/2947/78 +f 1900/2932/61 1907/2931/67 1899/2948/54 +f 1907/2931/67 1914/2944/77 1899/2948/54 +f 1922/2949/57 1929/2950/79 1921/2951/36 +f 1920/2952/59 1927/2953/80 1919/2954/33 +f 1918/2955/53 1925/2956/81 1917/2957/34 +f 1916/2958/55 1923/2959/82 1915/2960/35 +f 1915/2960/35 1930/2961/83 1922/2949/57 +f 1921/2962/36 1928/2963/84 1920/2952/59 +f 1919/2954/33 1926/2964/85 1918/2955/53 +f 1917/2957/34 1924/2965/86 1916/2958/55 +f 1923/2966/82 1932/2967/87 1931/2968/88 +f 1930/2969/83 1931/2968/88 1937/2970/89 +f 1927/2971/80 1934/2972/101 1926/2964/85 +f 1925/2956/81 1932/2967/87 1924/2965/86 +f 1927/2971/80 1936/2973/92 1935/2974/93 +f 1926/2964/85 1933/2975/91 1925/2956/81 +f 1936/2973/92 1942/2976/94 1935/2974/93 +f 1934/2972/101 1940/2977/96 1933/2975/91 +f 1931/2968/88 1939/2978/99 1938/2979/97 +f 1937/2970/89 1938/2979/97 1944/2980/98 +f 1935/2974/93 1941/2981/95 1934/2972/101 +f 1932/2967/87 1940/2977/96 1939/2978/99 +f 1928/2982/84 1929/2983/79 1936/2973/92 +f 1936/2973/92 1929/2983/79 1943/2984/100 +f 1930/2969/83 1937/2970/89 1929/2985/79 +f 1937/2970/89 1944/2980/98 1929/2985/79 +f 1940/2977/96 1909/2942/75 1910/2941/74 +f 1939/2978/99 1910/2941/74 1911/2940/73 +f 1938/2986/97 1911/2940/73 1912/2987/72 +f 1944/2988/98 1912/2987/72 1913/2989/78 +f 1929/2990/79 1913/2989/78 1899/2991/54 +f 1914/2992/77 1929/2993/79 1899/2994/54 +f 1942/2995/94 1914/2992/77 1908/2996/76 +f 1941/2981/95 1908/2996/76 1909/2942/75 +f 1960/2997/53 1967/2998/54 1959/2999/34 +f 1958/3000/55 1965/3001/56 1957/3002/35 +f 1956/3003/57 1963/3004/58 1955/3005/36 +f 1954/3006/59 1961/3007/60 1953/3008/33 +f 1953/3008/33 1968/3009/61 1960/2997/53 +f 1959/3010/34 1966/3011/62 1958/3000/55 +f 1957/3002/35 1964/3012/63 1956/3003/57 +f 1955/3005/36 1962/3013/64 1954/3006/59 +f 1961/3014/60 1970/3015/65 1969/3016/66 +f 1961/3014/60 1975/3017/67 1968/3018/61 +f 1964/3012/63 1973/3019/69 1972/3020/68 +f 1963/3004/58 1970/3015/65 1962/3013/64 +f 1965/3021/56 1974/3022/71 1973/3019/69 +f 1964/3012/63 1971/3023/70 1963/3004/58 +f 1974/3022/71 1980/3024/72 1973/3019/69 +f 1971/3023/70 1979/3025/73 1978/3026/74 +f 1969/3016/66 1977/3027/75 1976/3028/76 +f 1975/3017/67 1976/3028/76 1982/3029/77 +f 1973/3019/69 1979/3025/73 1972/3020/68 +f 1971/3023/70 1977/3027/75 1970/3015/65 +f 1966/3030/62 1967/3031/54 1974/3022/71 +f 1974/3022/71 1967/3031/54 1981/3032/78 +f 1968/3018/61 1975/3017/67 1967/3033/54 +f 1975/3017/67 1982/3029/77 1967/3033/54 +f 1990/3034/57 1997/3035/79 1989/3036/36 +f 1988/3037/59 1995/3038/80 1987/3039/33 +f 1986/3040/53 1993/3041/81 1985/3042/34 +f 1984/3043/55 1991/3044/82 1983/3045/35 +f 1983/3045/35 1998/3046/83 1990/3034/57 +f 1989/3047/36 1996/3048/84 1988/3037/59 +f 1987/3039/33 1994/3049/85 1986/3040/53 +f 1985/3042/34 1992/3050/86 1984/3043/55 +f 1991/3051/82 2000/3052/87 1999/3053/88 +f 1991/3051/82 2005/3054/89 1998/3055/83 +f 1995/3056/80 2002/3057/90 1994/3049/85 +f 1992/3050/86 2001/3058/91 2000/3052/87 +f 1995/3056/80 2004/3059/92 2003/3060/93 +f 1994/3049/85 2001/3058/91 1993/3041/81 +f 2004/3059/92 2010/3061/94 2003/3060/93 +f 2001/3058/91 2009/3062/95 2008/3063/96 +f 1999/3053/88 2007/3064/99 2006/3065/97 +f 2005/3054/89 2006/3065/97 2012/3066/98 +f 2003/3060/93 2009/3062/95 2002/3057/90 +f 2001/3058/91 2007/3064/99 2000/3052/87 +f 1996/3067/84 1997/3068/79 2004/3059/92 +f 2004/3059/92 1997/3068/79 2011/3069/100 +f 1998/3055/83 2005/3054/89 1997/3070/79 +f 2005/3054/89 2012/3066/98 1997/3070/79 +f 2008/3063/96 1977/3027/75 1978/3026/74 +f 2007/3064/99 1978/3026/74 1979/3025/73 +f 2006/3071/97 1979/3025/73 1980/3072/72 +f 2012/3073/98 1980/3072/72 1981/3074/78 +f 1997/3075/79 1981/3074/78 1967/3076/54 +f 1967/3077/54 2011/3078/100 1997/3079/79 +f 2010/3080/94 1982/3081/77 1976/3082/76 +f 2009/3062/95 1976/3082/76 1977/3027/75 +f 2020/3083/53 2027/3084/54 2019/3085/34 +f 2018/3086/55 2025/3087/56 2017/3088/35 +f 2016/3089/57 2023/3090/58 2015/3091/36 +f 2014/3092/59 2021/3093/60 2013/3094/33 +f 2013/3094/33 2028/3095/61 2020/3083/53 +f 2019/3096/34 2026/3097/62 2018/3086/55 +f 2017/3088/35 2024/3098/63 2016/3089/57 +f 2015/3091/36 2022/3099/64 2014/3092/59 +f 2022/3099/64 2029/3100/66 2021/3101/60 +f 2028/3102/61 2029/3100/66 2035/3103/67 +f 2024/3098/63 2033/3104/69 2032/3105/68 +f 2023/3090/58 2030/3106/65 2022/3099/64 +f 2025/3107/56 2034/3108/71 2033/3104/69 +f 2024/3098/63 2031/3109/70 2023/3090/58 +f 2034/3108/71 2040/3110/72 2033/3104/69 +f 2032/3105/68 2038/3111/74 2031/3109/70 +f 2029/3100/66 2037/3112/75 2036/3113/76 +f 2035/3103/67 2036/3113/76 2042/3114/77 +f 2033/3104/69 2039/3115/73 2032/3105/68 +f 2031/3109/70 2037/3112/75 2030/3106/65 +f 2026/3116/62 2027/3117/54 2034/3108/71 +f 2034/3108/71 2027/3117/54 2041/3118/78 +f 2028/3102/61 2035/3103/67 2027/3119/54 +f 2035/3103/67 2042/3114/77 2027/3119/54 +f 2050/3120/57 2057/3121/79 2049/3122/36 +f 2048/3123/59 2055/3124/80 2047/3125/33 +f 2046/3126/53 2053/3127/81 2045/3128/34 +f 2044/3129/55 2051/3130/82 2043/3131/35 +f 2043/3131/35 2058/3132/83 2050/3120/57 +f 2049/3133/36 2056/3134/84 2048/3123/59 +f 2047/3125/33 2054/3135/85 2046/3126/53 +f 2045/3128/34 2052/3136/86 2044/3129/55 +f 2051/3137/82 2060/3138/87 2059/3139/88 +f 2051/3137/82 2065/3140/89 2058/3141/83 +f 2054/3135/85 2063/3142/93 2062/3143/101 +f 2052/3136/86 2061/3144/91 2060/3138/87 +f 2055/3145/80 2064/3146/92 2063/3142/93 +f 2053/3127/81 2062/3143/101 2061/3144/91 +f 2064/3146/92 2070/3147/94 2063/3142/93 +f 2062/3143/101 2068/3148/96 2061/3144/91 +f 2059/3139/88 2067/3149/99 2066/3150/97 +f 2059/3139/88 2072/3151/98 2065/3140/89 +f 2063/3142/93 2069/3152/95 2062/3143/101 +f 2061/3144/91 2067/3149/99 2060/3138/87 +f 2056/3153/84 2057/3154/79 2064/3146/92 +f 2064/3146/92 2057/3154/79 2071/3155/100 +f 2058/3141/83 2065/3140/89 2057/3156/79 +f 2065/3140/89 2072/3151/98 2057/3156/79 +f 2068/3148/96 2037/3112/75 2038/3111/74 +f 2067/3149/99 2038/3111/74 2039/3115/73 +f 2066/3157/97 2039/3115/73 2040/3158/72 +f 2072/3159/98 2040/3158/72 2041/3160/78 +f 2057/3161/79 2041/3160/78 2027/3162/54 +f 2042/3163/77 2057/3164/79 2027/3165/54 +f 2070/3166/94 2042/3163/77 2036/3167/76 +f 2069/3152/95 2036/3167/76 2037/3112/75 +f 2079/3168/31 2086/3169/102 2078/3170/102 +f 2077/3171/35 2084/3172/103 2076/3173/103 +f 2075/3174/32 2081/3175/104 2074/3176/104 +f 2080/3177/105 2087/3178/31 2079/3179/31 +f 2078/3170/102 2085/3180/35 2077/3171/35 +f 2076/3173/103 2083/3181/32 2075/3174/32 +f 2074/3176/104 2082/3182/33 2073/3183/33 +f 2073/3183/33 2088/3184/105 2080/3177/105 +f 2095/3185/31 2102/3186/102 2094/3187/102 +f 2093/3188/35 2100/3189/103 2092/3190/103 +f 2091/3191/32 2097/3192/104 2090/3193/104 +f 2096/3194/105 2103/3195/31 2095/3196/31 +f 2094/3187/102 2101/3197/35 2093/3188/35 +f 2092/3190/103 2099/3198/32 2091/3191/32 +f 2090/3193/104 2098/3199/33 2089/3200/33 +f 2089/3200/33 2104/3201/105 2096/3194/105 +f 269/1852/45 281/1865/45 280/1853/36 +f 276/1855/46 288/1866/46 287/1856/47 +f 266/1858/48 277/1868/48 278/1859/33 +f 273/1861/49 285/1870/49 284/1862/50 +f 270/1864/51 282/1872/51 281/1865/45 +f 265/1860/33 278/1859/33 288/1866/46 +f 267/1867/52 279/1874/52 277/1868/48 +f 274/1869/34 286/1875/34 285/1870/49 +f 271/1871/35 283/1876/35 282/1872/51 +f 268/1873/36 280/3202/36 279/1874/52 +f 275/1857/47 287/1856/47 286/1875/34 +f 272/1863/50 284/1862/50 283/1876/35 +f 292/1877/36 293/1889/45 305/1878/45 +f 300/1880/46 312/1891/46 311/1881/47 +f 290/1883/48 301/1893/48 302/1884/33 +f 297/1886/49 309/1895/49 308/1887/50 +f 293/1889/45 294/1897/51 306/1890/51 +f 289/1885/33 302/1884/33 312/1891/46 +f 291/1892/52 303/1899/52 301/1893/48 +f 298/1894/34 310/1900/34 309/1895/49 +f 295/1896/35 307/1901/35 306/1890/51 +f 292/1898/36 304/3203/36 303/1899/52 +f 298/1894/34 299/1882/47 311/1881/47 +f 296/1888/50 308/1887/50 307/1901/35 +f 317/1902/45 329/1915/45 328/1903/36 +f 324/1905/46 336/1916/46 335/1906/47 +f 314/1908/48 325/1918/48 326/1909/33 +f 321/1911/49 333/1920/49 332/1912/50 +f 318/1914/51 330/1922/51 329/1915/45 +f 313/1910/33 326/1909/33 336/1916/46 +f 315/1917/52 327/1924/52 325/1918/48 +f 322/1919/34 334/1925/34 333/1920/49 +f 319/1921/35 331/1926/35 330/1922/51 +f 316/1923/36 328/3204/36 327/1924/52 +f 323/1907/47 335/1906/47 334/1925/34 +f 320/1913/50 332/1912/50 331/1926/35 +f 341/1927/45 353/1940/45 352/1928/36 +f 348/1930/46 360/1941/46 359/1931/47 +f 338/1933/48 349/1943/48 350/1934/33 +f 345/1936/49 357/1945/49 356/1937/50 +f 342/1939/51 354/1947/51 353/1940/45 +f 337/1935/33 350/1934/33 360/1941/46 +f 338/1933/48 339/1949/52 351/1942/52 +f 346/1944/34 358/1950/34 357/1945/49 +f 343/1946/35 355/1951/35 354/1947/51 +f 340/1948/36 352/3205/36 351/1942/52 +f 346/1944/34 347/1932/47 359/1931/47 +f 344/1938/50 356/1937/50 355/1951/35 +f 392/1952/53 400/1964/61 399/1953/54 +f 390/1955/55 398/1966/62 397/1956/56 +f 388/1958/57 396/1967/63 395/1959/58 +f 386/1961/59 394/1968/64 393/1962/60 +f 385/1963/33 393/1962/60 400/1964/61 +f 391/1965/34 399/3206/54 398/1966/62 +f 389/1957/35 397/1956/56 396/1967/63 +f 387/1960/36 395/1959/58 394/1968/64 +f 393/1969/60 394/1968/64 402/1970/65 +f 393/1969/60 401/1971/66 407/1972/67 +f 397/1974/56 405/1977/69 404/1975/68 +f 395/1959/58 403/1978/70 402/1970/65 +f 398/1976/62 406/1979/71 405/1977/69 +f 396/1967/63 404/1975/68 403/1978/70 +f 406/1979/71 413/1987/78 412/1980/72 +f 403/1978/70 404/1975/68 411/1981/73 +f 401/1971/66 402/1970/65 409/1983/75 +f 407/1972/67 401/1971/66 408/1984/76 +f 405/1977/69 412/1980/72 411/1981/73 +f 403/1978/70 410/1982/74 409/1983/75 +f 422/1989/57 430/2001/83 429/1990/79 +f 420/1992/59 428/2003/84 427/1993/80 +f 418/1995/53 426/2004/85 425/1996/81 +f 416/1998/55 424/2005/86 423/1999/82 +f 415/2000/35 423/1999/82 430/2001/83 +f 421/2002/36 429/3207/79 428/2003/84 +f 419/1994/33 427/1993/80 426/2004/85 +f 417/1997/34 425/1996/81 424/2005/86 +f 423/2006/82 424/2005/86 432/2007/87 +f 423/2006/82 431/2008/88 437/2009/89 +f 427/2011/80 435/2015/93 434/2012/90 +f 424/2005/86 425/1996/81 433/2013/91 +f 427/2011/80 428/2022/84 436/2014/92 +f 426/2004/85 434/2012/90 433/2013/91 +f 436/2014/92 443/2024/100 442/2016/94 +f 433/2013/91 434/2012/90 441/2017/95 +f 432/2007/87 439/2021/99 438/2019/97 +f 431/2008/88 438/2019/97 444/2020/98 +f 435/2015/93 442/2016/94 441/2017/95 +f 433/2013/91 440/2018/96 439/2021/99 +f 440/2018/96 441/2017/95 409/1983/75 +f 439/2021/99 440/2018/96 410/1982/74 +f 438/2026/97 439/2021/99 411/1981/73 +f 444/2028/98 438/2026/97 412/2027/72 +f 429/2030/79 444/2028/98 413/2029/78 +f 399/2032/54 414/2036/77 443/2033/100 +f 442/2035/94 443/2033/100 414/2036/77 +f 441/2017/95 442/2035/94 408/2037/76 +f 452/2038/53 460/2050/61 459/2039/54 +f 450/2041/55 458/2052/62 457/2042/56 +f 448/2044/57 456/2053/63 455/2045/58 +f 446/2047/59 454/2054/64 453/2048/60 +f 445/2049/33 453/2048/60 460/2050/61 +f 451/2051/34 459/3208/54 458/2052/62 +f 449/2043/35 457/2042/56 456/2053/63 +f 447/2046/36 455/2045/58 454/2054/64 +f 453/2055/60 454/2054/64 462/2056/65 +f 453/2055/60 461/2057/66 467/2058/67 +f 456/2053/63 457/2063/56 465/2060/69 +f 454/2054/64 455/2045/58 463/2062/70 +f 457/2063/56 458/2071/62 466/2064/71 +f 455/2045/58 456/2053/63 464/2061/68 +f 466/2064/71 473/2073/78 472/2065/72 +f 464/2061/68 471/2069/73 470/2066/74 +f 462/2056/65 469/2070/75 468/2067/76 +f 467/2058/67 461/2057/66 468/2067/76 +f 465/2060/69 472/2065/72 471/2069/73 +f 463/2062/70 470/2066/74 469/2070/75 +f 482/2075/57 490/2087/83 489/2076/79 +f 480/2078/59 488/2089/84 487/2079/80 +f 478/2081/53 486/2090/85 485/2082/81 +f 476/2084/55 484/2091/86 483/2085/82 +f 475/2086/35 483/2085/82 490/2087/83 +f 481/2088/36 489/3209/79 488/2089/84 +f 479/2080/33 487/2079/80 486/2090/85 +f 477/2083/34 485/2082/81 484/2091/86 +f 483/2092/82 484/2091/86 492/2093/87 +f 483/2092/82 491/2094/88 497/2095/89 +f 487/2097/80 495/2101/93 494/2098/101 +f 484/2091/86 485/2082/81 493/2099/91 +f 487/2097/80 488/2108/84 496/2100/92 +f 486/2090/85 494/2098/101 493/2099/91 +f 496/2100/92 503/2110/100 502/2102/94 +f 494/2098/101 501/2107/95 500/2103/96 +f 491/2094/88 492/2093/87 499/2104/99 +f 497/2095/89 491/2094/88 498/2105/97 +f 494/2098/101 495/2101/93 502/2102/94 +f 493/2099/91 500/2103/96 499/2104/99 +f 500/2103/96 501/2107/95 469/2070/75 +f 471/2069/73 499/2104/99 500/2103/96 +f 498/2112/97 499/2104/99 471/2069/73 +f 504/2114/98 498/2112/97 472/2113/72 +f 489/2116/79 504/2114/98 473/2115/78 +f 459/2118/54 474/2122/77 503/2119/100 +f 502/2121/94 503/2119/100 474/2122/77 +f 501/2107/95 502/2121/94 468/2123/76 +f 511/2124/31 519/3210/31 518/2125/102 +f 509/2127/35 517/2136/35 516/2128/103 +f 507/2130/32 515/2137/32 513/2131/104 +f 512/2133/105 520/2140/105 519/2134/31 +f 510/2126/102 518/2125/102 517/2136/35 +f 508/2129/103 516/2128/103 515/2137/32 +f 506/2132/104 513/2131/104 514/2138/33 +f 505/2139/33 514/2138/33 520/2140/105 +f 580/2141/32 604/2151/32 603/2142/41 +f 587/2144/39 611/2153/39 610/2145/31 +f 584/2147/40 608/2158/40 607/2148/35 +f 581/2150/38 605/2160/38 604/2151/32 +f 588/2152/43 612/2161/43 611/2153/39 +f 578/2154/37 602/2162/37 601/2155/33 +f 585/2157/44 609/2164/44 608/2158/40 +f 582/2159/42 606/2165/42 605/2160/38 +f 577/2156/33 601/2155/33 612/2161/43 +f 579/2143/41 603/2142/41 602/2162/37 +f 586/2163/31 610/2202/31 609/2164/44 +f 583/2149/35 607/2148/35 606/2165/42 +f 613/2166/33 614/2177/37 590/2167/37 +f 620/2169/40 621/2179/44 597/2170/44 +f 617/2172/38 618/2181/42 594/2173/42 +f 624/2175/43 613/2166/33 589/2168/33 +f 614/2177/37 615/2183/41 591/2178/41 +f 621/2179/44 622/2240/31 598/2180/31 +f 618/2181/42 619/2188/35 595/2182/35 +f 615/2183/41 616/2189/32 592/2184/32 +f 622/2185/31 623/2190/39 599/2186/39 +f 619/2188/35 620/2169/40 596/2171/40 +f 616/2189/32 617/2172/38 593/2174/38 +f 623/2190/39 624/2175/43 600/2176/43 +f 626/507/106 627/509/107 579/2143/107 +f 627/539/107 628/538/70 580/2141/70 +f 580/2141/70 628/537/70 629/536/108 +f 629/534/108 630/533/109 582/2159/109 +f 630/530/109 631/531/57 583/2149/57 +f 583/2149/57 631/529/57 632/528/110 +f 632/524/110 633/526/111 585/2157/111 +f 633/521/111 634/523/79 586/2163/79 +f 634/518/79 635/520/112 587/2144/112 +f 635/515/112 636/517/113 588/2152/113 +f 588/2152/113 636/513/113 625/514/59 +f 577/2156/59 625/512/59 626/511/106 +f 601/2155/53 602/2162/114 638/2191/114 +f 603/2142/115 639/3211/115 638/2193/114 +f 604/2151/91 640/3212/91 639/2194/115 +f 604/2151/91 605/2160/116 641/2195/116 +f 606/2165/117 642/3213/117 641/2197/116 +f 607/2148/55 643/3214/55 642/2198/117 +f 607/2148/55 608/2158/118 644/2199/118 +f 609/2164/119 645/3215/119 644/2201/118 +f 610/2202/54 646/3216/54 645/2203/119 +f 611/2153/120 647/3217/120 646/2204/54 +f 612/2161/121 648/3218/121 647/2205/120 +f 601/2155/53 637/3219/53 648/2206/121 +f 658/1665/31 670/559/31 671/558/39 +f 655/527/35 667/550/35 668/552/40 +f 652/535/32 664/544/32 665/546/38 +f 659/519/39 671/558/39 672/561/43 +f 649/510/33 661/563/33 662/542/37 +f 656/1666/40 668/552/40 669/554/44 +f 653/532/38 665/546/38 666/548/42 +f 660/516/43 672/561/43 661/563/33 +f 650/1664/37 662/542/37 663/541/41 +f 657/525/44 669/554/44 670/556/31 +f 654/1667/42 666/548/42 667/550/35 +f 651/508/41 663/541/41 664/544/32 +f 706/1681/31 718/617/31 719/616/39 +f 703/585/35 715/608/35 716/610/40 +f 700/593/32 712/602/32 713/604/38 +f 707/577/39 719/616/39 720/619/43 +f 697/568/33 709/621/33 710/600/37 +f 704/1682/40 716/610/40 717/612/44 +f 701/590/38 713/604/38 714/606/42 +f 708/574/43 720/619/43 709/621/33 +f 698/1680/37 710/600/37 711/599/41 +f 705/583/44 717/612/44 718/614/31 +f 702/1683/42 714/606/42 715/608/35 +f 699/566/41 711/599/41 712/602/32 +f 591/2178/115 723/1684/115 722/598/114 +f 592/2184/91 724/1685/91 723/601/115 +f 592/2184/91 593/2174/116 725/1686/116 +f 594/2173/117 726/605/117 725/1687/116 +f 595/2182/55 727/1688/55 726/607/117 +f 595/2182/55 596/2171/118 728/609/118 +f 597/2170/119 729/1690/119 728/611/118 +f 598/2180/54 730/1691/54 729/613/119 +f 599/2186/120 731/1692/120 730/615/54 +f 600/2176/121 732/1693/121 731/618/120 +f 600/2176/121 589/2168/53 721/1694/53 +f 589/2168/53 590/2167/114 722/622/114 +f 686/2207/37 687/2210/41 675/2208/41 +f 687/2210/41 688/2212/32 676/2211/32 +f 688/2212/32 689/2214/38 677/2213/38 +f 689/2214/38 690/2216/42 678/2215/42 +f 690/2216/42 691/2218/35 679/2217/35 +f 691/2218/35 692/2220/40 680/2219/40 +f 692/2220/40 693/2222/44 681/2221/44 +f 693/2222/44 694/3220/31 682/2223/31 +f 694/2224/31 695/2227/39 683/2225/39 +f 695/2227/39 696/2229/43 684/2228/43 +f 696/2229/43 685/2231/33 673/2230/33 +f 685/2231/33 686/2207/37 674/2209/37 +f 614/2177/106 734/3221/106 735/2232/107 +f 735/2233/107 736/3222/70 616/2189/70 +f 616/2189/70 736/3223/70 737/2234/108 +f 737/2235/108 738/3224/109 618/2181/109 +f 738/2236/109 739/3225/57 619/2188/57 +f 619/2188/57 739/3226/57 740/2237/110 +f 740/2238/110 741/3227/111 621/2179/111 +f 741/2239/111 742/3228/79 622/2240/79 +f 742/2241/79 743/3229/112 623/2190/112 +f 743/2242/112 744/3230/113 624/2175/113 +f 744/2243/113 733/3231/59 613/2166/59 +f 613/2166/59 733/3232/59 734/2244/106 +f 784/2245/59 792/2257/125 791/2246/105 +f 782/2248/53 790/2259/126 789/2249/122 +f 780/2251/55 788/2260/127 787/2252/123 +f 778/2254/57 786/2261/128 785/2255/124 +f 777/2256/36 785/2255/124 792/2257/125 +f 783/2258/33 791/3233/105 790/2259/126 +f 781/2250/34 789/2249/122 788/2260/127 +f 779/2253/35 787/2252/123 786/2261/128 +f 786/2261/128 794/2268/133 793/2262/129 +f 785/2263/124 793/2262/129 799/2264/130 +f 788/2260/127 789/2269/122 797/2266/131 +f 787/2252/123 795/2271/103 794/2268/133 +f 789/2269/122 790/2278/126 798/2270/134 +f 787/2252/123 788/2260/127 796/2267/132 +f 798/2270/134 805/2280/141 804/2272/135 +f 795/2271/103 796/2267/132 803/2273/136 +f 793/2262/129 794/2268/133 801/2275/138 +f 799/2264/130 793/2262/129 800/2276/139 +f 797/2266/131 804/2272/135 803/2273/136 +f 795/2271/103 802/2274/137 801/2275/138 +f 814/2282/142 822/2294/152 821/2283/102 +f 812/2285/144 820/2296/153 819/2286/145 +f 810/2288/147 818/2297/154 817/2289/148 +f 808/2291/150 816/2298/155 815/2292/151 +f 807/2293/91 815/2292/151 822/2294/152 +f 813/2295/143 821/3234/102 820/2296/153 +f 811/2287/146 819/2286/145 818/2297/154 +f 809/2290/149 817/2289/148 816/2298/155 +f 815/2299/151 816/2298/155 824/2300/156 +f 815/2299/151 823/2301/157 829/2302/158 +f 819/2304/145 827/2307/161 826/2305/159 +f 817/2289/148 825/2308/104 824/2300/156 +f 819/2304/145 820/2315/153 828/2306/160 +f 818/2297/154 826/2305/159 825/2308/104 +f 828/2306/160 835/2317/168 834/2309/162 +f 825/2308/104 826/2305/159 833/2310/163 +f 823/2301/157 824/2300/156 831/2312/165 +f 829/2302/158 823/2301/157 830/2313/166 +f 827/2307/161 834/2309/162 833/2310/163 +f 825/2308/104 832/2311/164 831/2312/165 +f 832/2311/164 833/2310/163 801/2275/138 +f 831/2312/165 832/2311/164 802/2274/137 +f 830/2319/166 831/2312/165 803/2273/136 +f 836/2321/167 830/2319/166 804/2320/135 +f 821/2323/102 836/2321/167 805/2322/141 +f 806/2325/140 835/3235/168 821/2326/102 +f 834/2328/162 835/3235/168 806/2325/140 +f 833/2310/163 834/2328/162 800/2329/139 +f 844/2330/59 852/2342/125 851/2331/105 +f 842/2333/53 850/2344/126 849/2334/122 +f 840/2336/55 848/2345/127 847/2337/123 +f 838/2339/57 846/2346/128 845/2340/124 +f 837/2341/36 845/2340/124 852/2342/125 +f 843/2343/33 851/3236/105 850/2344/126 +f 841/2335/34 849/2334/122 848/2345/127 +f 839/2338/35 847/2337/123 846/2346/128 +f 846/2346/128 854/2353/169 853/2347/129 +f 845/2348/124 853/2347/129 859/2349/130 +f 849/2351/122 857/2355/131 856/2352/132 +f 847/2337/123 855/2356/103 854/2353/169 +f 849/2351/122 850/2363/126 858/2354/134 +f 848/2345/127 856/2352/132 855/2356/103 +f 858/2354/134 865/2365/141 864/2357/135 +f 856/2352/132 863/2362/136 862/2358/137 +f 853/2347/129 854/2353/169 861/2359/138 +f 859/2349/130 853/2347/129 860/2360/139 +f 857/2355/131 864/2357/135 863/2362/136 +f 855/2356/103 862/2358/137 861/2359/138 +f 874/2367/142 882/2379/152 881/2368/102 +f 872/2370/144 880/2381/153 879/2371/145 +f 870/2373/147 878/2382/154 877/2374/148 +f 868/2376/150 876/2383/155 875/2377/151 +f 867/2378/91 875/2377/151 882/2379/152 +f 873/2380/143 881/3237/102 880/2381/153 +f 871/2372/146 879/2371/145 878/2382/154 +f 869/2375/149 877/2374/148 876/2383/155 +f 876/2383/155 884/2390/170 883/2384/157 +f 875/2385/151 883/2384/157 889/2386/158 +f 879/2388/145 887/2392/161 886/2389/159 +f 877/2374/148 885/2393/104 884/2390/170 +f 879/2388/145 880/2400/153 888/2391/160 +f 877/2374/148 878/2382/154 886/2389/159 +f 888/2391/160 895/2402/168 894/2394/162 +f 886/2389/159 893/2399/163 892/2395/164 +f 883/2384/157 884/2390/170 891/2396/165 +f 889/2386/158 883/2384/157 890/2397/166 +f 887/2392/161 894/2394/162 893/2399/163 +f 884/2390/170 885/2393/104 892/2395/164 +f 892/2395/164 893/2399/163 861/2359/138 +f 891/2396/165 892/2395/164 862/2358/137 +f 890/2404/166 891/2396/165 863/2362/136 +f 896/2406/167 890/2404/166 864/2405/135 +f 881/2408/102 896/2406/167 865/2407/141 +f 866/2410/140 895/3238/168 881/2411/102 +f 894/2413/162 895/3238/168 866/2410/140 +f 893/2399/163 894/2413/162 860/2414/139 +f 813/2415/143 902/2437/176 903/2416/171 +f 873/2418/143 909/2449/176 910/2419/171 +f 810/2288/147 899/2436/172 900/2421/79 +f 871/2372/146 870/2373/147 906/2422/172 +f 811/2287/146 900/2421/79 901/2424/173 +f 871/2372/146 907/2423/79 908/2425/173 +f 809/2426/149 808/2456/150 897/2427/174 +f 868/2429/150 904/2454/174 905/2430/175 +f 812/2285/144 901/2424/173 902/2432/176 +f 872/2370/144 908/2425/173 909/2434/176 +f 809/2426/149 898/2428/175 899/2436/172 +f 869/2431/149 905/2430/175 906/2422/172 +f 902/2437/176 916/3239/182 917/2438/177 +f 899/2436/172 913/2451/183 914/2439/178 +f 907/2423/79 921/2452/178 922/2440/179 +f 905/2430/175 904/2454/174 918/2441/180 +f 900/2421/79 914/2439/178 915/2443/179 +f 909/2434/176 908/2425/173 922/2440/179 +f 898/2428/175 897/2427/174 911/2445/180 +f 905/2430/175 919/2442/181 920/2447/183 +f 902/2432/176 901/2424/173 915/2443/179 +f 909/2449/176 923/3240/182 924/2450/177 +f 898/2428/175 912/2446/181 913/2451/183 +f 907/2423/79 906/2422/172 920/2447/183 +f 920/2447/183 936/2483/105 937/2457/31 +f 912/2458/181 928/2484/33 929/2459/105 +f 807/2460/91 925/2469/32 927/2461/104 +f 921/2452/178 937/2457/31 938/2463/102 +f 913/2451/183 929/2459/105 930/2464/31 +f 923/2465/182 922/2440/179 938/2463/102 +f 914/2439/178 930/2464/31 931/2467/102 +f 807/2460/91 917/2479/177 933/2468/103 +f 923/2470/182 939/3241/35 940/2471/103 +f 916/2473/182 915/2443/179 931/2467/102 +f 867/2475/91 926/2482/32 934/2476/104 +f 916/2478/182 932/3242/35 933/2468/103 +f 919/2480/181 918/2477/180 934/2476/104 +f 867/2475/91 924/2472/177 940/2471/103 +f 919/2480/181 935/2481/33 936/2483/105 +f 912/2458/181 911/2462/180 927/2461/104 +f 1138/2485/80 1139/2524/84 1156/2486/92 +f 1146/2488/80 1147/2528/84 1149/2489/92 +f 1136/2491/81 1159/2498/91 1160/2492/87 +f 1144/2494/81 1152/2500/91 1153/2495/87 +f 1137/2497/85 1158/2510/101 1159/2498/91 +f 1145/2499/85 1151/2509/101 1152/2500/91 +f 1134/2501/82 1161/2508/88 1162/2502/89 +f 1142/2504/82 1154/2507/88 1155/2505/89 +f 1142/2504/82 1143/2496/86 1153/2495/87 +f 1135/2493/86 1160/2492/87 1161/2508/88 +f 1145/2499/85 1146/2488/80 1150/2490/93 +f 1137/2497/85 1138/2485/80 1157/2487/93 +f 1155/2505/89 1154/2507/88 1168/2511/97 +f 1151/2509/101 1165/2521/95 1166/2513/96 +f 1159/2498/91 1173/2522/96 1174/2514/99 +f 1156/2486/92 1170/2525/100 1171/2515/94 +f 1152/2500/91 1166/2513/96 1167/2516/99 +f 1161/2508/88 1160/2492/87 1174/2514/99 +f 1149/2489/92 1163/2529/100 1164/2518/94 +f 1158/2510/101 1157/2487/93 1171/2515/94 +f 1154/2507/88 1153/2495/87 1167/2516/99 +f 1162/2502/89 1161/2508/88 1175/2517/97 +f 1151/2509/101 1150/2490/93 1164/2518/94 +f 1158/2510/101 1172/2519/95 1173/2522/96 +f 1172/2519/95 1188/2557/104 1189/2531/32 +f 1164/2532/94 1180/2558/33 1181/2533/104 +f 1148/2534/79 1177/3243/31 1179/2535/105 +f 1173/2522/96 1189/2531/32 1190/2537/103 +f 1165/2521/95 1181/2533/104 1182/2538/32 +f 1174/2514/99 1190/2537/103 1191/2539/35 +f 1166/2513/96 1182/2538/32 1183/2541/103 +f 1169/2542/98 1185/2552/102 1177/2543/31 +f 1175/2540/97 1191/2539/35 1192/2545/102 +f 1167/2516/99 1183/2541/103 1184/2547/35 +f 1140/2549/79 1178/3244/31 1186/2550/105 +f 1168/2548/97 1184/2547/35 1185/2552/102 +f 1170/2551/100 1186/2550/105 1187/2553/33 +f 1176/2546/98 1192/2545/102 1178/2555/31 +f 1171/2554/94 1187/2553/33 1188/2557/104 +f 1163/2536/100 1179/2535/105 1180/2558/33 +f 1145/2499/85 1205/2585/53 1206/2559/33 +f 1138/2561/80 1198/2586/33 1199/2562/59 +f 1146/2560/80 1206/2559/33 1207/2564/59 +f 1139/2563/84 1199/2562/59 1200/2566/36 +f 1140/2568/79 1200/3245/36 1193/2569/57 +f 1147/2565/84 1207/2564/59 1208/2571/36 +f 1148/2573/79 1208/3246/36 1201/2574/57 +f 1133/2570/83 1193/2569/57 1194/2576/35 +f 1141/2575/83 1201/2574/57 1202/2578/35 +f 1134/2577/82 1194/2576/35 1195/2580/55 +f 1142/2579/82 1202/2578/35 1203/2581/55 +f 1135/2493/86 1195/2580/55 1196/2582/34 +f 1143/2496/86 1203/2581/55 1204/2583/34 +f 1136/2491/81 1196/2582/34 1197/2584/53 +f 1144/2494/81 1204/2583/34 1205/2585/53 +f 1137/2497/85 1197/2584/53 1198/2586/33 +f 1219/2587/36 1220/2598/79 1212/2588/79 +f 1217/2590/32 1218/2600/70 1210/2591/70 +f 1224/2593/91 1217/2590/32 1209/2592/32 +f 1222/2595/54 1223/2601/34 1215/2596/34 +f 1220/2598/79 1221/3247/31 1213/2599/31 +f 1218/2600/70 1219/2587/36 1211/2589/36 +f 1223/2601/34 1224/2593/91 1216/2594/91 +f 1221/2602/31 1222/2595/54 1214/2597/54 +f 1235/2604/36 1236/2615/79 1228/2605/79 +f 1233/2607/32 1234/2617/70 1226/2608/70 +f 1240/2610/91 1233/2607/32 1225/2609/32 +f 1238/2612/54 1239/2618/34 1231/2613/34 +f 1236/2615/79 1237/3248/31 1229/2616/31 +f 1234/2617/70 1235/2604/36 1227/2606/36 +f 1239/2618/34 1240/2610/91 1232/2611/91 +f 1237/2619/31 1238/2612/54 1230/2614/54 +f 1251/2621/36 1252/2632/79 1244/2622/79 +f 1249/2624/32 1250/2634/70 1242/2625/70 +f 1256/2627/91 1249/2624/32 1241/2626/32 +f 1254/2629/54 1255/2635/34 1247/2630/34 +f 1252/2632/79 1253/3249/31 1245/2633/31 +f 1250/2634/70 1251/2621/36 1243/2623/36 +f 1255/2635/34 1256/2627/91 1248/2628/91 +f 1253/2636/31 1254/2629/54 1246/2631/54 +f 1267/2638/36 1268/2649/79 1260/2639/79 +f 1265/2641/32 1266/2651/70 1258/2642/70 +f 1272/2644/91 1265/2641/32 1257/2643/32 +f 1270/2646/54 1271/2652/34 1263/2647/34 +f 1268/2649/79 1269/3250/31 1261/2650/31 +f 1266/2651/70 1267/2638/36 1259/2640/36 +f 1271/2652/34 1272/2644/91 1264/2645/91 +f 1269/2653/31 1270/2646/54 1262/2648/54 +f 1712/2655/53 1720/2667/61 1719/2656/54 +f 1710/2658/55 1718/2669/62 1717/2659/56 +f 1708/2661/57 1716/2670/63 1715/2662/58 +f 1706/2664/59 1714/2671/64 1713/2665/60 +f 1705/2666/33 1713/2665/60 1720/2667/61 +f 1711/2668/34 1719/3251/54 1718/2669/62 +f 1709/2660/35 1717/2659/56 1716/2670/63 +f 1707/2663/36 1715/2662/58 1714/2671/64 +f 1713/2672/60 1714/2671/64 1722/2673/65 +f 1713/2672/60 1721/2674/66 1727/2675/67 +f 1716/2670/63 1717/2680/56 1725/2677/69 +f 1715/2662/58 1723/2681/70 1722/2673/65 +f 1718/2679/62 1726/2682/71 1725/2677/69 +f 1715/2662/58 1716/2670/63 1724/2678/68 +f 1726/2682/71 1733/2690/78 1732/2683/72 +f 1723/2681/70 1724/2678/68 1731/2684/73 +f 1721/2674/66 1722/2673/65 1729/2686/75 +f 1727/2675/67 1721/2674/66 1728/2687/76 +f 1725/2677/69 1732/2683/72 1731/2684/73 +f 1723/2681/70 1730/2685/74 1729/2686/75 +f 1742/2692/57 1750/2704/83 1749/2693/79 +f 1740/2695/59 1748/2706/84 1747/2696/80 +f 1738/2698/53 1746/2707/85 1745/2699/81 +f 1736/2701/55 1744/2708/86 1743/2702/82 +f 1735/2703/35 1743/2702/82 1750/2704/83 +f 1741/2705/36 1749/3252/79 1748/2706/84 +f 1739/2697/33 1747/2696/80 1746/2707/85 +f 1737/2700/34 1745/2699/81 1744/2708/86 +f 1743/2709/82 1744/2708/86 1752/2710/87 +f 1743/2709/82 1751/2711/88 1757/2712/89 +f 1746/2707/85 1747/2717/80 1755/2714/93 +f 1745/2699/81 1753/2718/91 1752/2710/87 +f 1748/2716/84 1756/2719/92 1755/2714/93 +f 1745/2699/81 1746/2707/85 1754/2715/101 +f 1756/2719/92 1763/2727/100 1762/2720/94 +f 1754/2715/101 1761/2725/95 1760/2721/96 +f 1751/2711/88 1752/2710/87 1759/2722/99 +f 1757/2712/89 1751/2711/88 1758/2723/97 +f 1755/2714/93 1762/2720/94 1761/2725/95 +f 1753/2718/91 1760/2721/96 1759/2722/99 +f 1760/2721/96 1761/2725/95 1729/2686/75 +f 1759/2722/99 1760/2721/96 1730/2685/74 +f 1758/2729/97 1759/2722/99 1731/2684/73 +f 1764/2731/98 1758/2729/97 1732/2730/72 +f 1749/2733/79 1764/2731/98 1733/2732/78 +f 1719/2735/54 1734/2739/77 1763/2736/100 +f 1762/2738/94 1763/2736/100 1734/2739/77 +f 1761/2725/95 1762/2738/94 1728/2740/76 +f 1772/2741/53 1780/2753/61 1779/2742/54 +f 1770/2744/55 1778/2755/62 1777/2745/56 +f 1768/2747/57 1776/2756/63 1775/2748/58 +f 1766/2750/59 1774/2757/64 1773/2751/60 +f 1765/2752/33 1773/2751/60 1780/2753/61 +f 1771/2754/34 1779/3253/54 1778/2755/62 +f 1769/2746/35 1777/2745/56 1776/2756/63 +f 1767/2749/36 1775/2748/58 1774/2757/64 +f 1773/2758/60 1774/2757/64 1782/2759/65 +f 1773/2758/60 1781/2760/66 1787/2761/67 +f 1776/2756/63 1777/2766/56 1785/2763/69 +f 1775/2748/58 1783/2767/70 1782/2759/65 +f 1778/2765/62 1786/2768/71 1785/2763/69 +f 1775/2748/58 1776/2756/63 1784/2764/68 +f 1786/2768/71 1793/2776/78 1792/2769/72 +f 1783/2767/70 1784/2764/68 1791/2770/73 +f 1781/2760/66 1782/2759/65 1789/2772/75 +f 1787/2761/67 1781/2760/66 1788/2773/76 +f 1785/2763/69 1792/2769/72 1791/2770/73 +f 1783/2767/70 1790/2771/74 1789/2772/75 +f 1802/2778/57 1810/2790/83 1809/2779/79 +f 1800/2781/59 1808/2792/84 1807/2782/80 +f 1798/2784/53 1806/2793/85 1805/2785/81 +f 1796/2787/55 1804/2794/86 1803/2788/82 +f 1795/2789/35 1803/2788/82 1810/2790/83 +f 1801/2791/36 1809/3254/79 1808/2792/84 +f 1799/2783/33 1807/2782/80 1806/2793/85 +f 1797/2786/34 1805/2785/81 1804/2794/86 +f 1803/2795/82 1804/2794/86 1812/2796/87 +f 1803/2795/82 1811/2797/88 1817/2798/89 +f 1806/2793/85 1807/2803/80 1815/2800/93 +f 1804/2794/86 1805/2785/81 1813/2802/91 +f 1807/2803/80 1808/2811/84 1816/2804/92 +f 1806/2793/85 1814/2801/101 1813/2802/91 +f 1816/2804/92 1823/2813/100 1822/2805/94 +f 1813/2802/91 1814/2801/101 1821/2806/95 +f 1811/2797/88 1812/2796/87 1819/2808/99 +f 1817/2798/89 1811/2797/88 1818/2809/97 +f 1815/2800/93 1822/2805/94 1821/2806/95 +f 1813/2802/91 1820/2807/96 1819/2808/99 +f 1820/2807/96 1821/2806/95 1789/2772/75 +f 1791/2770/73 1819/2808/99 1820/2807/96 +f 1818/2815/97 1819/2808/99 1791/2770/73 +f 1824/2817/98 1818/2815/97 1792/2816/72 +f 1809/2819/79 1824/2817/98 1793/2818/78 +f 1794/2821/77 1823/3255/100 1809/2822/79 +f 1822/2824/94 1823/3255/100 1794/2821/77 +f 1821/2806/95 1822/2824/94 1788/2825/76 +f 1832/2826/53 1840/2838/61 1839/2827/54 +f 1830/2829/55 1838/2840/62 1837/2830/56 +f 1828/2832/57 1836/2841/63 1835/2833/58 +f 1826/2835/59 1834/2842/64 1833/2836/60 +f 1825/2837/33 1833/2836/60 1840/2838/61 +f 1831/2839/34 1839/3256/54 1838/2840/62 +f 1829/2831/35 1837/2830/56 1836/2841/63 +f 1827/2834/36 1835/2833/58 1834/2842/64 +f 1833/2843/60 1834/2842/64 1842/2844/65 +f 1833/2843/60 1841/2845/66 1847/2846/67 +f 1836/2841/63 1837/2850/56 1845/2848/69 +f 1835/2833/58 1843/2852/70 1842/2844/65 +f 1837/2850/56 1838/2859/62 1846/2851/71 +f 1836/2841/63 1844/2849/68 1843/2852/70 +f 1846/2851/71 1853/2861/78 1852/2853/72 +f 1843/2852/70 1844/2849/68 1851/2854/73 +f 1841/2845/66 1842/2844/65 1849/2856/75 +f 1847/2846/67 1841/2845/66 1848/2857/76 +f 1845/2848/69 1852/2853/72 1851/2854/73 +f 1843/2852/70 1850/2855/74 1849/2856/75 +f 1862/2863/57 1870/2875/83 1869/2864/79 +f 1860/2866/59 1868/2877/84 1867/2867/80 +f 1858/2869/53 1866/2878/85 1865/2870/81 +f 1856/2872/55 1864/2879/86 1863/2873/82 +f 1855/2874/35 1863/2873/82 1870/2875/83 +f 1861/2876/36 1869/3257/79 1868/2877/84 +f 1859/2868/33 1867/2867/80 1866/2878/85 +f 1857/2871/34 1865/2870/81 1864/2879/86 +f 1863/2880/82 1864/2879/86 1872/2881/87 +f 1863/2880/82 1871/2882/88 1877/2883/89 +f 1867/2885/80 1875/2888/93 1874/2886/184 +f 1865/2870/81 1873/2889/91 1872/2881/87 +f 1868/2887/84 1876/2890/92 1875/2888/93 +f 1865/2870/81 1866/2878/85 1874/2886/184 +f 1876/2890/92 1883/2898/100 1882/2891/94 +f 1873/2889/91 1874/2886/184 1881/2892/95 +f 1872/2881/87 1879/2896/99 1878/2894/97 +f 1877/2883/89 1871/2882/88 1878/2894/97 +f 1875/2888/93 1882/2891/94 1881/2892/95 +f 1873/2889/91 1880/2893/96 1879/2896/99 +f 1880/2893/96 1881/2892/95 1849/2856/75 +f 1879/2896/99 1880/2893/96 1850/2855/74 +f 1878/2900/97 1879/2896/99 1851/2854/73 +f 1884/2902/98 1878/2900/97 1852/2901/72 +f 1869/2904/79 1884/2902/98 1853/2903/78 +f 1839/2906/54 1854/2910/77 1883/2907/100 +f 1882/2909/94 1883/2907/100 1854/2910/77 +f 1881/2892/95 1882/2909/94 1848/2911/76 +f 1892/2912/53 1900/2924/61 1899/2913/54 +f 1890/2915/55 1898/2926/62 1897/2916/56 +f 1888/2918/57 1896/2927/63 1895/2919/58 +f 1886/2921/59 1894/2928/64 1893/2922/60 +f 1885/2923/33 1893/2922/60 1900/2924/61 +f 1891/2925/34 1899/3258/54 1898/2926/62 +f 1889/2917/35 1897/2916/56 1896/2927/63 +f 1887/2920/36 1895/2919/58 1894/2928/64 +f 1894/2928/64 1902/2935/65 1901/2929/66 +f 1893/2930/60 1901/2929/66 1907/2931/67 +f 1897/2933/56 1905/2937/69 1904/2934/68 +f 1895/2919/58 1903/2938/70 1902/2935/65 +f 1897/2933/56 1898/2945/62 1906/2936/71 +f 1895/2919/58 1896/2927/63 1904/2934/68 +f 1906/2936/71 1913/2947/78 1912/2939/72 +f 1903/2938/70 1904/2934/68 1911/2940/73 +f 1901/2929/66 1902/2935/65 1909/2942/75 +f 1907/2931/67 1901/2929/66 1908/2943/76 +f 1905/2937/69 1912/2939/72 1911/2940/73 +f 1903/2938/70 1910/2941/74 1909/2942/75 +f 1922/2949/57 1930/2961/83 1929/2950/79 +f 1920/2952/59 1928/2963/84 1927/2953/80 +f 1918/2955/53 1926/2964/85 1925/2956/81 +f 1916/2958/55 1924/2965/86 1923/2959/82 +f 1915/2960/35 1923/2959/82 1930/2961/83 +f 1921/2962/36 1929/3259/79 1928/2963/84 +f 1919/2954/33 1927/2953/80 1926/2964/85 +f 1917/2957/34 1925/2956/81 1924/2965/86 +f 1923/2966/82 1924/2965/86 1932/2967/87 +f 1930/2969/83 1923/2966/82 1931/2968/88 +f 1927/2971/80 1935/2974/93 1934/2972/101 +f 1925/2956/81 1933/2975/91 1932/2967/87 +f 1927/2971/80 1928/2982/84 1936/2973/92 +f 1926/2964/85 1934/2972/101 1933/2975/91 +f 1936/2973/92 1943/2984/100 1942/2976/94 +f 1934/2972/101 1941/2981/95 1940/2977/96 +f 1931/2968/88 1932/2967/87 1939/2978/99 +f 1937/2970/89 1931/2968/88 1938/2979/97 +f 1935/2974/93 1942/2976/94 1941/2981/95 +f 1932/2967/87 1933/2975/91 1940/2977/96 +f 1940/2977/96 1941/2981/95 1909/2942/75 +f 1939/2978/99 1940/2977/96 1910/2941/74 +f 1938/2986/97 1939/2978/99 1911/2940/73 +f 1944/2988/98 1938/2986/97 1912/2987/72 +f 1929/2990/79 1944/2988/98 1913/2989/78 +f 1914/2992/77 1943/3260/100 1929/2993/79 +f 1942/2995/94 1943/3260/100 1914/2992/77 +f 1941/2981/95 1942/2995/94 1908/2996/76 +f 1960/2997/53 1968/3009/61 1967/2998/54 +f 1958/3000/55 1966/3011/62 1965/3001/56 +f 1956/3003/57 1964/3012/63 1963/3004/58 +f 1954/3006/59 1962/3013/64 1961/3007/60 +f 1953/3008/33 1961/3007/60 1968/3009/61 +f 1959/3010/34 1967/3261/54 1966/3011/62 +f 1957/3002/35 1965/3001/56 1964/3012/63 +f 1955/3005/36 1963/3004/58 1962/3013/64 +f 1961/3014/60 1962/3013/64 1970/3015/65 +f 1961/3014/60 1969/3016/66 1975/3017/67 +f 1964/3012/63 1965/3021/56 1973/3019/69 +f 1963/3004/58 1971/3023/70 1970/3015/65 +f 1965/3021/56 1966/3030/62 1974/3022/71 +f 1964/3012/63 1972/3020/68 1971/3023/70 +f 1974/3022/71 1981/3032/78 1980/3024/72 +f 1971/3023/70 1972/3020/68 1979/3025/73 +f 1969/3016/66 1970/3015/65 1977/3027/75 +f 1975/3017/67 1969/3016/66 1976/3028/76 +f 1973/3019/69 1980/3024/72 1979/3025/73 +f 1971/3023/70 1978/3026/74 1977/3027/75 +f 1990/3034/57 1998/3046/83 1997/3035/79 +f 1988/3037/59 1996/3048/84 1995/3038/80 +f 1986/3040/53 1994/3049/85 1993/3041/81 +f 1984/3043/55 1992/3050/86 1991/3044/82 +f 1983/3045/35 1991/3044/82 1998/3046/83 +f 1989/3047/36 1997/3262/79 1996/3048/84 +f 1987/3039/33 1995/3038/80 1994/3049/85 +f 1985/3042/34 1993/3041/81 1992/3050/86 +f 1991/3051/82 1992/3050/86 2000/3052/87 +f 1991/3051/82 1999/3053/88 2005/3054/89 +f 1995/3056/80 2003/3060/93 2002/3057/90 +f 1992/3050/86 1993/3041/81 2001/3058/91 +f 1995/3056/80 1996/3067/84 2004/3059/92 +f 1994/3049/85 2002/3057/90 2001/3058/91 +f 2004/3059/92 2011/3069/100 2010/3061/94 +f 2001/3058/91 2002/3057/90 2009/3062/95 +f 1999/3053/88 2000/3052/87 2007/3064/99 +f 2005/3054/89 1999/3053/88 2006/3065/97 +f 2003/3060/93 2010/3061/94 2009/3062/95 +f 2001/3058/91 2008/3063/96 2007/3064/99 +f 2008/3063/96 2009/3062/95 1977/3027/75 +f 2007/3064/99 2008/3063/96 1978/3026/74 +f 2006/3071/97 2007/3064/99 1979/3025/73 +f 2012/3073/98 2006/3071/97 1980/3072/72 +f 1997/3075/79 2012/3073/98 1981/3074/78 +f 1967/3077/54 1982/3081/77 2011/3078/100 +f 2010/3080/94 2011/3078/100 1982/3081/77 +f 2009/3062/95 2010/3080/94 1976/3082/76 +f 2020/3083/53 2028/3095/61 2027/3084/54 +f 2018/3086/55 2026/3097/62 2025/3087/56 +f 2016/3089/57 2024/3098/63 2023/3090/58 +f 2014/3092/59 2022/3099/64 2021/3093/60 +f 2013/3094/33 2021/3093/60 2028/3095/61 +f 2019/3096/34 2027/3263/54 2026/3097/62 +f 2017/3088/35 2025/3087/56 2024/3098/63 +f 2015/3091/36 2023/3090/58 2022/3099/64 +f 2022/3099/64 2030/3106/65 2029/3100/66 +f 2028/3102/61 2021/3101/60 2029/3100/66 +f 2024/3098/63 2025/3107/56 2033/3104/69 +f 2023/3090/58 2031/3109/70 2030/3106/65 +f 2025/3107/56 2026/3116/62 2034/3108/71 +f 2024/3098/63 2032/3105/68 2031/3109/70 +f 2034/3108/71 2041/3118/78 2040/3110/72 +f 2032/3105/68 2039/3115/73 2038/3111/74 +f 2029/3100/66 2030/3106/65 2037/3112/75 +f 2035/3103/67 2029/3100/66 2036/3113/76 +f 2033/3104/69 2040/3110/72 2039/3115/73 +f 2031/3109/70 2038/3111/74 2037/3112/75 +f 2050/3120/57 2058/3132/83 2057/3121/79 +f 2048/3123/59 2056/3134/84 2055/3124/80 +f 2046/3126/53 2054/3135/85 2053/3127/81 +f 2044/3129/55 2052/3136/86 2051/3130/82 +f 2043/3131/35 2051/3130/82 2058/3132/83 +f 2049/3133/36 2057/3264/79 2056/3134/84 +f 2047/3125/33 2055/3124/80 2054/3135/85 +f 2045/3128/34 2053/3127/81 2052/3136/86 +f 2051/3137/82 2052/3136/86 2060/3138/87 +f 2051/3137/82 2059/3139/88 2065/3140/89 +f 2054/3135/85 2055/3145/80 2063/3142/93 +f 2052/3136/86 2053/3127/81 2061/3144/91 +f 2055/3145/80 2056/3153/84 2064/3146/92 +f 2053/3127/81 2054/3135/85 2062/3143/101 +f 2064/3146/92 2071/3155/100 2070/3147/94 +f 2062/3143/101 2069/3152/95 2068/3148/96 +f 2059/3139/88 2060/3138/87 2067/3149/99 +f 2059/3139/88 2066/3150/97 2072/3151/98 +f 2063/3142/93 2070/3147/94 2069/3152/95 +f 2061/3144/91 2068/3148/96 2067/3149/99 +f 2068/3148/96 2069/3152/95 2037/3112/75 +f 2067/3149/99 2068/3148/96 2038/3111/74 +f 2066/3157/97 2067/3149/99 2039/3115/73 +f 2072/3159/98 2066/3157/97 2040/3158/72 +f 2057/3161/79 2072/3159/98 2041/3160/78 +f 2042/3163/77 2071/3265/100 2057/3164/79 +f 2070/3166/94 2071/3265/100 2042/3163/77 +f 2069/3152/95 2070/3166/94 2036/3167/76 +f 2079/3168/31 2087/3266/31 2086/3169/102 +f 2077/3171/35 2085/3180/35 2084/3172/103 +f 2075/3174/32 2083/3181/32 2081/3175/104 +f 2080/3177/105 2088/3184/105 2087/3178/31 +f 2078/3170/102 2086/3169/102 2085/3180/35 +f 2076/3173/103 2084/3172/103 2083/3181/32 +f 2074/3176/104 2081/3175/104 2082/3182/33 +f 2073/3183/33 2082/3182/33 2088/3184/105 +f 2095/3185/31 2103/3267/31 2102/3186/102 +f 2093/3188/35 2101/3197/35 2100/3189/103 +f 2091/3191/32 2099/3198/32 2097/3192/104 +f 2096/3194/105 2104/3201/105 2103/3195/31 +f 2094/3187/102 2102/3186/102 2101/3197/35 +f 2092/3190/103 2100/3189/103 2099/3198/32 +f 2090/3193/104 2097/3192/104 2098/3199/33 +f 2089/3200/33 2098/3199/33 2104/3201/105 diff --git a/src/main/resources/assets/hbm/models/rbmk/autoloader.obj b/src/main/resources/assets/hbm/models/rbmk/autoloader.obj new file mode 100644 index 000000000..4b1dea3a7 --- /dev/null +++ b/src/main/resources/assets/hbm/models/rbmk/autoloader.obj @@ -0,0 +1,1029 @@ +# Blender v2.79 (sub 0) OBJ File: 'autoloader.blend' +# www.blender.org +o Piston +v 0.062500 0.000000 0.312500 +v 0.062500 0.000000 0.187500 +v 0.187500 0.000000 0.062500 +v 0.187500 0.000000 0.437500 +v 0.312500 0.000000 0.437500 +v 0.312500 0.000000 0.062500 +v 0.437500 0.000000 0.187500 +v 0.437500 0.000000 0.312500 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v 0.062500 0.500000 0.312500 +v 0.062500 0.500000 0.187500 +v 0.187500 0.500000 0.062500 +v 0.187500 0.500000 0.437500 +v 0.312500 0.500000 0.437500 +v 0.312500 0.500000 0.062500 +v 0.437500 0.500000 0.187500 +v 0.437500 0.500000 0.312500 +v 0.062500 0.000000 -0.187500 +v 0.062500 0.000000 -0.312500 +v 0.187500 0.000000 -0.437500 +v 0.187500 0.000000 -0.062500 +v 0.312500 0.000000 -0.062500 +v 0.312500 0.000000 -0.437500 +v 0.437500 0.000000 -0.312500 +v 0.437500 0.000000 -0.187500 +v 0.062500 0.500000 -0.187500 +v 0.062500 0.500000 -0.312500 +v 0.187500 0.500000 -0.437500 +v 0.187500 0.500000 -0.062500 +v 0.312500 0.500000 -0.062500 +v 0.312500 0.500000 -0.437500 +v 0.437500 0.500000 -0.312500 +v 0.437500 0.500000 -0.187500 +v -0.437500 0.000000 0.312500 +v -0.437500 0.000000 0.187500 +v -0.312500 0.000000 0.062500 +v -0.312500 0.000000 0.437500 +v -0.187500 0.000000 0.437500 +v -0.187500 0.000000 0.062500 +v -0.062500 0.000000 0.187500 +v -0.062500 0.000000 0.312500 +v -0.437500 0.500000 0.312500 +v -0.437500 0.500000 0.187500 +v -0.312500 0.500000 0.062500 +v -0.312500 0.500000 0.437500 +v -0.187500 0.500000 0.437500 +v -0.187500 0.500000 0.062500 +v -0.062500 0.500000 0.187500 +v -0.062500 0.500000 0.312500 +v -0.437500 0.000000 -0.187500 +v -0.437500 0.000000 -0.312500 +v -0.312500 0.000000 -0.437500 +v -0.312500 0.000000 -0.062500 +v -0.187500 0.000000 -0.062500 +v -0.187500 0.000000 -0.437500 +v -0.062500 0.000000 -0.312500 +v -0.062500 0.000000 -0.187500 +v -0.437500 0.500000 -0.187500 +v -0.437500 0.500000 -0.312500 +v -0.312500 0.500000 -0.437500 +v -0.312500 0.500000 -0.062500 +v -0.187500 0.500000 -0.062500 +v -0.187500 0.500000 -0.437500 +v -0.062500 0.500000 -0.312500 +v -0.062500 0.500000 -0.187500 +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.375000 0.750000 -0.375000 +v -0.375000 0.750000 -0.375000 +v 0.375000 0.750000 0.375000 +v -0.375000 0.750000 0.375000 +v 0.375000 4.500000 -0.375000 +v -0.375000 4.500000 -0.375000 +v 0.375000 4.500000 0.375000 +v -0.375000 4.500000 0.375000 +v 0.437500 4.500000 0.187500 +v 0.437500 4.500000 0.312500 +v 0.437500 0.500000 0.187500 +v 0.437500 0.500000 0.312500 +v 0.375000 4.500000 -0.312500 +v 0.375000 4.500000 -0.187500 +v 0.375000 0.500000 -0.312500 +v 0.375000 0.500000 -0.187500 +v 0.437500 4.500000 -0.312500 +v 0.437500 4.500000 -0.187500 +v 0.437500 0.500000 -0.312500 +v 0.437500 0.500000 -0.187500 +v 0.375000 0.500000 0.312500 +v 0.375000 0.500000 0.187500 +v 0.375000 4.500000 0.312500 +v 0.375000 4.500000 0.187500 +v -0.437500 4.500000 -0.187500 +v -0.437500 4.500000 -0.312500 +v -0.437500 0.500000 -0.187500 +v -0.437500 0.500000 -0.312500 +v -0.375000 4.500000 0.312500 +v -0.375000 4.500000 0.187500 +v -0.375000 0.500000 0.312500 +v -0.375000 0.500000 0.187500 +v -0.437500 4.500000 0.312500 +v -0.437500 4.500000 0.187500 +v -0.437500 0.500000 0.312500 +v -0.437500 0.500000 0.187500 +v -0.375000 0.500000 -0.312500 +v -0.375000 0.500000 -0.187500 +v -0.375000 4.500000 -0.312500 +v -0.375000 4.500000 -0.187500 +v 0.187500 4.500000 -0.437500 +v 0.312500 4.500000 -0.437500 +v 0.187500 0.500000 -0.437500 +v 0.312500 0.500000 -0.437500 +v -0.312500 4.500000 -0.375000 +v -0.187500 4.500000 -0.375000 +v -0.312500 0.500000 -0.375000 +v -0.187500 0.500000 -0.375000 +v -0.312500 4.500000 -0.437500 +v -0.187500 4.500000 -0.437500 +v -0.312500 0.500000 -0.437500 +v -0.187500 0.500000 -0.437500 +v 0.312500 0.500000 -0.375000 +v 0.187500 0.500000 -0.375000 +v 0.312500 4.500000 -0.375000 +v 0.187500 4.500000 -0.375000 +v -0.187500 4.500000 0.437500 +v -0.312500 4.500000 0.437500 +v -0.187500 0.500000 0.437500 +v -0.312500 0.500000 0.437500 +v 0.312500 4.500000 0.375000 +v 0.187500 4.500000 0.375000 +v 0.312500 0.500000 0.375000 +v 0.187500 0.500000 0.375000 +v 0.312500 4.500000 0.437500 +v 0.187500 4.500000 0.437500 +v 0.312500 0.500000 0.437500 +v 0.187500 0.500000 0.437500 +v -0.312500 0.500000 0.375000 +v -0.187500 0.500000 0.375000 +v -0.312500 4.500000 0.375000 +v -0.187500 4.500000 0.375000 +vt 0.736842 0.150943 +vt 0.631579 0.226415 +vt 0.631579 0.150943 +vt 0.611842 0.009434 +vt 0.631579 0.000000 +vt 0.625000 0.028302 +vt 0.559211 0.141509 +vt 0.598684 0.141509 +vt 0.546053 0.141509 +vt 0.526316 0.150943 +vt 0.532895 0.122642 +vt 0.710526 0.000000 +vt 0.697368 0.075472 +vt 0.697368 0.000000 +vt 0.684211 0.075472 +vt 0.684211 0.000000 +vt 0.671053 0.075472 +vt 0.657895 0.000000 +vt 0.671053 0.000000 +vt 0.736842 0.000000 +vt 0.723684 0.075472 +vt 0.723684 0.000000 +vt 0.644737 0.000000 +vt 0.631579 0.075472 +vt 0.631579 0.000000 +vt 0.710526 0.075472 +vt 0.657895 0.075472 +vt 0.657895 0.132075 +vt 0.631579 0.113208 +vt 0.644737 0.075472 +vt 0.710526 0.000000 +vt 0.697368 0.075472 +vt 0.697368 0.000000 +vt 0.684211 0.075472 +vt 0.684211 0.000000 +vt 0.671053 0.075472 +vt 0.657895 0.000000 +vt 0.671053 0.000000 +vt 0.736842 0.000000 +vt 0.723684 0.075472 +vt 0.723684 0.000000 +vt 0.644737 0.000000 +vt 0.631579 0.075472 +vt 0.631579 0.000000 +vt 0.710526 0.075472 +vt 0.657895 0.075472 +vt 0.657895 0.132075 +vt 0.631579 0.113208 +vt 0.644737 0.075472 +vt 0.710526 0.000000 +vt 0.697368 0.075472 +vt 0.697368 0.000000 +vt 0.684211 0.075472 +vt 0.684211 0.000000 +vt 0.671053 0.075472 +vt 0.657895 0.000000 +vt 0.671053 0.000000 +vt 0.736842 0.000000 +vt 0.723684 0.075472 +vt 0.723684 0.000000 +vt 0.644737 0.000000 +vt 0.631579 0.075472 +vt 0.631579 0.000000 +vt 0.710526 0.075472 +vt 0.657895 0.075472 +vt 0.657895 0.132075 +vt 0.631579 0.113208 +vt 0.644737 0.075472 +vt 0.710526 0.000000 +vt 0.697368 0.075472 +vt 0.697368 0.000000 +vt 0.684211 0.075472 +vt 0.684211 0.000000 +vt 0.671053 0.075472 +vt 0.657895 0.000000 +vt 0.671053 0.000000 +vt 0.736842 0.000000 +vt 0.723684 0.075472 +vt 0.723684 0.000000 +vt 0.644737 0.000000 +vt 0.631579 0.075472 +vt 0.631579 0.000000 +vt 0.710526 0.075472 +vt 0.657895 0.075472 +vt 0.657895 0.132075 +vt 0.631579 0.113208 +vt 0.644737 0.075472 +vt 0.546053 0.084906 +vt 0.559211 0.066038 +vt 0.559211 0.084906 +vt 0.572368 0.103774 +vt 0.585526 0.122642 +vt 0.572368 0.122642 +vt 0.598684 0.084906 +vt 0.611842 0.066038 +vt 0.611842 0.084906 +vt 0.572368 0.028302 +vt 0.585526 0.047170 +vt 0.572368 0.047170 +vt 0.598684 0.066038 +vt 0.585526 0.103774 +vt 0.559211 0.009434 +vt 0.585526 0.028302 +vt 0.532895 0.103774 +vt 0.546053 0.066038 +vt 0.625000 0.047170 +vt 0.625000 0.103774 +vt 0.532895 0.028302 +vt 0.526316 0.000000 +vt 0.546053 0.009434 +vt 0.625000 0.122642 +vt 0.611842 0.141509 +vt 0.532895 0.047170 +vt 0.598684 0.009434 +vt 0.842105 0.150943 +vt 0.736842 0.226415 +vt 0.526316 0.226415 +vt 0.421053 0.226415 +vt 0.421053 0.150943 +vt 0.539474 0.264151 +vt 0.434211 0.264151 +vt 0.842105 0.226415 +vt 0.750000 0.264151 +vt 0.644737 0.264151 +vt 0.723684 0.264151 +vt 0.644737 0.830189 +vt 0.513158 0.264151 +vt 0.434211 0.830189 +vt 0.828947 0.264151 +vt 0.750000 0.830189 +vt 0.618421 0.264151 +vt 0.539474 0.830189 +vt 0.993421 0.603774 +vt 0.980263 0.000000 +vt 0.993421 0.000000 +vt 0.993421 0.000000 +vt 1.000000 0.603774 +vt 0.993421 0.603774 +vt 0.980263 0.603774 +vt 0.973684 0.000000 +vt 0.980263 0.000000 +vt 0.980263 0.603774 +vt 0.973684 0.000000 +vt 1.000000 0.603774 +vt 0.993421 0.603774 +vt 0.980263 0.000000 +vt 0.993421 0.000000 +vt 0.993421 0.000000 +vt 1.000000 0.603774 +vt 0.993421 0.603774 +vt 0.980263 0.603774 +vt 0.973684 0.000000 +vt 0.980263 0.000000 +vt 0.980263 0.603774 +vt 0.973684 0.000000 +vt 1.000000 0.603774 +vt 0.993421 0.603774 +vt 0.980263 0.000000 +vt 0.993421 0.000000 +vt 0.993421 0.000000 +vt 1.000000 0.603774 +vt 0.993421 0.603774 +vt 0.980263 0.603774 +vt 0.973684 0.000000 +vt 0.980263 0.000000 +vt 0.980263 0.603774 +vt 0.973684 0.000000 +vt 1.000000 0.603774 +vt 0.993421 0.603774 +vt 0.980263 0.000000 +vt 0.993421 0.000000 +vt 0.993421 0.000000 +vt 1.000000 0.603774 +vt 0.993421 0.603774 +vt 0.980263 0.603774 +vt 0.973684 0.000000 +vt 0.980263 0.000000 +vt 0.980263 0.603774 +vt 0.973684 0.000000 +vt 1.000000 0.603774 +vt 0.736842 0.075472 +vt 0.671053 0.094340 +vt 0.671053 0.113208 +vt 0.644737 0.132075 +vt 0.631579 0.094340 +vt 0.736842 0.075472 +vt 0.671053 0.094340 +vt 0.671053 0.113208 +vt 0.644737 0.132075 +vt 0.631579 0.094340 +vt 0.736842 0.075472 +vt 0.671053 0.094340 +vt 0.671053 0.113208 +vt 0.644737 0.132075 +vt 0.631579 0.094340 +vt 0.736842 0.075472 +vt 0.671053 0.094340 +vt 0.671053 0.113208 +vt 0.644737 0.132075 +vt 0.631579 0.094340 +vt 0.723684 0.830189 +vt 0.513158 0.830189 +vt 0.828947 0.830189 +vt 0.618421 0.830189 +vt 1.000000 0.000000 +vt 0.973684 0.603774 +vt 0.973684 0.603774 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 0.973684 0.603774 +vt 0.973684 0.603774 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 0.973684 0.603774 +vt 0.973684 0.603774 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 0.973684 0.603774 +vt 0.973684 0.603774 +vt 1.000000 0.000000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -1.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.7071 0.0000 -0.7071 +vn -0.7071 0.0000 -0.7071 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.8944 0.4472 0.0000 +vn 0.0000 0.4472 0.8944 +vn -0.8944 0.4472 0.0000 +vn 0.0000 0.4472 -0.8944 +s off +f 70/1/1 12/2/1 69/3/1 +f 54/4/2 70/5/2 55/6/2 +f 7/7/2 28/8/2 69/3/2 +f 8/9/2 71/10/2 5/11/2 +f 8/12/3 19/13/3 7/14/3 +f 7/14/4 18/15/4 6/16/4 +f 15/17/5 2/18/5 3/19/5 +f 4/20/1 17/21/1 5/22/1 +f 1/23/6 16/24/6 4/25/6 +f 5/22/7 20/26/7 8/12/7 +f 6/16/8 15/17/8 3/19/8 +f 14/27/9 1/23/9 2/18/9 +f 19/28/2 17/29/2 13/30/2 +f 28/31/3 35/32/3 27/33/3 +f 27/33/4 34/34/4 26/35/4 +f 31/36/5 22/37/5 23/38/5 +f 24/39/1 33/40/1 25/41/1 +f 21/42/6 32/43/6 24/44/6 +f 25/41/7 36/45/7 28/31/7 +f 26/35/8 31/36/8 23/38/8 +f 30/46/9 21/42/9 22/37/9 +f 35/47/2 33/48/2 29/49/2 +f 44/50/3 51/51/3 43/52/3 +f 43/52/4 50/53/4 42/54/4 +f 47/55/5 38/56/5 39/57/5 +f 40/58/1 49/59/1 41/60/1 +f 37/61/6 48/62/6 40/63/6 +f 41/60/7 52/64/7 44/50/7 +f 42/54/8 47/55/8 39/57/8 +f 46/65/9 37/61/9 38/56/9 +f 51/66/2 49/67/2 45/68/2 +f 60/69/3 67/70/3 59/71/3 +f 59/71/4 66/72/4 58/73/4 +f 63/74/5 54/75/5 55/76/5 +f 56/77/1 65/78/1 57/79/1 +f 53/80/6 64/81/6 56/82/6 +f 57/79/7 68/83/7 60/69/7 +f 58/73/8 63/74/8 55/76/8 +f 62/84/9 53/80/9 54/75/9 +f 67/85/2 65/86/2 61/87/2 +f 1/88/2 43/89/2 2/90/2 +f 3/91/2 25/92/2 6/93/2 +f 21/94/2 59/95/2 22/96/2 +f 39/97/2 57/98/2 42/99/2 +f 42/99/2 60/100/2 24/101/2 +f 38/102/2 56/103/2 39/97/2 +f 4/104/2 44/105/2 1/88/2 +f 6/93/2 28/8/2 7/7/2 +f 22/96/2 58/106/2 23/107/2 +f 40/108/2 72/109/2 37/110/2 +f 26/111/2 69/3/2 27/112/2 +f 23/107/2 58/106/2 70/5/2 +f 41/113/2 4/104/2 71/10/2 +f 53/114/2 38/102/2 72/109/2 +f 72/115/3 11/116/3 70/1/3 +f 69/3/9 10/117/9 71/10/9 +f 71/10/8 9/118/8 72/119/8 +f 12/2/10 75/120/10 10/117/10 +f 10/117/11 76/121/11 9/118/11 +f 9/122/12 74/123/12 11/116/12 +f 11/116/13 73/124/13 12/2/13 +f 74/125/1 77/126/1 73/124/1 +f 75/127/8 80/128/8 76/121/8 +f 76/129/3 78/130/3 74/123/3 +f 73/131/9 79/132/9 75/120/9 +f 81/133/9 84/134/9 83/135/9 +f 91/136/1 85/137/1 89/138/1 +f 90/139/8 88/140/8 92/141/8 +f 89/138/9 92/141/9 91/136/9 +f 82/142/8 93/143/8 84/134/8 +f 83/135/1 96/144/1 81/133/1 +f 97/145/3 100/146/3 99/147/3 +f 107/148/8 101/149/8 105/150/8 +f 106/151/1 104/152/1 108/153/1 +f 105/150/3 108/153/3 107/148/3 +f 98/154/1 109/155/1 100/146/1 +f 99/147/8 112/156/8 97/145/8 +f 113/157/1 116/158/1 115/159/1 +f 123/160/3 117/161/3 121/162/3 +f 122/163/9 120/164/9 124/165/9 +f 121/162/1 124/165/1 123/160/1 +f 114/166/9 125/167/9 116/158/9 +f 115/159/3 128/168/3 113/157/3 +f 129/169/8 132/170/8 131/171/8 +f 139/172/9 133/173/9 137/174/9 +f 138/175/3 136/176/3 140/177/3 +f 137/174/8 140/177/8 139/172/8 +f 130/178/3 141/179/3 132/170/3 +f 131/171/9 144/180/9 129/169/9 +f 70/1/1 11/116/1 12/2/1 +f 28/8/2 27/112/2 69/3/2 +f 69/3/2 71/10/2 7/7/2 +f 71/10/2 8/9/2 7/7/2 +f 8/12/3 20/26/3 19/13/3 +f 7/14/4 19/13/4 18/15/4 +f 15/17/5 14/27/5 2/18/5 +f 4/20/1 16/181/1 17/21/1 +f 1/23/6 13/30/6 16/24/6 +f 5/22/7 17/21/7 20/26/7 +f 6/16/8 18/15/8 15/17/8 +f 14/27/9 13/30/9 1/23/9 +f 13/30/2 14/27/2 15/182/2 +f 15/182/2 18/183/2 19/28/2 +f 19/28/2 20/184/2 17/29/2 +f 17/29/2 16/185/2 13/30/2 +f 13/30/2 15/182/2 19/28/2 +f 28/31/3 36/45/3 35/32/3 +f 27/33/4 35/32/4 34/34/4 +f 31/36/5 30/46/5 22/37/5 +f 24/39/1 32/186/1 33/40/1 +f 21/42/6 29/49/6 32/43/6 +f 25/41/7 33/40/7 36/45/7 +f 26/35/8 34/34/8 31/36/8 +f 30/46/9 29/49/9 21/42/9 +f 29/49/2 30/46/2 31/187/2 +f 31/187/2 34/188/2 35/47/2 +f 35/47/2 36/189/2 33/48/2 +f 33/48/2 32/190/2 29/49/2 +f 29/49/2 31/187/2 35/47/2 +f 44/50/3 52/64/3 51/51/3 +f 43/52/4 51/51/4 50/53/4 +f 47/55/5 46/65/5 38/56/5 +f 40/58/1 48/191/1 49/59/1 +f 37/61/6 45/68/6 48/62/6 +f 41/60/7 49/59/7 52/64/7 +f 42/54/8 50/53/8 47/55/8 +f 46/65/9 45/68/9 37/61/9 +f 45/68/2 46/65/2 47/192/2 +f 47/192/2 50/193/2 51/66/2 +f 51/66/2 52/194/2 49/67/2 +f 49/67/2 48/195/2 45/68/2 +f 45/68/2 47/192/2 51/66/2 +f 60/69/3 68/83/3 67/70/3 +f 59/71/4 67/70/4 66/72/4 +f 63/74/5 62/84/5 54/75/5 +f 56/77/1 64/196/1 65/78/1 +f 53/80/6 61/87/6 64/81/6 +f 57/79/7 65/78/7 68/83/7 +f 58/73/8 66/72/8 63/74/8 +f 62/84/9 61/87/9 53/80/9 +f 61/87/2 62/84/2 63/197/2 +f 63/197/2 66/198/2 67/85/2 +f 67/85/2 68/199/2 65/86/2 +f 65/86/2 64/200/2 61/87/2 +f 61/87/2 63/197/2 67/85/2 +f 1/88/2 44/105/2 43/89/2 +f 3/91/2 24/101/2 25/92/2 +f 21/94/2 60/100/2 59/95/2 +f 39/97/2 56/103/2 57/98/2 +f 24/101/2 3/91/2 2/90/2 +f 2/90/2 43/89/2 42/99/2 +f 42/99/2 57/98/2 60/100/2 +f 60/100/2 21/94/2 24/101/2 +f 24/101/2 2/90/2 42/99/2 +f 38/102/2 53/114/2 56/103/2 +f 4/104/2 41/113/2 44/105/2 +f 6/93/2 25/92/2 28/8/2 +f 22/96/2 59/95/2 58/106/2 +f 58/106/2 55/6/2 70/5/2 +f 70/5/2 69/3/2 23/107/2 +f 69/3/2 26/111/2 23/107/2 +f 4/104/2 5/11/2 71/10/2 +f 71/10/2 72/109/2 41/113/2 +f 72/109/2 40/108/2 41/113/2 +f 38/102/2 37/110/2 72/109/2 +f 72/109/2 70/5/2 53/114/2 +f 70/5/2 54/4/2 53/114/2 +f 72/115/3 9/122/3 11/116/3 +f 69/3/9 12/2/9 10/117/9 +f 71/10/8 10/117/8 9/118/8 +f 12/2/10 73/131/10 75/120/10 +f 10/117/11 75/127/11 76/121/11 +f 9/122/12 76/129/12 74/123/12 +f 11/116/13 74/125/13 73/124/13 +f 74/125/1 78/201/1 77/126/1 +f 75/127/8 79/202/8 80/128/8 +f 76/129/3 80/203/3 78/130/3 +f 73/131/9 77/204/9 79/132/9 +f 81/133/9 82/142/9 84/134/9 +f 91/136/1 87/205/1 85/137/1 +f 90/139/8 86/206/8 88/140/8 +f 89/138/9 90/139/9 92/141/9 +f 82/142/8 95/207/8 93/143/8 +f 83/135/1 94/208/1 96/144/1 +f 97/145/3 98/154/3 100/146/3 +f 107/148/8 103/209/8 101/149/8 +f 106/151/1 102/210/1 104/152/1 +f 105/150/3 106/151/3 108/153/3 +f 98/154/1 111/211/1 109/155/1 +f 99/147/8 110/212/8 112/156/8 +f 113/157/1 114/166/1 116/158/1 +f 123/160/3 119/213/3 117/161/3 +f 122/163/9 118/214/9 120/164/9 +f 121/162/1 122/163/1 124/165/1 +f 114/166/9 127/215/9 125/167/9 +f 115/159/3 126/216/3 128/168/3 +f 129/169/8 130/178/8 132/170/8 +f 139/172/9 135/217/9 133/173/9 +f 138/175/3 134/218/3 136/176/3 +f 137/174/8 138/175/8 140/177/8 +f 130/178/3 143/219/3 141/179/3 +f 131/171/9 142/220/9 144/180/9 +o Base +v -0.500000 4.500000 0.500000 +v 0.500000 4.500000 0.500000 +v -0.500000 4.500000 -0.500000 +v 0.500000 4.500000 -0.500000 +v -0.437500 8.000000 0.437500 +v 0.437500 8.000000 0.437500 +v -0.437500 8.000000 -0.437500 +v 0.437500 8.000000 -0.437500 +v -0.125000 0.000000 0.125000 +v 0.125000 0.000000 0.125000 +v -0.125000 0.000000 -0.125000 +v 0.125000 0.000000 -0.125000 +v -0.125000 4.500000 -0.125000 +v -0.125000 4.500000 0.125000 +v 0.125000 4.500000 0.125000 +v 0.125000 4.500000 -0.125000 +v -0.500000 7.750000 -0.500000 +v -0.500000 7.750000 0.500000 +v 0.500000 7.750000 0.500000 +v 0.500000 7.750000 -0.500000 +v 0.437500 7.500000 -0.437500 +v -0.437500 7.500000 -0.437500 +v 0.437500 7.500000 0.437500 +v -0.437500 7.500000 0.437500 +v -0.500000 4.750000 -0.500000 +v -0.500000 4.750000 0.500000 +v 0.500000 4.750000 0.500000 +v 0.500000 4.750000 -0.500000 +v -0.437500 5.000000 -0.437500 +v -0.437500 5.000000 0.437500 +v 0.437500 5.000000 0.437500 +v 0.437500 5.000000 -0.437500 +v -0.500000 9.000000 0.500000 +v 0.500000 9.000000 0.500000 +v -0.500000 9.000000 -0.500000 +v 0.500000 9.000000 -0.500000 +v -0.437500 8.750000 -0.437500 +v -0.437500 8.750000 0.437500 +v 0.437500 8.750000 0.437500 +v 0.437500 8.750000 -0.437500 +v -0.500000 8.000000 -0.500000 +v -0.500000 8.000000 0.500000 +v 0.500000 8.000000 0.500000 +v 0.500000 8.000000 -0.500000 +v -0.500000 8.750000 -0.500000 +v -0.500000 8.750000 0.500000 +v 0.500000 8.750000 0.500000 +v 0.500000 8.750000 -0.500000 +v -0.500000 8.125000 -0.500000 +v -0.500000 8.125000 0.500000 +v 0.500000 8.125000 0.500000 +v 0.500000 8.125000 -0.500000 +v -0.500000 8.625000 -0.500000 +v -0.500000 8.625000 0.500000 +v 0.500000 8.625000 0.500000 +v 0.500000 8.625000 -0.500000 +v 0.500000 4.750000 -0.187500 +v 0.500000 4.750000 -0.312500 +v 0.500000 7.750000 -0.187500 +v 0.500000 7.750000 -0.312500 +v 0.437500 4.750000 -0.187500 +v 0.437500 4.750000 -0.312500 +v 0.437500 7.750000 -0.187500 +v 0.437500 7.750000 -0.312500 +v 0.500000 4.750000 0.312500 +v 0.500000 4.750000 0.187500 +v 0.500000 7.750000 0.312500 +v 0.500000 7.750000 0.187500 +v 0.437500 4.750000 0.312500 +v 0.437500 4.750000 0.187500 +v 0.437500 7.750000 0.312500 +v 0.437500 7.750000 0.187500 +v -0.500000 4.750000 0.187500 +v -0.500000 4.750000 0.312500 +v -0.500000 7.750000 0.187500 +v -0.500000 7.750000 0.312500 +v -0.437500 4.750000 0.187500 +v -0.437500 4.750000 0.312500 +v -0.437500 7.750000 0.187500 +v -0.437500 7.750000 0.312500 +v -0.500000 4.750000 -0.312500 +v -0.500000 4.750000 -0.187500 +v -0.500000 7.750000 -0.312500 +v -0.500000 7.750000 -0.187500 +v -0.437500 4.750000 -0.312500 +v -0.437500 4.750000 -0.187500 +v -0.437500 7.750000 -0.312500 +v -0.437500 7.750000 -0.187500 +v -0.187500 4.750000 -0.500000 +v -0.312500 4.750000 -0.500000 +v -0.187500 7.750000 -0.500000 +v -0.312500 7.750000 -0.500000 +v -0.187500 4.750000 -0.437500 +v -0.312500 4.750000 -0.437500 +v -0.187500 7.750000 -0.437500 +v -0.312500 7.750000 -0.437500 +v 0.312500 4.750000 -0.500000 +v 0.187500 4.750000 -0.500000 +v 0.312500 7.750000 -0.500000 +v 0.187500 7.750000 -0.500000 +v 0.312500 4.750000 -0.437500 +v 0.187500 4.750000 -0.437500 +v 0.312500 7.750000 -0.437500 +v 0.187500 7.750000 -0.437500 +v 0.187500 4.750000 0.500000 +v 0.312500 4.750000 0.500000 +v 0.187500 7.750000 0.500000 +v 0.312500 7.750000 0.500000 +v 0.187500 4.750000 0.437500 +v 0.312500 4.750000 0.437500 +v 0.187500 7.750000 0.437500 +v 0.312500 7.750000 0.437500 +v -0.312500 4.750000 0.500000 +v -0.187500 4.750000 0.500000 +v -0.312500 7.750000 0.500000 +v -0.187500 7.750000 0.500000 +v -0.312500 4.750000 0.437500 +v -0.187500 4.750000 0.437500 +v -0.312500 7.750000 0.437500 +v -0.187500 7.750000 0.437500 +vt 0.210526 -0.000000 +vt 0.105263 0.150943 +vt 0.105263 0.000000 +vt 0.315789 0.707547 +vt 0.217105 0.688679 +vt 0.309211 0.688679 +vt 0.105263 0.679245 +vt 0.210526 0.641509 +vt 0.210526 0.679245 +vt -0.000000 0.641509 +vt 0.098684 0.603774 +vt 0.105263 0.641509 +vt 0.315789 0.679245 +vt 0.421053 0.641509 +vt 0.421053 0.679245 +vt -0.000000 0.679245 +vt 0.894737 0.000000 +vt 0.868421 0.037736 +vt 0.868421 0.000000 +vt 0.842105 0.716981 +vt 0.842105 0.037736 +vt 0.894737 0.037736 +vt 0.868421 0.716981 +vt 0.947368 0.037736 +vt 0.921053 0.716981 +vt 0.921053 0.037736 +vt 0.894737 0.716981 +vt 0.315789 0.641509 +vt 0.309211 0.603774 +vt 0.414474 0.603774 +vt 0.203947 0.603774 +vt 0.105263 0.188679 +vt 0.006579 0.226415 +vt 0.000000 0.188679 +vt 0.315789 0.150943 +vt 0.210526 0.188679 +vt 0.210526 0.150943 +vt 0.000000 0.150943 +vt 0.421053 0.150943 +vt 0.315789 0.188679 +vt 0.111842 0.226415 +vt 0.421053 0.188679 +vt 0.322368 0.226415 +vt 0.217105 0.226415 +vt 0.322368 0.603774 +vt 0.414474 0.226415 +vt 0.217105 0.603774 +vt 0.309211 0.226415 +vt 0.111842 0.603774 +vt 0.203947 0.226415 +vt 0.006579 0.603774 +vt 0.098684 0.226415 +vt 0.105263 0.849057 +vt 0.210526 1.000000 +vt 0.105263 1.000000 +vt 0.421053 0.707547 +vt 0.322368 0.688679 +vt 0.414474 0.688679 +vt 0.210526 0.849057 +vt 0.315789 0.811321 +vt 0.315789 0.849057 +vt -0.000000 0.849057 +vt 0.105263 0.811321 +vt 0.210526 0.811321 +vt 0.421053 0.811321 +vt 0.421053 0.849057 +vt 0.006579 0.688679 +vt 0.098684 0.688679 +vt 0.111842 0.688679 +vt 0.203947 0.688679 +vt 0.414474 0.801887 +vt 0.322368 0.801887 +vt 0.098684 0.801887 +vt -0.000000 0.811321 +vt 0.006579 0.801887 +vt 0.203947 0.801887 +vt 0.111842 0.801887 +vt 0.309211 0.801887 +vt 0.217105 0.801887 +vt 0.210526 0.707547 +vt 0.105263 0.707547 +vt 0.421053 0.783019 +vt 0.105263 0.783019 +vt 0.210526 0.783019 +vt 0.315789 0.783019 +vt 0.000000 0.707547 +vt 0.967105 0.452830 +vt 0.953947 0.000000 +vt 0.967105 0.000000 +vt 0.953947 0.452830 +vt 0.947368 0.000000 +vt 0.973684 0.452830 +vt 0.967105 0.452830 +vt 0.953947 0.000000 +vt 0.967105 0.000000 +vt 0.953947 0.452830 +vt 0.947368 0.000000 +vt 0.973684 0.452830 +vt 0.967105 0.452830 +vt 0.953947 0.000000 +vt 0.967105 0.000000 +vt 0.953947 0.452830 +vt 0.947368 0.000000 +vt 0.973684 0.452830 +vt 0.967105 0.452830 +vt 0.953947 0.000000 +vt 0.967105 0.000000 +vt 0.953947 0.452830 +vt 0.947368 0.000000 +vt 0.973684 0.452830 +vt 0.967105 0.452830 +vt 0.953947 0.000000 +vt 0.967105 0.000000 +vt 0.953947 0.452830 +vt 0.947368 0.000000 +vt 0.973684 0.452830 +vt 0.967105 0.452830 +vt 0.953947 0.000000 +vt 0.967105 0.000000 +vt 0.953947 0.452830 +vt 0.947368 0.000000 +vt 0.973684 0.452830 +vt 0.967105 0.452830 +vt 0.953947 0.000000 +vt 0.967105 0.000000 +vt 0.953947 0.452830 +vt 0.947368 0.000000 +vt 0.973684 0.452830 +vt 0.967105 0.452830 +vt 0.953947 0.000000 +vt 0.967105 0.000000 +vt 0.953947 0.452830 +vt 0.947368 0.000000 +vt 0.973684 0.452830 +vt 0.947368 0.716981 +vt 0.000000 0.783019 +vt 0.947368 0.452830 +vt 0.973684 0.000000 +vt 0.947368 0.452830 +vt 0.973684 0.000000 +vt 0.947368 0.452830 +vt 0.973684 0.000000 +vt 0.947368 0.452830 +vt 0.973684 0.000000 +vt 0.947368 0.452830 +vt 0.973684 0.000000 +vt 0.947368 0.452830 +vt 0.973684 0.000000 +vt 0.947368 0.452830 +vt 0.973684 0.000000 +vt 0.947368 0.452830 +vt 0.973684 0.000000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 -0.4472 -0.8944 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -0.2425 0.9701 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.2425 -0.9701 +vn -0.9701 -0.2425 0.0000 +vn 0.9701 -0.2425 0.0000 +vn 0.0000 0.2425 0.9701 +vn 0.9701 0.2425 0.0000 +vn -0.9701 0.2425 0.0000 +vn 0.0000 0.2425 -0.9701 +vn 0.0000 1.0000 0.0000 +vn -0.8944 -0.4472 0.0000 +vn 0.8944 -0.4472 0.0000 +vn 0.0000 -0.4472 0.8944 +vn -0.8944 0.4472 0.0000 +vn 0.0000 0.4472 0.8944 +vn 0.8944 0.4472 0.0000 +vn 0.0000 0.4472 -0.8944 +s off +f 147/221/14 146/222/14 145/223/14 +f 193/224/15 152/225/15 151/226/15 +f 187/227/16 164/228/16 188/229/16 +f 162/230/17 167/231/17 163/232/17 +f 185/233/18 162/234/18 186/235/18 +f 186/236/19 163/232/19 187/227/19 +f 155/237/14 154/238/14 153/239/14 +f 154/238/19 158/240/19 153/241/19 +f 156/242/16 159/243/16 154/238/16 +f 153/244/18 157/245/18 155/246/18 +f 155/246/20 160/247/20 156/242/20 +f 188/229/20 161/248/20 185/233/20 +f 164/228/21 166/249/21 161/248/21 +f 161/248/22 168/250/22 162/234/22 +f 163/232/23 165/251/23 164/228/23 +f 171/252/24 174/253/24 170/254/24 +f 147/255/20 172/256/20 148/257/20 +f 146/222/19 170/254/19 145/258/19 +f 148/257/16 171/252/16 146/222/16 +f 145/259/18 169/260/18 147/255/18 +f 172/256/25 175/261/25 171/252/25 +f 170/262/26 173/263/26 169/260/26 +f 169/260/27 176/264/27 172/256/27 +f 166/265/18 174/266/18 168/250/18 +f 165/267/20 173/268/20 166/249/20 +f 167/269/16 176/270/16 165/251/16 +f 168/271/19 175/272/19 167/231/19 +f 178/273/28 179/274/28 177/275/28 +f 194/276/29 151/277/29 149/278/29 +f 180/279/20 189/280/20 179/281/20 +f 177/282/19 191/283/19 178/273/19 +f 178/273/16 192/284/16 180/279/16 +f 179/281/18 190/285/18 177/286/18 +f 151/277/28 186/235/28 149/278/28 +f 149/287/28 187/227/28 150/288/28 +f 150/289/28 188/229/28 152/290/28 +f 152/225/28 185/233/28 151/226/28 +f 182/291/14 189/280/14 181/292/14 +f 183/293/14 190/294/14 182/295/14 +f 184/296/14 191/283/14 183/297/14 +f 181/298/14 192/284/14 184/299/14 +f 196/300/30 150/289/30 152/290/30 +f 195/301/31 149/287/31 150/288/31 +f 181/292/32 198/302/32 182/291/32 +f 182/295/33 199/303/33 183/293/33 +f 183/297/34 200/304/34 184/296/34 +f 184/299/35 197/305/35 181/298/35 +f 198/302/18 193/224/18 194/276/18 +f 199/303/19 194/306/19 195/301/19 +f 200/304/16 195/301/16 196/300/16 +f 197/305/20 196/300/20 193/224/20 +f 204/307/16 201/308/16 202/309/16 +f 203/310/19 205/311/19 201/308/19 +f 202/309/20 208/312/20 204/307/20 +f 212/313/16 209/314/16 210/315/16 +f 211/316/19 213/317/19 209/314/19 +f 210/315/20 216/318/20 212/313/20 +f 220/319/18 217/320/18 218/321/18 +f 219/322/20 221/323/20 217/320/20 +f 218/321/19 224/324/19 220/319/19 +f 228/325/18 225/326/18 226/327/18 +f 227/328/20 229/329/20 225/326/20 +f 226/327/19 232/330/19 228/325/19 +f 236/331/20 233/332/20 234/333/20 +f 235/334/16 237/335/16 233/332/16 +f 234/333/18 240/336/18 236/331/18 +f 244/337/20 241/338/20 242/339/20 +f 243/340/16 245/341/16 241/338/16 +f 242/339/18 248/342/18 244/337/18 +f 252/343/19 249/344/19 250/345/19 +f 251/346/18 253/347/18 249/344/18 +f 250/345/16 256/348/16 252/343/16 +f 260/349/19 257/350/19 258/351/19 +f 259/352/18 261/353/18 257/350/18 +f 258/351/16 264/354/16 260/349/16 +f 147/221/14 148/257/14 146/222/14 +f 193/224/15 196/300/15 152/225/15 +f 187/227/16 163/232/16 164/228/16 +f 162/230/17 168/271/17 167/231/17 +f 185/233/18 161/248/18 162/234/18 +f 186/236/19 162/230/19 163/232/19 +f 155/237/14 156/242/14 154/238/14 +f 154/238/19 159/243/19 158/240/19 +f 156/242/16 160/247/16 159/243/16 +f 153/244/18 158/355/18 157/245/18 +f 155/246/20 157/245/20 160/247/20 +f 188/229/20 164/228/20 161/248/20 +f 164/228/21 165/267/21 166/249/21 +f 161/248/22 166/265/22 168/250/22 +f 163/232/23 167/269/23 165/251/23 +f 171/252/24 175/272/24 174/253/24 +f 147/255/20 169/260/20 172/256/20 +f 146/222/19 171/252/19 170/254/19 +f 148/257/16 172/256/16 171/252/16 +f 145/259/18 170/262/18 169/260/18 +f 172/256/25 176/270/25 175/261/25 +f 170/262/26 174/266/26 173/263/26 +f 169/260/27 173/268/27 176/264/27 +f 166/265/18 173/263/18 174/266/18 +f 165/267/20 176/264/20 173/268/20 +f 167/269/16 175/261/16 176/270/16 +f 168/271/19 174/253/19 175/272/19 +f 178/273/28 180/279/28 179/274/28 +f 194/276/29 193/224/29 151/277/29 +f 180/279/20 192/284/20 189/280/20 +f 177/282/19 190/294/19 191/283/19 +f 178/273/16 191/283/16 192/284/16 +f 179/281/18 189/280/18 190/285/18 +f 151/277/28 185/233/28 186/235/28 +f 149/287/28 186/236/28 187/227/28 +f 150/289/28 187/227/28 188/229/28 +f 152/225/28 188/229/28 185/233/28 +f 182/291/14 190/285/14 189/280/14 +f 183/293/14 191/283/14 190/294/14 +f 184/296/14 192/284/14 191/283/14 +f 181/298/14 189/280/14 192/284/14 +f 196/300/30 195/301/30 150/289/30 +f 195/301/31 194/306/31 149/287/31 +f 181/292/32 197/305/32 198/302/32 +f 182/295/33 198/356/33 199/303/33 +f 183/297/34 199/303/34 200/304/34 +f 184/299/35 200/304/35 197/305/35 +f 198/302/18 197/305/18 193/224/18 +f 199/303/19 198/356/19 194/306/19 +f 200/304/16 199/303/16 195/301/16 +f 197/305/20 200/304/20 196/300/20 +f 204/307/16 203/310/16 201/308/16 +f 203/310/19 207/357/19 205/311/19 +f 202/309/20 206/358/20 208/312/20 +f 212/313/16 211/316/16 209/314/16 +f 211/316/19 215/359/19 213/317/19 +f 210/315/20 214/360/20 216/318/20 +f 220/319/18 219/322/18 217/320/18 +f 219/322/20 223/361/20 221/323/20 +f 218/321/19 222/362/19 224/324/19 +f 228/325/18 227/328/18 225/326/18 +f 227/328/20 231/363/20 229/329/20 +f 226/327/19 230/364/19 232/330/19 +f 236/331/20 235/334/20 233/332/20 +f 235/334/16 239/365/16 237/335/16 +f 234/333/18 238/366/18 240/336/18 +f 244/337/20 243/340/20 241/338/20 +f 243/340/16 247/367/16 245/341/16 +f 242/339/18 246/368/18 248/342/18 +f 252/343/19 251/346/19 249/344/19 +f 251/346/18 255/369/18 253/347/18 +f 250/345/16 254/370/16 256/348/16 +f 260/349/19 259/352/19 257/350/19 +f 259/352/18 263/371/18 261/353/18 +f 258/351/16 262/372/16 264/354/16 diff --git a/src/main/resources/assets/hbm/models/trinkets/hundun.obj b/src/main/resources/assets/hbm/models/trinkets/hundun.obj new file mode 100644 index 000000000..4f241b676 --- /dev/null +++ b/src/main/resources/assets/hbm/models/trinkets/hundun.obj @@ -0,0 +1,1538 @@ +# Blender v2.79 (sub 0) OBJ File: 'hundun.blend' +# www.blender.org +o goober_posed +v 0.147740 1.125000 0.270838 +v 0.645838 1.125000 0.227260 +v 0.104162 1.125000 -0.227260 +v 0.602260 1.125000 -0.270838 +v 0.147740 1.625000 0.270838 +v 0.645838 1.625000 0.227260 +v 0.104162 1.625000 -0.227260 +v 0.602260 1.625000 -0.270838 +v 0.632220 1.156250 0.071604 +v 0.615878 1.156250 -0.115182 +v 0.632220 1.343750 0.071604 +v 0.615878 1.343750 -0.115182 +v 0.819006 1.156250 0.055263 +v 0.802664 1.156250 -0.131524 +v 0.819006 1.343750 0.055263 +v 0.802664 1.343750 -0.131524 +v 0.462946 1.625000 -0.070433 +v 0.452052 1.625000 -0.194957 +v 0.276160 1.625000 -0.054091 +v 0.265265 1.625000 -0.178616 +v 0.276160 1.875000 -0.054091 +v 0.462946 1.875000 -0.070433 +v 0.452052 1.875000 -0.194957 +v 0.265265 1.875000 -0.178616 +v 0.484735 1.625000 0.178616 +v 0.473840 1.625000 0.054091 +v 0.297948 1.625000 0.194957 +v 0.287054 1.625000 0.070433 +v 0.297948 1.875000 0.194957 +v 0.484735 1.875000 0.178616 +v 0.473840 1.875000 0.054091 +v 0.287054 1.875000 0.070433 +v -0.374080 0.062119 0.250000 +v 0.509803 0.946002 0.250000 +v -0.374080 0.062119 -0.250000 +v 0.509803 0.946002 -0.250000 +v -0.727633 0.415672 -0.250000 +v -0.727633 0.415672 0.250000 +v 0.156250 1.299556 0.250000 +v 0.156250 1.299556 -0.250000 +v 0.250000 0.875000 0.312500 +v 0.500000 0.125000 -0.062500 +v 0.250000 0.875000 0.062500 +v 0.500000 0.125000 -0.312500 +v 0.250000 0.875000 -0.312500 +v 0.250000 0.875000 -0.062500 +v 0.500000 0.875000 -0.062500 +v 0.500000 0.875000 -0.312500 +v 0.250000 0.000000 -0.312500 +v 0.250000 0.000000 -0.062500 +v 0.500000 0.125000 0.062500 +v 0.500000 0.125000 0.312500 +v 0.625000 0.125000 -0.062500 +v 0.625000 0.125000 -0.312500 +v 0.625000 0.000000 -0.062500 +v 0.625000 0.000000 -0.312500 +v 0.500000 0.875000 0.312500 +v 0.500000 0.875000 0.062500 +v 0.250000 0.000000 0.062500 +v 0.250000 0.000000 0.312500 +v 0.625000 0.125000 0.312500 +v 0.625000 0.125000 0.062500 +v 0.625000 0.000000 0.312500 +v 0.625000 0.000000 0.062500 +v 0.087399 0.282874 -0.062500 +v 0.087399 0.282874 -0.312500 +v 0.087399 0.282874 0.062500 +v 0.087399 0.282874 0.312500 +v -0.637046 0.476988 -0.062500 +v -0.637046 0.476988 -0.312500 +v 0.143435 0.009040 -0.312500 +v 0.143435 0.009040 -0.062500 +v 0.119751 0.403615 -0.062500 +v 0.119751 0.403615 -0.312500 +v 0.240492 0.371262 -0.062500 +v 0.240492 0.371262 -0.312500 +v -0.218788 0.106097 -0.062500 +v -0.218788 0.106097 -0.312500 +v -0.734103 0.114766 -0.312500 +v -0.734103 0.114766 -0.062500 +v -0.251140 -0.014643 -0.062500 +v -0.251140 -0.014643 -0.312500 +v -0.637046 0.476988 0.312500 +v -0.637046 0.476988 0.062500 +v 0.143435 0.009040 0.062500 +v 0.143435 0.009040 0.312500 +v 0.119751 0.403615 0.312500 +v 0.119751 0.403615 0.062500 +v 0.240492 0.371262 0.312500 +v 0.240492 0.371262 0.062500 +v -0.218788 0.106097 0.312500 +v -0.218788 0.106097 0.062500 +v -0.734103 0.114766 0.062500 +v -0.734103 0.114766 0.312500 +v -0.251140 -0.014643 0.312500 +v -0.251140 -0.014643 0.062500 +v 0.023667 0.415672 0.281250 +v 0.553998 0.946002 0.281250 +v 0.023667 0.415672 -0.281250 +v 0.553998 0.946002 -0.281250 +v -0.374080 0.813420 -0.281250 +v -0.374080 0.813420 0.281250 +v 0.156250 1.343750 0.281250 +v 0.156250 1.343750 -0.281250 +v 0.119333 1.093750 0.304692 +v 0.679692 1.093750 0.255667 +v 0.070308 1.093750 -0.255667 +v 0.630667 1.093750 -0.304692 +v 0.119333 1.656250 0.304692 +v 0.679692 1.656250 0.255667 +v 0.070308 1.656250 -0.255667 +v 0.630667 1.656250 -0.304692 +v -0.669194 0.312500 0.044194 +v -0.580806 0.312500 -0.044194 +v -0.631503 0.414894 -0.094892 +v -0.719892 0.414894 -0.006503 +v -0.870420 0.025712 -0.333808 +v -0.958808 0.025712 -0.245420 +v -0.921117 0.128106 -0.384506 +v -1.009506 0.128106 -0.296117 +v -0.978553 0.062500 -0.228553 +v -0.853553 0.062500 -0.228553 +v -0.853553 0.187500 -0.228553 +v -0.978553 0.187500 -0.228553 +v -0.853553 0.062500 -0.728553 +v -0.978553 0.062500 -0.728553 +v -0.853553 0.187500 -0.728553 +v -0.978553 0.187500 -0.728553 +v -0.960248 0.062500 -0.772748 +v -0.871859 0.062500 -0.684359 +v -0.871859 0.187500 -0.684359 +v -0.960248 0.187500 -0.772748 +v -0.518306 0.062500 -1.037912 +v -0.606694 0.062500 -1.126301 +v -0.518306 0.187500 -1.037912 +v -0.606694 0.187500 -1.126301 +v -0.562500 0.000000 -0.957107 +v -0.562500 0.000000 -1.207107 +v -0.562500 0.250000 -0.957107 +v -0.562500 0.250000 -1.207107 +v -0.062500 0.000000 -0.957107 +v -0.062500 0.000000 -1.207107 +v -0.062500 0.250000 -0.957107 +v -0.062500 0.250000 -1.207107 +v -0.130233 0.999672 -0.187500 +v -0.153109 1.022549 -0.308241 +v -0.041844 1.088061 -0.187500 +v -0.064721 1.110937 -0.308241 +v 0.125897 0.743543 -0.284557 +v 0.103020 0.766419 -0.405298 +v 0.214285 0.831931 -0.284557 +v 0.191409 0.854808 -0.405298 +v -0.266158 0.428491 -0.367025 +v -0.254720 0.417053 -0.306654 +v -0.479599 0.641932 -0.286144 +v -0.468161 0.630494 -0.225773 +v -0.114608 0.984047 -0.225773 +v -0.126046 0.995486 -0.286144 +v 0.098834 0.770606 -0.306654 +v 0.087396 0.782044 -0.367025 +v -0.153109 1.022549 0.308241 +v -0.130233 0.999672 0.187500 +v -0.064721 1.110937 0.308241 +v -0.041844 1.088061 0.187500 +v 0.103020 0.766419 0.405298 +v 0.125897 0.743543 0.284557 +v 0.191409 0.854808 0.405298 +v 0.214285 0.831931 0.284557 +v -0.254720 0.417053 0.306654 +v -0.266158 0.428491 0.367025 +v -0.468161 0.630494 0.225773 +v -0.479599 0.641932 0.286144 +v -0.126046 0.995486 0.286144 +v -0.114608 0.984047 0.225773 +v 0.087396 0.782044 0.367025 +v 0.098834 0.770606 0.306654 +vt 0.187500 0.875000 +vt 0.125000 1.000000 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.125000 1.000000 +vt 0.062500 1.000000 +vt 0.125000 0.750000 +vt 0.062500 0.750000 +vt 0.250000 0.750000 +vt 0.187500 0.875000 +vt 0.187500 0.750000 +vt 0.125000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.750000 +vt 0.250000 0.968750 +vt 0.226562 0.937500 +vt 0.250000 0.937500 +vt 0.484375 0.640625 +vt 0.460938 0.687500 +vt 0.460938 0.640625 +vt 0.437500 0.640625 +vt 0.437500 0.687500 +vt 0.460938 0.734375 +vt 0.484375 0.687500 +vt 0.484375 0.734375 +vt 0.507812 0.687500 +vt 0.507812 0.640625 +vt 0.484375 0.593750 +vt 0.460938 0.593750 +vt 0.226562 0.937500 +vt 0.250000 0.968750 +vt 0.226562 0.968750 +vt 0.250000 0.875000 +vt 0.226562 0.875000 +vt 0.210938 0.875000 +vt 0.187500 0.937500 +vt 0.187500 0.875000 +vt 0.265625 0.875000 +vt 0.250000 0.937500 +vt 0.210938 0.937500 +vt 0.210938 0.875000 +vt 0.187500 0.937500 +vt 0.187500 0.875000 +vt 0.250000 0.875000 +vt 0.226562 0.875000 +vt 0.210938 0.937500 +vt 0.265625 0.875000 +vt 0.218750 0.375000 +vt 0.062500 0.250000 +vt 0.218750 0.250000 +vt 0.062500 0.625000 +vt 0.218750 0.500000 +vt 0.218750 0.625000 +vt 0.281250 0.625000 +vt 0.281250 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.375000 +vt 0.062500 0.750000 +vt 0.218750 0.750000 +vt -0.000000 0.500000 +vt -0.000000 0.625000 +vt 0.546875 0.937500 +vt 0.578125 1.000000 +vt 0.546875 1.000000 +vt 0.703125 0.937500 +vt 0.734375 1.000000 +vt 0.703125 1.000000 +vt 0.734375 0.750000 +vt 0.703125 0.750000 +vt 0.578125 0.687500 +vt 0.546875 0.593750 +vt 0.578125 0.593750 +vt 0.734375 0.687500 +vt 0.703125 0.593750 +vt 0.734375 0.593750 +vt 0.578125 0.750000 +vt 0.546875 0.750000 +vt 0.703125 0.687500 +vt 0.703125 0.718750 +vt 0.687500 0.718750 +vt 0.625000 0.687500 +vt 0.593750 0.718750 +vt 0.546875 0.718750 +vt 0.578125 0.718750 +vt 0.734375 0.718750 +vt 0.781250 0.687500 +vt 0.750000 0.718750 +vt 0.546875 0.687500 +vt 0.531250 0.718750 +vt 0.812500 0.906250 +vt 0.781250 0.906250 +vt 0.656250 0.906250 +vt 0.625000 0.906250 +vt 0.640625 0.343750 +vt 0.640625 0.250000 +vt 0.671875 0.281250 +vt 0.718750 0.312500 +vt 0.687500 0.500000 +vt 0.687500 0.312500 +vt 0.718750 0.250000 +vt 0.687500 0.156250 +vt 0.718750 0.156250 +vt 0.765625 0.343750 +vt 0.734375 0.281250 +vt 0.765625 0.250000 +vt 0.687500 0.281250 +vt 0.718750 0.281250 +vt 0.453125 0.343750 +vt 0.453125 0.250000 +vt 0.484375 0.281250 +vt 0.781250 0.218750 +vt 0.812500 0.312500 +vt 0.781250 0.312500 +vt 0.781250 0.343750 +vt 0.812500 0.468750 +vt 0.781250 0.468750 +vt 0.578125 0.343750 +vt 0.546875 0.281250 +vt 0.578125 0.250000 +vt 0.531250 0.250000 +vt 0.500000 0.156250 +vt 0.531250 0.156250 +vt 0.531250 0.312500 +vt 0.500000 0.500000 +vt 0.500000 0.312500 +vt 0.718750 0.593750 +vt 0.718750 0.500000 +vt 0.500000 0.281250 +vt 0.531250 0.281250 +vt 0.593750 0.218750 +vt 0.625000 0.312500 +vt 0.593750 0.312500 +vt 0.593750 0.343750 +vt 0.625000 0.468750 +vt 0.593750 0.468750 +vt 0.531250 0.593750 +vt 0.531250 0.500000 +vt 0.429688 0.375000 +vt 0.343750 0.250000 +vt 0.429688 0.250000 +vt 0.343750 0.625000 +vt 0.429688 0.500000 +vt 0.429688 0.625000 +vt 0.343750 0.500000 +vt 0.343750 0.375000 +vt 0.429688 0.750000 +vt 0.281250 0.500000 +vt 0.281250 0.625000 +vt 0.437500 0.875000 +vt 0.375000 1.000000 +vt 0.375000 0.875000 +vt 0.312500 0.875000 +vt 0.375000 1.000000 +vt 0.312500 1.000000 +vt 0.375000 0.750000 +vt 0.312500 0.750000 +vt 0.500000 0.750000 +vt 0.437500 0.875000 +vt 0.437500 0.750000 +vt 0.375000 0.875000 +vt 0.250000 0.875000 +vt 0.250000 0.750000 +vt 0.046875 0.093750 +vt 0.031250 0.062500 +vt 0.046875 0.062500 +vt 0.031250 0.250000 +vt 0.046875 0.218750 +vt 0.046875 0.250000 +vt 0.031250 0.093750 +vt 0.015625 0.218750 +vt 0.015625 0.093750 +vt 0.000000 0.093750 +vt 0.000000 0.218750 +vt 0.062500 0.218750 +vt 0.031250 0.218750 +vt 0.109375 0.093750 +vt 0.093750 0.062500 +vt 0.109375 0.062500 +vt 0.093750 0.250000 +vt 0.109375 0.218750 +vt 0.109375 0.250000 +vt 0.093750 0.093750 +vt 0.078125 0.218750 +vt 0.078125 0.093750 +vt 0.062500 0.218750 +vt 0.062500 0.093750 +vt 0.125000 0.093750 +vt 0.093750 0.218750 +vt 0.171875 0.093750 +vt 0.156250 0.062500 +vt 0.171875 0.062500 +vt 0.156250 0.250000 +vt 0.171875 0.218750 +vt 0.171875 0.250000 +vt 0.156250 0.093750 +vt 0.140625 0.218750 +vt 0.140625 0.093750 +vt 0.125000 0.218750 +vt 0.125000 0.093750 +vt 0.187500 0.093750 +vt 0.156250 0.218750 +vt 0.281250 0.125000 +vt 0.250000 0.062500 +vt 0.281250 0.062500 +vt 0.250000 0.312500 +vt 0.281250 0.250000 +vt 0.281250 0.312500 +vt 0.312500 0.125000 +vt 0.250000 0.125000 +vt 0.250000 0.250000 +vt 0.218750 0.250000 +vt 0.218750 0.125000 +vt 0.187500 0.250000 +vt 0.187500 0.125000 +vt 0.046875 0.468750 +vt 0.031250 0.500000 +vt 0.031250 0.468750 +vt 0.031250 0.375000 +vt 0.046875 0.343750 +vt 0.046875 0.375000 +vt 0.062500 0.375000 +vt 0.062500 0.468750 +vt -0.000000 0.468750 +vt 0.015625 0.375000 +vt 0.015625 0.468750 +vt 0.218750 0.406250 +vt 0.281250 0.421875 +vt 0.218750 0.421875 +vt 0.218750 0.328125 +vt 0.281250 0.406250 +vt 0.218750 0.312500 +vt 0.281250 0.328125 +vt 0.289062 0.328125 +vt 0.289062 0.406250 +vt 0.218750 0.500000 +vt 0.281250 0.500000 +vt 0.046875 0.468750 +vt 0.031250 0.500000 +vt 0.046875 0.500000 +vt 0.031250 0.343750 +vt 0.046875 0.375000 +vt 0.046875 0.343750 +vt 0.000000 0.468750 +vt 0.015625 0.375000 +vt 0.000000 0.375000 +vt 0.062500 0.468750 +vt 0.031250 0.375000 +vt 0.031250 0.468750 +vt 0.015625 0.468750 +vt 0.218750 0.406250 +vt 0.281250 0.421875 +vt 0.281250 0.406250 +vt 0.218750 0.500000 +vt 0.218750 0.421875 +vt 0.218750 0.328125 +vt 0.281250 0.312500 +vt 0.218750 0.312500 +vt 0.289062 0.328125 +vt 0.281250 0.328125 +vt 0.187500 1.000000 +vt 0.250000 0.875000 +vt 0.226562 0.968750 +vt 0.265625 0.937500 +vt 0.265625 0.937500 +vt 0.578125 0.937500 +vt 0.734375 0.937500 +vt 0.687500 0.906250 +vt 0.656250 0.906250 +vt 0.656250 0.687500 +vt 0.593750 0.906250 +vt 0.750000 0.906250 +vt 0.531250 0.906250 +vt 0.500000 0.906250 +vt 0.500000 0.687500 +vt 0.812500 0.687500 +vt 0.656250 0.687500 +vt 0.671875 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.343750 +vt 0.687500 0.250000 +vt 0.734375 0.468750 +vt 0.484375 0.468750 +vt 0.437500 0.468750 +vt 0.437500 0.343750 +vt 0.500000 0.250000 +vt 0.812500 0.218750 +vt 0.812500 0.343750 +vt 0.546875 0.468750 +vt 0.687500 0.593750 +vt 0.625000 0.218750 +vt 0.625000 0.343750 +vt 0.500000 0.593750 +vt 0.343750 0.750000 +vt 0.437500 1.000000 +vt 0.500000 0.875000 +vt 0.062500 0.093750 +vt 0.125000 0.218750 +vt 0.187500 0.218750 +vt 0.312500 0.250000 +vt 0.046875 0.500000 +vt 0.031250 0.343750 +vt -0.000000 0.375000 +vt 0.281250 0.312500 +vt 0.062500 0.375000 +vt 0.281250 0.500000 +vt 0.289062 0.406250 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.9962 0.0000 -0.0872 +vn -0.9962 0.0000 0.0872 +vn -0.0872 0.0000 -0.9962 +vn 0.0872 0.0000 0.9962 +vn 0.7071 -0.7071 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.0000 1.0000 +vn 0.7071 0.7071 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.2588 0.9659 0.0000 +vn 0.9659 -0.2588 0.0000 +vn -0.9659 0.2588 0.0000 +vn -0.2588 -0.9659 0.0000 +vn 0.5792 0.5736 0.5792 +vn -0.5792 -0.5736 -0.5792 +vn -0.7071 -0.0000 0.7071 +vn 0.4056 -0.8192 0.4056 +vn 0.7071 -0.0000 -0.7071 +vn -0.4056 0.8192 -0.4056 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn -0.6830 0.6830 0.2588 +vn 0.6830 -0.6830 -0.2588 +vn -0.1830 0.1830 -0.9659 +vn 0.1830 -0.1830 0.9659 +vn -0.6830 0.6830 -0.2588 +vn 0.6830 -0.6830 0.2588 +vn 0.1830 -0.1830 -0.9659 +vn -0.1830 0.1830 0.9659 +s off +f 3/1/1 2/2/1 1/3/1 +f 6/4/2 7/5/2 5/6/2 +f 4/7/3 6/4/3 2/8/3 +f 1/9/4 7/10/4 3/11/4 +f 3/11/5 8/12/5 4/7/5 +f 2/8/6 5/13/6 1/14/6 +f 31/15/2 29/16/2 30/17/2 +f 14/18/3 15/19/3 13/20/3 +f 9/21/6 15/19/6 11/22/6 +f 11/23/2 16/24/2 12/25/2 +f 12/26/5 14/18/5 10/27/5 +f 10/28/1 13/20/1 9/29/1 +f 23/30/2 21/31/2 22/32/2 +f 20/33/5 23/30/5 18/34/5 +f 17/35/6 21/36/6 19/37/6 +f 19/38/4 24/39/4 20/33/4 +f 18/34/3 22/40/3 17/35/3 +f 28/41/5 31/42/5 26/43/5 +f 25/44/6 29/16/6 27/45/6 +f 27/45/4 32/46/4 28/41/4 +f 26/47/3 30/17/3 25/44/3 +f 35/48/7 34/49/7 33/50/7 +f 39/51/8 37/52/8 38/53/8 +f 33/54/9 37/52/9 35/55/9 +f 35/48/10 40/56/10 36/57/10 +f 34/58/11 38/53/11 33/59/11 +f 36/60/12 39/51/12 34/61/12 +f 57/62/2 43/63/2 41/64/2 +f 47/65/2 45/66/2 46/67/2 +f 44/68/13 47/65/13 42/69/13 +f 64/70/1 60/71/1 59/72/1 +f 56/73/1 50/74/1 49/75/1 +f 51/76/13 57/62/13 52/77/13 +f 55/78/11 53/79/11 42/80/11 +f 59/81/10 51/82/10 64/70/10 +f 61/83/13 64/70/13 62/84/13 +f 52/77/2 62/84/2 51/76/2 +f 53/79/13 56/73/13 54/85/13 +f 42/69/2 54/85/2 44/68/2 +f 49/86/10 44/87/10 56/73/10 +f 63/88/11 61/83/11 52/89/11 +f 49/86/14 46/90/14 45/91/14 +f 59/81/14 41/92/14 43/93/14 +f 77/94/11 72/95/11 65/96/11 +f 66/97/15 69/98/15 65/99/15 +f 76/100/16 72/101/16 71/102/16 +f 78/103/10 66/104/10 71/105/10 +f 73/106/15 76/100/15 74/107/15 +f 65/99/17 74/107/17 66/97/17 +f 91/108/11 86/109/11 68/110/11 +f 71/111/18 77/112/18 78/113/18 +f 77/112/16 82/114/16 78/113/16 +f 82/114/18 80/115/18 79/116/18 +f 92/117/10 67/118/10 85/119/10 +f 90/120/16 86/121/16 85/122/16 +f 67/123/15 83/124/15 68/125/15 +f 79/126/17 69/98/17 70/127/17 +f 87/128/15 90/120/15 88/129/15 +f 68/125/17 88/129/17 67/123/17 +f 85/130/18 91/131/18 92/132/18 +f 91/131/16 96/133/16 92/132/16 +f 96/133/18 94/134/18 93/135/18 +f 93/136/17 83/124/17 84/137/17 +f 99/138/7 98/139/7 97/140/7 +f 103/141/8 101/142/8 102/143/8 +f 99/138/10 104/144/10 100/145/10 +f 97/146/11 103/141/11 102/143/11 +f 100/147/12 103/141/12 98/148/12 +f 107/149/1 106/150/1 105/151/1 +f 110/152/2 111/153/2 109/154/2 +f 108/155/3 110/152/3 106/156/3 +f 105/157/4 111/158/4 107/159/4 +f 107/159/5 112/160/5 108/155/5 +f 106/156/6 109/161/6 105/162/6 +f 115/163/19 113/164/19 114/165/19 +f 118/166/20 119/167/20 117/168/20 +f 116/169/21 118/170/21 113/171/21 +f 114/172/22 118/170/22 117/173/22 +f 115/163/23 117/174/23 119/167/23 +f 116/169/24 119/167/24 120/175/24 +f 123/176/11 121/177/11 122/178/11 +f 126/179/10 127/180/10 125/181/10 +f 124/182/14 126/183/14 121/184/14 +f 121/184/1 125/185/1 122/186/1 +f 122/187/13 127/180/13 123/176/13 +f 123/176/2 128/188/2 124/182/2 +f 131/189/21 129/190/21 130/191/21 +f 134/192/23 135/193/23 133/194/23 +f 132/195/25 134/196/25 129/197/25 +f 129/197/1 133/198/1 130/199/1 +f 130/200/26 135/193/26 131/189/26 +f 131/189/2 136/201/2 132/195/2 +f 139/202/14 138/203/14 137/204/14 +f 142/205/13 143/206/13 141/207/13 +f 137/208/11 143/206/11 139/202/11 +f 140/209/2 143/206/2 144/210/2 +f 140/209/10 142/211/10 138/212/10 +f 138/212/1 141/213/1 137/214/1 +f 146/215/27 147/216/27 148/217/27 +f 152/218/28 149/219/28 150/220/28 +f 146/215/29 152/218/29 150/220/29 +f 146/215/9 149/221/9 145/222/9 +f 145/223/30 151/224/30 147/225/30 +f 147/225/12 152/218/12 148/217/12 +f 158/226/27 156/227/27 157/228/27 +f 160/229/29 155/230/29 158/226/29 +f 159/231/28 153/232/28 160/229/28 +f 155/230/9 154/233/9 156/234/9 +f 159/235/30 156/227/30 154/236/30 +f 161/237/31 164/238/31 162/239/31 +f 168/240/32 165/241/32 166/242/32 +f 162/243/33 168/244/33 166/245/33 +f 162/246/9 165/241/9 161/237/9 +f 161/237/34 167/247/34 163/248/34 +f 164/249/12 167/247/12 168/244/12 +f 173/250/31 171/251/31 172/252/31 +f 176/253/33 171/251/33 174/254/33 +f 175/255/32 169/256/32 176/257/32 +f 172/252/9 169/258/9 170/259/9 +f 175/255/34 172/252/34 170/259/34 +f 3/1/1 4/260/1 2/2/1 +f 6/4/2 8/12/2 7/5/2 +f 4/7/3 8/12/3 6/4/3 +f 1/9/4 5/261/4 7/10/4 +f 3/11/5 7/10/5 8/12/5 +f 2/8/6 6/4/6 5/13/6 +f 31/15/2 32/262/2 29/16/2 +f 14/18/3 16/24/3 15/19/3 +f 9/21/6 13/20/6 15/19/6 +f 11/23/2 15/19/2 16/24/2 +f 12/26/5 16/24/5 14/18/5 +f 10/28/1 14/18/1 13/20/1 +f 23/30/2 24/39/2 21/31/2 +f 20/33/5 24/39/5 23/30/5 +f 17/35/6 22/40/6 21/36/6 +f 19/38/4 21/263/4 24/39/4 +f 18/34/3 23/30/3 22/40/3 +f 28/41/5 32/46/5 31/42/5 +f 25/44/6 30/17/6 29/16/6 +f 27/45/4 29/16/4 32/46/4 +f 26/47/3 31/264/3 30/17/3 +f 35/48/7 36/57/7 34/49/7 +f 39/51/8 40/56/8 37/52/8 +f 33/54/9 38/53/9 37/52/9 +f 35/48/10 37/52/10 40/56/10 +f 34/58/11 39/51/11 38/53/11 +f 36/60/12 40/56/12 39/51/12 +f 57/62/2 58/265/2 43/63/2 +f 47/65/2 48/266/2 45/66/2 +f 44/68/13 48/266/13 47/65/13 +f 64/70/1 63/88/1 60/71/1 +f 56/73/1 55/78/1 50/74/1 +f 51/76/13 58/265/13 57/62/13 +f 47/267/11 46/268/11 42/80/11 +f 46/268/11 50/269/11 42/80/11 +f 50/269/11 55/78/11 42/80/11 +f 59/81/10 43/93/10 51/82/10 +f 43/93/10 58/270/10 51/82/10 +f 51/82/10 62/84/10 64/70/10 +f 61/83/13 63/88/13 64/70/13 +f 52/77/2 61/83/2 62/84/2 +f 53/79/13 55/78/13 56/73/13 +f 42/69/2 53/79/2 54/85/2 +f 49/86/10 45/91/10 44/87/10 +f 45/91/10 48/271/10 44/87/10 +f 44/87/10 54/85/10 56/73/10 +f 57/272/11 41/273/11 52/89/11 +f 41/273/11 60/274/11 52/89/11 +f 60/274/11 63/88/11 52/89/11 +f 49/86/14 50/275/14 46/90/14 +f 59/81/14 60/276/14 41/92/14 +f 65/96/11 69/277/11 77/94/11 +f 69/277/11 80/278/11 77/94/11 +f 80/278/11 81/279/11 77/94/11 +f 72/95/11 75/280/11 65/96/11 +f 75/280/11 73/106/11 65/96/11 +f 66/97/15 70/127/15 69/98/15 +f 76/100/16 75/280/16 72/101/16 +f 78/103/10 82/114/10 79/116/10 +f 79/116/10 70/281/10 78/103/10 +f 70/281/10 66/104/10 78/103/10 +f 66/104/10 74/107/10 76/100/10 +f 66/104/10 76/100/10 71/105/10 +f 73/106/15 75/280/15 76/100/15 +f 65/99/17 73/106/17 74/107/17 +f 68/110/11 83/282/11 91/108/11 +f 83/282/11 94/283/11 91/108/11 +f 94/283/11 95/284/11 91/108/11 +f 86/109/11 89/285/11 68/110/11 +f 89/285/11 87/128/11 68/110/11 +f 71/111/18 72/286/18 77/112/18 +f 77/112/16 81/287/16 82/114/16 +f 82/114/18 81/287/18 80/115/18 +f 92/117/10 96/133/10 93/135/10 +f 93/135/10 84/288/10 92/117/10 +f 84/288/10 67/118/10 92/117/10 +f 67/118/10 88/129/10 90/120/10 +f 67/118/10 90/120/10 85/119/10 +f 90/120/16 89/285/16 86/121/16 +f 67/123/15 84/137/15 83/124/15 +f 79/126/17 80/289/17 69/98/17 +f 87/128/15 89/285/15 90/120/15 +f 68/125/17 87/128/17 88/129/17 +f 85/130/18 86/290/18 91/131/18 +f 91/131/16 95/291/16 96/133/16 +f 96/133/18 95/291/18 94/134/18 +f 93/136/17 94/292/17 83/124/17 +f 99/138/7 100/145/7 98/139/7 +f 103/141/8 104/144/8 101/142/8 +f 99/138/10 101/142/10 104/144/10 +f 97/146/11 98/293/11 103/141/11 +f 100/147/12 104/144/12 103/141/12 +f 107/149/1 108/294/1 106/150/1 +f 110/152/2 112/160/2 111/153/2 +f 108/155/3 112/160/3 110/152/3 +f 105/157/4 109/295/4 111/158/4 +f 107/159/5 111/158/5 112/160/5 +f 106/156/6 110/152/6 109/161/6 +f 115/163/19 116/169/19 113/164/19 +f 118/166/20 120/175/20 119/167/20 +f 116/169/21 120/175/21 118/170/21 +f 114/172/22 113/171/22 118/170/22 +f 115/163/23 114/296/23 117/174/23 +f 116/169/24 115/163/24 119/167/24 +f 123/176/11 124/182/11 121/177/11 +f 126/179/10 128/188/10 127/180/10 +f 124/182/14 128/188/14 126/183/14 +f 121/184/1 126/183/1 125/185/1 +f 122/187/13 125/297/13 127/180/13 +f 123/176/2 127/180/2 128/188/2 +f 131/189/21 132/195/21 129/190/21 +f 134/192/23 136/201/23 135/193/23 +f 132/195/25 136/201/25 134/196/25 +f 129/197/1 134/196/1 133/198/1 +f 130/200/26 133/298/26 135/193/26 +f 131/189/2 135/193/2 136/201/2 +f 139/202/14 140/209/14 138/203/14 +f 142/205/13 144/210/13 143/206/13 +f 137/208/11 141/299/11 143/206/11 +f 140/209/2 139/202/2 143/206/2 +f 140/209/10 144/210/10 142/211/10 +f 138/212/1 142/211/1 141/213/1 +f 146/215/27 145/300/27 147/216/27 +f 152/218/28 151/301/28 149/219/28 +f 146/215/29 148/217/29 152/218/29 +f 146/215/9 150/220/9 149/221/9 +f 145/223/30 149/302/30 151/224/30 +f 147/225/12 151/224/12 152/218/12 +f 158/226/27 155/230/27 156/227/27 +f 160/229/29 153/232/29 155/230/29 +f 159/231/28 154/303/28 153/232/28 +f 155/230/9 153/232/9 154/233/9 +f 159/235/30 157/228/30 156/227/30 +f 161/237/31 163/248/31 164/238/31 +f 168/240/32 167/247/32 165/241/32 +f 162/243/33 164/249/33 168/244/33 +f 162/246/9 166/304/9 165/241/9 +f 161/237/34 165/241/34 167/247/34 +f 164/249/12 163/248/12 167/247/12 +f 173/250/31 174/254/31 171/251/31 +f 176/253/33 169/305/33 171/251/33 +f 175/255/32 170/259/32 169/256/32 +f 172/252/9 171/306/9 169/258/9 +f 175/255/34 173/250/34 172/252/34 +o goober +v 0.250000 1.000000 3.250000 +v 0.750000 1.000000 3.250000 +v 0.250000 1.000000 2.750000 +v 0.750000 1.000000 2.750000 +v 0.250000 1.500000 3.250000 +v 0.750000 1.500000 3.250000 +v 0.250000 1.500000 2.750000 +v 0.750000 1.500000 2.750000 +v 0.750000 1.031250 3.093750 +v 0.750000 1.031250 2.906250 +v 0.750000 1.218750 3.093750 +v 0.750000 1.218750 2.906250 +v 0.937500 1.031250 3.093750 +v 0.937500 1.031250 2.906250 +v 0.937500 1.218750 3.093750 +v 0.937500 1.218750 2.906250 +v 0.593750 1.500000 2.937500 +v 0.593750 1.500000 2.812500 +v 0.406250 1.500000 2.937500 +v 0.406250 1.500000 2.812500 +v 0.406250 1.750000 2.937500 +v 0.593750 1.750000 2.937500 +v 0.593750 1.750000 2.812500 +v 0.406250 1.750000 2.812500 +v 0.593750 1.500000 3.187500 +v 0.593750 1.500000 3.062500 +v 0.406250 1.500000 3.187500 +v 0.406250 1.500000 3.062500 +v 0.406250 1.750000 3.187500 +v 0.593750 1.750000 3.187500 +v 0.593750 1.750000 3.062500 +v 0.406250 1.750000 3.062500 +v -0.625000 0.500000 3.250000 +v 0.625000 0.500000 3.250000 +v -0.625000 0.500000 2.750000 +v 0.625000 0.500000 2.750000 +v -0.625000 1.000000 2.750000 +v -0.625000 1.000000 3.250000 +v 0.625000 1.000000 3.250000 +v 0.625000 1.000000 2.750000 +v 0.250000 0.875000 3.312500 +v 0.500000 0.125000 2.937500 +v 0.250000 0.875000 3.062500 +v 0.500000 0.125000 2.687500 +v 0.250000 0.875000 2.687500 +v 0.250000 0.875000 2.937500 +v 0.500000 0.875000 2.937500 +v 0.500000 0.875000 2.687500 +v 0.250000 0.000000 2.687500 +v 0.250000 0.000000 2.937500 +v 0.500000 0.125000 3.062500 +v 0.500000 0.125000 3.312500 +v 0.625000 0.125000 2.937500 +v 0.625000 0.125000 2.687500 +v 0.625000 0.000000 2.937500 +v 0.625000 0.000000 2.687500 +v 0.500000 0.875000 3.312500 +v 0.500000 0.875000 3.062500 +v 0.250000 0.000000 3.062500 +v 0.250000 0.000000 3.312500 +v 0.625000 0.125000 3.312500 +v 0.625000 0.125000 3.062500 +v 0.625000 0.000000 3.312500 +v 0.625000 0.000000 3.062500 +v -0.312500 0.125000 2.937500 +v -0.312500 0.125000 2.687500 +v -0.312500 0.125000 3.062500 +v -0.312500 0.125000 3.312500 +v -0.312500 0.875000 2.937500 +v -0.312500 0.875000 2.687500 +v -0.562500 0.000000 2.687500 +v -0.562500 0.000000 2.937500 +v -0.187500 0.125000 2.937500 +v -0.187500 0.125000 2.687500 +v -0.187500 0.000000 2.937500 +v -0.187500 0.000000 2.687500 +v -0.562500 0.375000 2.937500 +v -0.562500 0.375000 2.687500 +v -0.687500 0.875000 2.687500 +v -0.687500 0.875000 2.937500 +v -0.687500 0.375000 2.937500 +v -0.687500 0.375000 2.687500 +v -0.312500 0.875000 3.312500 +v -0.312500 0.875000 3.062500 +v -0.562500 0.000000 3.062500 +v -0.562500 0.000000 3.312500 +v -0.187500 0.125000 3.312500 +v -0.187500 0.125000 3.062500 +v -0.187500 0.000000 3.312500 +v -0.187500 0.000000 3.062500 +v -0.562500 0.375000 3.312500 +v -0.562500 0.375000 3.062500 +v -0.687500 0.875000 3.062500 +v -0.687500 0.875000 3.312500 +v -0.687500 0.375000 3.312500 +v -0.687500 0.375000 3.062500 +v -0.093750 0.468750 3.281250 +v 0.656250 0.468750 3.281250 +v -0.093750 0.468750 2.718750 +v 0.656250 0.468750 2.718750 +v -0.093750 1.031250 2.718750 +v -0.093750 1.031250 3.281250 +v 0.656250 1.031250 3.281250 +v 0.656250 1.031250 2.718750 +v 0.218750 0.968750 3.281250 +v 0.781250 0.968750 3.281250 +v 0.218750 0.968750 2.718750 +v 0.781250 0.968750 2.718750 +v 0.218750 1.531250 3.281250 +v 0.781250 1.531250 3.281250 +v 0.218750 1.531250 2.718750 +v 0.781250 1.531250 2.718750 +v -0.625000 0.812500 3.062500 +v -0.625000 0.812500 2.937500 +v -0.625000 0.937500 2.937500 +v -0.625000 0.937500 3.062500 +v -1.125000 0.812500 2.937500 +v -1.125000 0.812500 3.062500 +v -1.125000 0.937500 2.937500 +v -1.125000 0.937500 3.062500 +v -1.125000 0.812500 3.062500 +v -1.125000 0.812500 2.937500 +v -1.125000 0.937500 2.937500 +v -1.125000 0.937500 3.062500 +v -1.625000 0.812500 2.937500 +v -1.625000 0.812500 3.062500 +v -1.625000 0.937500 2.937500 +v -1.625000 0.937500 3.062500 +v -1.625000 0.812500 3.062500 +v -1.625000 0.812500 2.937500 +v -1.625000 0.937500 2.937500 +v -1.625000 0.937500 3.062500 +v -2.125000 0.812500 2.937500 +v -2.125000 0.812500 3.062500 +v -2.125000 0.937500 2.937500 +v -2.125000 0.937500 3.062500 +v -2.125000 0.750000 2.875000 +v -2.125000 0.750000 3.125000 +v -2.125000 1.000000 2.875000 +v -2.125000 1.000000 3.125000 +v -2.625000 0.750000 2.875000 +v -2.625000 0.750000 3.125000 +v -2.625000 1.000000 2.875000 +v -2.625000 1.000000 3.125000 +v 0.187500 1.000000 2.750000 +v 0.187500 1.000000 2.625000 +v 0.312500 1.000000 2.750000 +v 0.312500 1.000000 2.625000 +v 0.187500 0.625000 2.750000 +v 0.187500 0.625000 2.625000 +v 0.312500 0.625000 2.750000 +v 0.312500 0.625000 2.625000 +v -0.312500 0.656250 2.656250 +v -0.312500 0.656250 2.718750 +v -0.312500 0.968750 2.656250 +v -0.312500 0.968750 2.718750 +v 0.187500 0.968750 2.718750 +v 0.187500 0.968750 2.656250 +v 0.187500 0.656250 2.718750 +v 0.187500 0.656250 2.656250 +v 0.187500 1.000000 3.375000 +v 0.187500 1.000000 3.250000 +v 0.312500 1.000000 3.375000 +v 0.312500 1.000000 3.250000 +v 0.187500 0.625000 3.375000 +v 0.187500 0.625000 3.250000 +v 0.312500 0.625000 3.375000 +v 0.312500 0.625000 3.250000 +v -0.312500 0.656250 3.281250 +v -0.312500 0.656250 3.343750 +v -0.312500 0.968750 3.281250 +v -0.312500 0.968750 3.343750 +v 0.187500 0.968750 3.343750 +v 0.187500 0.968750 3.281250 +v 0.187500 0.656250 3.343750 +v 0.187500 0.656250 3.281250 +vt 0.187500 0.875000 +vt 0.125000 1.000000 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.125000 1.000000 +vt 0.062500 1.000000 +vt 0.125000 0.750000 +vt 0.062500 0.750000 +vt 0.250000 0.750000 +vt 0.187500 0.875000 +vt 0.187500 0.750000 +vt 0.125000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.750000 +vt 0.250000 0.968750 +vt 0.226562 0.937500 +vt 0.250000 0.937500 +vt 0.484375 0.640625 +vt 0.460938 0.687500 +vt 0.460938 0.640625 +vt 0.437500 0.640625 +vt 0.437500 0.687500 +vt 0.460938 0.734375 +vt 0.484375 0.687500 +vt 0.484375 0.734375 +vt 0.507812 0.687500 +vt 0.507812 0.640625 +vt 0.484375 0.593750 +vt 0.460938 0.593750 +vt 0.226562 0.937500 +vt 0.250000 0.968750 +vt 0.226562 0.968750 +vt 0.250000 0.875000 +vt 0.226562 0.875000 +vt 0.210938 0.875000 +vt 0.187500 0.937500 +vt 0.187500 0.875000 +vt 0.265625 0.875000 +vt 0.250000 0.937500 +vt 0.210938 0.937500 +vt 0.210938 0.875000 +vt 0.187500 0.937500 +vt 0.187500 0.875000 +vt 0.250000 0.875000 +vt 0.226562 0.875000 +vt 0.210938 0.937500 +vt 0.265625 0.875000 +vt 0.218750 0.375000 +vt 0.062500 0.250000 +vt 0.218750 0.250000 +vt 0.062500 0.625000 +vt 0.218750 0.500000 +vt 0.218750 0.625000 +vt 0.281250 0.625000 +vt 0.281250 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.375000 +vt 0.062500 0.750000 +vt 0.218750 0.750000 +vt -0.000000 0.500000 +vt -0.000000 0.625000 +vt 0.546875 0.937500 +vt 0.578125 1.000000 +vt 0.546875 1.000000 +vt 0.703125 0.937500 +vt 0.734375 1.000000 +vt 0.703125 1.000000 +vt 0.734375 0.750000 +vt 0.703125 0.750000 +vt 0.578125 0.687500 +vt 0.546875 0.593750 +vt 0.578125 0.593750 +vt 0.734375 0.687500 +vt 0.703125 0.593750 +vt 0.734375 0.593750 +vt 0.578125 0.750000 +vt 0.546875 0.750000 +vt 0.703125 0.687500 +vt 0.703125 0.718750 +vt 0.687500 0.718750 +vt 0.625000 0.687500 +vt 0.593750 0.718750 +vt 0.546875 0.718750 +vt 0.578125 0.718750 +vt 0.734375 0.718750 +vt 0.781250 0.687500 +vt 0.750000 0.718750 +vt 0.546875 0.687500 +vt 0.531250 0.718750 +vt 0.812500 0.906250 +vt 0.781250 0.906250 +vt 0.656250 0.906250 +vt 0.625000 0.906250 +vt 0.640625 0.343750 +vt 0.640625 0.250000 +vt 0.671875 0.281250 +vt 0.718750 0.312500 +vt 0.687500 0.500000 +vt 0.687500 0.312500 +vt 0.718750 0.250000 +vt 0.687500 0.156250 +vt 0.718750 0.156250 +vt 0.765625 0.343750 +vt 0.734375 0.281250 +vt 0.765625 0.250000 +vt 0.687500 0.281250 +vt 0.718750 0.281250 +vt 0.453125 0.343750 +vt 0.453125 0.250000 +vt 0.484375 0.281250 +vt 0.781250 0.218750 +vt 0.812500 0.312500 +vt 0.781250 0.312500 +vt 0.781250 0.343750 +vt 0.812500 0.468750 +vt 0.781250 0.468750 +vt 0.578125 0.343750 +vt 0.546875 0.281250 +vt 0.578125 0.250000 +vt 0.531250 0.250000 +vt 0.500000 0.156250 +vt 0.531250 0.156250 +vt 0.531250 0.312500 +vt 0.500000 0.500000 +vt 0.500000 0.312500 +vt 0.718750 0.593750 +vt 0.718750 0.500000 +vt 0.500000 0.281250 +vt 0.531250 0.281250 +vt 0.593750 0.218750 +vt 0.625000 0.312500 +vt 0.593750 0.312500 +vt 0.593750 0.343750 +vt 0.625000 0.468750 +vt 0.593750 0.468750 +vt 0.531250 0.593750 +vt 0.531250 0.500000 +vt 0.429688 0.375000 +vt 0.343750 0.250000 +vt 0.429688 0.250000 +vt 0.343750 0.625000 +vt 0.429688 0.500000 +vt 0.429688 0.625000 +vt 0.343750 0.500000 +vt 0.343750 0.375000 +vt 0.343750 0.750000 +vt 0.429688 0.750000 +vt 0.281250 0.500000 +vt 0.281250 0.625000 +vt 0.437500 0.875000 +vt 0.375000 1.000000 +vt 0.375000 0.875000 +vt 0.312500 0.875000 +vt 0.375000 1.000000 +vt 0.312500 1.000000 +vt 0.375000 0.750000 +vt 0.312500 0.750000 +vt 0.500000 0.750000 +vt 0.437500 0.875000 +vt 0.437500 0.750000 +vt 0.375000 0.875000 +vt 0.250000 0.875000 +vt 0.250000 0.750000 +vt 0.046875 0.093750 +vt 0.031250 0.062500 +vt 0.046875 0.062500 +vt 0.031250 0.250000 +vt 0.046875 0.218750 +vt 0.046875 0.250000 +vt 0.031250 0.093750 +vt 0.015625 0.218750 +vt 0.015625 0.093750 +vt 0.000000 0.218750 +vt 0.000000 0.093750 +vt 0.062500 0.093750 +vt 0.031250 0.218750 +vt 0.109375 0.093750 +vt 0.093750 0.062500 +vt 0.109375 0.062500 +vt 0.093750 0.250000 +vt 0.109375 0.218750 +vt 0.109375 0.250000 +vt 0.093750 0.093750 +vt 0.078125 0.218750 +vt 0.078125 0.093750 +vt 0.062500 0.218750 +vt 0.062500 0.093750 +vt 0.125000 0.093750 +vt 0.093750 0.218750 +vt 0.171875 0.093750 +vt 0.156250 0.062500 +vt 0.171875 0.062500 +vt 0.156250 0.250000 +vt 0.171875 0.218750 +vt 0.171875 0.250000 +vt 0.156250 0.093750 +vt 0.140625 0.218750 +vt 0.140625 0.093750 +vt 0.125000 0.218750 +vt 0.125000 0.093750 +vt 0.187500 0.093750 +vt 0.156250 0.218750 +vt 0.281250 0.125000 +vt 0.250000 0.062500 +vt 0.281250 0.062500 +vt 0.250000 0.312500 +vt 0.281250 0.250000 +vt 0.281250 0.312500 +vt 0.312500 0.125000 +vt 0.250000 0.250000 +vt 0.250000 0.125000 +vt 0.218750 0.250000 +vt 0.218750 0.125000 +vt 0.187500 0.250000 +vt 0.187500 0.125000 +vt 0.046875 0.500000 +vt 0.031250 0.468750 +vt 0.046875 0.468750 +vt 0.031250 0.375000 +vt 0.046875 0.343750 +vt 0.046875 0.375000 +vt 0.062500 0.375000 +vt 0.062500 0.468750 +vt -0.000000 0.468750 +vt 0.015625 0.375000 +vt 0.015625 0.468750 +vt 0.218750 0.406250 +vt 0.281250 0.421875 +vt 0.218750 0.421875 +vt 0.218750 0.328125 +vt 0.281250 0.406250 +vt 0.218750 0.312500 +vt 0.281250 0.328125 +vt 0.289062 0.328125 +vt 0.289062 0.406250 +vt 0.281250 0.500000 +vt 0.218750 0.500000 +vt 0.046875 0.468750 +vt 0.031250 0.500000 +vt 0.046875 0.500000 +vt 0.031250 0.343750 +vt 0.046875 0.375000 +vt 0.046875 0.343750 +vt 0.015625 0.468750 +vt 0.000000 0.375000 +vt 0.000000 0.468750 +vt 0.062500 0.468750 +vt 0.031250 0.375000 +vt 0.031250 0.468750 +vt 0.015625 0.375000 +vt 0.218750 0.421875 +vt 0.281250 0.406250 +vt 0.218750 0.406250 +vt 0.218750 0.500000 +vt 0.281250 0.421875 +vt 0.218750 0.328125 +vt 0.281250 0.312500 +vt 0.218750 0.312500 +vt 0.289062 0.406250 +vt 0.281250 0.328125 +vt 0.187500 1.000000 +vt 0.250000 0.875000 +vt 0.226562 0.968750 +vt 0.265625 0.937500 +vt 0.265625 0.937500 +vt 0.578125 0.937500 +vt 0.734375 0.937500 +vt 0.687500 0.906250 +vt 0.656250 0.906250 +vt 0.656250 0.687500 +vt 0.593750 0.906250 +vt 0.750000 0.906250 +vt 0.531250 0.906250 +vt 0.500000 0.906250 +vt 0.500000 0.687500 +vt 0.812500 0.687500 +vt 0.656250 0.687500 +vt 0.671875 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.343750 +vt 0.687500 0.250000 +vt 0.734375 0.468750 +vt 0.484375 0.468750 +vt 0.437500 0.468750 +vt 0.437500 0.343750 +vt 0.500000 0.250000 +vt 0.812500 0.218750 +vt 0.812500 0.343750 +vt 0.546875 0.468750 +vt 0.687500 0.593750 +vt 0.625000 0.218750 +vt 0.625000 0.343750 +vt 0.500000 0.593750 +vt 0.437500 1.000000 +vt 0.500000 0.875000 +vt 0.062500 0.218750 +vt 0.125000 0.218750 +vt 0.187500 0.218750 +vt 0.312500 0.250000 +vt 0.031250 0.500000 +vt 0.031250 0.343750 +vt -0.000000 0.375000 +vt 0.281250 0.312500 +vt 0.062500 0.375000 +vt 0.281250 0.500000 +vt 0.289062 0.328125 +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 179/307/35 178/308/35 177/309/35 +f 182/310/36 183/311/36 181/312/36 +f 180/313/37 182/310/37 178/314/37 +f 177/315/38 183/316/38 179/317/38 +f 179/317/39 184/318/39 180/313/39 +f 178/314/40 181/319/40 177/320/40 +f 207/321/36 205/322/36 206/323/36 +f 190/324/37 191/325/37 189/326/37 +f 185/327/40 191/325/40 187/328/40 +f 187/329/36 192/330/36 188/331/36 +f 188/332/39 190/324/39 186/333/39 +f 186/334/35 189/326/35 185/335/35 +f 199/336/36 197/337/36 198/338/36 +f 196/339/39 199/336/39 194/340/39 +f 193/341/40 197/342/40 195/343/40 +f 195/344/38 200/345/38 196/339/38 +f 194/340/37 198/346/37 193/341/37 +f 204/347/39 207/348/39 202/349/39 +f 201/350/40 205/322/40 203/351/40 +f 203/351/38 208/352/38 204/347/38 +f 202/353/37 206/323/37 201/350/37 +f 211/354/35 210/355/35 209/356/35 +f 215/357/36 213/358/36 214/359/36 +f 209/360/38 213/358/38 211/361/38 +f 211/354/39 216/362/39 212/363/39 +f 210/364/40 214/359/40 209/365/40 +f 212/366/37 215/357/37 210/367/37 +f 233/368/36 219/369/36 217/370/36 +f 223/371/36 221/372/36 222/373/36 +f 220/374/37 223/371/37 218/375/37 +f 240/376/35 236/377/35 235/378/35 +f 232/379/35 226/380/35 225/381/35 +f 227/382/37 233/368/37 228/383/37 +f 231/384/40 229/385/40 218/386/40 +f 235/387/39 227/388/39 240/376/39 +f 237/389/37 240/376/37 238/390/37 +f 228/383/36 238/390/36 227/382/36 +f 229/385/37 232/379/37 230/391/37 +f 218/375/36 230/391/36 220/374/36 +f 225/392/39 220/393/39 232/379/39 +f 239/394/40 237/389/40 228/395/40 +f 225/392/38 222/396/38 221/397/38 +f 235/387/38 217/398/38 219/399/38 +f 253/400/40 248/401/40 241/402/40 +f 242/403/37 245/404/37 241/405/37 +f 252/406/35 248/407/35 247/408/35 +f 254/409/39 242/410/39 247/411/39 +f 249/412/37 252/406/37 250/413/37 +f 241/405/36 250/413/36 242/403/36 +f 267/414/40 262/415/40 244/416/40 +f 247/417/38 253/418/38 254/419/38 +f 253/418/35 258/420/35 254/419/35 +f 258/420/38 256/421/38 255/422/38 +f 268/423/39 243/424/39 261/425/39 +f 266/426/35 262/427/35 261/428/35 +f 243/429/37 259/430/37 244/431/37 +f 255/432/36 245/404/36 246/433/36 +f 263/434/37 266/426/37 264/435/37 +f 244/431/36 264/435/36 243/429/36 +f 261/436/38 267/437/38 268/438/38 +f 267/437/35 272/439/35 268/438/35 +f 272/439/38 270/440/38 269/441/38 +f 269/442/36 259/430/36 260/443/36 +f 275/444/35 274/445/35 273/446/35 +f 279/447/36 277/448/36 278/449/36 +f 275/444/39 280/450/39 276/451/39 +f 274/452/40 278/449/40 273/453/40 +f 276/454/37 279/447/37 274/455/37 +f 283/456/35 282/457/35 281/458/35 +f 286/459/36 287/460/36 285/461/36 +f 284/462/37 286/459/37 282/463/37 +f 281/464/38 287/465/38 283/466/38 +f 283/466/39 288/467/39 284/462/39 +f 282/463/40 285/468/40 281/469/40 +f 291/470/37 289/471/37 290/472/37 +f 294/473/38 295/474/38 293/475/38 +f 292/476/40 294/477/40 289/478/40 +f 289/478/35 293/479/35 290/480/35 +f 290/481/39 295/474/39 291/470/39 +f 291/470/36 296/482/36 292/476/36 +f 299/483/37 297/484/37 298/485/37 +f 302/486/38 303/487/38 301/488/38 +f 300/489/40 302/490/40 297/491/40 +f 297/491/35 301/492/35 298/493/35 +f 298/494/39 303/487/39 299/483/39 +f 299/483/36 304/495/36 300/489/36 +f 307/496/37 305/497/37 306/498/37 +f 310/499/38 311/500/38 309/501/38 +f 308/502/40 310/503/40 305/504/40 +f 305/504/35 309/505/35 306/506/35 +f 306/507/39 311/500/39 307/496/39 +f 307/496/36 312/508/36 308/502/36 +f 315/509/37 314/510/37 313/511/37 +f 318/512/38 319/513/38 317/514/38 +f 313/515/39 319/513/39 315/509/39 +f 315/509/36 320/516/36 316/517/36 +f 316/517/40 318/518/40 314/519/40 +f 314/519/35 317/520/35 313/521/35 +f 321/522/36 324/523/36 322/524/36 +f 328/525/35 325/526/35 326/527/35 +f 324/523/39 326/527/39 322/524/39 +f 322/524/38 325/528/38 321/529/38 +f 321/530/40 327/531/40 323/532/40 +f 323/532/37 328/525/37 324/523/37 +f 334/533/36 332/534/36 333/535/36 +f 336/536/39 331/537/39 334/533/39 +f 335/538/35 329/539/35 336/536/35 +f 331/537/38 330/540/38 332/541/38 +f 333/535/40 330/542/40 335/543/40 +f 337/544/36 340/545/36 338/546/36 +f 344/547/35 341/548/35 342/549/35 +f 340/550/39 342/551/39 338/552/39 +f 338/553/38 341/548/38 337/544/38 +f 337/544/40 343/554/40 339/555/40 +f 339/555/37 344/556/37 340/550/37 +f 350/557/36 348/558/36 349/559/36 +f 352/560/39 347/561/39 350/557/39 +f 351/562/35 345/563/35 352/564/35 +f 347/565/38 346/566/38 348/558/38 +f 349/559/40 346/566/40 351/562/40 +f 179/307/35 180/567/35 178/308/35 +f 182/310/36 184/318/36 183/311/36 +f 180/313/37 184/318/37 182/310/37 +f 177/315/38 181/568/38 183/316/38 +f 179/317/39 183/316/39 184/318/39 +f 178/314/40 182/310/40 181/319/40 +f 207/321/36 208/569/36 205/322/36 +f 190/324/37 192/330/37 191/325/37 +f 185/327/40 189/326/40 191/325/40 +f 187/329/36 191/325/36 192/330/36 +f 188/332/39 192/330/39 190/324/39 +f 186/334/35 190/324/35 189/326/35 +f 199/336/36 200/345/36 197/337/36 +f 196/339/39 200/345/39 199/336/39 +f 193/341/40 198/346/40 197/342/40 +f 195/344/38 197/570/38 200/345/38 +f 194/340/37 199/336/37 198/346/37 +f 204/347/39 208/352/39 207/348/39 +f 201/350/40 206/323/40 205/322/40 +f 203/351/38 205/322/38 208/352/38 +f 202/353/37 207/571/37 206/323/37 +f 211/354/35 212/363/35 210/355/35 +f 215/357/36 216/362/36 213/358/36 +f 209/360/38 214/359/38 213/358/38 +f 211/354/39 213/358/39 216/362/39 +f 210/364/40 215/357/40 214/359/40 +f 212/366/37 216/362/37 215/357/37 +f 233/368/36 234/572/36 219/369/36 +f 223/371/36 224/573/36 221/372/36 +f 220/374/37 224/573/37 223/371/37 +f 240/376/35 239/394/35 236/377/35 +f 232/379/35 231/384/35 226/380/35 +f 227/382/37 234/572/37 233/368/37 +f 223/574/40 222/575/40 218/386/40 +f 222/575/40 226/576/40 218/386/40 +f 226/576/40 231/384/40 218/386/40 +f 235/387/39 219/399/39 227/388/39 +f 219/399/39 234/577/39 227/388/39 +f 227/388/39 238/390/39 240/376/39 +f 237/389/37 239/394/37 240/376/37 +f 228/383/36 237/389/36 238/390/36 +f 229/385/37 231/384/37 232/379/37 +f 218/375/36 229/385/36 230/391/36 +f 225/392/39 221/397/39 220/393/39 +f 221/397/39 224/578/39 220/393/39 +f 220/393/39 230/391/39 232/379/39 +f 233/579/40 217/580/40 228/395/40 +f 217/580/40 236/581/40 228/395/40 +f 236/581/40 239/394/40 228/395/40 +f 225/392/38 226/582/38 222/396/38 +f 235/387/38 236/583/38 217/398/38 +f 241/402/40 245/584/40 253/400/40 +f 245/584/40 256/585/40 253/400/40 +f 256/585/40 257/586/40 253/400/40 +f 248/401/40 251/587/40 241/402/40 +f 251/587/40 249/412/40 241/402/40 +f 242/403/37 246/433/37 245/404/37 +f 252/406/35 251/587/35 248/407/35 +f 254/409/39 258/420/39 255/422/39 +f 255/422/39 246/588/39 254/409/39 +f 246/588/39 242/410/39 254/409/39 +f 242/410/39 250/413/39 252/406/39 +f 242/410/39 252/406/39 247/411/39 +f 249/412/37 251/587/37 252/406/37 +f 241/405/36 249/412/36 250/413/36 +f 244/416/40 259/589/40 267/414/40 +f 259/589/40 270/590/40 267/414/40 +f 270/590/40 271/591/40 267/414/40 +f 262/415/40 265/592/40 244/416/40 +f 265/592/40 263/434/40 244/416/40 +f 247/417/38 248/593/38 253/418/38 +f 253/418/35 257/594/35 258/420/35 +f 258/420/38 257/594/38 256/421/38 +f 268/423/39 272/439/39 269/441/39 +f 269/441/39 260/595/39 268/423/39 +f 260/595/39 243/424/39 268/423/39 +f 243/424/39 264/435/39 266/426/39 +f 243/424/39 266/426/39 261/425/39 +f 266/426/35 265/592/35 262/427/35 +f 243/429/37 260/443/37 259/430/37 +f 255/432/36 256/596/36 245/404/36 +f 263/434/37 265/592/37 266/426/37 +f 244/431/36 263/434/36 264/435/36 +f 261/436/38 262/597/38 267/437/38 +f 267/437/35 271/598/35 272/439/35 +f 272/439/38 271/598/38 270/440/38 +f 269/442/36 270/599/36 259/430/36 +f 275/444/35 276/451/35 274/445/35 +f 279/447/36 280/450/36 277/448/36 +f 275/444/39 277/448/39 280/450/39 +f 274/452/40 279/447/40 278/449/40 +f 276/454/37 280/450/37 279/447/37 +f 283/456/35 284/600/35 282/457/35 +f 286/459/36 288/467/36 287/460/36 +f 284/462/37 288/467/37 286/459/37 +f 281/464/38 285/601/38 287/465/38 +f 283/466/39 287/465/39 288/467/39 +f 282/463/40 286/459/40 285/468/40 +f 291/470/37 292/476/37 289/471/37 +f 294/473/38 296/482/38 295/474/38 +f 292/476/40 296/482/40 294/477/40 +f 289/478/35 294/477/35 293/479/35 +f 290/481/39 293/602/39 295/474/39 +f 291/470/36 295/474/36 296/482/36 +f 299/483/37 300/489/37 297/484/37 +f 302/486/38 304/495/38 303/487/38 +f 300/489/40 304/495/40 302/490/40 +f 297/491/35 302/490/35 301/492/35 +f 298/494/39 301/603/39 303/487/39 +f 299/483/36 303/487/36 304/495/36 +f 307/496/37 308/502/37 305/497/37 +f 310/499/38 312/508/38 311/500/38 +f 308/502/40 312/508/40 310/503/40 +f 305/504/35 310/503/35 309/505/35 +f 306/507/39 309/604/39 311/500/39 +f 307/496/36 311/500/36 312/508/36 +f 315/509/37 316/517/37 314/510/37 +f 318/512/38 320/516/38 319/513/38 +f 313/515/39 317/605/39 319/513/39 +f 315/509/36 319/513/36 320/516/36 +f 316/517/40 320/516/40 318/518/40 +f 314/519/35 318/518/35 317/520/35 +f 321/522/36 323/606/36 324/523/36 +f 328/525/35 327/607/35 325/526/35 +f 324/523/39 328/525/39 326/527/39 +f 322/524/38 326/527/38 325/528/38 +f 321/530/40 325/608/40 327/531/40 +f 323/532/37 327/531/37 328/525/37 +f 334/533/36 331/537/36 332/534/36 +f 336/536/39 329/539/39 331/537/39 +f 335/538/35 330/609/35 329/539/35 +f 331/537/38 329/539/38 330/540/38 +f 333/535/40 332/534/40 330/542/40 +f 337/544/36 339/555/36 340/545/36 +f 344/547/35 343/554/35 341/548/35 +f 340/550/39 344/556/39 342/551/39 +f 338/553/38 342/610/38 341/548/38 +f 337/544/40 341/548/40 343/554/40 +f 339/555/37 343/554/37 344/556/37 +f 350/557/36 347/561/36 348/558/36 +f 352/560/39 345/611/39 347/561/39 +f 351/562/35 346/566/35 345/563/35 +f 347/565/38 345/612/38 346/566/38 +f 349/559/40 348/558/40 346/566/40 diff --git a/src/main/resources/assets/hbm/models/trinkets/pooh.obj b/src/main/resources/assets/hbm/models/trinkets/pooh.obj deleted file mode 100644 index 958bfc3e9..000000000 --- a/src/main/resources/assets/hbm/models/trinkets/pooh.obj +++ /dev/null @@ -1,334 +0,0 @@ -# Blender v2.79 (sub 0) OBJ File: 'pooh.blend' -# www.blender.org -o Cube_Cube.001 -v -0.250000 0.062500 0.250000 -v 0.250000 0.062500 0.250000 -v -0.250000 0.062500 -0.250000 -v 0.250000 0.062500 -0.250000 -v -0.250000 0.437500 0.250000 -v 0.250000 0.437500 0.250000 -v -0.250000 0.437500 -0.250000 -v 0.250000 0.437500 -0.250000 -v -0.187500 0.437500 0.187500 -v 0.187500 0.437500 0.187500 -v -0.187500 0.437500 -0.187500 -v 0.187500 0.437500 -0.187500 -v -0.187500 0.625000 -0.187500 -v -0.187500 0.625000 0.187500 -v 0.187500 0.625000 0.187500 -v 0.187500 0.625000 -0.187500 -v -0.250000 0.625000 0.250000 -v 0.250000 0.625000 0.250000 -v -0.250000 0.625000 -0.250000 -v 0.250000 0.625000 -0.250000 -v -0.250000 1.125000 -0.250000 -v -0.250000 1.125000 0.250000 -v 0.250000 1.125000 0.250000 -v 0.250000 1.125000 -0.250000 -v -0.125000 0.000000 -0.062500 -v 0.500000 0.000000 -0.062500 -v -0.125000 0.000000 -0.187500 -v 0.500000 0.000000 -0.187500 -v -0.125000 0.125000 -0.187500 -v -0.125000 0.125000 -0.062500 -v 0.500000 0.125000 -0.062500 -v 0.500000 0.125000 -0.187500 -v -0.125000 0.000000 0.187500 -v 0.500000 0.000000 0.187500 -v -0.125000 0.000000 0.062500 -v 0.500000 0.000000 0.062500 -v -0.125000 0.125000 0.062500 -v -0.125000 0.125000 0.187500 -v 0.500000 0.125000 0.187500 -v 0.500000 0.125000 0.062500 -v -0.062500 0.606694 -0.169194 -v 0.062500 0.606694 -0.169194 -v -0.062500 0.518306 -0.080806 -v 0.062500 0.518306 -0.080806 -v -0.062500 0.253141 -0.345971 -v -0.062500 0.341529 -0.434359 -v 0.062500 0.341529 -0.434359 -v 0.062500 0.253141 -0.345971 -v -0.062500 0.606694 0.169194 -v 0.062500 0.606694 0.169194 -v -0.062500 0.518306 0.080806 -v 0.062500 0.518306 0.080806 -v -0.062500 0.253141 0.345971 -v -0.062500 0.341529 0.434359 -v 0.062500 0.341529 0.434359 -v 0.062500 0.253141 0.345971 -v 0.250000 0.781250 0.031250 -v 0.250000 0.718750 0.031250 -v 0.250000 0.781250 -0.031250 -v 0.250000 0.718750 -0.031250 -v 0.312500 0.781250 -0.031250 -v 0.312500 0.781250 0.031250 -v 0.312500 0.718750 0.031250 -v 0.312500 0.718750 -0.031250 -v -0.093750 1.062500 -0.125000 -v 0.093750 1.062500 -0.125000 -v -0.093750 1.062500 -0.312500 -v 0.093750 1.062500 -0.312500 -v -0.093750 1.250000 -0.312500 -v -0.093750 1.250000 -0.125000 -v 0.093750 1.250000 -0.125000 -v 0.093750 1.250000 -0.312500 -v -0.093750 1.062500 0.312500 -v 0.093750 1.062500 0.312500 -v -0.093750 1.062500 0.125000 -v 0.093750 1.062500 0.125000 -v -0.093750 1.250000 0.125000 -v -0.093750 1.250000 0.312500 -v 0.093750 1.250000 0.312500 -v 0.093750 1.250000 0.125000 -vt 0.400000 -0.000000 -vt 0.200000 0.173913 -vt 0.200000 -0.000000 -vt 0.200000 0.304348 -vt 0.400000 0.478261 -vt 0.200000 0.478261 -vt 0.600000 0.173913 -vt 0.400000 0.304348 -vt 0.400000 0.173913 -vt 0.000000 0.304348 -vt 0.000000 0.173913 -vt 0.800000 0.173913 -vt 0.600000 0.304348 -vt 0.700000 0.304348 -vt 0.550000 0.369565 -vt 0.550000 0.304348 -vt 1.000000 0.304348 -vt 0.850000 0.369565 -vt 0.850000 0.304348 -vt 0.700000 0.369565 -vt 0.400000 0.369565 -vt 0.400000 0.304348 -vt 0.400000 0.478261 -vt 0.200000 0.652174 -vt 0.200000 0.478261 -vt 0.200000 0.826087 -vt 0.400000 1.000000 -vt 0.200000 1.000000 -vt 0.600000 0.652174 -vt 0.400000 0.826087 -vt 0.400000 0.652174 -vt -0.000000 0.826087 -vt -0.000000 0.652174 -vt 0.800000 0.652174 -vt 0.600000 0.826087 -vt 0.900000 0.260870 -vt 0.950000 0.043478 -vt 0.950000 0.260870 -vt 0.800000 0.043478 -vt 0.850000 0.260870 -vt 0.800000 0.260870 -vt 0.850000 -0.000000 -vt 0.800000 0.000000 -vt 0.800000 0.304348 -vt 0.850000 0.304348 -vt 0.850000 0.043478 -vt 0.900000 0.043478 -vt 1.000000 0.260870 -vt 0.900000 0.260870 -vt 0.950000 0.043478 -vt 0.950000 0.260870 -vt 0.800000 0.043478 -vt 0.850000 0.260870 -vt 0.800000 0.260870 -vt 0.850000 -0.000000 -vt 0.800000 0.000000 -vt 0.800000 0.304348 -vt 0.850000 0.304348 -vt 0.850000 0.043478 -vt 0.900000 0.043478 -vt 1.000000 0.260870 -vt 0.550000 0.369565 -vt 0.475000 0.434783 -vt 0.475000 0.369565 -vt 0.400000 0.043478 -vt 0.450000 0.000000 -vt 0.450000 0.043478 -vt 0.600000 0.173913 -vt 0.550000 0.043478 -vt 0.600000 0.043478 -vt 0.450000 0.173913 -vt 0.500000 0.043478 -vt 0.500000 0.173913 -vt 0.550000 0.173913 -vt 0.400000 0.173913 -vt 0.400000 0.000000 -vt 0.450000 0.043478 -vt 0.400000 0.043478 -vt 0.500000 0.173913 -vt 0.450000 0.173913 -vt 0.550000 0.043478 -vt 0.600000 0.173913 -vt 0.550000 0.173913 -vt 0.500000 0.043478 -vt 0.400000 0.173913 -vt 0.425000 0.521739 -vt 0.450000 0.543478 -vt 0.425000 0.543478 -vt 0.425000 0.565217 -vt 0.450000 0.565217 -vt 0.475000 0.543478 -vt 0.450000 0.521739 -vt 0.475000 0.521739 -vt 0.400000 0.521739 -vt 0.400000 0.543478 -vt 0.450000 0.500000 -vt 0.425000 0.500000 -vt 0.475000 0.500000 -vt 0.550000 0.565217 -vt 0.475000 0.565217 -vt 0.550000 0.434783 -vt 0.700000 0.434783 -vt 0.625000 0.500000 -vt 0.625000 0.434783 -vt 0.550000 0.500000 -vt 0.400000 0.500000 -vt 0.400000 0.434783 -vt 0.550000 0.369565 -vt 0.475000 0.434783 -vt 0.475000 0.369565 -vt 0.475000 0.500000 -vt 0.550000 0.565217 -vt 0.475000 0.565217 -vt 0.550000 0.434783 -vt 0.700000 0.434783 -vt 0.625000 0.500000 -vt 0.625000 0.434783 -vt 0.550000 0.500000 -vt 0.400000 0.500000 -vt 0.400000 0.434783 -vt 0.800000 0.304348 -vt 1.000000 0.369565 -vt 0.800000 0.826087 -vt 1.000000 0.043478 -vt 1.000000 0.043478 -vt 0.400000 0.000000 -vt 0.450000 0.000000 -vt 0.600000 0.043478 -vt 0.700000 0.500000 -vt 0.700000 0.500000 -vn 0.0000 -1.0000 0.0000 -vn 0.0000 1.0000 0.0000 -vn 0.0000 0.0000 -1.0000 -vn 0.0000 0.0000 1.0000 -vn 1.0000 0.0000 0.0000 -vn -1.0000 0.0000 0.0000 -vn 0.0000 -0.7071 -0.7071 -vn 0.0000 -0.7071 0.7071 -vn 0.0000 0.7071 -0.7071 -vn 0.0000 0.7071 0.7071 -s off -f 3/1/1 2/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/2/4 5/10/4 1/11/4 -f 4/9/5 6/4/5 2/2/5 -f 1/12/6 7/13/6 3/7/6 -f 12/14/5 15/15/5 10/16/5 -f 9/17/6 13/18/6 11/19/6 -f 11/19/3 16/20/3 12/14/3 -f 10/16/4 14/21/4 9/22/4 -f 19/23/1 18/24/1 17/25/1 -f 23/26/2 21/27/2 22/28/2 -f 19/29/3 24/30/3 20/31/3 -f 18/24/4 22/32/4 17/33/4 -f 20/31/5 23/26/5 18/24/5 -f 17/34/6 21/35/6 19/29/6 -f 27/36/1 26/37/1 25/38/1 -f 31/39/2 29/40/2 30/41/2 -f 28/42/5 31/39/5 26/43/5 -f 25/44/6 29/40/6 27/45/6 -f 27/36/3 32/46/3 28/47/3 -f 26/37/4 30/48/4 25/38/4 -f 35/49/1 34/50/1 33/51/1 -f 39/52/2 37/53/2 38/54/2 -f 36/55/5 39/52/5 34/56/5 -f 33/57/6 37/53/6 35/58/6 -f 35/49/3 40/59/3 36/60/3 -f 34/50/4 38/61/4 33/51/4 -f 67/62/1 66/63/1 65/64/1 -f 47/65/7 45/66/7 46/67/7 -f 42/68/5 48/69/5 47/70/5 -f 41/71/6 45/72/6 43/73/6 -f 43/73/8 48/69/8 44/74/8 -f 42/75/9 46/67/9 41/71/9 -f 53/76/8 55/77/8 54/78/8 -f 55/77/5 52/79/5 50/80/5 -f 53/81/6 49/82/6 51/83/6 -f 56/84/7 51/83/7 52/79/7 -f 54/78/10 50/80/10 49/85/10 -f 63/86/5 61/87/5 62/88/5 -f 57/89/2 61/87/2 59/90/2 -f 59/91/3 64/92/3 60/93/3 -f 58/94/4 62/88/4 57/95/4 -f 60/96/1 63/86/1 58/97/1 -f 71/98/2 69/99/2 70/100/2 -f 68/101/5 71/98/5 66/63/5 -f 65/102/6 69/103/6 67/104/6 -f 67/104/3 72/105/3 68/101/3 -f 66/63/4 70/106/4 65/107/4 -f 75/108/1 74/109/1 73/110/1 -f 79/111/2 77/112/2 78/113/2 -f 76/114/5 79/111/5 74/109/5 -f 73/115/6 77/116/6 75/117/6 -f 75/117/3 80/118/3 76/114/3 -f 74/109/4 78/119/4 73/120/4 -f 3/1/1 4/9/1 2/2/1 -f 6/4/2 8/8/2 7/5/2 -f 3/7/3 7/13/3 8/8/3 -f 2/2/4 6/4/4 5/10/4 -f 4/9/5 8/8/5 6/4/5 -f 1/12/6 5/121/6 7/13/6 -f 12/14/5 16/20/5 15/15/5 -f 9/17/6 14/122/6 13/18/6 -f 11/19/3 13/18/3 16/20/3 -f 10/16/4 15/15/4 14/21/4 -f 19/23/1 20/31/1 18/24/1 -f 23/26/2 24/30/2 21/27/2 -f 19/29/3 21/35/3 24/30/3 -f 18/24/4 23/26/4 22/32/4 -f 20/31/5 24/30/5 23/26/5 -f 17/34/6 22/123/6 21/35/6 -f 27/36/1 28/47/1 26/37/1 -f 31/39/2 32/46/2 29/40/2 -f 28/42/5 32/46/5 31/39/5 -f 25/44/6 30/41/6 29/40/6 -f 27/36/3 29/40/3 32/46/3 -f 26/37/4 31/124/4 30/48/4 -f 35/49/1 36/60/1 34/50/1 -f 39/52/2 40/59/2 37/53/2 -f 36/55/5 40/59/5 39/52/5 -f 33/57/6 38/54/6 37/53/6 -f 35/49/3 37/53/3 40/59/3 -f 34/50/4 39/125/4 38/61/4 -f 67/62/1 68/101/1 66/63/1 -f 47/65/7 48/126/7 45/66/7 -f 42/68/5 44/74/5 48/69/5 -f 41/71/6 46/67/6 45/72/6 -f 43/73/8 45/72/8 48/69/8 -f 42/75/9 47/65/9 46/67/9 -f 53/76/8 56/127/8 55/77/8 -f 55/77/5 56/84/5 52/79/5 -f 53/81/6 54/128/6 49/82/6 -f 56/84/7 53/81/7 51/83/7 -f 54/78/10 55/77/10 50/80/10 -f 63/86/5 64/92/5 61/87/5 -f 57/89/2 62/88/2 61/87/2 -f 59/91/3 61/87/3 64/92/3 -f 58/94/4 63/86/4 62/88/4 -f 60/96/1 64/92/1 63/86/1 -f 71/98/2 72/105/2 69/99/2 -f 68/101/5 72/105/5 71/98/5 -f 65/102/6 70/129/6 69/103/6 -f 67/104/3 69/103/3 72/105/3 -f 66/63/4 71/98/4 70/106/4 -f 75/108/1 76/114/1 74/109/1 -f 79/111/2 80/118/2 77/112/2 -f 76/114/5 80/118/5 79/111/5 -f 73/115/6 78/130/6 77/116/6 -f 75/117/3 77/116/3 80/118/3 -f 74/109/4 79/111/4 78/119/4 diff --git a/src/main/resources/assets/hbm/models/weapons/n_i_4_n_i.obj b/src/main/resources/assets/hbm/models/weapons/n_i_4_n_i.obj new file mode 100644 index 000000000..3970858be --- /dev/null +++ b/src/main/resources/assets/hbm/models/weapons/n_i_4_n_i.obj @@ -0,0 +1,2082 @@ +# Blender v2.79 (sub 0) OBJ File: 'n_i_4_n_i.blend' +# www.blender.org +o Barrel +v -0.187500 0.051777 3.937500 +v 0.187500 0.051777 3.937500 +v -0.187500 1.448223 3.937500 +v 0.187500 1.448223 3.937500 +v -0.135723 0.000000 3.937500 +v 0.135723 0.000000 3.937500 +v -0.135723 1.500000 3.937500 +v 0.135723 1.500000 3.937500 +vt 0.000000 0.283342 +vt 0.003261 0.276923 +vt 0.029348 0.276923 +vt 0.032609 0.283342 +vt 0.032609 0.455120 +vt 0.029348 0.461538 +vt 0.003261 0.461538 +vt 0.000000 0.455120 +vn 0.0000 0.0000 1.0000 +s off +f 1/1/1 5/2/1 6/3/1 +f 6/3/1 2/4/1 1/1/1 +f 2/4/1 4/5/1 1/1/1 +f 4/5/1 8/6/1 7/7/1 +f 7/7/1 3/8/1 4/5/1 +f 3/8/1 1/1/1 4/5/1 +o Coin4 +v -0.093750 1.637782 -2.619801 +v -0.143468 1.652344 -2.605239 +v -0.164062 1.687500 -2.570082 +v -0.143468 1.722656 -2.534926 +v -0.093750 1.737218 -2.520364 +v -0.044032 1.722656 -2.534926 +v -0.023438 1.687500 -2.570082 +v -0.044032 1.652344 -2.605239 +vt 0.603153 0.499831 +vt 0.456926 0.499831 +vt 0.603153 0.000168 +vt 0.353527 0.353482 +vt 0.353528 0.146514 +vt 0.456926 0.000168 +vt 0.706551 0.146516 +vt 0.706551 0.353483 +vn -0.0000 0.7071 -0.7071 +s off +f 16/9/2 9/10/2 13/11/2 +f 9/10/2 10/12/2 13/11/2 +f 10/12/2 11/13/2 13/11/2 +f 11/13/2 12/14/2 13/11/2 +f 13/11/2 14/15/2 15/16/2 +f 15/16/2 16/9/2 13/11/2 +o Coin3 +v 0.093750 1.637782 -2.619801 +v 0.044032 1.652344 -2.605239 +v 0.023438 1.687500 -2.570082 +v 0.044032 1.722656 -2.534926 +v 0.093750 1.737218 -2.520364 +v 0.143468 1.722656 -2.534926 +v 0.164062 1.687500 -2.570082 +v 0.143468 1.652344 -2.605239 +vt 0.249793 0.999831 +vt 0.103566 0.999831 +vt 0.249793 0.500168 +vt 0.000168 0.853484 +vt 0.000168 0.646516 +vt 0.103566 0.500168 +vt 0.353191 0.646516 +vt 0.353191 0.853484 +vn -0.0000 0.7071 -0.7071 +s off +f 24/17/3 17/18/3 21/19/3 +f 17/18/3 18/20/3 21/19/3 +f 18/20/3 19/21/3 21/19/3 +f 19/21/3 20/22/3 21/19/3 +f 21/19/3 22/23/3 23/24/3 +f 23/24/3 24/17/3 21/19/3 +o Coin2 +v -0.093750 1.770364 -2.487219 +v -0.143468 1.784926 -2.472656 +v -0.164062 1.820082 -2.437500 +v -0.143468 1.855239 -2.402344 +v -0.093750 1.869801 -2.387782 +v -0.044032 1.855239 -2.402344 +v -0.023438 1.820082 -2.437500 +v -0.044032 1.784926 -2.472656 +vt 0.353191 0.353483 +vt 0.249794 0.499832 +vt 0.103566 0.000168 +vt 0.103566 0.499832 +vt 0.000168 0.353484 +vt 0.000168 0.146517 +vt 0.249794 0.000168 +vt 0.353191 0.146516 +vn 0.0000 0.7071 -0.7071 +s off +f 32/25/4 25/26/4 29/27/4 +f 25/26/4 26/28/4 27/29/4 +f 27/29/4 28/30/4 25/26/4 +f 28/30/4 29/27/4 25/26/4 +f 29/27/4 30/31/4 31/32/4 +f 31/32/4 32/25/4 29/27/4 +o Coin1 +v 0.093750 1.770364 -2.487219 +v 0.044032 1.784926 -2.472656 +v 0.023438 1.820082 -2.437500 +v 0.044032 1.855239 -2.402344 +v 0.093750 1.869801 -2.387782 +v 0.143468 1.855239 -2.402344 +v 0.164062 1.820082 -2.437500 +v 0.143468 1.784926 -2.472656 +vt 0.706549 0.853483 +vt 0.603152 0.999832 +vt 0.456925 0.500169 +vt 0.456925 0.999831 +vt 0.353527 0.853484 +vt 0.353527 0.646516 +vt 0.603152 0.500168 +vt 0.706550 0.646517 +vn 0.0000 0.7071 -0.7071 +s off +f 40/33/5 33/34/5 37/35/5 +f 33/34/5 34/36/5 37/35/5 +f 34/36/5 35/37/5 37/35/5 +f 35/37/5 36/38/5 37/35/5 +f 37/35/5 38/39/5 39/40/5 +f 39/40/5 40/33/5 37/35/5 +o Grip +v -0.312500 0.500000 -2.000000 +v 0.312500 0.500000 -2.000000 +v -0.312500 1.250000 -3.125000 +v 0.312500 1.250000 -3.125000 +v -0.156250 1.250000 -3.375000 +v 0.156250 1.250000 -3.375000 +v -0.156250 1.000000 -3.375000 +v 0.156250 1.000000 -3.375000 +v -0.187500 0.625000 -3.000000 +v 0.187500 0.625000 -3.000000 +v -0.187500 0.250000 -1.750000 +v 0.187500 0.250000 -1.750000 +v -0.187500 -1.250000 -2.500000 +v 0.187500 -1.250000 -2.500000 +v -0.187500 -2.000000 -2.500000 +v 0.187500 -2.000000 -2.500000 +v -0.187500 -1.687500 -4.000000 +v 0.187500 -1.687500 -4.000000 +v 0.312500 -1.125000 -2.875000 +v 0.312500 -1.625000 -2.875000 +v 0.312500 -1.500000 -3.625000 +v 0.312500 0.375000 -2.750000 +v -0.312500 -1.125000 -2.875000 +v -0.312500 -1.625000 -2.875000 +v -0.312500 -1.500000 -3.625000 +v -0.312500 0.375000 -2.750000 +vt 0.788043 0.446154 +vt 0.885870 0.523077 +vt 0.788043 0.523077 +vt 0.885870 0.446154 +vt 0.907609 0.503846 +vt 0.964674 0.446154 +vt 0.991848 0.415385 +vt 0.991848 0.446154 +vt 0.964674 0.415385 +vt 0.994565 0.369231 +vt 0.766304 0.461538 +vt 0.733696 0.323077 +vt 0.766304 0.138462 +vt 0.766304 0.323077 +vt 0.733696 0.138462 +vt 0.766304 0.046154 +vt 0.831522 0.000000 +vt 0.961957 0.046154 +vt 0.831522 0.046154 +vt 0.961957 0.369231 +vt 0.994565 0.084615 +vt 0.961957 0.084615 +vt 0.864130 0.092308 +vt 0.929348 0.107692 +vt 0.864130 0.146154 +vt 0.788043 0.353846 +vt 0.864130 0.092308 +vt 0.831522 0.138462 +vt 0.961957 0.084615 +vt 0.929348 0.107692 +vt 0.875000 0.369231 +vt 0.853261 0.338462 +vt 0.956522 0.338462 +vt 0.875000 0.369231 +vt 0.853261 0.338462 +vt 1.000000 0.338462 +vt 0.831522 0.138462 +vt 0.864130 0.146154 +vt 0.766304 0.323077 +vt 0.788043 0.353846 +vt 0.885870 0.446154 +vt 0.907609 0.415385 +vt 0.907609 0.446154 +vt 0.907609 0.415385 +vt 0.907609 0.446154 +vt 0.907609 0.465385 +vt 0.766304 0.507692 +vt 0.733696 0.046154 +vt 0.961957 0.000000 +vt 0.831522 0.046154 +vn 0.0000 0.8321 0.5547 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 -0.4472 0.8944 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -0.9790 -0.2040 +vn 0.0000 0.3969 -0.9179 +vn -0.8920 -0.4460 -0.0743 +vn 0.9381 -0.1642 0.3049 +vn 0.9487 0.0000 0.3162 +vn 0.9186 -0.3868 -0.0806 +vn 0.9360 0.1489 -0.3191 +vn 1.0000 0.0000 0.0000 +vn -0.9360 0.1489 -0.3191 +vn -0.9487 0.0000 0.3162 +vn -0.9381 -0.1642 0.3049 +vn -1.0000 0.0000 0.0000 +vn 0.8480 0.0000 -0.5300 +vn 0.9029 -0.1693 -0.3950 +vn -0.9029 -0.1693 -0.3950 +vn -0.8480 0.0000 -0.5300 +vn -0.9186 -0.3868 -0.0806 +vn 0.9526 -0.1361 0.2722 +vn 0.8920 -0.4460 -0.0743 +vn 0.9073 0.1669 -0.3859 +vn -0.9073 0.1669 -0.3859 +vn -0.9526 -0.1361 0.2722 +s off +f 42/41/6 43/42/6 41/43/6 +f 44/44/7 45/45/7 43/42/7 +f 46/46/8 47/47/8 45/48/8 +f 48/49/9 49/50/9 47/47/9 +f 41/43/10 52/51/10 42/41/10 +f 51/52/11 54/53/11 52/54/11 +f 53/55/12 56/56/12 54/53/12 +f 55/57/13 58/58/13 56/59/13 +f 50/60/14 57/61/14 49/50/14 +f 57/62/15 64/63/15 65/64/15 +f 52/54/16 59/65/16 42/66/16 +f 60/67/17 54/68/17 56/59/17 +f 58/69/18 60/67/18 56/59/18 +f 61/70/19 50/71/19 62/72/19 +f 60/67/20 61/70/20 59/65/20 +f 59/65/20 62/72/20 42/66/20 +f 50/60/9 48/49/9 62/73/9 +f 42/66/20 62/72/20 44/44/20 +f 49/74/21 65/64/21 66/75/21 +f 47/47/9 49/50/9 66/76/9 +f 64/63/22 53/77/22 63/78/22 +f 63/78/23 51/79/23 41/80/23 +f 64/63/24 63/78/24 65/64/24 +f 63/78/24 66/75/24 65/64/24 +f 41/80/24 43/81/24 66/75/24 +f 44/44/25 48/82/25 46/83/25 +f 44/44/26 62/72/26 48/82/26 +f 66/75/27 43/81/27 47/84/27 +f 47/84/28 43/81/28 45/85/28 +f 42/41/6 44/44/6 43/42/6 +f 44/44/7 46/86/7 45/45/7 +f 46/46/8 48/49/8 47/47/8 +f 48/49/9 50/60/9 49/50/9 +f 41/43/10 51/87/10 52/51/10 +f 51/52/11 53/55/11 54/53/11 +f 53/55/12 55/88/12 56/56/12 +f 55/57/13 57/89/13 58/58/13 +f 50/60/14 58/69/14 57/61/14 +f 57/62/29 55/90/29 64/63/29 +f 52/54/30 54/68/30 59/65/30 +f 60/67/17 59/65/17 54/68/17 +f 58/69/31 61/70/31 60/67/31 +f 61/70/32 58/69/32 50/71/32 +f 59/65/20 61/70/20 62/72/20 +f 49/74/33 57/62/33 65/64/33 +f 64/63/22 55/90/22 53/77/22 +f 63/78/34 53/77/34 51/79/34 +f 63/78/24 41/80/24 66/75/24 +o FrameLight +v -0.437500 0.500000 -0.250000 +v -0.375000 1.000000 -0.250000 +v 0.437500 0.875000 -0.250000 +v 0.437500 0.500000 -0.250000 +v 0.375000 1.000000 -0.250000 +v -0.437500 0.875000 2.500000 +v -0.437500 0.500000 2.500000 +v -0.375000 1.500000 -0.250000 +v 0.375000 1.500000 -0.250000 +v -0.187500 1.687500 -0.250000 +v 0.187500 1.687500 -0.250000 +v -0.375000 1.500000 3.250000 +v -0.375000 1.375000 3.250000 +v -0.375000 1.375000 2.875000 +v -0.375000 1.000000 2.500000 +v 0.187500 1.625000 3.250000 +v -0.187500 1.625000 3.250000 +v 0.312500 1.500000 3.250000 +v -0.312500 1.500000 3.250000 +v 0.437500 0.875000 2.500000 +v 0.437500 0.500000 2.500000 +v 0.375000 1.500000 3.250000 +v 0.375000 1.375000 3.250000 +v 0.375000 1.375000 2.875000 +v 0.375000 1.000000 2.500000 +v -0.187500 1.687500 3.250000 +v 0.187500 1.687500 3.250000 +v 0.312500 1.375000 3.250000 +v -0.312500 1.375000 3.250000 +v 0.312500 1.375000 2.875000 +v -0.312500 1.375000 2.875000 +v 0.312500 1.000000 2.500000 +v -0.312500 1.000000 2.500000 +v 0.312500 0.375000 2.500000 +v -0.312500 0.375000 2.500000 +v 0.312500 0.375000 -0.250000 +v 0.125000 0.125000 -0.750000 +v -0.125000 0.125000 -0.750000 +v 0.125000 -0.375000 -0.750000 +v -0.125000 -0.375000 -0.750000 +v 0.125000 -0.375000 -2.125000 +v -0.125000 -0.375000 -2.125000 +v 0.125000 -0.250000 -2.125000 +v -0.125000 -0.250000 -2.125000 +v 0.125000 -0.250000 -1.000000 +v -0.125000 -0.250000 -1.000000 +v 0.125000 0.125000 -0.875000 +v -0.125000 0.125000 -0.875000 +v 0.000000 1.500000 -2.625000 +v -0.132583 1.445083 -2.625000 +v -0.187500 1.312500 -2.625000 +v -0.132583 1.179917 -2.625000 +v 0.000000 1.125000 -2.625000 +v 0.132583 1.179917 -2.625000 +v 0.187500 1.312500 -2.625000 +v 0.132583 1.445083 -2.625000 +v 0.000000 1.500000 -3.125000 +v -0.132583 1.445083 -3.125000 +v -0.187500 1.312500 -3.125000 +v -0.132583 1.179917 -3.125000 +v 0.000000 1.125000 -3.125000 +v 0.132583 1.179917 -3.125000 +v 0.187500 1.312500 -3.125000 +v 0.132583 1.445083 -3.125000 +v 0.000000 1.453125 -3.125000 +v -0.099437 1.411937 -3.125000 +v -0.140625 1.312500 -3.125000 +v -0.099437 1.213063 -3.125000 +v 0.000000 1.171875 -3.125000 +v 0.099437 1.213063 -3.125000 +v 0.140625 1.312500 -3.125000 +v 0.099437 1.411937 -3.125000 +v -0.099437 1.411937 -3.250000 +v 0.000000 1.453125 -3.250000 +v -0.140625 1.312500 -3.250000 +v -0.099437 1.213063 -3.250000 +v 0.000000 1.171875 -3.250000 +v 0.099437 1.213063 -3.250000 +v 0.140625 1.312500 -3.250000 +v 0.099437 1.411937 -3.250000 +v -0.250000 1.864277 -2.260723 +v 0.250000 1.864277 -2.260723 +v -0.250000 1.510723 -2.614277 +v 0.250000 1.510723 -2.614277 +v -0.250000 1.554917 -2.658471 +v -0.250000 1.908471 -2.304918 +v 0.250000 1.908471 -2.304918 +v 0.250000 1.554917 -2.658471 +v 0.125000 -0.187500 -1.625000 +v -0.125000 -0.187500 -1.625000 +v 0.125000 -0.187500 -1.750000 +v -0.125000 -0.187500 -1.750000 +v 0.125000 -0.062500 -1.687500 +v -0.125000 -0.062500 -1.687500 +v 0.125000 -0.062500 -1.812500 +v -0.125000 -0.062500 -1.812500 +v 0.125000 0.125000 -1.687500 +v -0.125000 0.125000 -1.687500 +v 0.125000 0.125000 -1.812500 +v -0.125000 0.125000 -1.812500 +v 0.062500 -0.062500 -1.812500 +v -0.062500 -0.062500 -1.812500 +v 0.062500 -0.062500 -1.937500 +v -0.062500 -0.062500 -1.937500 +v 0.062500 0.125000 -1.812500 +v -0.062500 0.125000 -1.812500 +v -0.312500 0.375000 -0.250000 +v -0.437500 0.875000 -0.250000 +vt 0.516304 0.346154 +vt 0.277174 0.323077 +vt 0.516304 0.323077 +vt 0.277174 0.392308 +vt 0.271739 0.407692 +vt 0.266304 0.407692 +vt 0.277174 0.653846 +vt 0.516304 0.700000 +vt 0.277174 0.700000 +vt 0.277174 0.638462 +vt 0.516304 0.653846 +vt 0.277174 0.346154 +vt 0.516304 0.392308 +vt 0.195652 0.569231 +vt 0.206522 0.546154 +vt 0.211957 0.546154 +vt 0.184783 0.569231 +vt 0.195652 0.561538 +vt 0.152174 0.561538 +vt 0.184783 0.561538 +vt 0.152174 0.569231 +vt 0.119565 0.561538 +vt 0.516304 0.576923 +vt 0.244565 0.592308 +vt 0.195652 0.484615 +vt 0.184783 0.476923 +vt 0.195652 0.476923 +vt 0.586957 0.469231 +vt 0.630435 0.484615 +vt 0.630435 0.561538 +vt 0.119565 0.476923 +vt 0.152174 0.484615 +vt 0.119565 0.484615 +vt 0.206522 0.500000 +vt 0.266304 0.638462 +vt 0.271739 0.638462 +vt 0.152174 0.476923 +vt 0.184783 0.484615 +vt 0.516304 0.723077 +vt 0.277174 0.723077 +vt 0.211957 0.500000 +vt 0.043478 0.876923 +vt 0.000000 0.907692 +vt 0.000000 0.876923 +vt 0.163043 0.876923 +vt 0.043478 0.907692 +vt 0.032609 1.000000 +vt 0.130435 0.969231 +vt 0.130435 1.000000 +vt -0.000000 1.000000 +vt 0.032609 0.969231 +vt 0.065217 0.861538 +vt 0.163043 0.861538 +vt 0.043478 0.815385 +vt 0.163043 0.907692 +vt 0.065217 0.923077 +vt 0.043478 0.969231 +vt 0.054348 0.969231 +vt 0.951314 0.546154 +vt 0.967391 0.523398 +vt 0.983469 0.546154 +vt 0.980467 0.573800 +vt 0.983633 0.584615 +vt 0.962020 0.584615 +vt 0.913043 0.515385 +vt 0.956522 0.453846 +vt 0.956522 0.515385 +vt 0.956522 0.446154 +vt 0.913043 0.453846 +vt 0.913043 0.446154 +vt 0.913043 0.523077 +vt 0.956522 0.523077 +vt 0.907609 0.453846 +vt 0.907609 0.515385 +vt 0.961957 0.453846 +vt 0.711957 0.630769 +vt 0.733696 0.646154 +vt 0.711957 0.646154 +vt 0.744565 0.669231 +vt 0.733696 0.692308 +vt 0.733696 0.669231 +vt 0.744565 0.646154 +vt 0.766304 0.646154 +vt 0.777174 0.669231 +vt 0.766304 0.669231 +vt 0.722826 0.715385 +vt 0.711957 0.730769 +vt 0.711957 0.715385 +vt 0.766304 0.692308 +vt 0.722826 0.730769 +vt 0.711957 0.753846 +vt 0.711957 0.692308 +vt 0.516304 0.546154 +vt 0.211957 0.469231 +vt 0.516304 0.500000 +vt 0.244565 0.453846 +vt 0.277174 0.407692 +vt 0.516304 0.469231 +vt 0.516304 0.407692 +vt 0.211957 0.576923 +vt 0.266304 0.330769 +vt 0.516304 0.638462 +vt 0.119565 0.569231 +vt 0.211957 0.592308 +vt 0.576087 0.569231 +vt 0.532609 0.569231 +vt 0.576087 0.476923 +vt 0.532609 0.476923 +vt 0.586957 0.576923 +vt 0.619565 0.469231 +vt 0.619565 0.576923 +vt 0.266304 0.715385 +vt -0.000000 0.969231 +vt 0.054348 0.815385 +vt 0.163043 0.923077 +vt 0.978760 0.562245 +vt 0.967391 0.568910 +vt 0.956023 0.562245 +vt 0.956023 0.530063 +vt 0.978760 0.530063 +vt 0.980467 0.595431 +vt 0.972826 0.599910 +vt 0.965185 0.595431 +vt 0.965185 0.573800 +vt 0.972826 0.569320 +vt 0.961957 0.515385 +vt 0.733696 0.630769 +vt 0.744565 0.692308 +vt 0.777174 0.646154 +vt 0.777174 0.692308 +vt 0.211957 0.453846 +vt 0.951087 0.584615 +vt 0.907609 0.600000 +vt 0.907609 0.584615 +vt 0.951087 0.569231 +vt 0.907609 0.569231 +vt 0.951087 0.538462 +vt 0.907609 0.553846 +vt 0.907609 0.538462 +vt 0.951087 0.630769 +vt 0.907609 0.646154 +vt 0.907609 0.630769 +vt 0.951087 0.600000 +vt 0.907609 0.615385 +vt 0.951087 0.553846 +vt 0.951087 0.523077 +vt 0.907609 0.523077 +vt 0.951087 0.615385 +vt 0.983696 0.569231 +vt 0.994565 0.584615 +vt 0.983696 0.584615 +vt 0.983696 0.538462 +vt 0.994565 0.553846 +vt 0.983696 0.553846 +vt 0.983696 0.630769 +vt 0.994565 0.646154 +vt 0.983696 0.646154 +vt 0.983696 0.600000 +vt 0.994565 0.615385 +vt 0.983696 0.615385 +vt 0.994565 0.569231 +vt 0.983696 0.523077 +vt 0.994565 0.538462 +vt 0.994565 0.630769 +vt 0.994565 0.600000 +vt 0.711957 0.669231 +vt 0.711957 0.692308 +vt 0.951087 0.646154 +vt 0.994565 0.523077 +vn 0.7071 -0.7071 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn -0.8944 0.4472 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.0000 -1.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.3162 -0.9487 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.7071 0.7071 0.0000 +vn 0.8944 0.4472 0.0000 +vn -0.7071 0.7071 0.0000 +vn 0.0000 -0.4472 -0.8944 +vn 0.0000 -0.2298 -0.9732 +vn 0.0000 0.4472 0.8944 +vn 0.0000 0.2298 0.9732 +s off +f 70/91/35 100/92/35 102/93/35 +f 86/94/36 91/95/36 98/96/36 +f 72/97/37 67/98/37 73/99/37 +f 81/100/38 174/101/38 72/97/38 +f 87/102/39 69/103/39 86/94/39 +f 78/104/36 83/105/36 92/106/36 +f 79/107/36 85/108/36 78/104/36 +f 79/107/40 97/109/40 95/110/40 +f 80/111/41 99/112/41 97/109/41 +f 74/113/37 81/100/37 80/114/37 +f 84/115/36 89/116/36 88/117/36 +f 69/118/42 102/119/42 173/120/42 +f 91/121/41 96/122/41 98/123/41 +f 82/124/36 92/106/36 83/105/36 +f 99/125/36 81/126/36 72/97/36 +f 90/127/40 94/128/40 96/122/40 +f 73/99/43 173/129/43 101/130/43 +f 82/124/36 88/117/36 93/131/36 +f 106/132/36 103/133/36 104/134/36 +f 108/135/40 105/136/40 106/132/40 +f 112/137/44 109/138/44 110/139/44 +f 114/140/45 111/141/45 112/137/45 +f 108/135/37 112/142/37 110/143/37 +f 104/144/37 112/142/37 106/132/37 +f 107/145/39 111/146/39 105/136/39 +f 103/147/39 111/146/39 113/148/39 +f 129/149/42 127/150/42 125/151/42 +f 142/152/42 141/153/42 145/154/42 +f 153/155/46 151/156/46 152/157/46 +f 149/158/47 154/159/47 150/160/47 +f 148/161/48 152/157/48 147/162/48 +f 150/163/39 153/155/39 148/164/39 +f 149/165/37 152/157/37 151/156/37 +f 158/166/40 155/167/40 156/168/40 +f 161/169/39 163/170/39 159/171/39 +f 157/172/39 159/171/39 155/167/39 +f 158/173/37 160/174/37 162/175/37 +f 170/176/40 167/177/40 168/178/40 +f 160/174/37 166/179/37 162/175/37 +f 169/180/39 171/181/39 167/177/39 +f 170/176/37 168/178/37 172/182/37 +f 93/131/44 76/183/44 92/106/44 +f 88/184/49 77/185/49 93/131/49 +f 90/186/39 91/187/39 75/188/39 +f 86/94/50 71/189/50 91/187/50 +f 92/106/51 74/113/51 78/190/51 +f 70/91/35 87/102/35 100/92/35 +f 98/96/36 100/191/36 87/102/36 +f 87/102/36 86/94/36 98/96/36 +f 72/97/37 174/101/37 67/98/37 +f 81/100/38 68/192/38 174/101/38 +f 87/102/39 70/91/39 69/103/39 +f 78/104/36 85/108/36 83/105/36 +f 79/107/36 95/110/36 85/108/36 +f 79/107/40 80/111/40 97/109/40 +f 80/111/41 81/193/41 99/112/41 +f 79/194/37 78/190/37 80/114/37 +f 78/190/37 74/113/37 80/114/37 +f 74/113/37 68/192/37 81/100/37 +f 84/115/36 94/128/36 89/116/36 +f 68/195/42 74/196/42 71/197/42 +f 74/196/42 76/183/42 75/198/42 +f 71/197/42 74/196/42 75/198/42 +f 76/183/42 77/185/42 75/198/42 +f 71/197/42 69/118/42 174/199/42 +f 69/118/42 70/200/42 102/119/42 +f 67/201/42 174/199/42 173/120/42 +f 174/199/42 68/195/42 71/197/42 +f 173/120/42 174/199/42 69/118/42 +f 91/121/41 90/127/41 96/122/41 +f 82/124/36 93/131/36 92/106/36 +f 72/97/36 73/99/36 101/202/36 +f 101/202/36 99/125/36 72/97/36 +f 90/127/40 89/116/40 94/128/40 +f 73/99/43 67/98/43 173/129/43 +f 82/124/36 84/115/36 88/117/36 +f 106/132/36 105/136/36 103/133/36 +f 108/135/40 107/145/40 105/136/40 +f 112/137/44 111/141/44 109/138/44 +f 114/140/45 113/203/45 111/141/45 +f 108/135/37 106/132/37 112/142/37 +f 104/144/37 114/204/37 112/142/37 +f 107/145/39 109/205/39 111/146/39 +f 103/147/39 105/136/39 111/146/39 +f 125/151/42 124/206/42 123/207/42 +f 123/207/42 130/208/42 129/149/42 +f 129/149/42 128/209/42 127/150/42 +f 127/150/42 126/210/42 125/151/42 +f 125/151/42 123/207/42 129/149/42 +f 141/153/42 139/211/42 145/154/42 +f 139/211/42 140/212/42 145/154/42 +f 140/212/42 146/213/42 145/154/42 +f 145/154/42 144/214/42 143/215/42 +f 143/215/42 142/152/42 145/154/42 +f 153/155/46 154/159/46 151/156/46 +f 149/158/47 151/156/47 154/159/47 +f 148/161/48 153/155/48 152/157/48 +f 150/163/39 154/159/39 153/155/39 +f 149/165/37 147/216/37 152/157/37 +f 158/166/40 157/217/40 155/167/40 +f 161/169/39 165/218/39 163/170/39 +f 157/172/39 161/169/39 159/171/39 +f 158/173/37 156/219/37 160/174/37 +f 170/176/40 169/180/40 167/177/40 +f 160/174/37 164/220/37 166/179/37 +f 93/131/44 77/185/44 76/183/44 +f 88/184/49 75/188/49 77/185/49 +f 71/189/39 75/188/39 91/187/39 +f 75/188/39 88/184/39 90/186/39 +f 88/184/39 89/221/39 90/186/39 +f 86/94/50 69/103/50 71/189/50 +f 92/106/51 76/183/51 74/113/51 +s 1 +f 123/222/44 116/223/51 115/224/44 +f 130/225/49 115/224/44 122/226/49 +f 128/227/35 121/228/39 120/229/35 +f 126/230/43 119/231/40 118/232/43 +f 124/233/51 117/234/37 116/223/51 +f 129/235/39 122/226/49 121/228/39 +f 127/236/40 120/229/35 119/237/40 +f 125/238/37 118/232/43 117/234/37 +f 138/239/49 140/240/44 131/241/44 +f 136/242/35 145/243/39 137/244/39 +f 134/245/43 143/246/40 135/247/40 +f 132/248/51 141/249/37 133/250/37 +f 137/244/39 146/251/49 138/239/49 +f 135/252/40 144/253/35 136/242/35 +f 133/250/37 142/254/43 134/245/43 +f 131/241/44 139/255/51 132/248/51 +f 158/173/52 161/169/53 157/172/52 +f 155/167/54 160/256/55 156/168/54 +f 162/175/53 165/218/42 161/169/53 +f 159/171/55 164/257/36 160/256/55 +f 123/222/44 124/233/51 116/223/51 +f 130/225/49 123/222/44 115/224/44 +f 128/227/35 129/235/39 121/228/39 +f 126/230/43 127/258/40 119/231/40 +f 124/233/51 125/238/37 117/234/37 +f 129/235/39 130/225/49 122/226/49 +f 127/236/40 128/227/35 120/229/35 +f 125/238/37 126/230/43 118/232/43 +f 138/239/49 146/251/49 140/240/44 +f 136/242/35 144/253/35 145/243/39 +f 134/245/43 142/254/43 143/246/40 +f 132/248/51 139/255/51 141/249/37 +f 137/244/39 145/243/39 146/251/49 +f 135/252/40 143/259/40 144/253/35 +f 133/250/37 141/249/37 142/254/43 +f 131/241/44 140/240/44 139/255/51 +f 158/173/52 162/175/53 161/169/53 +f 155/167/54 159/171/55 160/256/55 +f 162/175/53 166/179/42 165/218/42 +f 159/171/55 163/170/36 164/257/36 +o Cylinder +v 0.000000 1.750000 -0.500000 +v -0.281250 1.674639 -0.500000 +v -0.487139 1.468750 -0.500000 +v -0.562500 1.187500 -0.500000 +v -0.487139 0.906250 -0.500000 +v -0.281250 0.700361 -0.500000 +v 0.000000 0.625000 -0.500000 +v 0.281250 0.700361 -0.500000 +v 0.487139 0.906250 -0.500000 +v 0.562500 1.187500 -0.500000 +v 0.487139 1.468750 -0.500000 +v 0.281250 1.674639 -0.500000 +v 0.000000 1.750000 -2.000000 +v -0.281250 1.674639 -2.000000 +v -0.487139 1.468750 -2.000000 +v -0.562500 1.187500 -2.000000 +v -0.487139 0.906250 -2.000000 +v -0.281250 0.700361 -2.000000 +v 0.000000 0.625000 -2.000000 +v 0.281250 0.700361 -2.000000 +v 0.487139 0.906250 -2.000000 +v 0.562500 1.187500 -2.000000 +v 0.487139 1.468750 -2.000000 +v 0.281250 1.674639 -2.000000 +v 0.000000 1.625000 -0.375000 +v -0.218750 1.566386 -0.375000 +v -0.378886 1.406250 -0.375000 +v -0.437500 1.187500 -0.375000 +v -0.378886 0.968750 -0.375000 +v -0.218750 0.808614 -0.375000 +v 0.000000 0.750000 -0.375000 +v 0.218750 0.808614 -0.375000 +v 0.378886 0.968750 -0.375000 +v 0.437500 1.187500 -0.375000 +v 0.378886 1.406250 -0.375000 +v 0.218750 1.566386 -0.375000 +v 0.000000 1.187500 -2.000000 +vt 0.663043 0.269231 +vt 0.711957 0.269231 +vt 0.663043 0.307692 +vt 0.663043 0.192308 +vt 0.711957 0.192308 +vt 0.663043 0.230769 +vt 0.663043 0.115385 +vt 0.711957 0.115385 +vt 0.663043 0.153846 +vt 0.663043 0.038462 +vt 0.711957 0.038462 +vt 0.663043 0.076923 +vt 0.663043 0.423077 +vt 0.711957 0.423077 +vt 0.663043 0.461538 +vt 0.663043 0.346154 +vt 0.711957 0.346154 +vt 0.663043 0.384615 +vt 0.663043 -0.000000 +vt 0.532609 0.230769 +vt 0.532609 0.192308 +vt 0.532609 0.307692 +vt 0.532609 0.269231 +vt 0.532609 0.115385 +vt 0.532609 0.076923 +vt 0.532609 0.461538 +vt 0.532609 0.423077 +vt 0.532609 0.346154 +vt 0.532609 0.153846 +vt 0.532609 0.038462 +vt 0.532609 0.000000 +vt 0.532609 0.384615 +vt 0.516304 0.146154 +vt 0.516304 0.115385 +vt 0.516304 0.161538 +vt 0.516304 0.192308 +vt 0.516304 0.238462 +vt 0.516304 0.269231 +vt 0.516304 0.315385 +vt 0.516304 0.346154 +vt 0.516304 0.392308 +vt 0.516304 0.423077 +vt 0.516304 0.007692 +vt 0.516304 0.038462 +vt 0.516304 0.084615 +vt 0.516304 0.223077 +vt 0.516304 0.300000 +vt 0.516304 0.376923 +vt 0.516304 0.453846 +vt 0.516304 0.069231 +vn 0.0000 -0.0000 -1.0000 +vn 0.5000 0.8660 0.0000 +vn 0.0000 1.0000 0.0000 +vn -0.5000 0.8660 0.0000 +vn -0.8660 0.5000 0.0000 +vn 0.8660 -0.5000 0.0000 +vn 1.0000 -0.0000 0.0000 +vn -0.5000 -0.8660 0.0000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 -0.0000 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.7071 -0.0000 0.7071 +vn 0.6124 0.3536 0.7071 +vn 0.3536 0.6124 0.7071 +vn 0.0000 0.7071 0.7071 +vn -0.3536 0.6124 0.7071 +vn -0.6124 0.3536 0.7071 +vn -0.7071 -0.0000 0.7071 +vn -0.6124 -0.3536 0.7071 +vn -0.3536 -0.6124 0.7071 +vn -0.0000 -0.7071 0.7071 +vn 0.3536 -0.6124 0.7071 +vn 0.6124 -0.3536 0.7071 +s off +f 188/260/56 211/261/56 189/262/56 +f 198/263/56 211/264/56 187/265/56 +f 196/266/56 211/267/56 197/268/56 +f 194/269/56 211/270/56 195/271/56 +f 192/272/56 211/273/56 193/274/56 +f 190/275/56 211/276/56 191/277/56 +f 188/260/56 187/265/56 211/261/56 +f 198/263/56 197/268/56 211/264/56 +f 196/266/56 195/271/56 211/267/56 +f 194/269/56 193/278/56 211/270/56 +f 192/272/56 191/277/56 211/273/56 +f 190/275/56 189/262/56 211/276/56 +s 1 +f 198/263/57 175/279/58 186/280/57 +f 188/260/59 177/281/60 176/282/59 +f 195/271/61 184/283/62 183/284/61 +f 192/272/63 181/285/64 180/286/63 +f 189/262/60 178/287/65 177/281/60 +f 196/266/62 185/288/66 184/283/62 +f 193/278/64 182/289/67 181/290/64 +f 190/275/65 179/291/68 178/287/65 +f 197/268/66 186/280/57 185/288/66 +f 187/265/58 176/282/59 175/279/58 +f 194/269/67 183/284/61 182/289/67 +f 191/277/68 180/286/63 179/291/68 +f 184/283/69 209/292/70 208/293/69 +f 186/280/71 209/294/70 185/288/70 +f 175/279/72 210/295/71 186/280/71 +f 176/282/73 199/296/72 175/279/72 +f 177/281/74 200/297/73 176/282/73 +f 178/287/75 201/298/74 177/281/74 +f 179/291/76 202/299/75 178/287/75 +f 180/286/77 203/300/76 179/291/76 +f 181/285/78 204/301/77 180/286/77 +f 182/289/79 205/302/78 181/290/78 +f 183/284/80 206/303/79 182/289/79 +f 183/284/80 208/293/69 207/304/80 +f 198/263/57 187/265/58 175/279/58 +f 188/260/59 189/262/60 177/281/60 +f 195/271/61 196/266/62 184/283/62 +f 192/272/63 193/274/64 181/285/64 +f 189/262/60 190/275/65 178/287/65 +f 196/266/62 197/268/66 185/288/66 +f 193/278/64 194/269/67 182/289/67 +f 190/275/65 191/277/68 179/291/68 +f 197/268/66 198/263/57 186/280/57 +f 187/265/58 188/260/59 176/282/59 +f 194/269/67 195/271/61 183/284/61 +f 191/277/68 192/272/63 180/286/63 +f 184/283/69 185/288/70 209/292/70 +f 186/280/71 210/295/71 209/294/70 +f 175/279/72 199/305/72 210/295/71 +f 176/282/73 200/297/73 199/296/72 +f 177/281/74 201/306/74 200/297/73 +f 178/287/75 202/299/75 201/298/74 +f 179/291/76 203/307/76 202/299/75 +f 180/286/77 204/301/77 203/300/76 +f 181/285/78 205/308/78 204/301/77 +f 182/289/79 206/303/79 205/302/78 +f 183/284/80 207/309/80 206/303/79 +f 183/284/80 184/283/69 208/293/69 +o CylinderHighlights +v 0.375000 1.281250 -2.031250 +v 0.308709 1.253791 -2.031250 +v 0.281250 1.187500 -2.031250 +v 0.308709 1.121209 -2.031250 +v 0.375000 1.093750 -2.031250 +v 0.441291 1.121209 -2.031250 +v 0.468750 1.187500 -2.031250 +v 0.441291 1.253791 -2.031250 +v 0.278055 0.838476 -2.031250 +v 0.234375 0.781550 -2.031250 +v 0.163236 0.772185 -2.031250 +v 0.106310 0.815865 -2.031250 +v 0.096944 0.887005 -2.031250 +v 0.140625 0.943930 -2.031250 +v 0.211764 0.953296 -2.031250 +v 0.268690 0.909615 -2.031250 +v -0.441291 1.121209 -2.031250 +v -0.468750 1.187500 -2.031250 +v -0.441291 1.253791 -2.031250 +v -0.375000 1.281250 -2.031250 +v -0.308709 1.253791 -2.031250 +v -0.281250 1.187500 -2.031250 +v -0.308709 1.121209 -2.031250 +v -0.375000 1.093750 -2.031250 +v -0.278055 1.536524 -2.031250 +v -0.234375 1.593450 -2.031250 +v -0.163236 1.602815 -2.031250 +v -0.106310 1.559135 -2.031250 +v -0.096944 1.487995 -2.031250 +v -0.140625 1.431070 -2.031250 +v -0.211764 1.421704 -2.031250 +v -0.268690 1.465385 -2.031250 +v -0.163236 0.772185 -2.031250 +v -0.234375 0.781551 -2.031250 +v -0.278056 0.838476 -2.031250 +v -0.268690 0.909616 -2.031250 +v -0.211764 0.953296 -2.031250 +v -0.140625 0.943931 -2.031250 +v -0.096945 0.887005 -2.031250 +v -0.106310 0.815866 -2.031250 +v 0.163236 1.602815 -2.031250 +v 0.234375 1.593449 -2.031250 +v 0.278056 1.536524 -2.031250 +v 0.268690 1.465384 -2.031250 +v 0.211764 1.421704 -2.031250 +v 0.140625 1.431069 -2.031250 +v 0.096945 1.487995 -2.031250 +v 0.106310 1.559134 -2.031250 +vt 0.212036 0.603846 +vt 0.220109 0.592421 +vt 0.228181 0.603846 +vt 0.212036 0.603846 +vt 0.220109 0.592421 +vt 0.228181 0.603846 +vt 0.212036 0.603846 +vt 0.220109 0.592421 +vt 0.228181 0.603846 +vt 0.220109 0.615272 +vt 0.212036 0.603846 +vt 0.220109 0.592421 +vt 0.228181 0.603846 +vt 0.220109 0.615272 +vt 0.212036 0.603846 +vt 0.220109 0.615272 +vt 0.212036 0.603846 +vt 0.220109 0.592421 +vt 0.225817 0.611925 +vt 0.220109 0.615272 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.225817 0.595767 +vt 0.225817 0.611925 +vt 0.220109 0.615272 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.225817 0.595767 +vt 0.225817 0.611925 +vt 0.220109 0.615272 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.225817 0.595767 +vt 0.228181 0.603846 +vt 0.225817 0.611925 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.225817 0.595767 +vt 0.225817 0.611925 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.220109 0.592421 +vt 0.225817 0.595767 +vt 0.228181 0.603846 +vt 0.225817 0.611925 +vt 0.214401 0.611925 +vt 0.214401 0.595767 +vt 0.225817 0.595767 +vn 0.0000 0.0000 -1.0000 +s off +f 218/310/81 216/311/81 214/312/81 +f 221/313/81 223/314/81 225/315/81 +f 229/316/81 231/317/81 233/318/81 +f 243/319/81 237/320/81 239/321/81 +f 249/322/81 251/323/81 245/324/81 +f 259/325/81 253/326/81 255/327/81 +f 214/312/81 213/328/81 212/329/81 +f 212/329/81 219/330/81 218/310/81 +f 218/310/81 217/331/81 216/311/81 +f 216/311/81 215/332/81 214/312/81 +f 214/312/81 212/329/81 218/310/81 +f 225/315/81 226/333/81 227/334/81 +f 227/334/81 220/335/81 221/313/81 +f 221/313/81 222/336/81 223/314/81 +f 223/314/81 224/337/81 225/315/81 +f 225/315/81 227/334/81 221/313/81 +f 233/318/81 234/338/81 235/339/81 +f 235/339/81 228/340/81 229/316/81 +f 229/316/81 230/341/81 231/317/81 +f 231/317/81 232/342/81 233/318/81 +f 233/318/81 235/339/81 229/316/81 +f 241/343/81 242/344/81 243/319/81 +f 243/319/81 236/345/81 237/320/81 +f 237/320/81 238/346/81 239/321/81 +f 239/321/81 240/347/81 241/343/81 +f 241/343/81 243/319/81 239/321/81 +f 249/322/81 250/348/81 251/323/81 +f 251/323/81 244/349/81 245/324/81 +f 245/324/81 246/350/81 247/351/81 +f 247/351/81 248/352/81 245/324/81 +f 248/352/81 249/322/81 245/324/81 +f 257/353/81 258/354/81 259/325/81 +f 259/325/81 252/355/81 253/326/81 +f 253/326/81 254/356/81 255/327/81 +f 255/327/81 256/357/81 257/353/81 +f 257/353/81 259/325/81 255/327/81 +o FrameDark +v -0.187500 0.051777 3.937500 +v 0.187500 0.051777 3.937500 +v -0.312500 0.000000 -0.500000 +v 0.312500 0.000000 -0.500000 +v -0.187500 1.448223 3.937500 +v 0.187500 1.448223 3.937500 +v -0.187500 -0.125000 -0.500000 +v -0.135723 0.000000 3.937500 +v 0.135723 0.000000 3.937500 +v 0.187500 -0.125000 -0.500000 +v -0.312500 0.375000 -0.250000 +v 0.312500 0.375000 -0.250000 +v -0.312500 0.375000 2.500000 +v 0.312500 0.375000 2.500000 +v -0.312500 1.000000 2.500000 +v 0.312500 1.000000 2.500000 +v -0.312500 1.375000 2.875000 +v 0.312500 1.375000 2.875000 +v -0.312500 1.375000 3.250000 +v 0.312500 1.375000 3.250000 +v -0.135723 1.500000 3.937500 +v 0.135723 1.500000 3.937500 +v 0.437500 0.875000 0.562500 +v 0.437500 0.875000 0.437500 +v -0.312500 1.500000 3.250000 +v 0.312500 1.500000 3.250000 +v -0.187500 1.625000 3.250000 +v 0.187500 1.625000 3.250000 +v 0.437500 0.500000 0.437500 +v 0.437500 0.500000 0.562500 +v -0.312500 0.375000 -0.500000 +v 0.312500 0.375000 -0.500000 +v -0.187500 1.625000 4.000000 +v 0.187500 1.625000 4.000000 +v -0.187500 2.000000 4.000000 +v 0.187500 2.000000 4.000000 +v -0.187500 1.625000 3.250000 +v 0.187500 1.625000 3.250000 +v -0.187500 2.000000 3.500000 +v 0.187500 2.000000 3.500000 +v 0.312500 1.500000 4.000000 +v 0.312500 0.000000 4.000000 +v -0.312500 0.000000 4.000000 +v -0.312500 1.500000 4.000000 +v -0.187500 -0.125000 4.000000 +v 0.187500 -0.125000 4.000000 +v -0.187500 1.625000 4.000000 +v 0.187500 1.625000 4.000000 +v 0.250000 1.474112 4.062500 +v 0.250000 0.025888 4.062500 +v -0.250000 0.025888 4.062500 +v -0.250000 1.474112 4.062500 +v -0.161612 -0.062500 4.062500 +v 0.161612 -0.062500 4.062500 +v -0.161612 1.562500 4.062500 +v 0.161612 1.562500 4.062500 +v 0.312500 0.000000 3.125000 +v 0.312500 0.375000 3.125000 +v 0.312500 0.000000 2.812500 +v 0.312500 0.375000 2.750000 +v -0.312500 0.000000 2.812500 +v 0.312500 0.187500 2.375000 +v -0.375000 0.000000 3.062500 +v 0.312500 0.187500 0.750000 +v 0.312500 0.000000 0.625000 +v 0.312500 0.187500 0.625000 +v 0.312500 0.375000 0.562500 +v 0.312500 0.375000 0.437500 +v 0.375000 1.000000 0.562500 +v 0.375000 1.000000 0.437500 +v 0.375000 1.500000 0.562500 +v 0.375000 1.500000 0.437500 +v 0.187500 1.687500 0.562500 +v 0.187500 1.687500 0.437500 +v -0.437500 0.875000 0.562500 +v -0.437500 0.875000 0.437500 +v -0.437500 0.500000 0.437500 +v -0.437500 0.500000 0.562500 +v -0.312500 0.000000 3.125000 +v -0.312500 0.375000 3.125000 +v -0.187500 -0.125000 2.812500 +v -0.312500 0.375000 2.750000 +v 0.187500 -0.125000 2.812500 +v -0.312500 0.187500 2.375000 +v -0.375000 0.000000 2.812500 +v -0.312500 0.187500 0.750000 +v -0.312500 0.000000 0.625000 +v -0.312500 0.187500 0.625000 +v -0.312500 0.375000 0.562500 +v -0.312500 0.375000 0.437500 +v -0.375000 1.000000 0.562500 +v -0.375000 1.000000 0.437500 +v -0.375000 1.500000 0.562500 +v -0.375000 1.500000 0.437500 +v -0.187500 1.687500 0.562500 +v -0.187500 1.687500 0.437500 +v 0.187500 1.750000 0.562500 +v 0.187500 1.750000 0.437500 +v -0.187500 1.750000 0.562500 +v -0.187500 1.750000 0.437500 +v 0.500000 0.875000 0.562500 +v 0.500000 0.875000 0.437500 +v 0.500000 0.500000 0.437500 +v 0.500000 0.500000 0.562500 +v 0.375000 0.000000 3.125000 +v 0.375000 0.375000 3.125000 +v 0.187500 -0.125000 3.062500 +v 0.375000 0.375000 2.750000 +v -0.187500 -0.125000 3.062500 +v 0.375000 0.187500 2.375000 +v 0.375000 0.000000 3.062500 +v 0.375000 0.187500 0.750000 +v 0.375000 0.000000 0.625000 +v 0.375000 0.187500 0.625000 +v 0.375000 0.375000 0.562500 +v 0.375000 0.375000 0.437500 +v 0.437500 1.000000 0.562500 +v 0.437500 1.000000 0.437500 +v 0.437500 1.500000 0.562500 +v 0.437500 1.500000 0.437500 +v -0.500000 0.875000 0.562500 +v -0.500000 0.875000 0.437500 +v -0.500000 0.500000 0.437500 +v -0.500000 0.500000 0.562500 +v -0.375000 0.000000 3.125000 +v -0.375000 0.375000 3.125000 +v -0.312500 0.000000 3.062500 +v -0.375000 0.375000 2.750000 +v 0.312500 0.000000 3.062500 +v -0.375000 0.187500 2.375000 +v 0.375000 0.000000 2.812500 +v -0.375000 0.187500 0.750000 +v -0.375000 0.000000 0.625000 +v -0.375000 0.187500 0.625000 +v -0.375000 0.375000 0.562500 +v -0.375000 0.375000 0.437500 +v -0.437500 1.000000 0.562500 +v -0.437500 1.000000 0.437500 +v -0.437500 1.500000 0.562500 +v -0.437500 1.500000 0.437500 +v -0.187500 -0.187500 2.812500 +v 0.187500 -0.187500 2.812500 +v 0.187500 -0.187500 3.062500 +v -0.187500 -0.187500 3.062500 +v -0.187500 -0.250000 2.812500 +v -0.187500 -0.250000 3.062500 +v 0.187500 -0.250000 3.062500 +v 0.187500 -0.250000 2.812500 +v -0.250000 1.750000 -0.250000 +v 0.250000 1.750000 -0.250000 +v -0.437500 1.375000 -0.250000 +v 0.437500 1.375000 -0.250000 +v -0.437500 0.750000 -0.250000 +v 0.437500 0.750000 -0.250000 +v -0.250000 0.375000 -0.250000 +v 0.250000 0.375000 -0.250000 +v 0.250000 1.750000 -0.375000 +v -0.250000 1.750000 -0.375000 +v 0.437500 1.375000 -0.375000 +v -0.437500 1.375000 -0.375000 +v 0.437500 0.750000 -0.375000 +v -0.437500 0.750000 -0.375000 +v -0.250000 0.375000 -0.375000 +v 0.250000 0.375000 -0.375000 +v -0.250000 0.375000 -0.375000 +v 0.250000 0.375000 -0.375000 +v -0.250000 0.625000 -0.375000 +v 0.250000 0.625000 -0.375000 +v 0.250000 0.375000 -2.000000 +v -0.250000 0.375000 -2.000000 +v 0.250000 0.625000 -2.000000 +v -0.250000 0.625000 -2.000000 +v 0.125000 0.125000 -0.375000 +v -0.125000 0.125000 -0.375000 +v 0.125000 0.125000 -2.000000 +v -0.125000 0.125000 -2.000000 +v 0.187500 -0.125000 -0.500000 +v -0.187500 -0.125000 -0.500000 +v 0.187500 -0.125000 1.500000 +v -0.187500 -0.125000 1.500000 +v 0.187500 -0.312500 -0.750000 +v -0.187500 -0.312500 -0.750000 +v 0.187500 -0.312500 1.125000 +v -0.187500 -0.312500 1.125000 +v 0.187500 0.250000 -0.500000 +v -0.187500 0.250000 -0.500000 +v 0.187500 0.250000 -0.750000 +v -0.187500 0.250000 -0.750000 +v -0.250000 1.875000 -2.000000 +v 0.250000 1.875000 -2.000000 +v -0.437500 1.500000 -2.000000 +v 0.437500 1.500000 -2.000000 +v -0.437500 0.875000 -2.000000 +v 0.437500 0.875000 -2.000000 +v -0.250000 0.500000 -2.000000 +v 0.250000 0.500000 -2.000000 +v 0.250000 1.875000 -2.125000 +v -0.250000 1.875000 -2.125000 +v 0.437500 1.500000 -2.125000 +v -0.437500 1.500000 -2.125000 +v 0.437500 0.875000 -2.125000 +v -0.437500 0.875000 -2.125000 +v -0.250000 0.500000 -2.125000 +v 0.250000 0.500000 -2.125000 +v -0.187500 1.750000 0.562500 +v 0.187500 1.750000 0.562500 +v -0.187500 1.750000 -2.000000 +v 0.187500 1.750000 -2.000000 +v -0.187500 1.875000 -2.000000 +v -0.187500 1.875000 0.312500 +v 0.187500 1.875000 0.312500 +v 0.187500 1.875000 -2.000000 +v 0.250000 1.875000 -2.125000 +v 0.250000 1.875000 -2.250000 +v 0.187500 2.000000 -2.125000 +v 0.187500 2.000000 -2.250000 +v 0.125000 2.000000 -2.125000 +v 0.125000 2.000000 -2.250000 +v 0.125000 1.875000 -2.125000 +v 0.125000 1.875000 -2.250000 +v -0.250000 1.875000 -2.125000 +v -0.250000 1.875000 -2.250000 +v -0.187500 2.000000 -2.125000 +v -0.187500 2.000000 -2.250000 +v -0.125000 2.000000 -2.125000 +v -0.125000 2.000000 -2.250000 +v -0.125000 1.875000 -2.125000 +v -0.125000 1.875000 -2.250000 +v -0.250000 1.875000 -2.125000 +v 0.250000 1.875000 -2.125000 +v 0.250000 1.875000 -2.250000 +v -0.250000 1.875000 -2.250000 +v 0.250000 1.500000 -2.625000 +v -0.250000 1.500000 -2.625000 +v 0.250000 1.375000 -3.125000 +v -0.250000 1.375000 -3.125000 +v 0.250000 1.250000 -3.125000 +v -0.250000 1.250000 -3.125000 +v 0.187500 1.500000 -2.625000 +v 0.187500 1.375000 -3.125000 +v 0.187500 1.250000 -3.125000 +v -0.187500 1.500000 -2.625000 +v -0.187500 1.375000 -3.125000 +v -0.187500 1.250000 -3.125000 +v 0.187500 1.250000 -2.625000 +v -0.187500 1.250000 -2.625000 +v 0.250000 0.562500 -2.125000 +v -0.250000 0.562500 -2.125000 +v 0.437500 1.375000 -2.000000 +v 0.312500 1.250000 -2.000000 +v 0.312500 1.125000 -2.000000 +v 0.437500 1.000000 -2.000000 +v 0.437500 1.375000 -2.125000 +v 0.312500 1.250000 -2.125000 +v 0.312500 1.125000 -2.125000 +v 0.437500 1.000000 -2.125000 +vt 0.445652 0.207692 +vt 0.054348 0.253846 +vt 0.054348 0.207692 +vt 0.054348 0.276923 +vt 0.445652 0.253846 +vt 0.445652 0.276923 +vt 0.445652 0.184615 +vt 0.054348 0.184615 +vt 0.054348 0.461538 +vt 0.119565 0.484615 +vt 0.054348 0.484615 +vt 0.054348 0.530769 +vt 0.119565 0.553846 +vt 0.054348 0.553846 +vt 0.119565 0.530769 +vt 0.510870 0.269231 +vt 0.489130 0.192308 +vt 0.510870 0.192308 +vt 0.184783 0.323077 +vt 0.119565 0.446154 +vt 0.119565 0.015385 +vt 0.184783 0.061538 +vt 0.184783 0.138462 +vt 0.032609 0.600000 +vt 0.000000 0.646154 +vt -0.000000 0.600000 +vt 0.076087 0.646154 +vt 0.032609 0.692308 +vt 0.032609 0.646154 +vt 0.032609 0.553846 +vt 0.076087 0.600000 +vt 0.108696 0.646154 +vt 0.728261 0.261538 +vt 0.733696 0.215385 +vt 0.733696 0.261538 +vt 0.717391 0.215385 +vt 0.711957 0.261538 +vt 0.711957 0.215385 +vt 0.293478 0.007692 +vt 0.288043 0.053846 +vt 0.288043 0.007692 +vt 0.717391 -0.000000 +vt 0.711957 0.023077 +vt 0.711957 0.000000 +vt 0.728261 0.169231 +vt 0.733696 0.107692 +vt 0.733696 0.169231 +vt 0.717391 0.023077 +vt 0.711957 0.046154 +vt 0.358696 0.030769 +vt 0.500000 0.038462 +vt 0.358696 0.038462 +vt 0.717391 0.107692 +vt 0.711957 0.169231 +vt 0.711957 0.107692 +vt 0.293478 0.053846 +vt 0.326087 0.061538 +vt 0.293478 0.061538 +vt 0.728261 -0.000000 +vt 0.717391 0.046154 +vt 0.711957 0.092308 +vt 0.510870 0.030769 +vt 0.516304 0.007692 +vt 0.516304 0.030769 +vt 0.733696 0.046154 +vt 0.728261 0.023077 +vt 0.733696 0.023077 +vt 0.293478 0.115385 +vt 0.326087 0.069231 +vt 0.358696 0.092308 +vt 0.728261 0.092308 +vt 0.733696 0.092308 +vt 0.326087 0.053846 +vt 0.358696 0.061538 +vt 0.728261 0.107692 +vt 0.728261 0.476923 +vt 0.733696 0.453846 +vt 0.733696 0.476923 +vt 0.717391 0.169231 +vt 0.711957 0.207692 +vt 0.711957 0.176923 +vt 0.733696 0.207692 +vt 0.733696 0.176923 +vt 0.510870 0.007692 +vt 0.293478 0.000000 +vt 0.510870 -0.000000 +vt 0.717391 0.453846 +vt 0.711957 0.476923 +vt 0.711957 0.453846 +vt 0.711957 0.430769 +vt 0.728261 0.430769 +vt 0.733696 0.384615 +vt 0.733696 0.430769 +vt 0.358696 0.069231 +vt 0.326087 0.061538 +vt 0.358696 0.061538 +vt 0.728261 0.369231 +vt 0.733696 0.369231 +vt 0.293478 0.123077 +vt 0.510870 0.115385 +vt 0.510870 0.123077 +vt 0.717391 0.369231 +vt 0.711957 0.384615 +vt 0.711957 0.369231 +vt 0.728261 0.453846 +vt 0.293478 0.069231 +vt 0.288043 0.115385 +vt 0.288043 0.069231 +vt 0.733696 0.307692 +vt 0.717391 0.384615 +vt 0.500000 0.092308 +vt 0.358696 0.084615 +vt 0.500000 0.084615 +vt 0.717391 0.307692 +vt 0.711957 0.307692 +vt 0.293478 0.061538 +vt 0.516304 0.092308 +vt 0.516304 0.115385 +vt 0.711957 0.269231 +vt 0.711957 0.300000 +vt 0.728261 0.307692 +vt 0.733696 0.269231 +vt 0.733696 0.300000 +vt 0.728261 0.384615 +vt 0.717391 0.261538 +vt 0.728261 0.215385 +vt 0.717391 0.092308 +vt 0.728261 0.046154 +vt 0.679348 0.523077 +vt 0.701087 0.492308 +vt 0.701087 0.523077 +vt 0.706522 0.484615 +vt 0.706522 0.476923 +vt 0.739130 0.476923 +vt 0.684783 0.484615 +vt 0.695652 0.484615 +vt 0.684783 0.530769 +vt 0.695652 0.530769 +vt 0.760870 0.484615 +vt 0.744565 0.492308 +vt 0.750000 0.484615 +vt 0.744565 0.523077 +vt 0.760870 0.530769 +vt 0.750000 0.530769 +vt 0.766304 0.492308 +vt 0.739130 0.492308 +vt 0.706522 0.523077 +vt 0.706522 0.492308 +vt 0.739130 0.530769 +vt 0.739130 0.538462 +vt 0.706522 0.538462 +vt 0.222826 0.861538 +vt 0.282609 0.907692 +vt 0.239130 0.907692 +vt 0.239130 0.738462 +vt 0.298913 0.784615 +vt 0.222826 0.784615 +vt 0.298913 0.861538 +vt 0.326087 0.907692 +vt 0.385870 0.861538 +vt 0.369565 0.907692 +vt 0.309783 0.784615 +vt 0.369565 0.738462 +vt 0.385870 0.784615 +vt 0.309783 0.861538 +vt 0.326087 0.923077 +vt 0.369565 0.923077 +vt 0.396739 0.907692 +vt 0.396739 0.861538 +vt 0.396739 0.784615 +vt 0.298913 0.738462 +vt 0.309783 0.907692 +vt 0.298913 0.907692 +vt 0.369565 0.723077 +vt 0.326087 0.738462 +vt 0.326087 0.723077 +vt 0.385870 0.738462 +vt 0.396739 0.738462 +vt 0.570652 0.730769 +vt 0.711957 0.761538 +vt 0.570652 0.761538 +vt 0.570652 0.638462 +vt 0.711957 0.607692 +vt 0.711957 0.638462 +vt 0.711957 0.669231 +vt 0.570652 0.669231 +vt 0.711957 0.730769 +vt 0.570652 0.576923 +vt 0.570652 0.607692 +vt 0.570652 0.792308 +vt 0.766304 0.861538 +vt 0.603261 0.815385 +vt 0.766304 0.815385 +vt 0.570652 0.815385 +vt 0.603261 0.861538 +vt 0.570652 0.861538 +vt 0.744565 0.792308 +vt 0.570652 0.792308 +vt 0.815217 0.861538 +vt 0.744565 0.884615 +vt 0.766304 0.746154 +vt 0.766304 0.930769 +vt 0.744565 0.930769 +vt 0.396739 0.861538 +vt 0.456522 0.907692 +vt 0.413043 0.907692 +vt 0.413043 0.738462 +vt 0.472826 0.784615 +vt 0.396739 0.784615 +vt 0.461957 0.815385 +vt 0.461957 0.830769 +vt 0.500000 0.907692 +vt 0.559783 0.861538 +vt 0.543478 0.907692 +vt 0.483696 0.784615 +vt 0.543478 0.738462 +vt 0.559783 0.784615 +vt 0.494565 0.830769 +vt 0.494565 0.815385 +vt 0.500000 0.923077 +vt 0.543478 0.923077 +vt 0.570652 0.907692 +vt 0.570652 0.861538 +vt 0.570652 0.784615 +vt 0.472826 0.738462 +vt 0.472826 0.861538 +vt 0.483696 0.907692 +vt 0.472826 0.907692 +vt 0.543478 0.723077 +vt 0.500000 0.738462 +vt 0.500000 0.723077 +vt 0.483696 0.800000 +vt 0.472826 0.800000 +vt 0.559783 0.738462 +vt 0.570652 0.738462 +vt 0.222826 0.692308 +vt -0.000000 0.738462 +vt -0.000000 0.692308 +vt 0.021739 0.753846 +vt 0.222826 0.800000 +vt 0.021739 0.800000 +vt 0.222826 0.738462 +vt 0.222826 0.815385 +vt 0.000000 0.753846 +vt 0.000000 0.800000 +vt 0.804348 0.646154 +vt 0.793478 0.630769 +vt 0.804348 0.630769 +vt 0.804348 0.653846 +vt 0.793478 0.646154 +vt 0.804348 0.669231 +vt 0.793478 0.653846 +vt 0.782609 0.653846 +vt 0.782609 0.638462 +vt 0.815217 0.653846 +vt 0.793478 0.707692 +vt 0.804348 0.692308 +vt 0.804348 0.707692 +vt 0.793478 0.692308 +vt 0.804348 0.684615 +vt 0.793478 0.684615 +vt 0.804348 0.669231 +vt 0.782609 0.684615 +vt 0.782609 0.700000 +vt 0.815217 0.684615 +vt 0.815217 0.700000 +vt 0.815110 0.687200 +vt 0.826087 0.746154 +vt 0.815217 0.746154 +vt 0.858696 0.692308 +vt 0.902174 0.684615 +vt 0.902174 0.692308 +vt 0.907609 0.607692 +vt 0.902174 0.623077 +vt 0.902174 0.607692 +vt 0.902174 0.738462 +vt 0.858696 0.746154 +vt 0.858696 0.738462 +vt 0.902174 0.807692 +vt 0.907609 0.823077 +vt 0.902174 0.823077 +vt 0.826087 0.684615 +vt 0.815217 0.600000 +vt 0.771739 0.553846 +vt 0.815217 0.553846 +vt 0.771739 0.600000 +vt 0.815217 0.615385 +vt 0.771739 0.630769 +vt 0.750000 0.553846 +vt 0.750000 0.600000 +vt 0.815217 0.538462 +vt 0.771739 0.523077 +vt 0.858696 0.638462 +vt 0.858696 0.792308 +vt 0.815217 0.907692 +vt 0.472826 0.846154 +vt 0.483696 0.861538 +vt 0.472826 0.830769 +vt 0.483696 0.846154 +vt 0.472826 0.815385 +vt 0.483696 0.830769 +vt 0.483696 0.815385 +vt 0.456522 0.269231 +vt 0.733696 -0.000000 +vt 0.119565 0.461538 +vt 0.489130 0.269231 +vt 0.445652 0.323077 +vt 0.423913 0.323077 +vt 0.184783 0.400000 +vt 0.152174 0.446154 +vt 0.054348 0.000000 +vt 0.119565 -0.000000 +vt 0.152174 0.015385 +vt 0.445652 0.138462 +vt 0.423913 0.138462 +vt 0.097826 0.692308 +vt 0.097826 0.553846 +vt 0.108696 0.600000 +vt 0.500000 0.030769 +vt 0.510870 0.092308 +vt 0.358696 0.053846 +vt 0.717391 0.476923 +vt 0.717391 0.430769 +vt 0.679348 0.492308 +vt 0.739130 0.484615 +vt 0.766304 0.523077 +vt 0.739130 0.523077 +vt 0.706522 0.530769 +vt 0.282609 0.738462 +vt 0.385870 0.907692 +vt 0.309783 0.738462 +vt 0.711957 0.576923 +vt 0.711957 0.792308 +vt 0.815217 0.815385 +vt 0.570652 0.884615 +vt 0.744565 0.746154 +vt 0.456522 0.738462 +vt 0.559783 0.907692 +vt 0.483696 0.738462 +vt 0.222826 0.753846 +vt -0.000000 0.815385 +vt 0.793478 0.669231 +vt 0.815217 0.638462 +vt 0.793478 0.669231 +vt 0.858696 0.684615 +vt 0.907609 0.623077 +vt 0.902174 0.746154 +vt 0.907609 0.807692 +vt 0.815217 0.523077 +vt 0.456522 0.192308 +vt 0.043478 0.276923 +vt 0.043478 0.461538 +vt 0.043478 -0.000000 +vt 0.043478 0.184615 +vt 0.043478 0.253846 +vt 0.043478 0.207692 +vt 0.043478 0.484615 +vt 0.043478 0.530769 +vt 0.043478 0.553846 +vt 0.032609 0.276923 +vt 0.032609 0.461538 +vt 0.032609 0.000000 +vt 0.032609 0.184615 +vt 0.032609 0.207692 +vt 0.032609 0.253846 +vt 0.032609 0.530769 +vt 0.032609 0.553846 +vt 0.032609 0.484615 +vn 0.0000 -1.0000 0.0000 +vn 0.7071 -0.7071 0.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.7071 0.7071 0.0000 +vn -0.7071 0.7071 0.0000 +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.5547 -0.8321 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.8944 -0.4472 +vn 0.0000 -0.7071 -0.7071 +vn -0.8944 0.4472 0.0000 +vn 0.8944 0.4472 0.0000 +vn 0.8944 -0.4472 0.0000 +vn -0.8944 -0.4472 0.0000 +vn 0.0000 -0.8944 0.4472 +vn 0.0000 0.8944 0.4472 +vn 0.0000 0.9701 -0.2425 +vn 0.0000 0.7071 -0.7071 +vn 0.6269 -0.2597 0.7345 +vn 0.6269 0.2597 0.7345 +vn -0.6269 0.2597 0.7345 +vn -0.6269 -0.2597 0.7345 +vn 0.2597 -0.6269 0.7345 +vn -0.2597 -0.6269 0.7345 +vn 0.2597 0.6269 0.7345 +vn -0.2597 0.6269 0.7345 +vn -0.8125 0.3366 0.4760 +vn -0.8125 -0.3366 0.4760 +vn 0.8125 -0.3366 0.4760 +vn 0.8125 0.3366 0.4760 +vn 0.3366 0.8125 0.4760 +vn -0.3366 0.8125 0.4760 +vn 0.3366 -0.8125 0.4760 +vn -0.3366 -0.8125 0.4760 +s off +f 266/358/82 305/359/82 304/360/82 +f 301/361/83 269/362/83 263/363/83 +f 262/364/84 304/360/84 302/365/84 +f 300/366/85 287/367/85 307/368/85 +f 306/369/86 284/370/86 303/371/86 +f 307/368/87 286/372/87 306/369/87 +f 271/373/87 290/374/87 270/375/87 +f 273/376/88 279/377/88 301/361/88 +f 278/378/89 274/379/89 272/380/89 +f 295/381/90 292/382/90 293/383/90 +f 298/384/89 292/385/89 294/386/89 +f 293/387/88 299/388/88 295/381/88 +f 299/388/87 294/386/87 295/381/87 +f 299/388/91 296/389/91 298/384/91 +f 359/390/92 333/391/92 355/392/92 +f 356/393/90 354/394/90 332/395/90 +f 364/396/90 317/397/90 316/398/90 +f 371/399/93 326/400/93 323/401/93 +f 379/402/92 329/403/92 331/404/92 +f 374/405/90 289/406/90 326/400/90 +f 369/407/87 323/408/87 321/409/87 +f 376/410/90 330/411/90 328/412/90 +f 365/413/87 319/414/87 317/415/87 +f 373/416/88 374/405/88 371/399/88 +f 363/417/90 282/418/90 289/406/90 +f 373/419/92 324/420/92 325/421/92 +f 288/422/92 375/423/92 327/424/92 +f 384/425/89 387/426/89 389/427/89 +f 361/428/92 288/422/92 283/429/92 +f 367/430/94 321/431/94 319/414/94 +f 377/432/92 283/429/92 329/403/92 +f 364/396/88 369/407/88 367/430/88 +f 282/418/90 376/410/90 328/412/90 +f 393/433/95 349/434/95 347/435/95 +f 378/436/90 332/437/90 330/438/90 +f 333/439/92 379/402/92 331/440/92 +f 372/441/82 316/442/82 324/443/82 +f 394/444/93 345/445/93 348/446/93 +f 337/447/90 394/444/90 348/446/90 +f 382/448/92 335/449/92 336/450/92 +f 389/451/94 341/452/94 343/453/94 +f 335/449/92 397/454/92 351/455/92 +f 338/456/82 392/457/82 346/458/82 +f 396/459/90 334/460/90 350/461/90 +f 395/462/92 336/450/92 349/434/92 +f 385/463/90 338/464/90 339/465/90 +f 397/454/92 353/466/92 351/455/92 +f 380/467/90 337/447/90 334/460/90 +f 391/468/87 343/469/87 345/470/87 +f 398/471/90 350/461/90 352/472/90 +f 387/426/87 339/473/87 341/452/87 +f 392/457/92 347/474/92 346/475/92 +f 354/476/90 398/471/90 352/477/90 +f 399/478/92 355/479/92 353/480/92 +f 394/444/84 382/448/84 395/462/84 +f 382/448/89 380/467/89 381/481/89 +f 381/481/96 396/459/96 397/454/96 +f 399/478/89 396/459/89 398/471/89 +f 398/471/86 359/390/86 399/478/86 +f 356/393/87 359/390/87 358/482/87 +f 356/393/85 379/402/85 357/483/85 +f 379/402/88 376/410/88 377/432/88 +f 360/484/97 377/432/97 376/410/97 +f 362/485/88 360/484/88 363/417/88 +f 363/417/83 375/423/83 362/485/83 +f 393/433/89 394/444/89 395/462/89 +f 322/486/84 400/487/84 403/488/84 +f 400/489/92 340/490/92 342/491/92 +f 400/487/92 320/492/92 340/493/92 +f 386/494/90 403/488/90 368/495/90 +f 318/496/92 401/497/92 342/498/92 +f 402/499/90 388/500/90 366/501/90 +f 390/502/83 402/499/83 401/497/83 +f 407/503/82 405/504/82 404/505/82 +f 400/487/89 405/504/89 403/488/89 +f 402/499/88 407/503/88 401/497/88 +f 402/506/90 366/507/90 368/508/90 +f 410/509/90 409/510/90 408/511/90 +f 414/512/90 413/513/90 412/514/90 +f 412/514/90 411/515/90 410/509/90 +f 416/516/92 419/517/92 417/518/92 +f 420/519/92 422/520/92 421/521/92 +f 418/522/92 421/521/92 419/517/92 +f 409/523/87 417/518/87 408/524/87 +f 408/525/96 419/517/96 410/526/96 +f 410/526/89 421/521/89 412/527/89 +f 415/528/98 420/519/98 413/513/98 +f 411/515/97 416/529/97 409/530/97 +f 414/531/82 423/532/82 415/533/82 +f 413/513/88 418/522/88 411/515/88 +f 412/527/99 422/534/99 414/535/99 +f 426/536/89 429/537/89 424/538/89 +f 425/539/98 434/540/98 428/541/98 +f 425/539/88 430/542/88 427/543/88 +f 427/543/87 431/544/87 426/536/87 +f 433/545/82 434/540/82 432/546/82 +f 429/537/99 433/547/99 424/538/99 +f 440/548/82 443/549/82 441/550/82 +f 439/551/100 442/552/100 438/553/100 +f 437/554/89 443/549/89 439/555/89 +f 441/550/92 446/556/92 440/548/92 +f 436/557/88 442/552/88 440/548/88 +f 437/554/89 447/558/89 441/550/89 +f 436/557/88 446/559/88 444/560/88 +f 450/561/90 449/562/90 448/563/90 +f 454/564/90 453/565/90 452/566/90 +f 452/566/90 510/567/90 509/568/90 +f 456/569/92 459/570/92 457/571/92 +f 460/572/92 462/573/92 461/574/92 +f 513/575/92 514/576/92 461/574/92 +f 449/577/87 457/571/87 448/578/87 +f 448/579/96 459/570/96 450/580/96 +f 450/580/89 461/574/89 452/581/89 +f 455/582/98 460/572/98 453/565/98 +f 451/583/97 456/584/97 449/585/97 +f 454/586/82 463/587/82 455/588/82 +f 453/565/88 515/589/88 511/590/88 +f 452/581/99 462/591/99 454/592/99 +f 466/593/82 465/594/82 464/595/82 +f 470/596/87 468/597/87 469/598/87 +f 467/599/88 470/596/88 465/594/88 +f 466/600/89 469/598/89 468/597/89 +f 465/601/101 469/598/101 464/602/101 +f 475/603/97 472/604/97 473/605/97 +f 477/606/87 474/607/87 475/603/87 +f 479/608/89 476/609/89 477/606/89 +f 474/607/90 478/610/90 472/611/90 +f 475/603/92 479/612/92 477/606/92 +f 480/613/96 483/614/96 481/615/96 +f 482/616/87 485/617/87 483/614/87 +f 484/618/88 487/619/88 485/617/88 +f 486/620/90 482/616/90 480/621/90 +f 483/614/92 487/622/92 481/623/92 +f 489/624/87 491/625/87 488/626/87 +f 498/627/102 494/628/102 499/629/102 +f 500/630/92 494/631/92 496/632/92 +f 502/633/102 493/634/102 501/635/102 +f 495/636/92 503/637/92 497/638/92 +f 490/639/103 498/627/103 501/635/103 +f 503/640/87 504/641/87 500/642/87 +f 505/643/88 502/644/88 501/645/88 +f 498/646/92 505/643/92 501/647/92 +f 499/648/89 504/641/89 498/649/89 +f 496/632/88 494/631/88 492/650/88 +f 493/651/89 497/638/89 507/652/89 +f 508/653/88 458/654/88 451/583/88 +f 509/655/83 512/656/83 508/653/83 +f 510/657/88 513/658/88 509/655/88 +f 511/590/85 514/659/85 510/657/85 +f 290/374/92 263/660/92 266/358/92 +f 375/423/95 325/661/95 327/424/95 +f 266/358/82 269/362/82 305/359/82 +f 301/361/83 305/359/83 269/362/83 +f 262/364/84 266/358/84 304/360/84 +f 300/366/85 285/662/85 287/367/85 +f 306/369/86 286/372/86 284/370/86 +f 307/368/87 287/367/87 286/372/87 +f 271/373/87 291/663/87 290/374/87 +f 301/361/88 263/363/88 273/376/88 +f 263/363/88 291/664/88 271/665/88 +f 271/665/88 273/376/88 263/363/88 +f 285/662/88 300/366/88 279/377/88 +f 300/366/88 301/361/88 279/377/88 +f 275/666/88 277/667/88 279/377/88 +f 273/376/88 275/666/88 279/377/88 +f 302/365/89 303/668/89 278/378/89 +f 303/668/89 284/669/89 278/378/89 +f 278/378/89 276/670/89 274/379/89 +f 290/671/89 262/364/89 270/672/89 +f 262/364/89 302/365/89 272/380/89 +f 270/672/89 262/364/89 272/380/89 +f 302/365/89 278/378/89 272/380/89 +f 295/381/90 294/386/90 292/382/90 +f 298/384/89 296/673/89 292/385/89 +f 293/387/88 297/674/88 299/388/88 +f 299/388/87 298/384/87 294/386/87 +f 299/388/91 297/675/91 296/389/91 +f 359/390/92 357/483/92 333/391/92 +f 356/393/90 358/482/90 354/394/90 +f 364/396/90 365/413/90 317/397/90 +f 371/399/93 374/405/93 326/400/93 +f 379/402/92 377/432/92 329/403/92 +f 374/405/90 363/417/90 289/406/90 +f 369/407/87 371/676/87 323/408/87 +f 376/410/90 378/436/90 330/411/90 +f 365/413/87 367/430/87 319/414/87 +f 373/416/88 375/423/88 374/405/88 +f 363/417/90 360/484/90 282/418/90 +f 373/419/92 372/441/92 324/420/92 +f 288/422/92 362/485/92 375/423/92 +f 384/425/89 385/463/89 387/426/89 +f 389/427/89 391/468/89 392/457/89 +f 391/468/89 393/677/89 392/457/89 +f 389/427/89 392/457/89 384/425/89 +f 361/428/92 362/485/92 288/422/92 +f 367/430/94 369/678/94 321/431/94 +f 377/432/92 361/428/92 283/429/92 +f 364/396/88 372/441/88 369/407/88 +f 372/441/88 373/419/88 371/676/88 +f 371/676/88 369/407/88 372/441/88 +f 367/430/88 365/413/88 364/396/88 +f 282/418/90 360/484/90 376/410/90 +f 393/433/95 395/462/95 349/434/95 +f 378/436/90 356/393/90 332/437/90 +f 333/439/92 357/483/92 379/402/92 +f 372/441/82 364/396/82 316/442/82 +f 394/444/93 391/679/93 345/445/93 +f 337/447/90 383/680/90 394/444/90 +f 382/448/92 381/481/92 335/449/92 +f 389/451/94 387/426/94 341/452/94 +f 335/449/92 381/481/92 397/454/92 +f 338/456/82 384/425/82 392/457/82 +f 396/459/90 380/467/90 334/460/90 +f 395/462/92 382/448/92 336/450/92 +f 385/463/90 384/425/90 338/464/90 +f 397/454/92 399/478/92 353/466/92 +f 380/467/90 383/680/90 337/447/90 +f 391/468/87 389/427/87 343/469/87 +f 398/471/90 396/459/90 350/461/90 +f 387/426/87 385/463/87 339/473/87 +f 392/457/92 393/677/92 347/474/92 +f 354/476/90 358/482/90 398/471/90 +f 399/478/92 359/390/92 355/479/92 +f 394/444/84 383/680/84 382/448/84 +f 382/448/89 383/680/89 380/467/89 +f 381/481/96 380/467/96 396/459/96 +f 399/478/89 397/454/89 396/459/89 +f 398/471/86 358/482/86 359/390/86 +f 356/393/87 357/483/87 359/390/87 +f 356/393/85 378/436/85 379/402/85 +f 379/402/88 378/436/88 376/410/88 +f 360/484/97 361/428/97 377/432/97 +f 362/485/88 361/428/88 360/484/88 +f 363/417/83 374/405/83 375/423/83 +f 393/433/89 391/679/89 394/444/89 +f 322/486/84 344/681/84 400/487/84 +f 342/491/92 401/682/92 400/489/92 +f 401/682/92 407/503/92 400/489/92 +f 407/503/92 404/505/92 400/489/92 +f 400/487/92 344/681/92 320/492/92 +f 386/494/90 322/486/90 403/488/90 +f 318/496/92 390/502/92 401/497/92 +f 402/499/90 370/683/90 388/500/90 +f 390/502/83 370/683/83 402/499/83 +f 407/503/82 406/684/82 405/504/82 +f 400/487/89 404/505/89 405/504/89 +f 402/499/88 406/684/88 407/503/88 +f 368/508/90 403/685/90 402/506/90 +f 403/685/90 405/504/90 402/506/90 +f 405/504/90 406/684/90 402/506/90 +f 410/509/90 411/515/90 409/510/90 +f 414/512/90 415/686/90 413/513/90 +f 412/514/90 413/513/90 411/515/90 +f 416/516/92 418/522/92 419/517/92 +f 420/519/92 423/532/92 422/520/92 +f 418/522/92 420/519/92 421/521/92 +f 409/523/87 416/516/87 417/518/87 +f 408/525/96 417/687/96 419/517/96 +f 410/526/89 419/517/89 421/521/89 +f 415/528/98 423/688/98 420/519/98 +f 411/515/97 418/522/97 416/529/97 +f 414/531/82 422/520/82 423/532/82 +f 413/513/88 420/519/88 418/522/88 +f 412/527/99 421/521/99 422/534/99 +f 426/536/89 431/544/89 429/537/89 +f 425/539/98 432/546/98 434/540/98 +f 425/539/88 428/541/88 430/542/88 +f 427/543/87 430/542/87 431/544/87 +f 433/545/82 435/689/82 434/540/82 +f 429/537/99 435/690/99 433/547/99 +f 440/548/82 442/552/82 443/549/82 +f 439/551/100 443/549/100 442/552/100 +f 437/554/89 441/550/89 443/549/89 +f 441/550/92 447/691/92 446/556/92 +f 436/557/88 438/692/88 442/552/88 +f 437/554/89 445/693/89 447/558/89 +f 436/557/88 440/548/88 446/559/88 +f 450/561/90 451/583/90 449/562/90 +f 454/564/90 455/694/90 453/565/90 +f 451/583/90 450/561/90 509/568/90 +f 450/561/90 452/566/90 509/568/90 +f 452/566/90 453/565/90 510/567/90 +f 453/565/90 511/590/90 510/567/90 +f 508/653/90 451/583/90 509/568/90 +f 456/569/92 458/654/92 459/570/92 +f 460/572/92 463/587/92 462/573/92 +f 461/574/92 459/570/92 513/575/92 +f 459/570/92 458/654/92 513/575/92 +f 458/654/92 512/656/92 513/575/92 +f 514/576/92 515/589/92 460/572/92 +f 514/576/92 460/572/92 461/574/92 +f 449/577/87 456/569/87 457/571/87 +f 448/579/96 457/695/96 459/570/96 +f 450/580/89 459/570/89 461/574/89 +f 455/582/98 463/696/98 460/572/98 +f 451/583/97 458/654/97 456/584/97 +f 454/586/82 462/573/82 463/587/82 +f 453/565/88 460/572/88 515/589/88 +f 452/581/99 461/574/99 462/591/99 +f 466/593/82 467/599/82 465/594/82 +f 470/596/87 471/697/87 468/597/87 +f 467/599/88 471/697/88 470/596/88 +f 466/600/89 464/698/89 469/598/89 +f 465/601/101 470/596/101 469/598/101 +f 475/603/97 474/607/97 472/604/97 +f 477/606/87 476/609/87 474/607/87 +f 479/608/89 478/699/89 476/609/89 +f 474/607/90 476/609/90 478/610/90 +f 475/603/92 473/700/92 479/612/92 +f 480/613/96 482/616/96 483/614/96 +f 482/616/87 484/618/87 485/617/87 +f 484/618/88 486/701/88 487/619/88 +f 486/620/90 484/618/90 482/616/90 +f 483/614/92 485/617/92 487/622/92 +f 489/624/87 490/639/87 491/625/87 +f 498/627/102 492/702/102 494/628/102 +f 500/630/92 499/703/92 494/631/92 +f 502/633/102 495/704/102 493/634/102 +f 495/636/92 502/705/92 503/637/92 +f 493/634/103 491/625/103 501/635/103 +f 491/625/103 490/639/103 501/635/103 +f 490/639/103 492/702/103 498/627/103 +f 503/640/87 505/643/87 504/641/87 +f 505/643/88 503/640/88 502/644/88 +f 498/646/92 504/641/92 505/643/92 +f 499/648/89 500/642/89 504/641/89 +f 490/639/88 489/624/88 492/650/88 +f 489/624/88 506/706/88 492/650/88 +f 506/706/88 496/632/88 492/650/88 +f 488/626/89 491/625/89 493/651/89 +f 493/651/89 495/636/89 497/638/89 +f 507/652/89 488/626/89 493/651/89 +f 508/653/88 512/656/88 458/654/88 +f 509/655/83 513/658/83 512/656/83 +f 510/657/88 514/659/88 513/658/88 +f 511/590/85 515/589/85 514/659/85 +f 266/358/92 262/707/92 290/374/92 +f 290/374/92 291/663/92 263/660/92 +f 263/660/92 269/362/92 266/358/92 +f 375/423/95 373/416/95 325/661/95 +s 1 +f 309/708/104 300/366/105 308/709/105 +f 311/710/106 302/365/107 310/711/107 +f 313/712/108 304/360/109 305/359/108 +f 312/713/109 302/365/107 304/360/109 +f 309/708/104 305/359/108 301/361/104 +f 315/714/110 306/369/111 314/715/111 +f 314/715/111 303/371/106 311/716/106 +f 308/709/105 307/368/110 315/714/110 +f 261/717/112 308/709/113 265/718/113 +f 264/719/114 310/711/115 260/720/115 +f 267/721/116 313/712/117 268/722/117 +f 260/720/115 312/713/116 267/721/116 +f 268/722/117 309/708/112 261/717/112 +f 280/723/118 315/714/119 314/715/118 +f 264/724/114 314/715/118 311/716/114 +f 265/718/113 315/714/119 281/725/119 +f 309/708/104 301/361/104 300/366/105 +f 311/710/106 303/668/106 302/365/107 +f 313/712/108 312/713/109 304/360/109 +f 312/713/109 310/711/107 302/365/107 +f 309/708/104 313/712/108 305/359/108 +f 315/714/110 307/368/110 306/369/111 +f 314/715/111 306/369/111 303/371/106 +f 308/709/105 300/366/105 307/368/110 +f 261/717/112 309/708/112 308/709/113 +f 264/719/114 311/710/114 310/711/115 +f 267/721/116 312/713/116 313/712/117 +f 260/720/115 310/711/115 312/713/116 +f 268/722/117 313/712/117 309/708/112 +f 280/723/118 281/725/119 315/714/119 +f 264/724/114 280/723/118 314/715/118 +f 265/718/113 308/709/113 315/714/119 diff --git a/src/main/resources/assets/hbm/models/weapons/sexy.obj b/src/main/resources/assets/hbm/models/weapons/sexy.obj index 114be9b3d..53da0cde9 100644 --- a/src/main/resources/assets/hbm/models/weapons/sexy.obj +++ b/src/main/resources/assets/hbm/models/weapons/sexy.obj @@ -139,8 +139,8 @@ vt 0.933357 0.212107 vt 0.966667 0.000061 vt 0.995513 0.020249 vt 0.937820 0.020249 -vt 0.999976 0.040436 -vt 0.983321 0.071080 +vt 0.933357 0.040436 +vt 0.950012 0.071080 vt 0.966667 0.065671 vt 0.075000 0.136364 vt 0.066667 0.121212 @@ -206,17 +206,17 @@ vt 0.999976 0.131281 vt 0.995513 0.151468 vt 0.983321 0.005470 vt 0.950012 0.005470 -vt 0.937820 0.085859 -vt 0.933357 0.106046 -vt 0.933357 0.040436 -vt 0.937820 0.020249 -vt 0.950012 0.005470 -vt 0.966667 0.000061 -vt 0.983321 0.005470 -vt 0.995513 0.020249 -vt 0.999976 0.106046 vt 0.995513 0.085859 -vt 0.950012 0.071080 +vt 0.999976 0.106046 +vt 0.999976 0.040436 +vt 0.995513 0.020249 +vt 0.983321 0.005470 +vt 0.966667 0.000061 +vt 0.950012 0.005470 +vt 0.937820 0.020249 +vt 0.933357 0.106046 +vt 0.937820 0.085859 +vt 0.983321 0.071080 vt 0.066667 0.181818 vt 0.039454 0.130050 vt 0.044792 0.123580 @@ -2777,9 +2777,9 @@ vt 0.612500 0.313131 vt 0.983257 0.793649 vt 0.999848 0.828481 vt 0.933485 0.828481 -vt 0.933485 0.828481 -vt 0.950076 0.793649 -vt 0.999848 0.828481 +vt 0.933485 0.702218 +vt 0.950076 0.667387 +vt 0.999848 0.702218 vt 0.933384 0.595929 vt 0.950025 0.560991 vt 0.999949 0.595929 @@ -2787,8 +2787,8 @@ vt 0.999949 0.424312 vt 0.983308 0.454931 vt 0.966667 0.449526 vt 0.966667 0.383970 -vt 0.995490 0.404141 vt 0.937843 0.404141 +vt 0.995490 0.404141 vt 0.658333 0.181938 vt 0.666568 0.191919 vt 0.658333 0.201900 @@ -3055,17 +3055,17 @@ vt 0.950076 0.793649 vt 0.966667 0.788261 vt 0.995403 0.808371 vt 0.983257 0.908559 -vt 0.995403 0.893838 -vt 0.983257 0.908559 -vt 0.937931 0.893838 -vt 0.966667 0.913948 -vt 0.950076 0.908559 -vt 0.933485 0.873728 -vt 0.999848 0.873728 -vt 0.937931 0.808371 -vt 0.966667 0.788261 -vt 0.983257 0.793649 -vt 0.995403 0.808371 +vt 0.995403 0.767575 +vt 0.983257 0.782297 +vt 0.937931 0.767575 +vt 0.966667 0.787685 +vt 0.950076 0.782297 +vt 0.933485 0.747465 +vt 0.999848 0.747465 +vt 0.937931 0.682108 +vt 0.966667 0.661998 +vt 0.983257 0.667387 +vt 0.995403 0.682108 vt 0.995490 0.641313 vt 0.983308 0.656080 vt 0.937843 0.641313 @@ -3088,19 +3088,19 @@ vt 0.933384 0.489868 vt 0.933384 0.424312 vt 0.937843 0.469697 vt 0.950025 0.454931 -vt 0.983308 0.550019 -vt 0.966667 0.555424 vt 0.950025 0.550019 -vt 0.937843 0.535253 -vt 0.933384 0.515082 -vt 0.933384 0.489868 -vt 0.933384 0.424312 +vt 0.966667 0.555424 +vt 0.983308 0.550019 +vt 0.995490 0.535253 +vt 0.999949 0.515082 vt 0.999949 0.489868 vt 0.999949 0.424312 -vt 0.999949 0.515082 -vt 0.995490 0.535253 -vt 0.983308 0.389375 +vt 0.933384 0.489868 +vt 0.933384 0.424312 +vt 0.933384 0.515082 +vt 0.937843 0.535253 vt 0.950025 0.389375 +vt 0.983308 0.389375 vt 0.652511 0.198977 vt 0.650099 0.191919 vt 0.652511 0.184862 diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index d7c59ae2c..f9d9b867d 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -64,10 +64,14 @@ "block.fel": {"category": "block", "sounds": [{"name": "block/fel", "stream": false}]}, "block.hephaestusRunning": {"category": "block", "sounds": [{"name": "block/hephaestusRunning", "stream": false}]}, "block.squeakyToy": {"category": "block", "sounds": [{"name": "block/squeakyToy", "stream": false}]}, + "block.hunduns_magnificent_howl": {"category": "block", "sounds": [{"name": "block/hunduns_magnificent_howl", "stream": false}]}, "block.pyroOperate": {"category": "block", "sounds": [{"name": "block/pyroOperate", "stream": false}]}, "block.motor": {"category": "block", "sounds": [{"name": "block/motor", "stream": false}]}, "block.engine": {"category": "block", "sounds": [{"name": "block/engine", "stream": false}]}, "block.chemicalPlant": {"category": "block", "sounds": [{"name": "block/chemicalPlant", "stream": false}]}, + "block.assemblerStrike": {"category": "block", "sounds": ["block/assemblerStrike1", "block/assemblerStrike2"]}, + "block.assemblerStart": {"category": "block", "sounds": [{"name": "block/assemblerStart", "stream": false}]}, + "block.assemblerStop": {"category": "block", "sounds": [{"name": "block/assemblerStop", "stream": false}]}, "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}]}, @@ -219,6 +223,7 @@ "weapon.explosionSmallNear": {"category": "player", "sounds": ["weapon/explosionSmallNear1", "weapon/explosionSmallNear2", "weapon/explosionSmallNear3"]}, "weapon.explosionSmallFar": {"category": "player", "sounds": ["weapon/explosionSmallFar1", "weapon/explosionSmallFar2"]}, "weapon.explosionTiny": {"category": "player", "sounds": ["weapon/explosionTiny1", "weapon/explosionTiny2"]}, + "weapon.hkShoot": {"category": "player", "sounds": [{"name": "weapon/hkShoot", "stream": false}]}, "weapon.dFlash": {"category": "player", "sounds": [{"name": "weapon/dFlash", "stream": false}]}, diff --git a/src/main/resources/assets/hbm/sounds/block/assemblerStart.ogg b/src/main/resources/assets/hbm/sounds/block/assemblerStart.ogg new file mode 100644 index 000000000..5761f14fe Binary files /dev/null and b/src/main/resources/assets/hbm/sounds/block/assemblerStart.ogg differ diff --git a/src/main/resources/assets/hbm/sounds/block/assemblerStop.ogg b/src/main/resources/assets/hbm/sounds/block/assemblerStop.ogg new file mode 100644 index 000000000..a6e656e91 Binary files /dev/null and b/src/main/resources/assets/hbm/sounds/block/assemblerStop.ogg differ diff --git a/src/main/resources/assets/hbm/sounds/block/assemblerStrike1.ogg b/src/main/resources/assets/hbm/sounds/block/assemblerStrike1.ogg new file mode 100644 index 000000000..6ef5dcf38 Binary files /dev/null and b/src/main/resources/assets/hbm/sounds/block/assemblerStrike1.ogg differ diff --git a/src/main/resources/assets/hbm/sounds/block/assemblerStrike2.ogg b/src/main/resources/assets/hbm/sounds/block/assemblerStrike2.ogg new file mode 100644 index 000000000..2850ce7ac Binary files /dev/null and b/src/main/resources/assets/hbm/sounds/block/assemblerStrike2.ogg differ diff --git a/src/main/resources/assets/hbm/sounds/block/hunduns_magnificent_howl.ogg b/src/main/resources/assets/hbm/sounds/block/hunduns_magnificent_howl.ogg new file mode 100644 index 000000000..69ece8b82 Binary files /dev/null and b/src/main/resources/assets/hbm/sounds/block/hunduns_magnificent_howl.ogg differ diff --git a/src/main/resources/assets/hbm/sounds/weapon/hkShoot.ogg b/src/main/resources/assets/hbm/sounds/weapon/hkShoot.ogg new file mode 100644 index 000000000..883b0e46a Binary files /dev/null and b/src/main/resources/assets/hbm/sounds/weapon/hkShoot.ogg differ diff --git a/src/main/resources/assets/hbm/structures/lighthouse.nbt b/src/main/resources/assets/hbm/structures/lighthouse.nbt index 84670465e..ff4216353 100644 Binary files a/src/main/resources/assets/hbm/structures/lighthouse.nbt and b/src/main/resources/assets/hbm/structures/lighthouse.nbt differ diff --git a/src/main/resources/assets/hbm/structures/ntmruinsA.nbt b/src/main/resources/assets/hbm/structures/ntmruinsA.nbt new file mode 100644 index 000000000..100fab771 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/ntmruinsA.nbt differ diff --git a/src/main/resources/assets/hbm/structures/ntmruinsB.nbt b/src/main/resources/assets/hbm/structures/ntmruinsB.nbt new file mode 100644 index 000000000..7a744fd01 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/ntmruinsB.nbt differ diff --git a/src/main/resources/assets/hbm/structures/ntmruinsC.nbt b/src/main/resources/assets/hbm/structures/ntmruinsC.nbt new file mode 100644 index 000000000..3de68c43d Binary files /dev/null and b/src/main/resources/assets/hbm/structures/ntmruinsC.nbt differ diff --git a/src/main/resources/assets/hbm/structures/ntmruinsD.nbt b/src/main/resources/assets/hbm/structures/ntmruinsD.nbt new file mode 100644 index 000000000..a92f157ce Binary files /dev/null and b/src/main/resources/assets/hbm/structures/ntmruinsD.nbt differ diff --git a/src/main/resources/assets/hbm/structures/ntmruinsE.nbt b/src/main/resources/assets/hbm/structures/ntmruinsE.nbt new file mode 100644 index 000000000..8a3678165 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/ntmruinsE.nbt differ diff --git a/src/main/resources/assets/hbm/structures/ntmruinsF.nbt b/src/main/resources/assets/hbm/structures/ntmruinsF.nbt new file mode 100644 index 000000000..a048ef48c Binary files /dev/null and b/src/main/resources/assets/hbm/structures/ntmruinsF.nbt differ diff --git a/src/main/resources/assets/hbm/structures/ntmruinsG.nbt b/src/main/resources/assets/hbm/structures/ntmruinsG.nbt new file mode 100644 index 000000000..c5d83aafd Binary files /dev/null and b/src/main/resources/assets/hbm/structures/ntmruinsG.nbt differ diff --git a/src/main/resources/assets/hbm/structures/ntmruinsH.nbt b/src/main/resources/assets/hbm/structures/ntmruinsH.nbt new file mode 100644 index 000000000..cf3ca953c Binary files /dev/null and b/src/main/resources/assets/hbm/structures/ntmruinsH.nbt differ diff --git a/src/main/resources/assets/hbm/structures/ntmruinsI.nbt b/src/main/resources/assets/hbm/structures/ntmruinsI.nbt new file mode 100644 index 000000000..d85d370d1 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/ntmruinsI.nbt differ diff --git a/src/main/resources/assets/hbm/structures/ntmruinsJ.nbt b/src/main/resources/assets/hbm/structures/ntmruinsJ.nbt new file mode 100644 index 000000000..06d9c301a Binary files /dev/null and b/src/main/resources/assets/hbm/structures/ntmruinsJ.nbt differ diff --git a/src/main/resources/assets/hbm/structures/radio_house.nbt b/src/main/resources/assets/hbm/structures/radio_house.nbt new file mode 100644 index 000000000..394ac3b22 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/radio_house.nbt differ diff --git a/src/main/resources/assets/hbm/structures/test-tandem-core.nbt b/src/main/resources/assets/hbm/structures/test-tandem-core.nbt new file mode 100644 index 000000000..34a426eac Binary files /dev/null and b/src/main/resources/assets/hbm/structures/test-tandem-core.nbt differ diff --git a/src/main/resources/assets/hbm/structures/test-tandem.nbt b/src/main/resources/assets/hbm/structures/test-tandem.nbt new file mode 100644 index 000000000..ba23b9b0c Binary files /dev/null and b/src/main/resources/assets/hbm/structures/test-tandem.nbt differ diff --git a/src/main/resources/assets/hbm/textures/blocks/concrete_rebar.png b/src/main/resources/assets/hbm/textures/blocks/concrete_rebar.png new file mode 100644 index 000000000..bc2d6579f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/concrete_rebar.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/concrete_rebar_alt.png b/src/main/resources/assets/hbm/textures/blocks/concrete_rebar_alt.png new file mode 100644 index 000000000..c6d616f3e Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/concrete_rebar_alt.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/fluid_duct_paintable_block_exhaust.png b/src/main/resources/assets/hbm/textures/blocks/fluid_duct_paintable_block_exhaust.png new file mode 100644 index 000000000..85d4c5e3a Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/fluid_duct_paintable_block_exhaust.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/logic_block.png b/src/main/resources/assets/hbm/textures/blocks/logic_block.png new file mode 100644 index 000000000..9e0d69e2f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/logic_block.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/oc_cable_base.png b/src/main/resources/assets/hbm/textures/blocks/oc_cable_base.png new file mode 100644 index 000000000..7c9e1b0dd Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/oc_cable_base.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/oc_cable_color.png b/src/main/resources/assets/hbm/textures/blocks/oc_cable_color.png new file mode 100644 index 000000000..1a3be6c7b Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/oc_cable_color.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/oc_cable_overlay.png b/src/main/resources/assets/hbm/textures/blocks/oc_cable_overlay.png new file mode 100644 index 000000000..e8f24e65c Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/oc_cable_overlay.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_connector.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_connector.png index 1a0327a1a..133f16515 100644 Binary files a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_connector.png and b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_connector.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_in.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_in.png index b0cb8e0e9..2abafb352 100644 Binary files a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_in.png and b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_in.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_out.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_out.png index 000c59850..a0374af58 100644 Binary files a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_out.png and b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_out.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable.png new file mode 100644 index 000000000..1b7f15d12 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable_overlay.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable_overlay.png new file mode 100644 index 000000000..86559a633 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable_overlay.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable_overlay_in.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable_overlay_in.png new file mode 100644 index 000000000..03dc6b483 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable_overlay_in.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable_overlay_out.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable_overlay_out.png new file mode 100644 index 000000000..8e990e776 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_paintable_overlay_out.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/rbmk_autoloader.png b/src/main/resources/assets/hbm/textures/blocks/rbmk_autoloader.png new file mode 100644 index 000000000..84c7faeb7 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/rbmk_autoloader.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/rebar.png b/src/main/resources/assets/hbm/textures/blocks/rebar.png new file mode 100644 index 000000000..d63c0ccad Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/rebar.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/rebar_base.png b/src/main/resources/assets/hbm/textures/blocks/rebar_base.png new file mode 100644 index 000000000..4774156ba Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/rebar_base.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/trapdoor_steel.png b/src/main/resources/assets/hbm/textures/blocks/trapdoor_steel.png new file mode 100644 index 000000000..ec80cd8e0 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/trapdoor_steel.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_logic.png b/src/main/resources/assets/hbm/textures/blocks/wand_logic.png new file mode 100644 index 000000000..4561c8e4e Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/wand_logic.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_logic_top.png b/src/main/resources/assets/hbm/textures/blocks/wand_logic_top.png new file mode 100644 index 000000000..65e3106a9 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/wand_logic_top.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_tandem.png b/src/main/resources/assets/hbm/textures/blocks/wand_tandem.png new file mode 100644 index 000000000..ea5f193b7 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/wand_tandem.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_tandem_back.png b/src/main/resources/assets/hbm/textures/blocks/wand_tandem_back.png new file mode 100644 index 000000000..acd39e0e5 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/wand_tandem_back.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_tandem_side.png b/src/main/resources/assets/hbm/textures/blocks/wand_tandem_side.png new file mode 100644 index 000000000..7389799c1 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/wand_tandem_side.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_tandem_top.png b/src/main/resources/assets/hbm/textures/blocks/wand_tandem_top.png new file mode 100644 index 000000000..373951004 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/wand_tandem_top.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/fluids/concrete.png b/src/main/resources/assets/hbm/textures/gui/fluids/concrete.png new file mode 100644 index 000000000..5d76282fe Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/fluids/concrete.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/gui_arc.png b/src/main/resources/assets/hbm/textures/gui/gui_arc.png deleted file mode 100644 index b78524b43..000000000 Binary files a/src/main/resources/assets/hbm/textures/gui/gui_arc.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/gui/gui_radiolysis.png b/src/main/resources/assets/hbm/textures/gui/gui_radiolysis.png index 16740bcd3..ebf7ab0e8 100644 Binary files a/src/main/resources/assets/hbm/textures/gui/gui_radiolysis.png and b/src/main/resources/assets/hbm/textures/gui/gui_radiolysis.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/gui_rebar.png b/src/main/resources/assets/hbm/textures/gui/gui_rebar.png new file mode 100644 index 000000000..a3dfeb186 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/gui_rebar.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/gui_slab.png b/src/main/resources/assets/hbm/textures/gui/gui_slab.png new file mode 100644 index 000000000..02dab2c1c Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/gui_slab.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/gui_wiki.png b/src/main/resources/assets/hbm/textures/gui/gui_wiki.png index 25d913919..9f8c2d655 100644 Binary files a/src/main/resources/assets/hbm/textures/gui/gui_wiki.png and b/src/main/resources/assets/hbm/textures/gui/gui_wiki.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_autoloader.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_autoloader.png new file mode 100644 index 000000000..05618d948 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/machine/gui_autoloader.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/nei/gui_nei.png b/src/main/resources/assets/hbm/textures/gui/nei/gui_nei.png index ecdd69550..0cc1a42c4 100644 Binary files a/src/main/resources/assets/hbm/textures/gui/nei/gui_nei.png and b/src/main/resources/assets/hbm/textures/gui/nei/gui_nei.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_assembler.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_assembler.png new file mode 100644 index 000000000..3101c24f9 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/processing/gui_assembler.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_chemical_factory.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_chemical_factory.png index 7e6aa8347..ae4a7ef6d 100644 Binary files a/src/main/resources/assets/hbm/textures/gui/processing/gui_chemical_factory.png and b/src/main/resources/assets/hbm/textures/gui/processing/gui_chemical_factory.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_chemplant.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_chemplant.png index d58713d9c..3ce1bc32c 100644 Binary files a/src/main/resources/assets/hbm/textures/gui/processing/gui_chemplant.png and b/src/main/resources/assets/hbm/textures/gui/processing/gui_chemplant.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_purex.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_purex.png new file mode 100644 index 000000000..1326e8690 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/processing/gui_purex.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/tool/gui_tool_ability.png b/src/main/resources/assets/hbm/textures/gui/tool/gui_tool_ability.png index 6b1a5c68b..fc0a54e7f 100644 Binary files a/src/main/resources/assets/hbm/textures/gui/tool/gui_tool_ability.png and b/src/main/resources/assets/hbm/textures/gui/tool/gui_tool_ability.png differ diff --git a/src/main/resources/assets/hbm/textures/items/ammo_secret.folly_sm_alt.png b/src/main/resources/assets/hbm/textures/items/ammo_secret.folly_sm_alt.png new file mode 100644 index 000000000..0c15f038a Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/ammo_secret.folly_sm_alt.png differ diff --git a/src/main/resources/assets/hbm/textures/items/assembly_nuke.png b/src/main/resources/assets/hbm/textures/items/assembly_nuke.png index 3243576ba..4a6dcc92f 100644 Binary files a/src/main/resources/assets/hbm/textures/items/assembly_nuke.png and b/src/main/resources/assets/hbm/textures/items/assembly_nuke.png differ diff --git a/src/main/resources/assets/hbm/textures/items/blueprint_folder.png b/src/main/resources/assets/hbm/textures/items/blueprint_folder.png new file mode 100644 index 000000000..17f2a13d1 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/blueprint_folder.png differ diff --git a/src/main/resources/assets/hbm/textures/items/blueprint_folder_discover.png b/src/main/resources/assets/hbm/textures/items/blueprint_folder_discover.png new file mode 100644 index 000000000..451232e7c Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/blueprint_folder_discover.png differ diff --git a/src/main/resources/assets/hbm/textures/items/blueprint_folder_secret.png b/src/main/resources/assets/hbm/textures/items/blueprint_folder_secret.png new file mode 100644 index 000000000..d23d7ce41 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/blueprint_folder_secret.png differ diff --git a/src/main/resources/assets/hbm/textures/items/blueprints.png b/src/main/resources/assets/hbm/textures/items/blueprints.png new file mode 100644 index 000000000..225bec283 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/blueprints.png differ diff --git a/src/main/resources/assets/hbm/textures/items/blueprints_discover.png b/src/main/resources/assets/hbm/textures/items/blueprints_discover.png new file mode 100644 index 000000000..66cdcea65 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/blueprints_discover.png differ diff --git a/src/main/resources/assets/hbm/textures/items/blueprints_secret.png b/src/main/resources/assets/hbm/textures/items/blueprints_secret.png new file mode 100644 index 000000000..9abb97057 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/blueprints_secret.png differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_biofuel.png b/src/main/resources/assets/hbm/textures/items/canister_biofuel.png deleted file mode 100644 index 5e509e6b8..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_biofuel.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_bitumen.png b/src/main/resources/assets/hbm/textures/items/canister_bitumen.png deleted file mode 100644 index 3e3e9e79c..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_bitumen.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_blank.png b/src/main/resources/assets/hbm/textures/items/canister_blank.png index 9e19878bc..0524cbe1d 100644 Binary files a/src/main/resources/assets/hbm/textures/items/canister_blank.png and b/src/main/resources/assets/hbm/textures/items/canister_blank.png differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_canola.png b/src/main/resources/assets/hbm/textures/items/canister_canola.png deleted file mode 100644 index 7f5a44f91..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_canola.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_empty.png b/src/main/resources/assets/hbm/textures/items/canister_empty.png index 36c11231a..a41347e95 100644 Binary files a/src/main/resources/assets/hbm/textures/items/canister_empty.png and b/src/main/resources/assets/hbm/textures/items/canister_empty.png differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_ethanol.png b/src/main/resources/assets/hbm/textures/items/canister_ethanol.png deleted file mode 100644 index b29ab22cc..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_ethanol.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_fracksol.png b/src/main/resources/assets/hbm/textures/items/canister_fracksol.png deleted file mode 100644 index 8111eab89..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_fracksol.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_fuel.png b/src/main/resources/assets/hbm/textures/items/canister_fuel.png deleted file mode 100644 index 359fba8c8..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_fuel.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_gasoline.png b/src/main/resources/assets/hbm/textures/items/canister_gasoline.png deleted file mode 100644 index 1b466069c..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_gasoline.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_heatingoil.png b/src/main/resources/assets/hbm/textures/items/canister_heatingoil.png deleted file mode 100644 index e8654568e..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_heatingoil.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_heavyoil.png b/src/main/resources/assets/hbm/textures/items/canister_heavyoil.png deleted file mode 100644 index 62f810b25..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_heavyoil.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_kerosene.png b/src/main/resources/assets/hbm/textures/items/canister_kerosene.png deleted file mode 100644 index 61649e01b..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_kerosene.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_lightoil.png b/src/main/resources/assets/hbm/textures/items/canister_lightoil.png deleted file mode 100644 index 49528bdd0..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_lightoil.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_napalm.png b/src/main/resources/assets/hbm/textures/items/canister_napalm.png index 66d2fae42..1c65524d3 100644 Binary files a/src/main/resources/assets/hbm/textures/items/canister_napalm.png and b/src/main/resources/assets/hbm/textures/items/canister_napalm.png differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_naphtha.png b/src/main/resources/assets/hbm/textures/items/canister_naphtha.png deleted file mode 100644 index 8ca35d24f..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_naphtha.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_oil.png b/src/main/resources/assets/hbm/textures/items/canister_oil.png deleted file mode 100644 index 6af9430a0..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_oil.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_overlay.png b/src/main/resources/assets/hbm/textures/items/canister_overlay.png index f32b8014f..27bd808e5 100644 Binary files a/src/main/resources/assets/hbm/textures/items/canister_overlay.png and b/src/main/resources/assets/hbm/textures/items/canister_overlay.png differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_petroil.png b/src/main/resources/assets/hbm/textures/items/canister_petroil.png deleted file mode 100644 index bc5aa6314..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_petroil.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_reoil.png b/src/main/resources/assets/hbm/textures/items/canister_reoil.png deleted file mode 100644 index aa36d54e1..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_reoil.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_smear.png b/src/main/resources/assets/hbm/textures/items/canister_smear.png deleted file mode 100644 index e81ab1572..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_smear.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/canister_superfuel.png b/src/main/resources/assets/hbm/textures/items/canister_superfuel.png deleted file mode 100644 index f38d02ff7..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/canister_superfuel.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/chunk_ore.moonstone.png b/src/main/resources/assets/hbm/textures/items/chunk_ore.moonstone.png new file mode 100644 index 000000000..8f84820c9 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/chunk_ore.moonstone.png differ diff --git a/src/main/resources/assets/hbm/textures/items/fluid_barrel.png b/src/main/resources/assets/hbm/textures/items/fluid_barrel.png index 8eb04cde2..d3f440a4b 100644 Binary files a/src/main/resources/assets/hbm/textures/items/fluid_barrel.png and b/src/main/resources/assets/hbm/textures/items/fluid_barrel.png differ diff --git a/src/main/resources/assets/hbm/textures/items/fluid_barrel_infinite.png b/src/main/resources/assets/hbm/textures/items/fluid_barrel_infinite.png index b2e78fd7a..361fc9f7c 100644 Binary files a/src/main/resources/assets/hbm/textures/items/fluid_barrel_infinite.png and b/src/main/resources/assets/hbm/textures/items/fluid_barrel_infinite.png differ diff --git a/src/main/resources/assets/hbm/textures/items/fluid_barrel_overlay.png b/src/main/resources/assets/hbm/textures/items/fluid_barrel_overlay.png index 35cfb942d..7a1e2b424 100644 Binary files a/src/main/resources/assets/hbm/textures/items/fluid_barrel_overlay.png and b/src/main/resources/assets/hbm/textures/items/fluid_barrel_overlay.png differ diff --git a/src/main/resources/assets/hbm/textures/items/fluid_pack.png b/src/main/resources/assets/hbm/textures/items/fluid_pack.png new file mode 100644 index 000000000..c3c5de9aa Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/fluid_pack.png differ diff --git a/src/main/resources/assets/hbm/textures/items/fluid_pack_overlay.png b/src/main/resources/assets/hbm/textures/items/fluid_pack_overlay.png new file mode 100644 index 000000000..0de07193e Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/fluid_pack_overlay.png differ diff --git a/src/main/resources/assets/hbm/textures/items/fluid_tank.png b/src/main/resources/assets/hbm/textures/items/fluid_tank.png index 3ff266568..4d6a2d108 100644 Binary files a/src/main/resources/assets/hbm/textures/items/fluid_tank.png and b/src/main/resources/assets/hbm/textures/items/fluid_tank.png differ diff --git a/src/main/resources/assets/hbm/textures/items/fluid_tank_lead.png b/src/main/resources/assets/hbm/textures/items/fluid_tank_lead.png index 68580824a..1c4f0c72e 100644 Binary files a/src/main/resources/assets/hbm/textures/items/fluid_tank_lead.png and b/src/main/resources/assets/hbm/textures/items/fluid_tank_lead.png differ diff --git a/src/main/resources/assets/hbm/textures/items/fluid_tank_lead_overlay.png b/src/main/resources/assets/hbm/textures/items/fluid_tank_lead_overlay.png index 2fd03ec75..10b09d8fd 100644 Binary files a/src/main/resources/assets/hbm/textures/items/fluid_tank_lead_overlay.png and b/src/main/resources/assets/hbm/textures/items/fluid_tank_lead_overlay.png differ diff --git a/src/main/resources/assets/hbm/textures/items/fluid_tank_overlay.png b/src/main/resources/assets/hbm/textures/items/fluid_tank_overlay.png index 69f09af83..2c258a92e 100644 Binary files a/src/main/resources/assets/hbm/textures/items/fluid_tank_overlay.png and b/src/main/resources/assets/hbm/textures/items/fluid_tank_overlay.png differ diff --git a/src/main/resources/assets/hbm/textures/items/gas_bottle.png b/src/main/resources/assets/hbm/textures/items/gas_bottle.png index 7776838e6..4e2b038df 100644 Binary files a/src/main/resources/assets/hbm/textures/items/gas_bottle.png and b/src/main/resources/assets/hbm/textures/items/gas_bottle.png differ diff --git a/src/main/resources/assets/hbm/textures/items/gas_empty.png b/src/main/resources/assets/hbm/textures/items/gas_empty.png index 8014cfd5e..f901a9fbf 100644 Binary files a/src/main/resources/assets/hbm/textures/items/gas_empty.png and b/src/main/resources/assets/hbm/textures/items/gas_empty.png differ diff --git a/src/main/resources/assets/hbm/textures/items/gas_label.png b/src/main/resources/assets/hbm/textures/items/gas_label.png index eee087c9e..5c0dde543 100644 Binary files a/src/main/resources/assets/hbm/textures/items/gas_label.png and b/src/main/resources/assets/hbm/textures/items/gas_label.png differ diff --git a/src/main/resources/assets/hbm/textures/items/inf_water.png b/src/main/resources/assets/hbm/textures/items/inf_water.png index 766c4c5c9..b2f400e0b 100644 Binary files a/src/main/resources/assets/hbm/textures/items/inf_water.png and b/src/main/resources/assets/hbm/textures/items/inf_water.png differ diff --git a/src/main/resources/assets/hbm/textures/items/inf_water_mk2.png b/src/main/resources/assets/hbm/textures/items/inf_water_mk2.png index 9c53f6f1e..2513580a3 100644 Binary files a/src/main/resources/assets/hbm/textures/items/inf_water_mk2.png and b/src/main/resources/assets/hbm/textures/items/inf_water_mk2.png differ diff --git a/src/main/resources/assets/hbm/textures/items/ingot_metal.scrap.png b/src/main/resources/assets/hbm/textures/items/ingot_metal.scrap.png new file mode 100644 index 000000000..a0074ffc8 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/ingot_metal.scrap.png differ diff --git a/src/main/resources/assets/hbm/textures/items/ingot_metal_sheet.png b/src/main/resources/assets/hbm/textures/items/ingot_metal_sheet.png index 3697db98c..d45fd4404 100644 Binary files a/src/main/resources/assets/hbm/textures/items/ingot_metal_sheet.png and b/src/main/resources/assets/hbm/textures/items/ingot_metal_sheet.png differ diff --git a/src/main/resources/assets/hbm/textures/items/item_expensive.bronze_tubes.png b/src/main/resources/assets/hbm/textures/items/item_expensive.bronze_tubes.png new file mode 100644 index 000000000..8c410bd97 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/item_expensive.bronze_tubes.png differ diff --git a/src/main/resources/assets/hbm/textures/items/item_expensive.bronze_tubes_alt.png b/src/main/resources/assets/hbm/textures/items/item_expensive.bronze_tubes_alt.png new file mode 100644 index 000000000..d8eb827b6 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/item_expensive.bronze_tubes_alt.png differ diff --git a/src/main/resources/assets/hbm/textures/items/item_expensive.circuit.png b/src/main/resources/assets/hbm/textures/items/item_expensive.circuit.png new file mode 100644 index 000000000..9620c7535 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/item_expensive.circuit.png differ diff --git a/src/main/resources/assets/hbm/textures/items/item_expensive.computer.png b/src/main/resources/assets/hbm/textures/items/item_expensive.computer.png new file mode 100644 index 000000000..7c14b82ed Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/item_expensive.computer.png differ diff --git a/src/main/resources/assets/hbm/textures/items/item_expensive.ferro_plating.png b/src/main/resources/assets/hbm/textures/items/item_expensive.ferro_plating.png new file mode 100644 index 000000000..cd93748e5 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/item_expensive.ferro_plating.png differ diff --git a/src/main/resources/assets/hbm/textures/items/item_expensive.heavy_frame.png b/src/main/resources/assets/hbm/textures/items/item_expensive.heavy_frame.png new file mode 100644 index 000000000..8f83e202b Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/item_expensive.heavy_frame.png differ diff --git a/src/main/resources/assets/hbm/textures/items/item_expensive.lead_plating.png b/src/main/resources/assets/hbm/textures/items/item_expensive.lead_plating.png new file mode 100644 index 000000000..7c56954a8 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/item_expensive.lead_plating.png differ diff --git a/src/main/resources/assets/hbm/textures/items/item_expensive.steel_plating.png b/src/main/resources/assets/hbm/textures/items/item_expensive.steel_plating.png new file mode 100644 index 000000000..2aad8b6d0 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/item_expensive.steel_plating.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.bfb_am_mix.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.bfb_am_mix.png index 12f553847..1362ef70b 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel.bfb_am_mix.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel.bfb_am_mix.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.bfb_pu241.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.bfb_pu241.png index 01c0f4e83..0d8f5ae97 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel.bfb_pu241.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel.bfb_pu241.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hea242.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hea242.png index 02db8994d..5d37d8a53 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hea242.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hea242.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hen237.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hen237.png index 64228fb58..de05e5cf0 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hen237.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hen237.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hep239.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hep239.png index c14fe4ec2..dbc98b8d5 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hep239.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hep239.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hep241.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hep241.png index 2a99abe38..3a5210046 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hep241.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hep241.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hes326.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hes326.png index d659fdd2f..4ece6a899 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hes326.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hes326.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hes327.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hes327.png index 7a1f8df98..15a94978f 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hes327.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hes327.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.heu233.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.heu233.png index 8961cc636..2e20c7838 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel.heu233.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel.heu233.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.heu235.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.heu235.png index c80a207b0..7b398f44b 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel.heu235.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel.heu235.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.mea.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.mea.png index 90305870d..cb92ca074 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel.mea.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel.mea.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.men.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.men.png index c21db4157..c7d9463db 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel.men.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel.men.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.mep.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.mep.png index 1d1334635..9feec8b65 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel.mep.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel.mep.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.meu.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.meu.png index ca1e8e89e..eaf2ddeec 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel.meu.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel.meu.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.mox.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.mox.png index 59d0a64a2..056578a18 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel.mox.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel.mox.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel_base.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel_base.png index 9d614943b..2b4d197bb 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel_base.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel_base.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel_depleted.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel_depleted.png index cb2b2d545..34fd113b5 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel_depleted.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel_depleted.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel_hot.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel_hot.png index 84b4903d4..504f02b1b 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pwr_fuel_hot.png and b/src/main/resources/assets/hbm/textures/items/pwr_fuel_hot.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pwr_printer.png b/src/main/resources/assets/hbm/textures/items/pwr_printer.png new file mode 100644 index 000000000..a79ce1f24 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/pwr_printer.png differ diff --git a/src/main/resources/assets/hbm/textures/items/rangefinder.png b/src/main/resources/assets/hbm/textures/items/rangefinder.png new file mode 100644 index 000000000..d7539ee67 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/rangefinder.png differ diff --git a/src/main/resources/assets/hbm/textures/items/rebar_placer.png b/src/main/resources/assets/hbm/textures/items/rebar_placer.png new file mode 100644 index 000000000..037740200 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/rebar_placer.png differ diff --git a/src/main/resources/assets/hbm/textures/items/tent_tablet.png b/src/main/resources/assets/hbm/textures/items/tent_tablet.png new file mode 100644 index 000000000..8769aeeec Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/tent_tablet.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/assembly_machine.png b/src/main/resources/assets/hbm/textures/models/machines/assembly_machine.png new file mode 100644 index 000000000..266724c97 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/assembly_machine.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/purex.png b/src/main/resources/assets/hbm/textures/models/machines/purex.png new file mode 100644 index 000000000..655e5e4a8 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/purex.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/rbmk_autoloader.png b/src/main/resources/assets/hbm/textures/models/machines/rbmk_autoloader.png new file mode 100644 index 000000000..f15f922bd Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/rbmk_autoloader.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/turbinegas.png b/src/main/resources/assets/hbm/textures/models/machines/turbinegas.png index 290e3810b..4e33cca35 100644 Binary files a/src/main/resources/assets/hbm/textures/models/machines/turbinegas.png and b/src/main/resources/assets/hbm/textures/models/machines/turbinegas.png differ diff --git a/src/main/resources/assets/hbm/textures/models/tank/tank_CONCRETE.png b/src/main/resources/assets/hbm/textures/models/tank/tank_CONCRETE.png new file mode 100644 index 000000000..4d27a48a3 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/tank/tank_CONCRETE.png differ diff --git a/src/main/resources/assets/hbm/textures/models/trinkets/chip_gold.png b/src/main/resources/assets/hbm/textures/models/trinkets/chip_gold.png new file mode 100644 index 000000000..d70ec8952 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/trinkets/chip_gold.png differ diff --git a/src/main/resources/assets/hbm/textures/models/trinkets/hundun.png b/src/main/resources/assets/hbm/textures/models/trinkets/hundun.png new file mode 100644 index 000000000..ab600170c Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/trinkets/hundun.png differ diff --git a/src/main/resources/assets/hbm/textures/models/trinkets/pooh.png b/src/main/resources/assets/hbm/textures/models/trinkets/pooh.png deleted file mode 100644 index e1d9a60d6..000000000 Binary files a/src/main/resources/assets/hbm/textures/models/trinkets/pooh.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i.png b/src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i.png new file mode 100644 index 000000000..0c2844eee Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i.png differ diff --git a/src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i_greyscale.png b/src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i_greyscale.png new file mode 100644 index 000000000..5d544cf1e Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/weapons/n_i_4_n_i_greyscale.png differ diff --git a/src/main/resources/assets/hbm/textures/models/weapons/sexy_heretic.png b/src/main/resources/assets/hbm/textures/models/weapons/sexy_heretic.png new file mode 100644 index 000000000..4dab907d0 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/weapons/sexy_heretic.png differ diff --git a/src/main/resources/assets/hbm/textures/models/weapons/sexy_real_no_fake.png b/src/main/resources/assets/hbm/textures/models/weapons/sexy_real_no_fake.png index fa565a3a0..5855c616b 100644 Binary files a/src/main/resources/assets/hbm/textures/models/weapons/sexy_real_no_fake.png and b/src/main/resources/assets/hbm/textures/models/weapons/sexy_real_no_fake.png differ diff --git a/src/main/resources/assets/hbm/textures/models/weapons/whiskey (Kopie).png b/src/main/resources/assets/hbm/textures/models/weapons/whiskey (Kopie).png deleted file mode 100644 index 959b94011..000000000 Binary files a/src/main/resources/assets/hbm/textures/models/weapons/whiskey (Kopie).png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/models/weapons/whiskey.xcf b/src/main/resources/assets/hbm/textures/models/weapons/whiskey.xcf deleted file mode 100644 index 2376c64d5..000000000 Binary files a/src/main/resources/assets/hbm/textures/models/weapons/whiskey.xcf and /dev/null differ