From b7456f1c51dec2948c8c139b9721e9d532b30b0e Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 2 Oct 2022 20:01:36 +0200 Subject: [PATCH] NEI handlers, fixes, more matdefs, foundry pieces always dropping mats --- src/main/java/com/hbm/blocks/ModBlocks.java | 8 +- .../blocks/machine/FoundryCastingBase.java | 20 +++ .../hbm/blocks/machine/FoundryChannel.java | 14 ++ .../com/hbm/blocks/machine/FoundryOutlet.java | 1 - .../com/hbm/blocks/machine/FoundryTank.java | 15 ++ .../hbm/blocks/machine/MachineCrucible.java | 26 +++ .../com/hbm/blocks/network/CableDiode.java | 6 +- .../java/com/hbm/crafting/PowderRecipes.java | 20 +-- .../java/com/hbm/entity/EntityMappings.java | 1 + .../hbm/entity/projectile/EntitySawblade.java | 161 ++++++++++++++++++ .../handler/nei/CrucibleAlloyingHandler.java | 152 +++++++++++++++++ .../handler/nei/CrucibleCastingHandler.java | 124 ++++++++++++++ .../handler/nei/CrucibleSmeltingHandler.java | 130 ++++++++++++++ .../hbm/handler/nei/NEIUniversalHandler.java | 5 - .../com/hbm/inventory/OreDictManager.java | 2 + .../com/hbm/inventory/gui/GUICoreEmitter.java | 68 ++++---- .../com/hbm/inventory/gui/GUINukeFstbmb.java | 91 +++++----- .../inventory/material/MatDistribution.java | 19 ++- .../inventory/material/MaterialShapes.java | 2 + .../java/com/hbm/inventory/material/Mats.java | 55 +++--- .../inventory/recipes/AssemblerRecipes.java | 11 -- .../recipes/BlastFurnaceRecipes.java | 11 +- .../inventory/recipes/CrucibleRecipes.java | 111 +++++++++++- .../inventory/recipes/anvil/AnvilRecipes.java | 5 + src/main/java/com/hbm/items/ModItems.java | 2 +- .../java/com/hbm/items/machine/ItemMold.java | 12 +- .../java/com/hbm/lib/HbmChestContents.java | 29 +++- src/main/java/com/hbm/lib/RefStrings.java | 2 +- src/main/java/com/hbm/main/ClientProxy.java | 1 + .../java/com/hbm/main/CraftingManager.java | 4 +- src/main/java/com/hbm/main/MainRegistry.java | 4 + src/main/java/com/hbm/main/NEIConfig.java | 6 + .../entity/projectile/RenderSawblade.java | 47 +++++ .../render/tileentity/RenderAssembler.java | 9 +- .../hbm/render/tileentity/RenderFoundry.java | 1 + .../machine/TileEntityCrucible.java | 32 ++++ .../tileentity/machine/TileEntitySawmill.java | 12 ++ src/main/java/com/hbm/util/I18nUtil.java | 7 + src/main/resources/assets/hbm/lang/de_DE.lang | 6 +- src/main/resources/assets/hbm/lang/en_US.lang | 17 +- .../hbm/textures/gui/nei/gui_nei_crucible.png | Bin 0 -> 965 bytes .../gui/nei/gui_nei_crucible_smelting.png | Bin 0 -> 947 bytes .../hbm/textures/gui/nei/gui_nei_foundry.png | Bin 0 -> 5796 bytes .../textures/gui/processing/gui_crucible.png | Bin 11227 -> 11451 bytes .../models/machines/crucible_heat.png | Bin 4820 -> 4828 bytes src/main/resources/mcmod.info | 2 +- 46 files changed, 1059 insertions(+), 192 deletions(-) create mode 100644 src/main/java/com/hbm/entity/projectile/EntitySawblade.java create mode 100644 src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java create mode 100644 src/main/java/com/hbm/handler/nei/CrucibleCastingHandler.java create mode 100644 src/main/java/com/hbm/handler/nei/CrucibleSmeltingHandler.java create mode 100644 src/main/java/com/hbm/render/entity/projectile/RenderSawblade.java create mode 100644 src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible.png create mode 100644 src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible_smelting.png create mode 100644 src/main/resources/assets/hbm/textures/gui/nei/gui_nei_foundry.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 57b2c7c12..3dbb7cdc2 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -3273,11 +3273,11 @@ public class ModBlocks { //Industrial Factories GameRegistry.registerBlock(factory_titanium_hull, factory_titanium_hull.getUnlocalizedName()); - GameRegistry.registerBlock(factory_titanium_furnace, factory_titanium_furnace.getUnlocalizedName()); - GameRegistry.registerBlock(factory_titanium_conductor, factory_titanium_conductor.getUnlocalizedName()); + //GameRegistry.registerBlock(factory_titanium_furnace, factory_titanium_furnace.getUnlocalizedName()); + //GameRegistry.registerBlock(factory_titanium_conductor, factory_titanium_conductor.getUnlocalizedName()); GameRegistry.registerBlock(factory_advanced_hull, factory_advanced_hull.getUnlocalizedName()); - GameRegistry.registerBlock(factory_advanced_furnace, factory_advanced_furnace.getUnlocalizedName()); - GameRegistry.registerBlock(factory_advanced_conductor, factory_advanced_conductor.getUnlocalizedName()); + //GameRegistry.registerBlock(factory_advanced_furnace, factory_advanced_furnace.getUnlocalizedName()); + //GameRegistry.registerBlock(factory_advanced_conductor, factory_advanced_conductor.getUnlocalizedName()); //The Fluid Inserter //GameRegistry.registerBlock(machine_inserter, machine_inserter.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java index ffd799fed..8295df32b 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryCastingBase.java @@ -17,6 +17,7 @@ import api.hbm.block.ICrucibleAcceptor; import api.hbm.block.IToolable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; @@ -128,6 +129,25 @@ public abstract class FoundryCastingBase extends BlockContainer implements ICruc return false; } + @Override + public void breakBlock(World world, int x, int y, int z, Block b, int i) { + + TileEntityFoundryCastingBase cast = (TileEntityFoundryCastingBase) world.getTileEntity(x, y, z); + ItemStack scrap = ItemScraps.create(new MaterialStack(cast.type, cast.amount)); + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + cast.amount = 0; //just for safety + + for(ItemStack stack : cast.slots) { + if(stack != null) { + EntityItem drop = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, stack.copy()); + world.spawnEntityInWorld(drop); + } + } + + super.breakBlock(world, x, y, z, b, i); + } + @Override @SideOnly(Side.CLIENT) public void randomDisplayTick(World world, int x, int y, int z, Random rand) { diff --git a/src/main/java/com/hbm/blocks/machine/FoundryChannel.java b/src/main/java/com/hbm/blocks/machine/FoundryChannel.java index 5d81a660b..bf00c6b60 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryChannel.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryChannel.java @@ -178,4 +178,18 @@ public class FoundryChannel extends BlockContainer implements ICrucibleAcceptor return false; } + + @Override + public void breakBlock(World world, int x, int y, int z, Block b, int i) { + + TileEntityFoundryChannel channel = (TileEntityFoundryChannel) world.getTileEntity(x, y, z); + if(channel.amount > 0) { + ItemStack scrap = ItemScraps.create(new MaterialStack(channel.type, channel.amount)); + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + channel.amount = 0; + } + + super.breakBlock(world, x, y, z, b, i); + } } diff --git a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java index 5905ed152..32eac49b1 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryOutlet.java @@ -8,7 +8,6 @@ import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemScraps; import com.hbm.lib.RefStrings; -import com.hbm.tileentity.machine.TileEntityFoundryCastingBase; import com.hbm.tileentity.machine.TileEntityFoundryOutlet; import com.hbm.util.I18nUtil; diff --git a/src/main/java/com/hbm/blocks/machine/FoundryTank.java b/src/main/java/com/hbm/blocks/machine/FoundryTank.java index 0c8d0a48c..fbf7c1538 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundryTank.java +++ b/src/main/java/com/hbm/blocks/machine/FoundryTank.java @@ -9,6 +9,7 @@ import api.hbm.block.ICrucibleAcceptor; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -114,6 +115,20 @@ public class FoundryTank extends BlockContainer implements ICrucibleAcceptor { return false; } + + @Override + public void breakBlock(World world, int x, int y, int z, Block b, int i) { + + TileEntityFoundryTank tank = (TileEntityFoundryTank) world.getTileEntity(x, y, z); + if(tank.amount > 0) { + ItemStack scrap = ItemScraps.create(new MaterialStack(tank.type, tank.amount)); + EntityItem item = new EntityItem(world, x + 0.5, y + this.maxY, z + 0.5, scrap); + world.spawnEntityInWorld(item); + tank.amount = 0; + } + + super.breakBlock(world, x, y, z, b, i); + } @Override public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { diff --git a/src/main/java/com/hbm/blocks/machine/MachineCrucible.java b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java index d3c9f996f..702ca3195 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCrucible.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java @@ -10,6 +10,7 @@ import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityCrucible; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -87,4 +88,29 @@ public class MachineCrucible extends BlockDummyable { public int getOffset() { return 1; } + + @Override + public void breakBlock(World world, int x, int y, int z, Block b, int i) { + + TileEntity te = world.getTileEntity(x, y, z); + + if(te instanceof TileEntityCrucible) { + TileEntityCrucible crucible = (TileEntityCrucible) te; + + List stacks = new ArrayList(); + stacks.addAll(crucible.recipeStack); + stacks.addAll(crucible.wasteStack); + + for(MaterialStack stack : stacks) { + ItemStack scrap = ItemScraps.create(new MaterialStack(stack.material, stack.amount)); + EntityItem item = new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, scrap); + world.spawnEntityInWorld(item); + } + + crucible.recipeStack.clear(); + crucible.wasteStack.clear(); + } + + super.breakBlock(world, x, y, z, b, i); + } } diff --git a/src/main/java/com/hbm/blocks/network/CableDiode.java b/src/main/java/com/hbm/blocks/network/CableDiode.java index 3cec642fc..1e8ea027f 100644 --- a/src/main/java/com/hbm/blocks/network/CableDiode.java +++ b/src/main/java/com/hbm/blocks/network/CableDiode.java @@ -170,6 +170,7 @@ public class CableDiode extends BlockContainer implements ILookOverlay, IToolabl private long subBuffer; private long contingent = 0; private long lastTransfer = 0; + private int pulses = 0; @Override public long transferPower(long power) { @@ -177,12 +178,15 @@ public class CableDiode extends BlockContainer implements ILookOverlay, IToolabl if(recursionBrake) return power; + pulses++; + if(lastTransfer != worldObj.getTotalWorldTime()) { lastTransfer = worldObj.getTotalWorldTime(); contingent = getMaxPower(); + pulses = 0; } - if(contingent <= 0) + if(contingent <= 0 || pulses > 10) return power; //this part turns "maxPower" from a glorified transfer weight into an actual transfer cap diff --git a/src/main/java/com/hbm/crafting/PowderRecipes.java b/src/main/java/com/hbm/crafting/PowderRecipes.java index 2c554ef88..c1c872e9f 100644 --- a/src/main/java/com/hbm/crafting/PowderRecipes.java +++ b/src/main/java/com/hbm/crafting/PowderRecipes.java @@ -49,17 +49,17 @@ public class PowderRecipes { CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_desh_ready, 1), new Object[] { ModItems.powder_desh_mix, ModItems.ingot_mercury, ModItems.ingot_mercury, COAL.dust() }); //Metal powders - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { REDSTONE.dust(), IRON.dust(), COAL.dust(), CU.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { IRON.dust(), COAL.dust(), MINGRADE.dust(), MINGRADE.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { REDSTONE.dust(), CU.dust(), STEEL.dust(), STEEL.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 2), new Object[] { MINGRADE.dust(), STEEL.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { REDSTONE.dust(), IRON.dust(), COAL.dust(), CU.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { IRON.dust(), COAL.dust(), MINGRADE.dust(), MINGRADE.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 4), new Object[] { REDSTONE.dust(), CU.dust(), STEEL.dust(), STEEL.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_advanced_alloy, 2), new Object[] { MINGRADE.dust(), STEEL.dust() }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_magnetized_tungsten, 1), new Object[] { W.dust(), SA326.nugget() }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_tcalloy, 1), new Object[] { STEEL.dust(), TC99.nugget() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_red_copper, 2), new Object[] { REDSTONE.dust(), CU.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_steel, 2), new Object[] { IRON.dust(), COAL.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 2), new Object[] { STEEL.dust(), W.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 2), new Object[] { STEEL.dust(), CO.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 4), new Object[] { IRON.dust(), COAL.dust(), W.dust(), W.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 4), new Object[] { IRON.dust(), COAL.dust(), CO.dust(), CO.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_red_copper, 2), new Object[] { REDSTONE.dust(), CU.dust() }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_steel, 1), new Object[] { IRON.dust(), COAL.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 2), new Object[] { STEEL.dust(), W.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 2), new Object[] { STEEL.dust(), CO.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 4), new Object[] { IRON.dust(), COAL.dust(), W.dust(), W.dust() }); + //CraftingManager.addShapelessAuto(new ItemStack(ModItems.powder_dura_steel, 4), new Object[] { IRON.dust(), COAL.dust(), CO.dust(), CO.dust() }); } } diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index 8a0f2a135..aa9e742e4 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -206,6 +206,7 @@ public class EntityMappings { addEntity(EntitySiegeTunneler.class, "entity_meme_tunneler", 1000); addEntity(EntitySPV.class, "entity_self_propelled_vehicle_mark_1", 1000); addEntity(EntityCog.class, "entity_stray_cog", 1000); + addEntity(EntitySawblade.class, "entity_stray_saw", 1000); addEntity(EntityChemical.class, "entity_chemthrower_splash", 1000); addMob(EntityNuclearCreeper.class, "entity_mob_nuclear_creeper", 0x204131, 0x75CE00); diff --git a/src/main/java/com/hbm/entity/projectile/EntitySawblade.java b/src/main/java/com/hbm/entity/projectile/EntitySawblade.java new file mode 100644 index 000000000..9d4a3b592 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/EntitySawblade.java @@ -0,0 +1,161 @@ +package com.hbm.entity.projectile; + +import com.hbm.items.ModItems; +import com.hbm.lib.ModDamageSource; +import com.hbm.packet.AuxParticlePacketNT; +import com.hbm.packet.PacketDispatcher; + +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.util.MovingObjectPosition.MovingObjectType; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class EntitySawblade extends EntityThrowableInterp { + + public EntitySawblade(World world) { + super(world); + this.setSize(1F, 1F); + } + + public EntitySawblade(World world, double x, double y, double z) { + super(world, x, y, z); + this.setSize(1F, 1F); + } + + @Override + protected void entityInit() { + super.entityInit(); + this.dataWatcher.addObject(10, new Integer(0)); + this.dataWatcher.addObject(11, new Integer(0)); + } + + public EntitySawblade setOrientation(int rot) { + this.dataWatcher.updateObject(10, rot); + return this; + } + + public int getOrientation() { + return this.dataWatcher.getWatchableObjectInt(10); + } + + public int getMeta() { + return this.dataWatcher.getWatchableObjectInt(11); + } + + @Override + public boolean interactFirst(EntityPlayer player) { + + if(!worldObj.isRemote) { + + if(player.inventory.addItemStackToInventory(new ItemStack(ModItems.sawblade))) + this.setDead(); + + player.inventoryContainer.detectAndSendChanges(); + } + + return false; + } + + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + protected void onImpact(MovingObjectPosition mop) { + + if(worldObj != null && mop != null && mop.typeOfHit == MovingObjectType.ENTITY && mop.entityHit.isEntityAlive()) { + Entity e = mop.entityHit; + e.attackEntityFrom(ModDamageSource.rubble, 1000); + if(!e.isEntityAlive() && e instanceof EntityLivingBase) { + NBTTagCompound vdat = new NBTTagCompound(); + vdat.setString("type", "giblets"); + vdat.setInteger("ent", e.getEntityId()); + vdat.setInteger("cDiv", 5); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(vdat, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY + e.height * 0.5, e.posZ, 150)); + + worldObj.playSoundEffect(e.posX, e.posY, e.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); + } + } + + if(this.ticksExisted > 1 && worldObj != null && mop != null && mop.typeOfHit == MovingObjectType.BLOCK) { + + int orientation = this.dataWatcher.getWatchableObjectInt(10); + + if(orientation < 6) { + + if(Vec3.createVectorHelper(motionX, motionY, motionZ).lengthVector() < 0.75) { + this.dataWatcher.updateObject(10, orientation + 6); + orientation += 6; + } else { + ForgeDirection side = ForgeDirection.getOrientation(mop.sideHit); + this.motionX *= 1 - (Math.abs(side.offsetX) * 2); + this.motionY *= 1 - (Math.abs(side.offsetY) * 2); + this.motionZ *= 1 - (Math.abs(side.offsetZ) * 2); + worldObj.createExplosion(this, posX, posY, posZ, 3F, false); + + if(worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ).getExplosionResistance(this) < 50) { + worldObj.func_147480_a(mop.blockX, mop.blockY, mop.blockZ, false); + } + } + } + + if(orientation >= 6) { + this.motionX = 0; + this.motionY = 0; + this.motionZ = 0; + this.inGround = true; + } + } + } + + @Override + public void onUpdate() { + + if(!worldObj.isRemote) { + int orientation = this.dataWatcher.getWatchableObjectInt(10); + if(orientation >= 6 && !this.inGround) { + this.dataWatcher.updateObject(10, orientation - 6); + } + } + + super.onUpdate(); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean isInRangeToRenderDist(double distance) { + return true; + } + + @Override + public double getGravityVelocity() { + return inGround ? 0 : 0.03D; + } + + @Override + protected int groundDespawn() { + return 0; + } + + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + super.writeEntityToNBT(nbt); + nbt.setInteger("rot", this.getOrientation()); + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + super.readEntityFromNBT(nbt); + this.setOrientation(nbt.getInteger("rot")); + } +} diff --git a/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java b/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java new file mode 100644 index 000000000..1f2d9a359 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java @@ -0,0 +1,152 @@ +package com.hbm.handler.nei; + +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial; +import com.hbm.inventory.recipes.CrucibleRecipes; +import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemScraps; +import com.hbm.lib.RefStrings; + +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; + +public class CrucibleAlloyingHandler extends TemplateRecipeHandler { + + public LinkedList transferRectsRec = new LinkedList(); + public LinkedList> guiRec = new LinkedList>(); + + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + + List inputs = new ArrayList(); + PositionedStack template; + PositionedStack crucible; + List outputs = new ArrayList(); + + public RecipeSet(CrucibleRecipe recipe) { + List inputs = new ArrayList(); + List outputs = new ArrayList(); + for(MaterialStack stack : recipe.input) inputs.add(ItemScraps.create(stack)); + for(MaterialStack stack : recipe.output) outputs.add(ItemScraps.create(stack)); + + this.template = new PositionedStack(new ItemStack(ModItems.crucible_template, 1, recipe.getId()), 75, 6); + this.crucible = new PositionedStack(new ItemStack(ModBlocks.machine_crucible), 75, 42); + + for(int i = 0; i < inputs.size(); i++) { + PositionedStack pos = new PositionedStack(inputs.get(i), 12 + (i % 3) * 18, 6 + (i / 3) * 18); + this.inputs.add(pos); + } + + for(int i = 0; i < outputs.size(); i++) { + PositionedStack pos = new PositionedStack(outputs.get(i), 102 + (i % 3) * 18, 6 + (i / 3) * 18); + this.outputs.add(pos); + } + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, inputs); + } + + @Override + public PositionedStack getResult() { + return outputs.get(0); + } + + @Override + public List getOtherStacks() { + List other = new ArrayList(); + other.addAll(inputs); + other.add(crucible); + other.add(template); + other.addAll(outputs); + return getCycledIngredients(cycleticks / 20, other); + } + } + + @Override + public String getRecipeName() { + return "Crucible Alloying"; + } + + @Override + public String getGuiTexture() { + return RefStrings.MODID + ":textures/gui/nei/gui_nei_crucible.png"; + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + + if(outputId.equals("ntmCrucibleAlloying")) { + + for(CrucibleRecipe recipe : CrucibleRecipes.recipes) { + this.arecipes.add(new RecipeSet(recipe)); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + + if(result.getItem() != ModItems.scraps) + return; + + NTMMaterial material = Mats.matById.get(result.getItemDamage()); + + for(CrucibleRecipe recipe : CrucibleRecipes.recipes) { + + for(MaterialStack stack : recipe.output) { + if(stack.material == material) { + this.arecipes.add(new RecipeSet(recipe)); + break; + } + } + } + } + + @Override + public void loadUsageRecipes(String inputId, Object... ingredients) { + + if(inputId.equals("ntmCrucibleAlloying")) { + loadCraftingRecipes("ntmCrucibleAlloying", new Object[0]); + } else { + super.loadUsageRecipes(inputId, ingredients); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + + if(ingredient.getItem() != ModItems.scraps) + return; + + NTMMaterial material = Mats.matById.get(ingredient.getItemDamage()); + + for(CrucibleRecipe recipe : CrucibleRecipes.recipes) { + + for(MaterialStack stack : recipe.input) { + if(stack.material == material) { + this.arecipes.add(new RecipeSet(recipe)); + break; + } + } + } + } + + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(65, 23, 36, 18), "ntmCrucibleAlloying")); + RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); + } +} diff --git a/src/main/java/com/hbm/handler/nei/CrucibleCastingHandler.java b/src/main/java/com/hbm/handler/nei/CrucibleCastingHandler.java new file mode 100644 index 000000000..e8e630024 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/CrucibleCastingHandler.java @@ -0,0 +1,124 @@ +package com.hbm.handler.nei; + +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.recipes.CrucibleRecipes; +import com.hbm.items.machine.ItemMold; +import com.hbm.lib.RefStrings; + +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; + +public class CrucibleCastingHandler extends TemplateRecipeHandler { + + public LinkedList transferRectsRec = new LinkedList(); + public LinkedList> guiRec = new LinkedList>(); + + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + + PositionedStack input; + PositionedStack mold; + PositionedStack basin; + PositionedStack output; + + public RecipeSet(ItemStack[] stacks) { + this.input = new PositionedStack(stacks[0].copy(), 48, 24); + this.mold = new PositionedStack(stacks[1].copy(), 75, 6); + this.basin = new PositionedStack(stacks[2].copy(), 75, 42); + //through reasons i cannot explain, stacks[3]'s stack size does not survive until this point. + ItemStack o = ItemMold.moldById.get(stacks[1].getItemDamage()).getOutput(Mats.matById.get(stacks[0].getItemDamage())); + this.output = new PositionedStack(o.copy(), 102, 24); + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, Arrays.asList(input, mold, basin)); + } + + @Override + public PositionedStack getResult() { + return output; + } + + @Override + public List getOtherStacks() { + List other = new ArrayList(); + other.add(input); + other.add(mold); + other.add(basin); + other.add(output); + return getCycledIngredients(cycleticks / 20, other); + } + } + + @Override + public String getRecipeName() { + return "Crucible Casting"; + } + + @Override + public String getGuiTexture() { + return RefStrings.MODID + ":textures/gui/nei/gui_nei_foundry.png"; + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + + if(outputId.equals("ntmCrucibleFoundry")) { + + for(ItemStack[] recipe : CrucibleRecipes.moldRecipes) { + this.arecipes.add(new RecipeSet(recipe)); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + + for(ItemStack[] recipe : CrucibleRecipes.moldRecipes) { + if(NEIServerUtils.areStacksSameTypeCrafting(recipe[3], result)) { + this.arecipes.add(new RecipeSet(recipe)); + } + } + } + + @Override + public void loadUsageRecipes(String inputId, Object... ingredients) { + + if(inputId.equals("ntmCrucibleFoundry")) { + loadCraftingRecipes("ntmCrucibleFoundry", new Object[0]); + } else { + super.loadUsageRecipes(inputId, ingredients); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + + for(ItemStack[] recipe : CrucibleRecipes.moldRecipes) { + + for(int i = 0; i < 3; i++) { + if(NEIServerUtils.areStacksSameTypeCrafting(recipe[i], ingredient)) { + this.arecipes.add(new RecipeSet(recipe)); + break; + } + } + } + } + + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(65, 23, 36, 18), "ntmCrucibleFoundry")); + RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); + } +} diff --git a/src/main/java/com/hbm/handler/nei/CrucibleSmeltingHandler.java b/src/main/java/com/hbm/handler/nei/CrucibleSmeltingHandler.java new file mode 100644 index 000000000..b6af31dc1 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/CrucibleSmeltingHandler.java @@ -0,0 +1,130 @@ +package com.hbm.handler.nei; + +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map.Entry; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.recipes.CrucibleRecipes; +import com.hbm.lib.RefStrings; + +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; + +public class CrucibleSmeltingHandler extends TemplateRecipeHandler { + + public LinkedList transferRectsRec = new LinkedList(); + public LinkedList> guiRec = new LinkedList>(); + + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + + PositionedStack input; + PositionedStack crucible; + List outputs = new ArrayList(); + + public RecipeSet(AStack input, List outputs) { + this.input = new PositionedStack(input.extractForNEI(), 48, 24); + this.crucible = new PositionedStack(new ItemStack(ModBlocks.machine_crucible), 75, 42); + + for(int i = 0; i < outputs.size(); i++) { + PositionedStack pos = new PositionedStack(outputs.get(i), 102 + (i % 3) * 18, 6 + (i / 3) * 18); + this.outputs.add(pos); + } + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, Arrays.asList(input)); + } + + @Override + public PositionedStack getResult() { + return outputs.get(0); + } + + @Override + public List getOtherStacks() { + List other = new ArrayList(); + other.add(input); + other.add(crucible); + other.addAll(outputs); + return getCycledIngredients(cycleticks / 20, other); + } + } + + @Override + public String getRecipeName() { + return "Crucible Smelting"; + } + + @Override + public String getGuiTexture() { + return RefStrings.MODID + ":textures/gui/nei/gui_nei_crucible_smelting.png"; + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + + if(outputId.equals("ntmCrucibleSmelting")) { + + HashMap> smelting = CrucibleRecipes.getSmeltingRecipes(); + + for(Entry> recipe : smelting.entrySet()) { + this.arecipes.add(new RecipeSet(recipe.getKey(), recipe.getValue())); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + HashMap> smelting = CrucibleRecipes.getSmeltingRecipes(); + + for(Entry> recipe : smelting.entrySet()) { + + for(ItemStack stack : recipe.getValue()) { + + if(NEIServerUtils.areStacksSameTypeCrafting(stack, result)) { + this.arecipes.add(new RecipeSet(recipe.getKey(), recipe.getValue())); + break; + } + } + } + } + + @Override + public void loadUsageRecipes(String inputId, Object... ingredients) { + + if(inputId.equals("ntmCrucibleSmelting")) { + loadCraftingRecipes("ntmCrucibleSmelting", new Object[0]); + } else { + super.loadUsageRecipes(inputId, ingredients); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + HashMap> smelting = CrucibleRecipes.getSmeltingRecipes(); + + for(Entry> recipe : smelting.entrySet()) { + if(recipe.getKey().matchesRecipe(ingredient, true)) { + this.arecipes.add(new RecipeSet(recipe.getKey(), recipe.getValue())); + } + } + } + + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(65, 23, 36, 18), "ntmCrucibleSmelting")); + RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); + } +} diff --git a/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java b/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java index 96a1c667e..dda5d9b04 100644 --- a/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java +++ b/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java @@ -177,13 +177,8 @@ public abstract class NEIUniversalHandler extends TemplateRecipeHandler { @Override public void loadTransferRects() { transferRectsGui = new LinkedList(); - //guiGui = new LinkedList>(); - transferRects.add(new RecipeTransferRect(new Rectangle(147, 1, 18, 18), getKey())); - //transferRectsGui.add(new RecipeTransferRect(new Rectangle(18 * 2 + 2, 89 - 7 - 11, 18 * 5 - 4, 18 + 16), key)); - //guiGui.add(GUIMachineAssembler.class); RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); - //RecipeTransferRectHandler.registerRectsToGuis(guiGui, transferRectsGui); } public abstract String getKey(); diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index 8d5cb58c3..b98001f39 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -170,6 +170,7 @@ public class OreDictManager { public static final DictFrame DESH = new DictFrame("WorkersAlloy"); public static final DictFrame STAR = new DictFrame("Starmetal"); public static final DictFrame BIGMT = new DictFrame("Saturnite"); + public static final DictFrame FERRO = new DictFrame("Ferrouranium"); public static final DictFrame EUPH = new DictFrame("Euphemium"); public static final DictFrame DNT = new DictFrame("Dineutronium"); public static final DictFrame FIBER = new DictFrame("Fiberglass"); @@ -338,6 +339,7 @@ public class OreDictManager { DESH .nugget(nugget_desh) .ingot(ingot_desh) .dust(powder_desh) .block(block_desh); STAR .ingot(ingot_starmetal) .block(block_starmetal) .ore(ore_meteor_starmetal); BIGMT .ingot(ingot_saturnite) .plate(plate_saturnite); + FERRO .ingot(ingot_ferrouranium); EUPH .nugget(nugget_euphemium) .ingot(ingot_euphemium) .dust(powder_euphemium) .block(block_euphemium); DNT .nugget(nugget_dineutronium) .ingot(ingot_dineutronium) .dust(powder_dineutronium) .block(block_dineutronium); FIBER .ingot(ingot_fiberglass) .block(block_fiberglass); diff --git a/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java b/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java index e9857b08a..26ad8879d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java +++ b/src/main/java/com/hbm/inventory/gui/GUICoreEmitter.java @@ -24,29 +24,29 @@ public class GUICoreEmitter extends GuiInfoContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/dfc/gui_emitter.png"); private TileEntityCoreEmitter emitter; - private GuiTextField field; - + private GuiTextField field; + public GUICoreEmitter(InventoryPlayer invPlayer, TileEntityCoreEmitter tedf) { super(new ContainerCoreEmitter(invPlayer, tedf)); emitter = tedf; - + this.xSize = 176; this.ySize = 166; } - + public void initGui() { super.initGui(); - Keyboard.enableRepeatEvents(true); - this.field = new GuiTextField(this.fontRendererObj, guiLeft + 57, guiTop + 57, 29, 12); - this.field.setTextColor(-1); - this.field.setDisabledTextColour(-1); - this.field.setEnableBackgroundDrawing(false); - this.field.setMaxStringLength(3); - this.field.setText(String.valueOf(emitter.watts)); + Keyboard.enableRepeatEvents(true); + this.field = new GuiTextField(this.fontRendererObj, guiLeft + 57, guiTop + 57, 29, 12); + this.field.setTextColor(-1); + this.field.setDisabledTextColour(-1); + this.field.setEnableBackgroundDrawing(false); + this.field.setMaxStringLength(3); + this.field.setText(String.valueOf(emitter.watts)); } - + @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); @@ -54,38 +54,38 @@ public class GUICoreEmitter extends GuiInfoContainer { emitter.tank.renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 17, 16, 52); this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 26, guiTop + 17, 16, 52, emitter.power, emitter.maxPower); } - + protected void mouseClicked(int x, int y, int i) { super.mouseClicked(x, y, i); this.field.mouseClicked(x, y, i); - if(guiLeft + 97 <= x && guiLeft + 97 + 18 > x && guiTop + 52 < y && guiTop + 52 + 18 >= y) { - - if(NumberUtils.isNumber(field.getText())) { - int j = MathHelper.clamp_int((int)Double.parseDouble(field.getText()), 1, 100); - field.setText(j + ""); - mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); - PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(emitter.xCoord, emitter.yCoord, emitter.zCoord, j, 0)); - } - } + if(guiLeft + 97 <= x && guiLeft + 97 + 18 > x && guiTop + 52 < y && guiTop + 52 + 18 >= y) { - if(guiLeft + 133 <= x && guiLeft + 133 + 18 > x && guiTop + 52 < y && guiTop + 52 + 18 >= y) { + if(NumberUtils.isNumber(field.getText())) { + int j = MathHelper.clamp_int((int) Double.parseDouble(field.getText()), 1, 100); + field.setText(j + ""); + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(emitter.xCoord, emitter.yCoord, emitter.zCoord, j, 0)); + } + } + + if(guiLeft + 133 <= x && guiLeft + 133 + 18 > x && guiTop + 52 < y && guiTop + 52 + 18 >= y) { mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); - PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(emitter.xCoord, emitter.yCoord, emitter.zCoord, 0, 1)); - } + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(emitter.xCoord, emitter.yCoord, emitter.zCoord, 0, 1)); + } } @Override - protected void drawGuiContainerForegroundLayer( int i, int j) { + protected void drawGuiContainerForegroundLayer(int i, int j) { String name = I18n.format(this.emitter.getInventoryName()); this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); - + this.fontRendererObj.drawString("Output: " + BobMathUtil.getShortNumber(emitter.prev) + "Spk", 50, 30, 0xFF7F7F); - + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } - + @Override protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); @@ -99,19 +99,19 @@ public class GUICoreEmitter extends GuiInfoContainer { drawTexturedModalRect(guiLeft + 133, guiTop + 52, 192, 0, 18, 18); drawTexturedModalRect(guiLeft + 53, guiTop + 45, 210, 0, emitter.watts * 34 / 100, 4); - + int i = (int) emitter.getPowerScaled(52); drawTexturedModalRect(guiLeft + 26, guiTop + 69 - i, 176, 52 - i, 16, i); - + this.field.drawTextBox(); emitter.tank.renderTank(guiLeft + 8, guiTop + 69, this.zLevel, 16, 52); } - + protected void keyTyped(char p_73869_1_, int p_73869_2_) { - + if(this.field.textboxKeyTyped(p_73869_1_, p_73869_2_)) { - + } else { super.keyTyped(p_73869_1_, p_73869_2_); } diff --git a/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java b/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java index 1d7fad6de..661f5681d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java +++ b/src/main/java/com/hbm/inventory/gui/GUINukeFstbmb.java @@ -21,8 +21,8 @@ public class GUINukeFstbmb extends GuiInfoContainer { public static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/weapon/fstbmbSchematic.png"); private TileEntityNukeBalefire bomb; - private GuiTextField timer; - + private GuiTextField timer; + public GUINukeFstbmb(InventoryPlayer invPlayer, TileEntityNukeBalefire bomb) { super(new ContainerNukeFstbmb(invPlayer, bomb)); this.bomb = bomb; @@ -30,89 +30,88 @@ public class GUINukeFstbmb extends GuiInfoContainer { this.xSize = 176; this.ySize = 222; } - + public void initGui() { super.initGui(); - Keyboard.enableRepeatEvents(true); - this.timer = new GuiTextField(this.fontRendererObj, guiLeft + 94, guiTop + 40, 29, 12); - this.timer.setTextColor(0xff0000); - this.timer.setDisabledTextColour(0x800000); - this.timer.setEnableBackgroundDrawing(false); - this.timer.setMaxStringLength(3); - this.timer.setText(String.valueOf(bomb.timer / 20)); + Keyboard.enableRepeatEvents(true); + this.timer = new GuiTextField(this.fontRendererObj, guiLeft + 94, guiTop + 40, 29, 12); + this.timer.setTextColor(0xff0000); + this.timer.setDisabledTextColour(0x800000); + this.timer.setEnableBackgroundDrawing(false); + this.timer.setMaxStringLength(3); + this.timer.setText(String.valueOf(bomb.timer / 20)); } - + @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); } protected void mouseClicked(int x, int y, int i) { - super.mouseClicked(x, y, i); - this.timer.mouseClicked(x, y, i); - + super.mouseClicked(x, y, i); + this.timer.mouseClicked(x, y, i); if(!bomb.started) { - if(guiLeft + 142 <= x && guiLeft + 142 + 18 > x && guiTop + 35 < y && guiTop + 35 + 18 >= y) { - - PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(bomb.xCoord, bomb.yCoord, bomb.zCoord, 0, 0)); - } + if(guiLeft + 142 <= x && guiLeft + 142 + 18 > x && guiTop + 35 < y && guiTop + 35 + 18 >= y) { + + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(bomb.xCoord, bomb.yCoord, bomb.zCoord, 0, 0)); + } } - } - + } + @Override protected void drawGuiContainerForegroundLayer(int i, int j) { - + String name = this.bomb.hasCustomInventoryName() ? this.bomb.getInventoryName() : I18n.format(this.bomb.getInventoryName()); - + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); - + if(bomb.hasBattery()) { String timer = bomb.getMinutes() + ":" + bomb.getSeconds(); double scale = 0.75; GL11.glScaled(scale, scale, scale); - this.fontRendererObj.drawString(timer, (int) ((69 - this.fontRendererObj.getStringWidth(timer) / 2) * (1/scale)), (int) (95.5 * (1/scale)), 0xff0000); + this.fontRendererObj.drawString(timer, (int) ((69 - this.fontRendererObj.getStringWidth(timer) / 2) * (1 / scale)), (int) (95.5 * (1 / scale)), 0xff0000); - GL11.glScaled(1/scale, 1/scale, 1/scale); + GL11.glScaled(1 / scale, 1 / scale, 1 / scale); } } - + @Override protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - + if(bomb.hasEgg()) drawTexturedModalRect(guiLeft + 19, guiTop + 90, 176, 0, 30, 16); - + int battery = bomb.getBattery(); - + if(battery == 1) drawTexturedModalRect(guiLeft + 88, guiTop + 93, 176, 16, 18, 10); else if(battery == 2) drawTexturedModalRect(guiLeft + 88, guiTop + 93, 194, 16, 18, 10); - + if(bomb.started) drawTexturedModalRect(guiLeft + 142, guiTop + 35, 176, 26, 18, 18); - - this.timer.drawTextBox(); - } - - protected void keyTyped(char p_73869_1_, int p_73869_2_) { - - if (this.timer.textboxKeyTyped(p_73869_1_, p_73869_2_)) { - if(NumberUtils.isNumber(timer.getText())) { - int j = MathHelper.clamp_int(Integer.parseInt(timer.getText()), 1, 999); - PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(bomb.xCoord, bomb.yCoord, bomb.zCoord, j, 1)); - } - - } else { - super.keyTyped(p_73869_1_, p_73869_2_); - } - } + this.timer.drawTextBox(); + } + + protected void keyTyped(char p_73869_1_, int p_73869_2_) { + + if(this.timer.textboxKeyTyped(p_73869_1_, p_73869_2_)) { + + if(NumberUtils.isNumber(timer.getText())) { + int j = MathHelper.clamp_int((int) Double.parseDouble(timer.getText()), 1, 999); + PacketDispatcher.wrapper.sendToServer(new AuxButtonPacket(bomb.xCoord, bomb.yCoord, bomb.zCoord, j, 1)); + } + + } else { + super.keyTyped(p_73869_1_, p_73869_2_); + } + } } diff --git a/src/main/java/com/hbm/inventory/material/MatDistribution.java b/src/main/java/com/hbm/inventory/material/MatDistribution.java index 0c22e9780..196848068 100644 --- a/src/main/java/com/hbm/inventory/material/MatDistribution.java +++ b/src/main/java/com/hbm/inventory/material/MatDistribution.java @@ -24,8 +24,8 @@ public class MatDistribution { registerOre("cobblestone", MAT_STONE, BLOCK.q(1)); registerEntry(Blocks.obsidian, MAT_OBSIDIAN, BLOCK.q(1)); registerEntry(Blocks.rail, MAT_IRON, INGOT.q(6, 16)); - registerEntry(Blocks.golden_rail, MAT_GOLD, INGOT.q(6), MAT_REDSTONE, DUST.q(1)); - registerEntry(Blocks.detector_rail, MAT_IRON, INGOT.q(6), MAT_REDSTONE, DUST.q(1)); + registerEntry(Blocks.golden_rail, MAT_GOLD, INGOT.q(6, 6), MAT_REDSTONE, DUST.q(1, 6)); + registerEntry(Blocks.detector_rail, MAT_IRON, INGOT.q(6, 6), MAT_REDSTONE, DUST.q(1, 6)); registerEntry(Items.minecart, MAT_IRON, INGOT.q(5)); //castables @@ -53,9 +53,18 @@ public class MatDistribution { registerEntry(ModItems.pipes_steel, MAT_STEEL, BLOCK.q(3)); //actual ores - registerOre(OreDictManager.COAL.ore(), MAT_IRON, INGOT.q(4), MAT_STONE, QUART.q(1)); - registerOre(OreDictManager.IRON.ore(), MAT_IRON, INGOT.q(3), MAT_TITANIUM, INGOT.q(1), MAT_STONE, QUART.q(1)); - registerOre(OreDictManager.GOLD.ore(), MAT_GOLD, INGOT.q(3), MAT_LEAD, INGOT.q(1), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.COAL.ore(), MAT_COAL, GEM.q(4), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.IRON.ore(), MAT_IRON, INGOT.q(2), MAT_TITANIUM, NUGGET.q(3), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.GOLD.ore(), MAT_GOLD, INGOT.q(2), MAT_LEAD, NUGGET.q(3), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.U.ore(), MAT_URANIUM, INGOT.q(2), MAT_LEAD, NUGGET.q(3), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.TH232.ore(), MAT_THORIUM, INGOT.q(2), MAT_URANIUM, NUGGET.q(3), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.TI.ore(), MAT_TITANIUM, INGOT.q(2), MAT_IRON, NUGGET.q(3), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.CU.ore(), MAT_COPPER, INGOT.q(2), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.W.ore(), MAT_TUNGSTEN, INGOT.q(2), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.AL.ore(), MAT_ALUMINIUM, INGOT.q(2), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.PB.ore(), MAT_LEAD, INGOT.q(2), MAT_GOLD, NUGGET.q(1), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.BE.ore(), MAT_BERYLLIUM, INGOT.q(2), MAT_STONE, QUART.q(1)); + registerOre(OreDictManager.CO.ore(), MAT_COBALT, INGOT.q(1), MAT_STONE, QUART.q(1)); } public static void registerEntry(Object key, Object... matDef) { diff --git a/src/main/java/com/hbm/inventory/material/MaterialShapes.java b/src/main/java/com/hbm/inventory/material/MaterialShapes.java index 4dcc41a1e..6235c5670 100644 --- a/src/main/java/com/hbm/inventory/material/MaterialShapes.java +++ b/src/main/java/com/hbm/inventory/material/MaterialShapes.java @@ -8,6 +8,8 @@ public enum MaterialShapes { WIRE(9), BILLET(NUGGET.quantity * 6, "billet"), INGOT(NUGGET.quantity * 9, "ingot"), + GEM(INGOT.quantity, "gem"), + CRYSTAL(INGOT.quantity, "crystal"), DUST(INGOT.quantity, "dust"), PLATE(INGOT.quantity, "plate"), QUART(162), diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index 205882ef5..e229cadb4 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -49,46 +49,51 @@ public class Mats { public static final NTMMaterial MAT_STONE = makeSmeltable(_VS + 00, df("Stone"), 0x4D2F23).omitAutoGen(); public static final NTMMaterial MAT_COAL = makeAdditive( 1400, COAL, 0x583434).omitAutoGen(); public static final NTMMaterial MAT_LIGNITE = makeAdditive( 1401, LIGNITE, 0x715444); - public static final NTMMaterial MAT_COALCOKE = makeAdditive( 1410, COALCOKE, 0); - public static final NTMMaterial MAT_PETCOKE = makeAdditive( 1411, PETCOKE, 0); - public static final NTMMaterial MAT_LIGCOKE = makeAdditive( 1412, LIGCOKE, 0); - public static final NTMMaterial MAT_GRAPHITE = makeAdditive( 1420, GRAPHITE, 0); + public static final NTMMaterial MAT_COALCOKE = makeAdditive( 1410, COALCOKE, 0x3B3B3B); + public static final NTMMaterial MAT_PETCOKE = makeAdditive( 1411, PETCOKE, 0x71645C); + public static final NTMMaterial MAT_LIGCOKE = makeAdditive( 1412, LIGCOKE, 0x725644); + public static final NTMMaterial MAT_GRAPHITE = makeAdditive( 1420, GRAPHITE, 0x666666); public static final NTMMaterial MAT_IRON = makeSmeltable(2600, IRON, 0xFFA259).omitAutoGen(); public static final NTMMaterial MAT_GOLD = makeSmeltable(7900, GOLD, 0xE8D754).omitAutoGen(); public static final NTMMaterial MAT_REDSTONE = makeSmeltable(_VS + 01, REDSTONE, 0xFF1000).omitAutoGen(); public static final NTMMaterial MAT_OBSIDIAN = makeSmeltable(_VS + 02, df("Obsidian"), 0x3D234D).omitAutoGen(); //Radioactive - public static final NTMMaterial MAT_URANIUM = makeSmeltable(9200, U, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_THORIUM = makeSmeltable(9232, TH232, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_PLUTONIUM = makeSmeltable(9400, PU, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_RADIUM = makeSmeltable(8826, RA226, 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_SCHRABIDIUM = makeSmeltable(12626, SA326, 0).setShapes(NUGGET, WIRE, BILLET, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_URANIUM = makeSmeltable(9200, U, 0x9AA196).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_U233 = makeSmeltable(9233, U233, 0x9AA196).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_U235 = makeSmeltable(9235, U235, 0x9AA196).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_U238 = makeSmeltable(9238, U238, 0x9AA196).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_THORIUM = makeSmeltable(9032, TH232, 0xBF825F).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_PLUTONIUM = makeSmeltable(9400, PU, 0x78817E).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_TECHNIETIUM = makeSmeltable(4399, TC99, 0xCADFDF).setShapes(NUGGET, BILLET, INGOT, BLOCK); + public static final NTMMaterial MAT_RADIUM = makeSmeltable(8826, RA226, 0xE9FAF6).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_SCHRABIDIUM = makeSmeltable(12626, SA326, 0x32FFFF).setShapes(NUGGET, WIRE, BILLET, INGOT, DUST, PLATE, BLOCK); //Base metals public static final NTMMaterial MAT_TITANIUM = makeSmeltable(2200, TI, 0xA99E79).setShapes(INGOT, DUST, PLATE, BLOCK); public static final NTMMaterial MAT_COPPER = makeSmeltable(2900, CU, 0xC18336).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); - public static final NTMMaterial MAT_TUNGSTEN = makeSmeltable(7400, W, 0).setShapes(WIRE, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(1300, AL, 0).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); - public static final NTMMaterial MAT_LEAD = makeSmeltable(8200, PB, 0).setShapes(NUGGET, INGOT, DUST, PLATE, BLOCK); - public static final NTMMaterial MAT_BISMUTH = makeSmeltable(8300, df("Bismuth"), 0).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_ARSENIC = makeSmeltable(3300, AS, 0).setShapes(NUGGET, INGOT); - public static final NTMMaterial MAT_TANTALIUM = makeSmeltable(7300, TA, 0).setShapes(NUGGET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_NIOBIUM = makeSmeltable(4100, NB, 0).setShapes(NUGGET, DUSTTINY, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_BERYLLIUM = makeSmeltable(400, BE, 0).setShapes(NUGGET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_COBALT = makeSmeltable(2700, CO, 0).setShapes(NUGGET, DUSTTINY, BILLET, INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_BORON = makeSmeltable(500, B, 0).setShapes(DUSTTINY, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_TUNGSTEN = makeSmeltable(7400, W, 0x977474).setShapes(WIRE, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(1300, AL, 0xD0B8EB).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_LEAD = makeSmeltable(8200, PB, 0x646470).setShapes(NUGGET, INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_BISMUTH = makeSmeltable(8300, df("Bismuth"), 0xB200FF).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_ARSENIC = makeSmeltable(3300, AS, 0x558080).setShapes(NUGGET, INGOT); + public static final NTMMaterial MAT_TANTALIUM = makeSmeltable(7300, TA, 0xA89B74).setShapes(NUGGET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_NIOBIUM = makeSmeltable(4100, NB, 0xD576B1).setShapes(NUGGET, DUSTTINY, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_BERYLLIUM = makeSmeltable(400, BE, 0xAE9572).setShapes(NUGGET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_COBALT = makeSmeltable(2700, CO, 0x8F72AE).setShapes(NUGGET, DUSTTINY, BILLET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_BORON = makeSmeltable(500, B, 0xAD72AE).setShapes(DUSTTINY, INGOT, DUST, BLOCK); //Alloys public static final NTMMaterial MAT_STEEL = makeSmeltable(_AS + 0, STEEL, 0x4A4A4A).setShapes(DUSTTINY, INGOT, DUST, PLATE, BLOCK); public static final NTMMaterial MAT_MINGRADE = makeSmeltable(_AS + 1, MINGRADE, 0xE44C0F).setShapes(WIRE, INGOT, DUST, BLOCK); public static final NTMMaterial MAT_ALLOY = makeSmeltable(_AS + 2, ALLOY, 0xFF7318).setShapes(WIRE, INGOT, DUST, PLATE, BLOCK); - public static final NTMMaterial MAT_DURA = makeSmeltable(_AS + 3, DURA, 0).setShapes(INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_SATURN = makeSmeltable(_AS + 4, BIGMT, 0).setShapes(INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_STAR = makeSmeltable(_AS + 5, STAR, 0).setShapes(INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_TCALLOY = makeSmeltable(_AS + 6, TCALLOY, 0).setShapes(INGOT, DUST); - public static final NTMMaterial MAT_MAGTUNG = makeSmeltable(_AS + 7, MAGTUNG, 0).setShapes(INGOT, DUST, BLOCK); - public static final NTMMaterial MAT_CMB = makeSmeltable(_AS + 8, CMB, 0).setShapes(INGOT, DUST, PLATE, BLOCK); + public static final NTMMaterial MAT_DURA = makeSmeltable(_AS + 3, DURA, 0x376373).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_SATURN = makeSmeltable(_AS + 4, BIGMT, 0x4DA3AF).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_STAR = makeSmeltable(_AS + 5, STAR, 0xA5A5D3).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_TCALLOY = makeSmeltable(_AS + 6, TCALLOY, 0x9CA6A6).setShapes(INGOT, DUST); + public static final NTMMaterial MAT_FERRO = makeSmeltable(_AS + 7, FERRO, 0x6B6B8B).setShapes(INGOT); + public static final NTMMaterial MAT_MAGTUNG = makeSmeltable(_AS + 8, MAGTUNG, 0x22A2A2).setShapes(INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_CMB = makeSmeltable(_AS + 9, CMB, 0x6F6FB4).setShapes(INGOT, DUST, PLATE, BLOCK); public static NTMMaterial make(int id, DictFrame dict) { return new NTMMaterial(id, dict); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index b4abb39ad..078efd54c 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -1344,17 +1344,6 @@ public class AssemblerRecipes { value.add(((ComparableStack)o).toStack()); } else if(o instanceof OreDictStack) { - - /*List list = new ArrayList(); - OreDictStack oreStack = (OreDictStack)o; - List ores = OreDictionary.getOres(oreStack.name); - - for(ItemStack ore : ores) { - ItemStack copy = ore.copy(); - copy.stackSize = oreStack.stacksize; - list.add(copy); - }*/ - value.add(((OreDictStack)o).extractForNEI()); } } diff --git a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java index 3921cbfae..4657e1175 100644 --- a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java @@ -17,6 +17,7 @@ import com.hbm.handler.imc.IMCBlastFurnace; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import com.hbm.util.Tuple.Triplet; @@ -46,10 +47,10 @@ public class BlastFurnaceRecipes { addRecipe(STEEL, MINGRADE, new ItemStack(ModItems.ingot_advanced_alloy, 2)); addRecipe(W, COAL, new ItemStack(ModItems.neutron_reflector, 2)); addRecipe(W, ANY_COKE, new ItemStack(ModItems.neutron_reflector, 2)); - addRecipe(ModItems.canister_fuel, "slimeball", new ItemStack(ModItems.canister_napalm)); - addRecipe(STEEL, CO, new ItemStack(ModItems.ingot_dura_steel, 2)); - addRecipe(STEEL, W, new ItemStack(ModItems.ingot_dura_steel, 2)); - addRecipe(STEEL, U238, new ItemStack(ModItems.ingot_ferrouranium)); + addRecipe(new ComparableStack(ModItems.canister_full, 1, Fluids.GASOLINE.getID()), "slimeball", new ItemStack(ModItems.canister_napalm)); + //addRecipe(STEEL, CO, new ItemStack(ModItems.ingot_dura_steel, 2)); + //addRecipe(STEEL, W, new ItemStack(ModItems.ingot_dura_steel, 2)); + //addRecipe(STEEL, U238, new ItemStack(ModItems.ingot_ferrouranium)); addRecipe(W, SA326.nugget(), new ItemStack(ModItems.ingot_magnetized_tungsten)); addRecipe(STEEL, TC99.nugget(), new ItemStack(ModItems.ingot_tcalloy)); addRecipe(GOLD.plate(), ModItems.plate_mixed, new ItemStack(ModItems.plate_paa, 2)); @@ -59,7 +60,7 @@ public class BlastFurnaceRecipes { addRecipe(ModBlocks.block_meteor, CO, new ItemStack(ModItems.ingot_meteorite)); if(GeneralConfig.enableLBSMSimpleChemsitry) - addRecipe(ModItems.canister_empty, COAL, new ItemStack(ModItems.canister_oil)); + addRecipe(ModItems.canister_empty, COAL, new ItemStack(ModItems.canister_full, 1, Fluids.OIL.getID())); if(!IMCBlastFurnace.buffer.isEmpty()) { blastFurnaceRecipes.addAll(IMCBlastFurnace.buffer); diff --git a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java index 9234b5487..47928e085 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java @@ -4,15 +4,28 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map.Entry; import com.google.gson.JsonElement; import com.google.gson.stream.JsonWriter; +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.material.MaterialShapes; import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.material.NTMMaterial; +import com.hbm.inventory.material.NTMMaterial.SmeltingBehavior; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemMold; +import com.hbm.items.machine.ItemMold.Mold; +import com.hbm.items.machine.ItemScraps; +import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; public class CrucibleRecipes extends SerializableRecipe { @@ -26,18 +39,35 @@ public class CrucibleRecipes extends SerializableRecipe { @Override public void registerDefaults() { + + int n = MaterialShapes.NUGGET.q(1); + int i = MaterialShapes.INGOT.q(1); recipes.add(new CrucibleRecipe(0, "crucible.steel", 1, new ItemStack(ModItems.ingot_steel)) - .inputs(new MaterialStack(Mats.MAT_IRON, 8), new MaterialStack(Mats.MAT_COAL, 8)) - .outputs(new MaterialStack(Mats.MAT_STEEL, 8))); + .inputs(new MaterialStack(Mats.MAT_IRON, n), new MaterialStack(Mats.MAT_COAL, n)) + .outputs(new MaterialStack(Mats.MAT_STEEL, n))); - recipes.add(new CrucibleRecipe(1, "crucible.redcopper", 1, new ItemStack(ModItems.ingot_red_copper)) - .inputs(new MaterialStack(Mats.MAT_COPPER, 8), new MaterialStack(Mats.MAT_REDSTONE, 8)) - .outputs(new MaterialStack(Mats.MAT_MINGRADE, 16))); + recipes.add(new CrucibleRecipe(1, "crucible.redcopper", 2, new ItemStack(ModItems.ingot_red_copper)) + .inputs(new MaterialStack(Mats.MAT_COPPER, n), new MaterialStack(Mats.MAT_REDSTONE, n)) + .outputs(new MaterialStack(Mats.MAT_MINGRADE, n * 2))); - recipes.add(new CrucibleRecipe(2, "crucible.aa", 1, new ItemStack(ModItems.ingot_advanced_alloy)) - .inputs(new MaterialStack(Mats.MAT_STEEL, 8), new MaterialStack(Mats.MAT_MINGRADE, 8)) - .outputs(new MaterialStack(Mats.MAT_ALLOY, 16))); + recipes.add(new CrucibleRecipe(2, "crucible.aa", 2, new ItemStack(ModItems.ingot_advanced_alloy)) + .inputs(new MaterialStack(Mats.MAT_STEEL, n), new MaterialStack(Mats.MAT_MINGRADE, n)) + .outputs(new MaterialStack(Mats.MAT_ALLOY, n * 2))); + + recipes.add(new CrucibleRecipe(3, "crucible.hss", 4, new ItemStack(ModItems.ingot_dura_steel)) + .inputs(new MaterialStack(Mats.MAT_STEEL, n * 2), new MaterialStack(Mats.MAT_TUNGSTEN, n), new MaterialStack(Mats.MAT_COBALT, n)) + .outputs(new MaterialStack(Mats.MAT_DURA, n * 4))); + + recipes.add(new CrucibleRecipe(4, "crucible.ferro", 3, new ItemStack(ModItems.ingot_ferrouranium)) + .inputs(new MaterialStack(Mats.MAT_STEEL, n * 2), new MaterialStack(Mats.MAT_U238, n), new MaterialStack(Mats.MAT_COAL, n)) + .outputs(new MaterialStack(Mats.MAT_FERRO, n * 3))); + + recipes.add(new CrucibleRecipe(5, "crucible.tcalloy", 9, new ItemStack(ModItems.ingot_tcalloy)) + .inputs(new MaterialStack(Mats.MAT_STEEL, n * 8), new MaterialStack(Mats.MAT_TECHNIETIUM, n), new MaterialStack(Mats.MAT_COAL, n * 4)) + .outputs(new MaterialStack(Mats.MAT_TCALLOY, i))); + + registerMoldsForNEI(); } public static class CrucibleRecipe { @@ -101,6 +131,11 @@ public class CrucibleRecipes extends SerializableRecipe { return this.recipes; } + @Override + public String getComment() { + return "/// under construction ///"; + } + @Override public void readRecipe(JsonElement recipe) { @@ -116,4 +151,64 @@ public class CrucibleRecipes extends SerializableRecipe { this.indexMapping.clear(); this.recipes.clear(); } + + /** Returns a map containing all recipes where an item becomes a liquid material in the crucible. */ + public static HashMap> getSmeltingRecipes() { + HashMap> map = new HashMap(); + + for(NTMMaterial material : Mats.orderedList) { + for(MaterialShapes shape : MaterialShapes.values()) { + //TODO: buffer these + + String name = shape.toString().toLowerCase() + material.names[0]; + List ores = OreDictionary.getOres(name); + + if(!ores.isEmpty()) { + List stacks = new ArrayList(); + stacks.add(ItemScraps.create(new MaterialStack(material, shape.q(1)))); + map.put(new OreDictStack(name), stacks); + } + } + } + + for(Entry> entry : Mats.materialOreEntries.entrySet()) { + List stacks = new ArrayList(); + for(MaterialStack mat : entry.getValue()) { + stacks.add(ItemScraps.create(mat)); + } + map.put(new OreDictStack(entry.getKey()), stacks); + } + + for(Entry> entry : Mats.materialEntries.entrySet()) { + List stacks = new ArrayList(); + for(MaterialStack mat : entry.getValue()) { + stacks.add(ItemScraps.create(mat)); + } + map.put(entry.getKey().copy(), stacks); + } + + return map; + } + + public static List moldRecipes = new ArrayList(); + + public static void registerMoldsForNEI() { + + for(NTMMaterial material : Mats.orderedList) { + + if(material.smeltable != SmeltingBehavior.SMELTABLE) + continue; + + for(Mold mold : ItemMold.molds) { + ItemStack out = mold.getOutput(material); + if(out != null) { + ItemStack scrap = ItemScraps.create(new MaterialStack(material, mold.getCost())); + ItemStack shape = new ItemStack(ModItems.mold, 1, mold.id); + ItemStack basin = new ItemStack(mold.size == 0 ? ModBlocks.foundry_mold : mold.size == 1 ? ModBlocks.foundry_basin : Blocks.fire); + ItemStack[] entry = new ItemStack[] {scrap, shape, basin, out}; + moldRecipes.add(entry); + } + } + } + } } diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index 8d1dfcfec..84c875858 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -116,6 +116,11 @@ public class AnvilRecipes { smithingRecipes.add(new AnvilSmithingMold(11, new OreDictStack(IRON.plate(), 9), new OreDictStack("plate", 9))); smithingRecipes.add(new AnvilSmithingMold(12, new OreDictStack(IRON.block()), new OreDictStack("block"))); smithingRecipes.add(new AnvilSmithingMold(13, new ComparableStack(ModItems.pipes_steel), new ItemStack[] {new ItemStack(ModItems.pipes_steel)})); + smithingRecipes.add(new AnvilSmithingMold(14, new ComparableStack(ModItems.casing_357), new ItemStack[] {new ItemStack(ModItems.casing_357)})); + smithingRecipes.add(new AnvilSmithingMold(15, new ComparableStack(ModItems.casing_44), new ItemStack[] {new ItemStack(ModItems.casing_44)})); + smithingRecipes.add(new AnvilSmithingMold(16, new ComparableStack(ModItems.casing_9), new ItemStack[] {new ItemStack(ModItems.casing_9)})); + smithingRecipes.add(new AnvilSmithingMold(17, new ComparableStack(ModItems.casing_50), new ItemStack[] {new ItemStack(ModItems.casing_50)})); + smithingRecipes.add(new AnvilSmithingMold(18, new ComparableStack(ModItems.casing_buckshot), new ItemStack[] {new ItemStack(ModItems.casing_buckshot)})); smithingRecipes.add(new AnvilSmithingCyanideRecipe()); smithingRecipes.add(new AnvilSmithingRenameRecipe()); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index dfc52f442..918c72eeb 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -3356,7 +3356,7 @@ public class ModItems { mold_base = new Item().setUnlocalizedName("mold_base").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":mold_base"); mold = new ItemMold().setUnlocalizedName("mold").setCreativeTab(MainRegistry.controlTab); - scraps = new ItemScraps().setUnlocalizedName("scraps").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":scraps"); + scraps = new ItemScraps().setUnlocalizedName("scraps").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":scraps"); part_lithium = new Item().setUnlocalizedName("part_lithium").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":part_lithium"); part_beryllium = new Item().setUnlocalizedName("part_beryllium").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":part_beryllium"); diff --git a/src/main/java/com/hbm/items/machine/ItemMold.java b/src/main/java/com/hbm/items/machine/ItemMold.java index fb42c0c7f..1743aca29 100644 --- a/src/main/java/com/hbm/items/machine/ItemMold.java +++ b/src/main/java/com/hbm/items/machine/ItemMold.java @@ -26,8 +26,8 @@ import net.minecraftforge.oredict.OreDictionary; public class ItemMold extends Item { - public List molds = new ArrayList(); //molds in "pretty" order, variable between versions - public HashMap moldById = new HashMap(); //molds by their static ID -> stack item damage + public static List molds = new ArrayList(); //molds in "pretty" order, variable between versions + public static HashMap moldById = new HashMap(); //molds by their static ID -> stack item damage public HashMap blockOverrides = new HashMap(); @@ -47,7 +47,7 @@ public class ItemMold extends Item { registerMold(new MoldShape( 3, S, "plate", MaterialShapes.PLATE)); registerMold(new MoldWire( 4, S, "wire")); - registerMold(new MoldMulti( 5, S, "blade", MaterialShapes.INGOT.q(2), + registerMold(new MoldMulti( 5, S, "blade", MaterialShapes.INGOT.q(3), Mats.MAT_TITANIUM, new ItemStack(ModItems.blade_titanium), Mats.MAT_TUNGSTEN, new ItemStack(ModItems.blade_tungsten))); @@ -82,6 +82,12 @@ public class ItemMold extends Item { registerMold(new MoldShape( 11, L, "plates", MaterialShapes.PLATE, 9)); registerMold(new MoldBlock( 12, L, "block", MaterialShapes.BLOCK)); registerMold(new MoldSingle( 13, L, "pipes", new ItemStack(ModItems.pipes_steel), Mats.MAT_STEEL, MaterialShapes.BLOCK.q(3))); + + registerMold(new MoldSingle( 14, S, "c357", new ItemStack(ModItems.casing_357), Mats.MAT_COPPER, MaterialShapes.PLATE.q(1))); + registerMold(new MoldSingle( 15, S, "c44", new ItemStack(ModItems.casing_44), Mats.MAT_COPPER, MaterialShapes.PLATE.q(1))); + registerMold(new MoldSingle( 16, S, "c9", new ItemStack(ModItems.casing_9), Mats.MAT_COPPER, MaterialShapes.PLATE.q(1))); + registerMold(new MoldSingle( 17, S, "c50", new ItemStack(ModItems.casing_50), Mats.MAT_COPPER, MaterialShapes.PLATE.q(1))); + registerMold(new MoldSingle( 18, S, "cbuckshot", new ItemStack(ModItems.casing_buckshot), Mats.MAT_COPPER, MaterialShapes.PLATE.q(1))); } public void registerMold(Mold mold) { diff --git a/src/main/java/com/hbm/lib/HbmChestContents.java b/src/main/java/com/hbm/lib/HbmChestContents.java index e8b53cd74..17cbe32fe 100644 --- a/src/main/java/com/hbm/lib/HbmChestContents.java +++ b/src/main/java/com/hbm/lib/HbmChestContents.java @@ -1,12 +1,11 @@ package com.hbm.lib; -import java.util.Random; +import java.util.HashMap; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemBreedingRod.*; -import com.hbm.util.I18nUtil; import net.minecraft.init.Items; import net.minecraft.item.Item; @@ -15,7 +14,6 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagString; import net.minecraft.util.WeightedRandomChestContent; -import net.minecraft.world.World; public class HbmChestContents { @@ -360,8 +358,8 @@ public class HbmChestContents { /** Nowhere else to put this and this seems like the most fitting place **/ public static ItemStack genetateBook(String key) { - String author = I18nUtil.resolveKey("book.lore." + key + ".author"); - String title = I18nUtil.resolveKey("book.lore." + key + ".title"); + String author = resolve("book.lore." + key + ".author"); + String title = resolve("book.lore." + key + ".title"); ItemStack book = new ItemStack(Items.written_book); book.stackTagCompound = new NBTTagCompound(); @@ -371,7 +369,7 @@ public class HbmChestContents { for(byte i = 1; i <= 50; i++) { String unloc = "book.lore." + key + ".page" + i; - String page = I18nUtil.resolveKey(unloc); + String page = resolve(unloc); if(page.equals(unloc)) break; @@ -383,4 +381,23 @@ public class HbmChestContents { return book; } + + private static String resolve(String key) { + String result = books.get(key); + return result != null ? result : key; + } + + private static HashMap books = new HashMap(); + + static { + books.put("book.lore.office0.title", "Letter of Resignation"); + books.put("book.lore.office0.author", "Kosma"); + books.put("book.lore.office0.page1", "Management downsized our department again yesterday. Those idiots only have themselves to blame, I don't know what they were expecting after the Panay fiasco. Who the hell leaks that sort of information? We're losing millions and"); + books.put("book.lore.office0.page2", "it's ME who's the one out of a job now. I'M the one being asked to resign. I hope you asshats finally learn from your overabundance of mistakes and take that stick out of your ass."); + books.put("book.lore.office0.page3", "I'm not coming back on Friday. Just send the paycheck."); + books.put("book.lore.office1.title", "Note"); + books.put("book.lore.office1.author", "Jonas"); + books.put("book.lore.office1.page1", null); + books.put("book.lore.office2.page2", null); + } } diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index f131c6199..7039d641b 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 (4347)"; + public static final String VERSION = "1.0.27 BETA (4375)"; //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 54a1d2560..a927da6c9 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -562,6 +562,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityZirnoxDebris.class, new RenderZirnoxDebris()); RenderingRegistry.registerEntityRenderingHandler(EntityArtilleryShell.class, new RenderArtilleryShell()); RenderingRegistry.registerEntityRenderingHandler(EntityCog.class, new RenderCog()); + RenderingRegistry.registerEntityRenderingHandler(EntitySawblade.class, new RenderSawblade()); RenderingRegistry.registerEntityRenderingHandler(EntityChemical.class, new RenderChemical()); //grenades RenderingRegistry.registerEntityRenderingHandler(EntityGrenadeGeneric.class, new RenderSnowball(ModItems.grenade_generic)); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 28008617b..8f6de38a2 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -298,8 +298,8 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.muffler, 1), new Object[] { "III", "IWI", "III", 'I', ModItems.plate_polymer, 'W', Blocks.wool }); - addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.factory_titanium_hull), 1), new Object[] { "PIP", "I I", "PIP", 'P', TI.plate(), 'I', TI.ingot() }); - addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.factory_advanced_hull), 1), new Object[] { "PIP", "I I", "PIP", 'P', ALLOY.plate(), 'I', ALLOY.ingot() }); + addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.factory_titanium_hull), 8), new Object[] { "PIP", "I I", "PIP", 'P', TI.plate(), 'I', TI.ingot() }); + addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.factory_advanced_hull), 8), new Object[] { "PIP", "I I", "PIP", 'P', ALLOY.plate(), 'I', ALLOY.ingot() }); addRecipeAuto(new ItemStack(ModItems.arc_electrode, 1), new Object[] { "C", "T", "C", 'C', GRAPHITE.ingot(), 'T', ModItems.bolt_tungsten }); addRecipeAuto(new ItemStack(ModItems.arc_electrode_desh, 1), new Object[] { "C", "T", "C", 'C', DESH.dust(), 'T', ModItems.arc_electrode }); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 615c78c47..96b928b48 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -939,6 +939,10 @@ public class MainRegistry { ignoreMappings.add("hbm:item.factory_core_advanced"); ignoreMappings.add("hbm:tile.factory_titanium_core"); ignoreMappings.add("hbm:tile.factory_advanced_core"); + ignoreMappings.add("hbm:tile.factory_titanium_conductor"); + ignoreMappings.add("hbm:tile.factory_advanced_conductor"); + ignoreMappings.add("hbm:tile.factory_titanium_furnace"); + ignoreMappings.add("hbm:tile.factory_advanced_furnace"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/NEIConfig.java b/src/main/java/com/hbm/main/NEIConfig.java index 44e9aed37..ba4c7f9bf 100644 --- a/src/main/java/com/hbm/main/NEIConfig.java +++ b/src/main/java/com/hbm/main/NEIConfig.java @@ -68,6 +68,12 @@ public class NEIConfig implements IConfigureNEI { API.registerUsageHandler(new FuelPoolHandler()); API.registerRecipeHandler(new RadiolysisRecipeHandler()); API.registerUsageHandler(new RadiolysisRecipeHandler()); + API.registerRecipeHandler(new CrucibleSmeltingHandler()); + API.registerUsageHandler(new CrucibleSmeltingHandler()); + API.registerRecipeHandler(new CrucibleAlloyingHandler()); + API.registerUsageHandler(new CrucibleAlloyingHandler()); + API.registerRecipeHandler(new CrucibleCastingHandler()); + API.registerUsageHandler(new CrucibleCastingHandler()); //universal boyes API.registerRecipeHandler(new ZirnoxRecipeHandler()); diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderSawblade.java b/src/main/java/com/hbm/render/entity/projectile/RenderSawblade.java new file mode 100644 index 000000000..b12cb4594 --- /dev/null +++ b/src/main/java/com/hbm/render/entity/projectile/RenderSawblade.java @@ -0,0 +1,47 @@ +package com.hbm.render.entity.projectile; + +import org.lwjgl.opengl.GL11; + +import com.hbm.main.ResourceManager; + +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderSawblade extends Render { + + @Override + public void doRender(Entity cog, double x, double y, double z, float f0, float f1) { + + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + + int orientation = cog.getDataWatcher().getWatchableObjectInt(10); + switch(orientation % 6) { + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + } + + GL11.glTranslated(0, 0, -1); + + + if(orientation < 6) { + GL11.glRotated(System.currentTimeMillis() % (360 * 5) / 3D, 0.0D, 0.0D, -1.0D); + } + + GL11.glTranslated(0, -1.375, 0); + + this.bindEntityTexture(cog); + ResourceManager.sawmill.renderPart("Blade"); + + GL11.glPopMatrix(); + + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + return ResourceManager.sawmill_tex; + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderAssembler.java b/src/main/java/com/hbm/render/tileentity/RenderAssembler.java index 940bf6431..b03698a8b 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderAssembler.java +++ b/src/main/java/com/hbm/render/tileentity/RenderAssembler.java @@ -3,26 +3,18 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; import com.hbm.inventory.recipes.AssemblerRecipes; -import com.hbm.lib.RefStrings; import com.hbm.main.ResourceManager; import com.hbm.render.util.RenderDecoItem; -import com.hbm.render.util.RenderItemStack; import com.hbm.tileentity.machine.TileEntityMachineAssembler; -import com.hbm.tileentity.machine.TileEntityMachinePress; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.AdvancedModelLoader; -import net.minecraftforge.client.model.IModelCustom; public class RenderAssembler extends TileEntitySpecialRenderer { @@ -93,6 +85,7 @@ public class RenderAssembler extends TileEntitySpecialRenderer { } GL11.glPopMatrix(); + RenderHelper.enableStandardItemLighting(); renderSlider(tileEntity, x, y, z, f); } diff --git a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java index 7f3de13af..0976d9c12 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java @@ -43,6 +43,7 @@ public class RenderFoundry extends TileEntitySpecialRenderer { } GL11.glPopMatrix(); RenderHelper.enableStandardItemLighting(); + GL11.glEnable(GL11.GL_ALPHA_TEST); } private void drawBlock(ItemStack stack, IRenderFoundry foundry) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index 76412caa9..1b78d8e21 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -190,6 +190,38 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro this.heat = nbt.getInteger("heat"); } + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + int[] rec = nbt.getIntArray("rec"); + for(int i = 0; i < rec.length / 2; i++) { + recipeStack.add(new MaterialStack(Mats.matById.get(rec[i * 2]), rec[i * 2 + 1])); + } + + int[] was = nbt.getIntArray("was"); + for(int i = 0; i < was.length / 2; i++) { + wasteStack.add(new MaterialStack(Mats.matById.get(was[i * 2]), was[i * 2 + 1])); + } + + this.progress = nbt.getInteger("progress"); + this.heat = nbt.getInteger("heat"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + int[] rec = new int[recipeStack.size() * 2]; + int[] was = new int[wasteStack.size() * 2]; + for(int i = 0; i < recipeStack.size(); i++) { MaterialStack sta = recipeStack.get(i); rec[i * 2] = sta.material.id; rec[i * 2 + 1] = sta.amount; } + for(int i = 0; i < wasteStack.size(); i++) { MaterialStack sta = wasteStack.get(i); was[i * 2] = sta.material.id; was[i * 2 + 1] = sta.amount; } + nbt.setIntArray("rec", rec); + nbt.setIntArray("was", was); + nbt.setInteger("progress", progress); + nbt.setInteger("heat", heat); + } + protected void tryPullHeat() { TileEntity con = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java index 51c2c47e3..fc6dd4727 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java @@ -3,6 +3,7 @@ package com.hbm.tileentity.machine; import java.util.List; import com.hbm.blocks.BlockDummyable; +import com.hbm.entity.projectile.EntitySawblade; import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; import com.hbm.tileentity.INBTPacketReceiver; @@ -104,6 +105,17 @@ public class TileEntitySawmill extends TileEntityMachineBase { if(overspeed > 300) { this.hasBlade = false; this.worldObj.newExplosion(null, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 5F, false, false); + + int orientation = this.getBlockMetadata() - BlockDummyable.offset; + ForgeDirection dir = ForgeDirection.getOrientation(orientation); + EntitySawblade cog = new EntitySawblade(worldObj, xCoord + 0.5 + dir.offsetX, yCoord + 1, zCoord + 0.5 + dir.offsetZ).setOrientation(orientation); + ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); + + cog.motionX = rot.offsetX; + cog.motionY = 1; + cog.motionZ = rot.offsetZ; + worldObj.spawnEntityInWorld(cog); + this.markDirty(); } diff --git a/src/main/java/com/hbm/util/I18nUtil.java b/src/main/java/com/hbm/util/I18nUtil.java index 6476684a2..a4460f6d9 100644 --- a/src/main/java/com/hbm/util/I18nUtil.java +++ b/src/main/java/com/hbm/util/I18nUtil.java @@ -3,9 +3,12 @@ package com.hbm.util; import java.util.ArrayList; import java.util.List; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.resources.I18n; +@SideOnly(Side.CLIENT) public class I18nUtil { /** @@ -14,6 +17,7 @@ public class I18nUtil { * @param args * @return */ + @SideOnly(Side.CLIENT) public static String resolveKey(String s, Object... args) { return I18n.format(s, args); } @@ -24,6 +28,7 @@ public class I18nUtil { * @param args * @return */ + @SideOnly(Side.CLIENT) public static String[] resolveKeyArray(String s, Object... args) { return resolveKey(s, args).split("\\$"); } @@ -35,6 +40,7 @@ public class I18nUtil { * @param width * @return */ + @SideOnly(Side.CLIENT) public static List autoBreakWithParagraphs(FontRenderer fontRenderer, String text, int width) { String[] paragraphs = text.split("\\$"); @@ -54,6 +60,7 @@ public class I18nUtil { * @param width * @return */ + @SideOnly(Side.CLIENT) public static List autoBreak(FontRenderer fontRenderer, String text, int width) { List lines = new ArrayList(); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 6c2967c35..255ebd870 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -314,6 +314,7 @@ container.launchTable=Große Startrampe container.machineBoiler=Dampfkessel container.machineCMB=CMB-Stahl Hochofen container.machineCoal=Verbrennungsgenerator +container.machineCrucible=Schmelztiegel container.machineDiesel=Dieselgenerator container.machineElectricBoiler=Elektrischer Boiler container.machineFEL=FEL @@ -1302,6 +1303,7 @@ item.cotton_candy.name=Radioaktive Zuckerwatte item.crate_caller.name=Nachschub-Requester item.crowbar.name=Mk.V Kistenöffnungsapparat "Brechstange" item.crucible.name=Schmelztiegel +item.crucible_template.name=Schmelztiegelvorlage item.crystal_aluminium.name=Aluminiumkristalle item.crystal_beryllium.name=Berylliumkristalle item.crystal_charred.name=Verkohlter Kristall @@ -3332,11 +3334,11 @@ tile.emp_bomb.name=EMP-Ladung tile.factory_advanced_conductor.name=Fortgeschrittener Fabriksstromanschluss tile.factory_advanced_core.name=Fortgeschrittene Fabrikkernkomponente tile.factory_advanced_furnace.name=Fortgeschrittene Fabrikzugriffsluke -tile.factory_advanced_hull.name=Fortgeschrittene Fabrikshülle +tile.factory_advanced_hull.name=Fabrikblock tile.factory_titanium_conductor.name=Einfacher Fabriksstromanschluss tile.factory_titanium_core.name=Einfache Fabrikkernkomponente tile.factory_titanium_furnace.name=Einfache Fabrikzugriffsluke -tile.factory_titanium_hull.name=Einfache Fabrikshülle +tile.factory_titanium_hull.name=Fabrikblock tile.fallout.name=Fallout tile.fence_metal.name=Maschendrahtzaun tile.fire_digamma.name=Verweilendes Digamma diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 07b6a32ec..57ab1c9c6 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -314,17 +314,6 @@ book.starter.page18=vær is just a guy who has been trapped in the grey void fea #book.rbmk.title16=Meltdown #book.rbmk.page16=§4§lAvoid. -book.lore.office0.title=Letter of Resignation -book.lore.office0.author=Kosma -book.lore.office0.page1=Management downsized our department again yesterday. Those idiots only have themselves to blame, I don't know what they were expecting after the Panay fiasco. Who the hell leaks that sort of information? We're losing millions and -book.lore.office0.page2=it's ME who's the one out of a job now. I'M the one being asked to resign. I hope you asshats finally learn from your overabundance of mistakes and take that stick out of your ass. -book.lore.office0.page3=I'm not coming back on Friday. Just send the paycheck. - -book.lore.office1.title=Note -book.lore.office1.author=Jonas -book.lore.office1.page1= -book.lore.office2.page2= - cannery.f1=[ Press F1 for help ] cannery.centrifuge=Gas Centrifuge @@ -515,6 +504,7 @@ container.launchTable=Large Launch Pad container.machineBoiler=Boiler container.machineCMB=CMB Steel Furnace container.machineCoal=Combustion Generator +container.machineCrucible=Crucible container.machineDiesel=Diesel Generator container.machineElectricBoiler=Electric Boiler container.machineFEL=FEL @@ -1560,6 +1550,7 @@ item.cotton_candy.name=Radioactive Cotton Candy item.crate_caller.name=Supply Drop Requester item.crowbar.name=Mk.V Crate Opening Device "Crowbar" item.crucible.name=Crucible +item.crucible_template.name=Crucible Template item.crystal_aluminium.name=Aluminium Crystals item.crystal_beryllium.name=Beryllium Crystals item.crystal_charred.name=Charred Crystal @@ -3781,11 +3772,11 @@ tile.emp_bomb.name=EMP Device tile.factory_advanced_conductor.name=Advanced Factory Electricity Port tile.factory_advanced_core.name=Advanced Factory Core Component tile.factory_advanced_furnace.name=Advanced Factory Access Hatch -tile.factory_advanced_hull.name=Advanced Factory Casing +tile.factory_advanced_hull.name=Factory Block tile.factory_titanium_conductor.name=Basic Factory Electricity Port tile.factory_titanium_core.name=Basic Factory Core Component tile.factory_titanium_furnace.name=Basic Factory Access Hatch -tile.factory_titanium_hull.name=Basic Factory Casing +tile.factory_titanium_hull.name=Factory Block tile.fallout.name=Fallout tile.fence_metal.name=Chainlink Fence tile.fire_digamma.name=Lingering Digamma diff --git a/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible.png b/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible.png new file mode 100644 index 0000000000000000000000000000000000000000..a229235655dd496e11b1cf723292f5957f640d4e GIT binary patch literal 965 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%N?Bp530R%N1DIE+9%r%}a zjv*Cu-rfn!TWlc08W6m3Rf_aYkEMT(-}T=%F)i{-a#ZP*LsJC#%=Q#7;m~w?_Vnr< zhLv}CHF;k;P7nJ2L+(o2x@p&+pJF`_v$Kq`+GL4I&0f9vw{MvqlqmknDJQ*Z<(5-1 zy6boMn0!22E6QsWe)_ddM56YYtDk|~gseO)i1Juc{1Ue3HbytgLEZ_{}!)^OGU zsH*rWQ^LBK-3_v{b}=

-qcaIak8Wx+RT=fB&wYn)D!k*I`9f^_oEat=tT+1Q`To zFf<%sVPLtYFZ2wX)f(YoA%(VRA@dVqg-6o2JH~V8F=G$jQLr!+>2%H;(^7iPh52 zKlkjIaP8R5*Bhgx+jkwC7V&R=>cO=koB3+}UM56-c(jJY#L%x>`|6e}^KHLd3Y|wX z*W_8*?yGu@4lEAMEezR$481~3YZjh3-%uU)*=5h&yt9ApnSMXwVqhv}{m{L2f8+ms zk3PITzj-H9#+1qPO*tCaEPqCJGi3AtIS6NNR=VJ}<=Xtc-z=rHnS6VUpC`twJiqVR z#%(vA>xZ#uo$qoGetaf&Wm@*}TUqlf`H-E1-J1xbp@Fl8L*z}w+Fs|_?r@f-tr3DN zY__9^TB)mjoyA2)7LZJW}z{`%A6=-p}($?NP6 zCOex>4V$_8Y3cNdYWsGwE^vI7RT<3BXgc-TjMY!S?kr+72wxX_fN$@TFL!U)?3CW3 xXrB{#OqXGHB2wbBe!>MxI-oQ^1VDrDZ-zA|l5bskX!Ql;Tu)a&mvv4FO#lNqO)CHZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible_smelting.png b/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_crucible_smelting.png new file mode 100644 index 0000000000000000000000000000000000000000..cd06a8101569e193ddd3e45342a6e085d93b2235 GIT binary patch literal 947 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%N?Bp530R%N1DIE+9%vqi; zjv*Cu-rfn!dTb!Tmay|j$VtZiRsix@wwh}qpBcUJRk{QA$&HL)h-up8WaqwdYn7H8-`wUztD1#hqW+_T@;@!Xn_-?!$mSi{{5 zNJjGAz0K%QJgx5YX6A_Wn1};E|NhJ5Y;*Y*o<-Yqb_@Y~ufhCRoL-*SKjsNcz{`mI%<{Jj7r;pOPnHD(e)ooK^kb3+m z-5cmxsG+-lOK!OCX}Z?;)63Gii(lp`U6{6Qj$MkHh z-MGOND7pUn&(9IN)gl&!&wo(nsH?U1((0$Y&s$wzopr0NbHI^8f$< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_foundry.png b/src/main/resources/assets/hbm/textures/gui/nei/gui_nei_foundry.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d7bf72d8e5a040e4919cbfdfa1a63a4f6d0a35 GIT binary patch literal 5796 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 o>99N*;~3 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 Gqy7&KiNS6F literal 11227 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 XdpU%(Q53kX3%RYKr(UjR6ZO9UrOz0f diff --git a/src/main/resources/assets/hbm/textures/models/machines/crucible_heat.png b/src/main/resources/assets/hbm/textures/models/machines/crucible_heat.png index 19eec23648ca40ee6c168eb94a1b6a374464cba2..b467ac3bf88fe266258ae4c872c9fa1b3ce8a85f 100644 GIT binary patch delta 4820 zcmV;_5-aW0CEO*DG=GyxL_t(|oaLQcj3e1u$A9NiRlcFpr9y91{AcJ5p1-}Eth3y zGc!He>2|l>ZM$yg@NlZim$s+fF1x)G{!(i^cKvPFSKs;0_kaECoX>(0Jag@;eR3_J z9mYJqwZ@BkJ=#Ydq!h(5)`FA@YYZ#3D(!9uG5SUs>ecF8`M-R511X^HdmQw_;<#=U z^KvWY-RmA#HdeXUJ^~;~4O&U0ki2vd@zk1Mim%6g$#xjKgN;E;$vZa!4#R{-;L#3a zYM!POCp@~b%74whkVh*LUrX+_yKGbgUf*x?mh}dYZZ!B_E14_bSi`G(ZBk=V0~cYh z(}SQvpcUWw-@8MvNkB?TWOQl195t3PmX)Ay$0$xY43i;4cH*Qs##l>gEP+xyvRVh= zE$a;c!X#Y?f3MS{5qLx2d$U$SDR+{CC+lm889B!?{C{H})~MIGok$`hx!(*C5+2=f zC!nR|)!hTGUb$GftdxScZLAirZ`G?D^g?=ZLXw)f^S^n!2_oQ?gAgSZU~oQQs8J5Br4+vB z;rs3?rGKfxVzI_zt>wDFy9zdl7b+8e(w zfC{s#owzHnq(mv@26rmxg(1H07hE9)Qb_9c8bV04Qf^3_6ksa8K#-)V8BBI)8qPD0VYir4kTD@u~PqO02b{Y09g+2S9&@%-<(TQ=||sRCpe7 z98;}UNRyN#amF^r4RxNpNQ@zlT>y^anA8|Ntx-z3=c1S( z@JZ9uc?1F}`raX>EX}`q!L~GrTf7yF@T4S<{WQ-}z zKV~osM2TU)8x=%rE!9fJd4hB&VzQHuq8PF_j^Y?0g!2|_-KZq!CYlY2bx->P! zag6VI^uiEh3`)5nq?IBy#szOFu~3>1uvM$_=tcvZg@(ZQG1g{Y2^L#ih%`;zObztH z5Un+FoD{|?%Rd&w4m(}0U0yBz|9?-(a%0BLW{5E^@UGOV9A!hvSnDPaK;YtE94B~M z6DNuDV9z6rB0Q~!gLn!4F%J_`@>;XaZl?<@KW03=5wJzXIT6wBc8aT?8&_qsu)rm{ z`H%{HzZhCk91}(nLWQ#QYd%#9Dpxrb4&2xW0NjfX=*-w4K zCb(hl5@QcvD8BOC^Cxmo!hhI2Y)}tdcFf2{zSsAsFNs>M7RDGil%ym{Qd+I~)SxHo zVatvgy=-{q<=WIIHZrNq3n%JfNxkaEuW(~N{{oZ7d?g6n>#CoQl;ayNHfjV~aqI5E zR43JLw@Vl4mj0|GKv=K>#4&>%b-Oq{Ok{ePUlh;2?-hEM5CYH3lz)ZPptLG7_(45O zd%6_=rB^w%D^f$tZeog~Q+_mAHF4w5uw zy%H49W$JYCZ;r7MaYzr#63R5`=PSPFp|nCNMK25yqW_+GewCL*W%)yTScZI37{qBO zl_BoPqy)~xM*meUNe@#>6<5qyOBBUaDgkjO(P*WH^eiDnY5vtK7kTm4j?=@s5r6U5&rOxMhG{~l z+btB-KxzK!YkzmD#C0^_!JJX+Zp14|Lk4+%cVCp>V&8~+{gLx#bFg_1^ z==88Z|OJk1dSu*ny&-aRx&h@Za`QY@h zFijB{KJZKLwX-I!({S^|by6O7%wWg#u$Ap0JxeP!q&L-v~97cbDNm7(l)M^zs6HdX;PtYG&^!ECG8!Gjo#5MVyr;5kE zce=#Y{@%}@n7HORA%;0UEMJoq_9V@w4&8&v6sc3kAL`s_J6srf1|Xj3a5x+^U}kPIvrPmxr5Mp zdv1Ez$3Of*3ocmaK|X(OUU+s)mjC&2G3>pY6%u0r&CO=Whtv^TNh%f1S|wojsGGg+ za-^p>+zD=P*12(Om&fXBB-<6(ev+Hbkf&BX$M-aA6>mDeF`(dPE94~@(!=%#zU%7h zDu1i1t8#$c};xLL_`LK^jKO(;O6&VQ|*0pZa;bO~sqD!G2Ag^&`{jSvFp&6hvA zKJ2XUEZEP381%BSG3?rTu3f4^(Ec6qh% zjvVvkC&uvD<{GUq;v-j9_{%rOPyLI;py7@gERQ9%$lW5luu|i@uivB9i}448bJWKA@e_P?2}rXtwm;`d>R)PXqsW1@5uzW10BaSZXAnp% zhSj>_2Zud4Ot2Pi$1%n%mVZ{rYk$Yl$Hxrzj#bTOZQv%sx?jYUo6V4G7u;@*C^ar$ zT3ss+y}1|iSj8@sKi#d|`Czalnpk{q)+)T#Y;$FOg~(r<)+(g!F35mRobXz+ zU7W;0FJvvN@`Vi8tOX0@pCv}iBA9TS?M~~Ey>5?IFJiM+;a=+qCEXJ6m4Aw+)r(lK zRfy80I9cectBd5H6~-AWdwv+tT)R5xh6tP8l)zB0RypcAB{tuSGl;?07sbDwRR@D5 z(O{EzaxQ9LL@aH%G zdtvGSR59$$R!ffZzw_fgUVpj01He0f=Hg6-m=;sTu>6+%N}%z*;aU*jcI${RO3Rxuo3tzuJmDT?2H$G?wWumKFl?TX7mZvv@A(`p7zB)di z(_i}Zuh>)dacJlh`ao0`%KySAKVS#>fBKK#8hc`8WvWTgZ}ymV68}LcBQs4j*tg6o ztgRk@B@+?8Wq^$_uYWV}`V#q*P*$dz1ih$RRLe$LnQ9Uq?9&f1%F0xepqJg&V3D}f zI%Fl#Lo(6!YJEs%I=@n-9fo6Nrg6|0E?*)^Q<5ac_uK}ld?!Y}fH#Wc;&y(%K_QOa ziW}eamdc-m>vs>pukjxT5f;sU*CKp(tFK`LIt2{@FqPWP3iWSb;dU`1Y%jQo)+17m%4OVt9(6afH z@a5|_7NR!lW%uJM%Rg(#W$z^_%Rg(#W%t&ZM{l09gj{xSowEG1hRjP6U}!H9Q0xT) zhV}wUA&&LdSr-4SA(!1-r!4=hp=a4klV{;<(HOCohYne+oi zH;HHZ{Lvk4XMvgZu&Vavwq>Q=ZgcM9Y;ksIO;z*M!xjZSORwog z%ucg>{w&=B%3@|cY~E0+T(9c0!pwTuyfJS*Y*Cn551Y5mMu%BhJ#0~!Sr3~x7NLhN z0&>>gIDhlTti5^88Z+x*^TxdOuti~JJ#60if1!uX6+i8I*aE)DPrn{EPdqGon4Yy) z^dc}zuj(A{d*A!)V5(s=&xB#aT5F5f250z9YSW+!`}b?_kY{9wKZON;RSL1b04+P?X)`v0c zFa>Vt-@Dfw>~h1ef8}4r$3FHk+itf{^fWnZfBAW1*8cY3yz{HS`HOaEr%7tukK zLVwUb>|`x9r!?5CdRQlp=JvB+=PquS(!=t}A~(W+{`-&E-rjIGOWd@Jl+J9o@9w!& z1;JCl@C0F}i{KOnE3-apbNfQ^GhA9LY}Tz8+>pwP=|MFlM`}zFm&&XU%TH9x{=Z5H zRvL9Sw(8E%S(nbk{VtC^?mBfwoi4sscz;SFg){mzY05*tK1@oP@kFt-$*n4c@7?%5 z7cXvRJrM;vJ52!I`Sj!5@AUwju}+cC{ZyL`p%}3TZUzT)J|Oz57QPT$=I5y(VjGEBxeMGh=N{qI2KR39Pf;6?+tS2~Zc6s~T--42Y#zu|Qx-oe1$~n3R zy<>)$I;|+%D|*@d+?&k6aN4=MhmuXC5L~*nN%ydW&5m&^e~u%cXihZPsDB=I*1e|7 z@{2zqu)=b*-{Y-MJW@0^+BjDqd*a(y&e7T%?w&rC!OH%2+Oqk@$pUZO+sEG9CpB&c zy>xk#s58FN$S88dpLpD|*LRiW=fV2PKmJ>h8%}2deVV&lmo9Dcp)a{k1=Dz#`1B`# z%|6WgCBOFk3j*LXpZQE7(M=fB{}DbIP;#^UZFGjM*Xw-oi(i~hab5O)$9e6S+~4mv uUCw9Dd^R2R9GRC|*>QV&d(+qofd2ylq6vG3c*nH>00000VCDbL5G=GapL_t(|oaLQsk0V)m$A9NiRlc*iTo_4$J_73?=t?{_(Z`XP1InQ~{zkkkoEI5JZZ(O(UT?=T3 zF;8x-@q_&y?c)woisBq=K}v-+hLu{CcDI8#`9T@#)#_aNzkPKBDWL9q9QMNEylxcp zYAfZ}*FCOntg_oa1|UfdT1ljkymA=v{x!c8Uyr-Ub{M;pjX_Jv`!)iO!h}ZP(GFv3 zo~9EgJif8Y?SK7{$14(FOLp5`HmU({9<+JKdV|L|8vLl0%$0Af;r0DCsj;Ymo3P*M zLC_%3itqpL{h?zLkWvyEU79aX8p{~VO3=4s6sH`8$&evCaZ;RPtR*#;Kq($utpo6m z^#%Z8k}ib5-|5i^yrJvftW{9THFB`AzLuC1Z7jnd@qe&Jy~f={5*f*ZW{8mR_=anM zmXg=^4!M5qa^bR43f{G`S{&c1S2^s3^x}jhHFM{G=WY{3z-xygN-DtMe85nz3jXze z8;ikO5CQ~XF@T}!D{kIDEX5xQ9nasmZf{&!BTQ115Zu%o7-LA26d?uOZV#mtzUSfl z?k=UN!GB`0#$v7I-p&p``}rFPA&^pFEj;zEce1^GaVmbCBnTnUO0n7A#~ScGMPdx? z)e9#t`CKtJhP}~j1Mbe6)R3kr##%h7s8y>ZiR&W9T1;xN)?%@w*|`Y8O1%!k^?j_x zSc{Z$D!!C1Ql!T4^hUrN%{D7q^J+7sMe985GLx|a6Mt(gKorM#T9X=sk`gHdQfriu ztgO@!2oM5m-SKJp;EXkhqcA~ALA%{vgdL{FScBz3cdZhj!t8D*?#?SIQA)YaoeFwk zi0}IaS4e>rl6t*{5E8AF>(V9#n2IkDBx&lpW#(;-z=K}M=Jq9&lEpayWZv5gL)YDX z4}riK<9|F`h~fqaAxiPb8m!q3d2F@L-f3&-}%%SeBVQBjgk@}MA5A-Ufd#z z-H2AH1VmAMCccsqYb|M-^7`H(&>tc5&q>l0DTE6Zo<|(VRI3%zBqd3lv5j%v-3x-E zn_Fv3@ki1MfbB*VB?XBw#IXy&Q5=&RgQqo0DS!7~6cYqKX_`8ZKp;imJEWAQ`PZ*q z2B79?taaTuNz%eAJWtaLL!^{wt^4sW`wUNOOm>ruF{Sw<2D3nv7!JBoLA2IVtyG*R zNY@aPH9m@B$UZoVV}uaSTdZ}xt|WiAeauSW5?v{kOCX~NDJ4mgIHPA>I!O|YwOO}Q zsDJExq>@;iXO-rkG+3irI>^=YjYHXG^E)DXupzUR>kLyR#f<+_koiqsev zyrslKX+FSKt;*vY4Qv(~0^i42n|UQzY;hyfG<732&D68sSl z6H@XISLcD8}+5f41o2jkFO;Hitc1giq1SFN&ESor*#nrrEn9OYPEt=ia1V6^M6M@ zOt{H0z^yww%a0jSk{ZiyyIV9)DT(j-#7R=*QhB8C`kRtsZ{>wij8k|Zgu)_mrmr|MzLjv2kId*;)%sT+1;P?;A_ z)x(l{)%9QD`h0!?llpum2;6biPe;n}4VN1=0tQgUN~GoZIdVO0^Wr6v%me@G8{aIB zf9jdv2jJpL9h;5J;6j2ihJV2Ki|0v%cVZwX1 z>&P%AiXy6&3Q3Y+$>x{FjObZ1^AgYZibm&p*sOeTdRUmI2n-+otq<5)6W3|DdEz=L z4;wMqh#t1GJ)~!8rH1sZD9RpxWjR%?S|yH?LO%jZ@rU#<;eWBY-A`N(zTQthy-%Jk zaUJAVKQ)@TP94LbydKtU9w3Fp*#3i1V=WgiY)!>~m>vc$@r>hy!K}%c6yNg;BZ+Jj z9vpr1>!?;M91U`_#5L!iG}PdGr>+l6(-b)nS9JDTO7~Pd&zbT&sFWf}5{^0@v{ocZ zijs<2t>Q+)DS!BR1O0(TZ*Ly7p;8}8T!Ux(iL3R_mbliQJ3VpDaY_txdRV?DEAaiy zt*5_(e&Ex2uvY|nV=dK6Ff?^J%>&{%aeA2Q>tT0#hEA)^OW*po`22IvTC}3oYO$Zi zo@YMx5&Pn|zFk^Xg)_vkdFf%tosOGcA zxES_<%?gPzfaZ2Hjbyt5+wbLe zGvxiNp5uF(wTd?#-xyGEyA|>Z4C!G91J}B`y2|S6>fGe#aR$m?zc6Vo`Ln&gs%ec+ zYAtu0{ePjl=4q4^9CRZLu8Zz%0;A$8j4{}2hi+6dosdR7TN4UU zsdJ}iKzOu|TmsstN^ah3A*94~BZL5Y^W~phAAfdUcmeDeKn!}>*cf)>${O7$rs{j# z+Us%S${JEgT4BVcdWBA$uvT$P!++8>+_<`0ct?(T@)KitVsnjF81cK;R`}bu#t;3A z#Gv6u43@`|TI3#)U0SK}!#8(n^&BM1Q3W&Y=_15#_Vwa6@#Pvg=8 zO@A|t+(<7xEDr-%ulT&)Y?D?czdY)ogkZJe)6J$azS4wA3MlTkk6Eu(*gNjBRt;!& z!-ezD15?MaH$%ajy$B;bR)pxsAi!FM=othOi($2{_~}s(juNbeyK#&$i{+me^10*5 z*CPgd&#Gp#Ht>*O-7jLw?Pkc0OK!JDlz$qRFRiW>r{3NVd7@$$%Af90?tCyfC7L+- z-mF!4quJ)#`U-arj@a+?*sN7Z+g*?WojBo*X1i#_VJ~DYo8=1`uvrTh%0Ew>oEE`^ z$87gnN9=cdw0aSnwFUXjekNG$^YWF zZcb&jzx>Qc?4V3^eXH^inaT3>Mld8Z{mIwH=X3hYpZy(sraBG{eM%jO%0l^H{Pc(I zApbA^`MYBqR#v8(1pRi8S*P(IhB7kKM1y_Ttisyr=#flB_^tsq#vEth_!9Y(P*$dz z1ih$7RLe$LnQ9Uq?$eJj%74mKlc1Mf)?ksi*E(V)&_goO_G*1dX1cgir5%Q2Wu|e^ zm#$tRNmG&}#`oL?seC6!zJNE1C2TK?(vJwVfJ#|R-I?tfOjIyrOE<@W+Dmp=(*WvYn=3xehDC4VZ*pMkQV$SvG$X%F0v|4TfN;dx^^OCt*=jF1hU5I%W9}Ls^+=9CW^+vs$UR%>`LGt2{@F zqPWP3iWSb;dU`1Y%YWuiLfO)N6Ae~&FVM32lkkSfpCD$74_$Yt*(D$74_ z$Ys~onMZA&^MqV>ZJo0G^M=f)B*4&KBB0m{1Ptv3l0uBs)>#(+ydjreTc<4lyrE~= zOO)>g@`b_=oL2;De0J>Vez(y&OCohYne+oiH;HHZ{y0AW6@S$;>tR*x&27s{yWQr( z<=OTkoi}FI!?f=%yzBzD!A({3)Wa49Jxi_WMT}0feE%%f0?J}$J#5}ks$8w=^TNz} z*t{`sJ#0~!Sr41H%}#c+vU=E}FtZ*uZ!AI&TLk2+wQ=T+S!?s0H)htu=8bvlVT;1d zdf2@2|3VL&D}R2~^{@q8$gjR0Hcvb%dYGQIR`en;ORef0AN=44?O>{5GtY!!!&+;L zV}m39_rCYNsYWtAOKqJfjwi}Fv*N7ZpV#Kev9`80lJZRQ!2H2We(qV)q?z@wd54f$ z^{@|p=tFjGZH<>-ep%f7(~n!|SCi5*tHYR8m;%@JcYk-AgH>+$)K~vqeBu+IuTJcABKd{WzYrqq8>wE{8j@SM%Tg?Dy=nURGKUn`e=r zGJ2Sj&Z}xGH5%(xq!7iDfI+dK)$H)jC$Bo?LkPM@ovfthlm?qs59`Fy+(uRik^LL0`SM2LJ=R)Y`QcCK9d}vZs-vVEA(aHJoVQwQi;4ZI23vNm>9YJmuW(tsd)?Tm zvVXn3!Rls>t5-MK+1aQ0;Fx>&_Bq_|kPgh-%^Ak|M}B=+F~!Mdq2R)wk`gHeVJoE3 zsB`7o1@<2tV{mE4Tf0rx)>ioCZZl(TP32*a{Q9umU|I^?4}i+T>vndU?EUh9%U3q( z9d}8sMF~+147qdWo;uYi8O1SDx}WiqN`IlGpw|oWv>vJ!p65ULFOudB$e&g(i=P`@ zNKldgx(4BVf@1tZB zDFj!pY|=gIV6$`F%AZl>1I?)hJE@1AcdhBN{Nhgttgsv(^myk}j}?WDHZIi1Hh+Bk z+67ws!`0KLGFaK)PFps=Xe{v7?g4i9fYi7V^vcyuqR#k2BPWp?{?zl9y}qj~KM&UL z{qw&Ux#4sc(5HF2b>+$?AN{hcR4|Q)iO+uellD>GFZs=vUKRkK``qUWiN=`zkMO~O zlAGmkCr8+Nz0Q}u^rh((*JbZ_oHEyb$%BJ_(dB&P%tzCco+I