From 6b381821b881df96bc5950651cb577d193085cf1 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 14 Aug 2023 16:40:14 +0200 Subject: [PATCH 01/14] FENSU and DFC fixes --- .../machine/TileEntityCoreEmitter.java | 3 ++ .../storage/TileEntityMachineFENSU.java | 26 ++++++++++++++++++ .../gui/processing/gui_catalytic_reformer.png | Bin 5357 -> 5356 bytes .../hbm/textures/gui/reactors/gui_pwr.png | Bin 0 -> 5843 bytes 4 files changed, 29 insertions(+) create mode 100644 src/main/resources/assets/hbm/textures/gui/reactors/gui_pwr.png diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java index 95b972949..3f0f6bba4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java @@ -43,6 +43,7 @@ public class TileEntityCoreEmitter extends TileEntityMachineBase implements IEne public boolean isOn; public FluidTank tank; public long prev; + public static long maxJoules = Long.MAX_VALUE / 100_000; public static final int range = 50; @@ -98,6 +99,8 @@ public class TileEntityCoreEmitter extends TileEntityMachineBase implements IEne ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()); for(int i = 1; i <= range; i++) { + if(out > maxJoules) out = maxJoules; + beam = i; int x = xCoord + dir.offsetX * i; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java index b936d41b8..eea2287d6 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java @@ -146,4 +146,30 @@ public class TileEntityMachineFENSU extends TileEntityMachineBattery { public double getMaxRenderDistanceSquared() { return 65536.0D; } + + @Override + public long transferPower(long power) { + + long overshoot = 0; + + // if power exceeds our transfer limit, truncate + if(power > maxTransfer) { + overshoot += power - maxTransfer; + power = maxTransfer; + } + + // this check is in essence the same as the default implementation, but re-arranged to never overflow the int64 range + // if the remaining power exceeds the power cap, truncate again + long freespace = this.getMaxPower() - this.getPower(); + + if(freespace < power) { + overshoot += power - freespace; + power = freespace; + } + + // what remains is sure to not exceed the transfer limit and the power cap (and therefore the int64 range) + this.setPower(this.getPower() + power); + + return overshoot; + } } diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_catalytic_reformer.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_catalytic_reformer.png index 27b5d21fd3b8d4301307a7b7994b6e6a11551891..077d004fd381c2d6147f8d9563c16b672e1bf44c 100644 GIT binary patch literal 5356 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 F{|~=%;=%v` literal 5357 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 Date: Mon, 14 Aug 2023 20:11:26 +0200 Subject: [PATCH 02/14] block drop fix for fallout effects --- changelog | 2 +- src/main/java/com/hbm/entity/effect/EntityFalloutRain.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/changelog b/changelog index 29e0ddd73..61558946a 100644 --- a/changelog +++ b/changelog @@ -27,7 +27,7 @@ * Removed the special nuclear meteorite ## Fixed -* Fixed thermos craching config hitting before the config is saved, resulting in an empty config the first time the server is launched +* Fixed thermos crashing config hitting before the config is saved, resulting in an empty config the first time the server is launched * Fixed heating oven not visually connecting to exhaust pipes * Fixed loot blocks not correctly rendering items that require multiple render passes * Fixed special meteorites spawning in worldgen diff --git a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java index 079e2ab2c..51ee981cb 100644 --- a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java +++ b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java @@ -179,6 +179,7 @@ public class EntityFalloutRain extends Entity { hardness = worldObj.getBlock(x, y + i, z).getBlockHardness(worldObj, x, y + i, z); if(hardness <= Blocks.stonebrick.getExplosionResistance(null) && hardness >= 0) { EntityFallingBlock entityfallingblock = new EntityFallingBlock(worldObj, x + 0.5D, y + 0.5D + i, z + 0.5D, worldObj.getBlock(x, y + i, z), worldObj.getBlockMetadata(x, y + i, z)); + entityfallingblock.field_145813_c = false; //turn off block drops because block dropping was coded by a mule with dementia worldObj.spawnEntityInWorld(entityfallingblock); } } From 3c6e7920b5d8d70e07d11472eaad91b9944072e7 Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 15 Aug 2023 20:42:48 +0200 Subject: [PATCH 03/14] PWR preparation --- src/main/java/com/hbm/blocks/ModBlocks.java | 34 ++++ .../hbm/blocks/machine/BlockHadronCoil.java | 2 +- .../java/com/hbm/blocks/machine/BlockPWR.java | 52 ++++++ .../blocks/machine/MachinePWRController.java | 157 ++++++++++++++++++ .../com/hbm/render/block/ct/CTContext.java | 2 +- .../com/hbm/render/block/ct/IBlockCT.java | 3 +- .../hbm/render/block/ct/RenderBlocksCT.java | 53 ++++-- .../assets/hbm/textures/blocks/pwr_block.png | Bin 0 -> 333 bytes .../hbm/textures/blocks/pwr_block_ct.png | Bin 0 -> 842 bytes .../hbm/textures/blocks/pwr_block_ct_alt.png | Bin 0 -> 861 bytes .../assets/hbm/textures/blocks/pwr_casing.png | Bin 0 -> 589 bytes .../hbm/textures/blocks/pwr_casing_blank.png | Bin 0 -> 542 bytes .../hbm/textures/blocks/pwr_casing_port.png | Bin 0 -> 285 bytes .../textures/blocks/pwr_casing_port_ct.png | Bin 0 -> 898 bytes .../hbm/textures/blocks/pwr_channel_side.png | Bin 0 -> 171 bytes .../hbm/textures/blocks/pwr_channel_top.png | Bin 0 -> 176 bytes .../hbm/textures/blocks/pwr_concrete_flat.png | Bin 0 -> 520 bytes .../hbm/textures/blocks/pwr_control_side.png | Bin 0 -> 233 bytes .../hbm/textures/blocks/pwr_control_top.png | Bin 0 -> 259 bytes .../hbm/textures/blocks/pwr_controller.png | Bin 0 -> 550 bytes .../hbm/textures/blocks/pwr_fuel_side.png | Bin 0 -> 211 bytes .../hbm/textures/blocks/pwr_fuel_top.png | Bin 0 -> 253 bytes .../assets/hbm/textures/blocks/pwr_heatex.png | Bin 0 -> 373 bytes .../textures/blocks/pwr_neutron_source.png | Bin 0 -> 564 bytes .../assets/hbm/textures/blocks/pwr_port.png | Bin 0 -> 583 bytes .../hbm/textures/blocks/pwr_reflector.png | Bin 0 -> 490 bytes 26 files changed, 287 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/BlockPWR.java create mode 100644 src/main/java/com/hbm/blocks/machine/MachinePWRController.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_block.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_block_ct.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_block_ct_alt.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_casing.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_casing_blank.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_casing_port.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_casing_port_ct.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_channel_side.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_channel_top.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_concrete_flat.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_control_side.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_control_top.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_controller.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_fuel_side.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_fuel_top.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_heatex.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_neutron_source.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_port.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/pwr_reflector.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index fe480dde1..f5b447bcd 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -875,6 +875,17 @@ public class ModBlocks { public static Block cm_circuit; public static Block cm_port; public static Block custom_machine; + + public static Block pwr_fuel; + public static Block pwr_control; + public static Block pwr_channel; + public static Block pwr_heatex; + public static Block pwr_neutron_source; + public static Block pwr_reflector; + public static Block pwr_casing; + public static Block pwr_controller; + public static Block pwr_block; + public static Block pwr_port; public static Block reactor_element; public static Block reactor_control; @@ -2036,6 +2047,17 @@ public class ModBlocks { cm_port = new BlockCMPort(Material.iron, EnumCMMaterials.class, true, true).setBlockName("cm_port").setCreativeTab(MainRegistry.machineTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":cm_port"); custom_machine = new BlockCustomMachine().setBlockName("custom_machine").setCreativeTab(MainRegistry.machineTab).setLightLevel(1F).setHardness(5.0F).setResistance(10.0F); + pwr_fuel = new BlockPillar(Material.iron, RefStrings.MODID + ":pwr_fuel_top").setBlockName("pwr_fuel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_fuel_side"); + pwr_control = new BlockPillar(Material.iron, RefStrings.MODID + ":pwr_control_top").setBlockName("pwr_control").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_control_side"); + pwr_channel = new BlockPillar(Material.iron, RefStrings.MODID + ":pwr_channel_top").setBlockName("pwr_channel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_channel_side"); + pwr_heatex = new BlockGeneric(Material.iron).setBlockName("pwr_heatex").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_heatex"); + pwr_neutron_source = new BlockGeneric(Material.iron).setBlockName("pwr_neutron_source").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_neutron_source"); + pwr_reflector = new BlockGeneric(Material.iron).setBlockName("pwr_reflector").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_reflector"); + pwr_casing = new BlockGeneric(Material.iron).setBlockName("pwr_casing").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_casing"); + pwr_port = new BlockGeneric(Material.iron).setBlockName("pwr_port").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_port"); + pwr_controller = new MachinePWRController(Material.iron).setBlockName("pwr_controller").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_casing_blank"); + pwr_block = new BlockPWR(Material.iron).setBlockName("pwr_block").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":pwr_block"); + reactor_element = new BlockPillar(Material.iron, RefStrings.MODID + ":reactor_element_top", RefStrings.MODID + ":reactor_element_base").setBlockName("reactor_element").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":reactor_element_side"); reactor_control = new BlockPillar(Material.iron, RefStrings.MODID + ":reactor_control_top").setBlockName("reactor_control").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":reactor_control_side"); reactor_hatch = new ReactorHatch(Material.iron).setBlockName("reactor_hatch").setHardness(5.0F).setResistance(1000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":brick_concrete"); @@ -3366,6 +3388,18 @@ public class ModBlocks { register(cm_circuit); register(cm_port); + //PWR + GameRegistry.registerBlock(pwr_fuel, pwr_fuel.getUnlocalizedName()); + GameRegistry.registerBlock(pwr_control, pwr_control.getUnlocalizedName()); + GameRegistry.registerBlock(pwr_channel, pwr_channel.getUnlocalizedName()); + GameRegistry.registerBlock(pwr_heatex, pwr_heatex.getUnlocalizedName()); + GameRegistry.registerBlock(pwr_neutron_source, pwr_neutron_source.getUnlocalizedName()); + GameRegistry.registerBlock(pwr_reflector, pwr_reflector.getUnlocalizedName()); + GameRegistry.registerBlock(pwr_casing, pwr_casing.getUnlocalizedName()); + GameRegistry.registerBlock(pwr_port, pwr_port.getUnlocalizedName()); + GameRegistry.registerBlock(pwr_controller, pwr_controller.getUnlocalizedName()); + GameRegistry.registerBlock(pwr_block, pwr_block.getUnlocalizedName()); + //Multiblock Generators GameRegistry.registerBlock(reactor_element, reactor_element.getUnlocalizedName()); GameRegistry.registerBlock(reactor_control, reactor_control.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/BlockHadronCoil.java b/src/main/java/com/hbm/blocks/machine/BlockHadronCoil.java index 20bd9f35a..ae323e1bf 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockHadronCoil.java +++ b/src/main/java/com/hbm/blocks/machine/BlockHadronCoil.java @@ -47,7 +47,7 @@ public class BlockHadronCoil extends Block implements IBlockCT, ITooltipProvider } @Override - public boolean canConnect(IBlockAccess world, int x, int y, int z, IBlockCT block) { + public boolean canConnect(IBlockAccess world, int x, int y, int z, Block block) { return block instanceof BlockHadronCoil; } diff --git a/src/main/java/com/hbm/blocks/machine/BlockPWR.java b/src/main/java/com/hbm/blocks/machine/BlockPWR.java new file mode 100644 index 000000000..865cff4c6 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/BlockPWR.java @@ -0,0 +1,52 @@ +package com.hbm.blocks.machine; + +import com.hbm.blocks.ModBlocks; +import com.hbm.lib.RefStrings; +import com.hbm.render.block.ct.CT; +import com.hbm.render.block.ct.CTStitchReceiver; +import com.hbm.render.block.ct.IBlockCT; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +public class BlockPWR extends Block implements IBlockCT { + + @SideOnly(Side.CLIENT) protected IIcon iconPort; + + public BlockPWR(Material mat) { + super(mat); + } + + @Override + public int getRenderType() { + return CT.renderID; + } + + @SideOnly(Side.CLIENT) public CTStitchReceiver rec; + @SideOnly(Side.CLIENT) public CTStitchReceiver recPort; + + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + super.registerBlockIcons(reg); + this.iconPort = reg.registerIcon(RefStrings.MODID + ":pwr_casing_port"); + this.rec = IBlockCT.primeReceiver(reg, this.blockIcon.getIconName(), this.blockIcon); + this.recPort = IBlockCT.primeReceiver(reg, this.iconPort.getIconName(), this.iconPort); + } + + @Override + public IIcon[] getFragments(IBlockAccess world, int x, int y, int z) { + int meta = world.getBlockMetadata(x, y, z); + if(meta == 1) return recPort.fragCache; + return rec.fragCache; + } + + @Override + public boolean canConnect(IBlockAccess world, int x, int y, int z, Block block) { + return block == ModBlocks.pwr_block || block == ModBlocks.pwr_controller; + } +} diff --git a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java new file mode 100644 index 000000000..9eedb3d45 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java @@ -0,0 +1,157 @@ +package com.hbm.blocks.machine; + +import java.util.HashMap; +import java.util.Map.Entry; + +import com.hbm.blocks.ModBlocks; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.util.fauxpointtwelve.BlockPos; + +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class MachinePWRController extends BlockContainer { + + @SideOnly(Side.CLIENT) + private IIcon iconFront; + + public MachinePWRController(Material mat) { + super(mat); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return null; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconFront = iconRegister.registerIcon(RefStrings.MODID + ":pwr_controller"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) { + return metadata == 0 && side == 3 ? this.iconFront : (side == metadata ? this.iconFront : this.blockIcon); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + + if(i == 0) world.setBlockMetadataWithNotify(x, y, z, 2, 2); + if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 5, 2); + if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 3, 2); + if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 4, 2); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + + if(world.isRemote) { + return true; + } else if(!player.isSneaking()) { + + assemble(world, x, y, z); + + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + return true; + } else { + return false; + } + } + + private static HashMap assembly = new HashMap(); + private static HashMap fuelRods = new HashMap(); + private static boolean errored; + private static final int maxSize = 1024; + + public void assemble(World world, int x, int y, int z) { + assembly.clear(); + assembly.put(new BlockPos(x, y, z), this); + + ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)).getOpposite(); + x += dir.offsetX; + z += dir.offsetZ; + + errored = false; + floodFill(world, x, y, z); + + if(fuelRods.size() == 0) errored = true; + + if(!errored) { + for(Entry entry : assembly.entrySet()) { + + Block block = entry.getValue(); + + if(block != ModBlocks.pwr_controller) { + + if(block == ModBlocks.pwr_port) { + world.setBlock(entry.getKey().getX(), entry.getKey().getY(), entry.getKey().getZ(), ModBlocks.pwr_block, 1, 3); + } else { + world.setBlock(entry.getKey().getX(), entry.getKey().getY(), entry.getKey().getZ(), ModBlocks.pwr_block, 0, 3); + } + } + } + } + assembly.clear(); + } + + private void floodFill(World world, int x, int y, int z) { + + BlockPos pos = new BlockPos(x, y, z); + + if(assembly.containsKey(pos)) return; + if(assembly.size() >= maxSize) { + errored = true; + return; + } + + Block block = world.getBlock(x, y, z); + + if(isValidCasing(block)) { + assembly.put(pos, block); + return; + } + + if(isValidCore(block)) { + assembly.put(pos, block); + if(block == ModBlocks.pwr_fuel) fuelRods.put(pos, block); + floodFill(world, x + 1, y, z); + floodFill(world, x - 1, y, z); + floodFill(world, x, y + 1, z); + floodFill(world, x, y - 1, z); + floodFill(world, x, y, z + 1); + floodFill(world, x, y, z - 1); + return; + } + + errored = true; + } + + private boolean isValidCore(Block block) { + if(block == ModBlocks.pwr_fuel || block == ModBlocks.pwr_control || block == ModBlocks.pwr_channel || block == ModBlocks.pwr_heatex || block == ModBlocks.pwr_neutron_source) return true; + return false; + } + + private boolean isValidCasing(Block block) { + if(block == ModBlocks.pwr_casing || block == ModBlocks.pwr_reflector || block == ModBlocks.pwr_port) return true; + return false; + } +} diff --git a/src/main/java/com/hbm/render/block/ct/CTContext.java b/src/main/java/com/hbm/render/block/ct/CTContext.java index 30e1e9126..d028d2933 100644 --- a/src/main/java/com/hbm/render/block/ct/CTContext.java +++ b/src/main/java/com/hbm/render/block/ct/CTContext.java @@ -80,7 +80,7 @@ public class CTContext { int[] coord = dirs[j]; Block neighbor = world.getBlock(x + coord[0], y + coord[1], z + coord[2]); - if(neighbor instanceof IBlockCT && ((IBlockCT) neighbor).canConnect(world, x + coord[0], y + coord[1], z + coord[2], (IBlockCT)block)) { + if(((IBlockCT) block).canConnect(world, x + coord[0], y + coord[1], z + coord[2], neighbor)) { cons[j] = true; } } diff --git a/src/main/java/com/hbm/render/block/ct/IBlockCT.java b/src/main/java/com/hbm/render/block/ct/IBlockCT.java index 66bd967c0..c672784c0 100644 --- a/src/main/java/com/hbm/render/block/ct/IBlockCT.java +++ b/src/main/java/com/hbm/render/block/ct/IBlockCT.java @@ -1,5 +1,6 @@ package com.hbm.render.block.ct; +import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; @@ -8,7 +9,7 @@ public interface IBlockCT { public IIcon[] getFragments(IBlockAccess world, int x, int y, int z); - public default boolean canConnect(IBlockAccess world, int x, int y, int z, IBlockCT block) { + public default boolean canConnect(IBlockAccess world, int x, int y, int z, Block block) { return this == block; } diff --git a/src/main/java/com/hbm/render/block/ct/RenderBlocksCT.java b/src/main/java/com/hbm/render/block/ct/RenderBlocksCT.java index e59c4a6b5..bbd2655ee 100644 --- a/src/main/java/com/hbm/render/block/ct/RenderBlocksCT.java +++ b/src/main/java/com/hbm/render/block/ct/RenderBlocksCT.java @@ -37,7 +37,7 @@ public class RenderBlocksCT extends RenderBlocks { this.blockAccess = acc; } - private void initSideInfo() { + private void initSideInfo(int side) { if(!this.enableAO) return; @@ -49,15 +49,42 @@ public class RenderBlocksCT extends RenderBlocks { * it's only the color in ONE PARTICULAR SIDE. well thanks for that i think that's rather poggers, lex. */ - float red = (colorRedTopLeft + colorRedTopRight + colorRedBottomLeft + colorRedBottomRight) / 4F; + /*float red = (colorRedTopLeft + colorRedTopRight + colorRedBottomLeft + colorRedBottomRight) / 4F; float green = (colorGreenTopLeft + colorGreenTopRight + colorGreenBottomLeft + colorGreenBottomRight) / 4F; float blue = (colorBlueTopLeft + colorBlueTopRight + colorBlueBottomLeft + colorBlueBottomRight) / 4F; - int light = (brightnessTopLeft + brightnessTopRight + brightnessBottomLeft + brightnessBottomRight) / 4; + int light = (brightnessTopLeft + brightnessTopRight + brightnessBottomLeft + brightnessBottomRight) / 4;*/ - this.tl = new VertInfo(red, green, blue, light); - this.tr = new VertInfo(red, green, blue, light); - this.bl = new VertInfo(red, green, blue, light); - this.br = new VertInfo(red, green, blue, light); + if(side == ForgeDirection.SOUTH.ordinal()) { + this.tl = new VertInfo(colorRedTopLeft, colorGreenTopLeft, colorBlueTopLeft, brightnessTopLeft); + this.tr = new VertInfo(colorRedTopRight, colorGreenTopRight, colorBlueTopRight, brightnessTopRight); + this.bl = new VertInfo(colorRedBottomLeft, colorGreenBottomLeft, colorBlueBottomLeft, brightnessBottomLeft); + this.br = new VertInfo(colorRedBottomRight, colorGreenBottomRight, colorBlueBottomRight, brightnessBottomRight); + } else if(side == ForgeDirection.NORTH.ordinal()) { + this.tr = new VertInfo(colorRedTopLeft, colorGreenTopLeft, colorBlueTopLeft, brightnessTopLeft); + this.br = new VertInfo(colorRedTopRight, colorGreenTopRight, colorBlueTopRight, brightnessTopRight); + this.tl = new VertInfo(colorRedBottomLeft, colorGreenBottomLeft, colorBlueBottomLeft, brightnessBottomLeft); + this.bl = new VertInfo(colorRedBottomRight, colorGreenBottomRight, colorBlueBottomRight, brightnessBottomRight); + } else if(side == ForgeDirection.EAST.ordinal()) { + this.bl = new VertInfo(colorRedTopLeft, colorGreenTopLeft, colorBlueTopLeft, brightnessTopLeft); + this.tl = new VertInfo(colorRedTopRight, colorGreenTopRight, colorBlueTopRight, brightnessTopRight); + this.br = new VertInfo(colorRedBottomLeft, colorGreenBottomLeft, colorBlueBottomLeft, brightnessBottomLeft); + this.tr = new VertInfo(colorRedBottomRight, colorGreenBottomRight, colorBlueBottomRight, brightnessBottomRight); + } else if(side == ForgeDirection.WEST.ordinal()) { + this.tr = new VertInfo(colorRedTopLeft, colorGreenTopLeft, colorBlueTopLeft, brightnessTopLeft); + this.br = new VertInfo(colorRedTopRight, colorGreenTopRight, colorBlueTopRight, brightnessTopRight); + this.tl = new VertInfo(colorRedBottomLeft, colorGreenBottomLeft, colorBlueBottomLeft, brightnessBottomLeft); + this.bl = new VertInfo(colorRedBottomRight, colorGreenBottomRight, colorBlueBottomRight, brightnessBottomRight); + } else if(side == ForgeDirection.UP.ordinal()) { + this.br = new VertInfo(colorRedTopLeft, colorGreenTopLeft, colorBlueTopLeft, brightnessTopLeft); + this.bl = new VertInfo(colorRedTopRight, colorGreenTopRight, colorBlueTopRight, brightnessTopRight); + this.tr = new VertInfo(colorRedBottomLeft, colorGreenBottomLeft, colorBlueBottomLeft, brightnessBottomLeft); + this.tl = new VertInfo(colorRedBottomRight, colorGreenBottomRight, colorBlueBottomRight, brightnessBottomRight); + } else { + this.tl = new VertInfo(colorRedTopLeft, colorGreenTopLeft, colorBlueTopLeft, brightnessTopLeft); + this.tr = new VertInfo(colorRedTopRight, colorGreenTopRight, colorBlueTopRight, brightnessTopRight); + this.bl = new VertInfo(colorRedBottomLeft, colorGreenBottomLeft, colorBlueBottomLeft, brightnessBottomLeft); + this.br = new VertInfo(colorRedBottomRight, colorGreenBottomRight, colorBlueBottomRight, brightnessBottomRight); + } this.tc = VertInfo.avg(tl, tr); this.bc = VertInfo.avg(bl, br); @@ -82,7 +109,7 @@ public class RenderBlocksCT extends RenderBlocks { @Override public void renderFaceXPos(Block block, double x, double y, double z, IIcon icon) { - initSideInfo(); + initSideInfo(ForgeDirection.EAST.ordinal()); CTFace face = CTContext.faces[ForgeDirection.EAST.ordinal()]; /// ORDER: LEXICAL /// @@ -99,7 +126,7 @@ public class RenderBlocksCT extends RenderBlocks { @Override public void renderFaceXNeg(Block block, double x, double y, double z, IIcon icon) { - initSideInfo(); + initSideInfo(ForgeDirection.WEST.ordinal()); CTFace face = CTContext.faces[ForgeDirection.WEST.ordinal()]; /// ORDER: LEXICAL /// @@ -116,7 +143,7 @@ public class RenderBlocksCT extends RenderBlocks { @Override public void renderFaceYPos(Block block, double x, double y, double z, IIcon icon) { - initSideInfo(); + initSideInfo(ForgeDirection.UP.ordinal()); CTFace face = CTContext.faces[ForgeDirection.UP.ordinal()]; /// ORDER: LEXICAL /// @@ -133,7 +160,7 @@ public class RenderBlocksCT extends RenderBlocks { @Override public void renderFaceYNeg(Block block, double x, double y, double z, IIcon icon) { - initSideInfo(); + initSideInfo(ForgeDirection.DOWN.ordinal()); CTFace face = CTContext.faces[ForgeDirection.DOWN.ordinal()]; /// ORDER: LEXICAL /// @@ -150,7 +177,7 @@ public class RenderBlocksCT extends RenderBlocks { @Override public void renderFaceZPos(Block block, double x, double y, double z, IIcon icon) { - initSideInfo(); + initSideInfo(ForgeDirection.SOUTH.ordinal()); CTFace face = CTContext.faces[ForgeDirection.SOUTH.ordinal()]; /// ORDER: LEXICAL /// @@ -167,7 +194,7 @@ public class RenderBlocksCT extends RenderBlocks { @Override public void renderFaceZNeg(Block block, double x, double y, double z, IIcon icon) { - initSideInfo(); + initSideInfo(ForgeDirection.NORTH.ordinal()); CTFace face = CTContext.faces[ForgeDirection.NORTH.ordinal()]; /// ORDER: LEXICAL /// diff --git a/src/main/resources/assets/hbm/textures/blocks/pwr_block.png b/src/main/resources/assets/hbm/textures/blocks/pwr_block.png new file mode 100644 index 0000000000000000000000000000000000000000..8483b28147d16cd2da5931dae485943b6ab759fb GIT binary patch literal 333 zcmV-T0kZyyP)3!cu_!e*aYSZnygeyaLhd&3_?X*IjD$Ho01TpsJKoXqtxO z@kj^(5y8w@F5iD#B)5PVBdUss(DyyF*^E*OIcJ=6BQ+y{h~T}a)=G?#zVC6)5klZ_ zINbLDpp=4{F`Z6HDWR%_5HK?)lgVQR=P_!n%;$4dm0=jjIg@jK42Ut3Qo?&r2m$Xs zz@HwBMmQT+Yh@S)PNx$ha*2luoO77j#msBzDW&@g*6a1CV6k``o&5@E+xDsF{L*Iv f(Cv2nbThygff#NoKJtHT00000NkvXXu0mjfJe!Oe literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pwr_block_ct.png b/src/main/resources/assets/hbm/textures/blocks/pwr_block_ct.png new file mode 100644 index 0000000000000000000000000000000000000000..d7b37f330b7044b1bf3fad743534d78aee9c77bf GIT binary patch literal 842 zcmV-Q1GW5#P)iXLDt(gXBvxkDCR zbdjPNXenC~DRLGa5te1k$;k5nK?}W){PB@`{E5$>|4RHD-uuDZ7=tl}Q_<&aw_D1x z%+GSUoaFEC?+5uB;N835h%w@vBgRPEwrH(!&JjW&r9?`J5CYzNlu`iv{8^5KefaQx zl0Oa&5JJFOi}#+UY4XRquJa&TYowGo=jfS!rH8TG?I!t?0<_k7Wm;>r)(9aGLQqu| zMNwoxN{J8x?>#A{@qicjQNH&+E9_U+zl);4T8mN&DP=CBQi>Sk$pJ6%$05DROe$QgD$mJG7Af=>dPQ@jDBmf}B$nEWI29;8DU59gy{eF)S0&6XGU1t&J zDsYJ(ZGkZcYb_}yVvNKXNhxu2b3;{CXsz>iV+>u_GfG&N;fSW3^hL zwWe)by!ZL(f3b5h#g7CSV`$r!loCoQoO4uFg;FXXpkAO5A`d<_`4m4A;Js(R-=mbG zZQFcs0NS=C#)y;>V+>krx~@ZOeey&D7x|MFSS%LA7_-WhQr_po(p6Q3wRX^~j^h$P z5&+~f^$Pn^HBFQExH;qLfyc+kVg7Qt zWV2c49?&!mTI+nDH%)`JcH{@@y5{-$1#9hyhx2~mpGND7-RC`EQ*4*ZGr!}6~nJ{(Kn_3|3CHv{k&HZaCdi?2YibkD9e(607sEl U2*M={rT_o{07*qoM6N<$f{P!LLI3~& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pwr_block_ct_alt.png b/src/main/resources/assets/hbm/textures/blocks/pwr_block_ct_alt.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b7fd272332c79f8ef1d75a7e8aaa3fb3e41b74 GIT binary patch literal 861 zcmV-j1ETziP)fatO+(-9?afL2#l_XZc^N`L2mvW2D5bF3Y~Y*&0Hl-%oO4D90p5EEApig| zMjYD|{@93s)*9Y>SZnEL-}f-aAcO!ZB{=6W#?Y(AY`5E;#19BaDFJ|9CZ&Xw5{xl0 z#?ZDcg%SWb=U|M%dp}BG3O_i{7$b)JFAE`{sw!x$A%pgD%esB`!U{80nI+kd~_d3_l=H!dSwZ zQi3rC)>^FBYk2SBoCD_^F-D}6uv{)j!@r+~&+vnY^?eWL9CFSOLckb%W13O^uF*u@x;bEYtt zWm7^}RTYJ@?|UM0Y*Y9FffD`@0=3EhPS9FY?-vK_^%_d4gT1kDQ}_eI-g_EA*4jZj zIOnMA8qPUbYq4A|5B`r`ehNPzaDDxK)X`VXT1(4le{(9O21Wby^aR;7%~=WjtsdBJ zw;zJ!+ywqc5A5H0b^=p+;N|7z@ciTB1G=uGqA58n``lU!t@S_;l+CtUtp<4Db3Jf( z_u~LRTMx{|&(;HT@w4^7T>NZ3P;}u}@w4^7T>NZ3Fc&{t56s4Iw>KvT%Vu+V^8c~D zz5ON}+#aUGq?TG(6ih+-UD?_RD|FIq@ n_nw8o{rx>T{1-jYG!6a$>@cUcq0VNO00000NkvXXu0mjf()ESJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pwr_casing.png b/src/main/resources/assets/hbm/textures/blocks/pwr_casing.png new file mode 100644 index 0000000000000000000000000000000000000000..23f51e5033d450524fa2a65522a60955b20ed6c0 GIT binary patch literal 589 zcmV-T0z}+cjMYUtrSeAtl5+H=2 z^xnC+c#DWo$~rYLGem@(4}=hi@lmu!&YAsw&$`ZL)qn_?RmPBc2GD!s_A<%o<80v9#_l*`) zm<@2hKS4yPwNPuNR@)p=Qi>BGr9`cT-aD#FjETeHHzGnx2~}YX--6@B7-_9B#>}6Z z898S}lu`;gXLh?6j4@c(mDV~Ss4A+{iTRX%WU$-q=)KWeWr{jI7g46ol`#f6XF`aS zvK|>sL4@n;Z(LvBY=IfL4@y~yG2%Y9$&uUJd+zSO{|j(Tn5xoR0|u&-s)(>G3nI|k zOzgVmV~~39oSnU9Sr*&}wLS`#oHhu)X7)tuc|E$3bA8s6 bpYHzvZlG&(a_NQV00000NkvXXu0mjfMi>mc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pwr_casing_blank.png b/src/main/resources/assets/hbm/textures/blocks/pwr_casing_blank.png new file mode 100644 index 0000000000000000000000000000000000000000..6b8c7f6b4d7b88cae08c36fe195f952da444ad68 GIT binary patch literal 542 zcmV+(0^$9MP)|E3`Cy|bkCohBGTMv4v_nAW)x+UGz|tj3;O>*k>UkN zfXd~nLf+qh1Xr2aKYJ;KQVRd8`9eGz3&CnCsZ3n`_9yDwCom<_gVBc%ceDJgSK%~!USGcgt-83w^u}z-W$Dldbi6FrIfq?N-6Z-m~*14 zzk=iBoEc*fvGS*8My(YQrL{(_m3@C9A~?^JF(x3WDyqwgHOhQ4 z*!P_|2V-=WsQ&PK*}O7RYbB*jYv+@}6%8VmO)D^gd(hfR&KdW(I%jG<9$I|?SXSP3 z7-Il|>Y^$lY}G1wpP1Q$*4Mhb gQEUJ5ratcf0>-RoS!6FK(f|Me07*qoM6N<$f(NPf%K!iX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pwr_casing_port.png b/src/main/resources/assets/hbm/textures/blocks/pwr_casing_port.png new file mode 100644 index 0000000000000000000000000000000000000000..809c564c2c78010b9b225097231e7299e790f669 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfpA8fi^=HlDX1`Vcr4PAeV@i7J-B7YtrxU z{ye?bV!l3qnFce5Vvg3k-~U)|FrQp@aQ}ow8kcV7?3?+#GOC+{!SI;K^wgi%UNAER zTvun<^PM3gn=#||>-X9|S516hEm>vp{F2LRhWECLENzJur)w`4&iipK^~#H*{ti8Y z*}AK`4B3)-R?VuJk$sW*`JML8`bq_*EpJ5yJ(ch0mAjGrh3uR#AXc)I$ztaD0e0suSua$W!c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pwr_casing_port_ct.png b/src/main/resources/assets/hbm/textures/blocks/pwr_casing_port_ct.png new file mode 100644 index 0000000000000000000000000000000000000000..52fb4583a768368053dcf069e5150ede685ed0f5 GIT binary patch literal 898 zcmV-|1AY97P)NCOPCx7cK{qD3Nig{(v9|^ZwyKZ{B( z(OR<&blf?$yTAX-|2{r` zMGyp7YqxIL#ZQuPQ-G9`EX%xz^Ya-1i^T$f$z%e+<>g1Dl+>JEXyZ3B0AQ`<=;&yz zNG>ieNYm#cOOk~7e2&%{A%qvvhF$!I0IfA)7~-7sXaA`WsKqJ>51WRNKq7iVLqQXib!isRaG1u9JGpP<2M9otvNhA#9E6n2CX%h zmmkqu`;>k9^qU{6VHlFY2Dc-yp`Jyb#5-BBlp8El`TrP>C2qDB) z0bTq}_#&*T3g;Y3DXOYM2!YlbYb{br27`ew(k#o?M()~)I`|C%#u%)%lx68twE9j6 z!_fDBy}@ue?5y@Se&Y&mZ|`@`_WC4{?u=Q*moI;`@*AUgI-Ry|_)^qwRcQKw&8(fB zouTS+xi5ULA4rnq*^um8!1wrp)o1QqK$jo5y1H7AkK>r}IPrsJvG~(3u69NJyY>TF zmT_})M;L~k{8c~j?%iaK-`fxL^8^2t-`fxL<@fdjefeTGJ9kO) z140Ojq99HG_Q9)v)#|Z&eEiC%@$={3iQ||)eDUGKukCM_7vk>jrqvIO$3L&d?{yMh zUtjb7{V!BiMGyo&3$-7pujqdr#qgZ+vMhgVo7z{$yp-|!`VAWc*L Y0sX+_2L6zb2LJ#707*qoM6N<$f-rrood5s; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pwr_channel_side.png b/src/main/resources/assets/hbm/textures/blocks/pwr_channel_side.png new file mode 100644 index 0000000000000000000000000000000000000000..bc3b557a2c7956852233b8be8523f40e7d3b7e1d GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf>%@!#`Zsudl(_oq+D-S*@1-ZZ5 z&Mqe`i(fBUHA8Zhmu73Udfgk@Ji+t8qFpPIx6m;OW&ymip{b;e} z+B!@1Y+Wx+hKial4o%f>_hv}O$tU;RK2x!J>!ZRB!#D;dr*o2_M<4$``2T@2zubiH WWvety*82giWbkzLb6Mw<&;$SyH$EBw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pwr_concrete_flat.png b/src/main/resources/assets/hbm/textures/blocks/pwr_concrete_flat.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd3c4ba5d34cd04e847c1cc2a95da359f8ffc16 GIT binary patch literal 520 zcmV+j0{8uiP)2CFks{073`>z>z};gb)xBM1B?(3aZL=UG(0`IXm6+JlXf%wTlR<>V}&c z+FE1I$=lnT51JWc406t#=ZT1rQsTNU2bpssB7_(tA%tHst+jYO9vsI(2!WImYb|1o zj4^!4T8nT;a?_e~l5?h%!t3>-wMMNKRb`C9oRjDC=~3!+UDR4xYhh;OoH>pIGjjv) z1tLPunK6d^K!wdR>0$3aTT z%VuWioYQIET@VofN-5sFJC(1mFE7&=<2%Ot!CK2{-k;@`ux*=5xvtBB^rqi?C&uW8 z-8555p1rC9@Or(7F;Yq)wAQ>prIi2Vs4DxuQ){J^!t?q3b^jM7ctF!=Xl`);0000< KMNUMnLSTY=E$`|8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pwr_control_side.png b/src/main/resources/assets/hbm/textures/blocks/pwr_control_side.png new file mode 100644 index 0000000000000000000000000000000000000000..b36c421a2c7b3cf246b8a254ed7353f45984fda9 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf9UFLh)gTe~DWM4fEgM@d literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pwr_control_top.png b/src/main/resources/assets/hbm/textures/blocks/pwr_control_top.png new file mode 100644 index 0000000000000000000000000000000000000000..d5ae636a02b56367f51d9a1f3f85874a5e98eaed GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf565Gy2o6z?H{D%l-K5QxCl$6^DGm%&a!E?-4Y3j z9}m(K)wNC+DJlI}wk~_Upx~oa%dNH{dIF*=w7P7VjUUgREh^f(H6w~U`}__0K0SdV zXBR%#XIA{oE=O3M@;W#cJqk#LbMY0A4Ey-rZ~vzYQls&SC${|P+V?W=wn>X~ zREC6JJ#yxQ@2q8U$!SOC|FiU*^gwpcum5~?kND<&3Q^tFxbw(Epf4CaUHx3vIVCg! E0MKV+iU0rr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pwr_controller.png b/src/main/resources/assets/hbm/textures/blocks/pwr_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..822cb4d266c6f82a9e1c477d78068c144e86ef63 GIT binary patch literal 550 zcmV+>0@?kEP)276-l+r)9h#(?7gu5OG zu)Y0~QVJqMDTNRM)>`_$C&q}XQc5A`M2rz*EKs?;{MiIjO3df;C3!$q>AH@b6J00d z9I>`TRRNexo{@7RrPKthwZs@XK0bQT?tSd-z2W@)lv*n`rKV)9U5nft2UH6{6EMaw z47Y0wcz;8!rU?L)k{OR5uPp!;)!Zr(!MQg5|AYN=swyePwW-c^h`3gZ2r&jGlL`C# zZvnWvx?nUKv$?s+VsVZ4o){C>Lf3VK5U91~&!v>`-ZLIQ;_U1@s)~qkbF<+3`Ufc` zYOSa$#;^=rzxuKj5k{jCrDQ&SdI!Ms4+j98oO~sv#B6p*trhP*ufH4-!mx5+rqkUz znLI&NQ7x!eoO6_-EFFwD=TDx>onavIbjfzAmb1a5Cb+l7mZ o`D$4AVT?gU@IL<4<5%y$0sJK;nbTOo0{{R307*qoM6N<$g0;-|TmS$7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pwr_fuel_side.png b/src/main/resources/assets/hbm/textures/blocks/pwr_fuel_side.png new file mode 100644 index 0000000000000000000000000000000000000000..1f22996bb5d37c3bb30cb8d7908c1fd34d9e26c1 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfrem>+k^eSejoN<4Yg@;zMk}wS48}MV3nbHIQ#Y>@s*Q56g7Rna8jwORy;#N z;1la4#hZ!YHlB}+=N2d5-KM)N#`96l&V{f21q4@Uxv+#rChT83u}HOZoqggC`wy~T z(|V^oS5Z{5mq>2;E~k0k(AEH-1EKS`um(&Y{B!+)*Jk9l#Gkz6lXJGFBJm1pTX1B&t;ucLK6Vk$X_o2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pwr_heatex.png b/src/main/resources/assets/hbm/textures/blocks/pwr_heatex.png new file mode 100644 index 0000000000000000000000000000000000000000..f579c8a45451d77ac9a0fe69f3e2bc594e752864 GIT binary patch literal 373 zcmV-*0gC>KP)F>Vw=5JlhbX+z|MLvT0;M5JT{a0yG62oV=R+`^GTB0(fb zSO(TRvsKlfU{|&Xm|&tVb-gO7s-C{Sf9=Xb62^EKfS+Hk`Ed1#fw_3|lK(M%)L{4h zGm@w*DvONb?#C^YU@o)9^o%49fy>8tKxMMu?OBFt5^GG)NGb+#h<~6zzh=&wNSigL zk1X;KEcXks1fz<|K}InNK&&xceF6ytwuvPfRb&Kb5(3tkzWa8=@7p`(-ORiXVo5TK zszDjbW{uIS=g*urVH3j`c-ll7CP4%0cs0_e;Plr7y==xQnFhf_qlOrQ-UN@e%)@lS zlP0t#(!0x#^d?@s-6)bd?qIV>594hW$-soRi*()_hV3FXiL$qgG}oX@t0Mgcv@$n4 T{_8}|00000NkvXXu0mjfp!%P4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pwr_neutron_source.png b/src/main/resources/assets/hbm/textures/blocks/pwr_neutron_source.png new file mode 100644 index 0000000000000000000000000000000000000000..bc1d78027976f3907a660ae9276d81e31d075bdf GIT binary patch literal 564 zcmV-40?Yl0P)Y=Fo97}7u|LL zTy#$Zv6D)7SE}lM=iEBw>dWVpS_yYDAxR2_)xnC4L``vXA_FohB7{4o6e5!55xhG+ zLCvVO0#HQ&Fn1z?hyb9JLPnrwhzJi4e`(><#M?K=wARQ>M1)cb!!QsLlu`g#tyYv$ z=)JSs-4mI#t{pc6;Qhx>s2gsMx$$a#PydR!^Zmy)A5PmMrL|hAt>Nyd8@t^ts`_kn z?Wj%P+wBdPuTRMcYHc*;M?`RQRF%8C+i6o*#y+B^tk;|Au&%V$CO=4oQi$0sb6YAN z9j-Y%I%2)quwHLCKf73n%xv<8g6s_f76R?hu~ikf{ox}rcS%i=oZFO{3&9@ysSoB( z*G^ZZ_s%$u48wqkOeSU~ZvJ28r`UTsGo!2G?z9LeBM=eHbusMx>;gB#+%dC-PHoy) zYo)bD%S_Y^Go!jM6~A47eQe>LWG0IU%#6&Wjk6w~FUfX$L+`p6)@STTSrdurRJ4(a zyE6;}8yPvid`adDdhZ+@oKS0>gEN`!v!u3alZ415BKZ01H?20zr)%x*0JPQ+5vs@% zE;mEw;5C5z`#%&BYOV7E$9-C~PbffmkR+M8B=a8w`wIve2v`&V0000dqfP7d3<~x3aBbKH{VeWTwZ=5r9@E_blnzf9jYE< z3UY?~`wgnf`S}M_6$4<5K{XJ9j-8J%rl2Saw%cEb2q~p$^bi6uCUVYLRYg^~y822= ziQC&B)1JHi51BO0Cq#t4e;pX8Dk4JHZ7GTZfW=}CzG)+TQRn&D&UDs4qHF2=k5<(#7yocCz9mmHr z`o5pKEtku`AnuIjTsbKt^Z6pz^;>ezsCwG=WlBD@_RiL`*%7LP8=s$F1{FZKyZbph z>?77%VoZcE6zKaN5h3TyX7fM@fz#8I1C;C?W{e?(0A!3Qh%q7}lx2wsgfKYv^|jkG zh%s_@_MWmVNh#yK0tsu~1Wg2ThPr--wQl4Uh7}$jT2yr+dl({ubB?a_2RYsJ{~Jqx VLcv4mF&+Q_002ovPDHLkV1h(l1A71f literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/pwr_reflector.png b/src/main/resources/assets/hbm/textures/blocks/pwr_reflector.png new file mode 100644 index 0000000000000000000000000000000000000000..c139a402ea33722cae5db29bd18aab8c22640e17 GIT binary patch literal 490 zcmV~=dhGXO*cGsDaf5!@XSK}6_JDFt`O%-C+X z1QB7k+Yw_#M94XlbEcF6fU4r|+-^7Aoe;v%=y*I5RF#wx*XwoYUTbAM9y1z^FtZ;8 zbIwdA6E2qvP1B&?$2y%(tX33fl`&&^}fPZ%GF+hxwTI*fJ zS}OpH#e%kNe~^BM4~GLG1Y(S+h>%hurSz}{r4*W`xqqQI#s6qfYaPs{P1D>Tst;?> zyEDdk*C2#|sy?hi*LB0{)y#%9KB_^j6%nD7g1o=K`+mRY>+6g8d`{Ce0K;bb)8js5 zudlCse0&hxo$+|gbULN$Isj5inAs2_GaEt_LZIi=S_yA&Z=BC(RF#}F?miIvLcP&) g&eU2dr3_j41uqSi!J1Qc{r~^~07*qoM6N<$f>}${+W-In literal 0 HcmV?d00001 From f912e572f7482d529d5bbe4b8dc121fe88e608b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B8=D0=B3=D0=BE=D1=80=D0=B8=D0=B9=20=D0=92?= =?UTF-8?q?=D0=B5=D0=BB=D0=B8=D1=87=D0=BA=D0=BE?= Date: Wed, 16 Aug 2023 15:17:26 +0300 Subject: [PATCH 04/14] Fix Thermos preventer on Crucible --- src/main/java/com/hbm/main/MainRegistry.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 438847446..bc6e968f7 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -959,8 +959,8 @@ public class MainRegistry { config.save(); try { - if(GeneralConfig.enableThermosPreventer && Class.forName("thermos.Thermos") != null) { - throw new IllegalStateException("The mod tried to start on a Thermos server and therefore stopped. To allow the server to start on Thermos, change the appropriate " + if(GeneralConfig.enableThermosPreventer && Class.forName("thermos.ThermosClassTransformer") != null) { + throw new IllegalStateException("The mod tried to start on a Thermos or it's fork server and therefore stopped. To allow the server to start on Thermos, change the appropriate " + "config entry (0.00 in hbm.cfg). This was done because, by default, Thermos " + "uses a so-called \"optimization\" feature that reduces tile ticking a lot, which will inevitably break a lot of machines. Most people aren't even aware " + "of this, and start blaming random mods for all their stuff breaking. In order to adjust or even disable this feature, edit \"tileentities.yml\" in your " From cb0eb4271b39b20d86839c20024436561a757e0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B8=D0=B3=D0=BE=D1=80=D0=B8=D0=B9=20=D0=92?= =?UTF-8?q?=D0=B5=D0=BB=D0=B8=D1=87=D0=BA=D0=BE?= Date: Wed, 16 Aug 2023 15:24:51 +0300 Subject: [PATCH 05/14] Fix hbmpollution.dat file on Crucible and probably Thermos --- .../java/com/hbm/handler/pollution/PollutionHandler.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/handler/pollution/PollutionHandler.java b/src/main/java/com/hbm/handler/pollution/PollutionHandler.java index 0ba128f52..6ddf72eec 100644 --- a/src/main/java/com/hbm/handler/pollution/PollutionHandler.java +++ b/src/main/java/com/hbm/handler/pollution/PollutionHandler.java @@ -153,8 +153,10 @@ public class PollutionHandler { public String getDataDir(WorldServer world) { String dir = world.getSaveHandler().getWorldDirectory().getAbsolutePath(); - if(world.provider.dimensionId != 0) { - dir += File.separator + "DIM" + world.provider.dimensionId; + // Crucible and probably Thermos provide dimId by themselves + String dimId = File.separator + "DIM" + world.provider.dimensionId; + if(world.provider.dimensionId != 0 && !dir.endsWith(dimId)) { + dir += dimId; } dir += File.separator + "data"; return dir; From f7dd3a0a93972553d2b172b7c3853688afd55839 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 16 Aug 2023 16:21:11 +0200 Subject: [PATCH 06/14] more PWR crap --- src/main/java/com/hbm/blocks/ModBlocks.java | 2 +- .../java/com/hbm/blocks/machine/BlockPWR.java | 108 +++++++++++++++++- .../blocks/machine/MachinePWRController.java | 33 ++++-- .../hbm/inventory/container/ContainerPWR.java | 76 ++++++++++++ .../java/com/hbm/inventory/gui/GUIPWR.java | 40 +++++++ src/main/java/com/hbm/items/ModItems.java | 14 +++ .../com/hbm/items/machine/ItemPWRFuel.java | 26 +++++ .../java/com/hbm/tileentity/TileMappings.java | 4 + .../machine/TileEntityDiFurnace.java | 31 ++--- .../machine/TileEntityPWRController.java | 55 +++++++++ .../machine/rbmk/TileEntityRBMKInlet.java | 33 +----- .../machine/rbmk/TileEntityRBMKOutlet.java | 59 +--------- .../hbm/textures/gui/reactors/gui_pwr.png | Bin 5843 -> 5927 bytes .../hbm/textures/items/pwr_fuel.hea242.png | Bin 0 -> 428 bytes .../hbm/textures/items/pwr_fuel.hen237.png | Bin 0 -> 412 bytes .../hbm/textures/items/pwr_fuel.hep239.png | Bin 0 -> 403 bytes .../hbm/textures/items/pwr_fuel.hep241.png | Bin 0 -> 418 bytes .../hbm/textures/items/pwr_fuel.hes326.png | Bin 0 -> 431 bytes .../hbm/textures/items/pwr_fuel.hes327.png | Bin 0 -> 434 bytes .../hbm/textures/items/pwr_fuel.heu233.png | Bin 0 -> 433 bytes .../hbm/textures/items/pwr_fuel.heu235.png | Bin 0 -> 419 bytes .../hbm/textures/items/pwr_fuel.mea.png | Bin 0 -> 431 bytes .../hbm/textures/items/pwr_fuel.men.png | Bin 0 -> 429 bytes .../hbm/textures/items/pwr_fuel.mep.png | Bin 0 -> 414 bytes .../hbm/textures/items/pwr_fuel.meu.png | Bin 0 -> 422 bytes .../hbm/textures/items/pwr_fuel.mox.png | Bin 0 -> 414 bytes .../hbm/textures/items/pwr_fuel_base.png | Bin 0 -> 422 bytes .../hbm/textures/items/pwr_fuel_depleted.png | Bin 0 -> 373 bytes .../hbm/textures/items/pwr_fuel_hot.png | Bin 0 -> 401 bytes 29 files changed, 364 insertions(+), 117 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/container/ContainerPWR.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIPWR.java create mode 100644 src/main/java/com/hbm/items/machine/ItemPWRFuel.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_fuel.hea242.png create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_fuel.hen237.png create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_fuel.hep239.png create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_fuel.hep241.png create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_fuel.hes326.png create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_fuel.hes327.png create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_fuel.heu233.png create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_fuel.heu235.png create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_fuel.mea.png create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_fuel.men.png create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_fuel.mep.png create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_fuel.meu.png create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_fuel.mox.png create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_fuel_base.png create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_fuel_depleted.png create mode 100644 src/main/resources/assets/hbm/textures/items/pwr_fuel_hot.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index f5b447bcd..371268c24 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -883,9 +883,9 @@ public class ModBlocks { public static Block pwr_neutron_source; public static Block pwr_reflector; public static Block pwr_casing; + public static Block pwr_port; public static Block pwr_controller; public static Block pwr_block; - public static Block pwr_port; public static Block reactor_element; public static Block reactor_control; diff --git a/src/main/java/com/hbm/blocks/machine/BlockPWR.java b/src/main/java/com/hbm/blocks/machine/BlockPWR.java index 865cff4c6..7012f5437 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockPWR.java +++ b/src/main/java/com/hbm/blocks/machine/BlockPWR.java @@ -1,20 +1,29 @@ package com.hbm.blocks.machine; +import java.util.Random; + import com.hbm.blocks.ModBlocks; import com.hbm.lib.RefStrings; import com.hbm.render.block.ct.CT; import com.hbm.render.block.ct.CTStitchReceiver; import com.hbm.render.block.ct.IBlockCT; +import com.hbm.tileentity.machine.TileEntityPWRController; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; -public class BlockPWR extends Block implements IBlockCT { +public class BlockPWR extends BlockContainer implements IBlockCT { @SideOnly(Side.CLIENT) protected IIcon iconPort; @@ -26,6 +35,11 @@ public class BlockPWR extends Block implements IBlockCT { public int getRenderType() { return CT.renderID; } + + @Override + public Item getItemDropped(int i, Random rand, int j) { + return null; + } @SideOnly(Side.CLIENT) public CTStitchReceiver rec; @SideOnly(Side.CLIENT) public CTStitchReceiver recPort; @@ -49,4 +63,96 @@ public class BlockPWR extends Block implements IBlockCT { public boolean canConnect(IBlockAccess world, int x, int y, int z, Block block) { return block == ModBlocks.pwr_block || block == ModBlocks.pwr_controller; } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityBlockPWR(); + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityBlockPWR) { + TileEntityBlockPWR pwr = (TileEntityBlockPWR) tile; + world.removeTileEntity(x, y, z); + if(pwr.block != null) { + world.setBlock(x, y, z, pwr.block); + TileEntity controller = world.getTileEntity(pwr.coreX, pwr.coreY, pwr.coreZ); + + if(controller instanceof TileEntityPWRController) { + ((TileEntityPWRController) controller).assembled = false; + } + } + } else { + world.removeTileEntity(x, y, z); + } + super.breakBlock(world, x, y, z, block, meta); + } + + public static class TileEntityBlockPWR extends TileEntity { + + public Block block; + public int coreX; + public int coreY; + public int coreZ; + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(worldObj.getTotalWorldTime() % 20 == 0 && block != null) { + + if(worldObj.getChunkProvider().chunkExists(coreX >> 4, coreZ >> 4)) { + + TileEntity tile = worldObj.getTileEntity(coreX, coreY, coreZ); + + if(tile instanceof TileEntityPWRController) { + TileEntityPWRController controller = (TileEntityPWRController) tile; + if(!controller.assembled) { + this.getBlockType().breakBlock(worldObj, xCoord, yCoord, zCoord, this.getBlockType(), this.getBlockMetadata()); + } + } else { + this.getBlockType().breakBlock(worldObj, xCoord, yCoord, zCoord, this.getBlockType(), this.getBlockMetadata()); + } + } + } + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + block = Block.getBlockById(nbt.getInteger("block")); + if(block != Blocks.air) { + coreX = nbt.getInteger("cX"); + coreY = nbt.getInteger("cY"); + coreZ = nbt.getInteger("cZ"); + } else { + block = null; + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + if(block != null) { + nbt.setInteger("block", Block.getIdFromBlock(block)); + nbt.setInteger("cX", coreX); + nbt.setInteger("cY", coreY); + nbt.setInteger("cZ", coreZ); + } + } + + @Override + public void markDirty() { + if(this.worldObj != null) { + this.worldObj.markTileEntityChunkModified(this.xCoord, this.yCoord, this.zCoord, this); + } + } + } } diff --git a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java index 9eedb3d45..40c6748ed 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java @@ -4,8 +4,10 @@ import java.util.HashMap; import java.util.Map.Entry; import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.machine.TileEntityPWRController; import com.hbm.util.fauxpointtwelve.BlockPos; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; @@ -35,7 +37,7 @@ public class MachinePWRController extends BlockContainer { @Override public TileEntity createNewTileEntity(World world, int meta) { - return null; + return new TileEntityPWRController(); } @Override @@ -67,10 +69,15 @@ public class MachinePWRController extends BlockContainer { if(world.isRemote) { return true; } else if(!player.isSneaking()) { + + TileEntityPWRController controller = (TileEntityPWRController) world.getTileEntity(x, y, z); - assemble(world, x, y, z); + if(!controller.assembled) { + assemble(world, x, y, z); + } else { + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + } - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); return true; } else { return false; @@ -87,29 +94,39 @@ public class MachinePWRController extends BlockContainer { assembly.put(new BlockPos(x, y, z), this); ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)).getOpposite(); - x += dir.offsetX; - z += dir.offsetZ; errored = false; - floodFill(world, x, y, z); + floodFill(world, x + dir.offsetX, y, z + dir.offsetZ); if(fuelRods.size() == 0) errored = true; if(!errored) { for(Entry entry : assembly.entrySet()) { + BlockPos pos = entry.getKey(); Block block = entry.getValue(); if(block != ModBlocks.pwr_controller) { if(block == ModBlocks.pwr_port) { - world.setBlock(entry.getKey().getX(), entry.getKey().getY(), entry.getKey().getZ(), ModBlocks.pwr_block, 1, 3); + world.setBlock(pos.getX(), pos.getY(), pos.getZ(), ModBlocks.pwr_block, 1, 3); } else { - world.setBlock(entry.getKey().getX(), entry.getKey().getY(), entry.getKey().getZ(), ModBlocks.pwr_block, 0, 3); + world.setBlock(pos.getX(), pos.getY(), pos.getZ(), ModBlocks.pwr_block, 0, 3); } + + TileEntityBlockPWR pwr = (TileEntityBlockPWR) world.getTileEntity(pos.getX(), pos.getY(), pos.getZ()); + pwr.block = block; + pwr.coreX = x; + pwr.coreY = y; + pwr.coreZ = z; + pwr.markDirty(); } } } + + TileEntityPWRController controller = (TileEntityPWRController) world.getTileEntity(x, y, z); + controller.assembled = !errored; + assembly.clear(); } diff --git a/src/main/java/com/hbm/inventory/container/ContainerPWR.java b/src/main/java/com/hbm/inventory/container/ContainerPWR.java new file mode 100644 index 000000000..92b638808 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerPWR.java @@ -0,0 +1,76 @@ +package com.hbm.inventory.container; + +import com.hbm.inventory.SlotCraftingOutput; +import com.hbm.items.machine.IItemFluidIdentifier; +import com.hbm.tileentity.machine.TileEntityPWRController; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerPWR extends Container { + + TileEntityPWRController controller; + + public ContainerPWR(InventoryPlayer invPlayer, TileEntityPWRController controller) { + this.controller = controller; + + this.addSlotToContainer(new Slot(controller, 0, 53, 5)); + this.addSlotToContainer(new SlotCraftingOutput(invPlayer.player, controller, 1, 89, 32)); + this.addSlotToContainer(new Slot(controller, 2, 8, 59)); + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 108 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 164)); + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { + ItemStack var3 = null; + Slot var4 = (Slot) this.inventorySlots.get(par2); + + if(var4 != null && var4.getHasStack()) { + ItemStack var5 = var4.getStack(); + var3 = var5.copy(); + + if(par2 <= 2) { + if(!this.mergeItemStack(var5, 3, this.inventorySlots.size(), true)) { + return null; + } + } else { + + if(var3.getItem() instanceof IItemFluidIdentifier) { + if(!this.mergeItemStack(var5, 2, 3, false)) { + return null; + } + } else { + if(!this.mergeItemStack(var5, 0, 1, false)) { + return null; + } + } + } + + if(var5.stackSize == 0) { + var4.putStack((ItemStack) null); + } else { + var4.onSlotChanged(); + } + } + + return var3; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return controller.isUseableByPlayer(player); + } + +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIPWR.java b/src/main/java/com/hbm/inventory/gui/GUIPWR.java new file mode 100644 index 000000000..8715854f1 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIPWR.java @@ -0,0 +1,40 @@ +package com.hbm.inventory.gui; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerPWR; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityPWRController; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; + +public class GUIPWR extends GuiInfoContainer { + + protected TileEntityPWRController controller; + private final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/reactors/gui_pwr.png"); + + public GUIPWR(InventoryPlayer inventory, TileEntityPWRController controller) { + super(new ContainerPWR(inventory, controller)); + this.controller = controller; + + this.xSize = 176; + this.ySize = 188; + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.controller.hasCustomInventoryName() ? this.controller.getInventoryName() : I18n.format(this.controller.getInventoryName()); + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + } +} diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 0ea177e3b..a5144423e 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -21,6 +21,7 @@ import com.hbm.items.machine.*; import com.hbm.items.machine.ItemFELCrystal.EnumWavelengths; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.items.machine.ItemPlateFuel.FunctionEnum; +import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; import com.hbm.items.machine.ItemRBMKRod.EnumBurnFunc; import com.hbm.items.machine.ItemRBMKRod.EnumDepleteFunc; import com.hbm.items.machine.ItemRTGPelletDepleted.DepletedRTGMaterial; @@ -1103,6 +1104,10 @@ public class ModItems { public static Item plate_fuel_sa326; public static Item plate_fuel_ra226be; public static Item plate_fuel_pu238be; + + public static Item pwr_fuel; + public static Item pwr_fuel_hot; + public static Item pwr_fuel_depleted; public static Item rbmk_lid; public static Item rbmk_lid_glass; @@ -3547,6 +3552,10 @@ public class ModItems { plate_fuel_sa326 = new ItemPlateFuel(2000000).setFunction(FunctionEnum.LINEAR, 80).setUnlocalizedName("plate_fuel_sa326").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":plate_fuel_sa326"); plate_fuel_ra226be = new ItemPlateFuel(1300000).setFunction(FunctionEnum.PASSIVE, 30).setUnlocalizedName("plate_fuel_ra226be").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":plate_fuel_ra226be"); plate_fuel_pu238be = new ItemPlateFuel(1000000).setFunction(FunctionEnum.PASSIVE, 50).setUnlocalizedName("plate_fuel_pu238be").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":plate_fuel_pu238be"); + + pwr_fuel = new ItemPWRFuel().setUnlocalizedName("pwr_fuel").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pwr_fuel"); + pwr_fuel_hot = new ItemEnumMulti(EnumPWRFuel.class, true, false).setUnlocalizedName("pwr_fuel_hot").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pwr_fuel_hot"); + pwr_fuel_depleted = new ItemEnumMulti(EnumPWRFuel.class, true, false).setUnlocalizedName("pwr_fuel_depleted").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":pwr_fuel_depleted"); rbmk_lid = new ItemRBMKLid().setUnlocalizedName("rbmk_lid").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":rbmk_lid"); rbmk_lid_glass = new ItemRBMKLid().setUnlocalizedName("rbmk_lid_glass").setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":rbmk_lid_glass"); @@ -6640,6 +6649,11 @@ public class ModItems { GameRegistry.registerItem(plate_fuel_ra226be, plate_fuel_ra226be.getUnlocalizedName()); GameRegistry.registerItem(plate_fuel_pu238be, plate_fuel_pu238be.getUnlocalizedName()); + //PWR Parts + GameRegistry.registerItem(pwr_fuel, pwr_fuel.getUnlocalizedName()); + GameRegistry.registerItem(pwr_fuel_hot, pwr_fuel_hot.getUnlocalizedName()); + GameRegistry.registerItem(pwr_fuel_depleted, pwr_fuel_depleted.getUnlocalizedName()); + //RBMK parts GameRegistry.registerItem(rbmk_lid, rbmk_lid.getUnlocalizedName()); GameRegistry.registerItem(rbmk_lid_glass, rbmk_lid_glass.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemPWRFuel.java b/src/main/java/com/hbm/items/machine/ItemPWRFuel.java new file mode 100644 index 000000000..95198f494 --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemPWRFuel.java @@ -0,0 +1,26 @@ +package com.hbm.items.machine; + +import com.hbm.items.ItemEnumMulti; + +public class ItemPWRFuel extends ItemEnumMulti { + + public ItemPWRFuel() { + super(EnumPWRFuel.class, true, true); + } + + public static enum EnumPWRFuel { + MEU, + HEU233, + HEU235, + MEN, + HEN237, + MOX, + MEP, + HEP239, + HEP241, + MEA, + HEA242, + HES326, + HES327; + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 74b76c50b..fd8d60aca 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -14,6 +14,7 @@ import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; import com.hbm.blocks.generic.BlockMotherOfAllOres.TileEntityRandomOre; import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.generic.PartEmitter.TileEntityPartEmitter; +import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; import com.hbm.blocks.machine.MachineCapacitor.TileEntityCapacitor; import com.hbm.blocks.machine.MachineFan.TileEntityFan; import com.hbm.blocks.machine.PistonInserter.TileEntityPistonInserter; @@ -216,6 +217,9 @@ public class TileMappings { put(TileEntityRandomOre.class, "tileentity_mother_of_all_ores"); put(TileEntityBedrockOre.class, "tileentity_bedrock_ore"); + + put(TileEntityBlockPWR.class, "tileentity_block_pwr"); + put(TileEntityPWRController.class, "tileentity_pwr_controller"); putNetwork(); putBombs(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java index 1a10e1a7e..4e5cf6c3b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java @@ -132,32 +132,19 @@ public class TileEntityDiFurnace extends TileEntityMachinePolluting implements I } public boolean canProcess() { - if(slots[0] == null || slots[1] == null) { - return false; - } + if(slots[0] == null || slots[1] == null) return false; + if(!this.hasPower()) return false; - if(!this.hasPower()) { - return false; - } - - ItemStack itemStack = BlastFurnaceRecipes.getOutput(slots[0], slots[1]); - if(itemStack == null) { - return false; - } + ItemStack output = BlastFurnaceRecipes.getOutput(slots[0], slots[1]); + if(output == null) return false; + if(slots[3] == null) return true; + if(!slots[3].isItemEqual(output)) return false; - if(slots[3] == null) { + if(slots[3].stackSize + output.stackSize <= slots[3].getMaxStackSize()) { return true; } - - if(!slots[3].isItemEqual(itemStack)) { - return false; - } - - if(slots[3].stackSize < getInventoryStackLimit() && slots[3].stackSize < slots[3].getMaxStackSize()) { - return true; - } else { - return slots[3].stackSize < itemStack.getMaxStackSize(); - } + + return false; } private void processItem() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java new file mode 100644 index 000000000..f00014765 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -0,0 +1,55 @@ +package com.hbm.tileentity.machine; + +import com.hbm.inventory.container.ContainerPWR; +import com.hbm.inventory.gui.GUIPWR; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityMachineBase; + +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +public class TileEntityPWRController extends TileEntityMachineBase implements IGUIProvider { + + public boolean assembled; + + public TileEntityPWRController() { + super(3); + } + + @Override + public String getName() { + return "container.pwrController"; + } + + @Override + public void updateEntity() { + + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + this.assembled = nbt.getBoolean("assembled"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setBoolean("assembled", assembled); + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerPWR(player.inventory, this); + } + + @Override + public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIPWR(player.inventory, this); + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java index ddd96c7de..be66e767d 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java @@ -2,8 +2,6 @@ package com.hbm.tileentity.machine.rbmk; import api.hbm.fluid.IFluidStandardReceiver; import com.hbm.blocks.machine.rbmk.RBMKBase; -import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.TileEntityLoadedBase; @@ -13,12 +11,12 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityRBMKInlet extends TileEntityLoadedBase implements IFluidAcceptor, IFluidStandardReceiver { +public class TileEntityRBMKInlet extends TileEntityLoadedBase implements IFluidStandardReceiver { public FluidTank water; public TileEntityRBMKInlet() { - water = new FluidTank(Fluids.WATER, 32000, 0); + water = new FluidTank(Fluids.WATER, 32000); } @Override @@ -63,33 +61,6 @@ public class TileEntityRBMKInlet extends TileEntityLoadedBase implements IFluidA this.water.writeToNBT(nbt, "tank"); } - @Override - public void setFillForSync(int fill, int index) { - if(index == 0) water.setFill(fill); - } - - @Override - public void setFluidFill(int fill, FluidType type) { - if(type == Fluids.WATER) water.setFill(fill); - } - - @Override - public void setTypeForSync(FluidType type, int index) { - if(index == 0) water.setTankType(type); - } - - @Override - public int getFluidFill(FluidType type) { - if(type == Fluids.WATER) return water.getFill(); - return 0; - } - - @Override - public int getMaxFluidFill(FluidType type) { - if(type == Fluids.WATER) return water.getMaxFill(); - return 0; - } - @Override public FluidTank[] getAllTanks() { return new FluidTank[] {water}; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java index 2c047cfd1..259ac0b4c 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKOutlet.java @@ -1,16 +1,9 @@ package com.hbm.tileentity.machine.rbmk; -import java.util.ArrayList; -import java.util.List; - import api.hbm.fluid.IFluidStandardSender; import com.hbm.blocks.machine.rbmk.RBMKBase; -import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; -import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityLoadedBase; import net.minecraft.block.Block; @@ -18,13 +11,12 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityRBMKOutlet extends TileEntityLoadedBase implements IFluidSource, IFluidStandardSender { +public class TileEntityRBMKOutlet extends TileEntityLoadedBase implements IFluidStandardSender { - public List list = new ArrayList(); public FluidTank steam; public TileEntityRBMKOutlet() { - steam = new FluidTank(Fluids.SUPERHOTSTEAM, 32000, 0); + steam = new FluidTank(Fluids.SUPERHOTSTEAM, 32000); } @Override @@ -53,8 +45,7 @@ public class TileEntityRBMKOutlet extends TileEntityLoadedBase implements IFluid } } - fillFluidInit(this.steam.getTankType()); - this.sendFluidToAll(steam, this); + fillFluidInit(); } } @@ -70,49 +61,9 @@ public class TileEntityRBMKOutlet extends TileEntityLoadedBase implements IFluid this.steam.writeToNBT(nbt, "tank"); } - @Override - public void setFillForSync(int fill, int index) { - steam.setFill(fill); - } - - @Override - public void setFluidFill(int fill, FluidType type) { - steam.setFill(fill); - } - - @Override - public void setTypeForSync(FluidType type, int index) { - steam.setTankType(type); - } - - @Override - public int getFluidFill(FluidType type) { - return steam.getFill(); - } - - @Override - public void fillFluidInit(FluidType type) { + public void fillFluidInit() { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - fillFluid(this.xCoord + dir.offsetX, this.yCoord + dir.offsetY, this.zCoord + dir.offsetZ, getTact(), type); - } - - @Override - public void fillFluid(int x, int y, int z, boolean newTact, FluidType type) { - Library.transmitFluid(x, y, z, newTact, this, worldObj, type); - } - - @Override - @Deprecated - public boolean getTact() { return worldObj.getTotalWorldTime() % 2 == 0; } - - @Override - public List getFluidList(FluidType type) { - return this.list; - } - - @Override - public void clearFluidList(FluidType type) { - this.list.clear(); + this.sendFluid(steam, worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } @Override diff --git a/src/main/resources/assets/hbm/textures/gui/reactors/gui_pwr.png b/src/main/resources/assets/hbm/textures/gui/reactors/gui_pwr.png index 7542ad6f4ada12ae6a2c872924702b579bfaf4b1..6910df3ee915d9ac2b1ce46a822bff5d4b139ab1 100644 GIT binary patch literal 5927 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 Wk;YT9wAa}H0000| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hen237.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hen237.png new file mode 100644 index 0000000000000000000000000000000000000000..64228fb58cafece96f6e4ffa2c1517860b61cf5d GIT binary patch literal 412 zcmV;N0b~A&P)`)aJ+ABGx-PTXtTewgFquqbu~=ZO zy?DRhXFi`lEPi9-@mPAjo&Y!AYPDoA7)a5Zw<2-3+c6rA?)2esh_$w`c%?{`rm)>^ z(OPr;N9*;PNJYOt>ZWjDpg1#oTD?1W`i_O zp9cYSJ~~t@Rq{M1%QNC6MwD)7uEWF-uc!(D0000P)Nklb;@5JlhEV1fieoP~~xjx%r+?m$6JwHKhH<_6q=f&z&K z3oiz24ECf7g0LW2Ns*DJ`7`_GYiAe!TgbbjF-EuBEnyfEh9Q&5xH(^23d8;yqcdOdZW@m%6&vtck8Jn8*@pE!=4!z(WF;wkI( z8e1mRb162!QZ!Npsj=i-U;+WI%NSY)B>VDWBfP#J}fH6h_^@x6e0u>gEg_Cr1Bp`D4 x_r~L~)YKzTk7^+VD$M8e_y6qP&9CAwAYUSqzfT~IpDh3Y002ovPDHLkV1jJ~ut)#^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hep241.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hep241.png new file mode 100644 index 0000000000000000000000000000000000000000..2a99abe38a9ef3e1e39439807765c45a2c99a1ad GIT binary patch literal 418 zcmV;T0bTxyP)b<842C}^5LyX}xJ7q1CN|E%QMdyGGt;{O8#6ax@4&!- z#6mu-syChOeS}m-`HR<(0046z>U}Ib?tV$>U!h3g6s8~e!u@C-s|;<1P&tmQq9IqdhONkX9R!~RqRdT{__j0EZt zeFFt5%;$3_>1##;B3FNJG#W`wJp%Qp7DAxHY&N_9&#u+{%KifK0hfNq{ZpJX-~a#s M07*qoM6N<$f{VJlc>n+a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hes326.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hes326.png new file mode 100644 index 0000000000000000000000000000000000000000..d659fdd2fd0c54d2e31c22affa403e221d57822d GIT binary patch literal 431 zcmV;g0Z{&lP)fn-I}3vbrplxNJ2n@NxU6Oi{g#g(xC^=@;m2#=Wx$C@ZZch7ZgIM^?FSdMMP1= zWHPDDuMCXGV>O%2NYnJ&JDm>G>GW*zBO4Bf%JV!09C^K7SKV$`>E4(+ak*SF7z|GI zUav=*rrP4RPJFz%!FhW_2*KeW&F6E1b{m4=GLYrE__wz>udl>$OdQ7~Ny3ZgL6%+K zk?p$Jmc>KAPqtc-Nl7Lp#%>3-+T|dCTC<4_6sCyeu!c ZkPlbzw)NRTgn|G7002ovPDHLkV1igb!#Mx| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.hes327.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.hes327.png new file mode 100644 index 0000000000000000000000000000000000000000..7a1f8df9883e8205beceed32f6f0e5d60b3419ff GIT binary patch literal 434 zcmV;j0ZsmiP)QSjf)S``#RXwUPIQX-|K*=(lf zrv@60hVFDaD5XBVR4UPGwN^I&VzpXL7mGy=d~w^hb-7&DrkadN?Dcw7tJQCMrBXpD zWo*7_5@#3ZygWW5gkbrOy4^1E=`lFYdLX+{V3Eu7^zcLw1O!1q7>2x^ov<~XtUuB2 zet|3&6!I+OkeNRu84k(L=OoE^eGtIj;Q`xPGuzl;lCc=;1&isF$o(M*Aa``c#Ii`x zjOH_9*Gw{t`3EjareH=ziV>8Hjw9U(FqFf%o-zOY+C{Hr-eUdQ3 zzP(SMNQ3@x03n2xajx+DuSD*ESV~5Iz|PGbj^h|t#QFePhP|uT>w5VgwcG90d$v5y cuk0@%@0pRus}j4>O8@`>07*qoM6N<$f~1ngga7~l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.heu233.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.heu233.png new file mode 100644 index 0000000000000000000000000000000000000000..8961cc6363c24c7cb1b732a113ee6778464de80b GIT binary patch literal 433 zcmV;i0Z#sjP)9#~-6F!m;)|)j!;C>dQ zY)wyfYQl1{Ob6LV>{bD^j)_!s5ImdBQ$bk(@vwj4uTKi!_X&fLNJZ$W=IzZepUs)R zy6@<#Bd}WqkWz}5aYzt^M9~zjV@zy_o?`}sfpcwQ3lffh*J`!w?j7}dz2pCEx0_$d bUqC(qE854iDfK}300000NkvXXu0mjfhcv}Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.heu235.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.heu235.png new file mode 100644 index 0000000000000000000000000000000000000000..c80a207b0fafb1e1332017dd76ede97d9c56aa55 GIT binary patch literal 419 zcmV;U0bKrxP)=7zm1#W6)92aR!b;#{oD2)m{M6a1Cxi zK|w@j!8aHiR8*3@b>V~cTZ#>r$tqtUpq*Xwn(*4E@1o3Z>> zWIP@tgy6JC!{HFW{QPrJKA*$!T}Go3N-305#BogFHOF?lxdG(o@mvq%!$UU1{gcPt zqswl;!}aXFwt@f(#R9J5;y7ST!amuv-ELT~SGR!xN-rf6lW<55?Dji?z+M)lOij&H zYQTE6z5%3SA{kxS7mH;o$XeR;UE=#bVGt6@2sKm8=bGhW$!u!hBNxDcIVykv$C~IPW-u67$L1VCj^*xJt(H06qh7Cf{mxE*^DFra$QQY}zX$mFAJ_l@ N002ovPDHLkV1iD&zDocA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.mea.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.mea.png new file mode 100644 index 0000000000000000000000000000000000000000..90305870db415327424c5da962d9fd6be9cbed1f GIT binary patch literal 431 zcmV;g0Z{&lP)P6LJ@Cfs^}27j+dfnig~a7@Nw?cQ&^w(D z&beUovygau-e9p)L0gr-G73gCvfb&*vCpFvei5<>u1`+cG|VqA!;X zM6E_5K<@;)@R-806KgiX4OM^uu95^FM?@YdOZ;v}5yfn>{CyyRZ(pwvww6@u1Ks5r*(N+y@M!nBB{7-@m7=uf>Dgje4wvWr+J-?9 zzz@8CbpR=)xLau+l|mVfwidfu@w3R7PN%^yB3?n?5eEtVe&6rEqw#or{GaVl^C9~e ZkUz7B%YO_Apwa*U002ovPDHLkV1fdI!5shq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.men.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.men.png new file mode 100644 index 0000000000000000000000000000000000000000..c21db4157bc81194a7980fa73e2cfd885b0d35c4 GIT binary patch literal 429 zcmV;e0aE^nP)GPPR9<1L+hIHUE+SfXFMK%&_|;YT5G3y z=n{Y4|6sSh`+agg1Ej zG(k=6S5y>GwY0R?g8=UC?+E+=OUqOH#PL|;hdu{$_%{&1!|#U|NOPpDN=#wS_Bt<@ zrPb%L00000NkvXXu0mjfJv6>d literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.mep.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.mep.png new file mode 100644 index 0000000000000000000000000000000000000000..1d1334635620d17b9f7a97f35fde08d0709662ab GIT binary patch literal 414 zcmV;P0b%}$P)Z4A>a#Ns$DBSR*+~kt=O;XZFl!@4|nRdR6p1Pqy1FzVGAvKGW$mvp=&i9*<={ zpA!VZ?X=r%X0zGL;SU-Phtg`b1b8^rYE?R&j@a%vHgmJt(ChV{{BE~P5CqoY1)F(s zg!Ouj=Xu<}(Q>&YR@Q~=plYo~tWs916{C!oc=eRm^e7ytkO07*qo IM6N<$f-4-cp8x;= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.meu.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.meu.png new file mode 100644 index 0000000000000000000000000000000000000000..ca1e8e89e9696083d76ebb4883d6b46e35b135ef GIT binary patch literal 422 zcmV;X0a^ZuP)>Yo$`5)9G9+ej<%V!<5Tq1Dt3klQGq5)!1@en{hlIQ?J+0?6q1At+lmy+GZ@h z6c~+02q8G0(O@vZD?R=kl*?stJeT2ch*Aor6j2nBf6lVmtgirhIZ|#4q zn|qh-Zi}0;&)NzC$QSasj*H`fF)_P%$7Zu;wOU>W0w_KeiA~Ht-m~3p@qK$+kgzp1 zRf!3!dc?5nyC_~g#F`H=?^99q1{f=CKH;g$bfDpp@ z90mA(Kp0L@Dndt^@FSw%?_1aA96+x)X93M-(;VMXx7)q^&yHX7EBOn^7r(E>Gu-lR QN&o-=07*qoM6N<$g8PZGMF0Q* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel.mox.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel.mox.png new file mode 100644 index 0000000000000000000000000000000000000000..59d0a64a2fb0be0f2c930c34f446911e60fd6e59 GIT binary patch literal 414 zcmV;P0b%}$P)FzfXiDJ4=$Mx#+-eqmrR7?{aq zLKuc8wOTF4-Dbuolb`^46V(}HfOc= z#B#Yr2*LS|=JPoZ&y}BpYA-ch$7Qitpp-%>h41@Ryho1O`m$nBxm3mhbe>YpQ<6M| z%*7O}+6n@wzt$4>MuS-ZaI!ng9R*07*qo IM6N<$f))d`sQ>@~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel_base.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel_base.png new file mode 100644 index 0000000000000000000000000000000000000000..9d614943b17da6e1230962e058ae2371d60efae9 GIT binary patch literal 422 zcmV;X0a^ZuP)6Hq%?_I@LFc|f5JCs(AOv~t=q>2n2k_suzBj_s{biX6A+e7MXQLAw(Jk0a8k& zl(gIJmHjIVtyU}T^?E3!zE!DI=yW=3&6lFlXr$$GIR%#Fx^7ynR#V$d)|MO&ht%u! zANg9XhEmFE?%0wCXMJApO9&xYyraQjK>2clf4(7TcQ223ddG9WL>PvIVMr839A3PT zde#v;$n_kY0u+yLh_xY_Cn%jjF^}H1a_k_09nT@R1$mt%H#6jP23-KHliz^=iY13+ z2Ifn8W>)rEUu_z#9{5o96Inr%@f>A=y~hdDz;0p%J$8?fBTXC{RAiV&hPT)d2Xp+Z z-OWKlh|JUN3FDDQjx>|;oN#P-xZcP2ed~&>-J52!nJ)gLZnwMnp8a`z0(ii&Q%dwW QaR2}S07*qoM6N<$f^vSgN&o-= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/pwr_fuel_depleted.png b/src/main/resources/assets/hbm/textures/items/pwr_fuel_depleted.png new file mode 100644 index 0000000000000000000000000000000000000000..cb2b2d545e76b30c2713def15febd44e906d9498 GIT binary patch literal 373 zcmV-*0gC>KP)U5Ji7rffPZa%`u{MDNwqcfuqpn0GuF|FM!g(1?W*O zklsx!IikVFBX6}RXiY?_-I0Ft$MZ&-@c{oVR_~IGG5dHtAcTMr0+-8W_Wf+4C<#lgRVj?)Q5OV4}@tV~@w9b=7z-lXH$N%YON%(+OSIIh%jE%-ijT zBuT&+!|ROh_xop{FbvT&4U!~*loC=(JfBZ+&JhH`a!?dSAR^Rt4I&y91OYtHISn`H z2j=@ehzQ0Q5D`4jgE8ha5CE*#YZznT`#y{@vk+irYf7ovf?*hzgS6I8nAZ9;&~CSb zQVM$FXHJ!`lG_d5!WKtIj1#QaNHHoh4QYw{J z^kT7yQp#97ZW8aaAJ|`M9LHhtk9xfxPuD{(UN!_-X{aV%dH75tr9?`J=XpF{xmf$g zhRh(2Pp}dJw~1#s4LkP8Fcq{IfscEPh$rwSA>t3l;bT#`9!SB?{ vom0Bqt}$or-PG%Ky|_oMR%`P+`*ZsSfJBuSjPOT500000NkvXXu0mjf=7*-Y literal 0 HcmV?d00001 From 033285382232d1eb21e6c9c19b133d4630fc37b9 Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 16 Aug 2023 20:56:57 +0200 Subject: [PATCH 07/14] PWR GUI work, error messages, pre-calculation --- .../blocks/machine/MachinePWRController.java | 49 ++++++-- .../java/com/hbm/inventory/fluid/Fluids.java | 3 +- .../inventory/fluid/trait/FT_Heatable.java | 3 +- .../java/com/hbm/inventory/gui/GUIPWR.java | 30 ++++- .../machine/TileEntityPWRController.java | 118 ++++++++++++++++++ 5 files changed, 186 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java index 40c6748ed..f5c2b0ef9 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java @@ -7,6 +7,8 @@ import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; +import com.hbm.packet.AuxParticlePacketNT; +import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.machine.TileEntityPWRController; import com.hbm.util.fauxpointtwelve.BlockPos; @@ -19,7 +21,9 @@ import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; @@ -73,7 +77,7 @@ public class MachinePWRController extends BlockContainer { TileEntityPWRController controller = (TileEntityPWRController) world.getTileEntity(x, y, z); if(!controller.assembled) { - assemble(world, x, y, z); + assemble(world, x, y, z, player); } else { FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); } @@ -89,17 +93,20 @@ public class MachinePWRController extends BlockContainer { private static boolean errored; private static final int maxSize = 1024; - public void assemble(World world, int x, int y, int z) { + public void assemble(World world, int x, int y, int z, EntityPlayer player) { assembly.clear(); + fuelRods.clear(); assembly.put(new BlockPos(x, y, z), this); ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)).getOpposite(); errored = false; - floodFill(world, x + dir.offsetX, y, z + dir.offsetZ); + floodFill(world, x + dir.offsetX, y, z + dir.offsetZ, player); if(fuelRods.size() == 0) errored = true; + TileEntityPWRController controller = (TileEntityPWRController) world.getTileEntity(x, y, z); + if(!errored) { for(Entry entry : assembly.entrySet()) { @@ -122,21 +129,23 @@ public class MachinePWRController extends BlockContainer { pwr.markDirty(); } } + + controller.setup(assembly, fuelRods); } - - TileEntityPWRController controller = (TileEntityPWRController) world.getTileEntity(x, y, z); controller.assembled = !errored; assembly.clear(); + fuelRods.clear(); } - private void floodFill(World world, int x, int y, int z) { + private void floodFill(World world, int x, int y, int z, EntityPlayer player) { BlockPos pos = new BlockPos(x, y, z); if(assembly.containsKey(pos)) return; if(assembly.size() >= maxSize) { errored = true; + sendError(world, x, y, z, "Max size exceeded", player); return; } @@ -150,18 +159,32 @@ public class MachinePWRController extends BlockContainer { if(isValidCore(block)) { assembly.put(pos, block); if(block == ModBlocks.pwr_fuel) fuelRods.put(pos, block); - floodFill(world, x + 1, y, z); - floodFill(world, x - 1, y, z); - floodFill(world, x, y + 1, z); - floodFill(world, x, y - 1, z); - floodFill(world, x, y, z + 1); - floodFill(world, x, y, z - 1); + floodFill(world, x + 1, y, z, player); + floodFill(world, x - 1, y, z, player); + floodFill(world, x, y + 1, z, player); + floodFill(world, x, y - 1, z, player); + floodFill(world, x, y, z + 1, player); + floodFill(world, x, y, z - 1, player); return; } - + + sendError(world, x, y, z, "Non-reactor block", player); errored = true; } + private void sendError(World world, int x, int y, int z, String message, EntityPlayer player) { + + if(player instanceof EntityPlayerMP) { + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "marker"); + data.setInteger("color", 0xff0000); + data.setInteger("expires", 5_000); + data.setDouble("dist", 128D); + if(message != null) data.setString("label", message); + PacketDispatcher.wrapper.sendTo(new AuxParticlePacketNT(data, x, y, z), (EntityPlayerMP) player); + } + } + private boolean isValidCore(Block block) { if(block == ModBlocks.pwr_fuel || block == ModBlocks.pwr_control || block == ModBlocks.pwr_channel || block == ModBlocks.pwr_heatex || block == ModBlocks.pwr_neutron_source) return true; return false; diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index 0c1d523d7..fba8a1b43 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -489,8 +489,9 @@ public class Fluids { HOTOIL.addTraits(new FT_Coolable(OIL, 1, 1, 10).setEff(CoolingType.HEATEXCHANGER, 1.0D)); HOTCRACKOIL.addTraits(new FT_Coolable(CRACKOIL, 1, 1, 10).setEff(CoolingType.HEATEXCHANGER, 1.0D)); - + COOLANT.addTraits(new FT_Heatable().setEff(HeatingType.HEATEXCHANGER, 1.0D).addStep(300, 1, COOLANT_HOT, 1)); + COOLANT.addTraits(new FT_Heatable().setEff(HeatingType.PWR, 1.0D).addStep(300, 1, COOLANT_HOT, 1)); COOLANT_HOT.addTraits(new FT_Coolable(COOLANT, 1, 1, 300).setEff(CoolingType.HEATEXCHANGER, 1.0D)); MUG.addTraits(new FT_Heatable().setEff(HeatingType.HEATEXCHANGER, 1.0D).addStep(400, 1, MUG_HOT, 1)); diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java index 310083cf3..a10192c29 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_Heatable.java @@ -69,7 +69,8 @@ public class FT_Heatable extends FluidTrait { public static enum HeatingType { BOILER("Boilable"), - HEATEXCHANGER("Heatable"); + HEATEXCHANGER("Heatable"), + PWR("PWR Coolant"); public String name; diff --git a/src/main/java/com/hbm/inventory/gui/GUIPWR.java b/src/main/java/com/hbm/inventory/gui/GUIPWR.java index 8715854f1..5e1e18999 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPWR.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPWR.java @@ -4,6 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerPWR; import com.hbm.lib.RefStrings; +import com.hbm.render.util.GaugeUtil; +import com.hbm.render.util.GaugeUtil.Gauge; import com.hbm.tileentity.machine.TileEntityPWRController; import net.minecraft.client.Minecraft; @@ -24,11 +26,29 @@ public class GUIPWR extends GuiInfoContainer { this.ySize = 188; } + @Override + public void drawScreen(int x, int y, float interp) { + super.drawScreen(x, y, interp); + + this.drawCustomInfoStat(x, y, guiLeft + 115, guiTop + 31, 18, 18, x, y, new String[] { "Core: " + String.format("%,d", controller.coreHeat) + " / " + String.format("%,d", controller.coreHeatCapacity) + " TU" }); + this.drawCustomInfoStat(x, y, guiLeft + 151, guiTop + 31, 18, 18, x, y, new String[] { "Hull: " + String.format("%,d", controller.hullHeat) + " / " + String.format("%,d", controller.hullHeatCapacity) + " TU" }); + + int timeLeft = (controller.processTime - controller.progress) / 20; + this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 31, 36, 18, x, y, new String[] { "Cycle: " + (timeLeft / 60) + ":" + String.format("%02d", timeLeft % 60)}); + + controller.tanks[0].renderTankInfo(this, x, y, guiLeft + 8, guiTop + 5, 16, 52); + controller.tanks[1].renderTankInfo(this, x, y, guiLeft + 26, guiTop + 5, 16, 52); + } + @Override protected void drawGuiContainerForegroundLayer(int i, int j) { - String name = this.controller.hasCustomInventoryName() ? this.controller.getInventoryName() : I18n.format(this.controller.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); + + double scale = 1.25; + String flux = String.format("%,.1f", 10000.0D); + GL11.glScaled(1 / scale, 1 / scale, 1); + this.fontRendererObj.drawString(flux, (int) (165 * scale - this.fontRendererObj.getStringWidth(flux)), (int)(64 * scale), 0x00ff00); + GL11.glScaled(scale, scale, 1); } @Override @@ -36,5 +56,11 @@ public class GUIPWR extends GuiInfoContainer { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + if(System.currentTimeMillis() % 1000 < 500) + drawTexturedModalRect(guiLeft + 147, guiTop, 176, 14, 26, 26); + + GaugeUtil.renderGauge(Gauge.ROUND_SMALL, guiLeft + 115, guiTop + 31, this.zLevel, 0.1D); + GaugeUtil.renderGauge(Gauge.ROUND_SMALL, guiLeft + 151, guiTop + 31, this.zLevel, 0.4D); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index f00014765..1e860e007 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -1,22 +1,119 @@ package com.hbm.tileentity.machine; +import java.util.HashMap; +import java.util.Map.Entry; + +import com.hbm.blocks.ModBlocks; import com.hbm.inventory.container.ContainerPWR; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.fluid.trait.FT_Heatable; +import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; import com.hbm.inventory.gui.GUIPWR; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.fauxpointtwelve.BlockPos; +import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class TileEntityPWRController extends TileEntityMachineBase implements IGUIProvider { + public FluidTank[] tanks; + public int coreHeat; + public int coreHeatCapacity; + public int hullHeat; + public int hullHeatCapacity; + public int rodLevel; + public int rodTarget; + public int progress; + public int processTime; + + public int rodCount; + public int connections; + public int connectionsControlled; + public int heatexCount; + public int channelCount; + public int sourceCount; + public boolean assembled; public TileEntityPWRController() { super(3); + + this.tanks = new FluidTank[2]; + this.tanks[0] = new FluidTank(Fluids.COOLANT, 128_000); + this.tanks[1] = new FluidTank(Fluids.COOLANT_HOT, 128_000); + } + + public void setup(HashMap partMap, HashMap rodMap) { + + rodCount = 0; + connections = 0; + connectionsControlled = 0; + heatexCount = 0; + channelCount = 0; + sourceCount = 0; + + int connectionsDouble = 0; + int connectionsControlledDouble = 0; + + for(Entry entry : partMap.entrySet()) { + Block block = entry.getValue(); + + if(block == ModBlocks.pwr_fuel) rodCount++; + if(block == ModBlocks.pwr_heatex) heatexCount++; + if(block == ModBlocks.pwr_channel) channelCount++; + if(block == ModBlocks.pwr_neutron_source) sourceCount++; + } + + for(Entry entry : rodMap.entrySet()) { + BlockPos fuelPos = entry.getKey(); + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + + boolean controlled = false; + + for(int i = 1; i < 16; i++) { + BlockPos checkPos = fuelPos.offset(dir, i); + Block atPos = partMap.get(checkPos); + if(atPos == null || atPos == ModBlocks.pwr_casing) break; + if(atPos == ModBlocks.pwr_control) controlled = true; + if(atPos == ModBlocks.pwr_fuel) { + if(controlled) { + connectionsControlledDouble++; + } else { + connectionsDouble++; + } + break; + } + if(atPos == ModBlocks.pwr_reflector) { + if(controlled) { + connectionsControlledDouble += 2; + } else { + connectionsDouble += 2; + } + break; + } + } + } + } + + connections = connectionsDouble / 2; + connectionsControlled = connectionsControlledDouble / 2; + + System.out.println("Finalized nuclear reactor!"); + System.out.println("Rods: " + rodCount); + System.out.println("Connections: " + connections); + System.out.println("Controlled connections: " + connectionsControlled); + System.out.println("Heatex: " + heatexCount); + System.out.println("Channels: " + channelCount); + System.out.println("Sources: " + sourceCount); } @Override @@ -27,6 +124,27 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG @Override public void updateEntity() { + if(!worldObj.isRemote) { + + this.tanks[0].setType(2, slots); + setupTanks(); + + NBTTagCompound data = new NBTTagCompound(); + tanks[0].writeToNBT(data, "t0"); + tanks[1].writeToNBT(data, "t1"); + } + } + + protected void setupTanks() { + + FT_Heatable trait = tanks[0].getTankType().getTrait(FT_Heatable.class); + + if(trait == null || trait.getEfficiency(HeatingType.PWR) <= 0) { + tanks[0].setTankType(Fluids.NONE); + tanks[1].setTankType(Fluids.NONE); + } + + tanks[1].setTankType(trait.getFirstStep().typeProduced); } @Override From fb97ffc88d3767de85058ef63dc9962f4aaf55ce Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 17 Aug 2023 15:42:53 +0200 Subject: [PATCH 08/14] PWR fuel, atomized primers --- .../blocks/machine/MachinePWRController.java | 6 +- .../java/com/hbm/crafting/WeaponRecipes.java | 94 +++++++++--------- .../java/com/hbm/inventory/gui/GUIPWR.java | 5 +- .../inventory/recipes/AssemblerRecipes.java | 3 - .../inventory/recipes/anvil/AnvilRecipes.java | 5 - src/main/java/com/hbm/items/ModItems.java | 17 ---- .../com/hbm/items/machine/ItemPWRFuel.java | 88 +++++++++++++--- .../java/com/hbm/lib/HbmChestContents.java | 2 - src/main/java/com/hbm/main/MainRegistry.java | 5 + .../hbm/tileentity/TileEntityMachineBase.java | 11 +- .../machine/TileEntityPWRController.java | 48 ++++++++- .../assets/hbm/textures/items/primer_357.png | Bin 186 -> 0 bytes .../assets/hbm/textures/items/primer_44.png | Bin 187 -> 0 bytes .../assets/hbm/textures/items/primer_50.png | Bin 217 -> 0 bytes .../assets/hbm/textures/items/primer_9.png | Bin 186 -> 0 bytes .../hbm/textures/items/primer_buckshot.png | Bin 183 -> 0 bytes 16 files changed, 186 insertions(+), 98 deletions(-) delete mode 100644 src/main/resources/assets/hbm/textures/items/primer_357.png delete mode 100644 src/main/resources/assets/hbm/textures/items/primer_44.png delete mode 100644 src/main/resources/assets/hbm/textures/items/primer_50.png delete mode 100644 src/main/resources/assets/hbm/textures/items/primer_9.png delete mode 100644 src/main/resources/assets/hbm/textures/items/primer_buckshot.png diff --git a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java index f5c2b0ef9..045822100 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java @@ -90,12 +90,14 @@ public class MachinePWRController extends BlockContainer { private static HashMap assembly = new HashMap(); private static HashMap fuelRods = new HashMap(); + private static HashMap sources = new HashMap(); private static boolean errored; private static final int maxSize = 1024; public void assemble(World world, int x, int y, int z, EntityPlayer player) { assembly.clear(); fuelRods.clear(); + sources.clear(); assembly.put(new BlockPos(x, y, z), this); ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)).getOpposite(); @@ -103,7 +105,7 @@ public class MachinePWRController extends BlockContainer { errored = false; floodFill(world, x + dir.offsetX, y, z + dir.offsetZ, player); - if(fuelRods.size() == 0) errored = true; + if(fuelRods.size() == 0 || sources.size() == 0) errored = true; TileEntityPWRController controller = (TileEntityPWRController) world.getTileEntity(x, y, z); @@ -136,6 +138,7 @@ public class MachinePWRController extends BlockContainer { assembly.clear(); fuelRods.clear(); + sources.clear(); } private void floodFill(World world, int x, int y, int z, EntityPlayer player) { @@ -159,6 +162,7 @@ public class MachinePWRController extends BlockContainer { if(isValidCore(block)) { assembly.put(pos, block); if(block == ModBlocks.pwr_fuel) fuelRods.put(pos, block); + if(block == ModBlocks.pwr_neutron_source) sources.put(pos, block); floodFill(world, x + 1, y, z, player); floodFill(world, x - 1, y, z, player); floodFill(world, x, y + 1, z, player); diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index f8f149b7f..b9bb2aba5 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -168,65 +168,65 @@ public class WeaponRecipes { //Ammo assemblies CraftingManager.addRecipeAuto(new ItemStack(ModItems.pellet_flechette, 1), new Object[] { " L ", " L ", "LLL", 'L', PB.nugget() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.pellet_claws, 1), new Object[] { " X ", "X X", " XX", 'X', STEEL.plate() }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_iron, 24), new Object[] { " I", "GC", " P", 'I', IRON.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_357, 'P', ModItems.primer_357 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_iron, 24), new Object[] { " I", "GC", " P", 'I', IRON.ingot(), 'G', ModItems.ballistite, 'C', ModItems.casing_357, 'P', ModItems.primer_357 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_steel, 24), new Object[] { " I", "GC", " P", 'I', PB.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_357, 'P', ModItems.primer_357 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_steel, 24), new Object[] { " I", "GC", " P", 'I', PB.ingot(), 'G', ModItems.ballistite, 'C', ModItems.casing_357, 'P', ModItems.primer_357 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_lead, 24), new Object[] { " I", "GC", " P", 'I', U235.ingot(), 'G', ModItems.cordite, 'C', KEY_CLEARGLASS, 'P', ModItems.primer_357 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_lead, 24), new Object[] { " I", "GC", " P", 'I', PU239.ingot(), 'G', ModItems.cordite, 'C', KEY_CLEARGLASS, 'P', ModItems.primer_357 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_lead, 24), new Object[] { " I", "GC", " P", 'I', ModItems.trinitite, 'G', ModItems.cordite, 'C', KEY_CLEARGLASS, 'P', ModItems.primer_357 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_lead, 24), new Object[] { " I", "GC", " P", 'I', ModItems.nuclear_waste_tiny, 'G', ModItems.cordite, 'C', KEY_CLEARGLASS, 'P', ModItems.primer_357 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_gold, 24), new Object[] { " I", "GC", " P", 'I', GOLD.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_357, 'P', ModItems.primer_357 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_schrabidium, 6), new Object[] { " I ", "GCN", " P ", 'I', SA326.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_357, 'P', ModItems.primer_357, 'N', ModItems.billet_yharonite }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_nightmare, 24), new Object[] { " I", "GC", " P", 'I', W.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_357, 'P', ModItems.primer_357 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_desh, 24), new Object[] { " I", "GC", " P", 'I', DESH.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_357, 'P', ModItems.primer_357 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_smg, 32), new Object[] { " I", "GC", " P", 'I', PB.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_9, 'P', ModItems.primer_9 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_smg, 32), new Object[] { " I", "GC", " P", 'I', PB.ingot(), 'G', ModItems.ballistite, 'C', ModItems.casing_9, 'P', ModItems.primer_9 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_556, 32), new Object[] { " I", "GC", " P", 'I', STEEL.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_9, 'P', ModItems.primer_9 }); - CraftingManager.addRecipeAuto(ModItems.ammo_556.stackFromEnum(30, Ammo556mm.K), new Object[] { "G", "C", "P", 'G', ANY_GUNPOWDER.dust(), 'C', ModItems.casing_9, 'P', ModItems.primer_9 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_uzi, 32), new Object[] { " I", "GC", " P", 'I', IRON.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_9, 'P', ModItems.primer_9 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_uzi, 32), new Object[] { " I", "GC", " P", 'I', IRON.ingot(), 'G', ModItems.ballistite, 'C', ModItems.casing_9, 'P', ModItems.primer_9 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_uzi, 32), new Object[] { " I", "GC", " P", 'I', IRON.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_9, 'P', ModItems.primer_9 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_uzi, 32), new Object[] { " I", "GC", " P", 'I', IRON.ingot(), 'G', ModItems.ballistite, 'C', ModItems.casing_9, 'P', ModItems.primer_9 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_lacunae, 32), new Object[] { " I", "GC", " P", 'I', CU.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_9, 'P', ModItems.primer_9 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_nopip, 24), new Object[] { " I", "GC", " P", 'I', PB.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_44, 'P', ModItems.primer_44 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_nopip, 24), new Object[] { " I", "GC", " P", 'I', PB.ingot(), 'G', ModItems.ballistite, 'C', ModItems.casing_44, 'P', ModItems.primer_44 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_12gauge, 12), new Object[] { " I ", "GCL", " P ", 'I', ModItems.pellet_buckshot, 'G', ModItems.cordite, 'C', ModItems.casing_buckshot, 'P', ModItems.primer_buckshot, 'L', ModItems.plate_polymer }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_12gauge, 12), new Object[] { " I ", "GCL", " P ", 'I', ModItems.pellet_buckshot, 'G', ModItems.ballistite, 'C', ModItems.casing_buckshot, 'P', ModItems.primer_buckshot, 'L', ModItems.plate_polymer }); - CraftingManager.addRecipeAuto(ModItems.ammo_12gauge.stackFromEnum(12, Ammo12Gauge.PERCUSSION), new Object[] { "G", "C", "P", 'G', ModItems.ballistite, 'C', ModItems.casing_buckshot, 'P', ModItems.primer_buckshot }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_4gauge, 12), new Object[] { " I ", "GCL", " P ", 'I', ModItems.pellet_buckshot, 'G', ModItems.cordite, 'C', ModItems.casing_50, 'P', ModItems.primer_50, 'L', ModItems.plate_polymer }); - CraftingManager.addRecipeAuto(ModItems.ammo_4gauge.stackFromEnum(12, Ammo4Gauge.SLUG), new Object[] { " I ", "GCL", " P ", 'I', PB.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_50, 'P', ModItems.primer_50, 'L', ModItems.plate_polymer }); - CraftingManager.addRecipeAuto(ModItems.ammo_4gauge.stackFromEnum(12, Ammo4Gauge.FLECHETTE), new Object[] { " I ", "GCL", " P ", 'I', ModItems.pellet_flechette, 'G', ModItems.cordite, 'C', ModItems.casing_50, 'P', ModItems.primer_50, 'L', ModItems.plate_polymer }); - CraftingManager.addRecipeAuto(ModItems.ammo_4gauge.stackFromEnum(4, Ammo4Gauge.EXPLOSIVE), new Object[] { " I ", "GCL", " P ", 'I', ModBlocks.tnt, 'G', ModItems.cordite, 'C', ModItems.casing_50, 'P', ModItems.primer_50, 'L', ModItems.plate_polymer }); - CraftingManager.addRecipeAuto(ModItems.ammo_4gauge.stackFromEnum(6, Ammo4Gauge.EXPLOSIVE), new Object[] { " I ", "GCL", " P ", 'I', ANY_PLASTICEXPLOSIVE.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_50, 'P', ModItems.primer_50, 'L', ModItems.plate_polymer }); - CraftingManager.addRecipeAuto(ModItems.ammo_4gauge.stackFromEnum(4, Ammo4Gauge.MINING), new Object[] { " I ", "GCL", " P ", 'I', ModBlocks.det_miner, 'G', ModItems.cordite, 'C', ModItems.casing_50, 'P', ModItems.primer_50, 'L', ModItems.plate_polymer }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_iron, 24), new Object[] { " I", "GC", 'I', IRON.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_357 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_iron, 24), new Object[] { " I", "GC", 'I', IRON.ingot(), 'G', ModItems.ballistite, 'C', ModItems.casing_357 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_steel, 24), new Object[] { " I", "GC", 'I', PB.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_357 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_steel, 24), new Object[] { " I", "GC", 'I', PB.ingot(), 'G', ModItems.ballistite, 'C', ModItems.casing_357 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_lead, 24), new Object[] { " I", "GC", 'I', U235.ingot(), 'G', ModItems.cordite, 'C', KEY_CLEARGLASS }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_lead, 24), new Object[] { " I", "GC", 'I', PU239.ingot(), 'G', ModItems.cordite, 'C', KEY_CLEARGLASS }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_lead, 24), new Object[] { " I", "GC", 'I', ModItems.trinitite, 'G', ModItems.cordite, 'C', KEY_CLEARGLASS }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_lead, 24), new Object[] { " I", "GC", 'I', ModItems.nuclear_waste_tiny, 'G', ModItems.cordite, 'C', KEY_CLEARGLASS }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_gold, 24), new Object[] { " I", "GC", 'I', GOLD.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_357 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_schrabidium, 6), new Object[] { " I ", "GCN", 'I', SA326.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_357, 'N', ModItems.billet_yharonite }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_nightmare, 24), new Object[] { " I", "GC", 'I', W.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_357 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_desh, 24), new Object[] { " I", "GC", 'I', DESH.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_357 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_smg, 32), new Object[] { " I", "GC", 'I', PB.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_9 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_smg, 32), new Object[] { " I", "GC", 'I', PB.ingot(), 'G', ModItems.ballistite, 'C', ModItems.casing_9 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_556, 32), new Object[] { " I", "GC", 'I', STEEL.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_9 }); + CraftingManager.addRecipeAuto(ModItems.ammo_556.stackFromEnum(30, Ammo556mm.K), new Object[] { "G", "C", 'G', ANY_GUNPOWDER.dust(), 'C', ModItems.casing_9 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_uzi, 32), new Object[] { " I", "GC", 'I', IRON.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_9 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_uzi, 32), new Object[] { " I", "GC", 'I', IRON.ingot(), 'G', ModItems.ballistite, 'C', ModItems.casing_9 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_uzi, 32), new Object[] { " I", "GC", 'I', IRON.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_9 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_uzi, 32), new Object[] { " I", "GC", 'I', IRON.ingot(), 'G', ModItems.ballistite, 'C', ModItems.casing_9 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_lacunae, 32), new Object[] { " I", "GC", 'I', CU.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_9 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_nopip, 24), new Object[] { " I", "GC", 'I', PB.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_44 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_nopip, 24), new Object[] { " I", "GC", 'I', PB.ingot(), 'G', ModItems.ballistite, 'C', ModItems.casing_44 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_12gauge, 12), new Object[] { " I ", "GCL", 'I', ModItems.pellet_buckshot, 'G', ModItems.cordite, 'C', ModItems.casing_buckshot, 'L', ModItems.plate_polymer }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_12gauge, 12), new Object[] { " I ", "GCL", 'I', ModItems.pellet_buckshot, 'G', ModItems.ballistite, 'C', ModItems.casing_buckshot, 'L', ModItems.plate_polymer }); + CraftingManager.addRecipeAuto(ModItems.ammo_12gauge.stackFromEnum(12, Ammo12Gauge.PERCUSSION), new Object[] { "G", "C", 'G', ModItems.ballistite, 'C', ModItems.casing_buckshot }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_4gauge, 12), new Object[] { " I ", "GCL", 'I', ModItems.pellet_buckshot, 'G', ModItems.cordite, 'C', ModItems.casing_50, 'L', ModItems.plate_polymer }); + CraftingManager.addRecipeAuto(ModItems.ammo_4gauge.stackFromEnum(12, Ammo4Gauge.SLUG), new Object[] { " I ", "GCL", 'I', PB.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_50, 'L', ModItems.plate_polymer }); + CraftingManager.addRecipeAuto(ModItems.ammo_4gauge.stackFromEnum(12, Ammo4Gauge.FLECHETTE), new Object[] { " I ", "GCL", 'I', ModItems.pellet_flechette, 'G', ModItems.cordite, 'C', ModItems.casing_50, 'L', ModItems.plate_polymer }); + CraftingManager.addRecipeAuto(ModItems.ammo_4gauge.stackFromEnum(4, Ammo4Gauge.EXPLOSIVE), new Object[] { " I ", "GCL", 'I', ModBlocks.tnt, 'G', ModItems.cordite, 'C', ModItems.casing_50, 'L', ModItems.plate_polymer }); + CraftingManager.addRecipeAuto(ModItems.ammo_4gauge.stackFromEnum(6, Ammo4Gauge.EXPLOSIVE), new Object[] { " I ", "GCL", 'I', ANY_PLASTICEXPLOSIVE.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_50, 'L', ModItems.plate_polymer }); + CraftingManager.addRecipeAuto(ModItems.ammo_4gauge.stackFromEnum(4, Ammo4Gauge.MINING), new Object[] { " I ", "GCL", 'I', ModBlocks.det_miner, 'G', ModItems.cordite, 'C', ModItems.casing_50, 'L', ModItems.plate_polymer }); CraftingManager.addShapelessAuto(ModItems.ammo_4gauge.stackFromEnum(Ammo4Gauge.QUACK), new Object[] { ModItems.ammo_4gauge, ModItems.nugget_bismuth, ModItems.nugget_tantalium, ModItems.ball_dynamite }); - CraftingManager.addRecipeAuto(ModItems.ammo_20gauge.stackFromEnum(12, Ammo20Gauge.STOCK), new Object[] { " I ", "GCL", " P ", 'I', ModItems.pellet_buckshot, 'G', ANY_SMOKELESS.dust(), 'C', ModItems.casing_buckshot, 'P', ModItems.primer_buckshot, 'L', CU.plate() }); - CraftingManager.addRecipeAuto(ModItems.ammo_20gauge.stackFromEnum(12, Ammo20Gauge.SLUG), new Object[] { " I ", "GCL", " P ", 'I', PB.ingot(), 'G', ANY_SMOKELESS.dust(), 'C', ModItems.casing_buckshot, 'P', ModItems.primer_buckshot, 'L', CU.plate() }); - CraftingManager.addRecipeAuto(ModItems.ammo_20gauge.stackFromEnum(12, Ammo20Gauge.EXPLOSIVE), new Object[] { " I ", "GCL", " P ", 'I', ModItems.pellet_cluster, 'G', ANY_SMOKELESS.dust(), 'C', ModItems.casing_buckshot, 'P', ModItems.primer_buckshot, 'L', CU.plate() }); - CraftingManager.addRecipeAuto(ModItems.ammo_20gauge.stackFromEnum(20, Ammo20Gauge.FLECHETTE), new Object[] { " I ", "GCL", " P ", 'I', ModItems.pellet_flechette, 'G', ANY_SMOKELESS.dust(), 'C', ModItems.casing_buckshot, 'P', ModItems.primer_buckshot, 'L', CU.plate() }); - CraftingManager.addRecipeAuto(ModItems.ammo_357.stackFromEnum(6, Ammo357Magnum.NIGHTMARE2), new Object[] { "I", "C", "P", 'I', ModItems.powder_power, 'C', ModItems.casing_buckshot, 'P', ModItems.primer_buckshot }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_calamity, 12), new Object[] { " I ", "GCG", " P ", 'I', PB.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_50, 'P', ModItems.primer_50 }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_actionexpress, 12), new Object[] { " I", "GC", " P", 'I', PB.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_50, 'P', ModItems.primer_50 }); + CraftingManager.addRecipeAuto(ModItems.ammo_20gauge.stackFromEnum(12, Ammo20Gauge.STOCK), new Object[] { " I ", "GCL", 'I', ModItems.pellet_buckshot, 'G', ANY_SMOKELESS.dust(), 'C', ModItems.casing_buckshot, 'L', CU.plate() }); + CraftingManager.addRecipeAuto(ModItems.ammo_20gauge.stackFromEnum(12, Ammo20Gauge.SLUG), new Object[] { " I ", "GCL", 'I', PB.ingot(), 'G', ANY_SMOKELESS.dust(), 'C', ModItems.casing_buckshot, 'L', CU.plate() }); + CraftingManager.addRecipeAuto(ModItems.ammo_20gauge.stackFromEnum(12, Ammo20Gauge.EXPLOSIVE), new Object[] { " I ", "GCL", 'I', ModItems.pellet_cluster, 'G', ANY_SMOKELESS.dust(), 'C', ModItems.casing_buckshot, 'L', CU.plate() }); + CraftingManager.addRecipeAuto(ModItems.ammo_20gauge.stackFromEnum(20, Ammo20Gauge.FLECHETTE), new Object[] { " I ", "GCL", 'I', ModItems.pellet_flechette, 'G', ANY_SMOKELESS.dust(), 'C', ModItems.casing_buckshot, 'L', CU.plate() }); + CraftingManager.addRecipeAuto(ModItems.ammo_357.stackFromEnum(6, Ammo357Magnum.NIGHTMARE2), new Object[] { "I", "C", 'I', ModItems.powder_power, 'C', ModItems.casing_buckshot }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_calamity, 12), new Object[] { " I ", "GCG", 'I', PB.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_50 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_actionexpress, 12), new Object[] { " I", "GC", 'I', PB.ingot(), 'G', ModItems.cordite, 'C', ModItems.casing_50 }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_nuke, 1), new Object[] { " WP", "SEP", " WP", 'W', ModItems.wire_aluminium, 'P', STEEL.plate(), 'S', ModItems.hull_small_steel, 'E', ANY_HIGHEXPLOSIVE.ingot() }); CraftingManager.addRecipeAuto(ModItems.ammo_dart.stackFromEnum(16, AmmoDart.GPS), new Object[] { "IPI", "ICI", "IPI", 'I', ModItems.plate_polymer, 'P', IRON.plate(), 'C', new ItemStack(ModItems.fluid_tank_lead_full, 1, Fluids.WATZ.getID()) }); CraftingManager.addRecipeAuto(ModItems.ammo_dart.stackFromEnum(16, AmmoDart.NERF), new Object[] { "I", "I", 'I', ModItems.plate_polymer }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_45, 32), " I", "GC", " P", 'I', CU.ingot(), 'G', ANY_SMOKELESS.dust(), 'C', ModItems.casing_44, 'P', ModItems.primer_44); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_762, 32), " I", "GC", " P", 'I', CU.ingot(), 'G', ANY_SMOKELESS.dust(), 'C', ModItems.casing_50, 'P', ModItems.primer_9); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_45, 32), " I", "GC", 'I', CU.ingot(), 'G', ANY_SMOKELESS.dust(), 'C', ModItems.casing_44); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_762, 32), " I", "GC", 'I', CU.ingot(), 'G', ANY_SMOKELESS.dust(), 'C', ModItems.casing_50); CraftingManager.addRecipeAuto(new ItemStack(ModItems.assembly_luna, 4), new Object[] { " B ", "GCG", "GPG", 'B', FERRO.ingot(), 'G', ModItems.powder_nitan_mix, 'C', ModItems.casing_50, 'P', ModItems.powder_power}); //Folly shells CraftingManager.addRecipeAuto(new ItemStack(ModItems.folly_bullet, 1), new Object[] { " S ", "STS", "SMS", 'S', STAR.ingot(), 'T', ModItems.powder_magic, 'M', ModBlocks.block_meteor }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.folly_bullet_nuclear, 1), new Object[] { " N ", "UTU", "UTU", 'N', ModItems.ammo_nuke, 'U', IRON.ingot(), 'T', W.block() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.folly_bullet_du, 1), new Object[] { " U ", "UDU", "UTU", 'U', U238.block(), 'D', DESH.block(), 'T', W.block() }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.folly_shell, 1), new Object[] { "IPI", "IPI", "IMI", 'I', IRON.ingot(), 'P', IRON.plate(), 'M', ModItems.primer_50 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.folly_shell, 1), new Object[] { "IPI", "IPI", "IMI", 'I', IRON.ingot(), 'P', IRON.plate(), 'M', ANY_SMOKELESS.dust() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_folly, 1), new Object[] { " B ", "MEM", " S ", 'B', ModItems.folly_bullet, 'M', ModItems.powder_magic, 'E', ModItems.powder_power, 'S', ModItems.folly_shell }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_folly_nuclear, 1), new Object[] { " B ", "EEE", " S ", 'B', ModItems.folly_bullet_nuclear, 'E', ModBlocks.det_charge, 'S', ModItems.folly_shell }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_folly_du, 1), new Object[] { " B ", "EEE", " S ", 'B', ModItems.folly_bullet_du, 'E', ModBlocks.det_charge, 'S', ModItems.folly_shell }); //Rockets - CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_rocket, 1), new Object[] { " T ", "GCG", " P ", 'T', ModItems.ball_dynamite, 'G', ModItems.rocket_fuel, 'C', ModItems.hull_small_aluminium, 'P', ModItems.primer_50 });// I got tired of changing *all* of them, the stock one is always the first one anyway - CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_rocket, 2), new Object[] { " T ", "GCG", " P ", 'T', ANY_PLASTICEXPLOSIVE.ingot(), 'G', ModItems.rocket_fuel, 'C', ModItems.hull_small_aluminium, 'P', ModItems.primer_50 }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_rocket, 1), new Object[] { "T", "C", "G", 'T', ModItems.ball_dynamite, 'G', ModItems.rocket_fuel, 'C', ModItems.hull_small_aluminium, });// I got tired of changing *all* of them, the stock one is always the first one anyway + CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_rocket, 2), new Object[] { "T", "C", "G", 'T', ANY_PLASTICEXPLOSIVE.ingot(), 'G', ModItems.rocket_fuel, 'C', ModItems.hull_small_aluminium }); CraftingManager.addRecipeAuto(ModItems.ammo_rocket.stackFromEnum(AmmoRocket.HE), new Object[] { "G", "R", 'G', ANY_PLASTICEXPLOSIVE.ingot(), 'R', ModItems.ammo_rocket }); CraftingManager.addRecipeAuto(ModItems.ammo_rocket.stackFromEnum(AmmoRocket.INCENDIARY), new Object[] { "G", "R", 'G', P_RED.dust(), 'R', ModItems.ammo_rocket }); CraftingManager.addRecipeAuto(ModItems.ammo_rocket.stackFromEnum(AmmoRocket.PHOSPHORUS), new Object[] { "G", "R", 'G', P_WHITE.ingot(), 'R', ModItems.ammo_rocket }); @@ -245,15 +245,15 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(ModItems.ammo_rocket.stackFromEnum(2, AmmoRocket.RPC), new Object[] { "BP ", "CBH", " DR", 'B', ModItems.blades_steel, 'P', STEEL.plate(), 'C', Fluids.BIOFUEL.getDict(1000), 'H', ModItems.hull_small_steel, 'D', ModItems.piston_selenium, 'R', ModItems.ammo_rocket }); //Stinger Rockets - CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_stinger_rocket, 2), "CE ", "FSF", " P ", 'C', ModItems.circuit_aluminium, 'E', ANY_PLASTICEXPLOSIVE.ingot(), 'F', ModItems.rocket_fuel, 'S', ModItems.hull_small_aluminium, 'P', ModItems.primer_50); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_stinger_rocket, 2), "CE ", " S ", " F ", 'C', ModItems.circuit_aluminium, 'E', ANY_PLASTICEXPLOSIVE.ingot(), 'F', ModItems.rocket_fuel, 'S', ModItems.hull_small_aluminium); CraftingManager.addRecipeAuto(ModItems.ammo_stinger_rocket.stackFromEnum(AmmoStinger.HE), new Object[] { "S", "R", 'S', ANY_PLASTICEXPLOSIVE.ingot(), 'R', ModItems.ammo_stinger_rocket }); CraftingManager.addRecipeAuto(ModItems.ammo_stinger_rocket.stackFromEnum(AmmoStinger.INCENDIARY), new Object[] { "S", "R", 'S', P_RED.dust(), 'R', ModItems.ammo_stinger_rocket }); CraftingManager.addRecipeAuto(ModItems.ammo_stinger_rocket.stackFromEnum(AmmoStinger.NUCLEAR), new Object[] { "RPR", "PSP", "RPR", 'R', ModItems.neutron_reflector, 'P', PU239.nugget(), 'S', ModItems.ammo_stinger_rocket.stackFromEnum(AmmoStinger.HE) }); CraftingManager.addRecipeAuto(ModItems.ammo_stinger_rocket.stackFromEnum(AmmoStinger.BONES), new Object[] { " C ", "SKR", " P ", 'C', ModItems.fallout, 'S', SR90.dust(), 'K', ModItems.ammo_stinger_rocket, 'R', RA226.dust(), 'P', PU.dust() }); //40mm grenades - CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_grenade, 2), new Object[] { " T ", "GCI", " P ", 'T', ANY_HIGHEXPLOSIVE.ingot(), 'G', ANY_SMOKELESS.dust(), 'C', ModItems.casing_50, 'P', ModItems.primer_50, 'I', IRON.plate() }); - CraftingManager.addRecipeAuto(ModItems.ammo_grenade.stackFromEnum(2, AmmoGrenade.TRACER), new Object[] { " T ", "GCI", " P ", 'T', LAPIS.dust(), 'G', ANY_SMOKELESS.dust(), 'C', ModItems.casing_50, 'P', ModItems.primer_50, 'I', IRON.plate() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.ammo_grenade, 2), new Object[] { " T ", "GCI", 'T', ANY_HIGHEXPLOSIVE.ingot(), 'G', ANY_SMOKELESS.dust(), 'C', ModItems.casing_50, 'I', IRON.plate() }); + CraftingManager.addRecipeAuto(ModItems.ammo_grenade.stackFromEnum(2, AmmoGrenade.TRACER), new Object[] { " T ", "GCI", 'T', LAPIS.dust(), 'G', ANY_SMOKELESS.dust(), 'C', ModItems.casing_50, 'I', IRON.plate() }); CraftingManager.addRecipeAuto(ModItems.ammo_grenade.stackFromEnum(2, AmmoGrenade.HE), new Object[] { "GIG", 'G', ModItems.ammo_grenade, 'I', ANY_PLASTICEXPLOSIVE.ingot() }); CraftingManager.addRecipeAuto(ModItems.ammo_grenade.stackFromEnum(2, AmmoGrenade.INCENDIARY), new Object[] { "GIG", 'G', ModItems.ammo_grenade, 'I', P_RED.dust() }); CraftingManager.addRecipeAuto(ModItems.ammo_grenade.stackFromEnum(2, AmmoGrenade.PHOSPHORUS), new Object[] { "GIG", 'G', ModItems.ammo_grenade, 'I', P_WHITE.ingot() }); diff --git a/src/main/java/com/hbm/inventory/gui/GUIPWR.java b/src/main/java/com/hbm/inventory/gui/GUIPWR.java index 5e1e18999..4c2b04fb5 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPWR.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPWR.java @@ -33,8 +33,9 @@ public class GUIPWR extends GuiInfoContainer { this.drawCustomInfoStat(x, y, guiLeft + 115, guiTop + 31, 18, 18, x, y, new String[] { "Core: " + String.format("%,d", controller.coreHeat) + " / " + String.format("%,d", controller.coreHeatCapacity) + " TU" }); this.drawCustomInfoStat(x, y, guiLeft + 151, guiTop + 31, 18, 18, x, y, new String[] { "Hull: " + String.format("%,d", controller.hullHeat) + " / " + String.format("%,d", controller.hullHeatCapacity) + " TU" }); - int timeLeft = (controller.processTime - controller.progress) / 20; - this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 31, 36, 18, x, y, new String[] { "Cycle: " + (timeLeft / 60) + ":" + String.format("%02d", timeLeft % 60)}); + //TODO: calculate some prediction using extrapolation (or some math sector that ends with -ic) + //int timeLeft = (controller.processTime - controller.progress) / 20; + //this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 31, 36, 18, x, y, new String[] { "Cycle: " + (timeLeft / 60) + ":" + String.format("%02d", timeLeft % 60)}); controller.tanks[0].renderTankInfo(this, x, y, guiLeft + 8, guiTop + 5, 16, 52); controller.tanks[1].renderTankInfo(this, x, y, guiLeft + 26, guiTop + 5, 16, 52); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index 2c37aaa5d..88cbdd9a7 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -626,7 +626,6 @@ public class AssemblerRecipes { makeRecipe(new ComparableStack(ModItems.ammo_75bolt, 2, ItemAmmoEnums.Ammo75Bolt.STOCK.ordinal()), new AStack[] { new OreDictStack(STEEL.plate(), 2), new OreDictStack(CU.plate(), 1), - new ComparableStack(ModItems.primer_50, 5), new ComparableStack(ModItems.casing_50, 5), new OreDictStack(ANY_PLASTICEXPLOSIVE.ingot(), 2), new ComparableStack(ModItems.cordite, 3), @@ -636,7 +635,6 @@ public class AssemblerRecipes { makeRecipe(new ComparableStack(ModItems.ammo_75bolt, 2, ItemAmmoEnums.Ammo75Bolt.INCENDIARY.ordinal()), new AStack[] { new OreDictStack(STEEL.plate(), 2), new OreDictStack(CU.plate(), 1), - new ComparableStack(ModItems.primer_50, 5), new ComparableStack(ModItems.casing_50, 5), new OreDictStack(ANY_PLASTICEXPLOSIVE.ingot(), 3), new ComparableStack(ModItems.cordite, 3), @@ -646,7 +644,6 @@ public class AssemblerRecipes { makeRecipe(new ComparableStack(ModItems.ammo_75bolt, 2, ItemAmmoEnums.Ammo75Bolt.HE.ordinal()), new AStack[] { new OreDictStack(STEEL.plate(), 2), new OreDictStack(CU.plate(), 1), - new ComparableStack(ModItems.primer_50, 5), new ComparableStack(ModItems.casing_50, 5), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 5), new ComparableStack(ModItems.cordite, 5), 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 1a488b9cb..fea2e23b0 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -524,11 +524,6 @@ public class AnvilRecipes { constructionRecipes.add(new AnvilConstructionRecipe(new OreDictStack(CU.plate()), new AnvilOutput(new ItemStack(ModItems.casing_9))).setTier(1)); constructionRecipes.add(new AnvilConstructionRecipe(new OreDictStack(CU.plate()), new AnvilOutput(new ItemStack(ModItems.casing_50))).setTier(1)); constructionRecipes.add(new AnvilConstructionRecipe(new OreDictStack(CU.plate()), new AnvilOutput(new ItemStack(ModItems.casing_buckshot))).setTier(1)); - constructionRecipes.add(new AnvilConstructionRecipe(new AStack[] {new OreDictStack(IRON.plate()), new ComparableStack(Items.redstone)}, new AnvilOutput(new ItemStack(ModItems.primer_357))).setTier(1)); - constructionRecipes.add(new AnvilConstructionRecipe(new AStack[] {new OreDictStack(IRON.plate()), new ComparableStack(Items.redstone)}, new AnvilOutput(new ItemStack(ModItems.primer_44))).setTier(1)); - constructionRecipes.add(new AnvilConstructionRecipe(new AStack[] {new OreDictStack(IRON.plate()), new ComparableStack(Items.redstone)}, new AnvilOutput(new ItemStack(ModItems.primer_9))).setTier(1)); - constructionRecipes.add(new AnvilConstructionRecipe(new AStack[] {new OreDictStack(IRON.plate()), new ComparableStack(Items.redstone)}, new AnvilOutput(new ItemStack(ModItems.primer_50))).setTier(1)); - constructionRecipes.add(new AnvilConstructionRecipe(new AStack[] {new OreDictStack(IRON.plate()), new ComparableStack(Items.redstone)}, new AnvilOutput(new ItemStack(ModItems.primer_buckshot))).setTier(1)); Object[][] recs = new Object[][] { {ModItems.ammo_12gauge.stackFromEnum(20, Ammo12Gauge.STOCK), P_RED.dust(), ModItems.ammo_12gauge.stackFromEnum(20, Ammo12Gauge.INCENDIARY), 2}, diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index a5144423e..ba2d0ba6c 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -609,11 +609,6 @@ public class ModItems { public static Item mechanism_launcher_2; public static Item mechanism_special; - public static Item primer_357; - public static Item primer_44; - public static Item primer_9; - public static Item primer_50; - public static Item primer_buckshot; public static Item casing_357; public static Item casing_44; public static Item casing_9; @@ -3100,11 +3095,6 @@ public class ModItems { mechanism_launcher_1 = new Item().setUnlocalizedName("mechanism_launcher_1").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_5"); mechanism_launcher_2 = new Item().setUnlocalizedName("mechanism_launcher_2").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_6"); mechanism_special = new Item().setUnlocalizedName("mechanism_special").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_7"); - primer_357 = new Item().setUnlocalizedName("primer_357").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":primer_357"); - primer_44 = new Item().setUnlocalizedName("primer_44").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":primer_44"); - primer_9 = new Item().setUnlocalizedName("primer_9").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":primer_9"); - primer_50 = new Item().setUnlocalizedName("primer_50").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":primer_50"); - primer_buckshot = new Item().setUnlocalizedName("primer_buckshot").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":primer_buckshot"); casing_357 = new Item().setUnlocalizedName("casing_357").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":casing_357"); casing_44 = new Item().setUnlocalizedName("casing_44").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":casing_44"); casing_9 = new Item().setUnlocalizedName("casing_9").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":casing_9"); @@ -6179,13 +6169,6 @@ public class ModItems { GameRegistry.registerItem(mechanism_launcher_2, mechanism_launcher_2.getUnlocalizedName()); GameRegistry.registerItem(mechanism_special, mechanism_special.getUnlocalizedName()); - //Primers - GameRegistry.registerItem(primer_357, primer_357.getUnlocalizedName()); - GameRegistry.registerItem(primer_44, primer_44.getUnlocalizedName()); - GameRegistry.registerItem(primer_9, primer_9.getUnlocalizedName()); - GameRegistry.registerItem(primer_50, primer_50.getUnlocalizedName()); - GameRegistry.registerItem(primer_buckshot, primer_buckshot.getUnlocalizedName()); - //Casings GameRegistry.registerItem(casing_357, casing_357.getUnlocalizedName()); GameRegistry.registerItem(casing_44, casing_44.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemPWRFuel.java b/src/main/java/com/hbm/items/machine/ItemPWRFuel.java index 95198f494..7bb6ce158 100644 --- a/src/main/java/com/hbm/items/machine/ItemPWRFuel.java +++ b/src/main/java/com/hbm/items/machine/ItemPWRFuel.java @@ -1,6 +1,15 @@ package com.hbm.items.machine; import com.hbm.items.ItemEnumMulti; +import com.hbm.util.EnumUtil; +import com.hbm.util.function.Function; +import com.hbm.util.function.Function.FunctionLogarithmic; +import com.hbm.util.function.Function.FunctionSqrt; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; public class ItemPWRFuel extends ItemEnumMulti { @@ -9,18 +18,71 @@ public class ItemPWRFuel extends ItemEnumMulti { } public static enum EnumPWRFuel { - MEU, - HEU233, - HEU235, - MEN, - HEN237, - MOX, - MEP, - HEP239, - HEP241, - MEA, - HEA242, - HES326, - HES327; + MEU( 05.0D, new FunctionLogarithmic(25)), + HEU233( 07.5D, new FunctionSqrt(25)), + HEU235( 07.5D, new FunctionSqrt(25)), + MEN( 07.5D, new FunctionLogarithmic(25)), + HEN237( 07.5D, new FunctionSqrt(25)), + MOX( 07.5D, new FunctionLogarithmic(25)), + MEP( 07.5D, new FunctionLogarithmic(25)), + HEP239( 10.0D, new FunctionSqrt(25)), + HEP24( 10.0D, new FunctionSqrt(25)), + MEA( 07.5D, new FunctionLogarithmic(25)), + HEA242( 10.0D, new FunctionSqrt(25)), + HES326( 15.0D, new FunctionSqrt(25)), + HES327( 15.0D, new FunctionSqrt(25)); + + public double yield = 1_000_000_000; + public double heatEmission; + public Function function; + + private EnumPWRFuel(double heatEmission, Function function) { + this.heatEmission = heatEmission; + this.function = function; + } + } + + @Override + public boolean showDurabilityBar(ItemStack stack) { + return getDurabilityForDisplay(stack) > 0D; + } + + @Override + public double getDurabilityForDisplay(ItemStack stack) { + return 1D - getEnrichment(stack); + } + + public static double getEnrichment(ItemStack stack) { + EnumPWRFuel num = EnumUtil.grabEnumSafely(EnumPWRFuel.class, stack.getItemDamage()); + return getYield(stack) / num.yield; + } + + public static double getYield(ItemStack stack) { + return getDouble(stack, "yield"); + } + + public static void setYield(ItemStack stack, double yield) { + setDouble(stack, "yield", yield); + } + + public static void setDouble(ItemStack stack, String key, double yield) { + if(!stack.hasTagCompound()) setNBTDefaults(stack); + stack.stackTagCompound.setDouble(key, yield); + } + + public static double getDouble(ItemStack stack, String key) { + if(!stack.hasTagCompound()) setNBTDefaults(stack); + return stack.stackTagCompound.getDouble(key); + } + + private static void setNBTDefaults(ItemStack stack) { + EnumPWRFuel num = EnumUtil.grabEnumSafely(EnumPWRFuel.class, stack.getItemDamage()); + stack.stackTagCompound = new NBTTagCompound(); + setYield(stack, num.yield); + } + + @Override + public void onCreated(ItemStack stack, World world, EntityPlayer player) { + setNBTDefaults(stack); } } diff --git a/src/main/java/com/hbm/lib/HbmChestContents.java b/src/main/java/com/hbm/lib/HbmChestContents.java index cdd0a61cd..852e84b61 100644 --- a/src/main/java/com/hbm/lib/HbmChestContents.java +++ b/src/main/java/com/hbm/lib/HbmChestContents.java @@ -34,8 +34,6 @@ public class HbmChestContents { new WeightedRandomChestContent(ModItems.ammo_20gauge, 0, 2, 6, 3), new WeightedRandomChestContent(ModItems.casing_9, 0, 4, 10, 3), new WeightedRandomChestContent(ModItems.casing_50, 0, 4, 10, 3), - new WeightedRandomChestContent(ModItems.primer_9, 0, 4, 10, 3), - new WeightedRandomChestContent(ModItems.primer_50, 0, 4, 10, 3), new WeightedRandomChestContent(ModItems.cordite, 0, 4, 6, 5), new WeightedRandomChestContent(ModItems.battery_generic, 0, 1, 1, 4), new WeightedRandomChestContent(ModItems.battery_advanced, 0, 1, 1, 2), diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index bc6e968f7..d17a16610 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1161,6 +1161,11 @@ public class MainRegistry { ignoreMappings.add("hbm:item.canned_kerosene"); ignoreMappings.add("hbm:item.canned_recursion"); ignoreMappings.add("hbm:item.canned_bark"); + ignoreMappings.add("hbm:item.primer_357"); + ignoreMappings.add("hbm:item.primer_44"); + ignoreMappings.add("hbm:item.primer_9"); + ignoreMappings.add("hbm:item.primer_50"); + ignoreMappings.add("hbm:item.primer_buckshot"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java index 988d683b8..58c6d15e0 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityMachineBase.java @@ -102,17 +102,16 @@ public abstract class TileEntityMachineBase extends TileEntityLoadedBase impleme @Override public ItemStack decrStackSize(int slot, int amount) { - if(slots[slot] != null) - { - if(slots[slot].stackSize <= amount) - { + if(slots[slot] != null) { + + if(slots[slot].stackSize <= amount) { ItemStack itemStack = slots[slot]; slots[slot] = null; return itemStack; } + ItemStack itemStack1 = slots[slot].splitStack(amount); - if (slots[slot].stackSize == 0) - { + if(slots[slot].stackSize == 0) { slots[slot] = null; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 1e860e007..82ef6bf37 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -4,12 +4,14 @@ import java.util.HashMap; import java.util.Map.Entry; import com.hbm.blocks.ModBlocks; +import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerPWR; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Heatable; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; import com.hbm.inventory.gui.GUIPWR; +import com.hbm.items.ModItems; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.fauxpointtwelve.BlockPos; @@ -19,19 +21,24 @@ import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPWRController extends TileEntityMachineBase implements IGUIProvider { +public class TileEntityPWRController extends TileEntityMachineBase implements IGUIProvider, IControlReceiver { public FluidTank[] tanks; public int coreHeat; public int coreHeatCapacity; public int hullHeat; public int hullHeatCapacity; + public int rodLevel; public int rodTarget; - public int progress; + + public int typeLoaded; + public int amountLoaded; + public double progress; public int processTime; public int rodCount; @@ -129,6 +136,16 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG this.tanks[0].setType(2, slots); setupTanks(); + if(typeLoaded == -1 || amountLoaded <= 0 && slots[0] != null && slots[0].getItem() == ModItems.pwr_fuel) { + typeLoaded = slots[0].getItemDamage(); + amountLoaded++; + this.decrStackSize(0, 1); + this.markChanged(); + } + + if(this.rodTarget > this.rodLevel) this.rodLevel++; + if(this.rodTarget < this.rodLevel) this.rodLevel--; + NBTTagCompound data = new NBTTagCompound(); tanks[0].writeToNBT(data, "t0"); tanks[1].writeToNBT(data, "t1"); @@ -147,6 +164,20 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG tanks[1].setTankType(trait.getFirstStep().typeProduced); } + public double getTotalProcessMultiplier() { + double totalConnections = this.connections + this.connectionsControlled * (1D - (this.rodLevel / 100D)); + double connectionsEff = connectinFunc(totalConnections); + return connectionsEff; + } + + public double connectinFunc(double connections) { + return connections * (1D - getXOverE(connections, 300D)) + connections / 2D * getXOverE(connections, 300D); //creates a curve that smoothly transitions from f(x)=x to f(x)=x/2 + } + + public double getXOverE(double x, double d) { + return -Math.pow(Math.E, -x / d); + } + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -161,6 +192,19 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG nbt.setBoolean("assembled", assembled); } + @Override + public boolean hasPermission(EntityPlayer player) { + return this.isUseableByPlayer(player); + } + + @Override + public void receiveControl(NBTTagCompound data) { + + if(data.hasKey("control")) { + this.rodTarget = MathHelper.clamp_int(data.getInteger("control"), 0, 100); + } + } + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerPWR(player.inventory, this); diff --git a/src/main/resources/assets/hbm/textures/items/primer_357.png b/src/main/resources/assets/hbm/textures/items/primer_357.png deleted file mode 100644 index c20411ce761d777fe3f9a7e916ae9c4fad1ed8e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfz>% diff --git a/src/main/resources/assets/hbm/textures/items/primer_44.png b/src/main/resources/assets/hbm/textures/items/primer_44.png deleted file mode 100644 index 1b7fd54357812de94b840bcc54f818929caf4bb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfvjm6 z_*u<@@C4=x-W}h6*f&qoQ9eB1zP?~p;z2cz&AGpqmbBSFFUU?yI3V0{^ytz56X)8N iz6zO><<8j3z)+vBb>iRqo1h-kFAV7$1o)*0aMnC*a!|C{s#iJXI$;jT~C7khO|BtMs5S7>Fx8~5cZd(upO*;QRPjsxAs N;OXk;vd$@?2>=lhPw4;v diff --git a/src/main/resources/assets/hbm/textures/items/primer_9.png b/src/main/resources/assets/hbm/textures/items/primer_9.png deleted file mode 100644 index e88ab382f981dbb407781eab70ee6c5431c0b445..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfM-mV&xB|ys=JYD@<);T3K0RU|pLlXc1 diff --git a/src/main/resources/assets/hbm/textures/items/primer_buckshot.png b/src/main/resources/assets/hbm/textures/items/primer_buckshot.png deleted file mode 100644 index 701799005b6a405aad6b2e923b2bcacff1d5b0fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf Date: Thu, 17 Aug 2023 22:00:35 +0200 Subject: [PATCH 09/14] we have fission! --- .../hbm/inventory/container/ContainerPWR.java | 2 +- .../java/com/hbm/inventory/gui/GUIPWR.java | 40 ++++++++- .../hbm/inventory/gui/GuiInfoContainer.java | 13 +++ .../com/hbm/items/machine/ItemPWRFuel.java | 58 +++---------- .../machine/TileEntityPWRController.java | 87 +++++++++++++++++-- .../java/com/hbm/util/function/Function.java | 1 + 6 files changed, 147 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/hbm/inventory/container/ContainerPWR.java b/src/main/java/com/hbm/inventory/container/ContainerPWR.java index 92b638808..ff6cc84fa 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPWR.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPWR.java @@ -23,7 +23,7 @@ public class ContainerPWR extends Container { for(int i = 0; i < 3; i++) { for(int j = 0; j < 9; j++) { - this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 108 + i * 18)); + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 106 + i * 18)); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIPWR.java b/src/main/java/com/hbm/inventory/gui/GUIPWR.java index 4c2b04fb5..af7130a47 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPWR.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPWR.java @@ -3,14 +3,19 @@ package com.hbm.inventory.gui; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerPWR; +import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.render.util.GaugeUtil; import com.hbm.render.util.GaugeUtil.Gauge; import com.hbm.tileentity.machine.TileEntityPWRController; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; public class GUIPWR extends GuiInfoContainer { @@ -36,17 +41,40 @@ public class GUIPWR extends GuiInfoContainer { //TODO: calculate some prediction using extrapolation (or some math sector that ends with -ic) //int timeLeft = (controller.processTime - controller.progress) / 20; //this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 31, 36, 18, x, y, new String[] { "Cycle: " + (timeLeft / 60) + ":" + String.format("%02d", timeLeft % 60)}); + + + if(controller.typeLoaded != -1 && controller.amountLoaded > 0) { + ItemStack display = new ItemStack(ModItems.pwr_fuel, 1, controller.typeLoaded); + if(guiLeft + 88 <= x && guiLeft + 88 + 18 > x && guiTop + 4 < y && guiTop + 4 + 18 >= y) this.renderToolTip(display, x, y); + } controller.tanks[0].renderTankInfo(this, x, y, guiLeft + 8, guiTop + 5, 16, 52); controller.tanks[1].renderTankInfo(this, x, y, guiLeft + 26, guiTop + 5, 16, 52); } + + @Override + protected void drawItemStack(ItemStack stack, int x, int y, String label) { + GL11.glPushMatrix(); + GL11.glTranslatef(0.0F, 0.0F, 32.0F); + this.zLevel = 200.0F; + itemRender.zLevel = 200.0F; + FontRenderer font = null; + if(stack != null) font = stack.getItem().getFontRenderer(stack); + if(font == null) font = fontRendererObj; + itemRender.renderItemAndEffectIntoGUI(font, this.mc.getTextureManager(), stack, x, y); + GL11.glScaled(0.5, 0.5, 0.5); + itemRender.renderItemOverlayIntoGUI(font, this.mc.getTextureManager(), stack, (x + font.getStringWidth(label) / 4) * 2, (y + 15) * 2, label); + this.zLevel = 0.0F; + itemRender.zLevel = 0.0F; + GL11.glPopMatrix(); + } @Override protected void drawGuiContainerForegroundLayer(int i, int j) { this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); double scale = 1.25; - String flux = String.format("%,.1f", 10000.0D); + String flux = String.format("%,.1f", controller.flux); GL11.glScaled(1 / scale, 1 / scale, 1); this.fontRendererObj.drawString(flux, (int) (165 * scale - this.fontRendererObj.getStringWidth(flux)), (int)(64 * scale), 0x00ff00); GL11.glScaled(scale, scale, 1); @@ -61,7 +89,13 @@ public class GUIPWR extends GuiInfoContainer { if(System.currentTimeMillis() % 1000 < 500) drawTexturedModalRect(guiLeft + 147, guiTop, 176, 14, 26, 26); - GaugeUtil.renderGauge(Gauge.ROUND_SMALL, guiLeft + 115, guiTop + 31, this.zLevel, 0.1D); - GaugeUtil.renderGauge(Gauge.ROUND_SMALL, guiLeft + 151, guiTop + 31, this.zLevel, 0.4D); + GaugeUtil.renderGauge(Gauge.ROUND_SMALL, guiLeft + 115, guiTop + 31, this.zLevel, (double) controller.coreHeat / (double) controller.coreHeatCapacity); + GaugeUtil.renderGauge(Gauge.ROUND_SMALL, guiLeft + 151, guiTop + 31, this.zLevel, (double) controller.hullHeat / (double) controller.hullHeatCapacity); + + if(controller.typeLoaded != -1 && controller.amountLoaded > 0) { + ItemStack display = new ItemStack(ModItems.pwr_fuel, 1, controller.typeLoaded); + this.drawItemStack(display, guiLeft + 89, guiTop + 5, EnumChatFormatting.YELLOW + "" + controller.amountLoaded + "/" + controller.rodCount); + RenderHelper.enableGUIStandardItemLighting(); + } } } diff --git a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java index 4c041eaea..e5b244fc5 100644 --- a/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java +++ b/src/main/java/com/hbm/inventory/gui/GuiInfoContainer.java @@ -100,6 +100,19 @@ public abstract class GuiInfoContainer extends GuiContainer { return this.fontRendererObj; } + protected void drawItemStack(ItemStack stack, int x, int y, String label) { + GL11.glTranslatef(0.0F, 0.0F, 32.0F); + this.zLevel = 200.0F; + itemRender.zLevel = 200.0F; + FontRenderer font = null; + if(stack != null) font = stack.getItem().getFontRenderer(stack); + if(font == null) font = fontRendererObj; + itemRender.renderItemAndEffectIntoGUI(font, this.mc.getTextureManager(), stack, x, y); + itemRender.renderItemOverlayIntoGUI(font, this.mc.getTextureManager(), stack, x, y, label); + this.zLevel = 0.0F; + itemRender.zLevel = 0.0F; + } + protected void drawStackText(List lines, int x, int y, FontRenderer font) { if(!lines.isEmpty()) { diff --git a/src/main/java/com/hbm/items/machine/ItemPWRFuel.java b/src/main/java/com/hbm/items/machine/ItemPWRFuel.java index 7bb6ce158..d60aca579 100644 --- a/src/main/java/com/hbm/items/machine/ItemPWRFuel.java +++ b/src/main/java/com/hbm/items/machine/ItemPWRFuel.java @@ -1,5 +1,7 @@ package com.hbm.items.machine; +import java.util.List; + import com.hbm.items.ItemEnumMulti; import com.hbm.util.EnumUtil; import com.hbm.util.function.Function; @@ -8,8 +10,7 @@ import com.hbm.util.function.Function.FunctionSqrt; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; +import net.minecraft.util.EnumChatFormatting; public class ItemPWRFuel extends ItemEnumMulti { @@ -26,7 +27,7 @@ public class ItemPWRFuel extends ItemEnumMulti { MOX( 07.5D, new FunctionLogarithmic(25)), MEP( 07.5D, new FunctionLogarithmic(25)), HEP239( 10.0D, new FunctionSqrt(25)), - HEP24( 10.0D, new FunctionSqrt(25)), + HEP241( 10.0D, new FunctionSqrt(25)), MEA( 07.5D, new FunctionLogarithmic(25)), HEA242( 10.0D, new FunctionSqrt(25)), HES326( 15.0D, new FunctionSqrt(25)), @@ -41,48 +42,17 @@ public class ItemPWRFuel extends ItemEnumMulti { this.function = function; } } - - @Override - public boolean showDurabilityBar(ItemStack stack) { - return getDurabilityForDisplay(stack) > 0D; - } - - @Override - public double getDurabilityForDisplay(ItemStack stack) { - return 1D - getEnrichment(stack); - } - public static double getEnrichment(ItemStack stack) { + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + EnumPWRFuel num = EnumUtil.grabEnumSafely(EnumPWRFuel.class, stack.getItemDamage()); - return getYield(stack) / num.yield; - } - - public static double getYield(ItemStack stack) { - return getDouble(stack, "yield"); - } - - public static void setYield(ItemStack stack, double yield) { - setDouble(stack, "yield", yield); - } - - public static void setDouble(ItemStack stack, String key, double yield) { - if(!stack.hasTagCompound()) setNBTDefaults(stack); - stack.stackTagCompound.setDouble(key, yield); - } - - public static double getDouble(ItemStack stack, String key) { - if(!stack.hasTagCompound()) setNBTDefaults(stack); - return stack.stackTagCompound.getDouble(key); - } - - private static void setNBTDefaults(ItemStack stack) { - EnumPWRFuel num = EnumUtil.grabEnumSafely(EnumPWRFuel.class, stack.getItemDamage()); - stack.stackTagCompound = new NBTTagCompound(); - setYield(stack, num.yield); - } - - @Override - public void onCreated(ItemStack stack, World world, EntityPlayer player) { - setNBTDefaults(stack); + + String color = EnumChatFormatting.GOLD + ""; + String reset = EnumChatFormatting.RESET + ""; + + list.add(color + "Heat per flux: " + reset + num.heatEmission + " TU"); + list.add(color + "Reacton function: " + reset + num.function.getLabelForFuel()); + list.add(color + "Fuel type: " + reset + num.function.getDangerFromFuel()); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 82ef6bf37..564df30ac 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -12,14 +12,17 @@ import com.hbm.inventory.fluid.trait.FT_Heatable; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; import com.hbm.inventory.gui.GUIPWR; import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.EnumUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; import net.minecraft.world.World; @@ -29,9 +32,10 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG public FluidTank[] tanks; public int coreHeat; - public int coreHeatCapacity; + public static final int coreHeatCapacity = 25_000_000; public int hullHeat; - public int hullHeatCapacity; + public static final int hullHeatCapacity = 25_000_000; + public double flux; public int rodLevel; public int rodTarget; @@ -39,7 +43,7 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG public int typeLoaded; public int amountLoaded; public double progress; - public int processTime; + public double processTime; public int rodCount; public int connections; @@ -58,6 +62,7 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG this.tanks[1] = new FluidTank(Fluids.COOLANT_HOT, 128_000); } + /** The initial creation of the reactor, does all the pre-calculation and whatnot */ public void setup(HashMap partMap, HashMap rodMap) { rodCount = 0; @@ -136,22 +141,92 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG this.tanks[0].setType(2, slots); setupTanks(); - if(typeLoaded == -1 || amountLoaded <= 0 && slots[0] != null && slots[0].getItem() == ModItems.pwr_fuel) { + if((typeLoaded == -1 || amountLoaded <= 0) && slots[0] != null && slots[0].getItem() == ModItems.pwr_fuel) { typeLoaded = slots[0].getItemDamage(); amountLoaded++; this.decrStackSize(0, 1); this.markChanged(); + } else if(slots[0] != null && slots[0].getItem() == ModItems.pwr_fuel && slots[0].getItemDamage() == typeLoaded && amountLoaded < rodCount){ + amountLoaded++; + this.decrStackSize(0, 1); + this.markChanged(); } if(this.rodTarget > this.rodLevel) this.rodLevel++; if(this.rodTarget < this.rodLevel) this.rodLevel--; + int newFlux = this.sourceCount * 20; + + if(typeLoaded != -1 && amountLoaded > 0) { + + EnumPWRFuel fuel = EnumUtil.grabEnumSafely(EnumPWRFuel.class, typeLoaded); + double usedRods = getTotalProcessMultiplier(); + double fluxPerRod = this.flux / this.rodCount; + double outputPerRod = fuel.function.effonix(fluxPerRod); + double totalOutput = outputPerRod * amountLoaded * usedRods; + double totalHeatOutput = totalOutput * fuel.heatEmission; + + this.coreHeat += totalHeatOutput; + newFlux += totalOutput; + + this.processTime = (int) fuel.yield; + this.progress += totalOutput; + + if(this.progress >= this.processTime) { + this.progress -= this.processTime; + + if(slots[1] == null) { + slots[1] = new ItemStack(ModItems.pwr_fuel_hot, 1, typeLoaded); + } else if(slots[1].getItem() == ModItems.pwr_fuel_hot && slots[1].getItemDamage() == typeLoaded && slots[1].stackSize < slots[1].getMaxStackSize()) { + slots[1].stackSize++; + } + + this.markChanged(); + } + } + + if(this.amountLoaded <= 0) { + this.typeLoaded = -1; + } + + /* CORE COOLING */ + double coreCoolingApproachNum = getXOverE(this.heatexCount, 10) / 2D; + int averageCoreHeat = (this.coreHeat + this.hullHeat) / 2; + this.coreHeat -= (coreHeat - averageCoreHeat) * coreCoolingApproachNum; + this.hullHeat -= (hullHeat - averageCoreHeat) * coreCoolingApproachNum; + + this.hullHeat *= 0.99D; + + this.flux = newFlux; + NBTTagCompound data = new NBTTagCompound(); tanks[0].writeToNBT(data, "t0"); tanks[1].writeToNBT(data, "t1"); + data.setInteger("rodCount", rodCount); + data.setInteger("coreHeat", coreHeat); + data.setInteger("hullHeat", hullHeat); + data.setDouble("flux", flux); + data.setDouble("processTime", processTime); + data.setDouble("progress", progress); + data.setInteger("typeLoaded", typeLoaded); + data.setInteger("amountLoaded", amountLoaded); + this.networkPack(data, 150); } } + public void networkUnpack(NBTTagCompound nbt) { + tanks[0].readFromNBT(nbt, "t0"); + tanks[1].readFromNBT(nbt, "t1"); + rodCount = nbt.getInteger("rodCount"); + coreHeat = nbt.getInteger("coreHeat"); + hullHeat = nbt.getInteger("hullHeat"); + flux = nbt.getDouble("flux"); + processTime = nbt.getDouble("processTime"); + progress = nbt.getDouble("progress"); + typeLoaded = nbt.getInteger("typeLoaded"); + amountLoaded = nbt.getInteger("amountLoaded"); + } + protected void setupTanks() { FT_Heatable trait = tanks[0].getTankType().getTrait(FT_Heatable.class); @@ -171,11 +246,11 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG } public double connectinFunc(double connections) { - return connections * (1D - getXOverE(connections, 300D)) + connections / 2D * getXOverE(connections, 300D); //creates a curve that smoothly transitions from f(x)=x to f(x)=x/2 + return connections / 10D * (1D - getXOverE(connections, 300D)) + connections / 150D * getXOverE(connections, 300D); } public double getXOverE(double x, double d) { - return -Math.pow(Math.E, -x / d); + return 1 - Math.pow(Math.E, -x / d); } @Override diff --git a/src/main/java/com/hbm/util/function/Function.java b/src/main/java/com/hbm/util/function/Function.java index 544328e5c..4e8cc26b9 100644 --- a/src/main/java/com/hbm/util/function/Function.java +++ b/src/main/java/com/hbm/util/function/Function.java @@ -15,6 +15,7 @@ public abstract class Function { protected double div = 1D; protected double off = 0; + //the german prononciation of f(x) - "F von X", tee hee public abstract double effonix(double x); public abstract String getLabelForFuel(); public abstract String getDangerFromFuel(); From a7b741fe48429250f70c72a5e5647ba237c65dc8 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 18 Aug 2023 14:18:24 +0200 Subject: [PATCH 10/14] PWR heat transfer --- .../java/com/hbm/blocks/machine/BlockPWR.java | 46 +++++++- .../java/com/hbm/inventory/fluid/Fluids.java | 3 +- .../java/com/hbm/inventory/gui/GUIPWR.java | 9 ++ .../inventory/recipes/CentrifugeRecipes.java | 6 +- .../machine/TileEntityPWRController.java | 109 +++++++++++++++++- 5 files changed, 163 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/BlockPWR.java b/src/main/java/com/hbm/blocks/machine/BlockPWR.java index 7012f5437..d30541e60 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockPWR.java +++ b/src/main/java/com/hbm/blocks/machine/BlockPWR.java @@ -3,12 +3,14 @@ package com.hbm.blocks.machine; import java.util.Random; import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.fluid.FluidType; import com.hbm.lib.RefStrings; import com.hbm.render.block.ct.CT; import com.hbm.render.block.ct.CTStitchReceiver; import com.hbm.render.block.ct.IBlockCT; import com.hbm.tileentity.machine.TileEntityPWRController; +import api.hbm.fluid.IFluidConnector; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -22,6 +24,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class BlockPWR extends BlockContainer implements IBlockCT { @@ -91,7 +94,7 @@ public class BlockPWR extends BlockContainer implements IBlockCT { super.breakBlock(world, x, y, z, block, meta); } - public static class TileEntityBlockPWR extends TileEntity { + public static class TileEntityBlockPWR extends TileEntity implements IFluidConnector { public Block block; public int coreX; @@ -154,5 +157,46 @@ public class BlockPWR extends BlockContainer implements IBlockCT { this.worldObj.markTileEntityChunkModified(this.xCoord, this.yCoord, this.zCoord, this); } } + + @Override + public long transferFluid(FluidType type, int pressure, long fluid) { + + if(this.getBlockMetadata() != 1) return fluid; + if(block == null) return fluid; + + if(worldObj.getChunkProvider().chunkExists(coreX >> 4, coreZ >> 4)) { + + TileEntity tile = worldObj.getTileEntity(coreX, coreY, coreZ); + if(tile instanceof TileEntityPWRController) { + TileEntityPWRController controller = (TileEntityPWRController) tile; + return controller.transferFluid(type, pressure, fluid); + } + } + + return fluid; + } + + @Override + public long getDemand(FluidType type, int pressure) { + + if(this.getBlockMetadata() != 1) return 0; + if(block == null) return 0; + + if(worldObj.getChunkProvider().chunkExists(coreX >> 4, coreZ >> 4)) { + + TileEntity tile = worldObj.getTileEntity(coreX, coreY, coreZ); + if(tile instanceof TileEntityPWRController) { + TileEntityPWRController controller = (TileEntityPWRController) tile; + return controller.getDemand(type, pressure); + } + } + + return 0; + } + + @Override + public boolean canConnect(FluidType type, ForgeDirection dir) { + return this.getBlockMetadata() == 1; + } } } diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index fba8a1b43..3c70626d5 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -490,8 +490,7 @@ public class Fluids { HOTOIL.addTraits(new FT_Coolable(OIL, 1, 1, 10).setEff(CoolingType.HEATEXCHANGER, 1.0D)); HOTCRACKOIL.addTraits(new FT_Coolable(CRACKOIL, 1, 1, 10).setEff(CoolingType.HEATEXCHANGER, 1.0D)); - COOLANT.addTraits(new FT_Heatable().setEff(HeatingType.HEATEXCHANGER, 1.0D).addStep(300, 1, COOLANT_HOT, 1)); - COOLANT.addTraits(new FT_Heatable().setEff(HeatingType.PWR, 1.0D).addStep(300, 1, COOLANT_HOT, 1)); + COOLANT.addTraits(new FT_Heatable().setEff(HeatingType.HEATEXCHANGER, 1.0D).setEff(HeatingType.PWR, 1.0D).addStep(300, 1, COOLANT_HOT, 1)); COOLANT_HOT.addTraits(new FT_Coolable(COOLANT, 1, 1, 300).setEff(CoolingType.HEATEXCHANGER, 1.0D)); MUG.addTraits(new FT_Heatable().setEff(HeatingType.HEATEXCHANGER, 1.0D).addStep(400, 1, MUG_HOT, 1)); diff --git a/src/main/java/com/hbm/inventory/gui/GUIPWR.java b/src/main/java/com/hbm/inventory/gui/GUIPWR.java index af7130a47..083cab0c7 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPWR.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPWR.java @@ -41,6 +41,8 @@ public class GUIPWR extends GuiInfoContainer { //TODO: calculate some prediction using extrapolation (or some math sector that ends with -ic) //int timeLeft = (controller.processTime - controller.progress) / 20; //this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 31, 36, 18, x, y, new String[] { "Cycle: " + (timeLeft / 60) + ":" + String.format("%02d", timeLeft % 60)}); + + this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 31, 36, 18, x, y, new String[] { ((int) (controller.progress * 100 / controller.processTime)) + "%" }); if(controller.typeLoaded != -1 && controller.amountLoaded > 0) { @@ -89,6 +91,9 @@ public class GUIPWR extends GuiInfoContainer { if(System.currentTimeMillis() % 1000 < 500) drawTexturedModalRect(guiLeft + 147, guiTop, 176, 14, 26, 26); + int p = (int) (controller.progress * 33 / controller.processTime); + drawTexturedModalRect(guiLeft + 54, guiTop + 33, 176, 0, p, 14); + GaugeUtil.renderGauge(Gauge.ROUND_SMALL, guiLeft + 115, guiTop + 31, this.zLevel, (double) controller.coreHeat / (double) controller.coreHeatCapacity); GaugeUtil.renderGauge(Gauge.ROUND_SMALL, guiLeft + 151, guiTop + 31, this.zLevel, (double) controller.hullHeat / (double) controller.hullHeatCapacity); @@ -96,6 +101,10 @@ public class GUIPWR extends GuiInfoContainer { ItemStack display = new ItemStack(ModItems.pwr_fuel, 1, controller.typeLoaded); this.drawItemStack(display, guiLeft + 89, guiTop + 5, EnumChatFormatting.YELLOW + "" + controller.amountLoaded + "/" + controller.rodCount); RenderHelper.enableGUIStandardItemLighting(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); } + + controller.tanks[0].renderTank(guiLeft + 8, guiTop + 57, this.zLevel, 16, 52); + controller.tanks[1].renderTank(guiLeft + 26, guiTop + 57, this.zLevel, 16, 52); } } diff --git a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java index a3735f8bb..5e619c676 100644 --- a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java @@ -1,6 +1,7 @@ package com.hbm.inventory.recipes; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; @@ -188,8 +189,9 @@ public class CentrifugeRecipes extends SerializableRecipe { new ItemStack(ModItems.nugget_pu238, 6), new ItemStack(ModItems.nuclear_waste, 2) }); - if(OreDictionary.doesOreNameExist("nuggetNaquadria")) { - ItemStack nuggetNQR = OreDictionary.getOres("nuggetNaquadria").get(0); + ArrayList naquadriaNuggets = OreDictionary.getOres("nuggetNaquadria"); + if(naquadriaNuggets.size() != 0) { + ItemStack nuggetNQR = naquadriaNuggets.get(0); ItemStack copy = nuggetNQR.copy(); copy.stackSize = 12; recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.watz_pellet_depleted, EnumWatzType.NQD)), new ItemStack[] { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 564df30ac..5aa739e75 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -1,6 +1,8 @@ package com.hbm.tileentity.machine; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map.Entry; import com.hbm.blocks.ModBlocks; @@ -9,6 +11,7 @@ import com.hbm.inventory.container.ContainerPWR; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Heatable; +import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingStep; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; import com.hbm.inventory.gui.GUIPWR; import com.hbm.items.ModItems; @@ -18,6 +21,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.EnumUtil; import com.hbm.util.fauxpointtwelve.BlockPos; +import api.hbm.fluid.IFluidStandardTransceiver; import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; @@ -28,13 +32,13 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPWRController extends TileEntityMachineBase implements IGUIProvider, IControlReceiver { +public class TileEntityPWRController extends TileEntityMachineBase implements IGUIProvider, IControlReceiver, IFluidStandardTransceiver { public FluidTank[] tanks; public int coreHeat; - public static final int coreHeatCapacity = 25_000_000; + public static final int coreHeatCapacity = 10_000_000; public int hullHeat; - public static final int hullHeatCapacity = 25_000_000; + public static final int hullHeatCapacity = 10_000_000; public double flux; public int rodLevel; @@ -53,6 +57,8 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG public int sourceCount; public boolean assembled; + + protected List ports = new ArrayList(); public TileEntityPWRController() { super(3); @@ -82,6 +88,7 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG if(block == ModBlocks.pwr_heatex) heatexCount++; if(block == ModBlocks.pwr_channel) channelCount++; if(block == ModBlocks.pwr_neutron_source) sourceCount++; + if(block == ModBlocks.pwr_port) ports.add(entry.getKey()); } for(Entry entry : rodMap.entrySet()) { @@ -141,6 +148,15 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG this.tanks[0].setType(2, slots); setupTanks(); + for(BlockPos pos : ports) { + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + BlockPos portPos = pos.offset(dir); + + if(tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, portPos.getX(), portPos.getY(), portPos.getZ(), dir); + if(worldObj.getTotalWorldTime() % 20 == 0) this.trySubscribe(tanks[0].getTankType(), worldObj, portPos.getX(), portPos.getY(), portPos.getZ(), dir); + } + } + if((typeLoaded == -1 || amountLoaded <= 0) && slots[0] != null && slots[0].getItem() == ModItems.pwr_fuel) { typeLoaded = slots[0].getItemDamage(); amountLoaded++; @@ -190,12 +206,14 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG } /* CORE COOLING */ - double coreCoolingApproachNum = getXOverE(this.heatexCount, 10) / 2D; + double coreCoolingApproachNum = getXOverE((double) this.heatexCount / (double) this.rodCount, 2) / 2D; int averageCoreHeat = (this.coreHeat + this.hullHeat) / 2; this.coreHeat -= (coreHeat - averageCoreHeat) * coreCoolingApproachNum; this.hullHeat -= (hullHeat - averageCoreHeat) * coreCoolingApproachNum; - this.hullHeat *= 0.99D; + updateCoolant(); + + this.hullHeat *= 0.999D; this.flux = newFlux; @@ -214,6 +232,26 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG } } + protected void updateCoolant() { + + FT_Heatable trait = tanks[0].getTankType().getTrait(FT_Heatable.class); + if(trait == null || trait.getEfficiency(HeatingType.PWR) <= 0) return; + + double coolingEff = (double) this.channelCount / (double) this.rodCount * 0.1D; //10% cooling if numbers match + if(coolingEff > 1D) coolingEff = 1D; + + int heatToUse = (int) (this.hullHeat * coolingEff); + HeatingStep step = trait.getFirstStep(); + int coolCycles = tanks[0].getFill() / step.amountReq; + int hotCycles = (tanks[1].getMaxFill() - tanks[1].getFill()) / step.amountProduced; + int heatCycles = heatToUse / step.heatReq; + int cycles = Math.min(coolCycles, Math.min(hotCycles, heatCycles)); + + this.hullHeat -= step.heatReq * cycles; + this.tanks[0].setFill(tanks[0].getFill() - step.amountReq * cycles); + this.tanks[1].setFill(tanks[1].getFill() + step.amountProduced * cycles); + } + public void networkUnpack(NBTTagCompound nbt) { tanks[0].readFromNBT(nbt, "t0"); tanks[1].readFromNBT(nbt, "t1"); @@ -234,6 +272,7 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG if(trait == null || trait.getEfficiency(HeatingType.PWR) <= 0) { tanks[0].setTankType(Fluids.NONE); tanks[1].setTankType(Fluids.NONE); + return; } tanks[1].setTankType(trait.getFirstStep().typeProduced); @@ -258,6 +297,29 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG super.readFromNBT(nbt); this.assembled = nbt.getBoolean("assembled"); + this.coreHeat = nbt.getInteger("coreHeat"); + this.hullHeat = nbt.getInteger("hullHeat"); + this.flux = nbt.getDouble("flux"); + this.rodLevel = nbt.getInteger("rodLevel"); + this.rodTarget = nbt.getInteger("rodTarget"); + this.typeLoaded = nbt.getInteger("typeLoaded"); + this.amountLoaded = nbt.getInteger("amountLoaded"); + this.progress = nbt.getDouble("progress"); + this.processTime = nbt.getDouble("processTime"); + + this.rodCount = nbt.getInteger("rodCount"); + this.connections = nbt.getInteger("connections"); + this.connectionsControlled = nbt.getInteger("connectionsControlled"); + this.heatexCount = nbt.getInteger("heatexCount"); + this.channelCount = nbt.getInteger("channelCount"); + this.sourceCount = nbt.getInteger("sourceCount"); + + ports.clear(); + int portCount = nbt.getInteger("portCount"); + for(int i = 0; i < portCount; i++) { + int[] port = nbt.getIntArray("p" + i); + ports.add(new BlockPos(port[0], port[1], port[2])); + } } @Override @@ -265,6 +327,28 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG super.writeToNBT(nbt); nbt.setBoolean("assembled", assembled); + nbt.setInteger("coreHeat", coreHeat); + nbt.setInteger("hullHeat", hullHeat); + nbt.setDouble("flux", flux); + nbt.setInteger("rodLevel", rodLevel); + nbt.setInteger("rodTarget", rodTarget); + nbt.setInteger("typeLoaded", typeLoaded); + nbt.setInteger("amountLoaded", amountLoaded); + nbt.setDouble("progress", progress); + nbt.setDouble("processTime", processTime); + + nbt.setInteger("rodCount", rodCount); + nbt.setInteger("connections", connections); + nbt.setInteger("connectionsControlled", connectionsControlled); + nbt.setInteger("heatexCount", heatexCount); + nbt.setInteger("channelCount", channelCount); + nbt.setInteger("sourceCount", sourceCount); + + nbt.setInteger("portCount", ports.size()); + for(int i = 0; i < ports.size(); i++) { + BlockPos pos = ports.get(i); + nbt.setIntArray("p" + i, new int[] { pos.getX(), pos.getY(), pos.getZ() }); + } } @Override @@ -289,4 +373,19 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIPWR(player.inventory, this); } + + @Override + public FluidTank[] getAllTanks() { + return tanks; + } + + @Override + public FluidTank[] getSendingTanks() { + return new FluidTank[] { tanks[1] }; + } + + @Override + public FluidTank[] getReceivingTanks() { + return new FluidTank[] { tanks[0] }; + } } From 05f45e8a769f55c736760193a8bd2db1880be41b Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 20 Aug 2023 19:23:35 +0200 Subject: [PATCH 11/14] PWR controllability --- .../java/com/hbm/inventory/gui/GUIPWR.java | 68 ++++++++++++++++-- .../machine/TileEntityMachineChemplant.java | 2 + .../TileEntityMachineChemplantBase.java | 2 + .../machine/TileEntityPWRController.java | 64 ++++++++++++++++- src/main/resources/assets/hbm/sounds.json | 1 + .../assets/hbm/sounds/block/reactorLoop.ogg | Bin 0 -> 112164 bytes 6 files changed, 128 insertions(+), 9 deletions(-) create mode 100644 src/main/resources/assets/hbm/sounds/block/reactorLoop.ogg diff --git a/src/main/java/com/hbm/inventory/gui/GUIPWR.java b/src/main/java/com/hbm/inventory/gui/GUIPWR.java index 083cab0c7..b8888ec02 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPWR.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPWR.java @@ -1,21 +1,29 @@ package com.hbm.inventory.gui; +import org.apache.commons.lang3.math.NumberUtils; +import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerPWR; import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; +import com.hbm.packet.NBTControlPacket; +import com.hbm.packet.PacketDispatcher; import com.hbm.render.util.GaugeUtil; import com.hbm.render.util.GaugeUtil.Gauge; import com.hbm.tileentity.machine.TileEntityPWRController; import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiTextField; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; public class GUIPWR extends GuiInfoContainer { @@ -23,6 +31,8 @@ public class GUIPWR extends GuiInfoContainer { protected TileEntityPWRController controller; private final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/reactors/gui_pwr.png"); + private GuiTextField field; + public GUIPWR(InventoryPlayer inventory, TileEntityPWRController controller) { super(new ContainerPWR(inventory, controller)); this.controller = controller; @@ -30,6 +40,21 @@ public class GUIPWR extends GuiInfoContainer { this.xSize = 176; this.ySize = 188; } + + @Override + public void initGui() { + super.initGui(); + + Keyboard.enableRepeatEvents(true); + + this.field = new GuiTextField(this.fontRendererObj, guiLeft + 57, guiTop + 63, 30, 8); + this.field.setTextColor(0x00ff00); + this.field.setDisabledTextColour(0x008000); + this.field.setEnableBackgroundDrawing(false); + this.field.setMaxStringLength(3); + + this.field.setText((100 - controller.rodTarget) + ""); + } @Override public void drawScreen(int x, int y, float interp) { @@ -37,13 +62,9 @@ public class GUIPWR extends GuiInfoContainer { this.drawCustomInfoStat(x, y, guiLeft + 115, guiTop + 31, 18, 18, x, y, new String[] { "Core: " + String.format("%,d", controller.coreHeat) + " / " + String.format("%,d", controller.coreHeatCapacity) + " TU" }); this.drawCustomInfoStat(x, y, guiLeft + 151, guiTop + 31, 18, 18, x, y, new String[] { "Hull: " + String.format("%,d", controller.hullHeat) + " / " + String.format("%,d", controller.hullHeatCapacity) + " TU" }); - - //TODO: calculate some prediction using extrapolation (or some math sector that ends with -ic) - //int timeLeft = (controller.processTime - controller.progress) / 20; - //this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 31, 36, 18, x, y, new String[] { "Cycle: " + (timeLeft / 60) + ":" + String.format("%02d", timeLeft % 60)}); - - this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 31, 36, 18, x, y, new String[] { ((int) (controller.progress * 100 / controller.processTime)) + "%" }); + this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 31, 36, 18, x, y, new String[] { ((int) (controller.progress * 100 / controller.processTime)) + "%" }); + this.drawCustomInfoStat(x, y, guiLeft + 52, guiTop + 53, 54, 4, x, y, "Control rod level: " + (100 - controller.rodLevel) + "%"); if(controller.typeLoaded != -1 && controller.amountLoaded > 0) { ItemStack display = new ItemStack(ModItems.pwr_fuel, 1, controller.typeLoaded); @@ -88,12 +109,15 @@ public class GUIPWR extends GuiInfoContainer { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - if(System.currentTimeMillis() % 1000 < 500) + if(controller.hullHeat > controller.hullHeatCapacity * 0.8 || controller.coreHeat > controller.coreHeatCapacity * 0.8) drawTexturedModalRect(guiLeft + 147, guiTop, 176, 14, 26, 26); int p = (int) (controller.progress * 33 / controller.processTime); drawTexturedModalRect(guiLeft + 54, guiTop + 33, 176, 0, p, 14); + int c = (int) (controller.rodLevel * 52 / 100); + drawTexturedModalRect(guiLeft + 53, guiTop + 54, 176, 40, c, 2); + GaugeUtil.renderGauge(Gauge.ROUND_SMALL, guiLeft + 115, guiTop + 31, this.zLevel, (double) controller.coreHeat / (double) controller.coreHeatCapacity); GaugeUtil.renderGauge(Gauge.ROUND_SMALL, guiLeft + 151, guiTop + 31, this.zLevel, (double) controller.hullHeat / (double) controller.hullHeatCapacity); @@ -103,8 +127,38 @@ public class GUIPWR extends GuiInfoContainer { RenderHelper.enableGUIStandardItemLighting(); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); } + + GL11.glDisable(GL11.GL_LIGHTING); controller.tanks[0].renderTank(guiLeft + 8, guiTop + 57, this.zLevel, 16, 52); controller.tanks[1].renderTank(guiLeft + 26, guiTop + 57, this.zLevel, 16, 52); + + this.field.drawTextBox(); + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int i) { + super.mouseClicked(mouseX, mouseY, i); + this.field.mouseClicked(mouseX, mouseY, i); + + if(guiLeft + 88 <= mouseX && guiLeft + 88 + 18 > mouseX && guiTop + 58 < mouseY && guiTop + 58 + 18 >= mouseY) { + + if(NumberUtils.isNumber(field.getText())) { + int level = (int)MathHelper.clamp_double(Double.parseDouble(field.getText()), 0, 100); + field.setText(level + ""); + + NBTTagCompound control = new NBTTagCompound(); + control.setInteger("control", 100 - level); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(control, controller.xCoord, controller.yCoord, controller.zCoord)); + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1F)); + + } + } + } + + @Override + protected void keyTyped(char c, int i) { + if(this.field.textboxKeyTyped(c, i)) return; + super.keyTyped(c, i); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java index 379a95c1b..3da9f3833 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java @@ -304,6 +304,8 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements this.maxProgress = recipe.getDuration() * this.speed / 100; + if(maxProgress <= 0) maxProgress = 1; + if(this.progress >= this.maxProgress) { consumeFluids(recipe); produceFluids(recipe); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java index d91102d51..99e38f3e4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java @@ -150,6 +150,8 @@ public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBa this.maxProgress[index] = recipe.getDuration() * this.speed / 100; + if(maxProgress[index] <= 0) maxProgress[index] = 1; + if(this.progress[index] >= this.maxProgress[index]) { consumeFluids(recipe, index); produceFluids(recipe, index); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 5aa739e75..ec3a6488a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -16,6 +16,8 @@ import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; import com.hbm.inventory.gui.GUIPWR; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; +import com.hbm.main.MainRegistry; +import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.EnumUtil; @@ -41,8 +43,8 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG public static final int hullHeatCapacity = 10_000_000; public double flux; - public int rodLevel; - public int rodTarget; + public int rodLevel = 100; + public int rodTarget = 100; public int typeLoaded; public int amountLoaded; @@ -58,6 +60,8 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG public boolean assembled; + private AudioWrapper audio; + protected List ports = new ArrayList(); public TileEntityPWRController() { @@ -228,7 +232,54 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG data.setDouble("progress", progress); data.setInteger("typeLoaded", typeLoaded); data.setInteger("amountLoaded", amountLoaded); + data.setInteger("rodLevel", rodLevel); + data.setInteger("rodTarget", rodTarget); this.networkPack(data, 150); + } else { + + if(amountLoaded > 0) { + + if(audio == null) { + audio = createAudioLoop(); + audio.startSound(); + } else if(!audio.isPlaying()) { + audio = rebootAudio(audio); + } + + audio.keepAlive(); + + } else { + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + } + } + + @Override + public AudioWrapper createAudioLoop() { + return MainRegistry.proxy.getLoopedSound("hbm:block.reactorLoop", xCoord, yCoord, zCoord, 1F, 10F, 1.0F, 20); + } + + @Override + public void onChunkUnload() { + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + + @Override + public void invalidate() { + + super.invalidate(); + + if(audio != null) { + audio.stopSound(); + audio = null; } } @@ -263,6 +314,8 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG progress = nbt.getDouble("progress"); typeLoaded = nbt.getInteger("typeLoaded"); amountLoaded = nbt.getInteger("amountLoaded"); + rodLevel = nbt.getInteger("rodLevel"); + rodTarget = nbt.getInteger("rodTarget"); } protected void setupTanks() { @@ -295,6 +348,9 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); + + tanks[0].readFromNBT(nbt, "t0"); + tanks[1].readFromNBT(nbt, "t1"); this.assembled = nbt.getBoolean("assembled"); this.coreHeat = nbt.getInteger("coreHeat"); @@ -325,6 +381,9 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); + + tanks[0].writeToNBT(nbt, "t0"); + tanks[1].writeToNBT(nbt, "t1"); nbt.setBoolean("assembled", assembled); nbt.setInteger("coreHeat", coreHeat); @@ -361,6 +420,7 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG if(data.hasKey("control")) { this.rodTarget = MathHelper.clamp_int(data.getInteger("control"), 0, 100); + this.markChanged(); } } diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index 90efc5334..d2c6248c7 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -58,6 +58,7 @@ "block.hornNearDual": {"category": "block", "sounds": [{"name": "block/hornNearDual", "stream": false}]}, "block.hornFarSingle": {"category": "block", "sounds": [{"name": "block/hornFarSingle", "stream": false}]}, "block.hornFarDual": {"category": "block", "sounds": [{"name": "block/hornFarDual", "stream": false}]}, + "block.reactorLoop": {"category": "block", "sounds": [{"name": "block/reactorLoop", "stream": false}]}, "door.TransitionSealOpen": {"category": "block", "sounds": [{"name": "block/door/transition_seal_open", "stream": true}]}, "door.wghStart": {"category": "block", "sounds": [{"name": "block/door/wgh_start", "stream": true}]}, diff --git a/src/main/resources/assets/hbm/sounds/block/reactorLoop.ogg b/src/main/resources/assets/hbm/sounds/block/reactorLoop.ogg new file mode 100644 index 0000000000000000000000000000000000000000..428ddeabbfdcd94c2efc0856475005c552ce8e32 GIT binary patch literal 112164 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

M!MJR$YCP(^U!H|1~Bo0_t1Jqm@k*myH2Go z1BVu8;^BN+&!Np|L$F8Ye~`F&OP{ioaoM$ErTDO$7OE|Cx_^d65C7qW9_D(lKLw#m`R!?v{_DfT* zUK9tn`S_yaU*Iq(s*Cc5FAU^VNKS%DpgVd7Ln}L`DO=C$v}8DJAv4_Xu2Ixah3WAl zX`e8*ir=e@orAtotGL}Ft`iG~<#d#BjQiDW=cq;kyzif0sZ*+(sK2Vg=ZJMgzJ;Se zHsr_f-2IJ?YcW^~7^z20WjMW_9A;S9DKQ+woUxSU&1Ps59Ok00VwkM>isj?-OC7gi z8=oVbaLKK}m9o`4ilgp^S9nki+$A!d_CNLJJbhN>P9T`63^*tCGK-{;eru71N5gYo z+=JVIQh8>R%l}*IY4?9B42{SFaKC;jpNpomywNkz)PHUFKe)@wdd4&;1(nK8?V$-^ z!}u6d_?of-uN&)3OSp%G(%L7e(vFtLaU_4FYi9n8QleF9{?s}nBrS26U(?34h3dqz zMBL&d;9e+tNZpv+9YtM=4X(2GZNfA_>Q8RCD|A%DYlX94dh7mTsMq{ZujBOm1@FbWZ%oB*v{7 zLuxO1qXF|U%oh5jb_5|q?>;)NfgN7?q5Ooa`TnoFRkU7*k(-dkxHMfz0eUO3B;Rej z8#%7E%y`{5yxAy<^jM3-Ut^BF-xFoz(rvSLl0g~~T9%jry8lpPzbB?T7e22rN_>Yl ziZrWM4W+mi=4Isg#%Q$%;|;61Ewx|RF*wqhCtu@WqQII1I-{t4Nfpqy(*we#=CC6? z`VA=>HI}1Y5?s6Vg}QCrnLik?Dstlp5!Y@r+B$!vl1sV696txv&n>KgDHcK*MW9^# z(pXPoTPXN6dnC-jk1Jq(MH+<(n=?3^+McOq>nfgJ_*9X!959StKWARRa$7hzWchodR3iR^^3!If=w5CLqvlT6#4S(+1lI1U#0-0 z`DMaKmkQrI2C56kNtbA2G~udTpp@8HJat?TPq!(Nm_9~TQVMya6+VfAuG-OAWK4}2 zfzkSnd4NoxP?MEQ=$*iW>-UC~R)F#k5bDzf(i&0*bekhohNx|!%KTe506kZ!DNYwe zA_nGG+D8stJ9@W#(`O{i0%xmvs&9~mO7MGCaB0*X%GD3IQylZcYm8R8-TS`5WX=_= zxGh^d_lzc`vKOeViEX?*HF4^IqB9Cv&{WGjg zbbQI~U{`v|9QN?Rz06vg3__bTCY=rrOa`BMPtF}mMw{Veqirz>g;isJ5Zhsc%hUK8 zF1V+9EERBnI%l36{mvk+Y?LsN-YOUNDp~3d59#)&%VJ9VtL)xX@9+Px3IN)@Z-q`O zvs`k@q5EfZ@j86Jb6x_y8P;b1aDOe}WRSB~-39v|e~J9|5U*wB?csEG(2E5=-e!QnU^VY9o+=gT!tS?fYht z4kFsaYxQOsseQXzt6R2EjLom!ltL@dD}cBAf>Qhj)WZctHKAI_G9*4sndh_ztAS2_ z7=ML)OwvjI1X zbjF9a;_Y7n{xE7voZtUMo(NC;gE6IFGIg&hwiPG$PBELL^mabXI~ROg{7to#By_2r zoth%2f)qD|LZ-Aft}xQ|>g%1IY^6}wZQ$#*9^BSzv8!XaD{=^HZq!mEr>j5U^?Um_ z@(M3wT6XIjvkNIxVx82P@W~M7FyUcFOm@|qBVM+Pf8zjkG~HK0-8YYCf44Q7w;KgrxxOHS(St1Bf(ttl%8{fpiq~cAk8--# z!@^_MmVViVVSdNH4?)V?oX(r%ynDN~wfLjrcrMkOcJD~@ zW{gAbVm8MmiSs}ZC-o13O88@D+IwIMxg7R@*I(HAvfyq9(*nY#%DC{5Sa7db`OK;gGvzf*~!+xh#2ArDCtpz~+P zCb9hnClpcP&}HlWMDMqb7v2P6T4KKXKk_sm5p_whGA{P~uTW3o0jV`RB7cDAjsHzukcUr@=uYjPNp@UMx*uF}WDt)=9Gko%( z@c5qbXIJDeuv!5s?iElr&8*R%pJS;rlu4emF#LXj?~w@=&U2JdVp1KYp=1T=Sa)pU zBDdk*-f%bK0>EW&^@nCHMI~0X3s~7;hC_8PYOSLm$m;U}FZ!?la^G>0`>x0T@M3lr zi3fXc_U)ZT_vu0MqAL*$jrAM9qOng5C_3B-*uEVRtGv}#au%q#r{IHFq?f{+jMe8O zb!$m{&`ILJcT>G$iSsz0SP>PHaE~YRkb(vk|(<5*Ag(Q({}?_a`ENXVSVol z@E~V&1$~l%4y?NSNpIfox3s@NF`E%>{ui(n-GXug!P?L;`2dH0JL8})5(vdeOV%2e z4zsLAMm0-DdkE-CsMAO)BJSw+OUV}jHNq@A?H znAQjXJYW>hMQGVOR~7sxzvvq)Dw55A`jAxz6x9>%dMfN-*rM|}O~B1M zw}zFMcCID8wD7-y{xtN6{Y+J#iWuC4^DTU{}G`nio zQ}K^p{J~;v>9e~Jk{_uCo|bG2_3v4e*_H?-Q9;6{Uq22X@9~UGO+xcMe|BB@GD~G) z%0yhmjSttD9C9AKy()5%*6V1~BQ|guMO=3dIzWa@wr&W!D1#NX=dFicq$~`_8%6c< z2I{2(B|@u%D@V0#0=D+ITHY6U8XG+zpZH-T0&V#Jq~_1skcx|)!K2suyJxVD6+uz# z$pKti#|7@|;<2b*0d)&sX2u*@lvc^R;gudrO8P|ggt4~VUJf&XTF)1u4_EWliYzJ< zeEXg>HD;pOez#R;?|3m*vj1f*>#hE60iNas-3$fGDLl*i06_Q`TdSC5R}xQHU)Lco zBZ`EtdDg-fF-T6kJ^PVnQH9B1(>FwIHUQb#CXvihM%QO+$7NfwOg_L^?+ zuJvY0JZbho$J#zPJibr9>#p6Lo-4XDo78vr<&#kv8K2S=TW#1(VJE+Yp%AvQykt~27ckNstn^X zML_wLnguKLvQCDbmNCOoNLwBe-}2P>svQ#bxe-KgI;)RYCYIRwA~ULykLkk_J>Y+m zpr=V?DyE}{_Kn~Dl#~N9wq_kh%_cK8$7nrpqk<@uqb8xONLg|W9W++0tk%3m{6Y*` zvZDT+iSpBJB;L9Kycao^FkVl!Uiq3nkmRkc>aES);8iqVV02)#Jv?s2 z4xx&zK?e(C5Wuq8swUqj9a|s|MVp09+yau*#Hz+_Rq~^YThpRUgHOp|^beVo(8UbQ z-ykO1hMjZ8W0JHE{<2Sbt3b*+)j9JoS?TZ2@@i$a3jID}j!-Y~`jHfOdQ)ZV->H~y zfwaqq@53RIlL4@pR6@lbqOO{VQi_oeuHh0#0|>fvqla{YyaIM$A=qJq_upcZ8#q+-G#bjF%Qlf5 zmRiEcyE!L!*cJj}nEj60P7O`5o7nA^r`Co7Gm{PC*w`x_KQ=t?!uolQwWt*CZ?A*P zntE*;_Pw}SC!IJq{9lY4*6*k5gqDBmG)6YwG&46xMf?mfi5v~Jg}`n|FP z*#LsB8Z!2hYuVK&wNxg`dtz9kK&LUx7Cmp; zR+i|rMi>1}(c9t`SqkXuwy1OG(Wm|`jRM5EnHmj&KoEy1!wM-f4g*&70Y^| zhH=y7qXz;cK?ZZZ&A!>y%>%lsD04zr(Tq^AJ_DGgHD!MXJL|=`RC{4(os#KTwYNVn z1kg>mV=jU1bd-sZxLEyTotuNm?eqAb64M>3;Z5Hw&n5o5aOMAdK)(K;`oKU_AM8is z1Mkv$HF{|viwWu^6+wFsr&dtwXeG&@6A=aGaSGe5m1Jx*$-ci}xta-D+1Z$*Q%><+ zuGP&S*@~H-7+dw7v~-9|4am?i*FUZ#-vTC|wEfZx^v83!Pc#VU(WFo^v~2P=_ZIS$ zP+Wr7R>vOUSL%io6}+~m2m-sWj2jG_Wn*U7v&NzQ=^rH}QuVeB1E#(d%GNLP8A)ci z>=lgUs0-5HCdj*W)Fr8x`I$=}ys$G#(~OGhsJhd;N(2RqzeCn9@g?b}jsx6O+zD})Of;QXHrMHZY9KUcr{C4JN5UWBMi zSxlA{9ST7N7>258YI@A#@_8}r7Xz$~X-ix0 zc2A-SUAjEO{QDyAe#(4FQR9%dBhcIL9wJi>O|g$>f39Av*Fb)wt3uq6FVETU>gzXR zywHit+K!;8=_oqxx4h783~V$2E&l4cJ3Z%u1A_aKs#eiZi1#(U8+Bg8laQLF|@L!v>BE8>F&TD+%6?0Ml(10EGa(`X5K84ESa^my)6IQ zzkL9|xANR+53eDkwQnA_%l})Ry`G)u;4#yLP*==$1VPWos#rFlz8f>?0up3gYe~+W z9a?{aBi{DnrW>fN`@GD-=x|w=Pq@K(sEPIPb}l7HzyIwLjgeoF!Xu;WYg*2ME)fXp z*Isx2ejKSj^DNUn?FO);2*^`uXMIoH_OaE6Nqr8wC0%19P)5~OJH#jZyQC=4Ah+`O6J=Cj4oy2b?_e!rnH$;k>sxOF11-GU4juIvm z)GQe3Z46e_4Zgi&47m;fH0bN4VQoS!Rku%yew!4%k#ar>bmu`?6 z5annmw`9|ePDz!CYwhz8ot3Wpu#h6VpaJ3|$a!BJN zGEkysy4{m#u*i6uI?lmyCGC#+*ndk?vMQYM3OeodY>nD?pM8EWG}Lte&y7pwKJYC5 zc~;#bqRC6?1gle$6Fc)FI{08!RZImLZKG`J0bj9nQ_bI{U~7+NO|$b^4wCAQ<189x zhNW^E2G+f4?Cmm*rCkNI97<`<4_sR4G`K9XR$3_Oh!~7sey@hU{&sX7%F^_G>#LcZ z$|Ci$U}aa^=*lF#!FIzx#VOEX{`&NDXBvCc;ml?DJ&XAzqSJ_2GB_bV2EDJE-5{zd zqOcN;Bb^WS17pu=rpWcOl<2}avWcDClyj}@ai=~@e$kKTeFmydtjxcd>+ig|jAEU=3agdK>U%miwgqx_u98vA**z-vfw@!(;eQZx=1XT^e|YKJ%4}W zs7H-HtEa2NdaJ@7`(Q6^+}8eZq~|dwSJ3t1|8}z}Fp|NdZ+wrtP1ZxnTl_MwM6An< zn-+aN#@m5SQ9ujQhbJ12ON02=3yevfX4 z$fVb7FzH)673UU9w7Cs~BT{*^3E3NlFvBFEjG=AzVq3Fu&r1K_Rx!fw3#^-y$H$IM z(;Sq2w&{#!OPZ?-1vb|hw}q-DM{gmDrsbaIa51YfEoDO3eH{n6lfR= z5A32WwNb8V?vD)8O9!9%;hE?tCz18>yj6Jy$bc_A!2E$L>L~@%>Wp-$8f<6!u{h$T zEO5I14teIMG#Wi2Q*z63&f6jQPv+6$VZpe0MR=s;_OH!5jk`L(3u|wDy}w}OtojI` z^yu>b-scw&6igo2XbS0p!>`rW7=9@$Vas<=%r24*t1d|{`zz^-p=1KI>p`f)y~`Z z;IpNkG~{qjiIkrF$AjL+QXvyUikB>o6-xIrA#a2on>vT$N?o&CmZj7j)`EW%=KLG; zFwx99XTA^V#J*B(hvTNY`m}uxH!bd6v|fD^`suCKga4JBvo8|3DN1v1LaTej1!JX6 zt2b(7A3a)W<1UfUOJXok`&0OwJ+u(RrK?ZJ->Z4CAI!ZqrH6AnQ%Dp#yG+ zXY|vgh0Q;uWsUhcQ-ru>#^9O=^P`p3nda%VDA5qMXz9o-53NILUI~*u3CV*jbM2qq z1$usDugMz_hFr~&h^vOZo7fuViGoO%YtL6#a1HP3-&-|19l7b2njbJ2iJnU*b^J)Q z=~vw2e|2Khsx~RO-0RnEI#9PyQbKe$EyhppI+kD1G zNv;*qy|g^gubF=`Ec8bFz0G=A>RWM!cd5L&a|OWePl$yS_yKnN;!*2l@8kKy?Dgd; zP|;wVjVwl|8tzn|miz8pzJh#ap2f8=8ST*QIj7I1Rfa4Z!xiX`orhC>Y#Zxjq_rEr!#FbX6F%MhiLuKPCRq173_xW*15j)>!$52 zT;H&w58co#1ud0X$opHQh5Kg4VsxK0^B%ll4CwTv2(sBfRHdFucip4nsZ5FBAsnTcU88r|Z+z>T15UU#QN9*20wjLkjr zKv!>c_n~8apo)0P9=0yGiqpGovm(8zR(3@%tvJ{rC+N9so>{C;*u+LMPmX+Swu_z6 z%x7ke*#DyEa~1gt-B@GuUrMntQU4Z#j{O`RY@OWr7Xkmn=lzxmBV7iWIAXMQ!*bjDzX3T1TPHeJ(^*uluw#jPtmiJ z@45L?K%Ld8@^^o`wBhTnj|Z8+;~&Rzc7Hd^X*5XwVF!wr(0R+9ZI!|Sz`YdUm*=fafHC11CFI4tn8cMl_GB# z0G-Ul%U?;)w-21QbErtaDsd3l_8M4n?p$>q?kYS*3ODL zYV$JH7H2XooAjUMsQ&opazs9!op2wJa$XqFt~`EEH8M9WpLp_0VdUUo%sQti<{ewp z=ZT>Q$EDnVKAiEd`@3Tq2;I-SZvMCiI8s};W$FKydST~K9uk`r@#z@jVFKo=w9~Op ziZ$kH(xw7Jqh&Ul-r2 z)TV7?SM|LqU)ZT3bo`Pe{JFv2jqL`EN0amw9N!DJJni*RWocCz+qMSn!Mkd|zIWvw;EFp$;Hxo0!Q$nLwx;jCr77$WzN`Ii!P zn@P{Y80^>36Q>K^6esPv7zn~DuU4fo)lwU4hpcU$a40x9F^#l0O`0R^`CRld&gwqV zvtD$WD99+Sx0jwxBMkezTiG4&@9}}(WGM0!d6zXQ=NK95PbVpV;_va^!kN|F{)iM% z`ni?XX-M#9?X#XTE%?;+M}V&Zg@1At-k5cqUWQC+1z8B&*X3gqc3TaOMtMlPS9u zsxubul#t(!KJ;ym=RqzxzZGU|)19>p`UaQGOC?VFNnzNXUxq2hzich=ZJyE#9K z?VgaQU|)b&d-?PFL2=0s^7rT`TomB}%aT_AKS8AO|8;d}FKai!UBoIgh4N6_NZ-iJ z;u0Wo={9M-?CbRXk3Uu405?xar9`A~-tm))`o{tIqr-n_su;+EC2Jq={)9(#*zx-n=IQ-%*fw?|%t^d@;iy73lRnKiY|NNWLc$o~u z`TH(DBaKCz$JEagc(C7he-ZZg)w1FIp(3^zuoo8)e71Ue9OoHOQSbHJUfP*k3N-^0 zWOTW(BukiH&_R2A<%m1>=LelC%Ak}*@IHk_qrRh3Z%Ib0JWvjG zF>PY>QCY%o&SA@Q?~N9=d^-P5U($`)HM@!QH=HTKRoL|$#n!}rBou?QAY^hU{~jJMrcz7=Yed3H~a9N zRHUm|yqEg-VCcN4f#a(AOu)O$_ylVGLx~rxw`Ps}FJX^&2aFG%)$WM6pd0fDrZGD{ zcYJa;@UP;pAo#7?1n}%jv05_LELUEvpSRl?xYZvA)Rf{Mc}U={>ys2ed0(9h!r&t- z41;@Li5(MXRWQ!EkDhdJJd3+o1c_(T&&%eOVQ2C?>W$5Ym#38Kd1%T18&ZXV;JvVPC^i_p61ZH|Cl(ToL`)q`k~SF+IlZ+=;>ff z2%h?Yj$|N=)YxoSO?MJX1yEOEjwiiLDz>DbM}Ot0#p?P9oP2pwzbDDF9m_R~xw*5R z_1$Swj$_)=R@kE6MFKW$zPkSjd*oj~_s$&I(TaubGZa-u?OxJwQu!We#AvHso~!!u zrOn%m#Yb4e4;}5_^fL(O4ydPfxAIw^UwfRkfHP454x?CxGxhIA9d;tWBG=z$*8&5f zoj7ykAqTZaRABOjqW-Nua$AM=)D+W!;GBM|I9V7F!BJN8TN8oilC=AkEeM?3N)of5 z)MO3#z}&?eU-rJ{eG~-Pn3jp<_h`6un2*Hcl_sZ;@^Y(=cP74g>tX+WmrE0vM7p)6 zbZn=xy%d2jy@*ly0ua#4XszWS%ko-e2DwAznr^x)_e*aJ|4Qti);a%NdQ6J9JzjPM z1vp9kI%vA)NxMY(>TJxhe3_x)(#3p-b7^qV6#H#}t3kC4>MQN7GcZd#D;>b6jE8_l9IVhht<&AemTSPHc1q_{{?d!7_Q znu~_fAzYj$(sFx!eK#MEz@?w* z59;IIQLInYJLU3RY5ro#$F7}?&b-7Dmiw-7Q{F$rrm`?$)x|7RmDMj^ zV(ows=W~lB7>EOsTs1X?MFt)u!n|KgZz9C$;9$kVARn~8mkwpf^wv~FHF!cADf7f< zW0t6Cx`%t_^va3;=<|e5Q(nG#{bRu<4Yb~GNoQ==fM44rS9QwMxWn=7C51q4c*w?w z=Pnh@YTPR=UTXiA#^sa!mv?{&H8Twa@xP z=rewq-CZ!tzV_~)1L)S>v!oww4zIQGk19TWqsQ>;aLwFk_Yc1_20u%(eKfMU{_O81 zr58F}ei-pGWYv|3t=R9BsHanY=-*iD^tY{SS98sEME1=_DUqS{ZsEG{^CV%sM?NHa z`mhIxayX8C=yU!99Q%M?U~>L;4(0cJukfM`RKM(ARMTK3i0Gp!6PmHv!nsMU zd}-6TAVatwRrgGsSFD{y)7J(w@vbEDJRp3tFlg#?N-n8Vd9CSAsC!#{z4qruK4OhE z*cgUAc(ub2N^AbW+9aP}oc%V}_nfJX7v`FfkeH9`U14wh%;w4TKP#^n)?Q4R+jj{! zKF6LLcx$E}2)GHKouz3jYT-^@A|pPZIjrXSiWr* z`OW;(96gyv9XXjDa=nx_n>ck!{V?a~NuZV=s@SF!tcpKZap=t$^_vgm*XT!uu9f%w z2ZK2Hzj*GWZ0d6|bx|c1W&Coa5G@pSdn{`&S|-%Gxr|>4&~xPpGXP9Q1dU7c-<{ac z>0C3i>dawlJEXdG$@7v_RpVa#o8Q-LIxV;6C|9)G$uFI|>zK{*s&9>FIA@IRze?ci zd~r@~%?~6NCEJ#oMa;0qA`RvtgErYSLuthVQK4OwQ&>h?uk2Or*fhil(KWV!WIaS9 zjqgrJk&zv-+-sFymWc)(9kW1-?lw`rbX~eqd(`q_1jmxwhD%hY>PtmxA@@w=FjB{7bxAX%Lrs zn6>1fP}fU`ad2%B>|yD}_l@QF*ns7S`;U*_WY|)2qD&dT0X?P;`(82$ zzVbKSQwt=v9wHs=)fJ)xU`4a*O28Fx%o6I8)GbVX8!(D3x=`0!^$s<(mw#mMifD!| zjMA3}ipea0$5rgUBV;CmDQ$llYGJzj+FxL^MLJf3&__0(9<>%i;@hpipF;^V;{5;m~~X4^BYcQHP~8 zCrBo#BQ;(JR4i51^JTWNTWJ6hC zD_!a1!N6mk%skE_6~lq|478n$E&Kur8fv6@$(SED)n@;(0={l_XDfvd|Hs>+cSGd; zf{!*geD6-?j$9Nm-7tH zyO^@zuze$(O&hz&^o^y9o#88V>Mm5{`hL8cSqSKa%(%Tf_5Nkf zbHJ;2{kz_)AoE=qY*6Y))QHt*CClKySN@k~lpovB*D&KtJM00Gg_tFT;*EPF5g`Ys_99lMb@D`;wu!@Xav`}pSO39||&#*->Vf{}&`BykT65_xied-%s`f>JML?69> zJVs#)J-U70AGLb~XJDu06Rt&uTs)Z=xqS=pB-a+2>@?NV=5uE=H4hxy$4A@0&MED9%-=_FqS9rlo?Y0x@G@ z5X7*xvKV%WRrsV`k+%7jM|uB#?FWhXR=Z!f1ndnO3N99XAgQTtN7rjO22!0ei$qVdN!H}o>pH){W$T_1$^x{ zI$|aU$L0`qju`w{-R&jMMGM`C`^u09NekI8#4(%vx9;?e-}pgA!H*UABaE{DnZd!t zUU5v|`&uxNAEB&qVvS$7MQ}*?{G2Rsf@Z4VK9LKr0t9F#pQvDSk|9}qpw-EmRo~IB{YB?*O0;D5~WZD=Mh!QlzqZJW;qk9kgG*F+fh`6$!7;1FIIy$g^ zT(H-#ALE>Re4YDX@8(cuoxvMYYLot9uf^RTTjYRSUbUbxXB0_#dz)=08%`m{sN*&- zgb)Z&-kg~j!bs%YWA$Gh8P!6$4)|AX8)AS?aH_0sUFjA-xt1#`G5G$AP|bgT<4BXu zXOS~EvbuL{09ltI4qA&>1<%DC{c&jh4!^R_tUBw|Ar!|Zh*H#sClW+X%u4G!NsYaf z9Y%l*s(WZ=sWZ_<@@Eo*TL5zZ`6Ppi&y$UxQLw+|m3+z5b&rGqmqZA>%afwE-G72!V1zyD#l&wLnbGLR zU*C>0k$4i^I`7@cl^?i83Q$`k74#1MgVg`Cc#V2Y!G#L83ZEf{RBN0;$pQb77Euws zm9nyQ*mQKK^qcbMfU09LmxGShhVgbttR4;N_z3!fE930PwhwVIT6+~7h&}qSRdH&L zYr58cm4fv7*8GW&!|CjM0LMNx=-<{t_TH+>W5wvYc0&I;DZz*`^JU@~4RQ(m0sxyz zZ^WXf`GP@bt&{*gxmC+J_I_PV&UOEOXP4szRnJQt`Q-jxi|*gdSC}sdkVL!)>x{>8 z+5ER-U9-jlaEbrKf39+)GuXFTv0ncA?q`&C=|Ye8+F%Z+ zvuwE_=wi;(t^PigMz(3O_iQXj48|W6$yAM@j^PW8OpBF^E@L?J$Layg)U9-^1n)n- z{Gvst4_+PbdjyNaG-!P~)s`C;*c#~N{X1Vft#bNa8;0nuW+_SbLnw}WYs`U(3%6KL z-5gy~`;9#;unsAzmfFB+SoXeND?fS;LXq-X75RRD+4Be$P90hgVG`F)biQ!+(AOFD zpWTR(jy`CU*Fm9jcnF91@ONjfj&@TKxZa#zK8I>|BcYY4;F6mBDp4|$RZ}{gsrR9D zhijpveBi9#!+Vxa|6y(7^O$1FjgIMM=UOu~Osv@CRup}dOn)9fRPUuVKGwjd9$I#N z{rKbWT(8al}i#m z2r(P?bVEMJHKxcddbTs6L~#^?%QF1!|0u8W8GPmSKW0tGCG~5)FC?xB0CHXu^*f5J zzT)u*h9wXHV9$4~Zn51`GcsRb1sK`Z1QQj0wjgFYR%lmrUl2Rt4{~nfB3%Jgh_UeN zLkg^&|D)FE234MvAEs;#x_EBAwiKNxBJXwNNy611IyTVO$C~WReR)~CF@Uk)OJKIp zgA>rh^nbbws@{$+LbVXpBgLyueb3(|reN4QNWEQOL+g`Wif(G!QRm2sduPkD$`&wk zai-s-fN|gy`d?6~H{Z;=e}~<(BQ4W$jQ>s^)T5uEZ4Yq=2u$Bj&Y?`U*P%2 zp<#0(-!IH{=sy|EpsM3&s-s@wQ<$p??v0C{6Ep|=2ykPGwDox zepuflyjL_s$GVG^U*E083PCR!u2^q6`H1KY+$_6B&#{@MU1LH%+o1Cb&OF*>s_L+d zSMrZOnrlmO%Dh2K`RgPt z^08*^^|-r{I2v!y$Bt@3=jUzRBrELlZCqz*cbgQWexq>hft)mv<2b%ZdAMnbnO$5N zW{M}M?PICu{94&X9}8$@>u)S54Y$>ki6G)dKMHMHbV}fIHccy!*;~SVpVHMZ6QmRh zt}HH-ovH)4T*m@8!*V>2uoKWFj~WOrmrxh8rPt48X;Q@3f+^{I1QWnyACn0c$Cc~J z8Tw0)uPQiEZtFi&xyQKIKOHo>rB_+J9#IVYJ|WgfnKUW(w&7b;+~rv*zDVGZmF=@s zf=B;&7gR2zG#2ZfVpEy$ys7AStMX$1@2g>+)Ab+jtbR6WwoaCN6uMP&L#fH<>M8*6 z6=XZ?ePDSjI3!D-C)!$cRQ; zZKDij=f-l~Y34%z7~+$N$h?^YiC^-+&Y-S!!o}JfcMjA~!TYbL@C`;EUR=GtNvnSo z^M0r&*rNII<#ewsnTN_&v_}F@ zIL1npdmrofWobQYo9evp%*|=IjdEq9&(GX5bN<4}Hn;e8&BI1C24%?}f4JC^u>=Rr zmE=*}Hxo{5-$&sfRN)yjNqbecRaVg@#tz+V%siHXH2hL5Zq11T%Z<9-Sx2`ntMRWu zNY{JG4raF&PFvRu|4+IeRN`Hjrie)%wok9gynb_hcf6ov=AXUCQVCszd#?_*R8+D{Ps}KE$;RnRZ-EGg20sGLLpcJ)o{@i}Kk-T+#nhrAcHuggS zwCn_O&9GaxJ(p76d`0q97#@;#C4+#;{ZCrk$c*EFCpII~BP}b5I`Ud#a z=GOb5p@5Q~8OiGsTwQ-xv?hPqNZF?GMcZRor^MnhW+Ay|Tp(p|7a zTzNav%RKq^DQDhWg^HJvHgqO(uPf+D|87QSC|N$V6{BU5=;R@SPJLe77_9wSjn-vI zQuwdOqu7Gkeq=?gt;5&{vEA>h5OF#PH_xVswR%7t+Vb6;93g%PHQJb&yje0Pc3YI} z+q}Le4cQ40kZ#~=L*DhEzEINMS7?dZ64&_1K*0gNi zXS6QOKLGV1oTfL7En7;3nk8l|b7NbDMj*EC+SDL@D> zNj+NkJ^dF@Xq3$w{cRk3tbVd58Kw3im`iGAm)AY(mJ24Q9^=(F`|=u?Uow`?qen5U zbQZ?O!n0f+6A;dOBZRDaRm%31zT~teT;iJqNg?E*kJdJcnoE@@s}VRXNTcxKj*YYH zsxsY{+V8JDwXbS3)MBFg!Vv+YFSle?6HVLV*_K*Jb!2O1%SQE>9M=lWHyWK{4Tw*< z+P-;@G_`F&zz9a~ea41@ngGj`j+_1Xf$g6!iL_gp?US6US9xoqwb={JOm!ukRrUml z>X0RZcJ}`M6kJwgS|k8S1rXaKKz6FfAKzV~2NTW*s693?Z?iVB>$|go(J$A}Z=`O2 zA>fW=K%^P8nSTI2R)DBO+|36ss9@_+n{HHozCpkXVx(&c=5jr3puNNH_#~H>QZBy& zr}%+&PF6p4um@n)x2u~Djr)gX4#*fT_y-up(a(HB&>6eV?;*zkHiYk{_uD}+Acq!_ z3-Ehq_1&ptXLvf)?fB><30^PKx^i5}Zwi9#h@<$>#h9Y&Hp8C_m}?34d)kPx?|n`j7AqIsjOj+* z6NrrdLZyYd|4;bPNUKmqzb{xZc3d#=(7#k#*i35AV0kZoXrR~Z$h9;wMR}|ow>`U@ z81yZ<^QMdV;L=-W;b(Stms;Ew<~Wj$yV#98Kd7mdmjgSb1E_#AI(LLm)8-_+%}S4q zT6+Ul+O_V@tkkdMSGEU+Get(HGB7oGt&^W|Ibd9ij>nm&IlFIQk_)%Zl_p8xQKIwe9vL+~P zeHD;&K?dI;be3P!rr_4Zpkc#eR;%#XzqQ*bBPq#Fs6D`o6WzK)9yOpXoFi1 zl2PWHpRuVuTi6^}eX6zm`Rk_~u3$Cp8 zYM~T$G;t3PzZ%t?{gxUU<`)HMpoN@5r#73~QdInLih;c|_n|(^$KB|_RF3m82;o~b ziP|;@9V*-pLMI(_j0O-LuKl@8off}TeUZSUSh0r)W=)@Y6O2x zc?Xi>r(i5dsH;}C84SWM3MZ(+S5pl#W?zb~h(P!-Dp}aGhCs-L%TP}5KvzDAWUBR7H~8FpcBV&;oqoBv0?w!O?Ace{Ndcc;)PlLL+*|_y zj!3iGv;Q2}L!_-q+{uTOa>vqu^jP+DA!MM`9XQLk7?~KuF=RAXL}!(oK3R7AFSw_@;A5_bK>0S<%4%JRESH?ws~xr-{6)Aa zj`(bRIt<8&X@2s2D+;xH9=KYmhe2uk4uAvd&*Xu2R8T(rJui*j!15ejB4fyx$S4)xJ|6U?`AjRoJ`ZzIpZz>%f3{qqQ$@*>{;uJXhF@f4_y*MPeV zUgVhL3P9oP@&CR~fXfadX?EC0hM^c?NJ9|<7jM&*_MEe|(ZSj~T4l(Kfh@;b#f!xC z@fUN|(^LRlIqs~XB>|aLkv0>4o3AEtukR&ADL@AZuI&6qR!irCFzabB0{|6N6b_$p zXlwxry9e9#ckC)2b z7qazQRlKra9~6?mVGOvVu{W)P9*a;ZP>Oa^w{HvW&)IvoHql{rGxC=KNn|owe%Grl zysB`Xqs_9vUq`C_(RTk7kZK!=6iCJw1n*T#c_F}N`B^GA078!kdmvtR?TB3%;xFzW zNRc!D@!l5diJDl=xUrYU{x&~*@_PWliQEZ!m4(sQ{a2Juay|SRAZ4-BU$ll_$<0+E z@75M^&vpd1_Sz}Cz>FbnX_|nVxV@18hTOb)L2QfTo7wg!__ieXVf?mNOXX^F5V7r# zv{D!tkcHc#P&U{I=q!_t0jm}DGPQU2(II{Vjew{85w@0D4o4dZ< zF?BlQoICN?iE96agrRr6z|)k*I*pT_P-wq2108L;e}^vf5OBd;9q_B(!9*!Ny_WI; zB8-HmoxU=8EMS07BR5u>5$R8dn{XQ*gk5%qUtrq6Su%d?H4T#ELea1jBc9ZGfkooT zaLf`r_WLRrNS@e+cJEAgw@ZTDVH;?7Mt@v;)^)(LFa6JjK=fw>&`XYbz{@@|#;s5!$Y?F?<+%hRPvhGdI6)755|6tLH9uU2VTCfrfT5o7=a>d$i>IcI1?w!~+0t zV2unbgC{x~5Mdf0`!T7TB6t3P4;Aztls*O`bO`E= z1eDJ*YrfO0?04?pE3^Lrd(}Y?y91zY)R8P`bt%mjo^ofGH${PWzO_avR~TyoM!gpZ8M2+HZ(Cinje$?GZv9^0}uJ3F94#srO@$T(21&> z%&gsOG0C*;hJ)*myZsai6R}&H&(=CF!lt>l!VfMUE)ViwoH%0S_K?Pv5!XC zs-LU8!)Tj0ReHCK3+$(|i7ssF0;LfG_HbI0<9PfW|Yj5g3 z6&HUoC>D5O>zC7$6)khX5xBF-Q}JpfWGNh5ZzDzJP@jEL+eR}>R$4`+YmtkVg#{IOK2MyjAdbu*W z!y#srnDYv2a^fSec`Jrc9F1#EV^KjEe83Tc=y1~ER33OdaqU?8LtgZat3j9#!2i41 z0dg(~ux4Ri6+RpWE*B_k(nI?Zy>(Bse1cE3*QBfP+*{pE0d0BfzCOVu{ZLA-)mpS*4FdI#>nn5wa3H`QDI^`Xd|f}BIi z>d9CZ99Z9mc~{T!J5RW+lOQInVjCWSoU5l&V}<8y}W1p@ZwKwAnz-? zUOm)s&y?U{;kFU}XwKesNoDI7&r#PdK~b7xAX-zpzS+jJ;pYXBu>?;(X?M8w>QZLq zPR(4_ga5(9qUo2`B(7uLSYSi;y#YR?GeRA`kS+NZnoL*ed3a6FJ>S9a%TIjw#r&)( zOICW*I2qF0WBJsU(Fgr(?!o-{`{KoMN095j_6JjlSz%pHhf;XCt7PJ59q}VJr@_yI zwa_inj(%pq+xHqMDakGL*G|_?<%bzxSA*sBD>a4}avvU-!%hcp`94bQaPX;lk+(6e zS5%?8l1wc0KJl9PIY3E*y<=<87ysPBJH?c7MJ23b_N?p2Tq^!!v{rHys7XgwVYsbN zbDjPdOSUlyTs^2Bp)i606wisWLa57$D|xh)q(JdYm@67@T3jF zU0qsBq(hqh();~z$sRMd9~<2nF*1#y==bjfj*K(m_dOg}`}EX8`Ym8-OU|1* zVb?BqKq$e`i?qNdoZJ1ldCA`QzaxaA%B6dgndrnPKWtK0q)RR|*6V?-F%7X7McJ?;UEKv} zwq-l1?Et-_Zz%H9y4gQdwsU@thM=0>Gd5zJ2Re=8=eg@-{;sa z>ioC=om$|m0)AN{T|~<%qGM<*FX}kHY2+Ru&gHYhRi|c6%>nY}0~SZS0pF z$sJeARX9GZt;(LDnEJ4uk0fTZj-9h`vcK;6V2Pqab$(>b$gl60Ksg|8t#G4twfwz% zy3LwN=O!?`EkO)v1bIHHaGkK%Cg3*zo@2({ zl9^P%?RaM)bd~wF+`TVf{tr>_71dN5wQI+UihzjprlKHHRg_MAMd?KZ=~a4-^q#1Q zNS7v^i1ZriJyCj(^iHG(2oN9yNZEf)?PN#HQkNM?kezR@Cj$+EkFqULp)Qg`<%=)VV(qyjVsqq4BDEhWQ?@u%mf9% zD4i7(kyDNny7+^kRe`X)K9$vA^+|MMcbU3XiEDxiG8rdzk}jpR;AVF0$#uFC&S04F zlCS%fU|<#|!R9(xX$e*zRx!02;Goj>YY5Z4^llPuK^L3J`=MGhRq}qSgr%x-KCzDh z6Sf0(>SlHf_o!#cbf*On(Y0HC)qgU4fHj=I)dfnh_iIYd^DZE5wIOPLBCOc69wm&p z#6L?LL|Z77pkH`myp{_8R42WBDjD$1;%3DDqx;+UlaoWN40Thba*yyz+EPotf<}sjS3_o;9@&x2 zC;GH3hKA4V1Ommvl=G^5mR-jpo;{XQFY*mv%NTZ>zG?*#&jh^=i&hRe?A@po#FTps z13N)qaBrCoLVCWeDCR8rezOrf6)_$huV86S$^pL{wObSH_qs3GumiJ-v(SJxXeaJS zTGhhJ>m9~pirk%jf`8SLXbO6vq^|P@$9>k)BaY}LU&OVEycn#n`)S!VoiO?#tIIt- z%G{LfD`!^BXlxuM&>oqzWwbREg}&7*nq$zih@)|xkH#uOyTs*g`YI9{7)44#VbrGY z7OUUepJ8<`fj@FsKdf`&+42OuzVtsI-T&>eu+R~t^xr#ey5@)eL|u8=%}FbzRnvac zn(0e4ZwyUM=#j)FS|e=~{E#eomi8=dlDqNkD>wz@=soiEB{ZhzS9-E`**YPAxP1k$ zIhT`W^PPmOB()WDiE>aL%@lSVZfU!&sm_iZzlxKM>8%kNacDiPF~YbQBHz4}Ff+e( z+;nTEKzVEW?i4k6?de8CBT4^-=Tj@gamgnC`J=MADxJ0Ks*4DfsH|DF1xA0a5YHzH z!KuLMrQ6O^Y@2=#1a_6}%SuWGU0^je~P~*5-C9)&-(1{#&FW);wb`;SPWO+9zZ1uJ`(z1u|b)OYm zWPjY!7vLjOOn6Qd9;fdx2m+s}p7|@n66d0CK3R~&thu;;d1Ri(YuiyN^e;mzZLaQ- zoZsqMmAbU?owV4qDiY!j)Q#c7ZT0NLgNQEMJ8G><(pq*})(7MHceM1w8?=?XOh$}N zR*qhVQCxg)Kc54aJS4jNkHnvAgS=rpNz-g@@)=kf+P$?0$yM(#>h7-fAJ2~u`**{Z z$?qa}f@J(7G1gzad>=#vK1wkI{&L!01qdjTQD;vouG+ult4Ln-svh^?w6@2}A#_45 zeBZn)@m!;B+G{Ba$v}WT8xvt2p|ck4e*Ey6XF{Mr&p7$b4J^yqdn~W$Qyv;}un##E z*>Y$MA)io_wre)BC|-F!cLOxTp|8LuO?e@Y@NrJA>$w5H>{8Y-iZNjNRQO4j~m*ejcIA9EfXu5@P4X=DMye*-rfv*MwZePpndm_euOe znXW5Uv+laco_zvImGVsOF>DqyvQ*+^SbNv+mey7jZ?Dgc-I;BC$z4I~X^G~J z3{u2F&RV-Am||?3kaR!sUYvQvwh^D~ljv!-|5-!Jj20w296^>4a?9a=p;vb`DnoZ> zEtK^!Um4l!m@XeUx`%<{Mc-V`p6y(zpE5xcbIS08Kk=~E_q1C)$9o4y7IUA&{Fg|; zCb{X220P&~Mv9&Awaw@DVljQ?(h$(6CCyf_`_!c%WozoM{Az^3B~$yxCH%FH<1+~p zxmkoZPjK*vB)UgcHUD9och=U}!$(DU#(Et?B6E6i`gW>+W#PNmR`$<|BKJS7qCsSC zs@}~h?)_2oODj+vl}AC5`1}extR#^6{eY~Kr897LX&C>1uTMamY_sLu%IKKH&!%L2Je{~Xn};d0)|%f++;Z?;LI}`va^JRz<8jZ% zO5EY!eT=dDoP4HI$gzFsiL!D%ws5v(AuPd&dh%6%=Pj5ZYiNzyR<51=EG(xro4oNh zq^132fGl79K=F={1Tso$yIA^F-U-QH+jyePJ$@0E78NTJ`+7J(n62zaDVp@9w6>HL zrYD24La7QjfETN?(2CiKtuRK2l?5rS4T+csWq| zXX9q+f#~-I&t)^dfR~o4&PMhT-i7^e2ZMH2q!&?LrYA)mxTQ_?O@%JOz7~|0g z@QOdPc5N=G4NnnMZOU+ZJgwCgef+wemfo=2uIXYKY2)E`aOYfUesXe^Ul~)m z2aY$F`C;etl0&ybm(TWm4|j<4`E!5|%QpcZKGM_pXIf;$p%B-FQ)JB-`gL>L0$F4d zvNuPf^KPvmCsL@)QD2AxvJT5XO)KqmDGev~^tt`qCOg5B`eT2o=?s^5t2BWcEn(u^#^4t*#=L zUj4}Zh<4B6H%|P`RH`7d{AYQZ%Ihar?9*Z(3$<3Tv^&CEoaN4*tCucU*-GqscZpG4M~lPM z1+$+X7X`D6sIBR6jkx?YZs`cRc%rnARIfIbe(SiaJ~Q(?sLxZ{W^Lt|W8!SrVB;+C zS&Ohm?2&T`JdJkQd2d{@$f-TqsfGOt9^^^ODS||FFBFE_Sce4&Hy|n!(b9-~_PKX+ z-;Hj_$7wfKQ3z{~djuTBkalIJik*E0YaLbsUEqgxt2mvMG_R$|$U2ub?8yM}5y3NY z<$;;t+J)X9yDB7Ix%4{eSwZI0a6Z$_FN8hz{Vw}p;|e`p`~h%b+MJQAZ|(bZUTA)Plv>J(*&?##6tUyv}s)J1Bj&*gfqa>1Wccmfnb1$Le#YKe7o>xWO;} zVSLpRsz|bD8Kye7vt9(TL*~)pceR1$pyifK5TAZ%Fus_#nj_!3K@qa!PM>atanP`% z*C2s6?}QhANo)5w6yDET+&(#av3(X8^BqJZ|01%`YC;aP(iREAw&yaa?-+A`qHMl< zwer3L#$#>@nk9BWj)4&O8J2kzY=%9HqVlE+2GbUA6XnT}E_I{GT9?L_yLR-Em`?Vo z%Fl0^;U#r;7#xT~b`7xz3g9VcVMIbvmInjcjiJlnZIr2_3=6hS74EH=gOJt&73^C~ zB&HMVQ7~5Tf&gvGTiUD?`AB=>Km3Sv%XHK!|GJ;zxSmkpqB1e$ba@(o2??sCkv9}_ z3tGjO#h3jSg!a;@$7eg+{;Xxe%)^>>ll-ccoUwYIuDGtDy3tuz^};>}KD61jP4A{4 z(E)IfsG3e_q~NV$UNr8T53UJ0KQ(UBV)-KO6x%g>a`MSYl-^7`d)x8NJ7(8nGtDk| zw%(5Ik_pj4cl^~gh9bCacF{l+!t-Rebp;a~dN#+lb7o}LD%FY=`8z2`QTJ9^K){~?>o+>1bk_o4%z z(B8AXv{BdxnrytfTa!Hd-r?y_Nhb4=%j`)dBYofAD=(pjPmt{fzSHq*p2OS6Dv8`i{U@Kj z{O^6xY$eyzlK9U>RkCx*CB19bbf*jI;96vxSreD@Cy)2g@5AED|MELe^j?u4ep|St zG%nxg(s)1cSXu>0pS%=D)E70vb-U+y_}LxKW%})s1)+Ov)KTXYyPtBe`IT z=!BoGGb-C&92VI!lzo4YTV5yb0R_FBPW|?!C4B#=Y`D(KP&L%mxcIxdJLS}w;NZUB zcJbc0hJh8&rt49=S)0;Rw57W}F{Mk;Xq1~jHLyVU9_wLFajF0tbw@?^Ww#M5k=0(j z2|a$_F+ykh<9Wab1zi|9*`csY*?0AixTky2Zev#O+3w-eUMib;3D#lbFj-V*@Qy+{qUrv^6~C6jMb)dqKJJ;b%?_x!i2v|~V0&amd_{9i{O+LcuI$vm zFi>Ysj>@k^@9gqb!4ik2eDFB;)dineg)v`T{m;T6kccA?gQr+FhAVYL4avPVoTI;a{l6ARWBu_9iGuL_KQ^A39{qpuy zm#6adXhWYhre(kA#aM%iXfdnBNqn)aG4zg#WPp`Cg--}@}TljOjo9` z34@#c)&ac>kYfS0kQA#;QInDe-7h{e;XKm0O6BrazP7E7JsZ_H*Ct1^lMa@d%N4B5 zfamVNzokNDtzdQjzKM#3%CzdY&v^W!xf3MJm3`p5p(2h>jDd-0@4t=Vz%iFm^pDTW zfmvSF4-0MyqF~C6l7UhCoonyEDt9J;mv;2sT!rQ##*Lt!+Dq!iEcmRf1+$3a;Vg=jSsQ?Fxn5UQNkry- zMgHN6R;=qn!_#uZbN|M7AKZ(Wu_hGvb;X1s;+>S)u>|nwg9v=U_7QfX>2yp#D1YwM z_;nv}8{X6S{>LCZJetNQfU=C%eW_9|bpFv*!%#pey#w?)KF)caW0!AT0 zZV6E+QifDX$eh#?Jf3j!ulmqm(^EmhB|PyIUfgnfs6~qWpFXaIjbwR0Z}@DG|b7qplB@0*n+^>*rXWE@g*&dAz+l{gK5GmO%d#^|O z`|Aqv&q@Ps^RxP)zo^5H5TGoXn&RLb*RR_tCu}WKP(e1mJf=qZbd(g z*_>f*ixoZkB`&r!GT~d7?$?Yl2$5QD+jFY8%dP2gaOL^eDF2@K%vUu4VVhJC($pK= z=yxA8a&9mWiyFuExzXNBL$-oLL^)78qVa)nM{l~n?jje`J@Rg!blzjCtME;mYa|J` zEa6VYl5bPIw~i-Z&7)DyY&VPK;~#sOj8IF`tO0RH)OPJnWm>W!G#0f}XHtzoShZWx zg6bS)mpkf|cBhJ(kDiQ5cvR=t<}J;8vjTnyCY`Ig_Jo#SwM9!dAJ!8{cqo!~hN&km z90|8JME`yMaHv?*H4`tcc&?q^#HekqZW=O~_(fZJrGHKRmRCB}WBlX3R8&oo*Nzuz z%5Tlbj|9`lL>{4l%mA0;%H(Nx%Rm0$W5JaFzVZ@3H5H9@)D?yng?n2MZr?RaFeaYy z0z7Wg!al)+l7F?RjhstJTmsUS#-)J>ep$iLGJn@~&vruLuf!whG=0!H@P#9jhz;d? z?J4S9RPrig?s~syIgHH2;#FX?4R0VSbhV|N7dh6I~3lg6c z)!v6zyb!&DHaPeBXqpDO*ZTArSRVum>Oe4Vs+Sx!$#2rB0aJ3j>LUz}5vvCWo10y@ zKMTNXgLIQ(J>WT}qvw3FdZF=ccLfMVq~);9RTvuA&g%8s{@z-n`$=eB)R=-wq-chm z(cLUpQX*OB^PQG9r`#?}#PWXM_5r#S7nIcLuaJ>|?}h5i?VyP9UU}*2hZY(8R(x<` zLOZ#Wv!y_4*8r;W@NHBe8QP=*IYXmrCixMJQ7bDliy(&^krDb*&1A|DOXL0o;XRlp zbP5?`j6y}0q?GdO%rM@yxx3?TNI}XLpcXk0vQ=Pk5H_T>Mdk0nJd6UGID}sF%$hP1 ze+ymqVKqVac{RalDE~sWm@%G#_OCU%iF-D8Wu!cC#>>b!mz@W=#nDwj3jo_kSSEiNs?NI#6f>bW6%8ikagpbR4cIDmn(l4pOqJ1ql%60p*-OZv< zVf=yV^a1$gge1q@z3t_^z^t9IW#gZp5*`bSo3KaWzosN97__GrAm?=P+pppxW?p~0 zUnEuQq(5?}_2JtZbp0Q@f6nWJ5`UAEB?E@4BL|Sbhh+O7vrq6#6gB*qWDRz(FJYPs zC>}5pn*UA}#`TT2T_Zr$7_lot+kB@B0j~*Rv!idpq*qKLj z_^ienE>X?sgI@C9%c85rnLTf4Z_L6Tw3{W^8MjUKB)_S*gK)&0#N2WX4IwS^^YN7s zDJyRzQpipnA7(ED0JfJq5j2*Um=YO~GR_wl66n)=Fe|0W)Of0SVZ1rWP7b~zrT8o) zK&M3&RdcUpc-(e5c?m$i$jI8Y!r}VjF4f@AOb{u<^rw2 zQcBOhhsT?yEz)g6jY{Z+{DAzIb@&$=DvRU^4gNu2{i;D(wNS6q?@klp+_oawEn|nF z9_fW|GjQrqTshDA!sX%B^Pd9Y zzI*my^}yeA^FF!vuOKc1^5#jvtz@-FCP<2XRsWM5Y?yg3C>NDG(wDb8+@MAPi!P(=QmeCFGQQ z@8ZP?vH#lBRXPpry38lwHl#WUy14E3dN6!uRRYGJnFU82@dE2Ge_M? ziWo8{HiNk@mZ9oD+r7e?D_V-%xHqdk#=gS}D$T4boD8!!Jy;{kS}By|e{_|@hzn<> zp}E$g8-msw{+3LOyc=8}XFn%8jkF5f6zjz=B5^nFzIVMnx^?c=pghmJMz-5@@QL*f z2|=*Py59S+5ccGv&1&_kt?ZXwvvHl=8QDkX6)_&6Zw9Qu37u3W<=Rn8o5b(lqXmWt zj%+>LER5i1T^vwIm~A1QI1mxAvOTIZaInpF*gei}=9P;XY3N_AVZ>#d6kSOwzjvzab5TY0wyB_xEm)?H@3y~2yESJ2gju=f2iOSy^hY71wIab`ZJ zu&Zr)LC!Y>@o$`0M078!@ryW5!ScZQ(5pL~;Q!Dkfxir5%Ze;ZVjqOHC;v%0Ct!3k zRTa^(Sy5~CmT@%w^^CVic1QTP+iVh3I29Lcw3uZDnSG4%I*v$i>)9xpGKV&dXzD2R zqi-w_XTzEm`^e6#wKYxE*uG|8TQAmTL&~$0ouBcL z5kgk}B7+rRnmd;GTT*=vD}JxdC%S&^1-A)pws~!l{eI_MotWT^zB4ndjkfmMc^SHG z!w%CLsh`GVWh9Qy>(7MwjAyuNy1C6a?&pn~_`gz6nNy9ImE}mva>|G=Nh*&i+mFGC zbd25=32EJ=9#Fl_`bt$8Ko;PquE-H1{O_ngos%1S5_RRJIj)v;r}LIDNKZbnYt?`T|O^jYC(;b8R-rmH+Mht(zeun%kj{>I5W<43dgbOgT(QvWiXWd~3YA1e#VBj#@m*{nJ{7Q#Z=)_+|S#-oKXZ4dya! zRJ8uevr7yNwxJts{KG?>2IR}IU&n@gd$*ifEA!4fd$%~33g|}N|BQOIgq)mFndrX%2gfpZ@T@z(M=IRMP3F^`mDkQm2~` zkXZ60A6{d{K0Hit-|BkX$!_yZB~d&e@mgS>U>adog5X`BOVpy^ zFinK~Xaj8C85PA9OiR}{%pZal&)j9Ui8pFvnV@Ru15e`0iuj-MMz6mp0k!Y6j6PK| z*X+Auq1e>tH;TWL>#DhLGCa9~#1sNYM5?yGdXzcKUf~hTtKiULpl5VBMIlBf6>XK2 zL;Hp=y8-wki#MTgl;wJmweX>A+T5D(-kcu{-e(2WPkJ$ zR8noAI(ZJL&p)j*)j6LP*^*PW2OG@#STUaTsx9l^nJix4jHh(|&emokC2z_`0XD@! z)?(>#X@Sl>x820^LS9d)wYBwLvN7?j6hD>Qmjaz_yFUFZl61N1rWgf0%JRfy`U}^K z9{#>Hj`rkWEpT$qJc~Fp3ejz?!m2aEc=kQbCP3^OmbzLZJHu+<3Yk3FReRzMaO1!) zHbl~>u)&{@C@Xw2J;@?$Cm9a|&U2GIw5}38{)>hXg7US{6={!v*(h*RD9v#MpPyAVce54Z zAb+0m_s+kycArB9k#~<5hj|2;8r}6TaULA5tUkm=DO`HWaslx9JdK>}3A7j>meCfB z_=S2z5fZHwB<-*^ya_`|nRKl=zSjVj*9=jZxeWlEU_FnTt>A_5lJ1rcwTd~;(pqKW z_=C5+-}1eD>)zGtK`#I*nIUA6ev^xaw0%our5-zqMBdpdv8qQ!qRN?fY4bjoq`DyE z*A##0cRKIM&eCH|Z7&uOZcY@aiy)$lCyAxB$fxfw0ns1Tg-(8=LFvMJKsmc`DiIV+^#s#Cr{Z!s!!A* zd-%_YV`60q@Ter2`sxWt>gX5eoCIY2d+L>N-H#6eKYrYMYT=tJC=|NeHt>hs1)4Uk zXLXf$ep68Yk=Lrj)aMUl3^_-|GqDDVMy2+ewAg3nu7#tL8_pe z+VPOBp=K{Ac;0oBP1y>L}laKeKAa6B=H2+s5GA)wST z%2shh7P{`9e==u!Iph9XN;_;U%TUM@dw`q%V?F&C&}o zZ8)p_pMf;P;BNe<&hJ%-QS&OmZ}CmGC$UB$(yw5*J;j#sx?u!eJ44-;x=6EUdE7!= z44-V)*owMlqXD0ftf}MoozvuKs55xS6dRaYyW^}Jp3b6;Jp#Y#Y9}8>)hRPEFrW+g zg=5_(O7qVH>hGOav&igx>K)3gR>-FPx(3BIh1CE81Tx|86B63*3}!>hT95IVt6`h- zG(im(oBU+ib`*hsqI97gwNo3lFf;_&D_e1`R!8Ff5EQCqb7(2l!%Ox&K&}$J;p!Y5 z_7A?=)hm$?hJWe&ynrV@N!RE0d$A=+)tm~OZW4ox!u%tnz<|P|1X_!+Cp75CWs*8j zkFHnuA#7k!2ieNopfg>>+#l+ZV!S1mi#zx~qJm=-pCWWCbiDt^MZk?cd8t6X1V^T5 zX6J1FQidw4nx(F2C$F<2k)|{eyKjl*#+(TAmA*?&GMw~Xd zuZbi{{I9x|J5eRdRtH|e-*=A}COF_$&{IEOtbSJqLs!BrFTpof!wbU?*DNxk;Q#8g zqoM*A1Iq-a6W!`OX^-dC+pJ(c^46NTvWkdwgWftlf9ntgxwDS1Lx0L-lksE}xdTID zQCcsF&y;hDN}^u$rrRS4D+6lx7E+2eLK!B|ETYr?_A>Y|0!ohvFF|Z2lyL_lQP%U0 zRFnnNQ`pmSq9C*YCjre)RmUxkV#KEvFL5xNeUXiOHZGQ2EjpY#voII;sP|ovptafL zheh`r!cO$4_>#;7gD3}=ioJ=zd?2m8IZWFO6!>uVv_yV(Ep*3Z^K}62`KUqL%mJf3 zk@;|2jDsiO<=7&PC1j_8QrxDR(qrO=dh3oXlDlN{Ar8AJHq`-9%H2V`0Db0 z<6c{d>9e)`=zi78-zQi@{wdN06i#e1M%4?Npo!GQr(_lAS1a0kd4}ig-D}I#71zH; z(r`Jft9=y5f&^WhPBiF$?B3L|Y2A1F*Y_y*wSCd=%`omJKKqYRag%96kK4jidjhk7 z@|{H6aS`c}<^We&$3o#Q$Lt99Tv=V)v$O4PEUQB9UA|a0VO?FHq>rA;lU`Y&V)N|E zee?eUX?Y`H*;iK-1=T)`@E4>k9(JdlFFXNtt&X=-BrX3@S5aU|UFZ=9e0}dDl9&bz{W&C)`^mOf{L_>2 z8r?UaEv6|@DGd(w!gIE39@j9mKFxI0jcg-|9G_CCpGEUl-9k|w`3a3e*i__U?hTXV zDB;IBmGCt*6ncvxUXPHiVs*`|JDRT5~R^bvOp%JeGpfQmDN#0#*WB*ngxKI zs&i;3)ib2Oe!nt-hG7&yu1VoC8>{3%gwKZMO+!_RHyg_pPSYcz-w+O*@A<@)1Li4dooSs`${m)jX2t~5awrMO?Msl)VbS{ zH_8PO1jS;1R}7HYaB2fbztv|599YhUox(#B`%ng3<+$pZ5s}a{Jc6eQQJhhK>ME)<_6+nc>uu%9zi7y1iTwiXIvd$x`xvfn~ zvklk9VWRo-i-6yj`UB#Fjf=0PF=PMbdF@VLOe_m$%|D&XQm3Bp2Of&?`p&tj(>vXy z@n!~auGzNIuY*@1U*aqMZ&ZZVCmx$3l76E&LSUP0>QQcovzrW;*KqdOcV)P2XfdJK zT`|<8X|~g)}a&g#QwD z-@&4;&7I@>*|B!Mj4JbUfWa$8he%qiOfH1}t$OmBvv0KdUDvdx2&Uvc8KM@80@shL zNI^2{u(rI|O*qM(pz)Ey;QY0_^62(?zV@?0qlxWB%WB-)w9+1=GBo<^f$(MyV}$t7n80O#9~Er#yj~UZ<1tA}7k3HjD^mP(We9l zrZ+JTy~i}w$>?TMImK{b(OZCl*TOs@NGr}9wC|UV_g~5kAK#>A*}88(S-TNKG4v^G zj`{eYGUdD<2MuS%ORoQ-@KpLYzhDukM0+>Ce^-i7lc{p}7^ph5|3`_wli6dyk5-}4 z>%P9A#}vfGf@OG3Wk*uk8!wmY|2E5G}*m@yBdKkqRE1TXI zNtYWFx*&u_6m=S$HJUdvCUtfMueV`$uI~{7SWXe*_#HG~K&1Cth%RTrqf|N|eMufe z>xl_jWemIG@8F%|c>4mYLMw^(A@sAsJw<-B<+rd?cQO1DBAt>{L@R=HK(x!!AmXKU zc@?ozVXcZz&ZiyYjW#Bv`pGt09q|v8GNPYuZ(n!@{;t=!S3u_9l&0oO7Aar@!NDl2 z{`&z6&Cy9*!HJAEQ8h}{t?6aXj?Va?K%U6JorAkkC9V~4qh-|Et)nqPB=#|Xdx(m= zd-u%ln$efef*GmasDb))33l&e0nGy{5Wix_; z_r^5t$l&vi^5HnJz_nb2tBND#K+xuAMRXp?Q7wFg>Gry#DTYtu8sJJnNwUY`)H+;x zk=JlT3HGU>83v;ke-NSt)hNocF9gnm^)`&;l&^6cTngsAXUW95ukg>xD!!{s1!&LC ztUgcp&cAHbyjs!#);0^@zu4zB*da6ZZflh-!0hKrZ@XZVU-I%=KQ{K4)&0L3vdKMg zlT_Ny=v?+MNjRF|zF;=`JS;y3$*z>xi!g&~Y5L~dU*axK@S zm2X|%-@P^upDkSN#^Z{<&uoSAFF8};WyQG!DCbaSCiL|Br-h31@;nh$o`G>n4`p>0 z?_{-_JkxBrpF}!@Moyz=V68loc@voQ;GEoR{vq#f6Y*hVKXl{QmzIZXHm z;DcQ93VHV2ukhL%%WPA+c)!56KYMgHOr8-HXpsV{#dtp+$ymff!7 zIsg8-z19V{l_UGXeH*D*dyvA0?gq z=gN1v(*H6T`|MvhCww;m<0nDrp*AOt*Ak5e=3VKZGM07Pa=1ffkinVy|F#b79BB8r z*D{iM(#Cm}tQ+qbqi*Zt^44qp4zB2BTrkU)``y;hdKWM~N3U;)wceTwW~pf4q9X$g zeTN3IDis`g)IDYF<5M8zfC2CegBl%02oimFjpJNFL#v8$!GEl0)%zEMe642{y*iqB zBeyrXwvT=ZbVyKXh@G6f(w5_-Pvc3FqSwm~2)m9_N;#N!XLkjyPZ)v}D&W}tdU+(R zO&mlc=FVB1#&aQ;gMl&=8_#)jt69Tn_lxZ0-*xCtY{bpPhQ$83&yw9ZJgsZC9x^#n zKQvu!Lp@!^IM(l(&=jcp+`X{yrXXj!$8LGQd2Mq@%U{+0>TNy%0G~(7_?2nMth=Mm z}Xso#HBCNfUMl}njDmv-BmYNqOV=tz4rdXyNg}k6TPT% zCqYQ9VSzN|U;OXBrt)x{RYN;&dY8HrZ}CiBW0yOn&tIAsJl>P#eX}Fvk#BMImFzR= z3I9G8_JDL=5fj=!7e{CWS&c{an*t?$kN;vjw@96)0#YcN`toH@Dd(X!B{>C=k z`oB9QZvQW+`5&R4eo2PeJqvSl6XQ45))rRptj#U0j4UkZX^l9ICTwJAY-vvCq28pm z=}^J&g>knhv;W>Cj+_gr)|M&^1Ua6qUS%k@C!q3l7mQBPwM{>A#D)PM9*W@fQe`Sb z_A3_o-OpQ31x59$B)ZKL|3-Ig6f2y&9s|d2oPcxom`g~ue+8ZV==9ghxbQ>$$yG~Y z&Bt>mM-Mio;~L2!YsnIv)ViW7y!%f}F=Q6td66|XzCpedrx~yAC+9gsTl&c!)%jnn z$>z0^;9s)QRNvQke}AYZ6nlo}?uHvY16VTCNFG06$lZ_Hr*5_%vRzr)z6DZ>tWX*% zzL0^5kU$#QPZgTP$7bT*V*TC0bN`z84Fe4p=!;kiQDJ)bCa& z{}ypN)lMhIPHF!m@X zxwui2DRG&#V6n`Uv%0#6XhdaMV!<~|8|%ut)6}r|V+Xok=fkpMNzmrmq-t>4F7#Hg zuM}1N;P>oiS&(B2ltQ!Bs-Px_UHU)=_RvU7qXbQ-9Vh`w2|{lUAwAJ+&fxb`aN4i( zjqCuk$_G=W24n$BTi#{Ba}C>mlAdH1VoXTwT$g0uVW|AUUyxvO4eQeu>ow5RmqK3w zap!3hQqd|b-p8R&$+acfq#Z?@>elrWv+(Zsnlz)+R~TNjFKrRd4m`DZ067Q&0I;T{ zmd>>^rlJ#0mHj*uSAUTqWNPXAWN|AI_JZ}sc<+V%OO--=+UL7d&l}Mb9zkwTLq<V$}VfWikDwA%D@qcS_ARAKx*>H&>b zK?4vpoJZRW>#*L!QeuS9`|Z!u5aY`nl3U?TWCL25QEwt*j~2gu2_L(D#)zUm=@En* z92ICQK1-Y-RmBx0JU~2T2h1k(xhwq^4VNK*&X-jY4DrnTTytJlX_~-L$aIq*-#2(8}Ci4MDNS$>Pzeg zO@zCZ${xTYPi6Fy6|u^ROE&vZ6?fM&jk8{~Gf3VtRVpBP#PQ$AQcyb;0diVm1hil4 zqtTi@gOxt*+tR9b!UC|dI#OZjZ4jLAEjW!v`v>)>jkXNiH2RPx`bel*I}ys&&0b!> z?;g!JwUsw@()@-fppI05dauvLT;X>nu(eIYU5rn(1Y}^F_s>^eo}d9!BvD|NeOE$X zyxz>#iM~S7-X%G#__VDuih{He zs&$sQk+W8G676`ntS!*LfP3gI?F$`>(nN!7=1HcDF8zYcwI6hz!EvH`H%yej*49JillDcrS1A$3WfvT;bUZ-zqJ|KRp|KU|hqDybtK6 z>wTCv3+Df6)sktnjS-`h-&7xdp;52Y4%GTk&qiL}=zS;&YNbJZb`1dN7x~hS4V~5( zq?y>ODh**FhCh5B{dbh|sy2DbM%dq<%f6E)O#e>=Rcy9u;+PWg9TBj#p9oIwJOzgJ zrFV3*h6ns{AQaFqT2OLLws#fs)G((hfCa$0BP@r~8^X4$P?9p+K*+wh%%T@hFH>IZ z$(FvBH?ICfj*SBRGy>!>lW4#d*Ji7#|7c}7^%ZEUbOt(Q@%NpwRMVd6By=ut`g%1OA~0x@!tMYBv<{FE1KKZy zB}k#bs=AzGOzxUIc|QPd9TW<-wgQHkHrZFw-oj>pS)EHG2sGlb#Qo5gOSDC_111@q z@>Ffn#*UohRZ^`^rCU7pkInIW2L}th&g%4bd-q^Yo&cD}WMw0bdV8=lv-yKG)1|m@ z$b~m}=5Lq4pIM+kiA*3_*H?b)Z~g)5wo|LC+7pHiF|efSJOz7D-a@LtcFMa1jAxFD zt`N8P82XvWI0XzV_yttaf7!OT8Lg5#ERrYV|FNM}PWMSB030enyv?3+^xO1fec1-! zF1^aHzH?ns&@Vk#Vl=nYU5hz6MHz9~s#NnqjXj$sYTM@?P@zA43kIc77Yj4um_A)5kz2T)ej zm)|k#ooDKp_=}lyN@!_leyQOUEcemgyKi{D6P^|S0`~ZzO?JOLa|zTQt!+UzrbK+T zOZls7JgC1+owFj=;6eRFms7z-#E|2G+`)_C-)d~99%}EcNO%eSH?-=PbwBG1d8)!~gLWv8 zCPk?UP-zL^_W}i^M?1<=!oQcBwp{gui3BeVj@_DZF2D;jzR5cH$a(6 zzg0Y8m+UO%kL&Ou9g8{q8Wpgj_FO{a$5v~bW{4@lH_in1+kaXhL^F}vCnJcO!Ma;` z+c}$F42&8`3q+JhSAxr6j6e?NSmD}}(zLMFZPq+Dx&ZrkdtmPjIQvbgE%qQkKz~w# zgy?~3WT4#%ndcvM5=ZtxQCU!+CSmB++WKC)(CjDjJ!hw=s-MwD^WcfIS4($YTa8d;^d!3CQSV}5J{#e!oMw~zW>D#* zT(^F&^WGRS>0Ge*3F=LiTc=B+tk!HVlK&*2-l(fWa?kBsE=H0I_BB|?F8ia;0Jx2b zm^yw6Ds3;2pE*D0dFq&9UR>>_bFWx*0TV0|{v+uF8{+N0v(lU59ZyDwj?I3BwGI1) zJ32924usFcZvLr71~FDl@c&LOb@9)ti0Dj9lw9J?eLN|6Uu-%D3-f}AKU(;5(p>Jb z<9RG?oV1zBSMf9wIb%AWj{H?E@3S#zCMEj`)1EzW;V?ZKdn4KtPnB)lg(>@LZ@lA$ zVAXVb*_Wa&-~0i#jS;K_rT6ox>!0*yE~qQi72iy&y}me%C8oHTjG@~i;7=cfme+DySo=RZ@ayC1D6QIB`A!9mUGi6|>dK)5zGw3pE! zV7_f*wZ_~OB~ctnjhF07VFlP`S*RACWwvBhnTzSmUBBBDfe3Cf`$N;apBJ!3acyFU zvOS^08oczib`)q#lv< zW8uOE?Qg{7IsbV)yO7qKxoZ_-@j_j#Zzu-aPbCoB{RMt#8+gTJzrD>yt z@fw6e!x9#t>rEa0yc{Q;qnN!zEB@=aB!AWopm?J2O~5q&`XGUM=;Ac^qqSaI#045J z&UGw$cA&Ejg#NSmTGmTY%z5icS>O8#J`s4o}rLZRpnol+hOrnImJ*9;qNN zEA8GOm9B34+;slqoB{mM8-|y@Hl2Nq%h*~`;E;#Y13=gwBI4ehRdv2$90>9W< zJJ48o40I~^ADhtCUu)2wIvF0$)g9YHDxf3Ye4VBX_}!LfKkKK?KjPg&hX}b?GJwJT zqBIeL&*%Rlo`%E44+fm>8~|@F1>?DnwDe2-oAbTBh!7DU<#4&N&rDUExv3B3qnzd< zF^}bIxK!w+k1H68r-@HxGf<&ULvJ~F782Y^K$etJAKad9f?Ebo@m7Ia|%BsG?!^zDRo8K9_*Q&OW+T_sp zsp(W8)?eB;6U)PN^j_vDkn!b8F7Wgc=Q^L1aM#M2rhEDGWIsLTp3Ts2s=qpV0 zR$q82oDYIUPBu8et@Re`&HtN$p6@j+hGYyC(4ZQ0J1B%XpKRG2IK;kN>X{A%8NW&O zW>D~I@sLTg{RIZwjW)B-=Sn%J7(>dT6a5NRqyA&xNL)h+D=c*Z-^;Jq=H(Q7vxKkK zo9BPxWg@21F=rz+Q8Ki^>&Vr7DIJ>vgEBQFRNN~2PL!ew;mT<Zz|Ki{i1ON8O_Umd}gD4)BgI)cRTwl#&y9Yk1&wB9Ba#m9T`rztmuT* z!vnnH(#=++*&RAK&9$T${oZ`qgCZ~hafu&V40M%?Uvm-e*RN5ZTo-YZgIFb5*UYT! zA`@qx5-prha>r(NO#?xhX%R7qNDVXB!Jw3f#WC&Y%`ji6hJJVPv$=CWCFYsT0NGHn z&)zDbxk|tn3_*^|PM-U?aurAmR=laXq}}>XY@CUmLBrD7L2_EeyOowHV^3>UqMtoE zO_HPt`Szd`0iSSn7u(aJFF_h&gKB1n!JyIy;Z^$$c8`QC|-92^0Z=1LY;(A1I z8@jX%597EJiXOvvdLFsQB;!Sg}S#l7zXqrvVSnXVr!j#Wl=`mJ#*U962r!t z=}9Qvl}7fZy|F%Do46E#`s?4`HD#a@bv&(&4IV}{H**V$jD$=)chpvqm-ai_XYRPP zmky5?>-9UK zODco%VNu+I(_nKvooX%ZizBfDW$4-qqh+?d+zGX1xPSVmY<`AlO_mPiFP*^6=Vz`x znMm~Z?v=_|!JV^&;ZbPm6WixUp*eA{vp!v8^5rkfYlp0T2$Fth1Liu4wB#hR+<8|nf1gxN>Lj<-wvh8Oqog6yB-y>f$wok4%BOs^UyiDo@1i-eAFe0IA2@;E0HB@ zjn=da>4JWb8!I#BFY>OsI63`i^$rL;ANq56#(_4EjH%e3pT9~A>tG~RNZWzCGJIuX zo0llLUo$FG0M4JEz~5Exo2=ypw*|jIg3Z_6B%VDt_rGzKgSQ6+V!C9!ae@mn{bt}r>MOGhrdj4 z!Kf?vMI1JSN-^&lM~@A^+=D6J?yIdS<#1B%NA%tIK;C;*RZZY35mKSh7C1%@)4YQX zN})(1Ig{>xZDteX;r#UT=xtlUNl35U`9gT-(2U?*!hVm;CoWb1!i->z9kS5KKV5LN z$vrl9$Z7d}z`YgQUhYE7pAUAGP&dZ9GR0ytm-8E?C6`5I6Z|qo7k?#Nt9k|(vN3Sg z|4^Hm4A2)Ip05s{w%5Huw!DDnBbtL^lISIxAR@jcSHM6Izaa%&^XV5pdS-KeTxDXW zgyY<0`OG3%Ed@5O6<%q1*nr68bKI!(kRQbS5?H91@J;hl{3>pWDM{!VHY>B+eqHHM zygOU`2A(4U`qj z$7vVrMpN-Jc|WzfExCmL*TOL~$yfS$?7*uuA+FiqJoA)buHVZkiL={vy$xyd+kKOc z#YsTSeQhhZVW-U<_|<@=VlXAS>M_+`2yNOivc*P2U@b~mT+|H^<1X1yHcH5RxJtS1 zE&AhT0K3ipK%ZE zCxhRQgs}MyL@f_mTZ3`6mcYZDkWg@otVi@B zBJV%{`^(|tAXNCq>CGAJ#_4i*;XZc{2B&VsTULg(@cvUf(ngKQvuKeH+I5y^=c+j{ zI=T1llVilmU)f2z@)S)}R@Q*PRCZx<@LNqQje!kzyVMK-An5zQlt-;;@H=yA=zs?0 z;i_eStr)GPm)IfD7v7JjB}$O)M-!-^T4JA?po_)Ua!Z$jV{_-riiG+W=O-%^wH#i5 z3tXQi_WueDIpDfx4FAi{(4MvS#A!`We&1>de$<{h~nh!QQiQhtFyV2v3R__FW$dh z0I|B{l%;`4!^>Cr6oAh&8h;m{|I)t7l%;n)lRmWOK0&*ms732bK2yfq{&fLzexl5@L#u=K_n3K zW0y_*@gNq8I^Ypu5o+2sFonN2gOBfekAEUknfsmVce zl&dG_eHrRkbb<_+zNK`)HKcYE# zK32{Z&3S73@=_jSx4D#Qe^>e??tU*PMQ)~^HX3~5pS-ns`6S%8=k_Wm%{-X$vonXV z>DFa~`OyiZOSm!Fh;YPkBy zSc(+(DCylVA>|gzUSBG!ay-{b){lYeGu)7%a)gC;Y;N7tCRE`YK`rk*JyvW^nv$a( z{6ISqJ4}m$J7{#y3#lQt?I3#hmrY{aQq|-(-O#GIU)CB0_A!$-{Nr}%B;?%v+zrB? zMxc_ab5?H)=0hfph)3}2`i#j=K3fhC@ho4$W=8q+Web*pxl*X)B8jtpbNS2x86xt%Qx#{Z3d|7DhZDp~} z=f1P<$^HGxcHZSf{z507pMq`y{x$w7?=G&47jpc3to@DlF>f$|YrPV+ZKpkFlm2-+ zT^a5x^etrOMO`V*_f#$74%j?eV^~p5t`a}d2$TK6eNfGs;#bhwb1Ii6^`hTSUW{NP zwb3#`*L7W<$d`F907{L?x}fFeafYh?gBo;?H*;M*g*+ZOz8uxhr~8^EA$Kk`ozcZM z(Qo+UgJ66?E^+63w-ga9CT8+BVxfeLy5_eF8 zMP93t2+rLNd+C~@gz8@@Pxr>JKG-UoLli$uxa)KoY85yo3H8)YbES^G*qFV#mz!5| z?9gd3emUzwF459dn{0s)(J?$+3S}-LAXk2|^LZ0B>7vEVNxksDIi=oZ3EGkZmOUSA z_PqAtmNujAR>Or5hMicZ#?IV@?(BxrZIsQv6Zcx8iclx*E z_a#t)0|SIo>V{SaEE9oXb_Xx3DbS~J%hPvg5Gb&UuMu&K+%0hDc|hO_8rM-?hDi7< zdKj|GJ6^2bKalxHS3Ymy%+K(7?d!fUT59^297`(8FnH#qp-I%LyJ#q}(tJBBN)Rk} z>DLD}Cn{4oz}mm6;Tlv20Ej1-PqTdftQ9D zX4V6$?^M**O$pL&G*F`~1?4;S<90Tm?A#07-yk`Cc`06I`oEN#h@sD5qAq-DOr-;` zawT(Cjk#|_j^9rfiTpq~x!q#enOlrUx3t=%C(3d5VtUmfIqSyPg$FLc=ZYSI;N0uu#C60F!|ascpd3^?TXrsV z8LXcRT6{7A)kRvW@Fw?E8YZW&IT>`B3#jH}R*Y+MzP_)18hhcB2$@o?(dHySzt4+) zMnv<~Cutf#pL7Y(jw?yPEgo*eF>{`7#dGr0mwWDe3s9wbSmIx^tazYtd@;o}a=Dka z?BFmj@s4W{H(Oa7l;zZf-?)DQKk<1-*ErNgee02@bgwiVTmqBwR`+QGTn|(SF5i&- z*TP5XCFR?1g9swoCpKwJE-zU$y~b`cBqqIX{4;Rcvc^=f|E`iedV7I>XW}JaJNaH) zUbfGvTE?pN7U*q(gzl&DhPr$4ukfAF+BqovmC6h;!)#>moBohihsNdh%`wYqDKY#| zDWUt-c&`4CdNmi*QH(2%3Am7sXwI*-}=vh689kvv=( z>SBTz0@?Ew6xm*i8{nQQc9hkWtf{Zj#;T(D(KTz7Th_rl0-K3V4F5AP=aMk)S{nE5r{e6ejVzw4{kO2uW#;kpnZ{F>GFt|6*B4p(i^mwmpD znS@r96$@@Hww5Iaoc{Fds{M@8u)}NkcHXGmkTe3^1_0u<{l7-E{;l;{+1;mc8*>e9 zR(RK+if35ABNpPdXWFPZ=*J(FvQG zh5IZqYZ0w1AMfy-rYDq`;i{hIWo6r@r-d7;rb&N93SEAy#ghhk7kQRg;T0~!R$2o- zO*h|$W~sx|Q))bO>Jzkz&7;{AFd>#M zvTV67DO4n^`HVpja7*yxNBWW*?zYZ(znYngIHa=h;7^H-WhU?`n~Rlhg*n40CaVuh zt+k@Y>Wu*vhx1$WV=Q_;fz+( z22>&XEGIOh!f*e|5HDh*s~;Yz<&9YSkh=|)R1a^r?oK$xUR(QhQF+lMl;fXJvdez+ zI{;wO2}FAdB94`9dw+4epbLxL|MB0`&dVTWt9?BOXZOOM^c(da-m;auJ8zRtZ1cns1A^W0|0 zkmI6gysDhf^l}prj}-ACYDwt5-sV%&{&rom@zRYosm}m2hpU- zQ!_PCR;cg$@%Y?(s{^;TYTS)-mlhw({fwy#tmrvkj(eOy;{ESeX`3oC!$6R%>< z4&pT1IM_u@RMlhOBnDEK4E$7NXIPvMV;sAYLpB-IXQ0GYkRPm@rg;=+=OX>(j`BGb zfOc&J?1G4=lw=ES2x~#Nyb?KOcvy>7y<~2j6euw<2)4))4OuO z0!6@2jb4C{$Hfsd<>wWFUs5gCO5Vvej2AXP09TlatVJffl(uGVREpOC-jX+(RhGW1gyRSAz!qB zs8{OdY96^wln>MPJe2sGKJ*m|WU6u4Ti3`kAp?!603D1-691Tud8GbR;ygWew(sinw`;uAEN@gEYvTvrAsx%fGN|s?%ct#xok2Ne2=(!FD=|B$ ziKKKleK59iO5}Eufv`HKM8s@{=5ogbW)!h(5b?)v>3Yp;WFf!8(v%Ij zT?bh6qBi&zx~~y=0O-FbN}8JLv`EYUz6UM}vguk~CG@UaD_+2pl}I`lNU})`Zjp#KTiBy^w%n>KjV9*Q$le#`zK*%Cn3MnFi3cyFitmorYwS^uql&X7#uq4?H{Xr>$&R(p0 zUlu6ez>a6UH+*}o=P^YknY^~BvAp{*U&l4bcaiI!n}wm{!q&^nr__LW|{*~0NZzAK-(KhGf)r}B4lA=5j3h1wv6hUkTvn^ggtdf=;JIm9tsOOk?sKnt z!qhTXsAWt`jr`?ylfA3Qwci;QKy#3P)AF{q9s{t=FY7{?%3V;p+;uQ**3+Qn><&q3 zapLW_^gmAl1}D8F@Q++hPi3SnNh{A%44%aFj5x6l1rCiRD)gW1fE5JMn-|Fn-MfL4 zHEfrl$R--V_wsb5C0F$*vZ_>8kP7WoU}H~QM}VCwf?S%?gD17DGCE-o^^K_F7}H6> zq_Jh>n}76DV!wMjq5GQQNeyHX(6U&7amOy$g>*9SDpYj~&=gYaBRSrrxRFb8xhVf? zCouKsZ%LUwM)loAt$=jZ(VgAw6EHaEzY;9L+6WU!^@SQw!rW`KIQ*oSe5s8I4_v_+ z0OgO6+E+n-=gHNBC*Dy?_M`N6@>~R>rkXDx0E~G(0Nl84yz2tGH_w$??lhE_^3Nc? zqCNVqJnM;4qR_9p3ODz<2LL}-Qn0K$srNLzd>fG75SWLlBJEUhHCtdIiRh+CWQkis zu&IOO?U(WEv#@o>@1tC?xD4r#KBnVwx={5W^Q2?<&rStQ7#nj|MjMRV1iDk)+Z7S` z$eli&w6Ee>^W{~U>~H7_F}u5t64ZU_8q~gevKtW6nU%=FC<2rOGXuivT2THN(_j8q z@wbo|M3MZN@$>1?9)*K<)*(dITu!skG<5YPx%p!Y`>@z@Q)%1+Wg|U^RN}NKMStxw zgHBWwy0Vo>PxgWPL|~-QRcohkj!?BV7c~Shzy>>L$OfleC5+9mRu-&g21Xk5v9{W; zM+v$h3a7MUyW9G5liBcjhfqAV;#k!q_L7IOfF;(jK~hQo2Qh^G^Df1eU9G-Z#dHT3 zjt=YvS9*vu*%6i}+PKGMx)Vy$Rp9Wx*pd_plq$9&jN#BhY7P-Y7q}OQDbgT1Oz#jq!Z@WfNk&w*0YmP&@mSv?F;JHfMqC87si1u|G6b!V{pWs~O*l zXS1BI&4hix)WMq3pl=gh9&n+rd9+=U=JCGZ&v1~#44d7p$Wr8_gO-qq@ zPp`4Z_JvjD+o-O6HIdE<6+}KResY!M+PPyO_M5N$Y~Non%tMxx0y5lM`U9YCFp_Y7 z_SFkjBY)DV1jA)9WZq1`DP4i;^kz>TMlh)(FNV^74D$s9w_&6UHJUrRff20NJe&9^ zVMh#+`XG|eFGm;g2X79eW&kgFTWvLH8084yRi{_C8eDPSL490+-+|Dnx@GI*?m(Jq zJLOHkR z=(A{dTL0yNL`rU+6YKQMIkZ}>;n2nl4w+dCk8}!O{Y~5pMRx?Zbvf){-LdneQynw{ z56jnUMnN5y!LJu2S1 zuGaBNhF)bX_=srLoQS*_J~FEmuRpxP;L!)WAtUnc)kN#y79C)U-`IIei; z-(ZsSd)+_I#aHyJPe(jKQr#lb^qL`82P-N3 zuenw9_zkf$oI*$z=$7XRcx7d7tGk0VhYb+`S1mHYo-e77UgQB*hkMZ0q$zy~Va~=9 z^M}zFz@^ks{yZ#DNpn&u`Wk=Wq6Hpt7 z2!Dg0JbU~aebRf7g#OyaLB3Im+Q!k)epEPPhP?(;C*%f95Hjzw)Up4~Kd@a-w@Dzy zSP2kzxkt(?z4GE9r^WiqR~1vq_ggWG%~P*okS+O(+o0H#RB(Gjlu(l)1=>{ zA_f${a~{8Fi;#vL2f+GD?#g6p9CZHSGaKk8L6A)b^)R6tYJiTRMKB>iU= zEAyiSCCl>(TDz!ltIlzxNVApO=@ckNDnS-c;7>$@BEMCt?1q54PE2PdNO|KqUmg<7_y*b-3=M^R$NsqOU?j2UxmcpDB zbKde@RDU>WRV!3HoL9hxYM=4*Qfm6|aqa;mcTO8&hv?d#nb-)QT5em`U4EM&Fvdv? zs@$ma3lrBf+RG?|oG-iS$xKGo#r7W+)(QF_j5?t?#qSSH#M`iqW!ordd5E*NgR*5` zzmpl|r6UtC&fAtKO{YxXTe745=cin!aR_jy+-FafG(yPk+*p|N)xTs8iQsd$&!4I< zqETt;=3u66c(lIh%7V-J`#?9)^xi^b!1cB&(bzGe^-C7XMrlSNz^Vis$e+l_Fr}FG z@n$`*wyJ>H1n~Sf*ojAPD?WrlJituQUt5VY?1NfZva_K}5&F%v7ZLYMB4Kf%_-1=z zN#Zyv1GdxsHRqek6JI$ikM*S?$JE^@D7-piqNk*^plU-Xty7dSyKYP zh{XMXY!W^MX;sd4#g!QK;%XlI!3+_#=x$^>%hy8%=-;ou!KVrcU?p@fs;%GnHk)wg z`~XMaT;8tjn}amQ>h{nxcG1bP;XsQ8NBa+kSx;^lUy@7n2t~ma7K)E zlSo7;>qsoSt^ptEBw^uU}IDYNfC*O9XP^!|HA#te^9S zv`kTy_cPhLzQ7VuZ31@g7b{mz@f>yA^Wx%cN^gETrac*^b_=>KYM zNe!PKq8x#5o?+d)bSqyk%)W>B7?JO|mtCeJ*(eRrY;tvH*i1yZMql1W9});4XzF%sP^ z*ri`NC)O-f^fZ^$!I}63H#a=aksrmrN^n=ok{g>6it_PLRrOSYZKM-4E zr+aqWXbQHPM3L*H%ITJu{{bFEu0Dv)UBCY4?BNVDHdivq>};5~K|2>tl*<iULvSm|mD*5Z{`&tkgel#AHKKAW!!Oj<)~ z1HRWc>R%`-EqkFp#dAK|u85$c|szc0CcWdhB2dHSXU1V_fpfK97bfoyw;;jYz4xtaU<2T$$+Lg0iuqyKh&3U*-ca@KcP}Y}WP&qcMca@UHkY$>;H#+` zvw0nZAnY(# z1dM$50a@F3?KhJ2xPssRa_>w>&TP-bT;B3)bbwwJFdpsQy2g2<7cPqLc>dwy=;AloooXU z-mtK%M7F@aifRv|PU;6oJ_HpP>ly)OKnEvToO<9X3hY@xqI(-!?OIpcPhjt_9Lu`H z2Ydppi8_XfU{YfB%?kIbGJ!@pK*v58arOD->t7FFRp;48>5s10i^1g4VGZ_c@Twcv zqrBs2o<0E-UW1W~FF$e@BvI9IPw{FqjHUQ5{U-$&)Oq7PsUFlHOvl5W| z@|YX(_T~?d{QE7Xy-PZkfZ)sMhBdFl2vT?`M%H{{8BHqbZoMFgM{o+9_4IgLwDlTj zV0KinDSfKg3$MykezXF&I41hCqYJg|m!F%BsJU_d{71XHnupy$bF(FudRY9xY_^8jY)2j2ZE4HNwex2)48U3huD zJ{vqcugZ&R8u+*EpO8d4`{v&Qd#wrG4+1l+><G7x`5F=*wEw9iO;+u9pkke4>-wBtRiXlYZi z%fbZ%wV&)TGS=s+x+3ho^ups_Jqd~2Q#P0t#^Kl8Jq2oYx72jlO*wb^=)Y3xEWuwJ zKO-?%p$LTE<) z@7Lx(kQ@tT9>gY3gPh<%CBiY8V#mIBnm^MJi|kJ6ww`8WsG#(+h?=I|T!;(&N*dI8 zGOM${t?kq*9IrJNH|nzIy02Tq6#icBOH~wiB_o)iWsiq>miAv&hvpTx1&JZA8gz_m zHVV2^;Nd_?M5O<4&klD5KRGy9ALvDN! zG~#O1t4QOL2?Pf9;*j8zg*FpdeYf1cpk`KbZUphW2n`@7#IAL=Wko1sDY69o?5<*f zSFM$Q-Gf_l(tUKVy`trgyDG?5;|Sm$9X zR&aObx%a(W6l~0^20kIJ8xw|ouA&8vA}ikVnz_#$VKwSg>9Ws#+5x zLR9io+KfTtL!s4bR#Q8g=1p=OOmY)e`r%!q#F}jDWg1szJAlQt4HDPm>Ap^{sjD%I zh_&;m-TypY@~Tg?D=v1ltbMW_(wQdd6S{M|;o(C>U3qhg-zRQq=TMc}CVeo?$B~t^ z>nE#kx;Cpz4*`Gs19S3fRimGA6hE_zI^&LGgpnu%hztgfl#~`h-9uJ>5j|Ux5d?Z^ zhlhKpeA~K-&H&yJR$4;cQ-I(c{NtiG5@>D3 zvgj{jDz}8P1v1;2Zn5s+Np0#{hmDcA8SWmCXt#4aPRvy%PsEk^J!Yw<8Y>wwrB)Lx zPTX$bR61$33mjGI5W_|5hkJ>qG{f2a9LvMLUxye8rocKB>f|{*3LE`l_(_zV6Ydknv<~5QhhTD2(%SF*LjRA{gc| zErV@iqA<+%J$c;(c$9k$fDnA|AJk_V;C>PRRS10!Teyx6-CGSEVcoTm4KFz8j+6cM zO~C+K+VfN^HR zPn|x8?gXtYJEZAhR}^}SUpRndB=J+id7y51yZMLEH}}6zKIa46*+1d^?*<^^5^vq3 zI6(<9?P`A0e}eVD4MV-|XADd$j>w8}5lnXoobe1@iZEm^$_)cb7Km-1u@?lTA+bEM zG9|L1liPTAoY_4WCK3k(kD7OOvU~kqIQ?R)EIjTCQ58|nBQK`S9S=hPxOz4p2w{yk zRN?+i_`^z-UZ&)MKJ!j~(icDb9_qxMsTRE(^&hp2s%s7KpK9fya!93gFg})nd46kz z&!KDx9(-}-DOV)ni8;t37$5{deVfzsm29kGRQ`&iGdlG94v&8V0AEXy*AQLBgFCtY zBV638zy(dunbhO{QS$FryJ%Gq;t#`F21CNHqL@J~sxnwj$(7R&8QV3RQALX$k1vht z$CgeaQC?tsb8Awd}oBr7jtrEeML3XEuG4 zZaF_G+u1%)SESTd36?XP{Q$0Ijsm-;4m|1TgwMP6b$n^<=l=L;`1!!5Yt>PKap|w@ zoL{yhSV3mA=7(iQUG{?ehtECZL#ptLf!B*GrGU*8{x1KX4arJ*Rc3pdO!@mzIt|+W z8+v*>2K3K@rc^hO+z)YJ8TEeUMIjGT>d=Gd(SKEe4Xf7x5#*AByNRu0rxrt>YnyU< zVI6HXnH)B98K|X6WI|}Neu-ggduZk6U?$LYdj46FlK3I3U)j_E6ma zBG^2`?v&`u15Cipdj6|`dEY5$3(4G^iLrTkDuJ}AtolqDVIS&A2+NSR-hQEY*6BZ7 z^}!0SzplV>7=kFbsa*Coiwnqhi;wOKNk3$y;hHpdarmQHy!hed@Z^fc=}$AXu{+32 zpF4L@;9=Zp?bFq^R+va<=8%7Rs;cGB4pv^Km#6>9003zck{3}g_cyQ!{LEU#j|hEN z?{A#&Jv8$a)6?^5>VNCrAQ`w^S@?j&CF!8T#AG`@RqPmi^c1cYR6;8(Eozwe!D zEh43{e@u&>zgpdV4Nb<;17xIMUXx}9aFX%P=R&=y)ABVQ*#jeFT17(V3!$ul%cX?i zy*Z^BE39`V$iR18w5e6y_np73A`XOS^0CYF?RyptSszImsckdtYr zF%cfzbaXs8_A#Rqk7Bg=%y1m;5!AmGM6(>Uo~JS`k-`G5!3yr-BbK8__i|oXh;8^p>pK&RW<%BrrVt%qWpTbLM5#kQf~f@Gd#U znA(<&helubYu6|qxXRy@!FVvWmSS!1vyh0}av^$P_xC5Ax*87?|GG3kpHjps1OYji z0~HhGG)<55kKjesJJp$q5rIo*?gR7eT}&3)gF7Z&r#~Q%3+HN}*xh)(J1+e!(zr`p zO>UKko^_UEFt$|lx|Vi25DF?xCjMkW`8B{G%IjY2gZ+-ouZ2&d&`>2pd{T|z!51=oMq(=*guo@u`6${Y`su#I?|6)bCk9KX-AhavQ9llGEf9h&RT zi|up|xhd|@13vn8J?|5~^4mB(YgxpwrO({s{Q4S{w0kM_NlkbGpd%Oj@T7(D*}T|) zr<gy5UmqW-4lD~~Jm8~Io2XQxJ+&8ZeaJcYF&>q9cd-95 z?w?=`HnYWKA05@Dh488WJ@GlFi{aq@8fP$*_1R6eDO>s;&ldYQ5`78IB*HRU=_n$b z35XGmd z%dY5Lpi3$F8u@6~M&)l9JYd_6gT*9lQ~mbtuBWKXtI1IFuHYd%YtAmz&g-rNeqdWy ziV+2Q)~0yTKacE;E~+oU(~vWm&Hvp`Ya4IQa)C^AetP8^kkBFCSy1s=F;wyJiSk9Y z>uYc$IVLUB)=NMcH>26(ePbllfZz;2)z=sXlFS!YU!=#;-}pKgtG_z`{rA8kx}&L1 z-dJ+Rq4Y5h@qLj%lRZQyo_Ot$I@E->Md{45V3>j{SBkPm9b}f0 zn;&V|_+6~*MEvB6@TyApH*a_sbI{KU{icn-%Q44f={ zw~^cWs;PbP>bj)s`8w0ngca!JS;E?Xy_gu9 z^gW84TO>5c3VOxyUyx+S`AJ_?_H@XmfufIf$8hBJF>5Gc6)n9ESsV^WcX-Vp~$7|5CHng+2{C_@XJSdv||AlnWb>t9^}v^*w>~C$#WE z09J8XK=Rc(17P+0KNkN~bQ-XMG<7jyF0=v`=c?}zWAOG$3T|}_>ny~FVAM$GI3f{B z>=;k2;R3&?zM2=^!ee`I(nyDnHoO?`amT6GW|s(K1WjFjz*=nF1wyI&5%%YfliF4G zXIiyiJ7H&eiCheW!tkv!h;d$m=8Rpp(*BNbY71BM85aJfv<2vv1rnKpw12AXN)Uiz z8b_pC#H~*x#6kSsS`Fuh*{T=!x$cT=xS2`V%y2uWKYQaQ{OAxOPUIAB^=I7m5C?JPRhVrFl+5wuBsGg#MpN*@M21YS zOB_q{FheW4ID>+)qeI-KjK4;12?aD6!H7yrK|@H%buPJzT?_HB3;S5FbMa1XZujr# z{XtytWmb01T(OTHlAaXV?_oPmm1<%G@HAfP}^ku|1dIlQ)`Qg3d7&52IjI9FZ@ zG&1gq_}j)d&6>4+ojKwD4h<#EHtn%Kl%(mOLa!W@ll|b&_`&U;uN;ES=wkFqmQ^(A zVUDnRW_oSQhG$vF2}?x?&r7ij6oH^ z#}18Ad60;(v8gn-<5|FUpD*Vtv(+2S6g2l~SLNi%13GsPKhz^%^%9kR$B#i{kAlO(aS zjez4n$dLGtF6^;zh2YxB=2zK=gX`s*kbUcLV2MiGq<^!Wwtk*JqF9_q7ENyz(Fvb^ zUZ8b=XQ~qxGp+YnlV_=;Nd?os_;e=A&1*#CqZ;|YRVkMXpWO0% zRIhX0JCXZ&`&?b@Cw?c(1iPOGrVJqz%iL&3(p?VA&d#b{uhYxp7*|_b%6TQ0ldJ8k z#JVK|6(`;9nhM|alErD(J!^3@QJ$xM4$LaGx87j;A$MQ2_`CCtweLd=0|pArf#PhT z+`OIJYf;;*?q6UN8<%*&uPT@&epa_!wp5W^w|=|@w_sfrDd7Bz$m45G?OwlMKeJYS zs`ON;An=xMwXeIrS|&|h=+LieB>3|0jOW32bCm=sD3FYkiT(+jXh8LUC+a#y=F<7J z>bvbfp@|-z_6Yv-Dc|4T{>bg7mQ3bWy}93FTG7!vyMoy_k8P3C9*Nq?wFqKvelxL zjP#}+{@h;mz&M95%PFaM)J2`ArMk_jr+$8K8tZ(UJgsL#8{^2f?fI$SeRG_y2VuON zhYM!Mpu2g~+?Y&1m)m^(+0u|ZFCTS^C!wVNFgNpadCt5wTQl8pkB6GJETt*YjyV#$ z+UYV|k`J9~HZ_!9oMt*%oA5l^Z>I;tbbaEGEPa!nMyXug#BAV}RtNw9n6}qgR98qU ziXP29>;AdE{tI+$*j~mi3wnX=w2Kjlokv)=JKLKneO2Fzo_ZOrGiB1f#QehL=!W)d z-A0w2+a{}(`m@zv3R$tM?F;mM_7uhn=x;u2(JBcvkkUV6VjT05Er^pzLAvWqH`vZ! z@-TkV_6G0Ly-B5Rlk50s%A(g>dCWi2dD{}|yQb`u^Wc6o+?WZ|D_q~i2cW%~_Ip&f2brhqm^Ozq-tKs@E){CBr7!h)Zx+$_os`t%YEM0m4MX==tbKGw9K@9$etYf{wQ-5bo1Ik_vTt8 z?5yv0nyV6ZLNE0)9-v`txUZ_L>eyaOF z=$%rfbwWB;9lR^Q{_cApeR6R#^|_Thy8N6l*qhturk>Z^`;^ru>-jR(LQQq<=Sx$S zUPcym9(iY6`rj4jr>4Ys=*Nd*sdYQvpKa~brmlA*W(M+7&+vef$ zaYQrHVwZ>qeH3S7JzxKV{CvGv%^lED#3( zfb5tcRJZGVIG!9Y@FhZ)uf?ZoZ4rhi9QofZbjoCDMKW!>8TwfJ12FpUG2FpbdN*^= zXmNij<#Ud&MQ+~380Y>8{=9$F^v6Rzavf{Fuy`t*noZuZu^NSX<6gKMPXoWWg!~bW z9Qqj4=0-omeT@@kF``Ixnx;`=T97u9!i^tS?IJkIPCe6N>`&<0)`&|?4(Q1<<-+oW zWNlPcQ&`!m5x*&Q?tJnbDAiW%n;)2N`d3>(jr})N^^*PlH4l4LThT3+y|Z`uMG%iH zkugnoE!np&&j%d;$p@kkLXi{8AHZM-AQ0jt0l7rw;PZE@AM z`p3THu5ql-Q@v`N+0&oC&LbA?^H0~8Su8?dH0uwemSl-%tZUvxeer1=Zk{{aYS%~g zS?j-%O*?R~m{c`t zy3y0-hRZCAK5_g2AaL?-k5><30stW8{x%!8S|-&G>*V7o=5yLLWK7QnI7+$VKYL*2 zbv@ahu<16=ef1|uVz?C6N1T+uNvd(%r1_u1qi+l|(^{MwJ4QIx!kw&B%p|_;h6RqU(Jyz&>?IGx!DDCFC@uY~8i+AavR8egsjM>&s zt`p;pq(JVdjH%Nm5Kz%|X*adnP4`j{R8F`(RI2pCr+ZkE6ecO~8!&~f!eq=i`7z!6 zoXG$G@Ymhq9hAlU*V*@rH^6;f=V-b-PUc~`%FZ9~MqxDXCG#&{-_hUz67NTF*T4y| z0}OBsPiJRS006)e0{{R3003f3000>P000Su=usN~{~1zHQc_M_SY7}B7yrlq&Hu&! z)Bo51!xozRzvXA5E0Bl9k^8&%)$f-4;OnqAr_)q^@7&Vj-;bX&ihuucUG>YG;w``N z_gA>^&vES7-0{xH&1@(pa;jSK(Veoxazo$gpmh6c>z;=Cp8)_~6KT0kbN2Sr-?ZQV zvb*R-FPSd9Q_HaTy>PFu$I~vNduydq{ZQtr`E+*Ncl5C8ZDt=_^+oFE)90^elhl5@ z-A>Kr>D)fFi!Hy=oLTB0WBTSpoPGKerVQ)8n|>IJf>GmozwC7EPCs;Ywn=NNS)1mU zYJU=qgxhyMxi(m!28R?2-A%6tWSWXsp-QyuAOHa1+!f>G>k`Q|_PDNzs~&tTpFvca zaz^v{e^KoYeseWzLi4a~FfW+q{D`FTS7#^oWgYow0MKNLXTtsSj2oL;+dapf*nPM>3stVfu2cHo!A`U>GmVr&isVVww^;jEN*$b*{9{J zI`1Sn($hs$007*ct(y(skk!BJ$g(-0@W%a_o9uYc$C%g(A#kc}b^cy1^{^fk&keK= z|HG5Za@NBg`@1iyzTRo-NAbkzq37z$-z?@I{iANv>&xr7EVq&PIslUMFv#fd#Yf5J zP04lBl1pxLh;VaRMqT{(M0LNlLTSQfJOG3e|9t_ztVyYp8s7gg)3q2k^G8X^blU6Y zZejc3<)4isuxm|C?bg3l1pok5ZI*6uZQEzh#)%8nXude3OyCe!C1={RM=r0%;;@Eh zS5Zg+%>Mo#7wYA79-(L8fBYMZm!^0~yZTaA^2zjm{aPx2_`#>?H9yB#e0`?XMgY)X zwg(YXRm<~ZC9%iS4_y^ats(zUP3yO=gaCKh>*-hpzzD1wfBYT9=_}&uP{X4?G}WbB z_)sC9_F(tjebfBEbEy(6PsFdL8y3KQ`wsl4*(EbROc-Ci|1Eujv$wyP8GEsIcB5K* zfnF$9u3Kaflm_Sj=QWX^TBxFiKgaY17hG_`1sB|3)k5EX#f$cLxbb?Kh!9!<%&&aZ=AaUM67c5riv!uc@d8N3_-v=X=f z=M|*Kf1wH+zB}C3mk*a;7#FQe9}eF=?9Xpc{YB@!d!6zlRrnR(R4j zrzl)7>Kx~N;Qc!Vx4(lh&mGk9yT#D+B+ao^T*2S9FnMOC-UY)z4Kdry^ z#mD{E2U*u72QPRwX~g#3)1Hxa67?$oZQ0J)m!^36%hKh$@8vh#F}gfThOTo^cCuVr)){`vc*)jd?)?e|#w*0gx>`p&i3*+w`z1@iQ^aKz)0cA8zTh+*0 zvCM{%hP{btkzb2fTn6#v*0mxqLkXZrO_Nk*C5?=CH2@xp`;T~~N1)nyShAS+*7laa zrmYb9!?t)lGpKOlxbv@R&zSLOIgbB7cqV6C(7AL**-QCE)h;RTw^LJV+OqV>_Ogeu zG^tr9xl14NY8q!s=YBt`mv3NSGi_mZM9#8FJ!Fjk{!^*8F)r)**UD*XybLnOPsd`5 zInS@8Zc3y4AY;B`3iI;zEd@2y%(tOLu~^PD{pEzi#67Pxs?pP=5xcgE9@!JQ(oXSi z-#hadXTKP4y{lO!>mcZ;0Z*Ro%!j6`PxwASQUHLfF;aY*Wd0o#ExkXj$tvr*k5V~D zfr-)PsDoqTr)fG4__jk8nwiD6BBntRHk|Jlfw6Y8#{0j^hI`dJgBLt1*}a{NN5=&# z(JDqhl15wq;$5FJnvX>9ph<`L|IFB#CHFS5nH?;J^tM%w#LIZ_i&IImR@8Z&r)v?;Pvmz9jyw)Vv@9a1icZptWh3uxO!1H}KbPUI#+Z)NT{@?!Q-@SM^ohx*6V2n)Y#vV>T&?`jv3_&Z zBpO}bcRri+=b9tWy=rYolcF$O_NV;D%?(6huE!MMdbi6l*X{+Qn8uR~EbBXxP07=f zPVgz^bX@-yujcvByK5{ZlTJ!Bn*&E{odm&iliJMXGUBa?k5AJS(nwF|klnKM)L5sp z|Gp?KZCLLnP1?O2_%6nA3l^wtyfHW{Alef$1pol(xs0Cd+`zZYC^3$9{!2|#+P((= zZnAYuAwIAy^>3{2=WD(jG?GOoc=WI34O}06nrH!pW(p0;3D(w1oPx{VtY?q^xvM{E0^qjj^Gg2B--j;b? z)AtX9TBqi?Y>Q8I7`wbZeti2HHSSK`wQZ_WQ&%skJ=d11fO~C@a#vuw#w)fObwo|m zcuA>FkchHD*YZZ)HEMQ$yRs+b$car7V=VT=oek*Ma75xtkv@%P z14$brU4obZ0Nl?!@m5kFAl$pN?naolQ5{aff2*odgNg<`{Suz)VZzn^W%Q`6)@J+o z>n)KN|LjB>{w!D}2I&#=?R-SmW=n9*yDlKdM%f=L*gBgqB_}bbFRfoUN65RWffgK$ z3y7Ub)5+cb$2l3!&2fc+Z`ilGc?=uxbm!#XA*5(dfW^OV8^Cz8FUmg3F^4%L{~^v^ zG{?UtR+T6jNpNmhXDPNLvqTTJK&JSUnuc@Qr54Q$D#UcN*AZR^7rbt9)4x<7&Im?h z<0Fo*1hVZ=>Mw!9;qj)0_os(I(Dd$T1>J_-oa1O!MgpM)&RN2&&z5YsXO-rD;= z^dqXqi1u}R#^q5c-e~{E9CaMnjk9mt&2{#^9bjQa_zCj^WxsV8#(8$ zd(x&hjZxK67;o(xqFD^9MHUF?o$qtXfjV|YF_mlv%e7>D4qLW5#?U8HP1?Di>Z18L zmp$hgTYTv+y;7_EHSMpgL<#zbJTu*u+fZX%rI7Y# zz;mlr@WE@=GP$daq0s8=+Pbhd#fIj__dD7C`ipM*c6^(W{ak#?zwygENw~r@yWtpH zCkfuxA6svu!2Ob4mE}QX{BNHQpSt!Tb~@4Fao*kJ+_~a*RjP>fgk(Jf@*T?F_U$G; zyug|MIFTNwbL`K|e=0)<-tGV8J%69AN6VfQO`g}JvNx8&fn1uw2~WF1FER2H>b6Iv zvPLv=EK7fn^j%(+$hjwT20QMV7ApRZ}aat`J|`yHM=oq-JlMPiy|WX}9c|geF$D(&Q2LlzON= zX|%!c&DfHw*LIx-sSV0U7%4GL(8*Uyrej4%luiRajZJqb|?37m8Kb9lek z;+|uSbXWFif3)#tM8CEZQcAxU^K6)AtLkX|V%?}STeLk$zNwOtQcS5jo9&a9^(tAq zZPrsd?L{kQH486!r>TuxyB{4dPh0oXl%5aHt=JaqPjS5c+wtZqui7bM*=hCx02Ba# zLQhHStDa{i-+PN(;M<>dH|4+gN1LVDeSdF@*R5iGFshH#3QfN7S8vMaP@0b=mgA`e zwKoQ{?>wW3rlmakZOm(K4tdh(5o@rpP?!2IdfO9=Vt?0Le3P47dESKMpDz8LEoG)& z9tc}^Ws7*_?o%i}K%B;ji&(h5cFq;WV`fTg&zHV0r#bzqHl4$3F)bB({`K#x`lYYZ zr{rIP0j<{5-ZZOg(nXUZH^ix$Nav&fgX#wfqwxHZw9UD#G3j~QU#25)Wc z#df>PhnG(TS1yWjEeq?6&rdkZ0Rsn#rNDV?J_%1}XHx(Gz%&B@00000VoLx38UO$Q zn2%z;9RL3hQc+M=Ra8@7UR_*b|NjyHyZ^fXyZ^TTxE3kJl8{cwR=Jrt&`%U@)gu34Oa^@|h_s`lj%&Y#^BkKQ@!=%Ej8=Q|(ExIMSO zvp0p|g0qWYN6uoN-`2r)JiM2tqr)tJna-zU7fIdQQ9QWcd}i9hYsuH|kvZq|_R)DgZYFcF^Xiwk&HC`YlGFN00^IkW9`mL^W?h(ue!hP! zrBsaODy79D=K7(x=}a}+kR@o1fJAjHIvf9HR`Eg~2{^{%>*V&Ukow(yhe#Ezq@%=XR`-LJ1T_1k;7 z)_;J&jU37KeL9eO>Zg>dV}_obTV47J_x~HVu<(i3Kc+gRkrdXLhn@JmeecRfZb@Gq zB-9RP9d~Ad@59QU1%%UHPo&DJQ+f9Ba+hvEsP!eClLzh<^oTR*=Z_CNSwGdHjn2ZS zOLxKe-yZ(-n%D4lE*fLq;XK!tjn)y4WT@0a63rTil=b{vWI zJ?+p0kDYmGqnEcK=&osJ?j3@`#w*RRZhe;nIDaEW{d~G+Ouav?(@N*PYxZz;7g5Ak zaHQQ^>=&(N#f48B_@M?nGZMf<&kVu_P=$dX0D~d{PKKomTmYm7|KlB8@5Mn_E&g-= zt>3o4d{&c+|Lym7epx@^uVZ)fuKUgd^Zvr~k6$zX0{~*xdM;66Do+#WA^F6zXqI)- z#)Wb5=6B#>8%X5it3*tPeER#lfr|Dn|K@5YDA`@$2uQ`Q!*mwNizK>%RNvezxS z@78kuy@|*v?EGO3L0?S*X}dcFpBqeD^>IDSf(0!5?svZnl=l98X3YJlTkD4ZaF}H~ zUw?2JT>t4&q z*!)i%FZ^TH5`c-$_WmCH&Ogrv!&kqatJsh5WJR0>pADvgQym9|;9=5!Dt7E@CobK;MZ&Rxz07{jpF{1ER*Y1dfc-6iaS4>YuOQrO%rZE6akC^xBpl7bh-y>vH$X7 zzhKnUaL2UTKg#%@GXC$^hPV5(I`&|%Pji2D`TYj%`kw=Uf5VqQI`lQVgME?Mc8_`% z^+mO(-bd3=6IyuM`q-g~&-zkb&OZotPk#&mZ1(E^KZAC<3^#B19{nsY@-*CJ)!Wll z@vDpfc<_*(mnXd4-~Rru{=fZkPWqN<^acdL-)(oe*J4Aj#TOeSs&~7I$AvtXFrr-7 z-MNSM3@6HI%+<8A>JD=#0-XM~|9^&-x7*NQ`rq>AGx_I#MB&#z=i;vp|Ci70t%lDI z-nn;gq)ipn^Dg-9!}Z(Y=?uW~_uUVE?ND~z%fGsKV*ISX-N{h_ z0N>X;&aE3y`}}>Hw2I4#XE!mtWyY+j&*$V?G+PaT);n z+53NjpTPwb+g5_FUrMSE{!neMu6FR^rz!gV>EI%om+!v&u+_rX?@*|VW1W?)c=l|V zE|2@_Fy_05evXWLg}s;kAKkmp{HmUH=2p8c z9C`PTB}XVZaC32a+2OrMT^M^VUt=jRr>^N;Z6Z*f!7ahT&b!Z61t7e)}*)7kmq=Km7xuKn}S z>CGCpVf%=AWyJ_jj(A+;wAEvt%i1AZsR#f7*m+|jJ5Ws*I;oRRAKH3awzbkM&t-Xq zcC5F~%|N-XdvEIP+5AZOlqVpy|22Ycu4;{2v{zgB@N?B*2WHS;jr;AU*UzsG;yhrt zF9&{{KY{v;ca>zeOsLDL;iCrGpY?9Y)%OzdG#dEE>Ynm+e8i`NRW>i`TJ2BI53FC= zGo==lP5tW+{kvUq|3brL$Oj!ydtUj4+j5JyikqLkHx9G2w`(TAPyG5dEi z;R_hkJeaF&U5zR%Lz*2hb@S#n@7nX>UG<{H>*Z`6p1QSLiM?*V(b9lgC;s-`1B0d( zaLv2uoBmQOr;a`bhXMK3cfr{9qQLgrsv@6yx>SCI{ZqESNcCuLYTZF;I0$eJ7iAKj z1b`TBHUK`F``^SfrN-=}aa+ax$ZlDu<5YNQ)AGEW_L8xs{iDSq9bV1nljrwVd0)6c zJ5^8KkJ_GBIt^(&O~>`N*754C)F0NcShtLK6P^yf_|@St2PxaGqlx^y`x7x@o>rXc z*jz2{-SSi7X<(;DY^YGe;2CopbNei%F{isSht$a=<=g13jl2E5&*uc2rwmDEReA&) zbg=roMz7|9I=&CGRCdiZ_uo(InNE5x+@|@Mu=*Jo%Vo%Lg~1*>JBOwhGX{pHJzQ=# z7bFbrBuM}OB&PwkxlvBP|pKaz8e=rE6o^R`h^9|2v z&#xOhAKmof6E)*51&fi(dG=dw=-*?B_}1<;NB^NIYuI!m`zt36Ei&ZR zYvl%jvhIQrJWV%N=y-iikHW@{cMrLHRd-b|B>GZCS0kb-N#oo(3aHhH*FlmA5=;NjV`Z43X~I04 zNAv!4Yuv`(S~UzoDD?0@-X(%9 zFK%9pe3qcDtV`H;MF3P;^PMjTn+{G+u*4B_BQ>3aA*)|82w_IQcI&nK`XO%gwpjf9 zQ;ExzvbYNxjv~>aw`)d;Z_ZN3mtN zRN^|X)KhX0v)8l~)$8;lIB`nfeXRDBwo2nas`9_P!`ZO-rv1e^3Bsh&;-qtq$Me2n zC+??i<2QJU@!$^KIy1jc=YpRB*nbSIH3CC0BWvsZlDUJh?5UQGI@oGMOD9Joc3nYW zXwics0N&dBANG^kj8YB979KzEjcmV3^L#v>#e@4hQ7w<|iYbe`tg~K|({Eco-nNgQ zKiYJ^4%Vv1^n2k(mnLZnjr1%!$GN8y*%{CT{6`yl zh43|d$x(Qa?SU+^`d9J^D(Q&z(6t0%P0Ko*$Ewz*j- zlj~wMr?mi)NdByP=KA70pa~p4WqRO3>tCU&G$DPz=-{aJTzYldIbT{?&$qZl+Quw& z_f3?ac`9E`-v%k#>7DZcqy?OvX+WTLLS3I0&R6Nb_)OqXj?AGb%hPSNXS`!0RoW^L2uOwAK=hBxW#8Be|0t43p9e2F(R zOVJ3Usm0x!6``HhpnE#mwsykMXx88=%I5cWuJL9$&XgScb$c=z+o(zGSwBs(Zmm;I zjXBg>zHZ#i_v?v=Rz=SaVtu}|&ZBKHMp`d4VYi*}0x@LW6Q%Y3cgqkv$uYmA%RvLp zizaejE~sgiP@AQtRw);w88Gp3HO&fuZ~y=%e0b~Dvc61iCDPz;K)$Ei{#0*weEV)N zQg+g1%OP#(Pk#2)m!+~HoKfo9?y&1cLBj=f^2jAgs^C>`3hr%KoEulwQ9|BI1W&vz zuDHu-@U-@?X5~&+d{XN>Smpf_4zA^okr{qZdcjUQlShB-dbJZmUB6%iXg^iSvbwK4 zs6~eSaqpxc_X^I`R`h|E-`!Bxk4~2O$mHqKtQyt*Ulo5&u|0lnq#@qnx{Mg!jPEcA zF1%vz@c0ro#Mj?He*U!m?HFeR3tUC{}D>A=e4YL^}s*}1geo;Qw5$4(w&iv8oSicv@QC_N+USRZt3=DXrm z)Ks<4h5b?Y(|I-3{e#bV=!uq^qOEO;&wg$abu^c~-mb)mH4@c#Zfk{F%afbqi6_kn z`@7H1ciqG^J**v}_a*wC$`XgIvsWLm8r$4-lljJO*j);zl^U)SOY_R!i7F#VjB)Jb zm(z`js80i(K37kdKK4ujp1#$5+H0x^6DBX~J%0H}Y?h_=Z&uDy*wxWavRwrX0D!mR zEG=}lBJ}#)PBU#4Ju0k5BXRAMe0od$c-lv+K;drq?zypvu>Vcd-t1$`d8*3w?)K3+ z_gNI`RiKdapWD(W%RNLRZNUhK|8-o1euNNl(?PtL|*JZY7Dc!u?~m+l#8X3t8*O|8yd?Kja0C z0W|cgGp}fMOh^DQ!XTKKyXiRbXaE3DXJ=CY1XeWz000000Afo302=@R0LqmfqXBaM z!a7;WApn4L^7bD$*6d>Mr*D6H{UW6aKm7LNX!8E6Gj{g*%`YFXo$1OSAOrva008K|w;3>hi0077DR7t;VA~s1<#krPOfA;N--@%ZzFx2XiO&0TDU1`l M_FsL+dSj9R0DEf;Jpcdz literal 0 HcmV?d00001 From ae44c8a2a4d0bf89a3ce2736be50c76fbfcfe8e2 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 21 Aug 2023 16:04:25 +0200 Subject: [PATCH 12/14] sodalite, heatable heavy water, sodium --- changelog | 50 ++++++++---------- .../hbm/blocks/machine/MachineAutosaw.java | 40 +++++++++++++- .../com/hbm/inventory/OreDictManager.java | 5 ++ .../java/com/hbm/inventory/fluid/Fluids.java | 8 ++- .../fluid/trait/FT_PWRModerator.java | 43 +++++++++++++++ .../hbm/inventory/fluid/trait/FluidTrait.java | 1 + .../inventory/recipes/CentrifugeRecipes.java | 8 ++- .../inventory/recipes/CombinationRecipes.java | 5 +- .../inventory/recipes/FuelPoolRecipes.java | 3 ++ src/main/java/com/hbm/items/ModItems.java | 8 ++- .../com/hbm/items/special/ItemBedrockOre.java | 3 +- .../machine/TileEntityCoreEmitter.java | 2 +- .../machine/TileEntityCoreInjector.java | 3 +- .../machine/TileEntityCoreStabilizer.java | 3 +- .../machine/TileEntityMachineAutosaw.java | 11 ++++ .../machine/TileEntityPWRController.java | 7 ++- .../com/hbm/world/feature/BedrockOre.java | 2 +- src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../textures/gui/fluids/heavywater_hot.png | Bin 0 -> 464 bytes .../hbm/textures/items/gem_sodalite.png | Bin 0 -> 504 bytes .../hbm/textures/items/powder_sodium.png | Bin 0 -> 488 bytes 22 files changed, 162 insertions(+), 42 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/fluid/trait/FT_PWRModerator.java create mode 100644 src/main/resources/assets/hbm/textures/gui/fluids/heavywater_hot.png create mode 100644 src/main/resources/assets/hbm/textures/items/gem_sodalite.png create mode 100644 src/main/resources/assets/hbm/textures/items/powder_sodium.png diff --git a/changelog b/changelog index 61558946a..404c55913 100644 --- a/changelog +++ b/changelog @@ -1,33 +1,27 @@ ## Added -* Analysis tool - * A more universal version of the power net analyzer - * Currently only works on fluid networks though - * In addition to seeing links and subscribers, the analysis tool also displays subscriber positions as well as a log (up to 50 entries) of what block received how much fluid - * This should finally give more insight in the bug that rarely causes fluids to disappear -* Leadburster - * A 40mm launcher grenade that doesn't explode, instead it attaches itself to a block and starts firing bullets - * Fires in circles for 2 seconds before it self-destructs -* Congo lake - * A 40mm pump-action grenade launcher with a capacity of 4 rounds -* Lantern - * Cheap and fancy illumination - * Will blind glyphids in a small radius - * Glyphids don't actually have eyes, just don't think about it too much -* Ashpit - * An optional part that can be placed under fireboxes and heating ovens - * Collects ashes, producing one ash pile for every 10 furnace operations worth of fuel - * Ash comes in different types like wood (from planks, logs and saplings), coal (coal, lignite and coke) and generic (everything else) - * Ashes can be used as dyes, for making industrial fertilizer, as low-efficiency furnace fuel or for carbon in the crucible - * Coal ashes can also be centrifuged, returning the flammable content as unburned coal dust as well as a small amount of boron +* PWR + * The successor to the old large nuclear reactor + * Has some design similarities with the RBMK, but in 3D + * Relatively easy to build and safe to operate + * Does not use any tile entity rendering and all math is pre-calculated when the reactor is assembled, making this one even more performant than the old large reactor +* Sodalite + * A gem that can be extracted from fluorite ore + * Can be heated in the combination oven to make sodium dust and chlorine ## Changed -* Updated polish and chinese localization -* Flechettes now get stuck in blocks for a few seconds -* NBT kits now display the amount of items in a stack -* Removed the special nuclear meteorite +* Bedrock fluorite ore now yields actual ore instead of fluorite directly +* Blocks that fall from fallout effects no longer drop items when falling on small blocks, preventing issues like gas blocks being dropped +* Bullets no longer need primers to be crafted, primers no longer exist at all +* The automatic buzzsaw can now use wood oil, ethanol, fish oil and heavy oil to run +* Fluorite ore is now centrifugable +* Fluorite crystals now centrifuge into slightly less fluorite but also yield sodalite ## Fixed -* Fixed thermos crashing config hitting before the config is saved, resulting in an empty config the first time the server is launched -* Fixed heating oven not visually connecting to exhaust pipes -* Fixed loot blocks not correctly rendering items that require multiple render passes -* Fixed special meteorites spawning in worldgen +* Fixed FEnSU's IO limit not working properly +* Fixed overflow caused by uncapped Spk values of DFC beams, they are now capped at 9,200,000 Spk +* Fixed smooth lighting not working on connected textures +* Fixed the Thermos preventer not working on Crucible type servers +* Fixed pollution save files not working correctly on certain Thermos forks +* Fixed blast furnace output overstacking +* Fixed potential crash caused by centrifuges trying to create a recipe using non-registered items +* Fixed chemplant GUI crashing when too many upgrades are applied to a short duration recipe diff --git a/src/main/java/com/hbm/blocks/machine/MachineAutosaw.java b/src/main/java/com/hbm/blocks/machine/MachineAutosaw.java index fe568c409..0aeca216d 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineAutosaw.java +++ b/src/main/java/com/hbm/blocks/machine/MachineAutosaw.java @@ -5,16 +5,25 @@ import java.util.List; import java.util.Locale; import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.tileentity.machine.TileEntityMachineAutosaw; import com.hbm.util.I18nUtil; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.ChatStyle; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; -public class MachineAutosaw extends BlockContainer implements ILookOverlay { +public class MachineAutosaw extends BlockContainer implements ILookOverlay, ITooltipProvider { public MachineAutosaw() { super(Material.iron); @@ -39,6 +48,30 @@ public class MachineAutosaw extends BlockContainer implements ILookOverlay { public boolean renderAsNormalBlock() { return false; } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + + if(!world.isRemote && !player.isSneaking()) { + + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IItemFluidIdentifier) { + + TileEntityMachineAutosaw saw = (TileEntityMachineAutosaw) world.getTileEntity(x, y, z); + + FluidType type = ((IItemFluidIdentifier) player.getHeldItem().getItem()).getType(world, x, y, z, player.getHeldItem()); + if(saw.acceptedFuels.contains(type)) { + saw.tank.setTankType(type); + saw.markDirty(); + player.addChatComponentMessage(new ChatComponentText("Changed type to ").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.YELLOW)).appendSibling(new ChatComponentTranslation("hbmfluid." + type.getName().toLowerCase(Locale.US))).appendSibling(new ChatComponentText("!"))); + return true; + } + } + + return false; + } + + return true; + } @Override public void printHook(Pre event, World world, int x, int y, int z) { @@ -55,4 +88,9 @@ public class MachineAutosaw extends BlockContainer implements ILookOverlay { ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + this.addStandardInfo(stack, player, list, ext); + } } diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index 36a75a648..02afded30 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -212,6 +212,7 @@ public class OreDictManager { public static final DictFrame CINNABAR = new DictFrame("Cinnabar"); public static final DictFrame BORAX = new DictFrame("Borax"); public static final DictFrame CHLOROCALCITE = new DictFrame("Chlorocalcite"); + public static final DictFrame SODALITE = new DictFrame("Sodalite"); public static final DictFrame VOLCANIC = new DictFrame("Volcanic"); public static final DictFrame HEMATITE = new DictFrame("Hematite"); public static final DictFrame MALACHITE = new DictFrame("Malachite"); @@ -221,6 +222,8 @@ public class OreDictManager { */ /** LITHIUM */ public static final DictFrame LI = new DictFrame("Lithium"); + /** SODIUM */ + public static final DictFrame NA = new DictFrame("Sodium"); /* * PHOSPHORUS */ @@ -395,6 +398,7 @@ public class OreDictManager { CINNABAR .crystal(cinnebar) .gem(cinnebar) .ore(ore_cinnebar, ore_depth_cinnebar); BORAX .dust(powder_borax) .ore(ore_depth_borax); CHLOROCALCITE .dust(powder_chlorocalcite); + SODALITE .gem(gem_sodalite); VOLCANIC .gem(gem_volcanic) .ore(basalt_gem); HEMATITE .ore(fromOne(stone_resource, EnumStoneType.HEMATITE)); MALACHITE .ore(fromOne(stone_resource, EnumStoneType.MALACHITE)); @@ -404,6 +408,7 @@ public class OreDictManager { * HAZARDS, MISC */ LI .hydro(1F) .ingot(lithium) .dustSmall(powder_lithium_tiny) .dust(powder_lithium) .block(block_lithium) .ore(ore_gneiss_lithium, ore_meteor_lithium); + NA .hydro(1F) .dust(powder_sodium); /* * PHOSPHORUS diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index 3c70626d5..2ad14ed42 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -156,6 +156,7 @@ public class Fluids { public static FluidType SMOKE_LEADED; public static FluidType SMOKE_POISON; public static FluidType HELIUM4; + public static FluidType HEAVYWATER_HOT; private static final HashMap idMapping = new HashMap(); private static final HashMap nameMapping = new HashMap(); @@ -311,7 +312,8 @@ public class Fluids { SMOKE = new FluidType("SMOKE", 0x808080, 0, 0, 0, EnumSymbol.NONE).addTraits(GASEOUS, NOID, NOCON); SMOKE_LEADED = new FluidType("SMOKE_LEADED", 0x808080, 0, 0, 0, EnumSymbol.NONE).addTraits(GASEOUS, NOID, NOCON); SMOKE_POISON = new FluidType("SMOKE_POISON", 0x808080, 0, 0, 0, EnumSymbol.NONE).addTraits(GASEOUS, NOID, NOCON); - HELIUM4 = new FluidType(123,"HELIUM4", 0xE54B0A, 0, 0, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS); + HELIUM4 = new FluidType("HELIUM4", 0xE54B0A, 0, 0, 0, EnumSymbol.ASPHYXIANT).addTraits(GASEOUS); + HEAVYWATER_HOT = new FluidType(124, "HEAVYWATER_HOT",0x4D007B, 1, 0, 0, EnumSymbol.NONE).setTemp(600).addTraits(LIQUID); // ^ ^ ^ ^ ^ ^ ^ ^ //ADD NEW FLUIDS HERE @@ -323,6 +325,7 @@ public class Fluids { //vanilla metaOrder.add(WATER); metaOrder.add(HEAVYWATER); + metaOrder.add(HEAVYWATER_HOT); metaOrder.add(LAVA); //steams metaOrder.add(STEAM); @@ -499,6 +502,9 @@ public class Fluids { BLOOD.addTraits(new FT_Heatable().setEff(HeatingType.HEATEXCHANGER, 1.0D).addStep(500, 1, BLOOD_HOT, 1)); BLOOD_HOT.addTraits(new FT_Coolable(BLOOD, 1, 1, 500).setEff(CoolingType.HEATEXCHANGER, 1.0D)); + HEAVYWATER.addTraits(new FT_Heatable().setEff(HeatingType.PWR, 1.0D).addStep(300, 1, HEAVYWATER_HOT, 1), new FT_PWRModerator(1.25D)); + HEAVYWATER_HOT.addTraits(new FT_Coolable(HEAVYWATER, 1, 1, 300).setEff(CoolingType.HEATEXCHANGER, 1.0D)); + if(idMapping.size() != metaOrder.size()) { throw new IllegalStateException("A severe error has occoured during NTM's fluid registering process! The MetaOrder and Mappings are inconsistent! Mapping size: " + idMapping.size()+ " / MetaOrder size: " + metaOrder.size()); } diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FT_PWRModerator.java b/src/main/java/com/hbm/inventory/fluid/trait/FT_PWRModerator.java new file mode 100644 index 000000000..65386405a --- /dev/null +++ b/src/main/java/com/hbm/inventory/fluid/trait/FT_PWRModerator.java @@ -0,0 +1,43 @@ +package com.hbm.inventory.fluid.trait; + +import java.io.IOException; +import java.util.List; + +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; + +import net.minecraft.util.EnumChatFormatting; + +public class FT_PWRModerator extends FluidTrait { + + private double multiplier; + + public FT_PWRModerator(double mulitplier) { + this.multiplier = mulitplier; + } + + public double getMultiplier() { + return multiplier; + } + + @Override + public void addInfo(List info) { + info.add(EnumChatFormatting.BLUE + "[PWR Flux Multiplier]"); + } + + @Override + public void addInfoHidden(List info) { + int mult = (int) (multiplier * 100 - 100); + info.add(EnumChatFormatting.BLUE + "Core flux " + (mult >= 0 ? "+" : "") + mult + "%"); + } + + @Override + public void serializeJSON(JsonWriter writer) throws IOException { + writer.name("multiplier").value(multiplier); + } + + @Override + public void deserializeJSON(JsonObject obj) { + this.multiplier = obj.get("multiplier").getAsDouble(); + } +} diff --git a/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java b/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java index ba385ad54..ff2522d09 100644 --- a/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java +++ b/src/main/java/com/hbm/inventory/fluid/trait/FluidTrait.java @@ -24,6 +24,7 @@ public abstract class FluidTrait { traitNameMap.put("poison", FT_Poison.class); // x traitNameMap.put("toxin", FT_Toxin.class); // x traitNameMap.put("ventradiation", FT_VentRadiation.class); // x + traitNameMap.put("pwrmoderator", FT_PWRModerator.class); // x traitNameMap.put("gaseous", FT_Gaseous.class); traitNameMap.put("gaseous_art", FT_Gaseous_ART.class); diff --git a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java index 5e619c676..1f1aa97ea 100644 --- a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java @@ -320,6 +320,12 @@ public class CentrifugeRecipes extends SerializableRecipe { new ItemStack(ModItems.powder_emerald, 1), new ItemStack(Blocks.gravel, 1) }); + recipes.put(new OreDictStack(F.ore()), new ItemStack[] { + new ItemStack(ModItems.fluorite, 3), + new ItemStack(ModItems.fluorite, 3), + new ItemStack(ModItems.gem_sodalite, 1), + new ItemStack(Blocks.gravel, 1) }); + recipes.put(new OreDictStack(REDSTONE.ore()), new ItemStack[] { new ItemStack(Items.redstone, 3), new ItemStack(Items.redstone, 3), @@ -457,7 +463,7 @@ public class CentrifugeRecipes extends SerializableRecipe { recipes.put(new ComparableStack(ModItems.crystal_copper), new ItemStack[] { new ItemStack(ModItems.powder_copper, 2), new ItemStack(ModItems.powder_copper, 2), new ItemStack(ModItems.sulfur, 1), new ItemStack(ModItems.powder_cobalt_tiny, 1) }); recipes.put(new ComparableStack(ModItems.crystal_tungsten), new ItemStack[] { new ItemStack(ModItems.powder_tungsten, 2), new ItemStack(ModItems.powder_tungsten, 2), new ItemStack(ModItems.powder_iron, 1), new ItemStack(ModItems.powder_lithium_tiny, 1) }); recipes.put(new ComparableStack(ModItems.crystal_aluminium), new ItemStack[] { new ItemStack(ModItems.powder_aluminium, 2), new ItemStack(ModItems.powder_aluminium, 2), new ItemStack(ModItems.powder_iron, 1), new ItemStack(ModItems.powder_lithium_tiny, 1) }); - recipes.put(new ComparableStack(ModItems.crystal_fluorite), new ItemStack[] { new ItemStack(ModItems.fluorite, 3), new ItemStack(ModItems.fluorite, 3), new ItemStack(ModItems.fluorite, 3), new ItemStack(ModItems.powder_lithium_tiny, 1) }); + recipes.put(new ComparableStack(ModItems.crystal_fluorite), new ItemStack[] { new ItemStack(ModItems.fluorite, 4), new ItemStack(ModItems.fluorite, 4), new ItemStack(ModItems.gem_sodalite, 2), new ItemStack(ModItems.powder_lithium_tiny, 1) }); recipes.put(new ComparableStack(ModItems.crystal_beryllium), new ItemStack[] { new ItemStack(ModItems.powder_beryllium, 2), new ItemStack(ModItems.powder_beryllium, 2), new ItemStack(ModItems.powder_quartz, 1), new ItemStack(ModItems.powder_lithium_tiny, 1) }); recipes.put(new ComparableStack(ModItems.crystal_lead), new ItemStack[] { new ItemStack(ModItems.powder_lead, 2), new ItemStack(ModItems.powder_lead, 2), new ItemStack(ModItems.powder_gold, 1), new ItemStack(ModItems.powder_lithium_tiny, 1) }); recipes.put(new ComparableStack(ModItems.crystal_schraranium), new ItemStack[] { new ItemStack(ModItems.nugget_schrabidium, 2), new ItemStack(ModItems.nugget_schrabidium, 2), new ItemStack(ModItems.nugget_uranium, 2), new ItemStack(ModItems.nugget_plutonium, 2) }); diff --git a/src/main/java/com/hbm/inventory/recipes/CombinationRecipes.java b/src/main/java/com/hbm/inventory/recipes/CombinationRecipes.java index d1c218639..efcd14b13 100644 --- a/src/main/java/com/hbm/inventory/recipes/CombinationRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CombinationRecipes.java @@ -43,9 +43,10 @@ public class CombinationRecipes extends SerializableRecipe { recipes.put(LIGNITE.dust(), new Pair(DictFrame.fromOne(ModItems.coke, EnumCokeType.LIGNITE), new FluidStack(Fluids.COALCREOSOTE, 50))); recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.briquette, EnumBriquetteType.LIGNITE)), new Pair(DictFrame.fromOne(ModItems.coke, EnumCokeType.LIGNITE), new FluidStack(Fluids.COALCREOSOTE, 100))); - recipes.put(CINNABAR.crystal(), new Pair(new ItemStack(ModItems.sulfur), new FluidStack(Fluids.MERCURY, 100))); //recipes.put(CHLOROCALCITE.dust(), new Pair(new ItemStack(ModItems.powder_calcium), new FluidStack(Fluids.CHLORINE, 250))); - recipes.put(new ComparableStack(Items.glowstone_dust), new Pair(new ItemStack(ModItems.sulfur), new FluidStack(Fluids.CHLORINE, 100))); + recipes.put(CINNABAR.crystal(), new Pair(new ItemStack(ModItems.sulfur), new FluidStack(Fluids.MERCURY, 100))); + recipes.put(new ComparableStack(Items.glowstone_dust), new Pair(new ItemStack(ModItems.sulfur), new FluidStack(Fluids.CHLORINE, 100))); + recipes.put(SODALITE.gem(), new Pair(new ItemStack(ModItems.powder_sodium), new FluidStack(Fluids.CHLORINE, 100))); recipes.put(new ComparableStack(DictFrame.fromOne(ModBlocks.stone_resource, EnumStoneType.BAUXITE)), new Pair(new ItemStack(ModItems.ingot_aluminium, 2), new FluidStack(Fluids.REDMUD, 250))); recipes.put(KEY_LOG, new Pair(new ItemStack(Items.coal, 1 ,1), new FluidStack(Fluids.WOODOIL, 250))); diff --git a/src/main/java/com/hbm/inventory/recipes/FuelPoolRecipes.java b/src/main/java/com/hbm/inventory/recipes/FuelPoolRecipes.java index 2e80c2bb4..9f01c9d80 100644 --- a/src/main/java/com/hbm/inventory/recipes/FuelPoolRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/FuelPoolRecipes.java @@ -11,6 +11,7 @@ import com.google.gson.stream.JsonWriter; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; import net.minecraft.item.ItemStack; @@ -37,6 +38,8 @@ public class FuelPoolRecipes extends SerializableRecipe { recipes.put(new ComparableStack(ModItems.waste_plate_sa326, 1, 1), new ItemStack(ModItems.waste_plate_sa326)); recipes.put(new ComparableStack(ModItems.waste_plate_ra226be, 1, 1), new ItemStack(ModItems.waste_plate_ra226be)); recipes.put(new ComparableStack(ModItems.waste_plate_pu238be, 1, 1), new ItemStack(ModItems.waste_plate_pu238be)); + + for(EnumPWRFuel pwr : EnumPWRFuel.values()) recipes.put(new ComparableStack(ModItems.pwr_fuel_hot, 1, pwr.ordinal()), new ItemStack(ModItems.pwr_fuel_depleted, 1, pwr.ordinal())); } @Override diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index ba2d0ba6c..119a33d3b 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -415,7 +415,8 @@ public class ModItems { public static Item crystal_cinnebar; public static Item crystal_trixite; public static Item crystal_osmiridium; - + + public static Item gem_sodalite; public static Item gem_tantalium; public static Item gem_volcanic; public static Item gem_alexandrite; @@ -481,6 +482,7 @@ public class ModItems { public static Item powder_steel; public static Item powder_lithium; public static Item powder_zirconium; + public static Item powder_sodium; public static Item redstone_depleted; public static Item powder_australium; @@ -2828,6 +2830,7 @@ public class ModItems { crystal_cinnebar = new Item().setUnlocalizedName("crystal_cinnebar").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":crystal_cinnebar"); crystal_trixite = new Item().setUnlocalizedName("crystal_trixite").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":crystal_trixite"); crystal_osmiridium = new Item().setUnlocalizedName("crystal_osmiridium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":crystal_osmiridium"); + gem_sodalite = new ItemCustomLore().setUnlocalizedName("gem_sodalite").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":gem_sodalite"); gem_tantalium = new ItemCustomLore().setUnlocalizedName("gem_tantalium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":gem_tantalium"); gem_volcanic = new ItemCustomLore().setRarity(EnumRarity.uncommon).setUnlocalizedName("gem_volcanic").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":gem_volcanic"); gem_alexandrite = new ItemAlexandrite().setUnlocalizedName("gem_alexandrite").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":gem_alexandrite"); @@ -2877,6 +2880,7 @@ public class ModItems { powder_steel = new Item().setUnlocalizedName("powder_steel").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_steel"); powder_lithium = new Item().setUnlocalizedName("powder_lithium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_lithium"); powder_zirconium = new Item().setUnlocalizedName("powder_zirconium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_zirconium"); + powder_sodium = new Item().setUnlocalizedName("powder_sodium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_sodium"); redstone_depleted = new Item().setUnlocalizedName("redstone_depleted").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":redstone_depleted"); powder_power = new ItemCustomLore().setRarity(EnumRarity.uncommon).setUnlocalizedName("powder_power").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":powder_energy_alt"); powder_iodine = new ItemCustomLore().setRarity(EnumRarity.epic).setUnlocalizedName("powder_iodine").setCreativeTab(null).setTextureName(RefStrings.MODID + ":powder_iodine"); @@ -5764,6 +5768,7 @@ public class ModItems { GameRegistry.registerItem(powder_lithium, powder_lithium.getUnlocalizedName()); GameRegistry.registerItem(powder_lithium_tiny, powder_lithium_tiny.getUnlocalizedName()); GameRegistry.registerItem(powder_zirconium, powder_zirconium.getUnlocalizedName()); + GameRegistry.registerItem(powder_sodium, powder_sodium.getUnlocalizedName()); GameRegistry.registerItem(powder_lignite, powder_lignite.getUnlocalizedName()); GameRegistry.registerItem(powder_iodine, powder_iodine.getUnlocalizedName()); GameRegistry.registerItem(powder_thorium, powder_thorium.getUnlocalizedName()); @@ -5871,6 +5876,7 @@ public class ModItems { GameRegistry.registerItem(crystal_cinnebar, crystal_cinnebar.getUnlocalizedName()); GameRegistry.registerItem(crystal_trixite, crystal_trixite.getUnlocalizedName()); GameRegistry.registerItem(crystal_osmiridium, crystal_osmiridium.getUnlocalizedName()); + GameRegistry.registerItem(gem_sodalite, gem_sodalite.getUnlocalizedName()); GameRegistry.registerItem(gem_tantalium, gem_tantalium.getUnlocalizedName()); GameRegistry.registerItem(gem_volcanic, gem_volcanic.getUnlocalizedName()); GameRegistry.registerItem(gem_alexandrite, gem_alexandrite.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/special/ItemBedrockOre.java b/src/main/java/com/hbm/items/special/ItemBedrockOre.java index 9d12bade0..f4362a93f 100644 --- a/src/main/java/com/hbm/items/special/ItemBedrockOre.java +++ b/src/main/java/com/hbm/items/special/ItemBedrockOre.java @@ -95,7 +95,8 @@ public class ItemBedrockOre extends ItemEnumMulti { GOLD("Gold", 0xF9D738, B_LEAD, B_COPPER, B_BISMUTH), //occurs with copper, lead and rare bismuthide URANIUM("Uranium", 0x868D82, B_LEAD, B_RADIUM, B_POLONIUM), //uranium and its decay products THORIUM("Thorium", 0x7D401D, B_SILICON, B_URANIUM, B_TECHNETIUM), //thorium occours with uraninite and decay products - CHLOROCALCITE("Chlorocalcite", 0xCDE036, B_LITHIUM, B_SILICON, B_SILICON); //i guess? + CHLOROCALCITE("Chlorocalcite", 0xCDE036, B_LITHIUM, B_SILICON, B_SILICON), //i guess? + FLUORITE("Fluorite", 0xF6F3E7, B_SILICON, B_LITHIUM, B_ALUMINIUM); //different silicon-bearing gemstones, generic lithium, aluminium from sodium compound trailings public String oreName; public int color; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java index 3f0f6bba4..a3adb1bc1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java @@ -129,7 +129,7 @@ public class TileEntityCoreEmitter extends TileEntityMachineBase implements IEne Block b = worldObj.getBlock(x, y, z); - if(b != Blocks.air) { + if(!b.isAir(worldObj, x, y, z)) { if(b.getMaterial().isLiquid()) { worldObj.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "random.fizz", 1.0F, 1.0F); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java index b4fffdb9c..bd2366acc 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreInjector.java @@ -19,7 +19,6 @@ import li.cil.oc.api.machine.Context; import li.cil.oc.api.network.SimpleComponent; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.inventory.Container; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -97,7 +96,7 @@ public class TileEntityCoreInjector extends TileEntityMachineBase implements IFl break; } - if(worldObj.getBlock(x, y, z) != Blocks.air) + if(!worldObj.getBlock(x, y, z).isAir(worldObj, x, y, z)) break; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java index 82ce38079..a60975ed3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java @@ -17,7 +17,6 @@ import li.cil.oc.api.machine.Context; import li.cil.oc.api.network.SimpleComponent; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.inventory.Container; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -86,7 +85,7 @@ public class TileEntityCoreStabilizer extends TileEntityMachineBase implements I break; } - if(worldObj.getBlock(x, y, z) != Blocks.air) + if(!worldObj.getBlock(x, y, z).isAir(worldObj, x, y, z)) break; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java index 2ca86eb13..3ec39159b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java @@ -1,9 +1,11 @@ package com.hbm.tileentity.machine; +import java.util.HashSet; import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockTallPlant.EnumTallFlower; +import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.ModDamageSource; @@ -29,6 +31,15 @@ import net.minecraft.util.Vec3; public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements INBTPacketReceiver, IFluidStandardReceiver { + public static final HashSet acceptedFuels = new HashSet(); + + static { + acceptedFuels.add(Fluids.WOODOIL); + acceptedFuels.add(Fluids.ETHANOL); + acceptedFuels.add(Fluids.FISHOIL); + acceptedFuels.add(Fluids.HEAVYOIL); + } + public FluidTank tank; public boolean isOn; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index ec3a6488a..9fd2a7ec2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -11,6 +11,7 @@ import com.hbm.inventory.container.ContainerPWR; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Heatable; +import com.hbm.inventory.fluid.trait.FT_PWRModerator; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingStep; import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType; import com.hbm.inventory.gui.GUIPWR; @@ -221,6 +222,10 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG this.flux = newFlux; + if(tanks[0].getTankType().hasTrait(FT_PWRModerator.class)) { + this.flux *= tanks[0].getTankType().getTrait(FT_PWRModerator.class).getMultiplier(); + } + NBTTagCompound data = new NBTTagCompound(); tanks[0].writeToNBT(data, "t0"); tanks[1].writeToNBT(data, "t1"); @@ -291,7 +296,7 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG double coolingEff = (double) this.channelCount / (double) this.rodCount * 0.1D; //10% cooling if numbers match if(coolingEff > 1D) coolingEff = 1D; - int heatToUse = (int) (this.hullHeat * coolingEff); + int heatToUse = (int) (this.hullHeat * coolingEff * trait.getEfficiency(HeatingType.PWR)); HeatingStep step = trait.getFirstStep(); int coolCycles = tanks[0].getFill() / step.amountReq; int hotCycles = (tanks[1].getMaxFill() - tanks[1].getFill()) / step.amountProduced; diff --git a/src/main/java/com/hbm/world/feature/BedrockOre.java b/src/main/java/com/hbm/world/feature/BedrockOre.java index 19895823d..f20e79039 100644 --- a/src/main/java/com/hbm/world/feature/BedrockOre.java +++ b/src/main/java/com/hbm/world/feature/BedrockOre.java @@ -36,9 +36,9 @@ public class BedrockOre { registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.GOLD, 1), WorldConfig.bedrockGoldSpawn); registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.URANIUM, 4, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockUraniumSpawn); registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.THORIUM, 4, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockThoriumSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.FLUORITE, 1), WorldConfig.bedrockFluoriteSpawn); registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(Items.coal, 4), 1, 0x202020), WorldConfig.bedrockCoalSpawn); registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(ModItems.niter, 4), 2, 0x808080, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockNiterSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(ModItems.fluorite, 4), 1, 0xd0d0d0), WorldConfig.bedrockFluoriteSpawn); registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(Items.redstone, 4), 1, 0xd01010), WorldConfig.bedrockRedstoneSpawn); registerBedrockOre(weightedOresNether, new BedrockOreDefinition(new ItemStack(Items.glowstone_dust, 4), 1, 0xF9FF4D), WorldConfig.bedrockGlowstoneSpawn); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index c764f300e..a1fef17c3 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3959,6 +3959,7 @@ tile.machine_assembler.name=Fertigungsmaschine tile.machine_assemfac.name=Fertigungsfabrik tile.machine_autocrafter.name=Automatische Werkbank tile.machine_autosaw.name=Automatische Kreissäge +tile.machine_autosaw.desc=Schneidet Pflanzen nieder, pflanzt Bäume nach$Akzeptiert:$-Holzöl$-Ethanol$-Fischöl$-Schweröl tile.machine_bat9000.name=Big-Ass Tank 9000 tile.machine_battery.name=Energiespeicherblock tile.machine_battery_potato.name=Kartoffelbatterieblock diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 6e2e10e35..5aae8fd7b 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -4891,6 +4891,7 @@ tile.machine_assembler.name=Assembly Machine tile.machine_assemfac.name=Assembly Factory tile.machine_autocrafter.name=Automatic Crafting Table tile.machine_autosaw.name=Automatic Buzz Saw +tile.machine_autosaw.desc=Cuts down nearby plants, re-plants trees$Accepts:$-Wood oil$-Ethanol$-Fish oil$-Heavy oil tile.machine_bat9000.name=Big-Ass Tank 9000 tile.machine_battery.name=Energy Storage Block tile.machine_battery_potato.name=Potato Battery Block diff --git a/src/main/resources/assets/hbm/textures/gui/fluids/heavywater_hot.png b/src/main/resources/assets/hbm/textures/gui/fluids/heavywater_hot.png new file mode 100644 index 0000000000000000000000000000000000000000..119b76cda83fe79157024691fe7b947695d24903 GIT binary patch literal 464 zcmV;>0WbcEP);Un9FrR$=dGZ86Q38P!f?%;Inrnxnt2+9=r><+<$cVuZi5Lv>%J|CkprY*TY;4Sa z=61aii8zbJU{Ew)NPC09;V>9#>O9%TR(uBnAvY|Rj*jq3Aom5~$urlHh)eh^Hm@@? zk(e(V3>(`UHwHr>;L@Lg3_%cTYIgSgNJYiUioPswk*qns^V~bxDQUJ6Vo&i!#_xg zA3^YVR#rOG;l8JD%9!_=+j#qr#F8sPP!u2i;e%wFlI5gM=}3#sYE)E*3gy94iLx$x zX(Eq5I4DO;2g)ex(&CYbq6dUDMLL}1D=l47VX-VMZ!q5=lsu#n1)-r~=m%7lOLO7p z`jdU)Dk^GfJRX3ChV%JM2!Y@Emq1`+<2qgsUp!)#6yPu2^ylEDR$kx$00006YfGC6?Vy7L|i66m0 z6fEh)K?inH5O^L5BFV59Ux~C}Ls^?IJdaDJkN3;f!4udveL%VnulxG{?&}r)(;{a* z+#AS>7{Guv@M$J@W^A*#KP#(+19`vT%ClFS@*(fZ-G^B@E%rjABh#0a*OSkg`%-0g zp^EiEG(3GWOuDxja@iff6vl`4mSg}41621cZl!?zM{NI!;_r6j4F4vYC3qTp7qgFXmgR)qkpg0@(a%T9_?QPGojz(DDz;&#SC z3{1TZ0W7cOBH|;D9zP(Fi1Oy8%g){!_cM1ehcNbHi0^LwN;hrd%8y)RWON8IU}{1A u_6Wwto5c`vOg9oI$0Qck_s?-m=dnMgkmGYli)2~=0000P)Nklp?N*Iq`QK6>^Z$Jyw3+O z5B&egXiF@ekyDYc>a=Wy-(}8Olnd%&OOdwY$iq4%h4}?Gf-<_a_WWjs(!hjdoJfyswu^x1f#k~=H@@L6%@H~^A?|%me`}6JJ~GC*0?PU&3_lc z;AgN*#rp(6K0isuvaxKN!1qaZcGIEKtsgq3yQJ()OImfviZd(Ka8n%TgXE|3@-UZ^ zlpdCia9d`alAKdl8X|26>pu;xToStOivUy Date: Mon, 21 Aug 2023 22:09:54 +0200 Subject: [PATCH 13/14] TOREX flash overlay --- .../java/com/hbm/blocks/bomb/NukeBoy.java | 10 +++- .../hbm/entity/effect/EntityNukeTorex.java | 2 +- .../java/com/hbm/items/tool/ItemWandD.java | 18 ++++-- .../com/hbm/main/ModEventHandlerClient.java | 43 +++++++++----- .../hbm/render/entity/effect/RenderTorex.java | 59 +++++++++++++++++++ .../machine/TileEntityPWRController.java | 1 + src/main/java/com/hbm/util/TrackerUtil.java | 9 +++ 7 files changed, 121 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/hbm/blocks/bomb/NukeBoy.java b/src/main/java/com/hbm/blocks/bomb/NukeBoy.java index 01673e12d..d25f59ace 100644 --- a/src/main/java/com/hbm/blocks/bomb/NukeBoy.java +++ b/src/main/java/com/hbm/blocks/bomb/NukeBoy.java @@ -5,10 +5,12 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.config.BombConfig; import com.hbm.entity.effect.EntityNukeCloudSmall; +import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.entity.logic.EntityNukeExplosionMK5; import com.hbm.interfaces.IBomb; import com.hbm.main.MainRegistry; import com.hbm.tileentity.bomb.TileEntityNukeBoy; +import com.hbm.util.TrackerUtil; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; @@ -124,7 +126,13 @@ public class NukeBoy extends BlockContainer implements IBomb { world.playSoundEffect(x, y, z, "random.explode", 1.0f, world.rand.nextFloat() * 0.1F + 0.9F); world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, BombConfig.boyRadius, x + 0.5, y + 0.5, z + 0.5)); - world.spawnEntityInWorld(EntityNukeCloudSmall.statFac(world, x, y, z, BombConfig.boyRadius)); + //world.spawnEntityInWorld(EntityNukeCloudSmall.statFac(world, x, y, z, BombConfig.boyRadius)); + + EntityNukeTorex torex = new EntityNukeTorex(world); + torex.setPositionAndRotation(x + 0.5, y + 1, z + 0.5, 0, 0); + torex.getDataWatcher().updateObject(10, 1.5F); + world.spawnEntityInWorld(torex); + TrackerUtil.setTrackingRange(world, torex, 1000); } return false; } diff --git a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java index b93311496..227552d0c 100644 --- a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java +++ b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java @@ -151,7 +151,7 @@ public class EntityNukeTorex extends Entity { if(life > fadeOut) { float fac = (float)(life - fadeOut) / (float)(lifetime - fadeOut); - return 1F - fac * fac; + return 1F - fac; } return 1.0F; diff --git a/src/main/java/com/hbm/items/tool/ItemWandD.java b/src/main/java/com/hbm/items/tool/ItemWandD.java index 4c80ccab4..1e8e427dc 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandD.java +++ b/src/main/java/com/hbm/items/tool/ItemWandD.java @@ -2,15 +2,22 @@ package com.hbm.items.tool; import java.util.List; +import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; import com.hbm.lib.Library; +import com.hbm.util.TrackerUtil; +import cpw.mods.fml.relauncher.ReflectionHelper; +import net.minecraft.entity.EntityTracker; +import net.minecraft.entity.EntityTrackerEntry; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.IntHashMap; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; public class ItemWandD extends Item { @@ -32,7 +39,7 @@ public class ItemWandD extends Item { vnt.setSFX(new ExplosionEffectStandard()); vnt.explode();*/ - PollutionHandler.incrementPollution(world, pos.blockX, pos.blockY, pos.blockZ, PollutionType.SOOT, 15); + //PollutionHandler.incrementPollution(world, pos.blockX, pos.blockY, pos.blockZ, PollutionType.SOOT, 15); /*TimeAnalyzer.startCount("setBlock"); world.setBlock(pos.blockX, pos.blockY, pos.blockZ, Blocks.dirt); @@ -54,15 +61,16 @@ public class ItemWandD extends Item { tom.destructionRange = 600; world.spawnEntityInWorld(tom);*/ - /*EntityNukeTorex torex = new EntityNukeTorex(world); + EntityNukeTorex torex = new EntityNukeTorex(world); torex.setPositionAndRotation(pos.blockX, pos.blockY + 1, pos.blockZ, 0, 0); torex.getDataWatcher().updateObject(10, 1.5F); world.spawnEntityInWorld(torex); - EntityTracker entitytracker = ((WorldServer) world).getEntityTracker(); + /*EntityTracker entitytracker = ((WorldServer) world).getEntityTracker(); IntHashMap map = ReflectionHelper.getPrivateValue(EntityTracker.class, entitytracker, "trackedEntityIDs", "field_72794_c"); EntityTrackerEntry entry = (EntityTrackerEntry) map.lookup(torex.getEntityId()); - entry.blocksDistanceThreshold = 1000; - world.spawnEntityInWorld(EntityNukeExplosionMK5.statFacNoRad(world, 150, pos.blockX, pos.blockY + 1, pos.blockZ));*/ + entry.blocksDistanceThreshold = 1000;*/ + TrackerUtil.setTrackingRange(world, torex, 1000); + //world.spawnEntityInWorld(EntityNukeExplosionMK5.statFacNoRad(world, 150, pos.blockX, pos.blockY + 1, pos.blockZ)); //DungeonToolbox.generateBedrockOreWithChance(world, world.rand, pos.blockX, pos.blockZ, EnumBedrockOre.TITANIUM, new FluidStack(Fluids.SULFURIC_ACID, 500), 2, 1); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 17a4e9682..a1bc1b705 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -1,7 +1,6 @@ package com.hbm.main; import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Random; @@ -18,7 +17,6 @@ import com.hbm.blocks.rail.IRailNTM.MoveContext; import com.hbm.blocks.rail.IRailNTM.RailCheckType; import com.hbm.blocks.rail.IRailNTM.RailContext; import com.hbm.config.GeneralConfig; -import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.entity.mob.EntityHunterChopper; import com.hbm.entity.projectile.EntityChopperMine; import com.hbm.entity.train.EntityRailCarRidable; @@ -147,11 +145,38 @@ import net.minecraftforge.event.entity.player.ItemTooltipEvent; public class ModEventHandlerClient { + public static int flashTimer; + @SubscribeEvent public void onOverlayRender(RenderGameOverlayEvent.Pre event) { EntityPlayer player = Minecraft.getMinecraft().thePlayer; + /// NUKE FLASH /// + if(event.type == ElementType.CROSSHAIRS && flashTimer > 0) { + int width = event.resolution.getScaledWidth(); + int height = event.resolution.getScaledHeight(); + Tessellator tess = Tessellator.instance; + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glAlphaFunc(GL11.GL_GEQUAL, 0.0F); + GL11.glDepthMask(false); + tess.startDrawingQuads(); + float brightness = (flashTimer - event.partialTicks) / 200F; + tess.setColorRGBA_F(1F, 1F, 1F, brightness * 0.8F); + tess.addVertex(width, 0, 0); + tess.addVertex(0, 0, 0); + tess.addVertex(0, height, 0); + tess.addVertex(width, height, 0); + tess.draw(); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GL11.glDepthMask(true); + return; + } + /// HANDLE GUN OVERLAYS /// if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IItemHUD) { ((IItemHUD)player.getHeldItem().getItem()).renderHUD(event, event.type, player, player.getHeldItem()); @@ -196,18 +221,6 @@ public class ModEventHandlerClient { } } - List torex = world.getEntitiesWithinAABB(EntityNukeTorex.class, player.boundingBox.expand(100, 100, 100)); - - if(!torex.isEmpty()) { - EntityNukeTorex t = torex.get(0); - List text = new ArrayList(); - text.add("Speed: " + t.getSimulationSpeed()); - text.add("Alpha: " + t.getAlpha()); - text.add("Age: " + t.ticksExisted + " / " + t.getMaxAge()); - text.add("Clouds: " + t.cloudlets.size()); - ILookOverlay.printGeneric(event, "DEBUG", 0xff0000, 0x4040000, text); - } - /*List text = new ArrayList(); text.add("IMPACT: " + ImpactWorldHandler.getImpactForClient(world)); text.add("DUST: " + ImpactWorldHandler.getDustForClient(world)); @@ -1250,6 +1263,8 @@ public class ModEventHandlerClient { client.sendQueue.addToSendQueue(new C0CPacketInput(client.moveStrafing, client.moveForward, client.movementInput.jump, client.movementInput.sneak)); } } + + if(event.phase == Phase.START) if(flashTimer > 0) flashTimer--; } @SubscribeEvent diff --git a/src/main/java/com/hbm/render/entity/effect/RenderTorex.java b/src/main/java/com/hbm/render/entity/effect/RenderTorex.java index 661b57773..dfa21028c 100644 --- a/src/main/java/com/hbm/render/entity/effect/RenderTorex.java +++ b/src/main/java/com/hbm/render/entity/effect/RenderTorex.java @@ -2,6 +2,7 @@ package com.hbm.render.entity.effect; import java.util.ArrayList; import java.util.Comparator; +import java.util.Random; import org.lwjgl.opengl.GL11; @@ -9,6 +10,7 @@ import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.entity.effect.EntityNukeTorex.Cloudlet; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; +import com.hbm.main.ModEventHandlerClient; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.OpenGlHelper; @@ -23,6 +25,7 @@ import net.minecraft.util.Vec3; public class RenderTorex extends Render { private static final ResourceLocation cloudlet = new ResourceLocation(RefStrings.MODID + ":textures/particle/particle_base.png"); + private static final ResourceLocation flash = new ResourceLocation(RefStrings.MODID + ":textures/particle/flare.png"); @Override public void doRender(Entity entity, double x, double y, double z, float f0, float interp) { @@ -31,6 +34,8 @@ public class RenderTorex extends Render { GL11.glTranslated(x, y, z); EntityNukeTorex cloud = (EntityNukeTorex)entity; cloudletWrapper(cloud, interp); + if(cloud.ticksExisted < 101) flashWrapper(cloud, interp); + if(cloud.ticksExisted < 10 && ModEventHandlerClient.flashTimer < 100) ModEventHandlerClient.flashTimer = 200; GL11.glPopMatrix(); } @@ -81,6 +86,43 @@ public class RenderTorex extends Render { GL11.glDisable(GL11.GL_BLEND); GL11.glPopMatrix(); } + + private void flashWrapper(EntityNukeTorex cloud, float interp) { + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glAlphaFunc(GL11.GL_GREATER, 0); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDepthMask(false); + RenderHelper.disableStandardItemLighting(); + + bindTexture(flash); + + Tessellator tess = Tessellator.instance; + tess.startDrawingQuads(); + + double age = Math.min(cloud.ticksExisted + interp, 100); + float alpha = (float) ((100D - age) / 100F); + + Random rand = new Random(cloud.getEntityId()); + + for(int i = 0; i < 3; i++) { + float x = (float) (rand.nextGaussian() * 0.5F * cloud.rollerSize); + float y = (float) (rand.nextGaussian() * 0.5F * cloud.rollerSize); + float z = (float) (rand.nextGaussian() * 0.5F * cloud.rollerSize); + tessellateFlash(tess, x, y + cloud.coreHeight, z, (float) (10 * cloud.rollerSize), alpha, interp); + } + + tess.draw(); + + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_ALPHA_TEST); + RenderHelper.enableStandardItemLighting(); + GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GL11.glDisable(GL11.GL_BLEND); + GL11.glPopMatrix(); + } private void tessellateCloudlet(Tessellator tess, double posX, double posY, double posZ, Cloudlet cloud, float interp) { @@ -104,6 +146,23 @@ public class RenderTorex extends Render { } + private void tessellateFlash(Tessellator tess, double posX, double posY, double posZ, float scale, float alpha, float interp) { + + float f1 = ActiveRenderInfo.rotationX; + float f2 = ActiveRenderInfo.rotationZ; + float f3 = ActiveRenderInfo.rotationYZ; + float f4 = ActiveRenderInfo.rotationXY; + float f5 = ActiveRenderInfo.rotationXZ; + + tess.setColorRGBA_F(1F, 1F, 1F, alpha); + + tess.addVertexWithUV((double) (posX - f1 * scale - f3 * scale), (double) (posY - f5 * scale), (double) (posZ - f2 * scale - f4 * scale), 1, 1); + tess.addVertexWithUV((double) (posX - f1 * scale + f3 * scale), (double) (posY + f5 * scale), (double) (posZ - f2 * scale + f4 * scale), 1, 0); + tess.addVertexWithUV((double) (posX + f1 * scale + f3 * scale), (double) (posY + f5 * scale), (double) (posZ + f2 * scale + f4 * scale), 0, 0); + tess.addVertexWithUV((double) (posX + f1 * scale - f3 * scale), (double) (posY - f5 * scale), (double) (posZ + f2 * scale - f4 * scale), 0, 1); + + } + @Override protected ResourceLocation getEntityTexture(Entity p_110775_1_) { return null; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java index 9fd2a7ec2..e50143a6b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityPWRController.java @@ -202,6 +202,7 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG slots[1].stackSize++; } + this.amountLoaded--; this.markChanged(); } } diff --git a/src/main/java/com/hbm/util/TrackerUtil.java b/src/main/java/com/hbm/util/TrackerUtil.java index 9889d0c6e..62140046e 100644 --- a/src/main/java/com/hbm/util/TrackerUtil.java +++ b/src/main/java/com/hbm/util/TrackerUtil.java @@ -41,4 +41,13 @@ public class TrackerUtil { entry.ticks = 0; } } + + public static void setTrackingRange(World world, Entity e, int range) { + + if(world instanceof WorldServer) { + WorldServer server = (WorldServer) world; + EntityTrackerEntry entry = getTrackerEntry(server, e.getEntityId()); + entry.blocksDistanceThreshold = range; + } + } } From 35b18dda348dd17ac7c65c409c8ddd44d72b911f Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 21 Aug 2023 23:07:47 +0200 Subject: [PATCH 14/14] do the bugshaker --- .../java/com/hbm/entity/effect/EntityNukeTorex.java | 11 +++++++++++ .../java/com/hbm/main/ModEventHandlerRenderer.java | 13 +++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java index 227552d0c..8e0ef45f1 100644 --- a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java +++ b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java @@ -36,6 +36,17 @@ public class EntityNukeTorex extends Entity { this.dataWatcher.addObject(10, new Float(1)); } + @Override + @SideOnly(Side.CLIENT) + public int getBrightnessForRender(float p_70070_1_) { + return 15728880; + } + + @Override + public float getBrightness(float p_70013_1_) { + return 1.0F; + } + @Override public void onUpdate() { diff --git a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java index 7dd68dd4c..eee0c1d97 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java +++ b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java @@ -28,8 +28,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraftforge.client.event.DrawBlockHighlightEvent; +import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.EntityViewRenderEvent.FogColors; import net.minecraftforge.client.event.EntityViewRenderEvent.FogDensity; +import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.client.event.RenderPlayerEvent; public class ModEventHandlerRenderer { @@ -377,4 +379,15 @@ public class ModEventHandlerRenderer { event.blue = event.blue * (1 - interp) + sootColor * interp; } } + + @SubscribeEvent + public void onRenderHUD(RenderGameOverlayEvent.Pre event) { + + if(event.type == ElementType.HOTBAR && ModEventHandlerClient.flashTimer > 0) { + double mult = (ModEventHandlerClient.flashTimer + event.partialTicks) * 0.01D; + double horizontal = MathHelper.clamp_double(Math.sin(System.currentTimeMillis() * 0.02), -0.7, 0.7) * 5; + double vertical = MathHelper.clamp_double(Math.sin(System.currentTimeMillis() * 0.01 + 2), -0.7, 0.7) * 1; + GL11.glTranslated(horizontal * mult, vertical * mult, 0); + } + } }