From 4f8c102b68b3e92def0124c0076a51e3c94d4a10 Mon Sep 17 00:00:00 2001 From: George Paton Date: Tue, 20 May 2025 14:21:56 +1000 Subject: [PATCH 1/5] All dupes fixed and _verified_ --- .../java/com/hbm/config/ServerConfig.java | 2 +- .../container/ContainerCrateBase.java | 11 ++-- .../container/ContainerDroneRequester.java | 20 +++--- .../items/block/ItemBlockStorageCrate.java | 63 +++++++++---------- .../java/com/hbm/items/tool/ItemToolBox.java | 12 +++- 5 files changed, 54 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/hbm/config/ServerConfig.java b/src/main/java/com/hbm/config/ServerConfig.java index ef358cedf..43dfc36ae 100644 --- a/src/main/java/com/hbm/config/ServerConfig.java +++ b/src/main/java/com/hbm/config/ServerConfig.java @@ -17,7 +17,7 @@ public class ServerConfig extends RunningConfig { public static ConfigWrapper MINE_NUKE_DAMAGE = new ConfigWrapper(100F); public static ConfigWrapper MINE_NAVAL_DAMAGE = new ConfigWrapper(60F); public static ConfigWrapper TAINT_TRAILS = new ConfigWrapper(false); - public static ConfigWrapper CRATE_ALLOW_OPEN_HELD = new ConfigWrapper(false); + public static ConfigWrapper CRATE_ALLOW_OPEN_HELD = new ConfigWrapper(true); public static ConfigWrapper CRATE_KEEP_CONTENTS = new ConfigWrapper(true); public static ConfigWrapper ITEM_HAZARD_DROP_TICKRATE = new ConfigWrapper(2); diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java b/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java index 134032bae..ec6309430 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java @@ -10,14 +10,11 @@ import net.minecraft.tileentity.TileEntity; public class ContainerCrateBase extends ContainerBase { - //just there so prev stuff doesnt break - protected IInventory crate = tile; - public ContainerCrateBase(InventoryPlayer invPlayer, IInventory tedf) { super(invPlayer, tedf); tile.openInventory(); } - + @Override public void playerInv(InventoryPlayer invPlayer, int playerInvX, int playerInvY, int playerHotbarY) { for(int i = 0; i < 3; i++) { @@ -35,7 +32,7 @@ public class ContainerCrateBase extends ContainerBase { public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { // prevents the player from moving around the currently open box if(player.inventory.getStackInSlot(player.inventory.currentItem) != null && - player.inventory.getStackInSlot(player.inventory.currentItem).getItem() instanceof ItemBlockStorageCrate && !(this.crate instanceof TileEntity)) { + player.inventory.getStackInSlot(player.inventory.currentItem).getItem() instanceof ItemBlockStorageCrate && !(this.tile instanceof TileEntity)) { if (mode == 2 && button == player.inventory.currentItem) { return null; } @@ -51,7 +48,7 @@ public class ContainerCrateBase extends ContainerBase { super.onContainerClosed(p_75134_1_); tile.closeInventory(); } - + public class SlotPlayerCrate extends SlotNonRetarded { public SlotPlayerCrate(IInventory inventory, int id, int x, int y) { @@ -66,7 +63,7 @@ public class ContainerCrateBase extends ContainerBase { public boolean canTakeStack(EntityPlayer player) { if(player.inventory.currentItem == this.getSlotIndex() && // If this slot is the current held slot. this.getStack() != null && this.getStack().getItem() instanceof ItemBlockStorageCrate && // If the slot contains a storage crate. - player.openContainer instanceof ContainerCrateBase && !(ContainerCrateBase.this.crate instanceof TileEntity)) // If the player is currently inside a crate container. + player.openContainer instanceof ContainerCrateBase && !(ContainerCrateBase.this.tile instanceof TileEntity)) // If the player is currently inside a crate container. return false; return super.canTakeStack(player); } diff --git a/src/main/java/com/hbm/inventory/container/ContainerDroneRequester.java b/src/main/java/com/hbm/inventory/container/ContainerDroneRequester.java index 7d1a6775d..bdc788c44 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerDroneRequester.java +++ b/src/main/java/com/hbm/inventory/container/ContainerDroneRequester.java @@ -39,11 +39,11 @@ public class ContainerDroneRequester extends ContainerCrateBase { if(par2 < 9) return null; //ignore filters - if(par2 <= crate.getSizeInventory() - 1) { - if(!this.mergeItemStack(var5, crate.getSizeInventory(), this.inventorySlots.size(), true)) { + if(par2 <= tile.getSizeInventory() - 1) { + if(!this.mergeItemStack(var5, tile.getSizeInventory(), this.inventorySlots.size(), true)) { return null; } - } else if(!this.mergeItemStack(var5, 9, crate.getSizeInventory(), false)) { + } else if(!this.mergeItemStack(var5, 9, tile.getSizeInventory(), false)) { return null; } @@ -75,25 +75,25 @@ public class ContainerDroneRequester extends ContainerCrateBase { ItemStack ret = null; ItemStack held = player.inventory.getItemStack(); - TileEntityDroneRequester requester = (TileEntityDroneRequester) crate; - + TileEntityDroneRequester requester = (TileEntityDroneRequester) tile; + if(slot.getHasStack()) ret = slot.getStack().copy(); - + if(button == 1 && mode == 0 && slot.getHasStack()) { requester.nextMode(index); return ret; - + } else { slot.putStack(held != null ? held.copy() : null); - + if(slot.getHasStack()) { slot.getStack().stackSize = 1; } - + slot.onSlotChanged(); requester.matcher.initPatternStandard(requester.getWorldObj(), slot.getStack(), index); - + return ret; } } diff --git a/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java b/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java index bed6685d1..94d61c10f 100644 --- a/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java +++ b/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java @@ -28,21 +28,27 @@ public class ItemBlockStorageCrate extends ItemBlockBase implements IGUIProvider super(block); } + // IF WE PUT ROCKS IN THE SHAPE OF A RUNWAY GOD WILL GIVE US HIGH-FRUCTOSE CORN SYRUP + @Override + public int getMaxItemUseDuration(ItemStack stack) { + return 1; + } + @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { if(!ServerConfig.CRATE_ALLOW_OPEN_HELD.get()) return stack; - + Block block = Block.getBlockFromItem(player.getHeldItem().getItem()); if(block == ModBlocks.mass_storage) return stack; // Genuinely can't figure out how to make this part work, so I'm just not gonna mess with it. if(!world.isRemote && stack.stackSize == 1) { - if (stack.stackTagCompound != null && stack.stackTagCompound.hasKey("lock")) { - for (ItemStack item : player.inventory.mainInventory) { - + if(stack.stackTagCompound != null && stack.stackTagCompound.hasKey("lock")) { + for(ItemStack item : player.inventory.mainInventory) { + if(item == null) continue; // Skip if no item. if(!(item.getItem() instanceof ItemKey)) continue; // Skip if item isn't a key. if(item.stackTagCompound == null) continue; // Skip if there is no NBT (wouldn't open it anyway). - if (item.stackTagCompound.getInteger("pins") == stack.stackTagCompound.getInteger("lock")) { // Check if pins are equal (if it can open it) + if(item.stackTagCompound.getInteger("pins") == stack.stackTagCompound.getInteger("lock")) { // Check if pins are equal (if it can open it) TileEntityCrateBase.spawnSpiders(player, world, stack); player.openGui(MainRegistry.instance, 0, world, 0, 0, 0); break; @@ -83,20 +89,16 @@ public class ItemBlockStorageCrate extends ItemBlockBase implements IGUIProvider } public static class InventoryCrate extends ItemInventory { - - public int heldIndex; - - public InventoryCrate(EntityPlayer player, ItemStack crate) { + public InventoryCrate(EntityPlayer player, ItemStack crate) { this.player = player; this.target = crate; - this.heldIndex = player.inventory.currentItem; - + this.slots = new ItemStack[this.getSizeInventory()]; if(target.stackTagCompound == null) { target.stackTagCompound = new NBTTagCompound(); } - + for(int i = 0; i < slots.length; i++) this.slots[i] = ItemStack.loadItemStackFromNBT(target.stackTagCompound.getCompoundTag("slot" + i)); } @@ -129,42 +131,35 @@ public class ItemBlockStorageCrate extends ItemBlockBase implements IGUIProvider } @Override - public void markDirty() { // I HATE THIS SO MUCH - NBTTagCompound nbt = new NBTTagCompound(); + public void markDirty() { // You have been blessed by the unfuck + + // Preserve existing NBT so we keep lock data and piders + NBTTagCompound nbt = target.stackTagCompound != null ? target.stackTagCompound : new NBTTagCompound(); int invSize = this.getSizeInventory(); for(int i = 0; i < invSize; i++) { ItemStack stack = this.getStackInSlot(i); - if(stack == null) continue; + if(stack == null) { + nbt.removeTag("slot" + i); + continue; + } NBTTagCompound slot = new NBTTagCompound(); stack.writeToNBT(slot); nbt.setTag("slot" + i, slot); } - /*if(target.stackTagCompound != null) { // yes it's a bit jank, but it wants to clear otherwise so... - if(target.stackTagCompound.hasKey("lock")) nbt.setInteger("lock", target.stackTagCompound.getInteger("lock")); - if(target.stackTagCompound.hasKey("lockMod")) nbt.setDouble("lockMod", target.stackTagCompound.getDouble("lockMod")); - if(target.stackTagCompound.hasKey("spiders")) nbt.setBoolean("spiders", target.stackTagCompound.getBoolean("spiders")); // fuck you!! - }*/ - - // i have completely given up - if(player.getHeldItem() != null && player.getHeldItem().getItem() == this.target.getItem() && player.inventory.currentItem == this.heldIndex) { - player.getHeldItem().setTagCompound(nbt); - } + target.setTagCompound(nbt); } - + @Override public void closeInventory() { - player.worldObj.playSoundEffect(player.posX, player.posY, player.posZ, "hbm:block.crateClose", 1.0F, 0.8F); - - /* - * realistically, we only need one NBT size check (and we only *want* one because CompressedStreamTools is expensive) so we do that part only when closing - */ - if(player.getHeldItem() != null && player.getHeldItem().getItem() == this.target.getItem() && player.inventory.currentItem == this.heldIndex) { - player.getHeldItem().setTagCompound(checkNBT(player.getHeldItem().getTagCompound())); - } + super.closeInventory(); + + // Check for 6kb item vomit + target.setTagCompound(checkNBT(target.getTagCompound())); + player.inventoryContainer.detectAndSendChanges(); } } } diff --git a/src/main/java/com/hbm/items/tool/ItemToolBox.java b/src/main/java/com/hbm/items/tool/ItemToolBox.java index 9739a6d26..9707e09d7 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolBox.java +++ b/src/main/java/com/hbm/items/tool/ItemToolBox.java @@ -10,6 +10,7 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.util.ItemStackUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -35,6 +36,11 @@ public class ItemToolBox extends Item implements IGUIProvider { this.setMaxStackSize(1); } + @Override + public int getMaxItemUseDuration(ItemStack stack) { + return 1; + } + @Override @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister iconRegister) { @@ -285,9 +291,11 @@ public class ItemToolBox extends Item implements IGUIProvider { @Override public void closeInventory() { - this.target.getTagCompound().removeTag("isOpen"); - this.player.inventory.setInventorySlotContents(this.player.inventory.currentItem, this.target); super.closeInventory(); + + this.target.getTagCompound().removeTag("isOpen"); + this.target.getTagCompound().setInteger("rand", player.worldObj.rand.nextInt()); // a boolean changing isn't sufficient to detect the change + player.inventoryContainer.detectAndSendChanges(); } @Override From 4baf5e7c676cce5b19a4fd38aea38ddae0423ac3 Mon Sep 17 00:00:00 2001 From: George Paton Date: Tue, 20 May 2025 14:26:14 +1000 Subject: [PATCH 2/5] don't open conveyor sorter GUI when placing conveyors --- src/main/java/com/hbm/blocks/network/CraneRouter.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/blocks/network/CraneRouter.java b/src/main/java/com/hbm/blocks/network/CraneRouter.java index d6f663817..af4db88bb 100644 --- a/src/main/java/com/hbm/blocks/network/CraneRouter.java +++ b/src/main/java/com/hbm/blocks/network/CraneRouter.java @@ -7,6 +7,7 @@ import api.hbm.conveyor.IEnterableBlock; import com.hbm.blocks.IBlockMultiPass; import com.hbm.blocks.ITooltipProvider; import com.hbm.entity.item.EntityMovingItem; +import com.hbm.items.tool.ItemConveyorWand; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.module.ModulePatternMatcher; @@ -61,7 +62,9 @@ public class CraneRouter extends BlockContainer implements IBlockMultiPass, IEnt @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) { + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemConveyorWand) { + return false; + } else if(world.isRemote) { return true; } else if(!player.isSneaking()) { FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); From a8829245f4b39934a020f65569213defe3cfbb91 Mon Sep 17 00:00:00 2001 From: Justnightheron Date: Tue, 20 May 2025 14:08:40 +0800 Subject: [PATCH 3/5] juice --- src/main/resources/assets/hbm/lang/zh_CN.lang | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index 3232fb3c9..64eea3277 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -6060,8 +6060,11 @@ item.ammo_standard.ct_mortar_charge.name=重型炸药包 item.gun_charge_thrower.name=炸药投掷器 tile.sandbags.name=沙袋 tile.wood_barrier.name=木制围栏 -item.ammo_standard.nuke_balefire.name=Mini Nuke, Balefire Egg +item.ammo_standard.nuke_balefire.name=迷你野火炸弹 item.gun_minigun_dual.name=双联转管机枪 tile.wood_structure.ceiling.name=木质顶棚 -tile.wood_structure.roof.name=木质顶板 +tile.wood_structure.roof.name=木质地板 tile.wood_structure.scaffold.name=木质脚手架 +item.gun_amat.name=反器材步枪 +tile.fluid_pump.name=流量控制泵 +tile.vine_phosphor.large.name=磷藤蔓 From ce8099d4aa3d5f1b7f27a8f5995c981f853b1f9d Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 20 May 2025 15:55:27 +0200 Subject: [PATCH 4/5] the sloplands --- changelog | 15 +++---- .../java/com/hbm/config/ServerConfig.java | 4 +- .../java/com/hbm/inventory/fluid/Fluids.java | 2 +- .../items/block/ItemBlockStorageCrate.java | 2 +- .../java/com/hbm/items/tool/ItemToolBox.java | 1 - .../bomb/TileEntityCrashedBomb.java | 39 ++++++++++++++++-- .../machine/TileEntityMachineArcWelder.java | 11 ++++- .../TileEntityMachineSolderingStation.java | 11 ++++- .../textures/gui/processing/gui_chemplant.png | Bin 0 -> 3769 bytes 9 files changed, 65 insertions(+), 20 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/gui/processing/gui_chemplant.png diff --git a/changelog b/changelog index 03770a9c0..878ed0d32 100644 --- a/changelog +++ b/changelog @@ -1,10 +1,11 @@ ## Changed -* All compound plates can now also be made in the assembler -* Opening crates when held is now disabled by default +* Updated chinese localiation +* Duds now have a radioactive AoE effect around them based on type +* HPS is no longer tagged as radioactive and no longer requires hazardous materials tanks to store + * Somehow, these meaningless tags triggered people exceptionally hard. Go annoy someone else. +* Solderers and arc welders can now use overdrive upgrades + * Do note that processing speed rises linearly, but power draw rises exponentially ## Fixed -* Fixed all dud variants having the balefire explosion effect -* Fixed demolition charges being able to explode multiple times when hitting entities -* Condensers are no longer affected by post-impact effects, fixing an issue where HP condenser tanks would go into the negatives -* Probably fixed particle accelerator recipe config not working -* Fixed potential dupe bug involving many held inventories \ No newline at end of file +* Crates? Maybe? +* Fixed conveyor placer not being usable on the conveyor sorter \ No newline at end of file diff --git a/src/main/java/com/hbm/config/ServerConfig.java b/src/main/java/com/hbm/config/ServerConfig.java index 43dfc36ae..0ca1ccdcf 100644 --- a/src/main/java/com/hbm/config/ServerConfig.java +++ b/src/main/java/com/hbm/config/ServerConfig.java @@ -17,7 +17,7 @@ public class ServerConfig extends RunningConfig { public static ConfigWrapper MINE_NUKE_DAMAGE = new ConfigWrapper(100F); public static ConfigWrapper MINE_NAVAL_DAMAGE = new ConfigWrapper(60F); public static ConfigWrapper TAINT_TRAILS = new ConfigWrapper(false); - public static ConfigWrapper CRATE_ALLOW_OPEN_HELD = new ConfigWrapper(true); + public static ConfigWrapper CRATE_OPEN_HELD = new ConfigWrapper(true); public static ConfigWrapper CRATE_KEEP_CONTENTS = new ConfigWrapper(true); public static ConfigWrapper ITEM_HAZARD_DROP_TICKRATE = new ConfigWrapper(2); @@ -29,7 +29,7 @@ public class ServerConfig extends RunningConfig { configMap.put("MINE_NUKE_DAMAGE", MINE_NUKE_DAMAGE); configMap.put("MINE_NAVAL_DAMAGE", MINE_NAVAL_DAMAGE); configMap.put("TAINT_TRAILS", TAINT_TRAILS); - configMap.put("CRATE_ALLOW_OPEN_HELD", CRATE_ALLOW_OPEN_HELD); + configMap.put("CRATE_OPEN_HELD", CRATE_OPEN_HELD); configMap.put("CRATE_KEEP_CONTENTS", CRATE_KEEP_CONTENTS); configMap.put("ITEM_HAZARD_DROP_TICKRATE", ITEM_HAZARD_DROP_TICKRATE); } diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index d4c52f1cb..64a23a86b 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -336,7 +336,7 @@ public class Fluids { BLOOD_HOT = new FluidType("BLOOD_HOT", 0xF22419, 3, 0, 0, EnumSymbol.NONE).addTraits(LIQUID, VISCOUS).setTemp(666); //it's funny because it's the satan number SYNGAS = new FluidType("SYNGAS", 0x131313, 1, 4, 2, EnumSymbol.NONE).addContainers(new CD_Gastank(0xFFFFFF, 0x131313)).addTraits(GASEOUS); OXYHYDROGEN = new FluidType("OXYHYDROGEN", 0x483FC1, 0, 4, 2, EnumSymbol.NONE).addTraits(GASEOUS); - RADIOSOLVENT = new FluidType("RADIOSOLVENT", 0xA4D7DD, 3, 3, 0, EnumSymbol.NONE).addTraits(LIQUID, LEADCON, new FT_Corrosive(50), new FT_VentRadiation(0.01F)); + RADIOSOLVENT = new FluidType("RADIOSOLVENT", 0xA4D7DD, 3, 3, 0, EnumSymbol.NONE).addTraits(LIQUID, new FT_Corrosive(50)); CHLORINE = new FluidType("CHLORINE", 0xBAB572, 3, 0, 0, EnumSymbol.OXIDIZER).addContainers(new CD_Gastank(0xBAB572, 0x887B34)).addTraits(GASEOUS, new FT_Corrosive(25)); HEAVYOIL_VACUUM = new FluidType("HEAVYOIL_VACUUM", 0x131214, 2, 1, 0, EnumSymbol.NONE).addTraits(LIQUID, VISCOUS, P_OIL).addContainers(new CD_Canister(0x513F39)); REFORMATE = new FluidType("REFORMATE", 0x835472, 2, 2, 0, EnumSymbol.NONE).addTraits(LIQUID, VISCOUS, P_FUEL).addContainers(new CD_Canister(0xD180D6)); diff --git a/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java b/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java index 94d61c10f..cf24e36c3 100644 --- a/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java +++ b/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java @@ -36,7 +36,7 @@ public class ItemBlockStorageCrate extends ItemBlockBase implements IGUIProvider @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - if(!ServerConfig.CRATE_ALLOW_OPEN_HELD.get()) return stack; + if(!ServerConfig.CRATE_OPEN_HELD.get()) return stack; Block block = Block.getBlockFromItem(player.getHeldItem().getItem()); if(block == ModBlocks.mass_storage) return stack; // Genuinely can't figure out how to make this part work, so I'm just not gonna mess with it. diff --git a/src/main/java/com/hbm/items/tool/ItemToolBox.java b/src/main/java/com/hbm/items/tool/ItemToolBox.java index 9707e09d7..8be7104ea 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolBox.java +++ b/src/main/java/com/hbm/items/tool/ItemToolBox.java @@ -10,7 +10,6 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.util.ItemStackUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCrashedBomb.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCrashedBomb.java index cf70bb5f8..8e70048c8 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCrashedBomb.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCrashedBomb.java @@ -1,16 +1,47 @@ package com.hbm.tileentity.bomb; +import java.util.List; +import java.util.function.BiConsumer; + +import com.hbm.blocks.bomb.BlockCrashedBomb.EnumDudType; +import com.hbm.util.ContaminationUtil; +import com.hbm.util.EnumUtil; +import com.hbm.util.ContaminationUtil.ContaminationType; +import com.hbm.util.ContaminationUtil.HazardType; + import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; public class TileEntityCrashedBomb extends TileEntity { @Override - public AxisAlignedBB getRenderBoundingBox() { return TileEntity.INFINITE_EXTENT_AABB; } + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(worldObj.getTotalWorldTime() % 2 == 0) { + EnumDudType type = EnumUtil.grabEnumSafely(EnumDudType.class, this.getBlockMetadata()); + + if(type == type.BALEFIRE) affectEntities((entity, intensity) -> { ContaminationUtil.contaminate(entity, HazardType.RADIATION, ContaminationType.CREATIVE, 1F * intensity); }, 15D); + if(type == type.NUKE) affectEntities((entity, intensity) -> { ContaminationUtil.contaminate(entity, HazardType.RADIATION, ContaminationType.CREATIVE, 0.25F * intensity); }, 10D); + if(type == type.SALTED) affectEntities((entity, intensity) -> { ContaminationUtil.contaminate(entity, HazardType.RADIATION, ContaminationType.CREATIVE, 0.5F * intensity); }, 10D); + } + } + } - @Override - @SideOnly(Side.CLIENT) - public double getMaxRenderDistanceSquared() { return 65536.0D; } + public void affectEntities(BiConsumer effect, double range) { + List list = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5).expand(range, range, range)); + for(EntityLivingBase entity : list) { + double dist = Math.sqrt(getDistanceFrom(entity.posX, entity.posY + entity.height / 2, entity.posZ)); + if(dist > range) continue; + float intensity = (float) (1D - dist / range); + effect.accept(entity, intensity); + } + } + + @Override public AxisAlignedBB getRenderBoundingBox() { return TileEntity.INFINITE_EXTENT_AABB; } + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { return 65536.0D; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java index 605cd06db..aa9f9736f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java @@ -18,6 +18,7 @@ import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.tileentity.*; import com.hbm.packet.toclient.AuxParticlePacketNT; +import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; @@ -92,14 +93,16 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements upgradeManager.checkSlots(this, slots, 6, 7); int redLevel = upgradeManager.getLevel(UpgradeType.SPEED); int blueLevel = upgradeManager.getLevel(UpgradeType.POWER); + int blackLevel = upgradeManager.getLevel(UpgradeType.OVERDRIVE); if(recipe != null) { this.processTime = recipe.duration - (recipe.duration * redLevel / 6) + (recipe.duration * blueLevel / 3); this.consumption = recipe.consumption + (recipe.consumption * redLevel) - (recipe.consumption * blueLevel / 6); + this.consumption *= Math.pow(2, blackLevel); intendedMaxPower = recipe.consumption * 20; if(canProcess(recipe)) { - this.progress++; + this.progress += (1 + blackLevel); this.power -= this.consumption; if(progress >= processTime) { @@ -369,7 +372,7 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements @Override public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) { - return type == UpgradeType.SPEED || type == UpgradeType.POWER; + return type == UpgradeType.SPEED || type == UpgradeType.POWER || type == UpgradeType.OVERDRIVE; } @Override @@ -383,6 +386,9 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "-" + (level * 100 / 6) + "%")); info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_DELAY, "+" + (level * 100 / 3) + "%")); } + if(type == UpgradeType.OVERDRIVE) { + info.add((BobMathUtil.getBlink() ? EnumChatFormatting.RED : EnumChatFormatting.DARK_GRAY) + "YES"); + } } @Override @@ -390,6 +396,7 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements HashMap upgrades = new HashMap<>(); upgrades.put(UpgradeType.SPEED, 3); upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 3); return upgrades; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java index 995b449e9..5515a816d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java @@ -22,6 +22,7 @@ import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.DirPos; @@ -98,14 +99,16 @@ public class TileEntityMachineSolderingStation extends TileEntityMachineBase imp upgradeManager.checkSlots(this, slots, 9, 10); int redLevel = upgradeManager.getLevel(UpgradeType.SPEED); int blueLevel = upgradeManager.getLevel(UpgradeType.POWER); + int blackLevel = upgradeManager.getLevel(UpgradeType.OVERDRIVE); if(recipe != null) { this.processTime = recipe.duration - (recipe.duration * redLevel / 6) + (recipe.duration * blueLevel / 3); this.consumption = recipe.consumption + (recipe.consumption * redLevel) - (recipe.consumption * blueLevel / 6); + this.consumption *= Math.pow(2, blackLevel); intendedMaxPower = recipe.consumption * 20; if(canProcess(recipe)) { - this.progress++; + this.progress += (1 + blackLevel); this.power -= this.consumption; if(progress >= processTime) { @@ -360,7 +363,7 @@ public class TileEntityMachineSolderingStation extends TileEntityMachineBase imp @Override public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) { - return type == UpgradeType.SPEED || type == UpgradeType.POWER; + return type == UpgradeType.SPEED || type == UpgradeType.POWER || type == UpgradeType.OVERDRIVE; } @Override @@ -374,6 +377,9 @@ public class TileEntityMachineSolderingStation extends TileEntityMachineBase imp info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "-" + (level * 100 / 6) + "%")); info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_DELAY, "+" + (level * 100 / 3) + "%")); } + if(type == UpgradeType.OVERDRIVE) { + info.add((BobMathUtil.getBlink() ? EnumChatFormatting.RED : EnumChatFormatting.DARK_GRAY) + "YES"); + } } @Override @@ -381,6 +387,7 @@ public class TileEntityMachineSolderingStation extends TileEntityMachineBase imp HashMap upgrades = new HashMap<>(); upgrades.put(UpgradeType.SPEED, 3); upgrades.put(UpgradeType.POWER, 3); + upgrades.put(UpgradeType.OVERDRIVE, 3); return upgrades; } diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_chemplant.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_chemplant.png new file mode 100644 index 0000000000000000000000000000000000000000..8d24bb62fe9c7af4076f2a0b2cf7518dd3d57d97 GIT binary patch literal 3769 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 e_ Date: Tue, 20 May 2025 20:01:36 +0200 Subject: [PATCH 5/5] thank you doctor, no more nose blood --- changelog | 3 ++- gradle.properties | 2 +- .../inventory/material/MatDistribution.java | 2 +- src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../textures/gui/processing/gui_chemplant.png | Bin 3769 -> 4015 bytes 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/changelog b/changelog index 878ed0d32..4182f0d03 100644 --- a/changelog +++ b/changelog @@ -8,4 +8,5 @@ ## Fixed * Crates? Maybe? -* Fixed conveyor placer not being usable on the conveyor sorter \ No newline at end of file +* Fixed conveyor placer not being usable on the conveyor sorter +* Fixed crucible trying to autogen recipes for nonexistant nether thorium ore \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 66c0a2486..51b6e2cca 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5335 +mod_build_number=5336 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/inventory/material/MatDistribution.java b/src/main/java/com/hbm/inventory/material/MatDistribution.java index 1fd69c00c..6daea2e40 100644 --- a/src/main/java/com/hbm/inventory/material/MatDistribution.java +++ b/src/main/java/com/hbm/inventory/material/MatDistribution.java @@ -76,7 +76,7 @@ public class MatDistribution extends SerializableRecipe { registerOre(OreDictManager.COAL.ore(), MAT_CARBON, GEM.q(3), MAT_STONE, QUART.q(1)); registerOre(OreDictManager.GOLD.ore(), MAT_GOLD, INGOT.q(2), MAT_LEAD, NUGGET.q(3), MAT_STONE, QUART.q(1)); registerOre(OreDictManager.U.ore(), MAT_URANIUM, INGOT.q(2), MAT_LEAD, NUGGET.q(3), MAT_STONE, QUART.q(1)); - for(String ore : OreDictManager.TH232.all(MaterialShapes.ORE)) registerOre(ore, MAT_THORIUM, INGOT.q(2), MAT_URANIUM, NUGGET.q(3), MAT_STONE, QUART.q(1)); + for(String ore : OreDictManager.TH232.all(MaterialShapes.ONLY_ORE)) registerOre(ore, MAT_THORIUM, INGOT.q(2), MAT_URANIUM, NUGGET.q(3), MAT_STONE, QUART.q(1)); registerOre(OreDictManager.CU.ore(), MAT_COPPER, INGOT.q(2), MAT_STONE, QUART.q(1)); registerOre(OreDictManager.PB.ore(), MAT_LEAD, INGOT.q(2), MAT_GOLD, NUGGET.q(1), MAT_STONE, QUART.q(1)); registerOre(OreDictManager.BE.ore(), MAT_BERYLLIUM, INGOT.q(2), MAT_STONE, QUART.q(1)); diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 8946c809d..b7169b68e 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (5335)"; + public static final String VERSION = "1.0.27 BETA (5336)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_chemplant.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_chemplant.png index 8d24bb62fe9c7af4076f2a0b2cf7518dd3d57d97..824dd1ce99ffdf47214b6494f3055d833c8bcd01 100644 GIT binary patch literal 4015 zcmb_fc{r5o`+sM#6$Twk)-jYy9Ylnt24k7(q$DIVjF6FRIW=~QiN=zo(x8xJ7qXj< zZR|@i_7oG5ec#4!W=@@7-~YbXxxVjp-Pilx&vQTb@_9ec{XXyg^XCltc8Tu-0Duo; zgf;;H5c3fPaC0(mRvxb%m^Y}WF2&*BAyX#1TE`PAy%LqHY9P8NWuh;~U?|PVi>4LDVQM&{Z{w%J?6{F6jalU*>=wisV zkS?(m(}~9p9Mk(?P6*qdITQGPm*8+Lo$;YBG5t!}r_G*bn74F$g;(z48bQ{CtT5cB#JJgQK1{u( zhc%~X)EwDMhFUtdC$>6!j;+m)lBd_V7;P%E(xWliVYy8iZKG2jmgX~edk?DlKXCW| zcDJQfiT@1vsk*;lOkdySJBzIvR}dyney`2~?~0|R=TkfXoQfFMo~=r1@TTO&b;IbC zAc#q}S;I0k^=fW<6_RA2_v+Ovdq2O*?yeQUmGN$IE?~#hwHG>hUz#K{`q6xNVy~xp zqE^N7TQO2~r<0d7mkzwnPNj3j*MBDnom8{`+6MHYV%%v2!X(2~XjSr~9?&j`thLLI ze=P<6?dq&}S4Gayvqn8I>Z>>@G&ZH08wnhF8D?Q-cB;i^4?&qLnK_m7I6gkD&&4~j zfh=H}#4#t?sdu>B`IxV`a!=gtp`if57`y!54|B$V2pDk&g)!l6A`_hgdrBDPNnWWnN{}6Zb=n2AS zm1|vc;Xjw(kB|+FT%5S9jkv5`a5*!+XsuQsh6>XRd~U%~&~=i5{GNa&JJkJfS(dW* zEh{c-;V+8xuV$Kn)K|d6F8gZFmp#IIEaj*JTM=a|2EG@xY{03&_5O?e6!lfY%cU^+^%oa)hzfbB)Nho{9vz| z<*Lm2?M1Q{hh;)mL9yNy78jk!8+aXWq8CHBOxo~{Uzm~Ndq<(|!)!?jko? z{y^M`9C`bbHYZL$nU@^{ekzOm(NX+z)6tVU0!C>jjo(*gnPE@I6cMgTB{{r3D5`YT zG)@p2^jn0!;g!3}kM;k+tgczA_7t0)vr03;EU%wVLo5@9I(y&`pwU8jMX7u{Ax>Ek zT$E&xGG1Do9%yd?gYWAx(<&&mGfC;3xIUL=lA$CEmyi#9WO3yiwJ99)x&D)Z5S5Du zc#79pGRgRe;Z$Sz<{_f>*aW)~61lPjEW8g#?PBXG%HJGos8E3u3(2u{vi|_`9mfyM ziShi0JQepYyV=X3Yb3e~hI`iJKu{}20F{Gpm{SNasR>7|kj?@{Q<;-CBa<_#@${07 zNyRU!miZR;DzH&Izhf3cAyoy3W<9z#ob%+1eSEPJjvyc^2KXtgh7-TKA83mK?BG1u za#>IGV@;f7(0<`$ z+oCNJTA~j|y(z2SR%moAB_Fru1w}t~Lx`Xw_ZL+`lv_UxR61cLhM-1 zo;X!L+d-iTv<_~$J7TaMMcYG$tG2mven=jyi9|rdY?%XTm2{gA*V@+BG`MBwj0{@A zBerdLn_^CB%jH6zq@F^jbVd)Dh;R1GcONwVaRPAlzrZhfd?dBS))U;aGVbUEeodP? z$2id3+-!1Kq?=w+yH5Wc3^$sd?e?=q-PTXmVTQ!rM$GNDre&_qK(w()%0z56JRi@(I0gYJ~ zbw=@1IhvMUh#H3u=N7$%MvQEkjipbum}{;^)E_S6yOcjzA-6D5ld$7D zEV$lKujjEdKdz6q$Kg_P72MXxuC9-yM0HDuL4(v1{t*0jb8Be!vym-q72K=A^wIUr z(__4?n!eCjxj>fLsq%azdVLj|7{61oy1TEpH@ZAisWCS`KoNmZ^%Nb8inlSsm&e3z zG)WA-GdE%$A5%WHhofGRra=|HlTU~)>J!ZhtNh=22Dke?JyvIi+BO}&{!UF(<)SME zZ2FX4fuXLsz((qD>0`qRNv!c}4l}_Ow-}p9WDs*@IFb79RR98kh;NhpO)y4pxB2rW zpsaj*`ZFLpKc>+35ciD7vJGsHa{=F`4_?1B-+NHA&@D}g$LeIMIWrQG+LK)zCXz!W zQtR%e(~U_mvWvYBKM-s9A+S^$?iZ5-VXZ4I=}3b1Tl)#d)O=#ZF|*!UakLt7y4l?H zCLxty0%60gc7Vr9%QMfjR>`XpCeSJMUK0{cvM>jS#!_C~Q?xeR`tzg29%#^6W8=(b z9m1P#=i9bvJroW9AmJdF2)~1Fe+re9%oTo+^Ut>!i>l&d($f0AE2pypsBDwLIR>sP@@!g2gc8{0FB1E1c7$*|fDtdspWq$kNYbtCnvlEck3nm1(f2~m*;x@ItGofCKFW%ReOo`u(f>)v=B(I zzY!4F@ZXAozxLeLR>g+s_fOR}Iae!BYd(rCVK%Il*Uj&-a(e=)Uu96E6P+m@%afOy zUOca*yTv;bSf6Y;(7zLjQfUffdy~%eIccM-`3RD*3(@6VWQpk7SsuyaMr(>R@#JzB z78c4Q5Z%s~>^)@+bXmh+n{D-zmz24H+Yg}sQiOvJH27*7!4$z4BG)}E1P>tpw~pJX z!a+a;v(-t3{_+M4&VdUKDbpDnKk|CxTV-#kL>V!h>_d&$uG8A$R z(^gC)MpQD0T=s+#qiHZEXVTg2{nuIR?DMYmtoM7r^*+DneSW`ZJ@0zsk2pI>iYtf% z03hjzL>vVGkl+&phzbj))0q2yf(a6O!11`KU_^=f#sL5{*b%Y+_?7%mW3F*0x__ZA zeHL~~zSitQiShJLIiT%yjdSg^Y>@vhivK>T)`4rOu{YYQjz}IjPx;r;1ZHg27JU3C z+jzvHPWC?#+UdBv!f&qF#_k{*TH=xW*jJ6+1mI9&mQ*=cz=Ps1Kbv2 z!F5O-hZU!3xtN5RvDcRwQZ=l1q%fIpVePG$?k>%%^S|C*K7Y+<*#XgYXE6~+fThgN z2Bf%DYqhlYeVDICE)02a;VX~7k~^B3pxO-&RtjG9^&RXOFWf7WTv}SntU(#b)5;F# zO?M^kboDhAYC_HCMi~!8UlfLyLq(0D8~hI4m#ZSzpDZ#+&JN5^xYGINaMrO5 z!XCNbvev$wCIU0P)z#8n2AJeV3sf`gz-?_Yi*p0|#fhyx9?ADQ;4eyrHJ{2^V>< zGwY0W_8w3+2#}n^nh(r#?7ePVL}f$?z>Oe4dTOIoQ5>$757%;Gh|^U?d~O1OY{fgt zi63}pRjAAZ05O#0+&%0J2LneADDi*_0u=t#QiLk4+MO}9BQbh^W2<{+R!yZ2xh{lH z3$&Ya=df<2SGM6R4iYBF6^=Y`lZ21oxq0+P?}3H!ny8Hl8ds{&+=|WLNBB~ur|*68 zg!3EohLN#+&xJ45yK`*F$0`i50{AxA&%1od6>lPksK)^0m*8GS1&_hzJNQ zZ26~3R`2l`3km-LSQOt-n_%QNPopkG1FNXbU)}!z+5=w=kIRkI3?E=~* zl1IG?zU6n_qp;K}M;I;zwFGx{8ffn!&$jwUF7DQ!gyJmP5~a|?2cSh~nRBHSJiUc{ zML4;ve5(6rl>5j4s86b?{C0QoSMiEO_04^^*db!77#pAo3ioddKdfRd}@GkVDKfj1ZO04x73!dzsjO+!-|$ zQDS&*Q~FR*Drv;$oc8$~cl(+Df#r|ANnZ>8&gD-@MTleRSAz31|B+Iat6Wp`P zCh5*#@F@#XfM}b7oMv-n0HFJ{FvuBVsD0A2?SLhW7QQ%3U<*@b?wp)8-V(YrE%wO)ZSx06)V0m$UXbr{S&?}_B=hcdy5+Jg^S zP?EebMK~sC@^MU)a|}mUcRfO@G~c(w!YqX_F}SIAaJF$L-lg|Y8ke$*)j^v2+f*# zw4+iarfOe!0a+o}-Iw&c;lhoqD-6OLS|ug_k{p0%1TCl ztFWQ5vGG>$QlYIRcn?a=4NM&>Tq}rLS}x46Vw}nJY&_}B8%3GWx_1_2WZ2}(!ct;4 z){3hvzn=d6&;)(n`=4w4*?ojHp3eTFTUb`!mp1*Gw|lEgc#4q8!*(akAI?iUx|x9a zYjno+7}qA*v(Zi&@5`BggHDOA2}-uO(;FW*S|~P}c{aHzI4Jfp@0&!L3f<@#t@D_p(hh3%;vP!OIS(2VEVVBWul zuJ*YQY!qkgCUdCy>)cPTXQ&%;(b^p?YZfrraOi~Q>eQBKDY-rEi#iy ze_r?fx{rH3(i}a>xF@)Juhs-)DmLH7PE@6M*@6cS0$1i6JJKmG*1IF2k2PvYs|(0& zr<6YJqmlG2b#;dbI%<_l-iYb-r8ahB^mmIPRLJ`0G&JLr4lfHWK)Uoq={y4LV<_w##?Keo+d z*bCqr*vepO3aMqQ0EN`J#$I{jJ{qI-4e6h&4oIwyG@P<;L0X&6IY%_aS{Vdqa6&Vsws-w>*R1U9^+!! zP%tma>rldq$}d?pvmfTGsv>iSkzQZlT`;@4#wV=xF7UPe=`7VFJ#G`e+f2i;jjv(e zQ!j_y)h`<&6C=+=nuWPku3kgq!@@@AnLW>svaEr< zf;N!A%Px-_MjNUmdKRRgY4F!2Lp{tNGX}$VCJ4a=ecL$pYLm&Ot4DFe#gzPeM?1V% zCUv@`8UvM9Wg&)v2z;kfCFzl$73(8Dbjx2Dv0s81C2p-Q?x& z;=_3+##m#Vc?Ys>5U1iN6f}=;wR=Z9+#X$pt?Czon~M~!ox5Am!gU$suHr{d7A-`} zPn6U;+yI>ty7J0&o3^>lwg->;R~;@1nYW4;DH;a`sTlIF-rN~e9QRGirru*WOp~<7 zN@8)hyrl+~aK$eq#1-*8;gRORK|*tTL9IusI1m*j!|Y`+ZX@rG#b^6W4->HjRXsOl zs5sRH0u%|ikE&@1-UsRcV7xe!^!=eA|6lCXLRt(|$=r8c!q3lddZ5%P-PSClXSf~T z8e&E>S$gSXWMpLDF|qi*6Ei!YNxz#}x;}EX(Yl@v;o=D`2BFq%%j)kIoZEW<_)c6GNr)dts0ng&$=_T!o&X5WzGeFe` z@;B`}`drU`yeTXW^D3(|9?p4>P^G(iL$$!KV-j%c+Y{ zGI*p@`lrrb@#KvM=Sgw(9u&9wrY7VRI3^wiP|za{W^LPwwn`Im_jVd!FtYHgSc2f~ e_