From 25c52c79e214af990924c2db157271664f561ced Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Mon, 23 Mar 2026 09:44:48 -0300 Subject: [PATCH] crane part iondknow --- src/main/java/com/hbm/blocks/ModBlocks.java | 7 +- .../hbm/blocks/generic/BlockWandLogic.java | 8 +- .../com/hbm/blocks/generic/BlockWandLoot.java | 40 ++++++++- .../blocks/generic/BlockWandStructure.java | 3 +- .../com/hbm/blocks/generic/LogicBlock.java | 6 ++ .../hbm/entity/mob/ai/EntityAIFireGun.java | 26 +++--- .../java/com/hbm/itempool/ItemPoolsPile.java | 22 ++++- .../com/hbm/itempool/ItemPoolsSingle.java | 21 +++-- src/main/java/com/hbm/util/LootGenerator.java | 19 ++++- src/main/java/com/hbm/util/MobUtil.java | 78 ++++-------------- .../hbm/world/gen/util/LogicBlockActions.java | 68 ++++++++++----- .../world/gen/util/LogicBlockConditions.java | 25 ++++++ .../assets/hbm/structures/crane_mod.nbt | Bin 0 -> 14682 bytes 13 files changed, 216 insertions(+), 107 deletions(-) create mode 100644 src/main/resources/assets/hbm/structures/crane_mod.nbt diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 764527e5d..0f405629f 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -722,7 +722,7 @@ public class ModBlocks { public static Block machine_battery_socket; public static Block machine_battery_redd; - + @Deprecated public static Block machine_battery_potato; @Deprecated public static Block machine_battery; @Deprecated public static Block machine_lithium_battery; @@ -1217,6 +1217,7 @@ public class ModBlocks { public static Block wand_structure; public static Block logic_block; + public static Block logic_block_invis; public static Material materialGas = new MaterialGas(); @@ -1821,7 +1822,7 @@ public class ModBlocks { machine_battery_socket = new MachineBatterySocket().setBlockName("machine_battery_socket").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_battery_redd = new MachineBatteryREDD().setBlockName("machine_battery_redd").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); - + machine_battery_potato = new MachineBattery(Material.iron, 10_000).setBlockName("machine_battery_potato").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null); machine_battery = new MachineBattery(Material.iron, 1_000_000).setBlockName("machine_battery").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null); machine_lithium_battery = new MachineBattery(Material.iron, 50_000_000).setBlockName("machine_lithium_battery").setHardness(5.0F).setResistance(10.0F).setCreativeTab(null); @@ -2358,6 +2359,7 @@ public class ModBlocks { wand_structure = new BlockWandStructure().setBlockName("wand_structure"); logic_block = new LogicBlock().setBlockName("logic_block").setBlockTextureName(RefStrings.MODID + ":logic_block"); + logic_block_invis = new LogicBlock().setBlockName("logic_block_invis").setBlockTextureName(RefStrings.MODID + ":logic_block"); } @@ -3500,6 +3502,7 @@ public class ModBlocks { register(wand_structure); register(logic_block); + register(logic_block_invis); } private static void register(Block b) { diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java b/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java index 70fe879a1..05e8737af 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java @@ -117,6 +117,7 @@ public class BlockWandLogic extends BlockContainer implements ILookOverlay, IToo return true; } } + } return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); } @@ -221,6 +222,8 @@ public class BlockWandLogic extends BlockContainer implements ILookOverlay, IToo Block disguise; int disguiseMeta = -1; + boolean invisible = false; + public String actionID = "FODDER_WAVE"; public String conditionID = "PLAYER_CUBE_5"; public String interactionID; @@ -242,7 +245,8 @@ public class BlockWandLogic extends BlockContainer implements ILookOverlay, IToo MainRegistry.logger.warn("Somehow the block at: " + xCoord + ", " + yCoord + ", " + zCoord + " isn't a logic block but we're doing a TE update as if it is, cancelling!"); return; } - worldObj.setBlock(xCoord,yCoord,zCoord, ModBlocks.logic_block); + + worldObj.setBlock(xCoord,yCoord,zCoord, disguise == null ? ModBlocks.logic_block_invis : ModBlocks.logic_block); TileEntity te = worldObj.getTileEntity(xCoord, yCoord, zCoord); @@ -324,6 +328,7 @@ public class BlockWandLogic extends BlockContainer implements ILookOverlay, IToo nbt.setString("conditionID", conditionID); if(interactionID != null) nbt.setString("interactionID", interactionID); + nbt.setInteger("rotation", placedRotation); if(disguise != null){ nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); nbt.setInteger("disguiseMeta", disguiseMeta); @@ -337,6 +342,7 @@ public class BlockWandLogic extends BlockContainer implements ILookOverlay, IToo actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); interactionID = nbt.getString("interactionID"); + placedRotation = nbt.getInteger("disguiseMeta"); if(nbt.hasKey("disguise")){ disguise = Block.getBlockFromName(nbt.getString("disguise")); disguiseMeta = nbt.getInteger("disguiseMeta"); diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java b/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java index 4242f32ba..14d40578b 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java @@ -11,6 +11,8 @@ import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.config.ServerConfig; import com.hbm.config.StructureConfig; +import com.hbm.interfaces.IBomb; +import com.hbm.interfaces.ICopiable; import com.hbm.itempool.ItemPool; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; @@ -48,7 +50,7 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.common.util.FakePlayerFactory; -public class BlockWandLoot extends BlockContainer implements ILookOverlay, IToolable, ITooltipProvider, IBlockSideRotation { +public class BlockWandLoot extends BlockContainer implements ILookOverlay, IToolable, ITooltipProvider, IBlockSideRotation, IBomb { @SideOnly(Side.CLIENT) protected IIcon iconTop; @@ -212,12 +214,23 @@ public class BlockWandLoot extends BlockContainer implements ILookOverlay, ITool } } + @Override + public BombReturnCode explode(World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof BlockWandLoot.TileEntityWandLoot)) return null; + + ((BlockWandLoot.TileEntityWandLoot) te).triggerReplace = true; + + return BombReturnCode.TRIGGERED; + } + @Override public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityWandLoot(); } - public static class TileEntityWandLoot extends TileEntityLoadedBase implements INBTTileEntityTransformable { + public static class TileEntityWandLoot extends TileEntityLoadedBase implements INBTTileEntityTransformable, ICopiable { private boolean triggerReplace; @@ -355,6 +368,29 @@ public class BlockWandLoot extends BlockContainer implements ILookOverlay, ITool poolName = BufferUtil.readString(buf); } + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound nbt = new NBTTagCompound(); + Block block = replaceBlock != null ? replaceBlock : ModBlocks.deco_loot; + + nbt.setInteger("replaceBlock", Block.getIdFromBlock(block)); + nbt.setInteger("replaceMeta", replaceMeta); + nbt.setInteger("minItems", minItems); + nbt.setInteger("maxItems", maxItems); + nbt.setString("poolName", poolName); + + return nbt; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + replaceBlock = Block.getBlockById(nbt.getInteger("replaceBlock")); + replaceMeta = nbt.getInteger("replaceMeta"); + minItems = nbt.getInteger("minItems"); + maxItems = nbt.getInteger("maxItems"); + poolName = nbt.getString("poolName"); + + } } } diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandStructure.java b/src/main/java/com/hbm/blocks/generic/BlockWandStructure.java index 0684989cf..426c8bf3d 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandStructure.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandStructure.java @@ -229,8 +229,9 @@ public class BlockWandStructure extends BlockContainer implements IBlockMulti, I File structureFile = new File(structureDirectory, name + ".nbt"); + boolean debug = !worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); boolean previousDebug = ServerConfig.STRUCTURE_DEBUG.get(); - ServerConfig.STRUCTURE_DEBUG.set(true); + ServerConfig.STRUCTURE_DEBUG.set(debug); try { NBTStructure structure = new NBTStructure(structureFile); diff --git a/src/main/java/com/hbm/blocks/generic/LogicBlock.java b/src/main/java/com/hbm/blocks/generic/LogicBlock.java index 462755811..5487f4263 100644 --- a/src/main/java/com/hbm/blocks/generic/LogicBlock.java +++ b/src/main/java/com/hbm/blocks/generic/LogicBlock.java @@ -1,5 +1,6 @@ package com.hbm.blocks.generic; +import com.hbm.blocks.ModBlocks; import com.hbm.world.gen.util.LogicBlockActions; import com.hbm.world.gen.util.LogicBlockConditions; import com.hbm.world.gen.util.LogicBlockInteractions; @@ -50,6 +51,11 @@ public class LogicBlock extends BlockContainer { return super.getIcon(world, x, y, z, side); } + @Override + public boolean isOpaqueCube() { + return this != ModBlocks.logic_block_invis; + } + @Override public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { TileEntity te = worldIn.getTileEntity(x, y, z); diff --git a/src/main/java/com/hbm/entity/mob/ai/EntityAIFireGun.java b/src/main/java/com/hbm/entity/mob/ai/EntityAIFireGun.java index 1ba8c4eb6..2e67882f6 100644 --- a/src/main/java/com/hbm/entity/mob/ai/EntityAIFireGun.java +++ b/src/main/java/com/hbm/entity/mob/ai/EntityAIFireGun.java @@ -15,13 +15,13 @@ public class EntityAIFireGun extends EntityAIBase { private final EntityLiving host; - private double attackMoveSpeed = 1.0D; // how fast we move while in this state - private double maxRange = 20; // how far our target can be before we stop shooting - private int burstTime = 10; // maximum number of ticks in a burst (for automatic weapons) - private int minWait = 10; // minimum number of ticks to wait between bursts/shots - private int maxWait = 40; // maximum number of ticks to wait between bursts/shots - private float inaccuracy = 30; // how many degrees of inaccuracy does the AI have - + public double attackMoveSpeed = 1.0D; // how fast we move while in this state + public double maxRange = 20; // how far our target can be before we stop shooting + public int burstTime = 10; // maximum number of ticks in a burst (for automatic weapons) + public int minWait = 10; // minimum number of ticks to wait between bursts/shots + public int maxWait = 40; // maximum number of ticks to wait between bursts/shots + public float inaccuracy = 30; // how many degrees of inaccuracy does the AI have + public boolean randomBurst = true; //whether the burst time should be fixed or random // state timers private int attackTimer = 0; private FireState state = FireState.IDLE; @@ -33,7 +33,7 @@ public class EntityAIFireGun extends EntityAIBase { FIRING, RELOADING, } - + public EntityAIFireGun(EntityLiving host) { this.host = host; } @@ -89,7 +89,8 @@ public class EntityAIFireGun extends EntityAIBase { if(rec.getMagazine(stack).getAmount(stack, null) <= 0) { updateState(FireState.RELOADING, 20, gun, stack); } else if(ItemGunBaseNT.getState(stack, 0) == GunState.IDLE) { - updateState(FireState.FIRING, host.worldObj.rand.nextInt(burstTime), gun, stack); + int time = randomBurst ? host.worldObj.rand.nextInt(burstTime) : burstTime; + updateState(FireState.FIRING, time, gun, stack); } } } @@ -114,8 +115,9 @@ public class EntityAIFireGun extends EntityAIBase { // Turn body to face firing direction, since the gun is attached to that, not the head // Also apply accuracy debuff just before firing if(bind != null && bind != EnumKeybind.RELOAD) { - host.rotationYawHead += (host.worldObj.rand.nextFloat() - 0.5F) * inaccuracy; - host.rotationPitch += (host.worldObj.rand.nextFloat() - 0.5F) * inaccuracy; + float inacc = inaccuracy * (getYerGun().getConfig(stack, 0).getReceivers(stack)[0].getHipfireSpread(stack) * 20); + host.rotationYawHead += (host.worldObj.rand.nextFloat() - 0.5F) * inacc; + host.rotationPitch += (host.worldObj.rand.nextFloat() - 0.5F) * inacc; host.rotationYaw = host.rotationYawHead; } @@ -132,5 +134,5 @@ public class EntityAIFireGun extends EntityAIBase { return (ItemGunBaseNT) stack.getItem(); } - + } diff --git a/src/main/java/com/hbm/itempool/ItemPoolsPile.java b/src/main/java/com/hbm/itempool/ItemPoolsPile.java index f3c7bfde5..8c303556c 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsPile.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsPile.java @@ -3,6 +3,7 @@ package com.hbm.itempool; import static com.hbm.lib.HbmChestContents.weighted; import com.hbm.inventory.material.Mats; +import com.hbm.items.ItemEnums; import com.hbm.items.ModItems; import com.hbm.items.weapon.grenade.ItemGrenadeExtra.EnumGrenadeExtra; import com.hbm.items.weapon.grenade.ItemGrenadeFilling.EnumGrenadeFilling; @@ -28,6 +29,7 @@ public class ItemPoolsPile { public static final String POOL_PILE_NUKE_STORAGE = "POOL_PILE_NUKE_STORAGE"; public static final String POOL_PILE_OF_GARBAGE = "POOL_PILE_OF_GARBAGE"; public static final String POOL_PILE_MECHANICAL = "POOL_PILE_MECHANICAL"; + public static final String POOL_PILE_GEAR = "POOL_PILE_GEAR"; public static void init() { @@ -146,15 +148,29 @@ public class ItemPoolsPile { new ItemPool(POOL_PILE_MECHANICAL) {{ this.pool = new WeightedRandomChestContent[] { - weighted(ModItems.defuser, 0, 1, 1, 5), + weighted(ModItems.defuser, 0, 1, 1, 30), weighted(ModItems.screwdriver, 0, 1, 1, 30), weighted(ModItems.wire_fine, Mats.MAT_COPPER.id, 8, 12, 120), weighted(ModItems.plate_steel, 0, 3, 8, 40), weighted(ModItems.plate_copper, 0, 2, 5, 40), weighted(ModItems.coil_copper, 0, 2, 5, 40), - weighted(ModItems.coil_tungsten, 0, 2, 5, 40), - weighted(ModItems.ammo_standard, EnumAmmo.NUKE_TOTS.ordinal(), 1, 1, 10), + weighted(ModItems.coil_tungsten, 0, 2, 5, 40) + }; + }}; + new ItemPool(POOL_PILE_GEAR) {{ + this.pool = new WeightedRandomChestContent[] { + weighted(ModItems.defuser, 0, 1, 1, 40), + weighted(ModItems.screwdriver, 0, 1, 1, 30), + weighted(ModItems.canteen_vodka,0, 1, 1, 40), + weighted(ModItems.casing, ItemEnums.EnumCasingType.SMALL_STEEL.ordinal(), 1, 4, 30), + weighted(ModItems.casing, ItemEnums.EnumCasingType.SMALL.ordinal(), 3, 8, 40), + weighted(ModItems.casing, ItemEnums.EnumCasingType.BUCKSHOT.ordinal(), 3, 8, 40), + weighted(ModItems.canned_conserve, 0, 2, 5, 40), + weighted(ModItems.taurun_helmet, 0, 1, 1, 20), + weighted(ModItems.taurun_plate, 0, 1, 1, 20), + weighted(ModItems.taurun_legs, 0, 1, 1, 20), + weighted(ModItems.taurun_boots, 0, 1, 1, 20) }; }}; } diff --git a/src/main/java/com/hbm/itempool/ItemPoolsSingle.java b/src/main/java/com/hbm/itempool/ItemPoolsSingle.java index 73623ef83..37338373e 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsSingle.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsSingle.java @@ -23,7 +23,8 @@ public class ItemPoolsSingle { public static final String POOL_VAULT_UNBREAKABLE = "POOL_VAULT_UNBREAKABLE"; public static final String POOL_METEORITE_TREASURE = "POOL_METEORITE_TREASURE"; public static final String POOL_BLUEPRINTS = "POOL_BLUEPRINTS"; - + + public static void init() { new ItemPool(POOL_VAULT_RUSTY) {{ @@ -43,7 +44,7 @@ public class ItemPoolsSingle { weighted(Items.diamond, 0, 1, 2, 1) }; }}; - + new ItemPool(POOL_VAULT_STANDARD) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.ingot_desh, 0, 2, 6, 1), @@ -59,7 +60,7 @@ public class ItemPoolsSingle { weighted(ModItems.circuit, EnumCircuitType.CHIP.ordinal(), 2, 6, 1) }; }}; - + new ItemPool(POOL_VAULT_REINFORCED) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.ingot_desh, 0, 6, 16, 1), @@ -76,7 +77,7 @@ public class ItemPoolsSingle { weighted(ModItems.circuit, EnumCircuitType.BASIC.ordinal(), 6, 12, 1) }; }}; - + new ItemPool(POOL_VAULT_UNBREAKABLE) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.ammo_container, 0, 3, 6, 1), @@ -87,7 +88,7 @@ public class ItemPoolsSingle { weighted(ModItems.circuit, EnumCircuitType.ADVANCED.ordinal(), 6, 12, 1) }; }}; - + new ItemPool(POOL_METEORITE_TREASURE) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.cobalt_pickaxe, 0, 1, 1, 10), @@ -111,7 +112,7 @@ public class ItemPoolsSingle { weighted(ModItems.blueprint_folder, 1, 1, 1, 1) }; }}; - + new ItemPool(POOL_BLUEPRINTS) {{ this.pool = new WeightedRandomChestContent[] { weighted(ModItems.blueprint_folder, 0, 1, 1, 10), @@ -119,5 +120,13 @@ public class ItemPoolsSingle { weighted(ModItems.blueprint_folder, 0, 1, 1, 1), }; }}; + + new ItemPool(POOL_BLUEPRINTS) {{ + this.pool = new WeightedRandomChestContent[] { + weighted(ModItems.blueprint_folder, 0, 1, 1, 10), + weighted(ModItems.blueprint_folder, 1, 1, 1, 5), + weighted(ModItems.blueprint_folder, 0, 1, 1, 1), + }; + }}; } } diff --git a/src/main/java/com/hbm/util/LootGenerator.java b/src/main/java/com/hbm/util/LootGenerator.java index 7e4ab2eb8..77bc6d2a0 100644 --- a/src/main/java/com/hbm/util/LootGenerator.java +++ b/src/main/java/com/hbm/util/LootGenerator.java @@ -31,6 +31,7 @@ public class LootGenerator { public static final String LOOT_FLAREGUN = "LOOT_FLAREGUN"; public static final String LOOT_SHIT = "LOOT_SHIT"; public static final String LOOT_MECHANICAL = "LOOT_MECHANICAL"; + public static final String LOOT_GEAR = "LOOT_GEAR"; public static void applyLoot(World world, int x, int y, int z, String name) { switch(name) { @@ -46,6 +47,7 @@ public class LootGenerator { case LOOT_FLAREGUN: lootFlareGun(world, x, y, z); case LOOT_SHIT: lootShit(world, x, y, z); case LOOT_MECHANICAL: lootMechanical(world, x, y, z); + case LOOT_GEAR: lootMechanical(world, x, y, z); default: lootBones(world, x, y, z); break; } } @@ -63,6 +65,8 @@ public class LootGenerator { LOOT_METEOR, LOOT_FLAREGUN, LOOT_MECHANICAL, + LOOT_GEAR, + LOOT_SHIT, }; } @@ -257,10 +261,23 @@ public class LootGenerator { if(loot != null && loot.items.isEmpty()) { - int limit = world.rand.nextInt(3) + 1; + int limit = world.rand.nextInt(6) + 1; for(int i = 0; i < limit; i++) { addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPool.getPool(ItemPoolsPile.POOL_PILE_MECHANICAL), world.rand), world.rand.nextDouble() - 0.5, i * 0.03125, world.rand.nextDouble() - 0.5); } } } + + public static void lootGear(World world, int x, int y, int z) { + + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); + + if(loot != null && loot.items.isEmpty()) { + + int limit = world.rand.nextInt(6) + 1; + for(int i = 0; i < limit; i++) { + addItemWithDeviation(loot, world.rand, ItemPool.getStack(ItemPool.getPool(ItemPoolsPile.POOL_PILE_GEAR), world.rand), world.rand.nextDouble() - 0.5, i * 0.03125, world.rand.nextDouble() - 0.5); + } + } + } } diff --git a/src/main/java/com/hbm/util/MobUtil.java b/src/main/java/com/hbm/util/MobUtil.java index 2fd154891..803619357 100644 --- a/src/main/java/com/hbm/util/MobUtil.java +++ b/src/main/java/com/hbm/util/MobUtil.java @@ -59,21 +59,21 @@ public class MobUtil { {ModItems.wrench, 20} })); - slotPoolRanged.put(4, createSlotPool(12000, new Object[][]{ + slotPoolRanged.put(4, createSlotPool(0, new Object[][]{ {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, {ModItems.rag_piss, 1}, {ModItems.goggles, 1}, {ModItems.alloy_helmet, 2}, {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} })); - slotPoolRanged.put(3, createSlotPool(10000, new Object[][]{ + slotPoolRanged.put(3, createSlotPool(10, new Object[][]{ {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.alloy_plate, 2}, //sadly they cant wear jackets bc it breaks it {ModItems.steel_plate, 8}, {ModItems.titanium_plate, 4} })); - slotPoolRanged.put(2, createSlotPool(10000, new Object[][]{ + slotPoolRanged.put(2, createSlotPool(10, new Object[][]{ {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2}, })); - slotPoolRanged.put(1, createSlotPool(10000, new Object[][]{ + slotPoolRanged.put(1, createSlotPool(10, new Object[][]{ {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2}, {ModItems.titanium_boots, 6} })); @@ -121,68 +121,15 @@ public class MobUtil { //For action block slotPoolGunsTier1.put(0, createSlotPool(0, new Object[][]{ - {ModItems.gun_light_revolver, 16}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 2} + {ModItems.gun_light_revolver, 16}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 2}, {ModItems.gun_flaregun, 1} })); slotPoolGunsTier2.put(0, createSlotPool(0, new Object[][]{ - {ModItems.gun_uzi, 10}, {ModItems.gun_maresleg, 8}, {ModItems.gun_henry, 12}, {ModItems.gun_heavy_revolver, 4}, {ModItems.gun_flaregun, 4}, {ModItems.gun_carbine, 4} + {ModItems.gun_uzi, 12}, {ModItems.gun_maresleg, 8}, {ModItems.gun_henry, 12}, {ModItems.gun_heavy_revolver, 8}, {ModItems.gun_flaregun, 4}, {ModItems.gun_star_f, 8} })); slotPoolGunsTier3.put(0, createSlotPool(0, new Object[][]{ - {ModItems.gun_uzi, 25}, {ModItems.gun_spas12, 20}, {ModItems.gun_carbine, 20}, {ModItems.gun_g3, 10}, {ModItems.gun_am180, 5}, {ModItems.gun_stg77, 5} - })); - - slotPoolMasks.put(4, createSlotPool(0, new Object[][]{ - {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, - {ModItems.rag_piss, 4}, {ModItems.goggles, 12} - })); - - slotPoolHelms.put(4, createSlotPool(0, new Object[][]{ - {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, - {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, - {ModItems.cobalt_helmet, 2}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, - {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} - })); - - slotPoolTierArmor.put(4, createSlotPool(new Object[][]{ - {ModItems.gas_mask_m65, 20}, - {ModItems.gas_mask_olde, 15}, - {ModItems.steel_helmet, 25}, - {ModItems.titanium_helmet, 15}, - {ModItems.alloy_helmet, 10}, - })); - - slotPoolTierArmor.put(3, createSlotPool(new Object[][]{ - {ModItems.steel_plate, 30}, - {ModItems.titanium_plate, 20}, - {ModItems.alloy_plate, 15}, - {ModItems.cobalt_plate, 5}, - {ModItems.starmetal_plate, 5} - })); - - slotPoolTierArmor.put(2, createSlotPool(new Object[][]{ - {ModItems.steel_legs, 30}, - {ModItems.titanium_legs, 20}, - {ModItems.alloy_legs, 15}, - {ModItems.cobalt_legs, 5}, - {ModItems.zirconium_legs, 5} - })); - - slotPoolTierArmor.put(1, createSlotPool(new Object[][]{ - {ModItems.steel_boots, 30}, - {ModItems.robes_boots, 25}, - {ModItems.titanium_boots, 20}, - {ModItems.alloy_boots, 15}, - {ModItems.hazmat_boots, 10}, - {ModItems.cobalt_boots, 5}, - })); - - slotPoolMelee.put(0, createSlotPool(2000, new Object[][]{ - {ModItems.pipe_lead, 40}, {ModItems.crowbar, 35}, {ModItems.wrench, 30}, - {ModItems.steel_sword, 25}, {ModItems.titanium_sword, 20}, - {ModItems.reer_graar, 20}, {ModItems.stopsign, 15}, - {ModItems.lead_gavel, 12}, {ModItems.wrench_flipped, 10}, - {ModItems.sopsign, 8}, {ModItems.chernobylsign, 8} + {ModItems.gun_g3, 25}, {ModItems.gun_spas12, 20}, {ModItems.gun_carbine, 15}, {ModItems.gun_star_f, 20}, {ModItems.gun_am180, 6}, {ModItems.gun_amat, 5} })); slotPoolAdvRanged = new HashMap<>(slotPoolAdv); @@ -268,4 +215,15 @@ public class MobUtil { entity.tasks.addTask(3, new EntityAIFireGun(entity)); } + + public static void addFireTask(EntityLiving entity, EntityAIFireGun gunTask) { + entity.setEquipmentDropChance(0, 0); // Prevent dropping guns + + for(Object entry : entity.tasks.taskEntries) { + EntityAITasks.EntityAITaskEntry task = (EntityAITasks.EntityAITaskEntry) entry; + if(task.action instanceof EntityAIFireGun) return; + } + + entity.tasks.addTask(3, gunTask); + } } diff --git a/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java index 2e24dbb58..2a9db50d0 100644 --- a/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java @@ -2,11 +2,13 @@ package com.hbm.world.gen.util; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.bomb.BlockChargeBase; import com.hbm.blocks.generic.BlockSkeletonHolder; import com.hbm.blocks.generic.LogicBlock; import com.hbm.entity.item.EntityFallingBlockNT; import com.hbm.entity.missile.EntityMissileTier2; import com.hbm.entity.mob.EntityUndeadSoldier; +import com.hbm.entity.mob.ai.EntityAIFireGun; import com.hbm.items.ItemEnums; import com.hbm.items.ModItems; import com.hbm.tileentity.TileEntityDoorGeneric; @@ -200,8 +202,7 @@ public class LogicBlockActions { EntitySkeleton mob = new EntitySkeleton(world); mob.setPositionAndRotation(x, y, z, 0, 0); MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolGunsTier2, new Random()); - MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolMasks, new Random()); - MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolTierArmor, new Random()); + MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolRanged, new Random()); world.spawnEntityInWorld(mob); world.setBlock(x, y, z, Blocks.air); } @@ -217,8 +218,14 @@ public class LogicBlockActions { for (int i = 0; i < 3; i++) { EntitySkeleton mob = new EntitySkeleton(world); mob.setPositionAndRotation(x, y, z, 0, 0); + EntityAIFireGun gunTask = new EntityAIFireGun(mob); + gunTask.minWait = 4; + gunTask.maxWait = 5; + gunTask.burstTime = 6; + gunTask.inaccuracy = 5F; + gunTask.randomBurst = false; + MobUtil.addFireTask(mob, gunTask); MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolGunsTier3, new Random()); - MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolMasks, new Random()); MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdvRanged, new Random()); world.spawnEntityInWorld(mob); world.setBlock(x, y, z, Blocks.air); @@ -235,8 +242,7 @@ public class LogicBlockActions { for (int i = 0; i < 3; i++) { EntityZombie mob = new EntityZombie(world); mob.setPositionAndRotation(x, y, z, 0, 0); - MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolMelee, new Random()); - MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolTierArmor, new Random()); + MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolCommon, new Random()); world.spawnEntityInWorld(mob); world.setBlock(x, y, z, Blocks.air); } @@ -252,8 +258,7 @@ public class LogicBlockActions { for (int i = 0; i < 3; i++) { EntityZombie mob = new EntityZombie(world); mob.setPositionAndRotation(x, y, z, 0, 0); - MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolTierArmor, new Random()); - MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolMelee, new Random()); + MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdv, new Random()); world.spawnEntityInWorld(mob); world.setBlock(x, y, z, Blocks.air); } @@ -425,23 +430,47 @@ public class LogicBlockActions { int y = tile.yCoord; int z = tile.zCoord; - ForgeDirection direction = tile.direction.getOpposite(); + if(tile.phase == 0) { + world.setBlock(x, y + 1, z, ModBlocks.charge_c4, ForgeDirection.UP.ordinal(), 3); - if(tile.phase == 1){ - world.setBlock(x,y,z + direction.offsetZ, ModBlocks.charge_c4, 2, 3); - - TileEntity te = world.getTileEntity(x,y,z + direction.offsetZ); - if(te instanceof TileEntityCharge){ + TileEntity te = world.getTileEntity(x, y + 1, z); + if (te instanceof TileEntityCharge) { + TileEntityCharge bomb = (TileEntityCharge) te; + bomb.timer = 200; + } + } + + if(tile.phase >= 1) { + TileEntity te = world.getTileEntity(x, y + 1, z); + if (te instanceof TileEntityCharge) { TileEntityCharge bomb = (TileEntityCharge) te; - bomb.timer = 2400; bomb.started = true; } + } - world.setBlock(x,y,z, ModBlocks.crate_steel); - TileEntityCrateBase crate = (TileEntityCrateBase) world.getTileEntity(x,y,z); - crate.setPins(world.rand.nextInt(999)); - crate.lock(); - ((IInventory)crate).setInventorySlotContents(15, new ItemStack(ModItems.launch_key)); + + }; + + public static Consumer DEAD_GUY_CRANE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if(tile.phase == 1) { + world.setBlock(x, y, z, ModBlocks.skeleton_holder); + TileEntity te = world.getTileEntity(x, y, z); + EntityPlayer player = (EntityPlayer) world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(25, 25, 25)).get(0); + + if (te instanceof BlockSkeletonHolder.TileEntitySkeletonHolder) { + BlockSkeletonHolder.TileEntitySkeletonHolder skeleton = (BlockSkeletonHolder.TileEntitySkeletonHolder) te; + if (player != null && player.inventory.hasItem(ModItems.gun_hangman)) { + skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 0); + } else { + skeleton.item = new ItemStack(ModItems.gun_hangman); + } + skeleton.markDirty(); + world.markBlockForUpdate(x, y, z); + } } }; @@ -463,6 +492,7 @@ public class LogicBlockActions { actions.put("COLLAPSE_ROOF_RAD_10", COLLAPSE_ROOF_RAD_10); actions.put("BOMB_TRAP", BOMB_TRAP); actions.put("BOMB_CRANE", BOMB_CRANE); + actions.put("DEAD_GUY_CRANE", DEAD_GUY_CRANE); //Mob Block Actions actions.put("SKELETON_GUN_TIER_1", SKELETONS_GUN_TIER_1); diff --git a/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java index 0e1de662f..75f7cbd5c 100644 --- a/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java @@ -5,6 +5,7 @@ import com.hbm.blocks.generic.BlockPedestal; import com.hbm.blocks.generic.LogicBlock; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ModItems; +import com.hbm.tileentity.bomb.TileEntityCharge; import com.hbm.tileentity.machine.TileEntityLockableBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; @@ -12,6 +13,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -97,6 +99,27 @@ public class LogicBlockConditions { && ((BlockPedestal.TileEntityPedestal) pedestal).item.getItem() == ModItems.big_sword; }; + public static Function BOMB_CRANE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase == 0) { + world.setBlock(x, y + 1, z, ModBlocks.charge_c4, ForgeDirection.UP.ordinal(), 3); + + TileEntity te = world.getTileEntity(x, y + 1, z); + if (te instanceof TileEntityCharge) { + TileEntityCharge bomb = (TileEntityCharge) te; + bomb.timer = 200; + } + } + + return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(10, 10, 10)).isEmpty(); + }; + + + public static List getConditionNames(){ return new ArrayList<>(conditions.keySet()); @@ -115,6 +138,8 @@ public class LogicBlockConditions { conditions.put("PLAYER_CUBE_5", PLAYER_CUBE_5); conditions.put("PLAYER_CUBE_25", PLAYER_CUBE_25); + conditions.put("BOMB_CRANE", BOMB_CRANE); + //example conditions conditions.put("ABERRATOR", ABERRATOR); conditions.put("REDSTONE", REDSTONE); diff --git a/src/main/resources/assets/hbm/structures/crane_mod.nbt b/src/main/resources/assets/hbm/structures/crane_mod.nbt new file mode 100644 index 0000000000000000000000000000000000000000..7a13e830d6a23aeb89072e798d9848bc74773ba3 GIT binary patch literal 14682 zcmZ|02V7H0_diTWC4!1zB5l_~6Cn@;>8=G7A{YUs2qYk|bOq^zPk$Jypo;Q}0NA&i1Iq!GPhEo+IPc0fKG%xWGo|8@to;BE2Ub#En!AzOx z2=^l^vR@D0T36E}UqStCR3nUw)Y(8dskM>Hd{uDueTskfA0uD!DV|si7Q!JmUVoWx zlZ=FGY#`J(5Dve(xhYh#G*aR{j*{nC+bOTF2IroCyHpyaJGbMz7nj?|+3K_lZmcXL zZj_EK1P?e#ZvVO5Sp$+pv1 zsSB_?S@dz`5(50pd+L-N+D4^vXNhOF0ojfXa>TWlx=?uJ+=o^UU}t z0|h>giom>WL7JuQOndc?6=L!iH)FWlUMIXrwNl#^TCE+83GcB{9}RxOi(g=%^Y|bm z!Yvdm3|Y7k$mlKR+$G-B5l_>(W7S^{K^#WQ^Fv1JTPTfE{}QHERE8)#S6!x@89uUS z)GQyRw4j$_h>%6g^Fbbp(&f4ln>h~;Z25P^^&S44klHZ z6-!C&SltiC)>mAZbh~2mBvF-4$a<4;LBv|2lhAVj?ww-6?1<`8;C{lw3p)9HQ(2{H zlYh zEY+eqeS0i%O_(Ghykro%@pZAMY*Ec1{M+Z1T=!rj`?^SLRebJjqjvv zv(grKI6d2DHNoDe$*(`7=R6ct`ZT=zKC-(js6)HHSW3x)CdKt&)>&nf$asCzkEA;s{oSJ5{A5YrvRBtj)mnC=_~f3%BHH-Ji> zly7TYtu*9v{%!cb5pkGWo_(~E&-LyI?fZL?q(WivgJ&Y}9zp0qTR~)@gRqK=rk;D3 zzTH|Pgxo()ww`!1XvrqUrm1gzXkcmbAfA~?rW?nLm$7J}klnY!1LnKo^MePChh8L&p{?qf<$CnX!`s52zh|jrKZcTZ&Ij0fh@y$pJotafYaX=CC?Edy*&ob*2oO7$ z+Xx<_@#;_LyrhhM@Z9qAY(#E(!8X!EC213)HyN9806uSigt+r6haA1DW4AT~p?CM9 z2SX1b5wrqBP2Fqw49UsJs$rJ7jyKMCb?`w7ySAkUA_UKS^7!r=3x z1ZZwY6enioL_PsqEOrZ?+;itU^Io@n_pV_48*V~Gs3ijYANhVdO^sf|5Guw z+aswME9pR;x224}AZyLIzs3JPBaKYwsdR!99G=@&__vseVS?hGQgE)Sd6%elf} z=95I#kcmepcQ{)$W|^~ob0d4hdzgUm>&gxUI;MB&E&11QxtR z3~4|EC8THTKLjZ}AHRy|`TfYsIH%bQKO2oE%I^CQc|C)+kru(fF8?1AA&Lh~ZkMrN z_~@&&R_VemW4zL4n;>{a+Z7V5CfzuHceR6TAvfx@wbioYZl=u%vVTCBkjz%etDD;~ zU%H-s#X}}yqJ}Dq9;|$f9>f;57Hr={6D5U=U*9to7O?aj5Kcp_=h7$$BjT;6szL21 z)J;Xqm_tzp?!}z*fl7%&2}NcenrNbN3N-g!6z2GKXM!<5*m^(T=>Gk}NM9oi-l^RS z$|C7pgJ{%tVx2a>@mlix+9NKSF9b;_4s@Z=U(4Km=3_wXlOK}QV}G7xLGh2vOaI0I z5LU~c4(CXiFk#}(^V0aJE^*$>RJ@7f%sA1*;70npSPf)hDRJtD6+E**%#5v>;~I!pKadkso%R-RSNFcRHyr3) zEy?XXi^~!#Kr3JpAs&2f}@CAVgS`~{}%iI=Q z!tH!set)bP``t39-wdn1Frs~CSjWj{MuH(-6!yDi_cKpmWT5O6i0^fm=Ils5N zf2ZR^ubT+VWsk+iDa?25;S`MLtBJnwi6br#IwAB2Wvy9aFAR+Jm~hVp^)2T%Szr)4 zt6KTwti$pwV^Ews`v%EXNO-QlBv{$HKgVyV;fDupqA+$c#10;?nGcgN%ln{tyiu4Z z2ccj@h9vUrTUD}}8?;X~S1ks$P$W2fP8Qm;d|@PUJOg9JEz3=)SpB!0cwm3>`DoX9 z;8EPNO}6g`i{FO?sT%uI1~aBQ%$A|8Milsc%7lj<#Q?JfFu7&8)kqiOZ*zx4&k;m| zXZ`#9mV)Xt*y9jAFl8S^04pfHiSGp zUR1q9aLp_7VZnKia)xqGeYA#>A>`@p=nD?Qe1S3r{Zp-4!o`8E z&_GE;Xn~jEje&@#rJEPzWDkHRnB9d2iRq}bu_9LifYxRehb2j<0OR`oe!|p)?3U)6#k9-;SVd9Qn9H(&rGQN9g~<|7U1?E3u*V zED0t8pAVIT=iU$QS6?}s0kIT=1DUaedjt18s2yC6fP@RnL#b*~*%KJ1-U;7rWFg7u zTSi#aKLSUPSa_k{$|y7V@_A-Cn7hd8v)bYujFsGz;Ok(zanpw3c@9Nl$%0#7L#Sfe zq4yhx<6y>J!7Gso;9Jy(#u?*LD?1@i#gcDtQ#>+ORg9Z7Jp=Hl!#&Ql>DN(R^8ETs z2$jqOcvs67ih|=2vPKP%S7&Y7?poq*xjpWDQBeqnN-#sBFvaJfLC5*&<}T>L1EBwH z8uJgs7lOl%B2|r&zlNWE%dva9K)o>H)mN>T(D722Q;={5>RQYCh% zi~(DsB0b4KK0LJD{f93`GBTk0fQ|Z1qW$x_LfDPj0#{?5HGFtoC@ zg%^q0M;lrVIlw!`t_KY)UrHJ4B9KAfV9@Suz5P|3ffU?&dp91D@a27YfwDT^> zY*5+#ouz1$CA!LbK*dGQBFZdSPwh%KO(zm2;{^g1kjqGrD;Y8!e6XV!@kMX0>86 zVwoZ#AMf;uENwEGs?GCRxQdza)V*E5cl>J$3gL@}VXJr3eMpMG`AHXS;d?mz(Yxvv zO}c?HFZ!plc)O%{5ed3x-NNiAV!f_8Hv)$v3*PFDKD%HfcVM+L?EN`)w())_HK17P zG_b~d&x*kx1(n;&qHU^;)Y)mm&>#jsq<)GQKlY7>?i(6~snMtP@AXu^8LTa%!2zqHEhF7FdgBdzji+ZHyo(2Toka`N z_*Z|pB2_1BaiCC|K|akw07qxq`)O8Xw100;2iivUyt?ud1V0rcPR@C8eYm7U5cd(G zQq4>M1hhxvtQn)1FR%|>MS(g~1^V((>+}wzoSKBtn>~eQQ<6X-h7cbX^ai%Ovw88L zP8mHxycLDHuLkWiQm#4Aq<;;O{pTozMWGgMZW_WnNm9{4=ZY4#m|%!8wHTQ1c+jGA z9`4zI6kWV+*aIPuhfDq4ff}%0ge2J6Tge{yx2!OkdO$1KRo9VmM_S|g6WDSojrZ6$ zGxo!g2Q3o9bPqwo!G8ua3guEXKDaMWwxGDzC?AV&EI-U`NqCYkk9edM=PFO5uM}RF z)o74F*^(Z3ynYP%TD^%Vo3iYuyB2d@pD~zM@3%pbIw1`66n^)!z)4VN69pv%r z36CRM3QoVf+LYAAZZU)(&dkUX$^0TJc_I*W@SRb0}6$?<1zlKT!NbP{d~vW2gR+Cw zNGfEBwkY$nH^7wyzM4PNdl6_`gI(S*v+MWZ;H{2a|< z&i79D-ci)evryN7Gw8}k5ptW%yHNlkFplyN0$US!nVylb3|%^*?Gsn5wq5KPLz{BG zzj7z|A%!EXuMMHC_Lu_fn>V$HHyzG0n3AahQ$Le1x8Kkx4>!=g#3Hey(HJ#4KUjeI z6Nb>d?P!d@HnA|uz%x>*Rti%8hnO2KipzTZK;JE6$69Wi$||UR;pi+p9aZ3^dSl=Y zRW(10zt3NEJK?zH%Fi+iLg#Ht7_i`6RIJh_+l7>|`>qtX*Rr>n7nNjGgWcJFHx}+> z7!rY-ogH&`!mXJ*1-*GdU^6#8-E&r8^7o=q4>zA(a9|&dKoj3&K~LuBO+lAO%S{?3 z#E`AB@?i?b@#ARXmxK8KA^;Zr|MC8}M?A_&M3_E)g$KWX61e}|vbXNpZ};Kz0GdNW zg~?ji*YLHi1=`GLjGxJmZ?W(zdT`_&jZ#C7##}rD?PIYI2E?QMi2Oj2HDW{)*q7Gu zIzZF)HF|MNsp%u+akwzB9=L4Jreg3Y)QZDDJy-BL?hDpSUi|cN1P{K^od?)0$DnEF zuQEG|x?unM^PV~@X{Z<@sQiY4@&4WT+B>ewF}Nde!Uupe#i0j3?t?rmZ-E~UEV?(| zGu3M?GH3~|;^BZ!jmhXbD}P>yI6Ll@goSDprb7^pL<`deg5dLpvRt$5?|YpYFOs$s zSd_~`z<=12A}Ot{i2ndoqQIRc2@?;2BQ<%*ZLdyg>=wErAAibVDTZ5};7_m<$2*-E zY>9A%rM$W4eQSNBg|eatonj>xb%~OXoIn%5isUH`moC=C0>O7p9Gu3I3nTW?>el=B z!HXQ^d6z{umz|udGcAtl#ga9&(55mRdqzRR zK`3>QTTVStc1eMzl-JH9<~?`-)uNOhr! zQR&drAEGhZIPn1W8{MxxbwtwCPdK?|TeMUi`AVY%NxvnOx(|6FbS9K}as z2^H;sM2I2|Q{10>vSdh@6LQd?ZAgM=`r)tAZTmvZ9ZYHbbl(%PK#shZ{_aA;@X12u z2{BwEc_{|v^33;ynA0CG+Aoe>79!81v>(Nh`1?5pnQzcG4F`;e$iHdBk-zcKRbNM; zw9cS>6q|m{Ohl()2nNQG?N$xbFMMFo2}z(cO`e8_Yq6mJhO_1DwZ_UFK&gF8x0i_th zM{muaeRY_W6;wF#5(rkX#@${8W`5%nllh}TWTb0YbmKSYy0=B*P-=`~-~NPeTDiKX z+X~EapAdeF>q%?4!Fg%vpy@|4*|pc~Z|9c|VzZf7`uj z0f{zCII==3D16?k4@YiXO9-1&hf=R8tBXOzS7>l`F=R(s_UQ}pp=ja_Vf_BU|B%6& zH!YNr+<5hiV^>HSgFOSkkcX1qIm|1iWBK#>A(s1F2)fJ+f$8HVJx7&Tm)t@8pC#UCMXNz3;p9!MR)#Wr+yN`HwKA87(&q)DWCt^B7{#uU^N4w?@{^kT7M5Kr@$?_C*8X&?&<; z4(INn2fbY44V2$$ytz)J z#EL-k7C{UM?m3!TC!D7#EVc=$w-dq_hNFpfK;*ivdD_C~Jz>xwDgwdWwk9d89&x%2LbR_%jB$}E9A$O{Wjmd2#*x|d*xGAWR9S@2apY>pS zp}~)GYJnSwKzb^VkaMDh$<>0n?$MYqNoXD*={-P3EO-L=DKr}MAwd4R8xD z{kNsd7wQRFLdI0a8xO!?=pW9+Sk)6$gt;7lz%lFaM-x?q@qi4LLxHM0&4>n$~eavsohlGklGck9NrD7p(G*#kIunnymcexPXENW_gKFjhMT<1P$z zWa{WXFfd#z!lfSUw;2yu_DFr^RAXk-vWa2m!H>JeKC`sj5apZQGI8 z*JGSE^9of-q7Q0s(&7%}FLq~m2J32_NtI5huvMC^EZd`qQKB)*I#3R;7TmM*c&a|V zm!Ct?qo9eVqCn%^>}Y|fN<-@T^|q&z-8jN+*@ZN^#>={cKyjgJ08n@sfG+&#UK{9X z>^pZyT$In>(50GzW`|)U&VFKd;6YCS&(YJUaPP*({%cGd=RX%-$=56|%sq_LHup-81=aHzQGqqM1ax~1a6aM zh5L{@!9f0(M?f&ISchu>`z+!ss*@J&ckwe zM+Sr(F?kg|+I1$uB*Iu`19{@jP-wE%wgSCiSLgT_5;qcZ{EOTQ8;P=18n71jdpHe)h-Hl3|p`m8jFdqZ!Kt*fu_AQOE3j7!TmL@ z#NRUM5jL*M>a?$)TP6>J*pb{aEa-_4onr}~@1vt_y!r93?Y2b}l+ppH<`rE%z~@u; zANZvH+NdkEj|1Sqc77i@u_}kt`vG>B`Pq@{fR@#Faed9}P%gk{ed2z>i7(Ze0#98k zukippF(`$HIS8cMk*G_7mutpOElOuz|D;L>qgx#Sco?)+H}Z^4XI%#V-t|{N7FHMk zCItKo(EEY@#GwLxKqgr4YGn zdG*wCcV$|^eUj*)z6{0IH3%R4EYJZFUFTK=ux_%367aYMA>rdZknL(YD96VL-r0_n zKg|ViG6=}}ydQwzd?-Ia)A->kDSUX>o1A0jpaUUdGTjhiXfaD`tcdfreI!>_=f?~!!)4-c|K4^bnr#RF*Kn|p0550p+e`)tFqUpCUoA5!YBj5 z?G}SERfVQ~_(mJ(+O_&B~qJ0SmcZ&TfypnC#LPqHNo=e#tLl&MfEie31OW z$5ldy3xFxU$4(9@`|-G491PIEk@RjGk?^G4cqw?;*RW@Y~|E+>;)Y;D~2s4q4Vr1<0;AM0}2X%VNOg@6x~bjX>LHs>>@!B%m@a-45hAc zD3x88(3XX|CpN&tVw3~l9LdQyPQzIpuPSHiQo zn@^;nd1eQf;;h-704kwt=Cne0rvGBWcZ49}QYz5A3E(kyVze0Q72*&rq&(&OosVBsanp!N-aO4b84?JqiE!P6_aP1|u)GH#O=H;A3V@=+zP?1= z1r1XZ?lCcKf9_hHnlw=()#Q%V%jZLSm}gfe)CzNhZvJ^#H{)K{#gHVsHpQQSi{r9r zZa5jiS!@p}e)(oUQqpp4Ei!*SulsqGsBU;_ z*s>6mvwITw7O82xcn?@S%1#KH=X%Q61BUK>^1KQH@2nxDJ%Z-`0wPM}hf)@#@9)qk+{Wi|zo5MM67rldodxC(uJ@ZoL<^4RdKxEUxxaf zGWqtLVU?RgF#o8NX#4D7(tW$xplTtBhIvRs(b&Y7gQNHA+kE)lck3Pq#cpb&4R_<_ z{PyB7YXkU=uSTW$d(boNk+VB>_5DiY-&2g}&OC!KNo0pdx1DkJ!4^V)Ga^kLwu+kt zG1_hrGB=9B%(S->XZDQGlDm_^>7TAO$d?Xm69CSHI})g^CTfC?OX(KVCaO@7xEy7m zA}e6YrXL2*?8m=Z6mLyvTA~o$7aE1phR_IYb4jkfhzZpIN|IIz{-Cg(V$C!9vX9{Ry*!}e(yU+RW?Tkw*%Y+p;E341?AH2?{8 zjEB56)GB4ZM|59AB(U9A?lifqyt`mj{8BK1Jwxt`>;|!#>j?x5*EDK01Nm8 zcB6Vzu+Jk-EGLalu zlk=i}z?>tIIFRe3KQXL*$JBhm#&oMJtkE3j;q{f&D3^9?*lQs@J5^i4(7|W#?W~W) z#~Q{nALL75AVjwoK*b>=HR3MLy7{US?x&4kp93OQzO)1G-3%sf!bQZlMdMLR>i{_B z0vXClAUnyG5QA1rm=U+G+DaCJDv6$GsdViHh zu{ojc<`l%fxvd1Pb~@EIpK9*lnGD3%U-3GUl%aVibDj3sDPVcH15|4RbeSf+LEg5X(wuj78;AuOcQ zrHv-Id2oloRIzD8eG@Q++Dxi zp`u}taMMSeY<>VeX!;l`-WVK#FW~{fG#$6KdXEfo>#_j0Mls1U-Hyt|#m>OC z3rDKrQD;s;gZ!^CCj`$ZTPR;-Aog_e0F4_1KhoayL*{@k+vE%2CpZ@Bja zFTEeUXXjdi9gaqUYN+2Xno`*S{+6g-qNtz8*AS3{IFT&5b%zI^s0XbEyEdY)&}>r~ znpY&V_Wf-kV8I5bf%1{3bLvFp$wJem&Pr` z6-iIVnS-=6AMK{$D(2AVI8M+=bhw4AVZ-)n@wOQ&M}IS7c4&;1=DW0zG~(Mdz+QcA ztFF*O3E2m+-v;?cI`#`ah_q`f)ely_;#rh)d=UGSG|IV8A?WcK%!(vrjwC*QhrNOP zJL{&A6D8q^nLL%D3p(pS_A}=$v_X@ z5h4#qHhHcbWI%D<@YA?Rmb*MfHd2=G*`*uo%vqZX%Jw@IA-q9Hj`aPV8x=aAu`DZ`my<{Q!8j9 zD;DF&$475^cfW1Lz1?k!1!5WvP9@s^gD{NQ)6QW3Z%EjGa4=7=kZhrB?hnoS;hKImRvS-8ta_zcfTnTbH2RD9( zRv$Yx?e;V)^SKyHqC1R;8H^AH3l7{9ZzM}13@1!xYs@{fOtK?)hZ;^3T*kjm4!VFd zHFp!;01Sg#&x{Anfy#TL9qLOmj|2S1f3AIRJ3bh>H~ID8V^Y)i%o>ts*v99M0kh=A ziS2KTlfvtZhNDyAr`k>964qaQynP_&Cmy=|oQ_|GE;CU58B0+91T?7JLmjRoY0w_r zsh(s6T%r$ltI`wY?dO{;ll&t9dbgrjXxZ(mu0x}=0vPNAzj%4v>26768?M{x>tLdG*=%^loC-9S#klUNWminO8X&?&VMO>cqd1l!e=bEgVS};aJ4x(DsDEG`qub;;&QS3IQvly30{3=| ziXWs;e-qB}<8Ih=?%;FjMqj_Xzjq(>>TID55Mtv8$y;B;Xl^NA?Y_cXD^0(}C=HEL znAK0WT;d&Y>r3l2=vPJkF4|`pX>WG?K~KM?Pq8nAr{lbi{EUENGeL zuj9svx`8l>(ej~$ddq>53l64A{A6~WOo3T8qy>)Kg@0h72e-0_deQ!iR*b@`GbQzI zT@OI?==K2xn|qxoaQG4jQlo%K3WR|~aP{4J005Q=L_mQ0-5^>Hm_*khAs>3zP)|!q zz(?NAQi|)!KEq1_?>2XilvSLWc{N>}BL_k!jHVdOpFG?%+E6OleLS+;-O9o9V6z>_ zh_y_AqK6)go-Wc3mNqWbziogE;=b8aS0M9Bw{*S1??qw0Cw-&a|3o zis6xt)clI-J1f(_(-m<|)0;(>NuA7C%w%NA+i+gs%MOc_N`$EaE4zJO&|JsOakL^~ z**af(vN*}0O$rg_D5s3{hfQm_8Ir(_S0Jn)(#~U zF&eR zk6Z3?nb3TkKT=aK+qm^^?@DriP5A1=?O@VEh4#b89c2+IsfY}BEKnZ-`u1t+EYG{d z_m{V_S(NL?AtL)|1n=E$jbp`uSU=c`{##xKF^YykUV!_-0!n%@%v6Cm)Y37tgs_2M zoO=#e@><{h>9{$4|AgLuFpy2*B^J1^MRU7Pd0{Qdjs zdu`f(T`}>vSo8&)p(GmRUvluQy1Z`KJmQq@@RXzB8fn)lRBeyV5O!MfS5w0wKBxLs zc-9Rwz#oO^tGlT+e?c6an@F@E>2Iw%Jg*uXo!=YRF8=Icv;h&3qY>(6)y}%Sio?0W zBn(d(|1K7f`gqCNYU3~H|FNnqB4hY>^X>ocqW&?KPJD}Q)o>dDr)ngUE5v=|AUzk3 zkgKr(PxP!8qF2SV7L36+lZIz$lx$Iu)3Tjr`=WoX4Etjj8s`Ugs_XjTF>{{I1alF* z3~vj89X6ri=CDK4@N{UDAnKt{Or6S9h#Z*pIT&1zU2}G>Y#g3l*Gp`{?PmTWy?h>P z7AB9i_x|xGDI2b3jnqEH;}+pknc0rbBSTLjWU}Y$(_W=~6my%ntT3Byws3v(A^%i} zTk*u~i%vNirM-f6PcMp5dt}(xE(@mz{posU``seAc>-WNURricp_7XLBSvUCm7oS60^1rR( z0>+BJtobieyx|iwxBuB(dtj>+A^vC zGM+rX%f2@xRlU`Co3V4dktyak-<9YaA2}98CKWlQip?GIZ3x)Ew8)ZM@bGBf^_|Pt zu(#N2+?EZuGaaxSqvQMt|dakl=(PS}1#D&gaF0 zTb$|sI(MUCa@XRkg6g7R(xsY-+TUbiHTQzBNXK`!$v!hZe%U9E<~KMtKc|+S zHo_8?aF=H!WpDmHiS>&8@Gi-CHPXgmp~)`gmaN*|y~_F_TXx`pkk_sJltNC@fU!iE!@A^Of3mK+Slmsx z-u^pnE8wNZ346xEF*U7Q2&0CTZjtoi>w){j{l{hcRL{$Bj+G6cscQFK=-UiVS{@1X z+TP1Mmpc*JwB=%+DU*#@nKn_=8%vM=pwck^($cjZT3S7zm9FL3@K>`Thx5~zrTqNZ!I0Y{XU@b%pAKW?u{X@e=7#LsBhQw9df#V~Q*+|WPsit6*V8k{+lH2? z+BJ;|Mo&);1ou*#M{5``AOFvF;oXCyHZmc!rw*}S{NBEFbg%8%aX=f5I;lQuE|;_v3Apu{z+;aEfz3mJ2U>SROZO0r@~0ETk7d9(Y#qf+Lr)WmM&q2EN2PQ&aM>)}Q!B~=5% zYW%`cn}0G?{Z{*fb5Dw;CwvTBA@>LMj6A>_nTc!sq|>}MJivD;XfpUD!ge6hV23@e zXD+_3a&vb_wZZL}gcBp!2T32ZR^gP6Rn`35n0<39Wh5OVv=@N#&hO5Q#kwra!UJFK R7)k8O%`$G0a+Y~{{vY2fu@3+M literal 0 HcmV?d00001