From 15645648c5529a6076be5e9649c928e8d9f968e7 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 26 Jan 2025 22:09:21 +0100 Subject: [PATCH] sharticle accelerator --- changelog | 11 +- .../com/hbm/blocks/generic/BlockPedestal.java | 4 +- .../machine/albion/BlockPADetector.java | 2 +- .../blocks/machine/albion/BlockPASource.java | 12 +- .../container/ContainerCrucible.java | 6 + .../hbm/inventory/container/ContainerFEL.java | 4 +- .../com/hbm/inventory/gui/GUIPASource.java | 16 ++ .../com/hbm/items/machine/ItemPACoil.java | 18 +- .../weapon/sedna/factory/XFactory12ga.java | 6 +- .../weapon/sedna/factory/XFactory357.java | 4 +- .../weapon/sedna/factory/XFactory9mm.java | 4 +- .../sedna/factory/XFactoryAccelerator.java | 2 +- .../sedna/factory/XFactoryCatapult.java | 10 +- .../weapon/sedna/factory/XFactoryFlamer.java | 8 +- .../weapon/sedna/factory/XFactoryRocket.java | 4 +- .../machine/albion/IParticleUser.java | 4 +- .../machine/albion/TileEntityCooledBase.java | 4 + .../machine/albion/TileEntityPABeamline.java | 22 ++- .../machine/albion/TileEntityPADipole.java | 52 +++++- .../albion/TileEntityPAQuadrupole.java | 42 ++++- .../machine/albion/TileEntityPARFC.java | 33 +++- .../machine/albion/TileEntityPASource.java | 168 +++++++++++++++++- .../com/hbm/util/DamageResistanceHandler.java | 7 +- .../java/com/hbm/util/EntityDamageUtil.java | 1 + .../hbm/util/fauxpointtwelve/BlockPos.java | 4 + src/main/resources/assets/hbm/lang/en_US.lang | 2 +- .../gui/particleaccelerator/gui_detector.png | Bin 3373 -> 3434 bytes .../gui/particleaccelerator/gui_source.png | Bin 3408 -> 3702 bytes .../models/particleaccelerator/source.png | Bin 7977 -> 8163 bytes 29 files changed, 410 insertions(+), 40 deletions(-) diff --git a/changelog b/changelog index 75e4faca8..db0987c5a 100644 --- a/changelog +++ b/changelog @@ -18,15 +18,24 @@ * RBMK dials now have gamerules for disabling rod depletion and xenon poison * Changed the way bullet spread is calculated. Instead of the gun's innate inaccuracy being reduced by 75% when using sights, guns now have separate stats for innate inaccuracy (only relevant for things like SMG) as well as a hipfire penalty (roughly the same for all guns) * This also includes a multiplier for ammo spread, which mainly concerns sawed-off shotguns (dual lever action shotguns, Broken and Sacred Dragon) and amplifies the inaccuracy for things like buckshot while slugs perform the same + * Guns that cannot be aimed (no sights, akimbo) or where aiming is only useful for special effects (missile launcher lockon, quad launcher steering) do not have a hipfire penalty * Malachite now spawns in large deposits similar to hematite or bauxite, malachite veins are slightly smaller than bauxite veins * Limestone veins are now 50% larger * The compressor now has a NEI handler for any non-generic recipe * Removed compression recipes for steam, because why would you ever use those? * Fluid tanks that use pressurized fluids now say "pressurized, use compressor!" to avoid confusion over what "1PU" means +* Damage should no longer register at all when the damage resistance is 100%, similar to how damage is completely nullified by DT (i.e. not even knockback is applied) ## Fixed * Fixed incorrect tooltip in the automatic control rod's GUI * Fixed recipe autogen creating recipes for nonexistant thorium bedrock ore * Fixed FBI agents spawning both the old and new bullet entities when firing * Fixed dupe concerning one of the weapon abilities -* Fixed crates not sending a block update when the contents change, breaking redstone comparator functionality \ No newline at end of file +* Fixed crates not sending a block update when the contents change, breaking redstone comparator functionality +* Fixed "unblockable" damage (like afterburn) not being covered by the "other" category of armor resistances, meaning things like DNT nano suits would get wrecked by phosphorus rounds +* Fixed most mini nuke variants not going off when hitting an entity while the nuke has been in the air for less than 3 ticks +* Gun damage now also does 0 points of vanilla damage, ensuring that certain entity events trigger, e.g. neutral mobs targeting the player +* Fixed items being deleted by the crucible when using hotbar shortcuts by disabling hotkey shortcuts entirely + * How about you shift-click like a normal person +* Fixed legendary crafting causing disconnects on servers +* Fixed a dupe caused by shift clicking \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockPedestal.java b/src/main/java/com/hbm/blocks/generic/BlockPedestal.java index c6c865f3c..080881687 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockPedestal.java +++ b/src/main/java/com/hbm/blocks/generic/BlockPedestal.java @@ -134,12 +134,12 @@ public class BlockPedestal extends BlockContainer { if(recipe.extra == recipe.extra.FULL_MOON) { if(world.getCelestialAngle(0) < 0.35 || world.getCelestialAngle(0) > 0.65) continue; - if(world.getMoonPhase() != 0) continue; + if(world.provider.getMoonPhase(world.getWorldInfo().getWorldTime()) != 0) continue; } if(recipe.extra == recipe.extra.NEW_MOON) { if(world.getCelestialAngle(0) < 0.35 || world.getCelestialAngle(0) > 0.65) continue; - if(world.getMoonPhase() != 4) continue; + if(world.provider.getMoonPhase(world.getWorldInfo().getWorldTime()) != 4) continue; } if(recipe.extra == recipe.extra.SUN) { diff --git a/src/main/java/com/hbm/blocks/machine/albion/BlockPADetector.java b/src/main/java/com/hbm/blocks/machine/albion/BlockPADetector.java index d2b99c94d..0f27704bb 100644 --- a/src/main/java/com/hbm/blocks/machine/albion/BlockPADetector.java +++ b/src/main/java/com/hbm/blocks/machine/albion/BlockPADetector.java @@ -23,7 +23,7 @@ public class BlockPADetector extends BlockDummyable { @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityPADetector(); - if(meta >= 6) return new TileEntityProxyCombo().power().fluid(); + if(meta >= 6) return new TileEntityProxyCombo().inventory().power().fluid(); return null; } diff --git a/src/main/java/com/hbm/blocks/machine/albion/BlockPASource.java b/src/main/java/com/hbm/blocks/machine/albion/BlockPASource.java index 82f7dbae1..f278ccd60 100644 --- a/src/main/java/com/hbm/blocks/machine/albion/BlockPASource.java +++ b/src/main/java/com/hbm/blocks/machine/albion/BlockPASource.java @@ -23,7 +23,7 @@ public class BlockPASource extends BlockDummyable { @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityPASource(); - if(meta >= 6) return new TileEntityProxyCombo().power().fluid(); + if(meta >= 6) return new TileEntityProxyCombo().inventory().power().fluid(); return null; } @@ -39,5 +39,15 @@ public class BlockPASource extends BlockDummyable { @Override public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { super.fillSpace(world, x, y, z, dir, o); + + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + + this.makeExtra(world, x + rot.offsetX * 4, y, z + rot.offsetZ * 4); + this.makeExtra(world, x + dir.offsetX, y, z + dir.offsetZ); + this.makeExtra(world, x + dir.offsetX + rot.offsetX * 2, y, z + dir.offsetZ + rot.offsetZ * 2); + this.makeExtra(world, x + dir.offsetX - rot.offsetX * 2, y, z + dir.offsetZ - rot.offsetZ * 2); + this.makeExtra(world, x - dir.offsetX, y, z - dir.offsetZ); + this.makeExtra(world, x - dir.offsetX + rot.offsetX * 2, y, z - dir.offsetZ + rot.offsetZ * 2); + this.makeExtra(world, x - dir.offsetX - rot.offsetX * 2, y, z - dir.offsetZ - rot.offsetZ * 2); } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrucible.java b/src/main/java/com/hbm/inventory/container/ContainerCrucible.java index 5061bb4a6..f04d9e9f1 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrucible.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrucible.java @@ -38,6 +38,12 @@ public class ContainerCrucible extends Container { } } + @Override + public ItemStack slotClick(int slot, int button, int mode, EntityPlayer player) { + if(mode == 2) return null; + return super.slotClick(slot, button, mode, player); + } + @Override public ItemStack transferStackInSlot(EntityPlayer player, int index) { ItemStack stack = null; diff --git a/src/main/java/com/hbm/inventory/container/ContainerFEL.java b/src/main/java/com/hbm/inventory/container/ContainerFEL.java index c80e69e44..357c7378b 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerFEL.java +++ b/src/main/java/com/hbm/inventory/container/ContainerFEL.java @@ -42,8 +42,8 @@ public class ContainerFEL extends Container { ItemStack stack = slot.getStack(); rStack = stack.copy(); - if(index == 0) { - if(!this.mergeItemStack(stack, 1, this.inventorySlots.size(), false)) { + if(index <= 1) { + if(!this.mergeItemStack(stack, 2, this.inventorySlots.size(), false)) { return null; } } else { diff --git a/src/main/java/com/hbm/inventory/gui/GUIPASource.java b/src/main/java/com/hbm/inventory/gui/GUIPASource.java index 667950c4f..fa2a41d55 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIPASource.java +++ b/src/main/java/com/hbm/inventory/gui/GUIPASource.java @@ -4,11 +4,15 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerPASource; import com.hbm.lib.RefStrings; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.machine.albion.TileEntityPASource; import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; @@ -34,6 +38,18 @@ public class GUIPASource extends GuiInfoContainer { this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 18, 16, 52, source.power, source.getMaxPower()); } + @Override + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + if(guiLeft + 105 <= x && guiLeft + 105 + 10 > x && guiTop + 30 < y && guiTop + 30 + 10 >= y) { + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + NBTTagCompound data = new NBTTagCompound(); + data.setBoolean("cancel", true); + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, source.xCoord, source.yCoord, source.zCoord)); + } + } + @Override protected void drawGuiContainerForegroundLayer( int i, int j) { diff --git a/src/main/java/com/hbm/items/machine/ItemPACoil.java b/src/main/java/com/hbm/items/machine/ItemPACoil.java index 32e898430..fc380c1ee 100644 --- a/src/main/java/com/hbm/items/machine/ItemPACoil.java +++ b/src/main/java/com/hbm/items/machine/ItemPACoil.java @@ -10,6 +10,22 @@ public class ItemPACoil extends ItemEnumMulti { } public static enum EnumCoilType { - GOLD, NIOBIUM, BSCCO + GOLD(0, 10_000, 0, 10_000, 0.01D), + NIOBIUM(5_000, 100_000, 5_000, 100_000, 0.001D), + BSCCO(50_000, 500_000, 50_000, 500_000, 0.00025D); + + public int quadMin; + public int quadMax; + public int diMin; + public int diMax; + public double diMult; + + private EnumCoilType(int quadMin, int quadMax, int diMin, int diMax, double diMult) { + this.quadMin = quadMin; + this.quadMax = quadMax; + this.diMin = diMin; + this.diMax = diMax; + this.diMult = diMult; + } } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java index a0ee792ba..62e147442 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory12ga.java @@ -297,7 +297,7 @@ public class XFactory12ga { ModItems.gun_maresleg_akimbo = new ItemGunBaseNT(WeaponQuality.B_SIDE, new GunConfig().dura(600).draw(5).inspect(39).reloadSequential(true).crosshair(Crosshair.L_CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) - .dmg(16F).spreadAmmo(1.35F).delay(20).reload(22, 10, 13, 0).jam(24).sound("hbm:weapon.fire.shotgun", 1.0F, 1.0F) + .dmg(16F).spreadHipfire(0F).spreadAmmo(1.35F).delay(20).reload(22, 10, 13, 0).jam(24).sound("hbm:weapon.fire.shotgun", 1.0F, 1.0F) .mag(new MagazineSingleReload(0, 6).addConfigs(all)) .offset(0.75, -0.0625, 0.1875D) .setupStandardFire().recoil(LAMBDA_RECOIL_MARESLEG)) @@ -306,7 +306,7 @@ public class XFactory12ga { .anim(LAMBDA_MARESLEG_SHORT_ANIMS).orchestra(Orchestras.ORCHESTRA_MARESLEG_AKIMBO), new GunConfig().dura(600).draw(5).inspect(39).reloadSequential(true).crosshair(Crosshair.L_CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) - .dmg(16F).spreadAmmo(1.35F).delay(20).reload(22, 10, 13, 0).jam(24).sound("hbm:weapon.fire.shotgun", 1.0F, 1.0F) + .dmg(16F).spreadHipfire(0F).spreadAmmo(1.35F).delay(20).reload(22, 10, 13, 0).jam(24).sound("hbm:weapon.fire.shotgun", 1.0F, 1.0F) .mag(new MagazineSingleReload(1, 6).addConfigs(all)) .offset(0.75, -0.0625, -0.1875) .setupStandardFire().recoil(LAMBDA_RECOIL_MARESLEG)) @@ -339,7 +339,7 @@ public class XFactory12ga { ModItems.gun_spas12 = new ItemGunBaseNT(WeaponQuality.A_SIDE, new GunConfig() .dura(600).draw(20).inspect(39).reloadSequential(true).crosshair(Crosshair.L_CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) - .dmg(32F).delay(20).reload(5, 10, 10, 10, 0).jam(36).sound("hbm:weapon.shotgunShoot", 1.0F, 1.0F) + .dmg(32F).spreadHipfire(0F).delay(20).reload(5, 10, 10, 10, 0).jam(36).sound("hbm:weapon.shotgunShoot", 1.0F, 1.0F) .mag(new MagazineSingleReload(0, 8).addConfigs(all)) .offset(0.75, -0.0625, -0.1875) .setupStandardFire().recoil(LAMBDA_RECOIL_MARESLEG)) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory357.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory357.java index e99c6d6a4..51b673bee 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory357.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory357.java @@ -60,7 +60,7 @@ public class XFactory357 { ModItems.gun_light_revolver_dani = new ItemGunBaseNT(WeaponQuality.LEGENDARY, new GunConfig().dura(30_000).draw(20).inspect(23).crosshair(Crosshair.CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) - .dmg(15F).delay(11).reload(55).jam(45).sound("hbm:weapon.fire.pistol", 1.0F, 1.1F) + .dmg(15F).spreadHipfire(0F).delay(11).reload(55).jam(45).sound("hbm:weapon.fire.pistol", 1.0F, 1.1F) .mag(new MagazineFullReload(0, 6).addConfigs(m357_bp, m357_sp, m357_fmj, m357_jhp, m357_ap, m357_express)) .offset(0.75, -0.0625, 0.3125D) .setupStandardFire().recoil(LAMBDA_RECOIL_DANI)) @@ -69,7 +69,7 @@ public class XFactory357 { .anim(LAMBDA_DANI_ANIMS).orchestra(Orchestras.ORCHESTRA_DANI), new GunConfig().dura(30_000).draw(20).inspect(23).crosshair(Crosshair.CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) - .dmg(15F).delay(11).reload(55).jam(45).sound("hbm:weapon.fire.pistol", 1.0F, 0.9F) + .dmg(15F).spreadHipfire(0F).delay(11).reload(55).jam(45).sound("hbm:weapon.fire.pistol", 1.0F, 0.9F) .mag(new MagazineFullReload(1, 6).addConfigs(m357_bp, m357_sp, m357_fmj, m357_jhp, m357_ap, m357_express)) .offset(0.75, -0.0625, -0.3125D) .setupStandardFire().recoil(LAMBDA_RECOIL_DANI)) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory9mm.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory9mm.java index 9b844ab84..cb95c6a73 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory9mm.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory9mm.java @@ -78,7 +78,7 @@ public class XFactory9mm { ModItems.gun_uzi_akimbo = new ItemGunBaseNT(WeaponQuality.B_SIDE, new GunConfig().dura(3_000).draw(15).inspect(31).crosshair(Crosshair.CIRCLE).smoke(LAMBDA_SMOKE) .rec(new Receiver(0) - .dmg(3F).delay(2).dry(25).auto(true).spread(0.005F).reload(55).jam(50).sound("hbm:weapon.fire.uzi", 1.0F, 1.0F) + .dmg(3F).spreadHipfire(0F).delay(2).dry(25).auto(true).spread(0.005F).reload(55).jam(50).sound("hbm:weapon.fire.uzi", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 30).addConfigs(p9_sp, p9_fmj, p9_jhp, p9_ap)) .offset(1, -0.0625 * 2.5, 0.375D) .setupStandardFire().recoil(LAMBDA_RECOIL_UZI)) @@ -87,7 +87,7 @@ public class XFactory9mm { .anim(LAMBDA_UZI_ANIMS).orchestra(Orchestras.ORCHESTRA_UZI_AKIMBO), new GunConfig().dura(3_000).draw(15).inspect(31).crosshair(Crosshair.CIRCLE).smoke(LAMBDA_SMOKE) .rec(new Receiver(0) - .dmg(3F).delay(2).dry(25).auto(true).spread(0.005F).reload(55).jam(50).sound("hbm:weapon.fire.uzi", 1.0F, 1.0F) + .dmg(3F).spreadHipfire(0F).delay(2).dry(25).auto(true).spread(0.005F).reload(55).jam(50).sound("hbm:weapon.fire.uzi", 1.0F, 1.0F) .mag(new MagazineFullReload(1, 30).addConfigs(p9_sp, p9_fmj, p9_jhp, p9_ap)) .offset(1, -0.0625 * 2.5, -0.375D) .setupStandardFire().recoil(LAMBDA_RECOIL_UZI)) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryAccelerator.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryAccelerator.java index e14868f94..2267eedbb 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryAccelerator.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryAccelerator.java @@ -95,7 +95,7 @@ public class XFactoryAccelerator { ModItems.gun_tau = new ItemGunBaseNT(WeaponQuality.A_SIDE, new GunConfig() .dura(6_400).draw(10).inspect(10).crosshair(Crosshair.CIRCLE) .rec(new Receiver(0) - .dmg(25F).delay(4).auto(true).spread(0F) + .dmg(25F).spreadHipfire(0F).delay(4).auto(true).spread(0F) .mag(new MagazineBelt().addConfigs(tau_uranium)) .offset(1, -0.0625 * 2.5, -0.25D) .setupStandardFire().recoil(LAMBDA_RECOIL_TAU)) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryCatapult.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryCatapult.java index 23e33eeb6..c512ec7d7 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryCatapult.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryCatapult.java @@ -60,7 +60,7 @@ public class XFactoryCatapult { }; public static BiConsumer LAMBDA_NUKE_DEMO = (bullet, mop) -> { - if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3) return; + if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3 && mop.entityHit == bullet.getThrower()) return; if(bullet.isDead) return; bullet.setDead(); @@ -76,7 +76,7 @@ public class XFactoryCatapult { }; public static BiConsumer LAMBDA_NUKE_HIGH = (bullet, mop) -> { - if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3) return; + if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3 && mop.entityHit == bullet.getThrower()) return; if(bullet.isDead) return; bullet.setDead(); bullet.worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(bullet.worldObj, 35, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord)); @@ -101,7 +101,7 @@ public class XFactoryCatapult { } public static BiConsumer LAMBDA_NUKE_TINYTOT = (bullet, mop) -> { - if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3) return; + if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3 && mop.entityHit == bullet.getThrower()) return; if(bullet.isDead) return; bullet.setDead(); @@ -119,7 +119,7 @@ public class XFactoryCatapult { }; public static BiConsumer LAMBDA_NUKE_HIVE = (bullet, mop) -> { - if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3) return; + if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3 && mop.entityHit == bullet.getThrower()) return; if(bullet.isDead) return; bullet.setDead(); ExplosionVNT vnt = new ExplosionVNT(bullet.worldObj, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, 5); @@ -140,7 +140,7 @@ public class XFactoryCatapult { ModItems.gun_fatman = new ItemGunBaseNT(WeaponQuality.A_SIDE, new GunConfig() .dura(300).draw(20).inspect(30).crosshair(Crosshair.L_CIRCUMFLEX).hideCrosshair(false) .rec(new Receiver(0) - .dmg(100F).delay(10).reload(57).jam(40).sound("hbm:weapon.fire.fatman", 1.0F, 1.0F) + .dmg(100F).spreadHipfire(0F).delay(10).reload(57).jam(40).sound("hbm:weapon.fire.fatman", 1.0F, 1.0F) .mag(new MagazineSingleReload(0, 1).addConfigs(nuke_standard, nuke_demo, nuke_high, nuke_tots, nuke_hive)) .offset(1, -0.0625 * 1.5, -0.1875D).offsetScoped(1, -0.0625 * 1.5, -0.125D) .setupStandardFire().recoil(LAMBDA_RECOIL_FATMAN)) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryFlamer.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryFlamer.java index a697c2f10..aab5d0c5e 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryFlamer.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryFlamer.java @@ -138,7 +138,7 @@ public class XFactoryFlamer { ModItems.gun_flamer = new ItemGunBaseNT(WeaponQuality.A_SIDE, new GunConfig() .dura(20_000).draw(10).inspect(17).crosshair(Crosshair.L_CIRCLE) .rec(new Receiver(0) - .dmg(1F).delay(1).auto(true).reload(90).jam(17) + .dmg(1F).spreadHipfire(0F).delay(1).auto(true).reload(90).jam(17) .mag(new MagazineFullReload(0, 300).addConfigs(flame_diesel, flame_gas, flame_napalm, flame_balefire)) .offset(0.75, -0.0625, -0.25D) .setupStandardFire()) @@ -148,7 +148,7 @@ public class XFactoryFlamer { ModItems.gun_flamer_topaz = new ItemGunBaseNT(WeaponQuality.B_SIDE, new GunConfig() .dura(20_000).draw(10).inspect(17).crosshair(Crosshair.L_CIRCLE) .rec(new Receiver(0) - .dmg(1.5F).delay(1).auto(true).reload(90).jam(17) + .dmg(1.5F).spreadHipfire(0F).delay(1).auto(true).reload(90).jam(17) .mag(new MagazineFullReload(0, 500).addConfigs(flame_topaz_diesel, flame_topaz_gas, flame_topaz_napalm, flame_topaz_balefire)) .offset(0.75, -0.0625, -0.25D) .setupStandardFire()) @@ -158,7 +158,7 @@ public class XFactoryFlamer { ModItems.gun_flamer_daybreaker = new ItemGunBaseNT(WeaponQuality.LEGENDARY, new GunConfig() .dura(20_000).draw(10).inspect(17).crosshair(Crosshair.L_CIRCLE) .rec(new Receiver(0) - .dmg(25F).delay(10).auto(true).reload(90).jam(17).sound("hbm:weapon.fire.blackPowder", 1.0F, 1.0F) + .dmg(25F).spreadHipfire(0F).delay(10).auto(true).reload(90).jam(17).sound("hbm:weapon.fire.blackPowder", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 50).addConfigs(flame_daybreaker_diesel, flame_daybreaker_gas, flame_daybreaker_napalm, flame_daybreaker_balefire)) .offset(0.75, -0.0625, -0.25D) .setupStandardFire()) @@ -169,7 +169,7 @@ public class XFactoryFlamer { ModItems.gun_chemthrower = new ItemGunChemthrower(WeaponQuality.A_SIDE, new GunConfig() .dura(90_000).draw(10).inspect(17).crosshair(Crosshair.L_CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE) .rec(new Receiver(0) - .delay(1).auto(true) + .delay(1).spreadHipfire(0F).auto(true) .mag(new MagazineFluid(0, 3_000)) .offset(0.75, -0.0625, -0.25D) .canFire(ItemGunChemthrower.LAMBDA_CAN_FIRE).fire(ItemGunChemthrower.LAMBDA_FIRE)) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryRocket.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryRocket.java index 5cb0217f7..a70a284d5 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryRocket.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryRocket.java @@ -188,7 +188,7 @@ public class XFactoryRocket { ModItems.gun_quadro = new ItemGunBaseNT(WeaponQuality.A_SIDE, new GunConfig() .dura(400).draw(7).inspect(40).crosshair(Crosshair.L_CIRCUMFLEX).hideCrosshair(false) .rec(new Receiver(0) - .dmg(40F).delay(10).reload(55).jam(40).sound("hbm:weapon.rpgShoot", 1.0F, 1.0F) + .dmg(40F).spreadHipfire(0F).delay(10).reload(55).jam(40).sound("hbm:weapon.rpgShoot", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 4).addConfigs(rocket_qd)) .offset(1, -0.0625 * 1.5, -0.1875D) .setupStandardFire().recoil(LAMBDA_RECOIL_ROCKET)) @@ -199,7 +199,7 @@ public class XFactoryRocket { ModItems.gun_missile_launcher = new ItemGunBaseNT(WeaponQuality.A_SIDE, new GunConfig() .dura(500).draw(20).inspect(40).crosshair(Crosshair.L_CIRCUMFLEX).hideCrosshair(false) .rec(new Receiver(0) - .dmg(50F).delay(5).reload(48).jam(33).sound("hbm:weapon.rpgShoot", 1.0F, 1.0F) + .dmg(50F).spreadHipfire(0F).delay(5).reload(48).jam(33).sound("hbm:weapon.rpgShoot", 1.0F, 1.0F) .mag(new MagazineSingleReload(0, 1).addConfigs(rocket_ml)) .offset(1, -0.0625 * 1.5, -0.1875D) .setupStandardFire().recoil(LAMBDA_RECOIL_ROCKET)) diff --git a/src/main/java/com/hbm/tileentity/machine/albion/IParticleUser.java b/src/main/java/com/hbm/tileentity/machine/albion/IParticleUser.java index 7beb17c6d..c71cfdc92 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/IParticleUser.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/IParticleUser.java @@ -1,11 +1,13 @@ package com.hbm.tileentity.machine.albion; import com.hbm.tileentity.machine.albion.TileEntityPASource.Particle; +import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraftforge.common.util.ForgeDirection; public interface IParticleUser { - public boolean canParticleEnter(Particle particle, ForgeDirection dir); + public boolean canParticleEnter(Particle particle, ForgeDirection dir, int x, int y, int z); public void onEnter(Particle particle, ForgeDirection dir); + public BlockPos getExitPos(Particle particle); } diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityCooledBase.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityCooledBase.java index f9ed71aaa..596e6ab0a 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityCooledBase.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityCooledBase.java @@ -60,6 +60,10 @@ public abstract class TileEntityCooledBase extends TileEntityMachineBase impleme } } + public boolean isCool() { + return this.temperature <= this.temperature_target; + } + public abstract DirPos[] getConPos(); @Override diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPABeamline.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPABeamline.java index 10ffc3c6d..8a5041d66 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPABeamline.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPABeamline.java @@ -1,11 +1,31 @@ package com.hbm.tileentity.machine.albion; +import com.hbm.tileentity.machine.albion.TileEntityPASource.Particle; +import com.hbm.util.fauxpointtwelve.BlockPos; + import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPABeamline extends TileEntity { +public class TileEntityPABeamline extends TileEntity implements IParticleUser { + + @Override + public boolean canParticleEnter(Particle particle, ForgeDirection dir, int x, int y, int z) { + ForgeDirection beamlineDir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10).getRotation(ForgeDirection.DOWN); + BlockPos input = new BlockPos(xCoord, yCoord, zCoord).offset(beamlineDir, -1); + return input.compare(x, y, z) && beamlineDir == dir; + } + + @Override + public void onEnter(Particle particle, ForgeDirection dir) { } + + @Override + public BlockPos getExitPos(Particle particle) { + ForgeDirection beamlineDir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10).getRotation(ForgeDirection.DOWN); + return new BlockPos(xCoord, yCoord, zCoord).offset(beamlineDir, 2); + } AxisAlignedBB bb = null; diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java index 6768c28c6..e76372a07 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPADipole.java @@ -4,8 +4,13 @@ import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerPADipole; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.gui.GUIPADipole; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemPACoil.EnumCoilType; import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.machine.albion.TileEntityPASource.Particle; +import com.hbm.util.EnumUtil; +import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.relauncher.Side; @@ -19,13 +24,15 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProvider, IControlReceiver { +public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProvider, IControlReceiver, IParticleUser { public int dirLower; public int dirUpper; public int dirRedstone; public int threshold; + public static final long usage = 1_000_000; + public TileEntityPADipole() { super(2); } @@ -50,6 +57,49 @@ public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProv return "container.paDipole"; } + @Override + public boolean canParticleEnter(Particle particle, ForgeDirection dir, int x, int y, int z) { + return this.yCoord == y && (this.xCoord == x || this.zCoord == z); + } + + @Override + public void onEnter(Particle particle, ForgeDirection dir) { + EnumCoilType type = null; + + int mult = 1; + if(slots[1] != null && slots[1].getItem() == ModItems.pa_coil) { + type = EnumUtil.grabEnumSafely(EnumCoilType.class, slots[1].getItemDamage()); + mult = type.diMin > particle.momentum ? 5 : 1; + } + + if(!isCool() || this.power < this.usage * mult || type == null || type.diMax < particle.momentum) { + particle.crash(); + return; + } + + this.power -= this.usage * mult; + } + + @Override + public BlockPos getExitPos(Particle particle) { + System.out.println(particle.momentum + " / " + this.threshold); + if(particle.momentum >= this.threshold) { + ForgeDirection dir = this.ditToForgeDir(checkRedstone() ? dirRedstone : dirUpper); + particle.dir = dir; + return new BlockPos(xCoord, yCoord, zCoord).offset(dir, 2); + } + ForgeDirection dir = this.ditToForgeDir(dirLower); + particle.dir = dir; + return new BlockPos(xCoord, yCoord, zCoord).offset(dir, 2); + } + + public boolean checkRedstone() { + for(DirPos pos : getConPos()) { + if(worldObj.isBlockIndirectlyGettingPowered(pos.getX(), pos.getY(), pos.getZ())) return true; + } + return false; + } + @Override public void updateEntity() { diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPAQuadrupole.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPAQuadrupole.java index 99d25945a..ed2109a77 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPAQuadrupole.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPAQuadrupole.java @@ -2,8 +2,13 @@ package com.hbm.tileentity.machine.albion; import com.hbm.inventory.container.ContainerPAQuadrupole; import com.hbm.inventory.gui.GUIPAQuadrupole; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemPACoil.EnumCoilType; import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.machine.albion.TileEntityPASource.Particle; +import com.hbm.util.EnumUtil; +import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.relauncher.Side; @@ -14,7 +19,10 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPAQuadrupole extends TileEntityCooledBase implements IGUIProvider { +public class TileEntityPAQuadrupole extends TileEntityCooledBase implements IGUIProvider, IParticleUser { + + public static final long usage = 1_000_000; + public static final int focusGain = 100; public TileEntityPAQuadrupole() { super(2); @@ -30,6 +38,38 @@ public class TileEntityPAQuadrupole extends TileEntityCooledBase implements IGUI return "container.paQuadrupole"; } + @Override + public boolean canParticleEnter(Particle particle, ForgeDirection dir, int x, int y, int z) { + ForgeDirection beamlineDir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10).getRotation(ForgeDirection.DOWN); + BlockPos input = new BlockPos(xCoord, yCoord, zCoord).offset(beamlineDir, -1); + return input.compare(x, y, z) && beamlineDir == dir; + } + + @Override + public void onEnter(Particle particle, ForgeDirection dir) { + EnumCoilType type = null; + + int mult = 1; + if(slots[1] != null && slots[1].getItem() == ModItems.pa_coil) { + type = EnumUtil.grabEnumSafely(EnumCoilType.class, slots[1].getItemDamage()); + mult = type.quadMin > particle.momentum ? 5 : 1; + } + + if(!isCool() || this.power < this.usage * mult || type == null || type.quadMax < particle.momentum) { + particle.crash(); + return; + } + + particle.focus(focusGain); + this.power -= this.usage * mult; + } + + @Override + public BlockPos getExitPos(Particle particle) { + ForgeDirection beamlineDir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10).getRotation(ForgeDirection.DOWN); + return new BlockPos(xCoord, yCoord, zCoord).offset(beamlineDir, 2); + } + @Override public void updateEntity() { diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPARFC.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPARFC.java index 694b6164f..82109496f 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPARFC.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPARFC.java @@ -4,6 +4,8 @@ import com.hbm.inventory.container.ContainerPARFC; import com.hbm.inventory.gui.GUIPARFC; import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.machine.albion.TileEntityPASource.Particle; +import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.relauncher.Side; @@ -14,7 +16,11 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPARFC extends TileEntityCooledBase implements IGUIProvider { +public class TileEntityPARFC extends TileEntityCooledBase implements IGUIProvider, IParticleUser { + + public static final long usage = 1_000_000; + public static final int momentumGain = 100; + public static final int defocusGain = 100; public TileEntityPARFC() { super(1); @@ -30,6 +36,31 @@ public class TileEntityPARFC extends TileEntityCooledBase implements IGUIProvide return "container.paRFC"; } + @Override + public boolean canParticleEnter(Particle particle, ForgeDirection dir, int x, int y, int z) { + ForgeDirection rfcDir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10).getRotation(ForgeDirection.DOWN); + BlockPos input = new BlockPos(xCoord, yCoord, zCoord).offset(rfcDir, -4); + return input.compare(x, y, z) && rfcDir == dir; + } + + @Override + public void onEnter(Particle particle, ForgeDirection dir) { + if(!isCool() || this.power < this.usage) { + particle.crash(); + return; + } + + particle.momentum += this.momentumGain; + particle.defocus(defocusGain); + this.power -= this.usage; + } + + @Override + public BlockPos getExitPos(Particle particle) { + ForgeDirection beamlineDir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10).getRotation(ForgeDirection.DOWN); + return new BlockPos(xCoord, yCoord, zCoord).offset(beamlineDir, 5); + } + @Override public void updateEntity() { diff --git a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java index 4cf65c8cc..76432e74b 100644 --- a/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java +++ b/src/main/java/com/hbm/tileentity/machine/albion/TileEntityPASource.java @@ -1,19 +1,35 @@ package com.hbm.tileentity.machine.albion; +import com.hbm.blocks.BlockDummyable; +import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerPASource; import com.hbm.inventory.gui.GUIPASource; +import com.hbm.lib.Library; +import com.hbm.particle.helper.ExplosionSmallCreator; +import com.hbm.tileentity.IConditionalInvAccess; import com.hbm.tileentity.IGUIProvider; +import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityPASource extends TileEntityCooledBase implements IGUIProvider { +public class TileEntityPASource extends TileEntityCooledBase implements IGUIProvider, IConditionalInvAccess, IControlReceiver { + + public static final long usage = 1_000_000; + public Particle particle; + + public int debugSpeed; public TileEntityPASource() { super(5); @@ -24,6 +40,78 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv return "container.paSource"; } + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + this.power = Library.chargeTEFromItems(slots, 0, power, this.getMaxPower()); + + if(particle != null) { + steppy(); + this.debugSpeed = particle.momentum; + if(particle.invalid) this.particle = null; + } else if(this.power >= this.usage && slots[1] != null && slots[2] != null) { + tryRun(); + } + } + + super.updateEntity(); + } + + public void steppy() { + if(!worldObj.getChunkProvider().chunkExists(particle.x >> 4, particle.z >> 4)) return; //halt if we reach unloaded areas + System.out.println("ticking"); + ExplosionSmallCreator.composeEffect(worldObj, particle.x + 0.5, particle.y + 0.5, particle.z + 0.5, 10, 1, 1); + + Block b = worldObj.getBlock(particle.x, particle.y, particle.z); + if(b instanceof BlockDummyable) { + int[] pos = ((BlockDummyable) b).findCore(worldObj, particle.x, particle.y, particle.z); + if(pos == null) { particle.crash(); return; } + TileEntity tile = worldObj.getTileEntity(pos[0], pos[1], pos[2]); + if(!(tile instanceof IParticleUser)) { particle.crash(); return; } + IParticleUser pa = (IParticleUser) tile; + System.out.println(pa + ""); + if(pa.canParticleEnter(particle, particle.dir, particle.x, particle.y, particle.z)) { + pa.onEnter(particle, particle.dir); + BlockPos exit = pa.getExitPos(particle); + particle.move(exit); + } else { particle.crash(); worldObj.createExplosion(null, particle.x + 0.5, particle.y + 0.5, particle.z + 0.5, 5, false); return; } + } else { + System.out.println("derailed!"); + particle.crash(); + } + } + + public void tryRun() { + if(slots[1].getItem().hasContainerItem(slots[1]) && slots[3] != null) return; + if(slots[2].getItem().hasContainerItem(slots[2]) && slots[4] != null) return; + + this.power -= usage; + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + this.particle = new Particle(xCoord + rot.offsetX * 5, yCoord, zCoord + rot.offsetZ * 5, rot, slots[1], slots[2]); + this.slots[1] = null; + this.slots[2] = null; + this.markDirty(); + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + buf.writeInt(debugSpeed); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + debugSpeed = buf.readInt(); + } + @Override public DirPos[] getConPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); @@ -39,6 +127,38 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv }; } + //ISidedInventory + @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return slot == 1 || slot == 2; } + @Override public boolean canExtractItem(int slot, ItemStack stack, int side) { return slot == 3 || slot == 4; } + @Override public int[] getAccessibleSlotsFromSide(int side) { return new int[] { 3, 4 }; } + + //IConditionalInvAccess + @Override public boolean isItemValidForSlot(int x, int y, int z, int slot, ItemStack stack) { return isItemValidForSlot(slot, stack); } + @Override public boolean canExtractItem(int x, int y, int z, int slot, ItemStack stack, int side) { return canExtractItem(slot, stack, side); } + + //reusing the same fucking instance because doing anything else would be retarded + public static final BlockPos cheapAss = new BlockPos(0, 0, 0); + public static final int[] slotsRed = new int[] {1}; + public static final int[] slotsYellow = new int[] {2}; + @Override + public int[] getAccessibleSlotsFromSide(int x, int y, int z, int side) { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + cheapAss.mutate(x, y, z); + + if(cheapAss.compare(xCoord + dir.offsetX - rot.offsetX * 2, yCoord, zCoord + dir.offsetZ - rot.offsetZ * 2) || + cheapAss.compare(xCoord - dir.offsetX + rot.offsetX * 2, yCoord, zCoord - dir.offsetZ + rot.offsetZ * 2)) { + return slotsYellow; + } + + if(cheapAss.compare(xCoord - dir.offsetX - rot.offsetX * 2, yCoord, zCoord - dir.offsetZ - rot.offsetZ * 2) || + cheapAss.compare(xCoord + dir.offsetX + rot.offsetX * 2, yCoord, zCoord + dir.offsetZ + rot.offsetZ * 2)) { + return slotsRed; + } + + return getAccessibleSlotsFromSide(side); + } + @Override public long getMaxPower() { return 10_000_000; @@ -69,14 +189,17 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv return 65536.0D; } + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerPASource(player.inventory, this); } + @Override public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIPASource(player.inventory, this); } + @Override - public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new ContainerPASource(player.inventory, this); + public boolean hasPermission(EntityPlayer player) { + return this.isUseableByPlayer(player); } @Override - public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new GUIPASource(player.inventory, this); + public void receiveControl(NBTTagCompound data) { + if(data.hasKey("cancel")) this.particle = null; } public static class Particle { @@ -86,5 +209,40 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv public int z; public ForgeDirection dir; public int momentum; + public int defocus; + public static final int maxDefocus = 100; + public boolean invalid = false; + + public ItemStack input1; + public ItemStack input2; + + public Particle(int x, int y, int z, ForgeDirection dir, ItemStack input1, ItemStack input2) { + this.x = x; + this.y = y; + this.z = z; + this.dir = dir; + this.input1 = input1; + this.input2 = input2; + } + + public void crash() { + this.invalid = true; + } + + public void move(BlockPos pos) { + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + } + + public void defocus(int amount) { + this.defocus += amount; + if(this.defocus > this.maxDefocus) this.crash(); + } + + public void focus(int amount) { + this.defocus -= amount; + if(this.defocus < 0) this.defocus = 0; + } } } diff --git a/src/main/java/com/hbm/util/DamageResistanceHandler.java b/src/main/java/com/hbm/util/DamageResistanceHandler.java index f90cebe57..b34b26570 100644 --- a/src/main/java/com/hbm/util/DamageResistanceHandler.java +++ b/src/main/java/com/hbm/util/DamageResistanceHandler.java @@ -267,13 +267,16 @@ public class DamageResistanceHandler { @SubscribeEvent public void onEntityAttacked(LivingAttackEvent event) { + if(event.source.isDamageAbsolute()) return; + EntityLivingBase e = event.entityLiving; float amount = event.ammount; float[] vals = getDTDR(e, event.source, amount, currentPDT, currentPDR); float dt = vals[0] - currentPDT; + float dr = vals[1] - currentPDR; - if(dt > 0 && dt >= event.ammount) { + if((dt > 0 && dt >= event.ammount) || dr >= 1F) { event.setCanceled(true); EntityDamageUtil.damageArmorNT(e, amount); } @@ -378,7 +381,7 @@ public class DamageResistanceHandler { if(exact != null) return exact; Resistance category = categoryResistances.get(typeToCategory(source)); if(category != null) return category; - return source.isUnblockable() ? null : otherResistance; + return otherResistance; } public ResistanceStats addExact(String type, float threshold, float resistance) { exactResistances.put(type, new Resistance(threshold, resistance)); return this; } diff --git a/src/main/java/com/hbm/util/EntityDamageUtil.java b/src/main/java/com/hbm/util/EntityDamageUtil.java index 95193b3b4..03c2363d2 100644 --- a/src/main/java/com/hbm/util/EntityDamageUtil.java +++ b/src/main/java/com/hbm/util/EntityDamageUtil.java @@ -45,6 +45,7 @@ public class EntityDamageUtil { if(!playerMP.canAttackPlayer(attacker)) return false; //handles wack-ass no PVP rule as well as scoreboard friendly fire } DamageResistanceHandler.setup(pierceDT, pierce); + living.attackEntityFrom(source, 0F); boolean ret = attackEntityFromNTInternal(living, source, amount, ignoreIFrame, allowSpecialCancel, knockbackMultiplier); //boolean ret = living.attackEntityFrom(source, amount); DamageResistanceHandler.reset(); diff --git a/src/main/java/com/hbm/util/fauxpointtwelve/BlockPos.java b/src/main/java/com/hbm/util/fauxpointtwelve/BlockPos.java index 90d897693..4664ef646 100644 --- a/src/main/java/com/hbm/util/fauxpointtwelve/BlockPos.java +++ b/src/main/java/com/hbm/util/fauxpointtwelve/BlockPos.java @@ -36,6 +36,10 @@ public class BlockPos implements Cloneable { return this; } + public boolean compare(int x, int y, int z) { + return this.x == x && this.y == y && this.z == z; + } + public BlockPos add(int x, int y, int z) { return x == 0 && y == 0 && z == 0 ? this : new BlockPos(this.getX() + x, this.getY() + y, this.getZ() + z); } diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 54bb88c54..0e9d0d901 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1672,7 +1672,7 @@ hbmmat.weaponsteel=Weapon Steel hbmmat.whitephosphorus=White Phosphorus hbmmat.wood=Wood hbmmat.workersalloy=Desh -hbmmat.wroughtiron=Wroght Iron +hbmmat.wroughtiron=Wrought Iron hbmmat.zirconium=Zirconium matshape.block=%s Block diff --git a/src/main/resources/assets/hbm/textures/gui/particleaccelerator/gui_detector.png b/src/main/resources/assets/hbm/textures/gui/particleaccelerator/gui_detector.png index db202f440ad100d190a4016b8a96313fc212b069..9b66746d1adc847bbcdef6e253616b52bd7c3e0d 100644 GIT binary patch literal 3434 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 u!c{S^qYUUw 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 MD|^d|qtw`c1F?qD_y7O^ diff --git a/src/main/resources/assets/hbm/textures/gui/particleaccelerator/gui_source.png b/src/main/resources/assets/hbm/textures/gui/particleaccelerator/gui_source.png index 864b123f18644089dd5d5348dd171227af2046ea..190e88643a995008569744e8c7cd041deed7cbb6 100644 GIT binary patch literal 3702 zcmb_ec{H3^7Jr|mN^E6mu?8(ki=9M>P?WZW5VR6RYzb0?LhMz7LMOHeq6O(#njj=d ztg$l^``U=6tg(xID{Glg_w?zRb7sz*GiTmE?|t{a_q+H0?t9<85k>~rSQz;j0RSwz zI-14+K=2X*31yqA4aca`Q&Aj8vw)f%6~F zvG&Ib%0rxva#8UinnS`5JI^b9xVWjWXvysnCfY-}xHBQkVqsr%0C>@KYIy9!r&oOJTYoMK74n^Xd4U5+6w!S==;*Q%KFPmAP zY8L74I(^{y0b4gYmlkBbAH^D`QQxY3X@I*OAx;+n(1%gEML( z9>1jh4yS8UFT4UT;59Fj{+~cM4xY z*!!&6IKJCg=iupyMRXG{ucRD!(AT?PnO+*V&Fp=>VwJS^HzpaLy1Jqw5ut}=QXAJjt7O+GKIJt+D-7lg-+~UMIR5j&p+g)# zVh-Y2p`q(kYwV6!0?$T+;xaF36*b^$&haoK7Di?YjYCwn1zt)x;UupsQ0HXQTdp!$w1Eg*kf3VRs=k(Oz=OipdU=iE7~0d96Bl@0+K-37$YW2$eU#G3}g6K2Yy zHV;SC_9=r$>)9#gnhFXE9tmi@vqTW}6!Ifd_Vh=UV{aC%Q)1LKHM`1V%t&Ik7E>L4 zw)g~W`GjSSkg1Bl>wYr|C#q)7u9Fx@Y+NRrwv`ST>EYKRE(Im?_0sAn+|7p4G76Bg zzO!afU*&3X<<`xgF7-7Z#kZ3)iGXAt%&j>!`|lH+X64fqh-E#0O10L$NGm%2YhlUQf|F=o-@wP%~12> z@Q80*yz}nXoOi-m5BXNyT>i($<@*)wZ5h01Fc9Xqz=u`#_xCpqssE%$8W`jFnS)6 zyoi`skhhIP(3A2X05crT3NwNen`SqKS5`J1XX?3MI(_$RW$DKKOJ6zaGmEPuhCz7u z?uqTf<31L}RecQq%(-pO;~f^V%h33^jo*#HoKJ~BemA!tL27BW0{mYPRr6%Oc4^W4 zw0#}7VyCfqKa)vmQrz%xL^pMP?pC$rwbi+_*@UgfVaG45x;AIVCgblt*ZrA?J;*|K_$JZh=-&p(*31l;TJjCrdepLy` zo#nu2PWvK}O{>Q^JpRkqw4mL|kArH2DV7S~)zkzJ#?D|{K@vNZuBo=}HvX>jxmRPy z{$>g_WRD{gKw)tbM( zt=Nm|nq1u`Hc==zG2CZhlbW6&z(#5XB0`!U7Bsq{`g2Y&xS=WfySi3D!?%`#M z1vsV9pb2;x!!K&Exwy2gAm5{`tn6N3VS!+M?xhE9Z;^qo3Pk}DEH zdwcsMYq->!*CgU4^k2LhxZg^p2Ie2s^NfrQ=&Z0Thp zC#2!1a*q^jQyC%Jxfom{SK<(k;%wq*L>X@cE*vC}GqrWD-gMN!p_-B-1zNxo;0T z6Yw3)upgy`3_opCw_s+L-2w(K=%LB`RmB-U9Xx^Fm6S~Phl*L6uQwsfs4E3$)UM?3 zRDlTUc1gO$@d!6s@YN z`bk5nqJ7dTZ)TF?KjZy3bKBta;9%C^SFS+zwqFE3h_S_8h!kO0I`VTjrOOcDZqqGf zD1n=35fPZp>3JS)gSQNtN?nPKk(ik~%>T35KR`k^-iffyT(M!5ph*bh3ck?1=V8wN zTIC7!uax|k5dK;H2Z)j2R3wHJWzOCrC=LC^e3LrHls^0Sm>8M;&AF01Udn_uENr-+ z`uC~$XW)O6sT1`H-dwvn!JLa{@tycPv?a}-t{a_Sp*B7(7U7^%XM1!f=ktBIQ$yux5AEf*t`)gCkKQG$1zPAneJ8@Qz A!~g&Q literal 3408 zcmb_edpMhE7JrkFsD?1DVKhjiohk;MYSlF^iA$@YF2%T)R^5p^AyM19w5kTHI&Ljf zg2A!|bxBeNjcKt|XVkT%sK#C5nrx=C^E~^V_I#vZ;_w|#-h}q7LVa)_a-?rw3t1rD% z5~aG%eUqpA^Sd@G-dTCXW48LEkDX=XBL&W@<)7QnZWwKlarMp~=`j{{?+;$;ue5Iv zF@B~rVm)KPq1Ev6>ydaxfkz4xb5wdUQV)wIk;&@ba;!bx3ISjKcE^Wlvpa>2svP~> zB7G+3l#S}%phcGA?Qc6H?s!**(>E_ki9{^5vgmDUFAge(7yBrlB?pf@$r@O?q28fn z8+w)Z;jI?TxsM`COH0_sECcN%3wTPh6U#am}{5 z^pl4~%(Bk-)Rg9dS!&l~w~ly6Nfc^c;j!wk#ZNzM#gll;?u)#=%&PfrzB1NNf>N_J zkVC<_*M#+N7Kl;R^_gK8(3FXg=Ie2Bx^LhoP&|{cA4>wpPA9$@i8nGbD&FbP37t$E z59D8IPcv<5Y-qq@PfcjO)R&I@E^bry%uuH06YkjY3spnH(qx*izvJ8=r}Mp@%uMa| zQ+y*L>~~9k3>eoFu*In}VSPh%rg_qeVexkH=YvLZa+W_o5^p*|Xlo2e7 zBN)|Ab#n^~H}?ft*saz6ES$i0X`T|td1VS2T#PK=n{Zh=`1q{vK7Iq()j~yH;+_xW z=z@0>lrFYD($yN;6 z^q~PKI>CVR^=Ic|dti@F?%VP{SJ#-_CgAz1p8fhe>D3^@x3-AQW=CWi{HoT6b3+fuC-9M{$|(Zx4-guJhl==;5rlB z8ou#o^4{+EIi%6iQSp3x_*aHhhjEFA0U;>N%0iOwP{;lM?r zrG`WvOjBe$@d4&_MxK=kum<75aE9~K`qaV=5nz`{8BnrhOA&)uqc?Cy%Y!=7~Y z%bm{Bmie5yV_8c2r{6f5z5Zo7M}7#FrgQBnq@=7Cp%wGq2{Qa_B@VvpmS^95V-sAn z*vOJ?q{|bpqrCKY?xd7aw5xDGJiej(s7$thQE2J`73p_=C${Hs;9n1=KVQ-gy;RAG|!_78C9ZI0xtrujxzML*McN5)i(H7)==oCoH??JuYUb);1Bvyq2}R@L7Wgq?KN(QhbaOQHGd5?c8kwn?k z1qZvk-2w{lrOpw7;H8u2i;ek#qFj3w-vY#g48U-Bai?HwUjOXmfGaV?T9ioOFlcMi z2EBI6*K@m08|wuihy;t(Cl(=2>@e{M_d%aZ+~QvreIR!)7PrkClG;@L)B{nBU&s(B zrfi$tyPYuFsuxp7Mlu!x7}8KoDmFsu(JT5H>gfv5bAR1`1a3TpNI6RAD*0{mq&!(X z4`RE?#2Co`Y#7=LlCHGgbuxG7oKQl3);b>2-(OU8J727kd$YcQrU26-26KW=O{uhK zU&w+-bkWa%rncCVBVUQxy-zW5mMU*qdGqG%0AH=KupkTWy7@Xxbv9hsXJx&&((5sn z9+USWgD}hQYopD}vfF?8HG2=GXsu0_MZvvI9_-7(2Cc4ha@V}16eZr@q4)sNXKQc` zr79%IUROlE`_LEs143$zB>YK`+S@0ZAX4E?ikOVGXyo)nU8W89a)lmn!^w#4#OcGS z4goM~>vqz52olg7;KuuXN`kSiGA3EY;@CZaMMtPVT2cA7V407)#Kq8NWX%V5LGzhzO1{B%Bgab57 zi7BcswA}4r(+dlh#W;$`0&I-)qq?T1tg7<*>WtYbw)X4c3Y(=#ksgp+kRV>)&|tR! z6HcsQ3(r>ZoG<;Gz9EH$*)E;ef|us7&QO&o{Kw0eS6TUQmPZtUuu8f5;7->}x8N@K zXoHxBBlk*Qnvjnq$_TrVo0pdtE{6AXl7Y^oUNnO13NbFd2M=ElRwE(tfbWeot}r#E z#`@S4f0moBNTmpm;ItFyZWH*ge1%1JrO%%cW$q(d2Vs30Hiq*|IjTl00#c3Myz~Sy zt=R)2X$N0>73)GbK|_SDtdG2Kr^*nlmm;Q>{-LT55m1=6sz00hAdU0KU>KB;_1Y)3 zbZX^PYFQTzCub(~FxV;-6_)P0B-Q0e(!)bHj|mOkBE$p42B=~h0PC_4MdRPcOcVM1 z`%hp_BCPnt-RbF4uB+!cmfb)tf4N45O&}oWsJ{TLrK15P2+1nsW4nC`U|9?l5SG+xLjdJVmFOuYTJj0mkEdspcAVAI>fIHIQ-rUpUtk+|u*s-3HYS6q?nPipTJ(9C@rNKSO|CWlJ8uZG29=p_lrUr!= zT_a#(E{Fo8G5}p-fKfkUVtiHfDO!nTRV$8+ah7>VYS&C@$ bS<2+2`cl8f)5qM3e#5gO5b?F9Ubp@ZBO~(3 diff --git a/src/main/resources/assets/hbm/textures/models/particleaccelerator/source.png b/src/main/resources/assets/hbm/textures/models/particleaccelerator/source.png index 00e7a765db2cb1e084d96a0b0f8045b297b64ca7..1c7bb4de69c2a6ef5f11c6d63b7537c317b26398 100644 GIT binary patch literal 8163 zcmYLO1z1y2{~jSB(g;Y(NMSUBG$`F5(lHnyrKGfgOr%@sP+$nsNI1#SlM;{?snIOH1d4d3=yWI>TqHA{H6oPv>sZABavf8;@s+HJ;_!7TUC>W;@}7>fYI6 zxBTv8pPvAC3M~THxC&{OKmnXMOn7jQjGB4+3L8Zb|ZP5L+&FE^Xg}n9G_V#OSqo#~`f^0~r~a)@hk@ zcqv=ksB?GQA7_c5FPkbS)lDd`UwRpPYtkH)|b`!ZpcQDflNhQ;$CMFlBCM`Bh?PT_7!2>-CK7oW=>-w#C%?C3H z5MR~OSg-Hb##q5s!|NIT2B$}-n^6A9i5_wi_Y~TDG)SazokyuY8#`s;ezn0i*Z(k+ z5S*ZzJ!sRAs%|0A=LSwCN^zlsW_W@HiwI2MW6he^*rlf+p1vC2*7=vbYZB;(nV_A_ zxMAuUC(U5InN8)Q-1{X=Tw7O#US^-4a~Y9-*$rFjyj5*d&aqQHx2tty6SRpa3(cq{ z=}kli5cgFi^o;E(Z%_2S7G|w^w}qN(D@jJZBO>*w%MG!o9&#FIC&-r%rXO14)dDTjNO1C*q{t9gZTt^x2&>>3|UWv9h)Z%%_K>RJecz=vBsk`gv20I_dgQ zk8LRjM&XCCk;urHn3`6~D5&VA^9`mk9LCvR7WS!^7`(p|oS%>z<8zb1EcLkkDufMU zmmJd=a%K!|;q>vH_VbR;g|tA}kPM@2YxZn9&%Gt|D8JCuQb#tkUpmP3x-4%I@9SA* zNOP*Ne{*?V$inW`8ZCoE_d#PbC6S<3g9j6A^?Ph&tuNgkMD;ImTy(tn#rp$EL;M}5 zsSQ`n@_bvQo)k3UdKdI_(-#Etz3k^qTHKl_w^%s0BK*6hgdk36zN1Fe7R7)&b4}R} z!WpKpHwp3J@aoD?i7e7$UVDF9gCF^BB%jDW&xcOE3~dU}86^`6WZ`3@WZ|tXr6M^w zz?4*TUgi!3siL2Ae9t#-E}ppd^4kB?8nYs=E7Gahb~M#?dmTM#W`5@pqk9GRnX-j< z9ltHnM3CW+DD&RmRFFHnlas$8$_s7*=c^e6u!4aM;V29K?d|QSr=&HR%n{rl(m2a< z>5-QK($YdUEgKWA4I1Vd!nP;h=Y{eE*Rph|UaXO(JLpl2##&2yMD9qDrR2zFROhF` z?WtFmmwV#=4EBJBX?08`zOFm8zo^`p-^M<_=c8Ox?CnkH@b=qx)%GG2(RJ(uW}I;c zC|=vrJ)(FM;y&~W7zL?t;R67gn(LVR5MlYdo{j^d{#sMug%1Nsyagm_@6%R(etL3U zpgVXA<@<3KUN^eouOJuR9Ki_fg!MdJbE1-BA2%|!*?e#{%_{{VaI0Xd^Z;jdB&KV<;~BL z*rfKW##iSqZ*-od#PG!)81&?GXSz~qjc$ZkEv^n^T=_#F5a{dI^4Kh^(2#SN#|~`S ziRcpu$~f2{1^E?;jM?3NQEwr5!-QL_dp?%Z{>bqh``mYRMCQL`@)`{JM=;oxKx)!J zuD*Ds2I9L}vfA3(Z`K*;=`X#acd{ffQen;F&(7^eHh%D8Qdq=^fkoE24U?Gwcg7FF?LsS(qBp9pfxjBaD94%6B^UN3 z`t+0V7!7(!2Ko%Ej$A6pW-d!zzAYjuX%?*lEICV3r@{Z9bHe9;%}iu=N#?oRxZ ze~Es!=y}T=d#ki1&ob~+&Ky?1|MJsCmh6(SCk|7BK&e=M`_Y)BOLp1V*fNNT;U&r+Rk1jTYvH)LX=ETeY+pjmf zC;Hh|$HU*a2JWC7qQz?e1iFbIf4^gXV2?MdNA;AP1{XT|sA624ri?IWSC})S@{p_b zX_P}2uUS2VUJ}$LxOVG*St-R5Is5azonCsHJ|yuZo-GMaJy;_w;%(Gh&`v{pyp`k% z9}r_NQXTW5cI+C>^XYq&jFI&cj4n_~0gvW}yCP(7tksG4wVJqXx!kgAMz8HK;HU(_ z!p&635ux^N7Z;H~pE?SNBN7uQCZ3fiQl_MF-~PI&YRqBU+z@$lxi2vN=TC2EXM~9+ zhZR7H1phUpiR*9~feW%L+}+T1Or)68qew}M%;@3Vwo$q3&5g(UuS|%(FjLy*9VcDW zFpbf4D^TLTN zt*yy3MF80IfzTL?h^mpapp$Cb9WQV1-`5*Mk4+>pNFeBq%(iAAY|JyI$$N96-=_=2 z0Jzf7)-zchpyK6?5<;e)HN|06UFx#HW;EK0-VW?u=!usvmc~p&iTxKlUqyKmKlxV0 z%onwnj8q6L2zwo}$DV$zW7AHR>KFlSdB>6b1tE&+?R|I5Y9}onkj5oQD;mZ4g{P3j zFsOg0zpq?iM0Y-aL0ja-O=%08O1|PnbC@Jn{PF<(uo|=Dl$n&H&qYf}FqTwe zs(UZF>rUP9NUus*Ca<@{EO~+>own-x+|)WNwk(d!JN%=^ntBp96Dg;j&gWEn^Q{>f zOsfm-VM4XVQg&RgtQorOD#*>>^3lifrAGu8cW<(Y>DQFric_ki9h&$8cWq70$mZr6 zk`rL6Fy;?`NL_@%_RFEpoP)ea+Yfu0)kcrMBp8>a8G ziPncDe0SqGX;Wqp{#6o;IWKkOMswYNgok<%&+91)Khz#Sp?va<$Vbqnrn5h;pUNF5 zlz^J9W#C8D+I6KNc2KwSJN;q~1UW3(WsI02C z_#HLh`W^p=Fi#ccNL_BL<)OdGqCD+-L(sGG2G%IfMSB>fUlrJ6MBQWWMfc5;NwqH{ zwr7+J8<6i-ToxPZOvf6xhU)y!`!dFY@t1(`YIrszJqCaIx5<)SV0F&ZnjwK8=_4k7 ztu_{>Ys~*4q|(@1>sroqG3eu+VK{oSDaJ&cKwL>gLAa2@LGL}wjA}FPuqrLC4sKW# zCyMTr=-a+|^~?1&lfaU+l0y~(Oj=TR>pA1{9!Y5&WDS$)H(T#Akins+N1-)GALZb( zW-6*R=k%TR^Il_)-C~jS)?Tg7I%ea2)p`3!o@|uU*BAlQs<-)MliTJ+|D~QU`EB1l z+O2*f7C}CsdUDO@jmN<>IGOmSQPWA_YjtHV3;&C*U}aSs!%<{Rd`mV!b%npbgk6uC z=uxny&iuAkJ>CQA&_v9DGk`V?q2hlhy&$8xEEPmlC=*J3*@AtKOPQt}OosRd! z_N4lAwn3G&nYa8%5FW~X|5XkhT1Cuk`Ue_sIxEUjA;eWDouJf|UHvn|Z#&gCkEu5? z;w8A4SR3c^@;b=+-FCROQx^PC^d!$_L>B3Syhyn2{TajSI;z^-2CsddgH+&B2%^j zRu#?iejv1IZYo|=a@RTNsTI=uR)QJ}p~;(b_`y)k=S1$DTS@uyg~$@-I=f{7J>J6zF&8K5;ESn_uEWcTUe~n~$|QMO?i^ zrUv}rhGG&@zl(wDssu@)d3XDBl>W)5n)z$7)R_pN15^=*>}t7`$XaiagOKUQCtlET zyySGExRWsi<)6dHJTka5^HcDTjt35ZS|v;@zG+`g)!2p&?y&509b=*IUDQ zX$0Eil#s!0@KCmcUgE^vU_BzXI*nMaZ5S;N4js!N<>H(b{RR3WaK6^)eawe?hS7KB zQeyn__DtO-uZ#CFMJF(4uKA0dKyvzb2n0fj@?W122yTfmx3E;PFHs}jdWofM`8+}9 z>Jb~cWg#=N=SPx`>XU9s7?n}Ido^us3QHKM-SXOVlV>;T*GSBsv8P+go9zrJX3<^%Bk1?2n+5y`F_Z{aYVY^b(7`Eil*# zAMZgKdui#C!=%LQQu&i}2HGJss(RY-$fQ4%ctOBsG-p7cm-k2gCpn_+_f@(T=dm)0 za1pGYY_?4pGBNLNYq0e-qzkV*aD9?3crvLpNh|yD3YXZznOapd3dt|&nTo-}iXTY^ zq)JPN+~cTnAKfoKD7Cs~%OWNt!#&sJc`|J#7;Dw$-s2oJ`gcZVAfG|`GqH6rWCKfo zWn&Y>UxP1~;h}#G>BQ@t8mB^=)yUI(fa|7;`VmH`VxH`0!3HMRvWg3xNA1^k8&}oG z?eRYAa6s*`Kh$$+YNYvaGd7;_cwh0Ra>WEtW|yL7bZC&yzhO8j63yczGzE7Jc9m7N zr9uyn$3Z;synmwb_+AdSD55eg{pPD}HQ8zyARsFT3SJTBvS?P`nc!xik{`|W)uTuq z5uPU@^Glac8%Pokn-pDAt#1|k_0~%BaRc$HF4uj?wE4A;43^e4*wr>;kw zgJz1r5DqF+9{emHy}EBmu2xekCPC^w!<1Hb@)7K#PQSx)qQiuJ;PAo%+m%21L2;WT z&$&@qY|hDU7ABH~q@~}fum`VV$48;n?bqK;%O`5WZbFUApZ#)uxHH#8*r13*T6ZS3iP^f_SZ(lGZjjoVjis<{1GGBCHc#41b?+uuE{ z{aZ|ZNPFz5yOyYWmYs`ygWiSafRC7TxOdHsq^0r29xsbJw)>o)U~a?%ja1$Q00H+x;WO10K7j3?J8nuqy?U%w!K$#_Lnw1%gFy8TdICa*t{hg2Qwn_c; zFIGmkr2IpZn}e^N&KGOK3+gy=|HlRGUMp&NnO2_YVN{GHE!|5=j^75dS@NMi=S$el zn~`7WlU+oWc3pu08(<7#2SI}9A%Ouh%+I)in#A-vo zL`K2zvh|ooaYFy5C<_IF9z`fiBX4UoxYQl*{W>O79>{@9k0@e$3iZVMAL!YqN# zPZqY^t+S$U#?h?T*Kij^ZhS8bxi{t-mTrJBBJEoGdCHhdM4(n&=SW`%FwWG7SO#qb z!!r(l;~%$XkTH%I|4sI6St-*WUyotISb(nrmRJa_=OdO2n3u|YU5-=KY>s)3ulwAv6L*Sn5?leOCV#XIC21f~vGswZMzRpx>vo%2z#I^;v^ zM;Mt^^#yXIBqeE*N~CT9daghXkYo(Q1?0b_kdZ&12{13lKtMM1lz9)KUMVJjPlM#c z?x(@?SRscG{w2zMAh^TXpE!>d2Wp_3nHuNj1_ zG8w51!-azH5NfIr2JY1MU5YYV^Li`~4=1wIGx}F$I{aywl+UEvI)8f8{@eGR^dZ3?wKQ{ zpN1%PSO|6z@5dEQt~Y6-IRAhisUDJ~@4+XlKdmN08J?bjq>+#DfR%`Dpg)L7liuYC zb!?BlA4&SEa}aH`1W7g0?Ca0QH2Chvjd`wudKe(R54wAC;4P(wE3`Wd>1Jdv8)=iJX%FN3W(hy67stsu!TS4zq_;0zQ8-~`ADU~ z0%v_*QNo2!K?L8)jFv3iTmcJ`r{Cg*>%hjQ$w;ze&9Pu3dnWI%U%eti^2x>K`tg(< zfhqN}r*eOu0mTKe0ytRpmiD9+U=LSRfIYM-(NVb@or@2!9yQfMkkdbE^4a1nz?FHv ztT7A#TXJ;X$Z{S_3vHoEIqKDXE$5Rws4OfZ<a~qCzhzvEEYZr5!@;>YpBTKJn7VRdKdBe$ zB{AL60|mPG_jF$!VU(pIue1skQ9>BqL-S`46z4pMz*}yK)?CFnS3vAv_2j3$iGrkp z(HGNiHD4P)WZZtpMXt>Lb>$Il{*%c8bquqM2oAvu&*SjBfX5&ND|+qwY!g?`%81Vv zm$NuC1p)U}57iN+-9Mx}t!T=g)K??brxV8D`=R0-5iza{0LxcO#K$$U{zmZ4Wx3h>cE&d5z-m@v5Y zNqP}nA|2u`a70KJhk#K#g11Uu45ZvK9&5xaaz3ju;F@$N^dsU;p?9k_KAC~TAoH$GRxkmu8Zr7{Nb_!d>EE(492;s@t{0s zfigFE*#QfyW8v&}xgn-xBTO_mmHsPwgm&v!IhLbbjfKMpw5K;I@x$PGC=Aj|^P|7P zPf8G_yNUn4hIU{4&1J9beKI4zb zCa$oLx7=m6@5v6z)9X9cp@}iC=1`_*$O2rY|iB$Waj^%{5?>|3A)J<(KHB8y$Tn)B`TS&C> z&6}mt4uK3R(+w+44R+TMdM>lqB_DfI0hFzJ&n$#jTM5B#uCIV(9dNLy+;K(GpU32t zaxVfw4(#C=y)po51!iW*0Iow$gkJ+BV<2=`ZWn$hDeR0)ME zPRqtMy=2$pwn9jZK5K`oAee3_ct**Igr{qB{4?+HOuyx)S@;Eyy^ZUKjm(C2!5Z4` zkTK>-@dw_%nZVKvo5v10`E=@5lR1)`04+ZQ44L=T5Ww^NF{ZueYgoq;Iy^v^#XH^G ztJa~r;4b;vUmnzQG+8nkJn=A7d@tq5==0m+tno=Gp&v}%?*&8iQLHnfPDo5&ge{Fp zCkeX6R3XRo6oWANHwTOUT1yO$b%tkjAGP1o?k3)25LXug(Qc!Blih0GOJv&podYq4 zYcJ_k_`u0$xy8L6vDk|+sSSSq3j4$PwUugz}rF z;*?k`7Q6O^g6Y|4C`@QD@#_NUAA4dNi0h15JDC^EJ-?Xk7JoC?RwZW~i{;1edjL_p z)Tc=C`=%T1LGtzYnh1R7hUd%G=FR?zx(CziA|PcR@Okm|+~1pP8cEVDMhKqnFPw57 z$mS)oCpj~bWd)Kux&4WYavjTILEj$|Wn?BDN$k>yOG$&DGVR64XU_zRQ2Tm&gF4XJIT=@EhVEQrC}id z>-YDseeUkPJ3HsR=brPv=Xsy!#^~v&l9Mo!fIuK}bv1|qaGeFdpNI&6v#Wld5^%xy zR8}`40zPkvY@$IRmKAk~l96xL-V4hTXrJHh-u_&$!PotEk(QsCij{1ip?YjZkCYjl zSEFL#yhZ~m_>K=9-wSiFxo63D3*I^ZY=V1U7-1BhrbzTfh$mF?ohv?q) zD_1^F1P#6TX-56q`$l`qu6vTHQlvw2D4oF5Q)*q7dq9`hzef_E&g3W@GpA0GU}R_i z7M}d=iK8EP7Jq$n^=7+1{uQhtMG*NA$>~4xEXb&R!v2;YzE5lyTUf|hzUd_v@+Hbm zjIsJaf|0y#!KL^VF%{mavkAVe_?^G-_c$SvEiFc>y0x|Jbcu%?za-$ob8|%f;7O*o zEi-hckJI^g{^Z{{kW*Ov;dn`i;HVcHuL!kqLEL2cfPYXnOHg3o3yTB+tsT#+69>?@ z_y-aokZJJQj=GEs2o!V@ZUG8$9D13l9_T?{6iO}6s4wM&>`{3xw>3STG6B)TgLs)Z z#WIs`OVaT9wYIMgg7I!tF$%X8!Z?cO{*!jeIxQv&K%j$paBO)T}W5!Ae?V zwb{I!efyR3N+F)Oo}9nn7_CUt7@NLMis-0d{+u&`^*2&_flqVSOvIGLI2cAP66%pF!y7R2QGXA2UHWvA^vKArwI;S%b>y2s59S!Fs6B##2%q5Ta zu}Pqq(V;*jMW*&VJO{UQDG!CGYbEq#% z^7wruyBY0#d3L0ESkTzvMyA`lUiq1d7jbn);t~?C_G#eNLin1z+^Pmrk3BB`cz8fN z-ufApO?|AXc+o2U+q>0wyD(KmsjivZ3@IfA;q#tryH{gP2bS;=uvFkC>;d=otPiHD zdeX-=sa3rgAA%(@w>}>a7+W6|r3-_ruVaYN(e7{J5{%2zJTLu^9LT&ckJim#zf3Iy zpEPXvUmUJ}q#vgvRjMlR^q?{^g^@Ma*!E>lXs@>dqruR;M0$8I$$0Z$c*X$HOY9Y( zC(f81AD#Mnaeg%@X|NG7T1jXan#JVV%;Jprv=APPYpI*ViwA0GY{UWa@$rE|EF{hg zI??NyXkAhp##k+gengZ21wRVtDfZds8gAu_R=PH82M6NJ%*=sh%+cDQE)Dp2%v;MF zPFw`^HXaRQ#E&?3tZ8<&qGZoo*}q9bIH);j-2 zFqEB~oIG}rnvzmgQxmq~_P@<@V-QT91fqiTe@};phf9?@eoHi8UmP8)B}hfa)5o{j zifw$#kpT+-Pw$3;89IkfNLX7qm%^|bh2pMyoznRBf*tsS~36g=MR6Kh*qBiotwFLx{o6WG)1^o*`C&@zxeT5 zU>Vlo!qK<4&{&TtF%jrI8sK}*cruX8$L=ABkJ5r?8f)C!%^39IUM4WDfIiBS_4Dxh z)lK}fJ;3y0D29f+4lI=y6nwt_;%CbnCk;=#@5$S^*I|R+PTXc5OJ*-99HbE5qT^xG zV}Wi0!G6Ef&%&9ndn|+GL}ajeV4xg7PB|y(A>m4jjWhj}Qb5EiM-tN!2Yo~Rw$2jXR;Umr@DA-BN;7Cc?bRQ#n`OuYZ$MTz#FHgRjsA&yaV31px?XygA8`% zD56H!McypQ*H-xbo6RA@e|`Z2rwU7F+q*&8k%Ohnp7bQV^J*(E+Ch0${W-ZrY?-|a zzPWq|+L^%S-V$68CH^wO`-a11_FT^XV~m=bzozM&UGS~}vUh$Q{#9&L27321W0|XW zFFSz9@U`vZ{D53owjj-G;P#=pHBk8Jst`LacsPtHDnvmnng$vYwMnlV8rr5aW|#%c zJ(}nJV4VNK`fL6liY%VJ_GuCe-8s|EfS!yr zaSW27Z1mF24mulMPL}w6t3mZN-6r8BOM;A1Z~RTb^(!?uwiu5mIR!o$ANY^)4Fgt( zh*BEp%V2@xhZ8stN?6*9e-2DV62y4aWcda8wY@sAA(LEsdgaL>%YnaA@vrfH)j8Ka zh9sbM+?C?|UV~TTvwIU0@Pg2}uT6W?I{p0kXUxoPe2d9%5ns)}t6)_TaZKVB(RLa& zLp1!43JOuaQMkd(L^9ITGc(!J@(>-mdmE^@lBX5kPK39Y%QHZ75C`NE`AFp^MyJ7N z9D}kbGo)8j0P^(zd9E=FflIC`$O{;Tk&y( zthZJoy$-*6`&hLWQ{$hgur|2_8m-MY!5~RjX^vIq2q#M&S)^?a+?nz%kV=SU4u2p% z{u{6mvwn-2sQmX?(1 zLXB?A0w6Tz|BE3HkDu5RM|QppP5cxaFP-JZcHK(44V~~mT;RfW4KR1q;|XMv@uf&N z8vRnEg5&QV*pF9R+!SBaYFjm7_n|;Dkh?)I*OpPN7l$|O*C?uvgQ$Ve3O4(?3iLm7 zp;&CPLh6iQm`yqxL*+}N0!Ig}s``4)Kvg3hiX{&9LC6sMyNVc|Fvq*;`lZ%!OK54wQUw?J6P5K}o*_iuM-c=riT#HTaMlL}R zKh6WmqN>GhsPoMD^UO#N5O<3``(;r^q;#P++!H!4lhFEc%wsH$_h<>7gfMiX{VpEpvwJ8}Z9&OQTw{kzCk zJ;wLi5?ndvlx9i9O;}d&M#|%;3ELgyF-m{ncx^BTjyGHfBL9c>+V_WcoiF*{pQ#s_n$malP{* z)15g>Ip3tdyHEWE!Xk2HZsdbjcWy_OFmFmM4_(~ax5Wub=?)|Q1a1WPG1OYym`pi; z3o1rQ$C;|SL0ptXPaQpi#@Q-&96_*XEp#qkY4I(;JHXmA`H^tC$tD_S+2bZFOQ+)u*``{PHg&E}bh=@*zUA3e*4eq?^{@j^?Du25>}vNB0$ zXVNTg1P46GU&xU*LYJi<-TLs;qnflN>uHBcyT_LAB&DQyTr8N7h3S?(ye^r0-dRNp zuFpafH%hR@BH2m#hAsD*EZcmkhwW%)DlHS+=qhFgO->Eauh?7M_<-hnZptEIq=PDF zLHC+Nh{!h_`xIw5Jd@{UjCClo8&=ytfh$Y4=8c}gx~{hR=@)&3Z?|~4qlnSa{R*&u zV=Ocz0$$N?+pdv=z1@GTYE8fQIf>SSbs@m8*C>7O{ui14_-iO^Y24 z+BN2?lMBDDPIv6Z7)wlZ$<1+VUP!+<$kjTkC7|D{1gG<*AxS~9G#=Y|xXa@6T}k(^ox9Cp}f6xGbyC(OgGLZ0(fjL zMlBVAsduky)}G~m=9v2m^kAsu@_jBo)aYQdk8f|9;>#oa_9o|B9%M5F>VYGyTnJ>! z5bHgj{a}$L3E#E!)WSZH`$1Q3_ZQzEPl9ON=oGF{k6onr0c-@5f4`M6s~xLP3V%Yq zy~vSU_s|Wu=MJX&&7F5$yi5CNS%JUS- zA)4NmeE0p0&;{isrc?w34+z)=Tbi5WfPS_#(_ghazM^HW%J`r*7$j80Wi@{c*RP5x z7>g|Fa&DB*oU6&^SWqYjc``F(Mgv@h)c-R8%FeE?8j;X8-|;k}>nQfWddNXE&a9ts zk`STxPM0oD*6oIAQCr5^aX`!rw~OHZSGWz>)y>V?$A`Y$gwKmSjm2y}2(HgX=P=FT z>G8F)*;C~3gNgx%IcsWFsjf*|lX_P_1pQruBrqKac+(+IW}J3h-Zoxd%b za|8a&AF_CQAK?LHt2m2^-}&b?znQlG)yeiFK`?unl$2dI)_VHLw%@TG+SQM)K6uQO z7zoK2oLYflRNlwQa`#<_4x@!f)tp&|dKh$!D9ziE{b+=dP8_r&NGHKhm7lwh|L^#h zn0Z6XK)LZOrt8=j;%@;za*VlPj};nd%<6nXtJJNEv^>(Z_! zCoEo<$7GaLo7oG#8|!R&uw=2wUUi#}Kk?A>E>C0U6%O=zpW18ZLtwt}MZnOxJZocL zBZ1qHp>UPRt6GjEcE_(pU{f{=(G1v0P{T;gavXdj+*Ovw+b=G`6rghDpwac#B!$Go zkgZcOhzOl?VozrDZs5IUFW$5tkXl#Dfq_@Yj{Re;ltODd~czskROgJsp22?ct zwsd6fmTdA=O#SiR*q)M#ri2k{M0!xp#h!ya6br!Y9V} zD^|AlcY)NDYZ5TDk-$4^-Uk_2XN8kLb5|0Xv3oghEtK9&b8q*nHF*7KavXlpc05vI zQnq@y+67!nrW_@`wx}HI89NRm1;3pKdPy^%U;}0SPly&>>9chRfirNpbzBxrotM4G z^iMRQIi1_=zrZ&O+I_yPUf_1y!y# z>vorfR7)=LWCuO%Yv^wym{bo)G15u+@IKmCYYyOz*>4|I**u~p;h`l7H8J9hV2Jp8-aK==>+&;H1Ia(IcoBaT;1zarU2jGU;+bo|ofC+qa|B=(C%H;9x+R z&?`65ubcr6JVC2MgV0Ss-y;mMbT&nftRJ$2UYLCL*(4r%9i!%ma1c<)?rAMRs69YT zT1zs$1ENE6SJ9tZWo!S!&jMH&oEyj2!fgHph-!qb4eeV3hFRWAq%asi<&#w#5KQ=0- z3|e)@(H=QQ&i!B|h93l@qfB}Ne~mD~p8L1M z$(~`pOgVz6puxcMoSmJ8H494bpZZT9iRxArd@!MGxvgeFKvU%oo_EM^_(f^5K<-Yb zE6vBszHf&KvY9q6sB|u?R?f&U;6EHq*@aE}G;s+26B_%S*Co0PUoY?+tTmr7@On-R)U(j|#LSK>5-a*8u6?uOcbgwZzo_+tO^G-5R%bsP~ z6mHlUhw#oijW*F_E$Z#ea(g^=h(}Mj=^wp~zime+^&UN4!>0AQYc z)(x7{ez(noI>%JGxh=R7DzLisn}j417YKfy6vU|*l7HeI7;xcTD*nOo6LBgBDwt=r z-Df9m!Ud)AR&{xYK0uSf#KZ%tW~eJRX|6YH%3eQ59&FY8>+?^+)xrn2pE-}GcLd>; z3LytrC3p8i17aH*bbi0eD8R59n*U2^3L~R;m6?`+98#l1P$)ti~GL5?z!S zS0`phmqjKLuWl{K=FDq{j#GGB|h>K?{|Jkh@ZS3OE?;*RMj3BHnsD{sLc4| z;QE;8*S8?l#rrAubP?(|Y#t;wi*Y5f5S(4`BQJKH`op;)@s>%KTVPWJQ_JM`$VmBe zL&{CU53n?<@8nTuT=)+!>z|VY4uO$mpM!9K#R@qNWd&up@&s&(lF_PGt$C*O>S^JC zdQ%J<2|ngCgbn|>Z13Ko@geKoM6Vpb(z79OpaehfTxLx~{j#qLO++opqbOMA-)j_# zB>RU9px`0EU5c?ll$wMoK3=yUbU`FwoO8}Asw6`-D^FEVabO;pL`M%K_L zDRrSn<-N#|U2FHqPh!(9&;0+eC2oHdXX1Zs=`S<)so_A(*6JMjZeGRQKx%tZ=e|Kh z4J>1CdC$98OX2Jxcl`I(!AF=WBkFeOqsr2MY~V@hbh^lYuOI~5Cy&ec@iE&k62m*x-P;aaj0@@Hq)=s#2e zNlv@%?SDZG@nZ+)Ppt)(O21FXXW!=Sq;oU4-L0ssj2hAQ@TjwpxtPjkjjE6f=DHL% zPZ0i9ce~b?_;mAYS=LS3CFY3@IN{mDk9;f%6%|1A5Z#cU5lqf-afU7_DfP*k4fphN zO`HzVykAzPQ}e;=kX_7_b2cET%2D=CSI|D2n0-%~n77WGKTdS(eeJw;p0jypQ_QXB zomq7etay@GHVI+{_{fJI6}ud`tWBmucckk?rh>~Y*Ec@@2>$k%wtw5cAyfI z!IEjd67S=Qf;yLAi!m#-e|v&QGn4Z-Q-Rdi7l$utN$$u7T}xtu2r)YGP5or3iFdA) z&rALPwUR~uNBmusTA!y3uCuwPR*du7PM;JUM{4@hB+osGvG>1$8&cN)Cxk4VHQr(E z=q{#!*V9qQZnQ($MDdeWe>Qs>&OkBcfM4U$2n)t*cUajuu$wLde9B`-pz%&rLnc3FmZJ)PwP9t<&~CRoBx0|K_ZuYiY` zZ|HnnBpWd+@gS;;oi|zIgKBtRC`Xz-SqkP%rFI&04EtAu=P*Ug01@|a_Z(|z@qijS z6xsax%;G;;xA%9AdtUPmoN%+VUidUq&(6}4g;&Mz-sO2C;I^3B+^C%3ze7F|=B}Qz zN@v0Oj=@*At>@duWo{?H3%!RLOd7(`Q54K1R(Bm72J=-D!-%eRifOtZ&i5+Y!NQv} z&VPN*JmFFmQS&70efGU}O=!XjgIQ^RM`)F3=gp#ppOnP}axb`mZpm6YrwdFt2YZ*2 zNJ-9K3XL9*ZF_}vOGiZB505c;g-4_%o1NBG0_0xU<0r7%NLOsDM)n9zr1qV@3T3;b fS&(Zl{FV~clO|KYT;l`0`v$42=s+rz;bH#^EnuQq