From 4549924dfde5fcc1c630691939c65c456cd3673e Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 15 Apr 2022 15:07:17 +0200 Subject: [PATCH] RBMK heating column, heat exchanger, mug root beer coolant and regular coolant too i guess --- src/main/java/com/hbm/blocks/ModBlocks.java | 6 + .../hbm/blocks/machine/rbmk/RBMKHeater.java | 23 +++ .../hbm/blocks/machine/rbmk/RBMKHeatex.java | 83 +++++++++ .../com/hbm/inventory/fluid/FluidType.java | 6 + .../java/com/hbm/inventory/fluid/Fluids.java | 11 +- .../machine/rbmk/TileEntityHeatex.java | 161 +++++++++++++++++ .../machine/rbmk/TileEntityRBMKBoiler.java | 14 +- .../machine/rbmk/TileEntityRBMKConsole.java | 3 +- .../machine/rbmk/TileEntityRBMKHeater.java | 163 ++++++++++++++++++ .../machine/rbmk/TileEntityRBMKInlet.java | 3 - .../hbm/textures/blocks/rbmk/rbmk_heater.png | Bin 0 -> 1043 bytes .../hbm/textures/blocks/rbmk_heatex.png | Bin 0 -> 701 bytes .../hbm/textures/gui/fluids/coolant_hot.png | Bin 0 -> 675 bytes .../gui/reactors/gui_rbmk_console.png | Bin 6015 -> 6111 bytes .../textures/gui/reactors/gui_rbmk_heater.png | Bin 0 -> 3760 bytes .../models/tank_label/tank_COOLANT_HOT.png | Bin 0 -> 1874 bytes 16 files changed, 461 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/rbmk/RBMKHeater.java create mode 100644 src/main/java/com/hbm/blocks/machine/rbmk/RBMKHeatex.java create mode 100644 src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityHeatex.java create mode 100644 src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/rbmk/rbmk_heater.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/rbmk_heatex.png create mode 100644 src/main/resources/assets/hbm/textures/gui/fluids/coolant_hot.png create mode 100644 src/main/resources/assets/hbm/textures/gui/reactors/gui_rbmk_heater.png create mode 100644 src/main/resources/assets/hbm/textures/models/tank_label/tank_COOLANT_HOT.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index c75cbf90e..7f093a977 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1102,6 +1102,7 @@ public class ModBlocks { public static Block rbmk_outgasser; public static Block rbmk_storage; public static Block rbmk_cooler; + public static Block rbmk_heater; public static Block rbmk_console; public static Block rbmk_crane_console; public static final int guiID_rbmk_rod = 113; @@ -1114,6 +1115,7 @@ public class ModBlocks { public static Block rbmk_loader; public static Block rbmk_steam_inlet; public static Block rbmk_steam_outlet; + public static Block rbmk_heatex; public static Block pribris; public static Block pribris_burning; public static Block pribris_radiating; @@ -2067,11 +2069,13 @@ public class ModBlocks { rbmk_outgasser = new RBMKOutgasser().setBlockName("rbmk_outgasser").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_outgasser"); rbmk_storage = new RBMKStorage().setBlockName("rbmk_storage").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_storage"); rbmk_cooler = new RBMKCooler().setBlockName("rbmk_cooler").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_cooler"); + rbmk_heater = new RBMKHeater().setBlockName("rbmk_heater").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_heater"); rbmk_console = new RBMKConsole().setBlockName("rbmk_console").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_console"); rbmk_crane_console = new RBMKCraneConsole().setBlockName("rbmk_crane_console").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_crane_console"); rbmk_loader = new BlockGeneric(Material.iron).setBlockName("rbmk_loader").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(60.0F).setBlockTextureName(RefStrings.MODID + ":rbmk_loader"); rbmk_steam_inlet = new RBMKInlet(Material.iron).setBlockName("rbmk_steam_inlet").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(60.0F).setBlockTextureName(RefStrings.MODID + ":rbmk_steam_inlet"); rbmk_steam_outlet = new RBMKOutlet(Material.iron).setBlockName("rbmk_steam_outlet").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(60.0F).setBlockTextureName(RefStrings.MODID + ":rbmk_steam_outlet"); + rbmk_heatex = new RBMKHeatex(Material.iron).setBlockName("rbmk_heatex").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(60.0F).setBlockTextureName(RefStrings.MODID + ":rbmk_heatex"); pribris = new RBMKDebris().setBlockName("pribris").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(600.0F).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_debris"); pribris_burning = new RBMKDebrisBurning().setBlockName("pribris_burning").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(600.0F).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_debris_burning"); pribris_radiating = new RBMKDebrisRadiating().setBlockName("pribris_radiating").setCreativeTab(MainRegistry.machineTab).setHardness(50.0F).setResistance(600.0F).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_debris_radiating"); @@ -2983,11 +2987,13 @@ public class ModBlocks { GameRegistry.registerBlock(rbmk_outgasser, rbmk_outgasser.getUnlocalizedName()); GameRegistry.registerBlock(rbmk_storage, rbmk_storage.getUnlocalizedName()); GameRegistry.registerBlock(rbmk_cooler, rbmk_cooler.getUnlocalizedName()); + GameRegistry.registerBlock(rbmk_heater, rbmk_heater.getUnlocalizedName()); GameRegistry.registerBlock(rbmk_console, rbmk_console.getUnlocalizedName()); GameRegistry.registerBlock(rbmk_crane_console, rbmk_crane_console.getUnlocalizedName()); GameRegistry.registerBlock(rbmk_loader, rbmk_loader.getUnlocalizedName()); GameRegistry.registerBlock(rbmk_steam_inlet, rbmk_steam_inlet.getUnlocalizedName()); GameRegistry.registerBlock(rbmk_steam_outlet, rbmk_steam_outlet.getUnlocalizedName()); + GameRegistry.registerBlock(rbmk_heatex, rbmk_heatex.getUnlocalizedName()); GameRegistry.registerBlock(pribris, pribris.getUnlocalizedName()); GameRegistry.registerBlock(pribris_burning, pribris_burning.getUnlocalizedName()); GameRegistry.registerBlock(pribris_radiating, pribris_radiating.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKHeater.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKHeater.java new file mode 100644 index 000000000..3b3d7ceb2 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKHeater.java @@ -0,0 +1,23 @@ +package com.hbm.blocks.machine.rbmk; + +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKHeater; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class RBMKHeater extends RBMKBase { + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + + if(meta >= this.offset) + return new TileEntityRBMKHeater(); + + return null; + } + + @Override + public int getRenderType(){ + return this.renderIDControl; + } +} diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKHeatex.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKHeatex.java new file mode 100644 index 000000000..a8d2c2136 --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKHeatex.java @@ -0,0 +1,83 @@ +package com.hbm.blocks.machine.rbmk; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.ILookOverlay; +import com.hbm.inventory.FluidTank; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.items.machine.IItemFluidIdentifier; +import com.hbm.tileentity.machine.rbmk.TileEntityHeatex; +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKHeater; +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.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 RBMKHeatex extends BlockContainer implements ILookOverlay { + + public RBMKHeatex(Material mat) { + super(mat); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityHeatex(); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { + + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IItemFluidIdentifier) { + IItemFluidIdentifier id = (IItemFluidIdentifier) player.getHeldItem().getItem(); + FluidType type = id.getType(world, x, y, z, player.getHeldItem()); + FluidType convert = TileEntityRBMKHeater.getConversion(type); + + if(!player.isSneaking() && convert != Fluids.NONE) { + + TileEntity te = world.getTileEntity(x, y, z); + + if(te instanceof TileEntityHeatex) { + TileEntityHeatex heatex = (TileEntityHeatex) te; + heatex.coolantIn.setTankType(type); + heatex.coolantOut.setTankType(convert); + heatex.markDirty(); + player.addChatComponentMessage(new ChatComponentText("Changed type to ").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.YELLOW)).appendSibling(new ChatComponentTranslation("hbmfluid." + type.getName().toLowerCase())).appendSibling(new ChatComponentText("!"))); + } + } + } + + return false; + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityHeatex)) + return; + + TileEntityHeatex extractor = (TileEntityHeatex) te; + + List text = new ArrayList(); + addLine(text, extractor.coolantIn, true); + addLine(text, extractor.waterIn, true); + addLine(text, extractor.coolantOut, false); + addLine(text, extractor.waterOut, false); + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + + private void addLine(List text, FluidTank tank, boolean in) { + text.add((in ? (EnumChatFormatting.GREEN + "-> ") : (EnumChatFormatting.RED + "<- ")) + EnumChatFormatting.RESET + I18nUtil.resolveKey("hbmfluid." + tank.getTankType().getName().toLowerCase()) + ": " + tank.getFill() + "/" + tank.getMaxFill() + "mB"); + } +} diff --git a/src/main/java/com/hbm/inventory/fluid/FluidType.java b/src/main/java/com/hbm/inventory/fluid/FluidType.java index fe8f94440..d7fa2ef07 100644 --- a/src/main/java/com/hbm/inventory/fluid/FluidType.java +++ b/src/main/java/com/hbm/inventory/fluid/FluidType.java @@ -29,6 +29,7 @@ public class FluidType { public int reactivity; public EnumSymbol symbol; public int temperature; + public double heatCap; public Set containers = new HashSet(); public List traits = new ArrayList(); private String stringId; @@ -61,6 +62,11 @@ public class FluidType { return this; } + public FluidType setHeatCap(double heatCap) { + this.heatCap = heatCap; + return this; + } + public FluidType addContainers(int color, ExtContainer... containers) { this.containerColor = color; Collections.addAll(this.containers, containers); diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index b3a6f77fc..13a2aef2e 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -18,6 +18,7 @@ public class Fluids { public static FluidType SUPERHOTSTEAM; public static FluidType ULTRAHOTSTEAM; public static FluidType COOLANT; + public static FluidType COOLANT_HOT; public static FluidType LAVA; public static FluidType DEUTERIUM; public static FluidType TRITIUM; @@ -87,6 +88,8 @@ public class Fluids { public static FluidType XPJUICE; public static FluidType ENDERJUICE; public static FluidType SULFURIC_ACID; + public static FluidType MUG; + public static FluidType MUG_HOT; private static final HashMap idMapping = new HashMap(); private static final HashMap nameMapping = new HashMap(); @@ -113,7 +116,7 @@ public class Fluids { HOTSTEAM = new FluidType( "HOTSTEAM", 0xE7D6D6, 4, 0, 0, EnumSymbol.NONE).setTemp(300); SUPERHOTSTEAM = new FluidType( "SUPERHOTSTEAM", 0xE7B7B7, 4, 0, 0, EnumSymbol.NONE).setTemp(450); ULTRAHOTSTEAM = new FluidType( "ULTRAHOTSTEAM", 0xE39393, 4, 0, 0, EnumSymbol.NONE).setTemp(600); - COOLANT = new FluidType( "COOLANT", 0xd8fcff, 1, 0, 0, EnumSymbol.NONE); + COOLANT = new FluidType( "COOLANT", 0xd8fcff, 1, 0, 0, EnumSymbol.NONE).setHeatCap(0.25D); LAVA = new FluidType( "LAVA", 0xFF3300, 4, 0, 0, EnumSymbol.NOWATER).setTemp(1200); DEUTERIUM = new FluidTypeCombustible( "DEUTERIUM", 0x0000FF, 3, 4, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 10_000).setHeatEnergy(5_000); TRITIUM = new FluidTypeCombustible( "TRITIUM", 0x000099, 3, 4, 0, EnumSymbol.RADIATION).setCombustionEnergy(FuelGrade.HIGH, 10_000).setHeatEnergy(5_000); @@ -183,6 +186,9 @@ public class Fluids { GASOLINE_LEADED = new FluidTypeCombustible( "GASOLINE_LEADED", 0x445772, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 1_500_000).setHeatEnergy(((FluidTypeFlammable)GASOLINE).getHeatEnergy()); COALGAS_LEADED = new FluidTypeCombustible( "COALGAS_LEADED", 0x445772, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.MEDIUM, 250_000).setHeatEnergy(((FluidTypeFlammable)COALGAS).getHeatEnergy()); SULFURIC_ACID = new FluidType( "SULFURIC_ACID", 0xB0AA64, 3, 0, 2, EnumSymbol.ACID).addTraits(FluidTrait.CORROSIVE); + COOLANT_HOT = new FluidType( "COOLANT_HOT", 0x99525E, 1, 0, 0, EnumSymbol.NONE).setTemp(600).setHeatCap(STEAM.heatCap); + MUG = new FluidType( "MUG", 0xd8fcff, 0, 0, 0, EnumSymbol.NONE).setHeatCap(1D); + MUG_HOT = new FluidType( "MUG_HOT", 0xd8fcff, 0, 0, 0, EnumSymbol.NONE).setHeatCap(MUG.heatCap).setTemp(500); // ^ ^ ^ ^ ^ ^ ^ ^ @@ -205,7 +211,10 @@ public class Fluids { //coolants metaOrder.add(CARBONDIOXIDE); metaOrder.add(COOLANT); + metaOrder.add(COOLANT_HOT); metaOrder.add(CRYOGEL); + metaOrder.add(MUG); + metaOrder.add(MUG_HOT); //pure elements, cyogenic gasses metaOrder.add(HYDROGEN); metaOrder.add(DEUTERIUM); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityHeatex.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityHeatex.java new file mode 100644 index 000000000..4ba6f0497 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityHeatex.java @@ -0,0 +1,161 @@ +package com.hbm.tileentity.machine.rbmk; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.interfaces.IFluidAcceptor; +import com.hbm.interfaces.IFluidSource; +import com.hbm.inventory.FluidTank; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.lib.Library; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityHeatex extends TileEntity implements IFluidAcceptor, IFluidSource { + + public List coolantList = new ArrayList(); + public List waterList = new ArrayList(); + public FluidTank coolantIn; + public FluidTank coolantOut; + public FluidTank waterIn; + public FluidTank waterOut; + public double heatBuffer; + public static final double maxHeat = 10_000; + + public TileEntityHeatex() { + coolantIn = new FluidTank(Fluids.COOLANT_HOT, 1000, 0); + coolantOut = new FluidTank(Fluids.COOLANT, 1000, 1); + waterIn = new FluidTank(Fluids.WATER, 1000, 2); + waterOut = new FluidTank(Fluids.SUPERHOTSTEAM, 1000, 3); + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + /* Cool input */ + double heatCap = maxHeat - heatBuffer; + int fillCap = coolantOut.getMaxFill() - coolantOut.getFill(); + double deltaT = coolantIn.getTankType().temperature - coolantOut.getTankType().temperature; + double heatPot = coolantIn.getFill() * coolantIn.getTankType().heatCap * deltaT; + double heatEff = Math.min(heatCap, heatPot); + int convertMax = (int) (heatEff / (coolantIn.getTankType().heatCap * deltaT)); + int convertEff = Math.min(convertMax, fillCap); + + coolantIn.setFill(coolantIn.getFill() - convertEff); + coolantOut.setFill(coolantOut.getFill() + convertEff); + this.heatBuffer += convertEff * coolantIn.getTankType().heatCap * deltaT; + + double HEAT_PER_MB_WATER = RBMKDials.getBoilerHeatConsumption(worldObj); + + /* Heat water */ + int waterCap = waterOut.getMaxFill() - waterOut.getFill(); + int maxBoil = (int) Math.min(waterIn.getFill(), heatBuffer / HEAT_PER_MB_WATER); + int boilEff = Math.min(maxBoil, waterCap); + + waterIn.setFill(waterIn.getFill() - boilEff); + waterOut.setFill(waterOut.getFill() + boilEff); + this.heatBuffer -= boilEff * HEAT_PER_MB_WATER; + + coolantIn.updateTank(this, 15); + coolantOut.updateTank(this, 15); + waterIn.updateTank(this, 15); + waterOut.updateTank(this, 15); + + this.fillFluidInit(coolantOut.getTankType()); + this.fillFluidInit(waterOut.getTankType()); + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.coolantIn.readFromNBT(nbt, "cI"); + this.coolantOut.readFromNBT(nbt, "cO"); + this.waterIn.readFromNBT(nbt, "wI"); + this.waterOut.readFromNBT(nbt, "wO"); + this.heatBuffer = nbt.getDouble("heat"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + this.coolantIn.writeToNBT(nbt, "cI"); + this.coolantOut.writeToNBT(nbt, "cO"); + this.waterIn.writeToNBT(nbt, "wI"); + this.waterOut.writeToNBT(nbt, "wO"); + nbt.setDouble("heat", this.heatBuffer); + } + + @Override + public void setFillForSync(int fill, int index) { + if(index == 0) coolantIn.setFill(fill); + if(index == 1) coolantOut.setFill(fill); + if(index == 2) waterIn.setFill(fill); + if(index == 3) waterOut.setFill(fill); + } + + @Override + public void setFluidFill(int fill, FluidType type) { + if(type == coolantIn.getTankType()) coolantIn.setFill(fill); + if(type == coolantOut.getTankType()) coolantOut.setFill(fill); + if(type == waterIn.getTankType()) waterIn.setFill(fill); + if(type == waterOut.getTankType()) waterOut.setFill(fill); + } + + @Override + public void setTypeForSync(FluidType type, int index) { + if(index == 0) coolantIn.setTankType(type); + if(index == 1) coolantOut.setTankType(type); + if(index == 2) waterIn.setTankType(type); + if(index == 3) waterOut.setTankType(type); + } + + @Override + public int getFluidFill(FluidType type) { + if(type == coolantIn.getTankType()) return coolantIn.getFill(); + if(type == coolantOut.getTankType()) return coolantOut.getFill(); + if(type == waterIn.getTankType()) return waterIn.getFill(); + if(type == waterOut.getTankType()) return waterOut.getFill(); + return 0; + } + + @Override + public void fillFluidInit(FluidType type) { + 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) { + if(type == coolantOut.getTankType()) return this.coolantList; + if(type == waterOut.getTankType()) return this.waterList; + return new ArrayList(); + } + + @Override + public void clearFluidList(FluidType type) { + if(type == coolantOut.getTankType()) this.coolantList.clear(); + if(type == waterOut.getTankType()) this.waterList.clear(); + } + + @Override + public int getMaxFluidFill(FluidType type) { + if(type == coolantIn.getTankType()) return coolantIn.getMaxFill(); + if(type == waterIn.getTankType()) return waterIn.getMaxFill(); + return 0; + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java index 848287a7b..f73271f66 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBoiler.java @@ -57,7 +57,7 @@ public class TileEntityRBMKBoiler extends TileEntityRBMKSlottedBase implements I steam.setFill(steam.getMaxFill()); } - this.heat -= waterUsed * RBMKDials.getBoilerHeatConsumption(worldObj); + this.heat -= waterUsed * feed.getTankType().heatCap; } fillFluidInit(steam.getTankType()); @@ -66,7 +66,7 @@ public class TileEntityRBMKBoiler extends TileEntityRBMKSlottedBase implements I super.updateEntity(); } - public double getHeatFromSteam(FluidType type) { + public static double getHeatFromSteam(FluidType type) { if(type == Fluids.STEAM) return 100D; if(type == Fluids.HOTSTEAM) return 300D; if(type == Fluids.SUPERHOTSTEAM) return 450D; @@ -74,7 +74,7 @@ public class TileEntityRBMKBoiler extends TileEntityRBMKSlottedBase implements I return 0D; } - public double getFactorFromSteam(FluidType type) { + public static double getFactorFromSteam(FluidType type) { if(type == Fluids.STEAM) return 1D; if(type == Fluids.HOTSTEAM) return 10D; if(type == Fluids.SUPERHOTSTEAM) return 100D; @@ -202,10 +202,10 @@ public class TileEntityRBMKBoiler extends TileEntityRBMKSlottedBase implements I if(data.hasKey("compression")) { FluidType type = steam.getTankType(); - if(type == Fluids.STEAM) { steam.setTankType(Fluids.HOTSTEAM); steam.setFill(steam.getFill() / 10); } - if(type == Fluids.HOTSTEAM) { steam.setTankType(Fluids.SUPERHOTSTEAM); steam.setFill(steam.getFill() / 10); } - if(type == Fluids.SUPERHOTSTEAM) { steam.setTankType(Fluids.ULTRAHOTSTEAM); steam.setFill(steam.getFill() / 10); } - if(type == Fluids.ULTRAHOTSTEAM) { steam.setTankType(Fluids.STEAM); steam.setFill(Math.min(steam.getFill() * 1000, steam.getMaxFill())); } + if(type == Fluids.STEAM) { steam.setTankType(Fluids.HOTSTEAM); steam.setFill(steam.getFill() / 10); } + if(type == Fluids.HOTSTEAM) { steam.setTankType(Fluids.SUPERHOTSTEAM); steam.setFill(steam.getFill() / 10); } + if(type == Fluids.SUPERHOTSTEAM) { steam.setTankType(Fluids.ULTRAHOTSTEAM); steam.setFill(steam.getFill() / 10); } + if(type == Fluids.ULTRAHOTSTEAM) { steam.setTankType(Fluids.STEAM); steam.setFill(Math.min(steam.getFill() * 1000, steam.getMaxFill())); } this.markDirty(); } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java index fc2c8b022..78150cdd7 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKConsole.java @@ -276,7 +276,8 @@ public class TileEntityRBMKConsole extends TileEntityMachineBase implements ICon OUTGASSER(80), BREEDER(100), STORAGE(110), - COOLER(120); + COOLER(120), + HEATEX(130); public int offset; diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java new file mode 100644 index 000000000..99e819dde --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKHeater.java @@ -0,0 +1,163 @@ +package com.hbm.tileentity.machine.rbmk; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.interfaces.IFluidAcceptor; +import com.hbm.interfaces.IFluidSource; +import com.hbm.inventory.FluidTank; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.lib.Library; +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType; + +public class TileEntityRBMKHeater extends TileEntityRBMKSlottedBase implements IFluidAcceptor, IFluidSource { + + public FluidTank feed; + public FluidTank steam; + public List list = new ArrayList(); + + public TileEntityRBMKHeater() { + super(1); + } + + @Override + public String getName() { + return "container.rbmkHeater"; + } + + @Override + public ColumnType getConsoleType() { + return ColumnType.HEATEX; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + feed.updateTank(xCoord, yCoord, zCoord, worldObj.provider.dimensionId); + steam.updateTank(xCoord, yCoord, zCoord, worldObj.provider.dimensionId); + + double heatCap = this.getConversionHeat(feed.getTankType()); + double heatProvided = this.heat - heatCap; + + if(heatProvided > 0) { + + int converted = (int)Math.floor(heatProvided / RBMKDials.getBoilerHeatConsumption(worldObj)); + converted = Math.min(converted, feed.getFill()); + converted = Math.min(converted, steam.getMaxFill() - steam.getFill()); + feed.setFill(feed.getFill() - converted); + steam.setFill(steam.getFill() + converted); + this.heat -= converted * RBMKDials.getBoilerHeatConsumption(worldObj); + } + + fillFluidInit(steam.getTankType()); + } + + super.updateEntity(); + } + + public static double getConversionHeat(FluidType type) { + return getConversion(type).temperature; + } + + public static FluidType getConversion(FluidType type) { + if(type == Fluids.MUG) return Fluids.MUG_HOT; + if(type == Fluids.COOLANT) return Fluids.COOLANT_HOT; + return Fluids.NONE; + } + + @Override + public void fillFluidInit(FluidType type) { + + fillFluid(this.xCoord, this.yCoord + RBMKDials.getColumnHeight(worldObj) + 1, this.zCoord, getTact(), type); + + if(worldObj.getBlock(xCoord, yCoord - 1, zCoord) == ModBlocks.rbmk_loader) { + + fillFluid(this.xCoord + 1, this.yCoord - 1, this.zCoord, getTact(), type); + fillFluid(this.xCoord - 1, this.yCoord - 1, this.zCoord, getTact(), type); + fillFluid(this.xCoord, this.yCoord - 1, this.zCoord + 1, getTact(), type); + fillFluid(this.xCoord, this.yCoord - 1, this.zCoord - 1, getTact(), type); + fillFluid(this.xCoord, this.yCoord - 2, this.zCoord, getTact(), type); + } + + if(worldObj.getBlock(xCoord, yCoord - 2, zCoord) == ModBlocks.rbmk_loader) { + + fillFluid(this.xCoord + 1, this.yCoord - 2, this.zCoord, getTact(), type); + fillFluid(this.xCoord - 1, this.yCoord - 2, this.zCoord, getTact(), type); + fillFluid(this.xCoord, this.yCoord - 2, this.zCoord + 1, getTact(), type); + fillFluid(this.xCoord, this.yCoord - 2, this.zCoord - 1, getTact(), type); + fillFluid(this.xCoord, this.yCoord - 1, this.zCoord, getTact(), type); + fillFluid(this.xCoord, this.yCoord - 3, this.zCoord, 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 //why are we still doing this? + public boolean getTact() { return worldObj.getTotalWorldTime() % 2 == 0; } + + @Override + public void setFluidFill(int i, FluidType type) { + + if(type == feed.getTankType()) + feed.setFill(i); + else if(type == steam.getTankType()) + steam.setFill(i); + } + + @Override + public int getFluidFill(FluidType type) { + + if(type == feed.getTankType()) + return feed.getFill(); + else if(type == steam.getTankType()) + return steam.getFill(); + + return 0; + } + + @Override + public int getMaxFluidFill(FluidType type) { + + if(type == feed.getTankType()) + return feed.getMaxFill(); + else if(type == steam.getTankType()) + return steam.getMaxFill(); + + return 0; + } + + @Override + public void setFillForSync(int fill, int index) { + + if(index == 0) + feed.setFill(fill); + else if(index == 1) + steam.setFill(fill); + } + + @Override + public void setTypeForSync(FluidType type, int index) { + + if(index == 0) + feed.setTankType(type); + else if(index == 1) + steam.setTankType(type); + } + + @Override + public List getFluidList(FluidType type) { + return list; + } + + @Override + public void clearFluidList(FluidType type) { + list.clear(); + } +} 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 05dd8300a..cb91c1deb 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKInlet.java @@ -1,7 +1,5 @@ package com.hbm.tileentity.machine.rbmk; -import java.util.List; - import com.hbm.blocks.machine.rbmk.RBMKBase; import com.hbm.interfaces.IFluidAcceptor; import com.hbm.inventory.FluidTank; @@ -12,7 +10,6 @@ import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -import scala.actors.threadpool.Arrays; public class TileEntityRBMKInlet extends TileEntity implements IFluidAcceptor { diff --git a/src/main/resources/assets/hbm/textures/blocks/rbmk/rbmk_heater.png b/src/main/resources/assets/hbm/textures/blocks/rbmk/rbmk_heater.png new file mode 100644 index 0000000000000000000000000000000000000000..24de896b97fd160502c3d412bb0770633d775721 GIT binary patch literal 1043 zcmV+u1nm2XP)F`$`rXEEf!MtOlbjSvoZk4h}k%F4^veE}aTp zJA1o5W5@mlfo_F^E`?_3c0&i#a)B0n3HPd@b+F~*j4kO^2SxAMPI8GG-2*Q|uk=38 z_kDhTMZe!KSQ6j&xlLxX*|oi+qa$(afqRGpu(Pv+=Xofl?1wzhna}6sd5%&Fr4&L4 zj4|YSjxmNfjvr$C9RSbs@H~%4fBgtR&pWgy|&V_2=K(kBh~E#bSY!5&)$X zhm&8?lp%UwzT8)&@B0)*L2z|zV+_Z~$DEv;FdPm6*xue|e}A7m&q*eU^+X-w0AyKa z6&FQ8x7+2bd_XgKMNZv$TN1i%8VH3!l(1+a?4Fr=Bh;^4cV0eJcBDO&55P}K!M z0yYFt#yt$f6*o^O30iA}5CpA&W-GvPoLT@lK&fo;F3ZC(BzPO}^4Zg}8YT()jV6jB zlE2G$&-3a7;CUX&Kc!-&6k!4nrl9!DD00<#)90wr;yVE`-+4z3G+NhN{Q>bxUP#3 z*ORz1oMoBi1E;5_Wf+=G0H)LFMmZp7vl(fca&~rRZ(SMkec$$dD9LMtg@_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/rbmk_heatex.png b/src/main/resources/assets/hbm/textures/blocks/rbmk_heatex.png new file mode 100644 index 0000000000000000000000000000000000000000..469170a26cd5d5c91beb14bbf73c5fb23344ea3e GIT binary patch literal 701 zcmV;u0z&J4grw66p;eQKbRZ=2Tuhr-i+A_nopaAQ z_g*cN$tZy3{tEjghiu;{hGFo(nh(C=mK@gO;{bF4*tU&#uuHw>F?4x|rSddH?bFDr z!=rO=kVlfbDM=&}l*?thZujmY8x{6z9soT(J**{jq>E!6lB&bg#CwD=;0Pk7 z$bN~IU!GF+nn%QxY+gyD>w3Fsx){oQeEu!n-Q5Tw&~=@Gja48d(lVKh8XO!%2!RlS zt*xy#!QWZ-h(^zyS0Vos-93CFhYPE>RAsCi3GP=1tMONh$fLol02yp5w%%#CRsIK0iXli{dMzH z>Xu~@F(p?Ye&EuB7kD)f*L6FVqBi$xsg8nw%d#vYnry%8H4j(02qDh=)d5z`mr!-u zVOf@iG$q?Bv*eejLIT(ApsEf}`rmaF^!E1h%-(2+Xjv9{Qn;>*t6bdQF6DBWSS$ur zhqYvmMnmBHe#e5QX*|F1kBeApg-L0ot+)-8+&kg jcD#-g%C4I-!~lN)zmEa*-1#;@00000NkvXXu0mjfmoPcS literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/fluids/coolant_hot.png b/src/main/resources/assets/hbm/textures/gui/fluids/coolant_hot.png new file mode 100644 index 0000000000000000000000000000000000000000..adc90eca6a9f4502590c4c7f273c6feeea331ce0 GIT binary patch literal 675 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 W>VGgo9SEJ+1A~($x@FqV;r|6tl_oL( literal 6015 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%0A}5f{#_Z`mHtSKJzjSL90BS6e&h ztr$BaTPSoBMovJ!t6Lr&8`MTHNxV`2>5fH7NU5+h=G*_V&}@J?oz+Dh8clUj5*$Xt z27&v=CWvaJM;kt&85!N9XQ;0g7UZ0}-xkZ4eXKf;+QVTBXH2o+|6U+N5e#epkA)|u zvj^xjvBzs|`kTF+dzkke>Q5(TYL{&XE(He%ch&e6*A^I0rsH2;y8hKRFisK1st{RM zr|H&P@zHmNQ7`GV>AE$CUKsQ+{6@N`r)O&9&Rz=#sEYPhTtXzUVyKE+_4NRWM51Tn z?}7-yh>ixcBU$0$3vR{9LI9QbPsOF)D5%BJ%dNiE_{o_UopC9)xLI6^(1IGI0+UaL z1<__|O`Je9o(qSOF}lWiA=cI+RyEaaRtDRQTN6&5a9}J|4tWR#yJ#%sV9u=aJ+X$-TI0tb`I(CrO)PjhXBBb}!c~ zv(4=X65mf!1F(}#U~V~@v%8sU_!5orP1b* diff --git a/src/main/resources/assets/hbm/textures/gui/reactors/gui_rbmk_heater.png b/src/main/resources/assets/hbm/textures/gui/reactors/gui_rbmk_heater.png new file mode 100644 index 0000000000000000000000000000000000000000..ae0e085b6bf90d89d10b1547ea58be618e02859e GIT binary patch literal 3760 zcmcgvcT`hZw?7FWAR_@$P?3O&pnw5IKx!gSkzRZtU9b$&K>^VOLq-K`0|H_YAwlU< zrAiGSbr3Mpf>NbO=q-d2Ncb-J<~cL#t@Ykt@2+)obM8KS@89m{J~lVKuxsamodAGc z2KwhN0sw>l!T{e6=;3fH-35AZ`{^23@Sw{7k=zt3&txhJ_nC z*8>j9zgLjWkm%J9_!nyLt>bTYo_^Bx@^q6-=pNzNn2J+Y6RA&8`L4cVj{X+LJ$3uw z2FK3`bm$uEE1~qhTt4mmAMnE&yS#t*G*T&kte|f3Vr^1aT`f>gIdHZmArq%Z-{cZ; z)1tRL8)o!TSF8*N)A_~)k2C61jEEYnx#cEVvaw1qts#=lqQnS@p`=-QguI4^2D!zM z>XsJcj+3>uwQorDxI&wa@l%Zvl0^8jjjYo|_ozJEgg!ymddq1#A`x_>U)Fvd9Ov&% z&-Uj3c9Sm!>8jC{9B64&;s{Gh`cMj!c8@+bksl z00;GebFGqnutC`!+xC|%9L!}((SUr+g;H;S)B7b=Qo)?^Xwk;9}9swXs7>H`znNJK24Smsc-G7Rf zojfS0s+0q_adCCkw@0rgwXcY&_y$`HR#MU_1FIwwb}}P*@PKOKIrz7_$07z5o>#*U zy0K9OY|3Vs^hDoiL=V27$x$z1s7GeiErVk3{bb|@>YNAc^AF8;n!b@vsUx& z``ndjt+|LFW~rCw%a&LiMS`fMK0j*qT?JyZN)Tsp@m7br{eJYxlWqQ0c`hz4OAK5` z7XrUOcFR z=Qx(9)>{^iEV~H0c_lvF6=I4v^+$Wa6Co*nettdWfw?O-r4GwgpRS)8fGZN4;}R0O z!X-2{R4+eSj_BDevoPx`s(q*%D>dFpKetjK1KKAFckuFBp@=c2X_bwT-j_sTWp3R#VmHGCB^HZwZtlPg9zo>3qRd5x6|FL_g)Lo4 z7aFhoA+^Q3G+3v4Cle-~I_%eWU{>;Ti*VnI&^qXj>_yAc!uG-wAhnXMS11Yx3u&h8wXfMZ>=;u07P#Fu~E7M1QKO+`uTZedwEYzZ*Q!f*O zw6HelS3U<7iui!OC{J}wjc!+~9LIzC;K74|myS^-0zRmPfU6b4-8E;FaK-Mz!2?(M zV(IA4k`!;k!C39gu##L77oVTNNf>B)3-;~XH(&fMs-iidJJ-otCc3S!FFtVN^4vb1 z$va2FLx!9-Tn?%A2)Hgywk{tC4ZDrCh9{3%AKuoD@$t!3_39awpirq)5BjHss7s3U znXd&G+9zvNiEAxKs~k{bZWT@k1xDTsAY-iav3Vbo9jKF5Pd2sJo6D#(9!iZ|jE#cE zOyuU*h~Q%e1H)?eoAOCvDG>+AJW@c)b`NNuM1S;D&9szD(Z(&`QCp1lSiy6Y*$D@H zNWE^a)qb_=dC@gC!?r7wv;_ z&kKa;LXo*S1AC#G%}G~7mzks}5(CmL?qQc{_IG&4>yoDf@AFZPa%H!#T6<|s7mEWBS+b4(M{WYg{uwQ?ISL4UTt*@nt3M%to0C6)zh|niO7d#H5h=&KL)%9s~nk?o7j6Z zDH?8G20on&dhr6a!5yZuV~_6x!gUK!c-R88O?^M&Yb=KE&{DW;JE@naJ#m`l_&~|^JReQ zEi`b4Im>&%rP4{8OA{SlR81Y7oXE(?bL%j30bp+{0?slwq6+V=FIO+nspMQ1=hY2T z+x&dq;#!3cd#U4Z`x>CeRgr5((z0a+t_4+1&V`1Bsi>;T9ACo&NPk|m3QS5Rhfbt< z52dB1zN^a3p2jV;UC10W$(JOYJpnwgnSh5GbSjsW{~3C3QOL9GYO)39lCY z9kIJRGJ{S|NMIJTI9Sdl6BCn(@wTLam9eT|gUe`wxSIFrUkJB3Uz{1KS*kuC<+`IS zP~sbu;@4UUMF4#flfmQ)%y#$20Hh`qGAvBr24$Ygs?@M3;I zDf~!buAoI_q@u>RUtKo=++B>4kuGbeuC}BL0Sm+D4Gaq<0c2T>3hZ+hi9+k_?2M}< zBxVOku|YZyAv=p7Qi?x9rcRAEMGxq%gke4po0a{^B9uy^ka|L#=K2VcmOmmP50~=P zrj+vk5lkd+Vj*19KGTB~r}DtL7#JT5`PUo|CUeUMJZPO<^DA{oUf6QlQ798TKS*M}U^(d{t$riA z{}s9k-mUOLtWbKP-X8`~u4@L)xBm2e)%*|$6C|$sq`{7zVJGx5^d2jjlNG-p= zqC6avpC*YZ(Cn{KSj7(K@O&s*O(|aTiiDervQ}Vm_e@1A#32_;uftkeTE=^dJhCf? zRO>DanETz&qharv`Xl7w-&$TNn^xi-iU7hrMq%^J-XTN|6_;Sx`m8{Q8|BLS1O z_=d5no`f{z;Sx0RL{ta&qK0d!`_Jy?Cnz-*JPIc(#|;TppE5Es@<3iYbOiO7%w1MPto$qIR*--@~~Kiz(J78`drHf`qaYRu@ukkJ20_TLY^KUDw51`UmkF;w~y z3LirWG5sRSveb9zzI3)*1?Ga(*!wG_o^T8_lcS{*Gy)9m*lN#I+k_w8%_4_|V-|)E z{sjI%3IB^-|0Iv|)oIbF4^}__x3D)ygcvqxgv4*dwd#NO$v=7j;j+Jye_-QX;GgE> z{_-dslTdr;Cq#vLX(`9wUNwf^buWh}`Hk;vfgsd2O|1Iz{jYKPs}f=GGi+sWFa4*e#LU?KV1K~~*yXNBwp0NlR$(KCPV#Alwt9Dhmd>iC3LGa|$r zqx^ZXY^Tj;8tzj!bT)lf-g@t7j~y1bZ+hmB&hC~`KkzQcf$P^!6@6g9g}FR9ev;^% z_$9Bbj1X^>1@PrO*kKtncXsr3U9HlokK7m>zr#cy)4Bk_+ZuX<6Op~)ja*e(AOJ_- zt%?^bG;3$`yFdSUXU|7hzRs<*xU`=3olozuX0gD7@%qKxmCXeUS!?#g2%U{!X=c&O z8HuN5YzXcT(tN%+M3yBEk!9t|bwB;Eva+CR#HC}JVAKMBzzp@nG;+D3BpuC zf-qI!h_2b)08I5QW?k7T#jgV0DZ-NSwul-tJ|A#Z%^ARp5{(lVSQY$-9kSt%eXH6(Cha*s^ew;n>g|WQ)v33{i zjSc^L?M*Fp7y!VE&ag5e5X!&FLVtO4g0qX?E%;y9O*QjEC`S~sV zHg9n(LBf(<8U3dZUDp=%yWpJ7XCZ6Nr~%TGQeTgw;RiU-c(?TDf6|%{yKU7S`ZJw5 zPnB$sU_U_%lT$WFH*7!BK7Mk<(x=q{lSdaF$RBkF*vuxKsrSabITKU&$4+g&y5_=5 zhjqh8Jnfg%c-+yn9Po3iDa|4VjhagoSOguW7>OP=!V~$$9LiS7PBsnJoxcw{&v8Hme%IK)wVUA zP&;7*D}wVKdGPMJ0|(Gx9Q!vwBQ_~-|JG1;E@KT-c$@$t3WrkYLwA^@BKL7cB5r*cj{lZOWG>Hyax*SCmuiDD9VETiEMr@>a)K5`N^ zZC_<~=K16(_A`<4gk37l&4bM@I3A3&;!btduHM!8P4<@nrb0071n~YDc%N}gPrn0W3L1V03R$Y6 zK+o(}DoB(T>DD`H(fgopD(7g=fD<-33tR|A$?+6u?W}i*5Be6VE-H9=dQK410Du>j z_q}6V@@6y=7c1goc7AAREtzW$`{3Q`W3>^lzP4QYo+xI?4iOU}Q!M-haCO-0jP{EF z0KPJEvm&r~nw<(@=OwE4Pl|FtZ8Vhnpl=eV-qzUfy5`PVq!jLbgc&1`&Udfc*5u_ph{DJpg@vV7|CLD64N%l^J`&U$`zyeqLnQa zq{x>QuLvv*%X%zMHzO zRu4Z~va0Y3-mV~n^+J9SR%jonM(HUH=sd+Jb-O4%z4L;L#Wz+!9!P@G--Vr?i zvvlQgG0o#E$e;c$ovhumJ#|ucPwJ9|rWd*Q%EM zVud&?U+Tw;rkyt1prx;|u}k}pOD+0$yB^WMRc=}|Wd{%Rs=i*Ql{D#{JzaU(cz zxJIoOL-&B;c5TPt8DI5%n{}ne#Qe|?0ANC$Vf4XgyuH;@*SGpgnwZL`LgZN+0_v3) zN6_MJ&U=kF{&-2Y@!2N=sRSmP2m}IwKp+qZ1OkCTAP@)y!v6#R1;IcPysDLm5&!@I M07*qoM6N<$f~Uxt;s5{u literal 0 HcmV?d00001