From 9fa148c2181ba6af72818cd6a7d8a14ad0926541 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+ballofenergy1@users.noreply.github.com> Date: Sun, 12 Jan 2025 19:21:17 -0600 Subject: [PATCH 1/6] just in case I disappear, here's particle threading and crate backpacks, along with spider crates, though opening a spider crate in the inventory will not spawn spiders yet. --- .../api/hbm/energymk2/IEnergyProviderMK2.java | 18 +- .../api/hbm/energymk2/IEnergyReceiverMK2.java | 28 +- .../java/api/hbm/fluid/IFluidConnector.java | 30 +- src/main/java/api/hbm/fluid/IFluidUser.java | 52 +-- src/main/java/com/hbm/blocks/ModBlocks.java | 16 +- .../com/hbm/blocks/bomb/BlockCrashedBomb.java | 6 +- .../com/hbm/blocks/bomb/BlockVolcano.java | 92 ++--- .../com/hbm/blocks/generic/BlockEmitter.java | 4 +- .../hbm/blocks/generic/BlockStorageCrate.java | 128 ++++--- .../com/hbm/blocks/generic/PartEmitter.java | 24 +- .../blocks/machine/MachineICFController.java | 4 +- .../blocks/machine/MachinePWRController.java | 4 +- .../hbm/blocks/machine/ZirnoxDestroyed.java | 22 +- .../machine/rbmk/RBMKDebrisBurning.java | 16 +- .../machine/rbmk/RBMKDebrisRadiating.java | 52 +-- .../com/hbm/entity/item/EntityFireworks.java | 20 +- .../hbm/entity/item/EntityMagnusCartus.java | 28 +- .../hbm/entity/logic/EntityDeathBlast.java | 20 +- .../entity/logic/EntityNukeExplosionMK3.java | 74 ++-- .../entity/missile/EntityMissileShuttle.java | 10 +- .../hbm/entity/mob/EntityCreeperNuclear.java | 12 +- .../hbm/entity/mob/EntityHunterChopper.java | 4 +- .../java/com/hbm/entity/mob/EntityPigeon.java | 52 +-- .../com/hbm/entity/mob/EntityQuackos.java | 12 +- .../com/hbm/entity/mob/EntityTaintCrab.java | 10 +- .../java/com/hbm/entity/mob/EntityUFO.java | 144 ++++---- .../hbm/entity/mob/glyphid/EntityGlyphid.java | 45 +-- .../mob/glyphid/EntityGlyphidNuclear.java | 19 +- .../entity/mob/siege/EntitySiegeCraft.java | 110 +++--- .../entity/projectile/EntityBombletZeta.java | 12 +- .../hbm/entity/projectile/EntityBoxcar.java | 10 +- .../entity/projectile/EntityBulletBaseNT.java | 154 ++++---- .../com/hbm/entity/projectile/EntityCog.java | 38 +- .../projectile/EntityDuchessGambit.java | 12 +- .../hbm/entity/projectile/EntitySawblade.java | 37 +- .../hbm/entity/projectile/EntityTorpedo.java | 12 +- .../com/hbm/explosion/ExplosionLarge.java | 94 ++--- .../com/hbm/explosion/ExplosionNukeSmall.java | 16 +- .../standard/ExplosionEffectAmat.java | 8 +- .../java/com/hbm/extprop/HbmLivingProps.java | 3 +- .../com/hbm/handler/EntityEffectHandler.java | 17 +- .../java/com/hbm/handler/WeaponAbility.java | 102 +++--- .../handler/guncfg/BulletConfigFactory.java | 176 ++++----- .../com/hbm/handler/guncfg/GunNPCFactory.java | 126 +++---- .../handler/threading/PacketThreading.java | 40 ++- .../container/ContainerCrateBase.java | 11 + .../container/ContainerCrateIron.java | 7 +- .../container/ContainerCrateTemplate.java | 9 +- .../container/ContainerCrateTungsten.java | 5 +- .../inventory/container/ContainerSafe.java | 7 +- .../com/hbm/inventory/gui/GUICrateIron.java | 20 +- .../hbm/inventory/gui/GUICrateTemplate.java | 18 +- .../hbm/inventory/gui/GUICrateTungsten.java | 37 +- .../java/com/hbm/inventory/gui/GUISafe.java | 14 +- .../com/hbm/items/armor/ArmorBJJetpack.java | 33 +- .../java/com/hbm/items/armor/ArmorDNT.java | 34 +- .../java/com/hbm/items/armor/ArmorDiesel.java | 14 +- .../com/hbm/items/armor/ItemModKnife.java | 34 +- .../java/com/hbm/items/armor/ItemModLens.java | 32 +- .../com/hbm/items/armor/JetpackBooster.java | 5 +- .../com/hbm/items/armor/JetpackBreak.java | 26 +- .../com/hbm/items/armor/JetpackRegular.java | 4 +- .../hbm/items/armor/JetpackVectorized.java | 4 +- .../items/block/ItemBlockStorageCrate.java | 272 ++++++++++++++ .../java/com/hbm/items/food/ItemLemon.java | 39 +- .../com/hbm/items/special/ItemCigarette.java | 18 +- .../com/hbm/items/tool/ItemBlowtorch.java | 70 ++-- .../java/com/hbm/items/tool/ItemBoltgun.java | 34 +- .../java/com/hbm/items/tool/ItemChainsaw.java | 12 +- .../com/hbm/items/tool/ItemPowerNetTool.java | 32 +- .../java/com/hbm/items/tool/ItemWandD.java | 69 ++-- .../com/hbm/items/weapon/ItemAmmoArty.java | 62 ++-- .../com/hbm/items/weapon/ItemAmmoHIMARS.java | 34 +- .../com/hbm/items/weapon/ItemCrucible.java | 56 +-- .../com/hbm/items/weapon/ItemGunBase.java | 337 +++++++++--------- .../weapon/sedna/factory/ConfettiUtil.java | 6 +- .../weapon/sedna/factory/Orchestras.java | 192 +++++----- .../sedna/factory/XFactoryCatapult.java | 36 +- .../weapon/sedna/factory/XFactoryEnergy.java | 28 +- .../weapon/sedna/factory/XFactoryFolly.java | 30 +- src/main/java/com/hbm/lib/HbmWorldGen.java | 3 + .../com/hbm/main/ModEventHandlerClient.java | 5 + .../java/com/hbm/main/NetworkHandler.java | 7 +- .../com/hbm/packet/PrecompiledPacket.java | 35 -- .../packet/threading/PrecompiledPacket.java | 9 + .../hbm/packet/threading/ThreadedPacket.java | 31 ++ .../packet/toclient/AuxParticlePacketNT.java | 52 +-- .../com/hbm/packet/toclient/BufPacket.java | 2 +- .../hbm/packet/toclient/ExtPropPacket.java | 2 +- .../hbm/particle/helper/IParticleCreator.java | 6 +- .../hbm/tileentity/TileEntityLoadedBase.java | 2 +- .../tileentity/bomb/TileEntityFireworks.java | 42 +-- .../hbm/tileentity/deco/TileEntityGeysir.java | 80 ++--- .../machine/TileEntityCrucible.java | 6 +- .../machine/TileEntityElectrolyser.java | 6 +- .../machine/TileEntityFoundryOutlet.java | 42 +-- .../machine/TileEntityFoundrySlagtap.java | 34 +- .../tileentity/machine/TileEntityHadron.java | 290 +++++++-------- .../hbm/tileentity/machine/TileEntityICF.java | 66 ++-- .../tileentity/machine/TileEntityITER.java | 184 +++++----- .../TileEntityMachineArcFurnaceLarge.java | 4 +- .../machine/TileEntityMachineArcWelder.java | 4 +- .../machine/TileEntityMachineAutosaw.java | 4 +- .../machine/TileEntityMachineOreSlopper.java | 4 +- .../TileEntityMachineRotaryFurnace.java | 102 +++--- .../TileEntityMachineSolderingStation.java | 4 +- .../machine/TileEntityMachineTurbofan.java | 8 +- .../tileentity/machine/TileEntitySawmill.java | 4 +- .../tileentity/machine/TileEntityWatz.java | 146 ++++---- .../machine/TileEntityZirnoxDestroyed.java | 18 +- .../machine/pile/TileEntityPileFuel.java | 4 +- .../machine/rbmk/TileEntityRBMKBase.java | 4 +- .../machine/storage/TileEntityCrateBase.java | 13 +- .../storage/TileEntityMachineFluidTank.java | 96 ++--- .../turret/TileEntityTurretArty.java | 156 ++++---- .../turret/TileEntityTurretBaseNT.java | 4 +- .../turret/TileEntityTurretChekhov.java | 56 +-- .../turret/TileEntityTurretFritz.java | 48 +-- .../turret/TileEntityTurretHoward.java | 60 ++-- .../turret/TileEntityTurretHowardDamaged.java | 32 +- .../turret/TileEntityTurretJeremy.java | 42 +-- .../turret/TileEntityTurretMaxwell.java | 4 +- .../turret/TileEntityTurretSentry.java | 4 +- .../turret/TileEntityTurretSentryDamaged.java | 32 +- .../turret/TileEntityTurretTauon.java | 4 +- src/main/java/com/hbm/util/ParticleUtil.java | 6 +- 126 files changed, 2838 insertions(+), 2483 deletions(-) create mode 100644 src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java delete mode 100644 src/main/java/com/hbm/packet/PrecompiledPacket.java create mode 100644 src/main/java/com/hbm/packet/threading/PrecompiledPacket.java create mode 100644 src/main/java/com/hbm/packet/threading/ThreadedPacket.java diff --git a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java index 6643e3fcd..e8c8cf09b 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java @@ -1,6 +1,6 @@ package api.hbm.energymk2; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.Compat; @@ -18,29 +18,29 @@ public interface IEnergyProviderMK2 extends IEnergyHandlerMK2 { public default void usePower(long power) { this.setPower(this.getPower() - power); } - + public default long getProviderSpeed() { return this.getMaxPower(); } - + public default void tryProvide(World world, int x, int y, int z, ForgeDirection dir) { TileEntity te = Compat.getTileStandard(world, x, y, z); boolean red = false; - + if(te instanceof IEnergyConductorMK2) { IEnergyConductorMK2 con = (IEnergyConductorMK2) te; if(con.canConnect(dir.getOpposite())) { - + PowerNode node = Nodespace.getNode(world, x, y, z); - + if(node != null && node.net != null) { node.net.addProvider(this); red = true; } } } - + if(te instanceof IEnergyReceiverMK2 && te != this) { IEnergyReceiverMK2 rec = (IEnergyReceiverMK2) te; if(rec.canConnect(dir.getOpposite())) { @@ -51,7 +51,7 @@ public interface IEnergyProviderMK2 extends IEnergyHandlerMK2 { this.usePower(toTransfer); } } - + if(particleDebug) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "network"); @@ -62,7 +62,7 @@ public interface IEnergyProviderMK2 extends IEnergyHandlerMK2 { data.setDouble("mX", dir.offsetX * (red ? 0.025 : 0.1)); data.setDouble("mY", dir.offsetY * (red ? 0.025 : 0.1)); data.setDouble("mZ", dir.offsetZ * (red ? 0.025 : 0.1)); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25)); } } } diff --git a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java index 6ff96df42..b41ef5b03 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java @@ -1,7 +1,7 @@ package api.hbm.energymk2; +import com.hbm.handler.threading.PacketThreading; import com.hbm.interfaces.NotableComments; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.Compat; @@ -26,28 +26,28 @@ public interface IEnergyReceiverMK2 extends IEnergyHandlerMK2 { this.setPower(this.getMaxPower()); return overshoot; } - + public default long getReceiverSpeed() { return this.getMaxPower(); } - + public default void trySubscribe(World world, int x, int y, int z, ForgeDirection dir) { TileEntity te = Compat.getTileStandard(world, x, y, z); boolean red = false; - + if(te instanceof IEnergyConductorMK2) { IEnergyConductorMK2 con = (IEnergyConductorMK2) te; if(!con.canConnect(dir.getOpposite())) return; - + PowerNode node = Nodespace.getNode(world, x, y, z); - + if(node != null && node.net != null) { node.net.addReceiver(this); red = true; } } - + if(particleDebug) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "network"); @@ -58,24 +58,24 @@ public interface IEnergyReceiverMK2 extends IEnergyHandlerMK2 { data.setDouble("mX", -dir.offsetX * (red ? 0.025 : 0.1)); data.setDouble("mY", -dir.offsetY * (red ? 0.025 : 0.1)); data.setDouble("mZ", -dir.offsetZ * (red ? 0.025 : 0.1)); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25)); } } - + public default void tryUnsubscribe(World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); - + if(te instanceof IEnergyConductorMK2) { IEnergyConductorMK2 con = (IEnergyConductorMK2) te; PowerNode node = con.createNode(); - + if(node != null && node.net != null) { node.net.removeReceiver(this); } } } - + /** * Project MKUltra was an illegal human experiments program designed and undertaken by the U.S. Central Intelligence Agency (CIA) * to develop procedures and identify drugs that could be used during interrogations to weaken people and force confessions through @@ -94,12 +94,12 @@ public interface IEnergyReceiverMK2 extends IEnergyHandlerMK2 { * by CIA Director Richard Helms's order that all MKUltra files be destroyed in 1973; the Church Committee and Rockefeller Commission * investigations relied on the sworn testimony of direct participants and on the small number of documents that survived Helms's order. * In 1977, a Freedom of Information Act request uncovered a cache of 20,000 documents relating to MKUltra, which led to Senate hearings. - * Some surviving information about MKUltra was declassified in 2001. + * Some surviving information about MKUltra was declassified in 2001. * */ public default ConnectionPriority getPriority() { return ConnectionPriority.NORMAL; } - + /** More is better-er */ public enum ConnectionPriority { LOWEST, diff --git a/src/main/java/api/hbm/fluid/IFluidConnector.java b/src/main/java/api/hbm/fluid/IFluidConnector.java index e299938c1..a29d6942f 100644 --- a/src/main/java/api/hbm/fluid/IFluidConnector.java +++ b/src/main/java/api/hbm/fluid/IFluidConnector.java @@ -1,7 +1,7 @@ package api.hbm.fluid; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.fluid.FluidType; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.Compat; @@ -13,14 +13,14 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public interface IFluidConnector extends ILoadedTile { - + /** * Returns the amount of fluid that remains * @param power * @return */ public long transferFluid(FluidType type, int pressure, long fluid); - + /** * Whether the given side can be connected to * @param dir @@ -29,14 +29,14 @@ public interface IFluidConnector extends ILoadedTile { public default boolean canConnect(FluidType type, ForgeDirection dir) { return dir != ForgeDirection.UNKNOWN; } - + /** * Returns the amount of fluid that this machine is able to receive * @param type * @return */ public long getDemand(FluidType type, int pressure); - + /** * Basic implementation of subscribing to a nearby power grid * @param world @@ -48,20 +48,20 @@ public interface IFluidConnector extends ILoadedTile { TileEntity te = Compat.getTileStandard(world, x, y, z); boolean red = false; - + if(te instanceof IFluidConductor) { IFluidConductor con = (IFluidConductor) te; - + if(!con.canConnect(type, dir)) return; - + if(con.getPipeNet(type) != null && !con.getPipeNet(type).isSubscribed(this)) con.getPipeNet(type).subscribe(this); - + if(con.getPipeNet(type) != null) red = true; } - + if(particleDebug) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "network"); @@ -73,21 +73,21 @@ public interface IFluidConnector extends ILoadedTile { data.setDouble("mX", -dir.offsetX * (red ? 0.025 : 0.1)); data.setDouble("mY", -dir.offsetY * (red ? 0.025 : 0.1)); data.setDouble("mZ", -dir.offsetZ * (red ? 0.025 : 0.1)); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25)); } } - + public default void tryUnsubscribe(FluidType type, World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); - + if(te instanceof IFluidConductor) { IFluidConductor con = (IFluidConductor) te; - + if(con.getPipeNet(type) != null && con.getPipeNet(type).isSubscribed(this)) con.getPipeNet(type).unsubscribe(this); } } - + public static final boolean particleDebug = false; } diff --git a/src/main/java/api/hbm/fluid/IFluidUser.java b/src/main/java/api/hbm/fluid/IFluidUser.java index 3f5ab4f95..d5c10a3a7 100644 --- a/src/main/java/api/hbm/fluid/IFluidUser.java +++ b/src/main/java/api/hbm/fluid/IFluidUser.java @@ -1,8 +1,8 @@ package api.hbm.fluid; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.tank.FluidTank; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.Compat; @@ -13,32 +13,32 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public interface IFluidUser extends IFluidConnector { - + public default void sendFluid(FluidTank tank, World world, int x, int y, int z, ForgeDirection dir) { sendFluid(tank.getTankType(), tank.getPressure(), world, x, y, z, dir); } - + public default void sendFluid(FluidType type, int pressure, World world, int x, int y, int z, ForgeDirection dir) { - + TileEntity te = world.getTileEntity(x, y, z); boolean wasSubscribed = false; boolean red = false; - + if(te instanceof IFluidConductor) { IFluidConductor con = (IFluidConductor) te; - + if(con.getPipeNet(type) != null && con.getPipeNet(type).isSubscribed(this)) { con.getPipeNet(type).unsubscribe(this); wasSubscribed = true; } } - + if(te instanceof IFluidConnector) { IFluidConnector con = (IFluidConnector) te; - + if(con.canConnect(type, dir.getOpposite())) { long toSend = this.getTotalFluidForSend(type, pressure); - + if(toSend > 0) { long transfer = toSend - con.transferFluid(type, pressure, toSend); this.removeFluidForTransfer(type, pressure, transfer); @@ -46,15 +46,15 @@ public interface IFluidUser extends IFluidConnector { red = true; } } - + if(wasSubscribed && te instanceof IFluidConductor) { IFluidConductor con = (IFluidConductor) te; - + if(con.getPipeNet(type) != null && !con.getPipeNet(type).isSubscribed(this)) { con.getPipeNet(type).subscribe(this); } } - + if(particleDebug) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "network"); @@ -66,25 +66,25 @@ public interface IFluidUser extends IFluidConnector { data.setDouble("mX", dir.offsetX * (red ? 0.025 : 0.1)); data.setDouble("mY", dir.offsetY * (red ? 0.025 : 0.1)); data.setDouble("mZ", dir.offsetZ * (red ? 0.025 : 0.1)); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25)); } } - + public static IPipeNet getPipeNet(World world, int x, int y, int z, FluidType type) { TileEntity te = Compat.getTileStandard(world, x, y, z); - + if(te instanceof IFluidConductor) { IFluidConductor con = (IFluidConductor) te; - + if(con.getPipeNet(type) != null) { return con.getPipeNet(type); } } - + return null; } - + /** Use more common conPos method instead */ @Deprecated public default void sendFluidToAll(FluidTank tank, TileEntity te) { sendFluidToAll(tank.getTankType(), tank.getPressure(), te); @@ -92,7 +92,7 @@ public interface IFluidUser extends IFluidConnector { /** Use more common conPos method instead */ @Deprecated public default void sendFluidToAll(FluidType type, int pressure, TileEntity te) { - + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { sendFluid(type, pressure, te.getWorldObj(), te.xCoord + dir.offsetX, te.yCoord + dir.offsetY, te.zCoord + dir.offsetZ, dir); } @@ -100,27 +100,27 @@ public interface IFluidUser extends IFluidConnector { public default long getTotalFluidForSend(FluidType type, int pressure) { return 0; } public default void removeFluidForTransfer(FluidType type, int pressure, long amount) { } - + public default void subscribeToAllAround(FluidType type, TileEntity te) { subscribeToAllAround(type, te.getWorldObj(), te.xCoord, te.yCoord, te.zCoord); } - + public default void subscribeToAllAround(FluidType type, World world, int x, int y, int z) { - + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.trySubscribe(type, world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir); } - + public default void unsubscribeToAllAround(FluidType type, TileEntity te) { unsubscribeToAllAround(type, te.getWorldObj(), te.xCoord, te.yCoord, te.zCoord); } - + public default void unsubscribeToAllAround(FluidType type, World world, int x, int y, int z) { - + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.tryUnsubscribe(type, world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); } - + /** * Returns all internal tanks of this tile. Not used by the fluid network, it should only be used for display purposes or edge cases that can't be solved otherwise. * The array is either composed of the original tank or outright the original tank array, so changes done to this array will extend to the IFluidUser. diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 0d98fee5b..a66ca7ccc 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1640,7 +1640,7 @@ public class ModBlocks { plant_dead = new BlockDeadPlant().setBlockName("plant_dead").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.0F); reeds = new BlockReeds().setBlockName("plant_reeds").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.0F); vine_phosphor = new BlockHangingVine(thick_foliage).setBlockName("vine_phosphor").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.5F); - + waste_earth = new WasteEarth(Material.ground, true).setBlockName("waste_earth").setStepSound(Block.soundTypeGrass).setCreativeTab(MainRegistry.blockTab).setHardness(0.6F).setBlockTextureName(RefStrings.MODID + ":waste_earth"); waste_mycelium = new WasteEarth(Material.ground, true).setBlockName("waste_mycelium").setStepSound(Block.soundTypeGrass).setLightLevel(1F).setCreativeTab(MainRegistry.blockTab).setHardness(0.6F).setBlockTextureName(RefStrings.MODID + ":waste_mycelium_side"); waste_trinitite = new BlockOre(Material.sand).noFortune().setBlockName("waste_trinitite").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setResistance(2.5F).setBlockTextureName(RefStrings.MODID + ":waste_trinitite"); @@ -2936,13 +2936,13 @@ public class ModBlocks { GameRegistry.registerBlock(water_door, water_door.getUnlocalizedName()); //Crates - register(crate_iron); - register(crate_steel); - register(crate_desh); - register(crate_tungsten); - register(crate_template); - register(safe); - register(mass_storage); + register(crate_iron, ItemBlockStorageCrate.class); + register(crate_steel, ItemBlockStorageCrate.class); + register(crate_desh, ItemBlockStorageCrate.class); + register(crate_tungsten, ItemBlockStorageCrate.class); + register(crate_template, ItemBlockStorageCrate.class); + register(safe, ItemBlockStorageCrate.class); + register(mass_storage, ItemBlockStorageCrate.class); //Junk GameRegistry.registerBlock(boxcar, boxcar.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/bomb/BlockCrashedBomb.java b/src/main/java/com/hbm/blocks/bomb/BlockCrashedBomb.java index f2a3f7783..0e2888929 100644 --- a/src/main/java/com/hbm/blocks/bomb/BlockCrashedBomb.java +++ b/src/main/java/com/hbm/blocks/bomb/BlockCrashedBomb.java @@ -5,9 +5,9 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.config.BombConfig; import com.hbm.entity.logic.EntityBalefire; +import com.hbm.handler.threading.PacketThreading; import com.hbm.interfaces.IBomb; import com.hbm.items.ModItems; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.bomb.TileEntityCrashedBomb; @@ -108,10 +108,10 @@ public class BlockCrashedBomb extends BlockContainer implements IBomb { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "muke"); data.setBoolean("balefire", true); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x + 0.5, y + 0.5, z + 0.5), new TargetPoint(world.provider.dimensionId, x + 0.5, y + 0.5, z + 0.5, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x + 0.5, y + 0.5, z + 0.5), new TargetPoint(world.provider.dimensionId, x + 0.5, y + 0.5, z + 0.5, 250)); world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:weapon.mukeExplosion", 15.0F, 1.0F); } - + return BombReturnCode.DETONATED; } } diff --git a/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java b/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java index 8ae9a63a3..6eefdf20e 100644 --- a/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java +++ b/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java @@ -9,7 +9,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityShrapnel; import com.hbm.explosion.ExplosionNT; import com.hbm.explosion.ExplosionNT.ExAttrib; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -43,10 +43,10 @@ public class BlockVolcano extends BlockContainer implements ITooltipProvider, IB public int getSubCount() { return 5; } - + @SideOnly(Side.CLIENT) public void getSubBlocks(Item item, CreativeTabs tab, List list) { - + for(int i = 0; i < 5; ++i) { list.add(new ItemStack(item, 1, i)); } @@ -54,14 +54,14 @@ public class BlockVolcano extends BlockContainer implements ITooltipProvider, IB @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - + int meta = stack.getItemDamage(); - + if(meta == META_SMOLDERING) { list.add(EnumChatFormatting.GOLD + "SHIELD VOLCANO"); return; } - + list.add(BlockVolcano.isGrowing(meta) ? (EnumChatFormatting.RED + "DOES GROW") : (EnumChatFormatting.DARK_GRAY + "DOES NOT GROW")); list.add(BlockVolcano.isExtinguishing(meta) ? (EnumChatFormatting.RED + "DOES EXTINGUISH") : (EnumChatFormatting.DARK_GRAY + "DOES NOT EXTINGUISH")); } @@ -71,25 +71,25 @@ public class BlockVolcano extends BlockContainer implements ITooltipProvider, IB public static final int META_GROWING_ACTIVE = 2; public static final int META_GROWING_EXTINGUISHING = 3; public static final int META_SMOLDERING = 4; - + public static boolean isGrowing(int meta) { return meta == META_GROWING_ACTIVE || meta == META_GROWING_EXTINGUISHING; } - + public static boolean isExtinguishing(int meta) { return meta == META_STATIC_EXTINGUISHING || meta == META_GROWING_EXTINGUISHING; } - + public static class TileEntityVolcanoCore extends TileEntity { private static List volcanoExplosion = Arrays.asList(new ExAttrib[] {ExAttrib.NODROP, ExAttrib.LAVA_V, ExAttrib.NOSOUND, ExAttrib.ALLMOD, ExAttrib.NOHURT}); private static List volcanoRadExplosion = Arrays.asList(new ExAttrib[] {ExAttrib.NODROP, ExAttrib.LAVA_R, ExAttrib.NOSOUND, ExAttrib.ALLMOD, ExAttrib.NOHURT}); - + public int volcanoTimer; - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { this.volcanoTimer++; @@ -99,24 +99,24 @@ public class BlockVolcano extends BlockContainer implements ITooltipProvider, IB this.blastMagmaChannel(); this.raiseMagma(); } - + double magmaChamber = this.magmaChamberSize(); if(magmaChamber > 0) this.blastMagmaChamber(magmaChamber); - + Object[] melting = this.surfaceMeltingParams(); if(melting != null) this.meltSurface((int)melting[0], (double)melting[1], (double)melting[2]); - + //self-explanatory if(this.isSpewing()) this.spawnBlobs(); if(this.isSmoking()) this.spawnSmoke(); - + //generates a 3x3x3 cube of lava this.surroundLava(); } - + if(this.volcanoTimer >= this.getUpdateRate()) { this.volcanoTimer = 0; - + if(this.shouldGrow()) { worldObj.setBlock(xCoord, yCoord + 1, zCoord, this.getBlockType(), this.getBlockMetadata(), 3); worldObj.setBlock(xCoord, yCoord, zCoord, getLava()); @@ -128,16 +128,16 @@ public class BlockVolcano extends BlockContainer implements ITooltipProvider, IB } } } - + public boolean isRadioacitve() { return this.getBlockType() == ModBlocks.volcano_rad_core; } - + protected Block getLava() { if(isRadioacitve()) return ModBlocks.rad_lava_block; return ModBlocks.volcanic_lava_block; } - + protected List getExpAttrb() { return this.isRadioacitve() ? this.volcanoRadExplosion : this.volcanoExplosion; } @@ -153,42 +153,42 @@ public class BlockVolcano extends BlockContainer implements ITooltipProvider, IB super.writeToNBT(nbt); nbt.setInteger("tier", this.volcanoTimer); } - + private boolean shouldGrow() { return isGrowing() && yCoord < 200; } - + private boolean isGrowing() { int meta = this.getBlockMetadata(); return meta == META_GROWING_ACTIVE || meta == META_GROWING_EXTINGUISHING; } - + private boolean isExtinguishing() { int meta = this.getBlockMetadata(); return meta == META_STATIC_EXTINGUISHING || meta == META_GROWING_EXTINGUISHING; } - + private boolean isSmoking() { return this.getBlockMetadata() != META_SMOLDERING; } - + private boolean isSpewing() { return this.getBlockMetadata() != META_SMOLDERING; } - + private boolean hasVerticalChannel() { return this.getBlockMetadata() != META_SMOLDERING; } - + private double magmaChamberSize() { return this.getBlockMetadata() == META_SMOLDERING ? 15 : 0; } - + /* count per tick, radius, depth */ private Object[] surfaceMeltingParams() { return this.getBlockMetadata() == META_SMOLDERING ? new Object[] {50, 50D, 10D} : null; } - + private int getUpdateRate() { switch(this.getBlockMetadata()) { case META_STATIC_EXTINGUISHING: return 60 * 60 * 20; //once per hour @@ -197,7 +197,7 @@ public class BlockVolcano extends BlockContainer implements ITooltipProvider, IB default: return 10; } } - + /** Causes two magma explosions, one from bedrock to the core and one from the core to 15 blocks above. */ private void blastMagmaChannel() { ExplosionNT explosion = new ExplosionNT(worldObj, null, xCoord + 0.5, yCoord + worldObj.rand.nextInt(15) + 1.5, zCoord + 0.5, 7); @@ -205,53 +205,53 @@ public class BlockVolcano extends BlockContainer implements ITooltipProvider, IB ExplosionNT explosion2 = new ExplosionNT(worldObj, null, xCoord + 0.5 + worldObj.rand.nextGaussian() * 3, worldObj.rand.nextInt(yCoord + 1), zCoord + 0.5 + worldObj.rand.nextGaussian() * 3, 10); explosion2.addAllAttrib(getExpAttrb()).explode(); } - + /** Causes two magma explosions at a random position around the core, one at normal and one at half range. */ private void blastMagmaChamber(double size) { - + for(int i = 0; i < 2; i++) { double dist = size / (double) (i + 1); ExplosionNT explosion = new ExplosionNT(worldObj, null, xCoord + 0.5 + worldObj.rand.nextGaussian() * dist, yCoord + 0.5 + worldObj.rand.nextGaussian() * dist, zCoord + 0.5 + worldObj.rand.nextGaussian() * dist, 7); explosion.addAllAttrib(getExpAttrb()).explode(); } } - + /** Randomly selects surface blocks and converts them into lava if solid or air if not solid. */ private void meltSurface(int count, double radius, double depth) { - + for(int i = 0; i < count; i++) { int x = (int) Math.floor(xCoord + worldObj.rand.nextGaussian() * radius); int z = (int) Math.floor(zCoord + worldObj.rand.nextGaussian() * radius); //gaussian distribution makes conversions more likely on the surface and rarer at the bottom int y = worldObj.getHeightValue(x, z) + 1 - (int) Math.floor(Math.abs(worldObj.rand.nextGaussian() * depth)); - + Block b = worldObj.getBlock(x, y, z); - + if(!b.isAir(worldObj, x, y, z) && b.getExplosionResistance(null) < Blocks.obsidian.getExplosionResistance(null)) { //turn into lava if solid block, otherwise just break worldObj.setBlock(x, y, z, b.isNormalCube() ? this.getLava() : Blocks.air); } } } - + /** Increases the magma level in a small radius around the core. */ private void raiseMagma() { int rX = xCoord - 10 + worldObj.rand.nextInt(21); int rY = yCoord + worldObj.rand.nextInt(11); int rZ = zCoord - 10 + worldObj.rand.nextInt(21); - + if(worldObj.getBlock(rX, rY, rZ) == Blocks.air && worldObj.getBlock(rX, rY - 1, rZ) == this.getLava()) worldObj.setBlock(rX, rY, rZ, this.getLava()); } - + /** Creates a 3x3x3 lava sphere around the core. */ private void surroundLava() { - + for(int i = -1; i <= 1; i++) { for(int j = -1; j <= 1; j++) { for(int k = -1; k <= 1; k++) { - + if(i != 0 || j != 0 || k != 0) { worldObj.setBlock(xCoord + i, yCoord + j, zCoord + k, this.getLava()); } @@ -259,10 +259,10 @@ public class BlockVolcano extends BlockContainer implements ITooltipProvider, IB } } } - + /** Spews specially tagged shrapnels which create volcanic lava and monoxide clouds. */ private void spawnBlobs() { - + for(int i = 0; i < 3; i++) { EntityShrapnel frag = new EntityShrapnel(worldObj); frag.setLocationAndAngles(xCoord + 0.5, yCoord + 1.5, zCoord + 0.5, 0.0F, 0.0F); @@ -277,13 +277,13 @@ public class BlockVolcano extends BlockContainer implements ITooltipProvider, IB worldObj.spawnEntityInWorld(frag); } } - + /** I SEE SMOKE, AND WHERE THERE'S SMOKE THERE'S FIRE! */ private void spawnSmoke() { NBTTagCompound dPart = new NBTTagCompound(); dPart.setString("type", "vanillaExt"); dPart.setString("mode", "volcano"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(dPart, xCoord + 0.5, yCoord + 10, zCoord + 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 10, zCoord + 0.5, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(dPart, xCoord + 0.5, yCoord + 10, zCoord + 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 10, zCoord + 0.5, 250)); } } } diff --git a/src/main/java/com/hbm/blocks/generic/BlockEmitter.java b/src/main/java/com/hbm/blocks/generic/BlockEmitter.java index af2b35e7f..faf876198 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockEmitter.java +++ b/src/main/java/com/hbm/blocks/generic/BlockEmitter.java @@ -4,7 +4,7 @@ import java.awt.Color; import java.util.List; import com.hbm.blocks.ITooltipProvider; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import api.hbm.block.IToolable; @@ -169,7 +169,7 @@ public class BlockEmitter extends BlockContainer implements IToolable, ITooltipP data.setFloat("yaw", 90); } - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(worldObj.provider.dimensionId, x, y, z, 100)); color = prevColor; diff --git a/src/main/java/com/hbm/blocks/generic/BlockStorageCrate.java b/src/main/java/com/hbm/blocks/generic/BlockStorageCrate.java index 718f26c54..944323a40 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockStorageCrate.java +++ b/src/main/java/com/hbm/blocks/generic/BlockStorageCrate.java @@ -24,6 +24,8 @@ import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.monster.EntityCaveSpider; +import net.minecraft.entity.monster.EntitySpider; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; @@ -100,64 +102,67 @@ public class BlockStorageCrate extends BlockContainer implements IBlockMulti, IT if(this == ModBlocks.safe) return new TileEntitySafe(); return null; } - + private static boolean dropInv = true; - + @Override public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean willHarvest) { - + if(!player.capabilities.isCreativeMode && !world.isRemote && willHarvest) { - + ItemStack drop = new ItemStack(this); ISidedInventory inv = (ISidedInventory)world.getTileEntity(x, y, z); - + NBTTagCompound nbt = new NBTTagCompound(); - + if(inv != null) { - + for(int i = 0; i < inv.getSizeInventory(); i++) { - + ItemStack stack = inv.getStackInSlot(i); if(stack == null) continue; - + NBTTagCompound slot = new NBTTagCompound(); stack.writeToNBT(slot); nbt.setTag("slot" + i, slot); } } - + if(inv instanceof TileEntityLockableBase) { TileEntityLockableBase lockable = (TileEntityLockableBase) inv; - + if(lockable.isLocked()) { nbt.setInteger("lock", lockable.getPins()); nbt.setDouble("lockMod", lockable.getMod()); } } - + + if(inv instanceof TileEntityCrateBase) + nbt.setBoolean("spiders", ((TileEntityCrateBase) inv).hasSpiders); + if(!nbt.hasNoTags()) { drop.stackTagCompound = nbt; - + try { byte[] abyte = CompressedStreamTools.compress(nbt); - + if(abyte.length > 6000) { player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.RED + "Warning: Container NBT exceeds 6kB, contents will be ejected!")); world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(this))); return world.setBlockToAir(x, y, z); } - + } catch(IOException e) { } } - + world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, drop)); } - + dropInv = false; boolean flag = world.setBlockToAir(x, y, z); dropInv = true; - + return flag; } @@ -172,6 +177,22 @@ public class BlockStorageCrate extends BlockContainer implements IBlockMulti, IT TileEntity entity = world.getTileEntity(x, y, z); if(entity instanceof TileEntityCrateBase && ((TileEntityCrateBase) entity).canAccess(player)) { FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + TileEntityCrateBase crate = (TileEntityCrateBase) entity; + if(crate.hasSpiders) { + Random random = new Random(); + int numSpiders = 3; // leave that at 3 for now TODO: maybe a config option or smth + + for (int i = 0; i < numSpiders; i++) { + + EntityCaveSpider spider = new EntityCaveSpider(crate.getWorldObj()); // lord + spider.setLocationAndAngles(x + random.nextGaussian() * 2, y + 1, z + random.nextGaussian() * 2, random.nextFloat(), 0); + spider.setAttackTarget(player); + + world.spawnEntityInWorld(spider); + + crate.hasSpiders = false; + } + } } return true; } else { @@ -181,24 +202,27 @@ public class BlockStorageCrate extends BlockContainer implements IBlockMulti, IT @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { - + ISidedInventory inv = (ISidedInventory)world.getTileEntity(x, y, z); - + if(inv != null && stack.hasTagCompound()) { - + for(int i = 0; i < inv.getSizeInventory(); i++) { inv.setInventorySlotContents(i, ItemStack.loadItemStackFromNBT(stack.stackTagCompound.getCompoundTag("slot" + i))); } - + if(inv instanceof TileEntityLockableBase) { TileEntityLockableBase lockable = (TileEntityLockableBase) inv; - + if(stack.stackTagCompound.hasKey("lock")) { lockable.setPins(stack.stackTagCompound.getInteger("lock")); lockable.setMod(stack.stackTagCompound.getDouble("lockMod")); lockable.lock(); } } + if(inv instanceof TileEntityCrateBase) { + ((TileEntityCrateBase) inv).hasSpiders = stack.stackTagCompound.getBoolean("spiders"); + } } if(this != ModBlocks.safe) @@ -219,37 +243,37 @@ public class BlockStorageCrate extends BlockContainer implements IBlockMulti, IT world.setBlockMetadataWithNotify(x, y, z, 4, 2); } } - + @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { if(dropInv) { ISidedInventory sided = (ISidedInventory) world.getTileEntity(x, y, z); Random rand = world.rand; - + if(sided != null) { for(int i1 = 0; i1 < sided.getSizeInventory(); ++i1) { ItemStack itemstack = sided.getStackInSlot(i1); - + if(itemstack != null) { float f = rand.nextFloat() * 0.8F + 0.1F; float f1 = rand.nextFloat() * 0.8F + 0.1F; float f2 = rand.nextFloat() * 0.8F + 0.1F; - + while(itemstack.stackSize > 0) { int j1 = rand.nextInt(21) + 10; - + if(j1 > itemstack.stackSize) { j1 = itemstack.stackSize; } - + itemstack.stackSize -= j1; EntityItem entityitem = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - + if(itemstack.hasTagCompound()) { entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); } - + float f3 = 0.05F; entityitem.motionX = (float) rand.nextGaussian() * f3; entityitem.motionY = (float) rand.nextGaussian() * f3 + 0.2F; @@ -258,7 +282,7 @@ public class BlockStorageCrate extends BlockContainer implements IBlockMulti, IT } } } - + world.func_147453_f(x, y, z, block); } } @@ -275,12 +299,12 @@ public class BlockStorageCrate extends BlockContainer implements IBlockMulti, IT public int getSubCount() { return 0; } - + @Override public boolean hasComparatorInputOverride() { return true; } - + @Override public int getComparatorInputOverride(World world, int x, int y, int z, int side) { return Container.calcRedstoneFromInventory((IInventory) world.getTileEntity(x, y, z)); @@ -289,27 +313,49 @@ public class BlockStorageCrate extends BlockContainer implements IBlockMulti, IT @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { if(stack.hasTagCompound()) { - + + if(stack.stackTagCompound.getBoolean("spiders")) { + if(stack.stackTagCompound.hasKey("lock")) { + list.add(EnumChatFormatting.RED + "This container is locked."); + } + list.add(EnumChatFormatting.GRAY + "" + EnumChatFormatting.ITALIC + "Skittering emanates from within..."); // lamo + return; + } + + if(stack.stackTagCompound.hasKey("lock")) { + list.add(EnumChatFormatting.RED + "This container is locked."); // Sorry people who want to see what's in it while it's locked... + + for(int i = 0; i < 104; i++) { + ItemStack content = ItemStack.loadItemStackFromNBT(stack.stackTagCompound.getCompoundTag("slot" + i)); + if(content != null) { + list.add(EnumChatFormatting.YELLOW + "It feels heavy..."); + return; + } + } + list.add(EnumChatFormatting.YELLOW + "It feels empty..."); + return; + } + List contents = new ArrayList(); int amount = 0; - - for(int i = 0; i < 100; i++) { //whatever the biggest container is, i can't be bothered to check + + for(int i = 0; i < 104; i++) { //whatever the biggest container is, i can't be bothered to check ItemStack content = ItemStack.loadItemStackFromNBT(stack.stackTagCompound.getCompoundTag("slot" + i)); - + if(content != null) { amount++; - + if(contents.size() < 10) { contents.add(EnumChatFormatting.AQUA + " - " + content.getDisplayName() + (content.stackSize > 1 ? (" x" + content.stackSize) : "")); } } } - + if(!contents.isEmpty()) { list.add(EnumChatFormatting.AQUA + "Contains:"); list.addAll(contents); amount -= contents.size(); - + if(amount > 0) { list.add(EnumChatFormatting.AQUA + "...and " + amount + " more."); } diff --git a/src/main/java/com/hbm/blocks/generic/PartEmitter.java b/src/main/java/com/hbm/blocks/generic/PartEmitter.java index 771c9e37d..8819280b1 100644 --- a/src/main/java/com/hbm/blocks/generic/PartEmitter.java +++ b/src/main/java/com/hbm/blocks/generic/PartEmitter.java @@ -3,7 +3,7 @@ package com.hbm.blocks.generic; import java.util.List; import com.hbm.blocks.ITooltipProvider; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ParticleUtil; @@ -41,7 +41,7 @@ public class PartEmitter extends BlockContainer implements IToolable, ITooltipPr te.markDirty(); return true; } - + return false; } @@ -50,21 +50,21 @@ public class PartEmitter extends BlockContainer implements IToolable, ITooltipPr public static final int range = 150; public int effect = 0; public static final int effectCount = 4; - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { double x = xCoord + 0.5; double y = yCoord + 0.5; double z = zCoord + 0.5; NBTTagCompound data = new NBTTagCompound(); - + if(effect == 1) { ParticleUtil.spawnGasFlame(worldObj, xCoord + worldObj.rand.nextDouble(), yCoord + 4.5 + worldObj.rand.nextDouble(), zCoord + worldObj.rand.nextDouble(), worldObj.rand.nextGaussian() * 0.2, 0.1, worldObj.rand.nextGaussian() * 0.2); } - + if(effect == 2) { data.setString("type", "tower"); data.setFloat("lift", 5F); @@ -79,15 +79,15 @@ public class PartEmitter extends BlockContainer implements IToolable, ITooltipPr data.setFloat("base", 1F); data.setFloat("max", 10F); data.setInteger("life", 750 + worldObj.rand.nextInt(250)); - + x = xCoord + 0.5 + worldObj.rand.nextDouble() * 3 - 1.5; y = yCoord + 1; z = zCoord + 0.5 + worldObj.rand.nextDouble() * 3 - 1.5; - + } - + if(data.hasKey("type")) { - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); } } } @@ -98,7 +98,7 @@ public class PartEmitter extends BlockContainer implements IToolable, ITooltipPr this.writeToNBT(nbt); return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); } - + @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { this.readFromNBT(pkt.func_148857_g()); @@ -121,4 +121,4 @@ public class PartEmitter extends BlockContainer implements IToolable, ITooltipPr public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { list.add(EnumChatFormatting.GOLD + "Use hand drill to cycle special effects"); } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/blocks/machine/MachineICFController.java b/src/main/java/com/hbm/blocks/machine/MachineICFController.java index 83267cec4..5317cd310 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineICFController.java +++ b/src/main/java/com/hbm/blocks/machine/MachineICFController.java @@ -4,8 +4,8 @@ import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.BlockICF.TileEntityBlockICF; import com.hbm.blocks.machine.BlockICFLaserComponent.EnumICFPart; +import com.hbm.handler.threading.PacketThreading; import com.hbm.lib.RefStrings; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.machine.TileEntityICFController; import com.hbm.util.BobMathUtil; @@ -209,7 +209,7 @@ public class MachineICFController extends BlockContainer implements ILookOverlay data.setInteger("expires", 5_000); data.setDouble("dist", 128D); if(message != null) data.setString("label", message); - PacketDispatcher.wrapper.sendTo(new AuxParticlePacketNT(data, x, y, z), (EntityPlayerMP) player); + PacketThreading.createSendToThreadedPacket(new AuxParticlePacketNT(data, x, y, z), (EntityPlayerMP) player); } } diff --git a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java index 584877d3f..0d27ea490 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePWRController.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePWRController.java @@ -3,9 +3,9 @@ package com.hbm.blocks.machine; import com.hbm.blocks.ITooltipProvider; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; +import com.hbm.handler.threading.PacketThreading; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.machine.TileEntityPWRController; import com.hbm.util.fauxpointtwelve.BlockPos; @@ -194,7 +194,7 @@ public class MachinePWRController extends BlockContainer implements ITooltipProv data.setInteger("expires", 5_000); data.setDouble("dist", 128D); if(message != null) data.setString("label", message); - PacketDispatcher.wrapper.sendTo(new AuxParticlePacketNT(data, x, y, z), (EntityPlayerMP) player); + PacketThreading.createSendToThreadedPacket(new AuxParticlePacketNT(data, x, y, z), (EntityPlayerMP) player); } } diff --git a/src/main/java/com/hbm/blocks/machine/ZirnoxDestroyed.java b/src/main/java/com/hbm/blocks/machine/ZirnoxDestroyed.java index 459e958fd..711b46749 100644 --- a/src/main/java/com/hbm/blocks/machine/ZirnoxDestroyed.java +++ b/src/main/java/com/hbm/blocks/machine/ZirnoxDestroyed.java @@ -5,10 +5,10 @@ import java.util.Random; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.material.Mats; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityZirnoxDestroyed; @@ -49,29 +49,29 @@ public class ZirnoxDestroyed extends BlockDummyable { @Override public void updateTick(World world, int x, int y, int z, Random rand) { - + Block block = world.getBlock(x, y + 1, z); - + if(block == Blocks.air) { if(rand.nextInt(10) == 0) world.setBlock(x, y + 1, z, ModBlocks.gas_meltdown); - + } else if(block == ModBlocks.foam_layer || block == ModBlocks.block_foam) { if(rand.nextInt(25) == 0) { int pos[] = this.findCore(world, x, y, z); - + if(pos != null) { TileEntity te = world.getTileEntity(pos[0], pos[1], pos[2]); - + if(te instanceof TileEntityZirnoxDestroyed) ((TileEntityZirnoxDestroyed)te).onFire = false; } } } - + if(rand.nextInt(10) == 0 && world.getBlock(x, y + 1, z) == Blocks.air) world.setBlock(x, y + 1, z, ModBlocks.gas_meltdown); - + super.updateTick(world, x, y, z, rand); } @@ -89,7 +89,7 @@ public class ZirnoxDestroyed extends BlockDummyable { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "rbmkflame"); data.setInteger("maxAge", 90); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x + 0.25 + world.rand.nextDouble() * 0.5, y + 1.75, z + 0.25 + world.rand.nextDouble() * 0.5), new TargetPoint(world.provider.dimensionId, x + 0.5, y + 1.75, z + 0.5, 75)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x + 0.25 + world.rand.nextDouble() * 0.5, y + 1.75, z + 0.25 + world.rand.nextDouble() * 0.5), new TargetPoint(world.provider.dimensionId, x + 0.5, y + 1.75, z + 0.5, 75)); MainRegistry.proxy.effectNT(data); world.playSoundEffect(x + 0.5F, y + 0.5, z + 0.5, "fire.fire", 1.0F + world.rand.nextFloat(), world.rand.nextFloat() * 0.7F + 0.3F); } @@ -117,7 +117,7 @@ public class ZirnoxDestroyed extends BlockDummyable { @Override public int[] getDimensions() { - return new int[] {1, 0, 2, 2, 2, 2,}; + return new int[] {1, 0, 2, 2, 2, 2,}; } @Override @@ -129,4 +129,4 @@ public class ZirnoxDestroyed extends BlockDummyable { super.fillSpace(world, x, y, z, dir, o); } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKDebrisBurning.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKDebrisBurning.java index dc2f70829..edc485dcb 100644 --- a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKDebrisBurning.java +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKDebrisBurning.java @@ -3,8 +3,8 @@ package com.hbm.blocks.machine.rbmk; import java.util.Random; import com.hbm.blocks.ModBlocks; +import com.hbm.handler.threading.PacketThreading; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -24,29 +24,29 @@ public class RBMKDebrisBurning extends RBMKDebris { @Override public void updateTick(World world, int x, int y, int z, Random rand) { - + if(!world.isRemote) { - + if(rand.nextInt(5) == 0) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "rbmkflame"); data.setInteger("maxAge", 300); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x + 0.25 + rand.nextDouble() * 0.5, y + 1.75, z + 0.25 + rand.nextDouble() * 0.5), new TargetPoint(world.provider.dimensionId, x + 0.5, y + 1.75, z + 0.5, 75)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x + 0.25 + rand.nextDouble() * 0.5, y + 1.75, z + 0.25 + rand.nextDouble() * 0.5), new TargetPoint(world.provider.dimensionId, x + 0.5, y + 1.75, z + 0.5, 75)); MainRegistry.proxy.effectNT(data); world.playSoundEffect(x + 0.5F, y + 0.5, z + 0.5, "fire.fire", 1.0F + rand.nextFloat(), rand.nextFloat() * 0.7F + 0.3F); } - + ForgeDirection dir = ForgeDirection.getOrientation(rand.nextInt(6)); Block block = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); if(rand.nextInt(10) == 0 && block == Blocks.air) { world.setBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, ModBlocks.gas_meltdown); } - + //Foam helps stop the fire; Boron smothers it. 1.66% chance every 100-120 seconds for one side int chance = block == ModBlocks.foam_layer || block == ModBlocks.block_foam || block == ModBlocks.sand_boron_layer || block == ModBlocks.sand_boron ? 10 : 100; - + if(rand.nextInt(chance) == 0) { world.setBlock(x, y, z, ModBlocks.pribris); } else { @@ -63,7 +63,7 @@ public class RBMKDebrisBurning extends RBMKDebris { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "rbmkflame"); data.setInteger("maxAge", 300); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x + 0.25 + world.rand.nextDouble() * 0.5, y + 1.75, z + 0.25 + world.rand.nextDouble() * 0.5), new TargetPoint(world.provider.dimensionId, x + 0.5, y + 1.75, z + 0.5, 75)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x + 0.25 + world.rand.nextDouble() * 0.5, y + 1.75, z + 0.25 + world.rand.nextDouble() * 0.5), new TargetPoint(world.provider.dimensionId, x + 0.5, y + 1.75, z + 0.5, 75)); MainRegistry.proxy.effectNT(data); } } diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKDebrisRadiating.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKDebrisRadiating.java index 9aef21c0b..aad8cce75 100644 --- a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKDebrisRadiating.java +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKDebrisRadiating.java @@ -4,8 +4,8 @@ import java.util.List; import java.util.Random; import com.hbm.blocks.ModBlocks; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ContaminationUtil; import com.hbm.util.ContaminationUtil.ContaminationType; @@ -33,88 +33,88 @@ public class RBMKDebrisRadiating extends RBMKDebrisBurning { @Override public void updateTick(World world, int x, int y, int z, Random rand) { - + if(!world.isRemote) { - + radiate(world, x, y, z); - + if(rand.nextInt(5) == 0) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "rbmkflame"); data.setInteger("maxAge", 300); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x + rand.nextDouble(), y + 1.75, z + rand.nextDouble()), new TargetPoint(world.provider.dimensionId, x + 0.5, y + 1.75, z + 0.5, 75)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x + rand.nextDouble(), y + 1.75, z + rand.nextDouble()), new TargetPoint(world.provider.dimensionId, x + 0.5, y + 1.75, z + 0.5, 75)); //MainRegistry.proxy.effectNT(data); world.playSoundEffect(x + 0.5F, y + 0.5, z + 0.5, "fire.fire", 1.0F + rand.nextFloat(), rand.nextFloat() * 0.7F + 0.3F); } - + ForgeDirection dir = ForgeDirection.getOrientation(rand.nextInt(6)); Block block = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); - + if(rand.nextInt(10) == 0 && block == Blocks.air) { world.setBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, ModBlocks.gas_meltdown); } - + //Boron sand helps stop the fission reaction; 0.66% chance every 20-40 ticks for one side int chance = block == ModBlocks.sand_boron_layer || block == ModBlocks.sand_boron ? 25 : 1000; - + if(rand.nextInt(chance) == 0) { - + int meta = world.getBlockMetadata(x, y, z); - + if(meta < 15) { world.setBlockMetadataWithNotify(x, y, z, meta + 1, 2); world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world)); } else { world.setBlock(x, y, z, ModBlocks.pribris_burning); } - + } else { world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world)); } } } - + private void radiate(World world, int x, int y, int z) { - + float rads = 1000000F; double range = 100D; - + List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(x + 0.5, y + 0.5, z + 0.5, x + 0.5, y + 0.5, z + 0.5).expand(range, range, range)); - + for(EntityLivingBase e : entities) { - + Vec3 vec = Vec3.createVectorHelper(e.posX - (x + 0.5), (e.posY + e.getEyeHeight()) - (y + 0.5), e.posZ - (z + 0.5)); double len = vec.lengthVector(); vec = vec.normalize(); - + float res = 0; - + for(int i = 1; i < len; i++) { int ix = (int)Math.floor(x + 0.5 + vec.xCoord * i); int iy = (int)Math.floor(y + 0.5 + vec.yCoord * i); int iz = (int)Math.floor(z + 0.5 + vec.zCoord * i); - + res += world.getBlock(ix, iy, iz).getExplosionResistance(null); } - + if(res < 1) res = 1; - + float eRads = rads; eRads /= (float)res; eRads /= (float)(len * len); - + ContaminationUtil.contaminate(e, HazardType.RADIATION, ContaminationType.CREATIVE, eRads); - + if(len < 5) { e.attackEntityFrom(DamageSource.inFire, 100); } - + if(e instanceof EntityPlayer && len < 10) { EntityPlayer p = (EntityPlayer) e; - + if(p.getHeldItem() != null && p.getHeldItem().getItem() == ModItems.marshmallow && p.getHeldItem().getItemDamage() != 1 && p.getRNG().nextInt(100) == 0) { p.getHeldItem().setItemDamage(1); } diff --git a/src/main/java/com/hbm/entity/item/EntityFireworks.java b/src/main/java/com/hbm/entity/item/EntityFireworks.java index 6602c2ef4..974aa471d 100644 --- a/src/main/java/com/hbm/entity/item/EntityFireworks.java +++ b/src/main/java/com/hbm/entity/item/EntityFireworks.java @@ -1,6 +1,6 @@ package com.hbm.entity.item; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -9,7 +9,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; public class EntityFireworks extends Entity { - + int color; int character; @@ -26,28 +26,28 @@ public class EntityFireworks extends Entity { @Override protected void entityInit() { } - + @Override public void onUpdate() { - + this.moveEntity(0.0, 3.0D, 0.0); this.worldObj.spawnParticle("flame", posX, posY, posZ, 0.0, -0.3, 0.0); this.worldObj.spawnParticle("smoke", posX, posY, posZ, 0.0, -0.2, 0.0); - + if(!worldObj.isRemote) { - + ticksExisted++; - + if(this.ticksExisted > 30) { - + this.worldObj.playSoundEffect(posX, posY, posZ, "fireworks.blast", 20, 1F + this.rand.nextFloat() * 0.2F); - + this.setDead(); NBTTagCompound data = new NBTTagCompound(); data.setString("type", "fireworks"); data.setInteger("color", color); data.setInteger("char", character); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(this.worldObj.provider.dimensionId, posX, posY, posZ, 300)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(this.worldObj.provider.dimensionId, posX, posY, posZ, 300)); } } } diff --git a/src/main/java/com/hbm/entity/item/EntityMagnusCartus.java b/src/main/java/com/hbm/entity/item/EntityMagnusCartus.java index 53f379cae..1737cc72c 100644 --- a/src/main/java/com/hbm/entity/item/EntityMagnusCartus.java +++ b/src/main/java/com/hbm/entity/item/EntityMagnusCartus.java @@ -1,7 +1,7 @@ package com.hbm.entity.item; import com.hbm.entity.cart.EntityMinecartBogie; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -12,7 +12,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; public class EntityMagnusCartus extends EntityMinecart { - + public EntityMinecartBogie bogie; public EntityMagnusCartus(World world) { @@ -33,12 +33,12 @@ public class EntityMagnusCartus extends EntityMinecart { super.entityInit(); this.dataWatcher.addObject(25, new Integer(0)); } - + public void setBogie(EntityMinecartBogie bogie) { this.bogie = bogie; this.dataWatcher.updateObject(25, bogie.getEntityId()); } - + public int getBogieID() { return this.dataWatcher.getWatchableObjectInt(25); } @@ -46,12 +46,12 @@ public class EntityMagnusCartus extends EntityMinecart { @Override public void onUpdate() { super.onUpdate(); - + if(!worldObj.isRemote) { - + double dist = 3.0D; double force = 0.3D; - + if(bogie == null) { Vec3 vec = Vec3.createVectorHelper(dist, 0, 0); vec.rotateAroundY(rand.nextFloat() * 6.28F); @@ -59,7 +59,7 @@ public class EntityMagnusCartus extends EntityMinecart { this.setBogie(bog); worldObj.spawnEntityInWorld(bog); } - + Vec3 delta = Vec3.createVectorHelper(posX - bogie.posX, posY - bogie.posY, posZ - bogie.posZ); delta = delta.normalize(); delta.xCoord *= dist; @@ -69,17 +69,17 @@ public class EntityMagnusCartus extends EntityMinecart { double x = posX - delta.xCoord; double y = posY - delta.yCoord; double z = posZ - delta.zCoord; - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaExt"); data.setString("mode", "reddust"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(this.dimension, x, y, z, 25)); - + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(this.dimension, x, y, z, 25)); + Vec3 pull = Vec3.createVectorHelper(x - bogie.posX, y - bogie.posY, z - bogie.posZ); bogie.motionX += pull.xCoord * force; bogie.motionY += pull.yCoord * force; bogie.motionZ += pull.zCoord * force; - + if(pull.lengthVector() > 1) { this.motionX -= pull.xCoord * force; this.motionY -= pull.yCoord * force; @@ -87,13 +87,13 @@ public class EntityMagnusCartus extends EntityMinecart { } } } - + @Override protected void readEntityFromNBT(NBTTagCompound nbt) { super.readEntityFromNBT(nbt); int bogieID = nbt.getInteger("bogie"); Entity e = worldObj.getEntityByID(bogieID); - + if(e instanceof EntityMinecartBogie) { this.setBogie((EntityMinecartBogie) e); } diff --git a/src/main/java/com/hbm/entity/logic/EntityDeathBlast.java b/src/main/java/com/hbm/entity/logic/EntityDeathBlast.java index e8da0ab89..9d1a45f73 100644 --- a/src/main/java/com/hbm/entity/logic/EntityDeathBlast.java +++ b/src/main/java/com/hbm/entity/logic/EntityDeathBlast.java @@ -2,7 +2,7 @@ package com.hbm.entity.logic; import com.hbm.entity.projectile.EntityBulletBaseNT; import com.hbm.handler.BulletConfigSyncingUtil; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -14,7 +14,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; public class EntityDeathBlast extends Entity { - + public static final int maxAge = 60; public EntityDeathBlast(World p_i1582_1_) { @@ -30,21 +30,21 @@ public class EntityDeathBlast extends Entity { @Override protected void writeEntityToNBT(NBTTagCompound nbt) { } - + @Override public void onUpdate() { - + if(this.ticksExisted >= maxAge && !worldObj.isRemote) { this.setDead(); - + worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFacNoRad(worldObj, 40, posX, posY, posZ)); - + int count = 100; for(int i = 0; i < count; i++) { - + Vec3 vec = Vec3.createVectorHelper(0.2, 0, 0); vec.rotateAroundY((float)(2 * Math.PI * i / (float)count)); - + EntityBulletBaseNT laser = new EntityBulletBaseNT(worldObj, BulletConfigSyncingUtil.MASKMAN_BOLT); laser.setPosition(posX, posY + 2, posZ); laser.motionX = vec.xCoord; @@ -52,10 +52,10 @@ public class EntityDeathBlast extends Entity { laser.motionY = -0.01; worldObj.spawnEntityInWorld(laser); } - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "muke"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(worldObj.provider.dimensionId, posX, posY, posZ, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(worldObj.provider.dimensionId, posX, posY, posZ, 250)); worldObj.playSoundEffect(posX, posY, posZ, "hbm:weapon.mukeExplosion", 25.0F, 0.9F); } } diff --git a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK3.java b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK3.java index c72a26679..df4eae71d 100644 --- a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK3.java +++ b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK3.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; +import com.hbm.handler.threading.PacketThreading; import org.apache.logging.log4j.Level; import com.hbm.config.BombConfig; @@ -16,7 +17,6 @@ import com.hbm.explosion.ExplosionNukeGeneric; import com.hbm.explosion.ExplosionSolinium; import com.hbm.interfaces.Spaghetti; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -27,7 +27,7 @@ import net.minecraft.world.World; @Spaghetti("why???") public class EntityNukeExplosionMK3 extends EntityExplosionChunkloading { - + public int age = 0; public int destructionRange = 0; public ExplosionNukeAdvanced exp; @@ -55,14 +55,14 @@ public class EntityNukeExplosionMK3 extends EntityExplosionChunkloading { did2 = nbt.getBoolean("did2"); waste = nbt.getBoolean("waste"); extType = nbt.getInteger("extType"); - + long time = nbt.getLong("milliTime"); - + if(BombConfig.limitExplosionLifespan > 0 && System.currentTimeMillis() - time > BombConfig.limitExplosionLifespan * 1000) { this.clearChunkLoader(); this.setDead(); } - + if(this.waste) { exp = new ExplosionNukeAdvanced((int) this.posX, (int) this.posY, (int) this.posZ, this.worldObj, this.destructionRange, this.coefficient, 0); exp.readFromNbt(nbt, "exp_"); @@ -97,9 +97,9 @@ public class EntityNukeExplosionMK3 extends EntityExplosionChunkloading { nbt.setBoolean("did2", did2); nbt.setBoolean("waste", waste); nbt.setInteger("extType", extType); - + nbt.setLong("milliTime", System.currentTimeMillis()); - + if(exp != null) exp.saveToNbt(nbt, "exp_"); if(wst != null) @@ -110,7 +110,7 @@ public class EntityNukeExplosionMK3 extends EntityExplosionChunkloading { expl.saveToNbt(nbt, "expl_"); if(sol != null) sol.saveToNbt(nbt, "sol_"); - + } public EntityNukeExplosionMK3(World p_i1582_1_) { @@ -122,15 +122,15 @@ public class EntityNukeExplosionMK3 extends EntityExplosionChunkloading { super.onUpdate(); if(!worldObj.isRemote) loadChunk((int) Math.floor(posX / 16D), (int) Math.floor(posZ / 16D)); - + if(!this.did) { for(Object player : this.worldObj.playerEntities) ((EntityPlayer)player).triggerAchievement(MainRegistry.achManhattan); - + if(GeneralConfig.enableExtendedLogging && !worldObj.isRemote) MainRegistry.logger.log(Level.INFO, "[NUKE] Initialized mk3 explosion at " + posX + " / " + posY + " / " + posZ + " with strength " + destructionRange + "!"); - + if(this.waste) { exp = new ExplosionNukeAdvanced((int)this.posX, (int)this.posY, (int)this.posZ, this.worldObj, this.destructionRange, this.coefficient, 0); @@ -142,15 +142,15 @@ public class EntityNukeExplosionMK3 extends EntityExplosionChunkloading { if(extType == 1) sol = new ExplosionSolinium((int)this.posX, (int)this.posY, (int)this.posZ, this.worldObj, this.destructionRange, this.coefficient, this.coefficient2); } - + this.did = true; } - + speed += 1; //increase speed to keep up with expansion - + boolean flag = false; boolean flag3 = false; - + for(int i = 0; i < this.speed; i++) { if(waste) { flag = exp.update(); @@ -176,17 +176,17 @@ public class EntityNukeExplosionMK3 extends EntityExplosionChunkloading { } } } - + if(!flag) { this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, "ambient.weather.thunder", 10000.0F, 0.8F + this.rand.nextFloat() * 0.2F); - + if(waste || extType != 1) { ExplosionNukeGeneric.dealDamage(this.worldObj, this.posX, this.posY, this.posZ, this.destructionRange * 2); } else { ExplosionHurtUtil.doRadiation(worldObj, posX, posY, posZ, 15000, 250000, this.destructionRange); } - + } else { if (!did2 && waste) { EntityFalloutRain fallout = new EntityFalloutRain(this.worldObj, (int)(this.destructionRange * 1.8) * 10); @@ -197,18 +197,18 @@ public class EntityNukeExplosionMK3 extends EntityExplosionChunkloading { this.worldObj.spawnEntityInWorld(fallout); //this.worldObj.getWorldInfo().setRaining(true); - + did2 = true; } } age++; } - + public static HashMap at = new HashMap(); - + public static EntityNukeExplosionMK3 statFacFleija(World world, double x, double y, double z, int range) { - + EntityNukeExplosionMK3 entity = new EntityNukeExplosionMK3(world); entity.posX = x; entity.posY = y; @@ -217,63 +217,63 @@ public class EntityNukeExplosionMK3 extends EntityExplosionChunkloading { entity.speed = BombConfig.blastSpeed; entity.coefficient = 1.0F; entity.waste = false; - + Iterator> it = at.entrySet().iterator(); - + while(it.hasNext()) { - + Entry next = it.next(); if(next.getValue() < world.getTotalWorldTime()) { it.remove(); continue; } - + ATEntry entry = next.getKey(); if(entry.dim != world.provider.dimensionId) continue; - + Vec3 vec = Vec3.createVectorHelper(x - entry.x, y - entry.y, z - entry.z); - + if(vec.lengthVector() < 300) { entity.setDead(); /* just to make sure */ if(!world.isRemote) { - + for(int i = 0; i < 2; i++) { double ix = i == 0 ? x : (entry.x + 0.5); double iy = i == 0 ? y : (entry.y + 0.5); double iz = i == 0 ? z : (entry.z + 0.5); - + world.playSoundEffect(ix, iy, iz, "hbm:entity.ufoBlast", 15.0F, 0.7F + world.rand.nextFloat() * 0.2F); - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "plasmablast"); data.setFloat("r", 0.0F); data.setFloat("g", 0.75F); data.setFloat("b", 1.0F); data.setFloat("scale", 7.5F); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, ix, iy, iz), new TargetPoint(entry.dim, ix, iy, iz, 150)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, ix, iy, iz), new TargetPoint(entry.dim, ix, iy, iz, 150)); } } - + break; } } - + return entity; } - + public EntityNukeExplosionMK3 makeSol() { this.extType = 1; return this; } - + public static class ATEntry { public int dim; public int x; public int y; public int z; - + public ATEntry(int dim, int x, int y, int z) { this.dim = dim; this.x = x; diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java b/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java index 6c07d944d..0205a13f2 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileShuttle.java @@ -6,9 +6,9 @@ import java.util.List; import com.hbm.explosion.ExplosionNT; import com.hbm.explosion.ExplosionNT.ExAttrib; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -36,10 +36,10 @@ public class EntityMissileShuttle extends EntityMissileBaseNT { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "rbmkmush"); data.setFloat("scale", 10); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, this.posX + 0.5, this.posY + 1, this.posZ + 0.5), new TargetPoint(worldObj.provider.dimensionId,this.posX + 0.5, this.posY + 1, this.posZ + 0.5, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, this.posX + 0.5, this.posY + 1, this.posZ + 0.5), new TargetPoint(worldObj.provider.dimensionId,this.posX + 0.5, this.posY + 1, this.posZ + 0.5, 250)); MainRegistry.proxy.effectNT(data); - this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, "hbm:weapon.robin_explosion", 4.0F, (1.0F + (this.worldObj.rand.nextFloat() - this.worldObj.rand.nextFloat()) * 0.2F) * 0.7F); + this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, "hbm:weapon.robin_explosion", 4.0F, (1.0F + (this.worldObj.rand.nextFloat() - this.worldObj.rand.nextFloat()) * 0.2F) * 0.7F); } @Override @@ -58,7 +58,7 @@ public class EntityMissileShuttle extends EntityMissileBaseNT { public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.missile_generic); } - + @Override public String getUnlocalizedName() { return "radar.target.shuttle"; @@ -68,4 +68,4 @@ public class EntityMissileShuttle extends EntityMissileBaseNT { public ItemStack getMissileItemForInfo() { return new ItemStack(ModItems.missile_shuttle); } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/entity/mob/EntityCreeperNuclear.java b/src/main/java/com/hbm/entity/mob/EntityCreeperNuclear.java index e81b192dd..e186c4dd4 100644 --- a/src/main/java/com/hbm/entity/mob/EntityCreeperNuclear.java +++ b/src/main/java/com/hbm/entity/mob/EntityCreeperNuclear.java @@ -5,12 +5,12 @@ import java.util.List; import com.hbm.entity.logic.EntityNukeExplosionMK5; import com.hbm.explosion.ExplosionNukeGeneric; import com.hbm.explosion.ExplosionNukeSmall; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.OreDictManager.DictFrame; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ContaminationUtil; import com.hbm.util.ContaminationUtil.ContaminationType; @@ -46,7 +46,7 @@ public class EntityCreeperNuclear extends EntityCreeper { @Override public boolean attackEntityFrom(DamageSource source, float amount) { - + // for some reason the nuclear explosion would damage the already dead entity, reviving it and forcing it to play the death animation if(this.isDead) return false; @@ -96,9 +96,9 @@ public class EntityCreeperNuclear extends EntityCreeper { ContaminationUtil.contaminate((EntityLivingBase) e, HazardType.RADIATION, ContaminationType.CREATIVE, 0.25F); } } - + super.onUpdate(); - + if(this.isEntityAlive() && this.getHealth() < this.getMaxHealth() && this.ticksExisted % 10 == 0) { this.heal(1.0F); } @@ -109,14 +109,14 @@ public class EntityCreeperNuclear extends EntityCreeper { if(!this.worldObj.isRemote) { this.setDead(); - + boolean flag = this.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing"); if(this.getPowered()) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "muke"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(dimension, posX, posY, posZ, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(dimension, posX, posY, posZ, 250)); worldObj.playSoundEffect(posX, posY + 0.5, posZ, "hbm:weapon.mukeExplosion", 15.0F, 1.0F); if(flag) { diff --git a/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java b/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java index cffaee494..91b544fdc 100644 --- a/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java +++ b/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java @@ -2,10 +2,10 @@ package com.hbm.entity.mob; import com.hbm.entity.projectile.EntityBullet; import com.hbm.entity.projectile.EntityChopperMine; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import api.hbm.entity.IRadiationImmune; @@ -254,7 +254,7 @@ public class EntityHunterChopper extends EntityFlying implements IMob, IBossDisp data.setString("mode", "meteor"); data.setInteger("count", 10); data.setDouble("width", 1); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(dimension, posX, posY, posZ, 100)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(dimension, posX, posY, posZ, 100)); } rotationYaw += 20; diff --git a/src/main/java/com/hbm/entity/mob/EntityPigeon.java b/src/main/java/com/hbm/entity/mob/EntityPigeon.java index 34e19c294..13f1daa8c 100644 --- a/src/main/java/com/hbm/entity/mob/EntityPigeon.java +++ b/src/main/java/com/hbm/entity/mob/EntityPigeon.java @@ -7,8 +7,8 @@ import com.hbm.entity.mob.ai.EntityAIStartFlying; import com.hbm.entity.mob.ai.EntityAIStopFlying; import com.hbm.entity.mob.ai.EntityAISwimmingConditional; import com.hbm.entity.mob.ai.EntityAIWanderConditional; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.tool.ItemFertilizer; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -31,7 +31,7 @@ import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.FakePlayerFactory; public class EntityPigeon extends EntityCreature implements IFlyingCreature, IAnimals { - + public float fallTime; public float dest; public float prevDest; @@ -50,16 +50,16 @@ public class EntityPigeon extends EntityCreature implements IFlyingCreature, IAn this.tasks.addTask(7, new EntityAILookIdle(this)); this.setSize(0.5F, 1.0F); } - + @Override public boolean attackEntityFrom(DamageSource source, float amount) { - + if(amount >= this.getMaxHealth() * 2 && !worldObj.isRemote) { this.setDead(); - + for(int i = 0; i < 10; i++) { Vec3 vec = Vec3.createVectorHelper(rand.nextGaussian(), rand.nextGaussian(), rand.nextGaussian()).normalize(); - + EntityItem feather = new EntityItem(worldObj); feather.setEntityItemStack(new ItemStack(Items.feather)); feather.setPosition(posX + vec.xCoord, posY + height / 2D + vec.yCoord, posZ + vec.zCoord); @@ -68,13 +68,13 @@ public class EntityPigeon extends EntityCreature implements IFlyingCreature, IAn feather.motionZ = vec.zCoord * 0.5; worldObj.spawnEntityInWorld(feather); } - + return true; } - + return super.attackEntityFrom(source, amount); } - + @Override public boolean isAIEnabled() { return true; @@ -91,7 +91,7 @@ public class EntityPigeon extends EntityCreature implements IFlyingCreature, IAn protected Item getDropItem() { return Items.feather; } - + @Override protected void func_145780_a(int x, int y, int z, Block block) { this.playSound("mob.chicken.step", 0.15F, 1.0F); @@ -121,15 +121,15 @@ public class EntityPigeon extends EntityCreature implements IFlyingCreature, IAn public void setFlyingState(int state) { this.dataWatcher.updateObject(12, (byte) state); } - + public boolean isFat() { return this.dataWatcher.getWatchableObjectByte(13) == 1; } - + public void setFat(boolean fat) { this.dataWatcher.updateObject(13, (byte) (fat ? 1 : 0)); } - + protected String getLivingSound() { return null; } @@ -145,51 +145,51 @@ public class EntityPigeon extends EntityCreature implements IFlyingCreature, IAn @Override protected void updateAITasks() { super.updateAITasks(); - + if(this.getFlyingState() == this.STATE_FLYING) { int height = worldObj.getHeightValue((int) Math.floor(posX), (int) Math.floor(posZ)); - + boolean ceil = posY - height > 10; - + this.motionY = this.getRNG().nextGaussian() * 0.05 + (ceil ? 0 : 0.04) + (this.isInWater() ? 0.2 : 0); - + if(onGround) this.motionY = Math.abs(this.motionY) + 0.1D; - + this.moveForward = 1.5F; if(this.getRNG().nextInt(20) == 0) this.rotationYaw += this.getRNG().nextGaussian() * 30; - + if(this.isFat() && this.getRNG().nextInt(50) == 0) { - + NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("type", "sweat"); nbt.setInteger("count", 3); nbt.setInteger("block", Block.getIdFromBlock(Blocks.wool)); nbt.setInteger("entity", getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(dimension, posX, posY, posZ, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(dimension, posX, posY, posZ, 50)); int x = (int) Math.floor(posX); int y = (int) Math.floor(posY) - 1; int z = (int) Math.floor(posZ); EntityPlayer player = FakePlayerFactory.getMinecraft((WorldServer)worldObj); - + for(int i = 0; i < 25; i++) { - + if(ItemFertilizer.fertilize(worldObj, x, y - i, z, player, true)) { worldObj.playAuxSFX(2005, x, y - i, z, 0); break; } } - + if(this.getRNG().nextInt(10) == 0) { this.setFat(false); } } - + } else if(!this.onGround && this.motionY < 0.0D) { this.motionY *= 0.8D; } } - + @Override public void onLivingUpdate() { super.onLivingUpdate(); diff --git a/src/main/java/com/hbm/entity/mob/EntityQuackos.java b/src/main/java/com/hbm/entity/mob/EntityQuackos.java index 31169e994..00f73d34f 100644 --- a/src/main/java/com/hbm/entity/mob/EntityQuackos.java +++ b/src/main/java/com/hbm/entity/mob/EntityQuackos.java @@ -1,7 +1,7 @@ package com.hbm.entity.mob; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -97,23 +97,23 @@ public class EntityQuackos extends EntityDuck implements IBossDisplayData { return false; } } - + /** * BOW */ public void despawn() { - + if(!worldObj.isRemote) { for(int i = 0; i < 150; i++) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "bf"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX + rand.nextDouble() * 20 - 10, posY + rand.nextDouble() * 25, posZ + rand.nextDouble() * 20 - 10), new TargetPoint(dimension, posX, posY, posZ, 150)); } - + dropItem(ModItems.spawn_duck, 3); } this.isDead = true; @@ -150,7 +150,7 @@ public class EntityQuackos extends EntityDuck implements IBossDisplayData { @Override public void onLivingUpdate() { super.onLivingUpdate(); - + if(!worldObj.isRemote && this.posY < -30) { this.setPosition(this.posX + rand.nextGaussian() * 30, 256, this.posZ + rand.nextGaussian() * 30); } diff --git a/src/main/java/com/hbm/entity/mob/EntityTaintCrab.java b/src/main/java/com/hbm/entity/mob/EntityTaintCrab.java index b7f33cdd6..9b1ef3ce4 100644 --- a/src/main/java/com/hbm/entity/mob/EntityTaintCrab.java +++ b/src/main/java/com/hbm/entity/mob/EntityTaintCrab.java @@ -4,9 +4,9 @@ import java.util.ArrayList; import java.util.List; import com.hbm.entity.projectile.EntityBulletBaseMK4; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.factory.XFactory762mm; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.potion.HbmPotion; import com.hbm.tileentity.machine.TileEntityTesla; @@ -23,7 +23,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; public class EntityTaintCrab extends EntityCyberCrab { - + public List targets = new ArrayList(); public EntityTaintCrab(World p_i1733_1_) { @@ -48,7 +48,7 @@ public class EntityTaintCrab extends EntityCyberCrab { targets = TileEntityTesla.zap(worldObj, posX, posY + 1.25, posZ, 10, this); List targets = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(posX - 5, posY - 5, posZ - 5, posX + 5, posY + 5, posZ + 5)); - + for(EntityLivingBase e : targets) { if(!(e instanceof EntityCyberCrab)) e.addPotionEffect(new PotionEffect(HbmPotion.radiation.id, 10, 15)); } @@ -67,7 +67,7 @@ public class EntityTaintCrab extends EntityCyberCrab { @Override public void attackEntityWithRangedAttack(EntityLivingBase entity, float f) { - + EntityBulletBaseMK4 bullet = new EntityBulletBaseMK4(this, XFactory762mm.r762_fmj, 10F, 0F, 0F, 0F, 0F); Vec3 motion = Vec3.createVectorHelper(posX - entity.posX, posY - entity.posZ - entity.height / 2, posZ - entity.posZ); motion = motion.normalize(); @@ -77,7 +77,7 @@ public class EntityTaintCrab extends EntityCyberCrab { data.setDouble("mX", bullet.motionX * 0.3); data.setDouble("mY", bullet.motionY * 0.3); data.setDouble("mZ", bullet.motionZ * 0.3); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, bullet.posX, bullet.posY, bullet.posZ), new TargetPoint(this.dimension, posX, posY, posZ, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, bullet.posX, bullet.posY, bullet.posZ), new TargetPoint(this.dimension, posX, posY, posZ, 50)); this.worldObj.spawnEntityInWorld(bullet); this.playSound("hbm:weapon.sawShoot", 1.0F, 0.5F); } diff --git a/src/main/java/com/hbm/entity/mob/EntityUFO.java b/src/main/java/com/hbm/entity/mob/EntityUFO.java index f30a84f93..2e5591a0d 100644 --- a/src/main/java/com/hbm/entity/mob/EntityUFO.java +++ b/src/main/java/com/hbm/entity/mob/EntityUFO.java @@ -6,10 +6,10 @@ import java.util.List; import com.hbm.entity.projectile.EntityBulletBaseNT; import com.hbm.explosion.ExplosionNukeSmall; import com.hbm.handler.BulletConfigSyncingUtil; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ContaminationUtil; import com.hbm.util.ContaminationUtil.ContaminationType; @@ -47,7 +47,7 @@ public class EntityUFO extends EntityFlying implements IMob, IBossDisplayData, I public int beamTimer; private Entity target; private List secondaries = new ArrayList(); - + public EntityUFO(World p_i1587_1_) { super(p_i1587_1_); this.setSize(15F, 4F); @@ -61,18 +61,18 @@ public class EntityUFO extends EntityFlying implements IMob, IBossDisplayData, I protected boolean canDespawn() { return false; } - + @Override public boolean attackEntityFrom(DamageSource source, float amount) { - + if(hurtCooldown > 0) return false; - + boolean hit = super.attackEntityFrom(source, amount); - + if(hit) hurtCooldown = 5; - + return hit; } @@ -84,14 +84,14 @@ public class EntityUFO extends EntityFlying implements IMob, IBossDisplayData, I @Override protected void updateEntityActionState() { - + if(!this.worldObj.isRemote) { - + if(this.worldObj.difficultySetting == EnumDifficulty.PEACEFUL) { this.setDead(); return; } - + if(this.hurtCooldown > 0) { this.hurtCooldown--; } @@ -103,29 +103,29 @@ public class EntityUFO extends EntityFlying implements IMob, IBossDisplayData, I if(this.scanCooldown > 0) { this.scanCooldown--; } - + if(this.target != null && !this.target.isEntityAlive()) { this.target = null; } - + if(this.scanCooldown <= 0) { List entities = worldObj.getEntitiesWithinAABB(Entity.class, this.boundingBox.expand(100, 50, 100)); this.secondaries.clear(); this.target = null; - + for(Entity entity : entities) { - + if(!entity.isEntityAlive() || !canAttackClass(entity.getClass())) continue; - + if(entity instanceof EntityPlayer) { - + if(((EntityPlayer)entity).capabilities.isCreativeMode) continue; - + if(((EntityPlayer)entity).isPotionActive(Potion.invisibility.id)) continue; - + if(this.target == null) { this.target = entity; } else { @@ -134,38 +134,38 @@ public class EntityUFO extends EntityFlying implements IMob, IBossDisplayData, I } } } - + if(entity instanceof EntityLivingBase && this.getDistanceSqToEntity(entity) < 100 * 100 && this.canEntityBeSeen(entity) && entity != this.target) { this.secondaries.add(entity); } } - + if(this.target == null && !this.secondaries.isEmpty()) this.target = this.secondaries.get(rand.nextInt(this.secondaries.size())); - + this.scanCooldown = 50; } - + if(this.target != null && this.courseChangeCooldown <= 0) { - + Vec3 vec = Vec3.createVectorHelper(this.posX - this.target.posX, 0, this.posZ - this.target.posZ); - + if(rand.nextInt(3) > 0) vec.rotateAroundY((float)Math.PI * 2 * rand.nextFloat()); - + double length = vec.lengthVector(); double overshoot = 35; - + int wX = (int)Math.floor(this.target.posX - vec.xCoord / length * overshoot); int wZ = (int)Math.floor(this.target.posZ - vec.zCoord / length * overshoot); - + this.setWaypoint(wX, Math.max(this.worldObj.getHeightValue(wX, wZ) + 20 + rand.nextInt(15), (int) this.target.posY + 15), wZ); - + this.courseChangeCooldown = 40 + rand.nextInt(20); } - + if(!worldObj.isRemote) { - + if(beamTimer <= 0 && this.getBeam()) { this.setBeam(false); } @@ -175,10 +175,10 @@ public class EntityUFO extends EntityFlying implements IMob, IBossDisplayData, I if(dist < 25) this.beamTimer = 30; } - + if(beamTimer > 0) { this.beamTimer--; - + if(!this.getBeam()) { worldObj.playSoundAtEntity(this, "hbm:entity.ufoBeam", 10.0F, 1.0F); this.setBeam(true); @@ -187,51 +187,51 @@ public class EntityUFO extends EntityFlying implements IMob, IBossDisplayData, I int ix = (int)Math.floor(this.posX); int iz = (int)Math.floor(this.posZ); int iy = 0; - + for(int i = (int)Math.ceil(this.posY); i >= 0; i--) { - + if(this.worldObj.getBlock(ix, i, iz) != Blocks.air) { iy = i; break; } } - + if(iy < this.posY) { List entities = worldObj.getEntitiesWithinAABBExcludingEntity(this, AxisAlignedBB.getBoundingBox(this.posX, iy, this.posZ, this.posX, this.posY, this.posZ).expand(5, 0, 5)); - + for(Entity e : entities) { if(this.canAttackClass(e.getClass())) { e.attackEntityFrom(ModDamageSource.causeCombineDamage(this, e), 1000F); e.setFire(5); - + if(e instanceof EntityLivingBase) ContaminationUtil.contaminate((EntityLivingBase)e, HazardType.RADIATION, ContaminationType.CREATIVE, 5F); } } - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "ufo"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, iy + 0.5, posZ), new TargetPoint(dimension, posX, iy + 0.5, posZ, 150)); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX + this.motionX * 0.5, iy + 0.5, posZ + this.motionZ * 0.5), new TargetPoint(dimension, posX + this.motionX * 0.5, iy + 0.5, posZ + this.motionZ * 0.5, 150)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, iy + 0.5, posZ), new TargetPoint(dimension, posX, iy + 0.5, posZ, 150)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX + this.motionX * 0.5, iy + 0.5, posZ + this.motionZ * 0.5), new TargetPoint(dimension, posX + this.motionX * 0.5, iy + 0.5, posZ + this.motionZ * 0.5, 150)); } } - + if(this.ticksExisted % 300 < 200) { - + if(this.ticksExisted % 4 == 0) { - + if(!this.secondaries.isEmpty()){ Entity e = this.secondaries.get(rand.nextInt(this.secondaries.size())); - + if(!e.isEntityAlive()) this.secondaries.remove(e); else laserAttack(e); - + } else if(this.target != null) { laserAttack(this.target); } - + } else if(this.ticksExisted % 4 == 2) { if(this.target != null) { laserAttack(this.target); @@ -240,41 +240,41 @@ public class EntityUFO extends EntityFlying implements IMob, IBossDisplayData, I } else { if(this.ticksExisted % 20 == 0) { - + if(!this.secondaries.isEmpty()){ Entity e = this.secondaries.get(rand.nextInt(this.secondaries.size())); - + if(!e.isEntityAlive()) this.secondaries.remove(e); else rocketAttack(e); - + } else if(this.target != null) { rocketAttack(this.target); } - + } else if(this.ticksExisted % 20 == 10) { if(this.target != null) { rocketAttack(this.target); } } } - + } - + this.motionX = 0; this.motionY = 0; this.motionZ = 0; - + if(this.courseChangeCooldown > 0) { - + double deltaX = this.getX() - this.posX; double deltaY = this.getY() - this.posY; double deltaZ = this.getZ() - this.posZ; Vec3 delta = Vec3.createVectorHelper(deltaX, deltaY, deltaZ); double len = delta.lengthVector(); double speed = this.target instanceof EntityPlayer ? 5D : 2D; - + if(len > 5) { if(isCourseTraversable(this.getX(), this.getY(), this.getZ(), len)) { this.motionX = delta.xCoord * speed / len; @@ -286,22 +286,22 @@ public class EntityUFO extends EntityFlying implements IMob, IBossDisplayData, I } } } - + protected void onDeathUpdate() { - + if(this.getBeam()) this.setBeam(false); - + this.motionY -= 0.05D; - + if(this.deathTime == -10) { worldObj.playSoundAtEntity(this, "hbm:entity.chopperDamage", 10.0F, 1.0F); } - + if(this.deathTime == 19 && !worldObj.isRemote) { worldObj.newExplosion(this, posX, posY, posZ, 10F, true, true); ExplosionNukeSmall.explode(worldObj, posX, posY, posZ, ExplosionNukeSmall.PARAMS_MEDIUM); - + List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, this.boundingBox.expand(200, 200, 200)); for(EntityPlayer player : players) { @@ -309,12 +309,12 @@ public class EntityUFO extends EntityFlying implements IMob, IBossDisplayData, I player.inventory.addItemStackToInventory(new ItemStack(ModItems.coin_ufo)); } } - + super.onDeathUpdate(); } - + private void laserAttack(Entity e) { - + Vec3 vec = Vec3.createVectorHelper(this.posX - e.posX, 0, this.posZ - e.posZ); vec.rotateAroundY((float) Math.toRadians(-80 + rand.nextInt(160))); vec = vec.normalize(); @@ -333,7 +333,7 @@ public class EntityUFO extends EntityFlying implements IMob, IBossDisplayData, I this.worldObj.spawnEntityInWorld(bullet); this.playSound("hbm:weapon.ballsLaser", 5.0F, 1.0F); } - + private void rocketAttack(Entity e) { Vec3 heading = Vec3.createVectorHelper(e.posX - this.posX, e.posY + e.height / 2 - posY - 0.5D, e.posZ - this.posZ); @@ -347,7 +347,7 @@ public class EntityUFO extends EntityFlying implements IMob, IBossDisplayData, I this.worldObj.spawnEntityInWorld(bullet); this.playSound("hbm:turret.richard_fire", 5.0F, 1.0F); } - + @Override public boolean canAttackClass(Class clazz) { return clazz != this.getClass() && clazz != EntityBulletBaseNT.class; @@ -361,9 +361,9 @@ public class EntityUFO extends EntityFlying implements IMob, IBossDisplayData, I this.dataWatcher.addObject(18, 0); this.dataWatcher.addObject(19, 0); } - + private boolean isCourseTraversable(double p_70790_1_, double p_70790_3_, double p_70790_5_, double p_70790_7_) { - + double d4 = (this.getX() - this.posX) / p_70790_7_; double d5 = (this.getY() - this.posY) / p_70790_7_; double d6 = (this.getZ() - this.posZ) / p_70790_7_; @@ -379,7 +379,7 @@ public class EntityUFO extends EntityFlying implements IMob, IBossDisplayData, I return true; } - + @Override protected float getSoundVolume() { return 10.0F; @@ -394,12 +394,12 @@ public class EntityUFO extends EntityFlying implements IMob, IBossDisplayData, I protected String getDeathSound() { return null; } - + @Override public void writeEntityToNBT(NBTTagCompound p_70014_1_) { super.writeEntityToNBT(p_70014_1_); } - + @Override public void readEntityFromNBT(NBTTagCompound p_70037_1_) { super.readEntityFromNBT(p_70037_1_); @@ -430,7 +430,7 @@ public class EntityUFO extends EntityFlying implements IMob, IBossDisplayData, I public int getZ() { return this.dataWatcher.getWatchableObjectInt(19); } - + @Override @SideOnly(Side.CLIENT) public boolean isInRangeToRenderDist(double distance) { diff --git a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphid.java b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphid.java index 00162795a..46897ba87 100644 --- a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphid.java +++ b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphid.java @@ -15,6 +15,7 @@ import com.hbm.explosion.vanillant.ExplosionVNT; import com.hbm.explosion.vanillant.standard.*; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; import com.hbm.main.ResourceManager; @@ -83,7 +84,7 @@ public class EntityGlyphid extends EntityMob implements IResistanceProvider { public static final int TASK_TERRAFORM = 5; /** If any task other than IDLE is interrupted by an obstacle, initiates digging behavior which is also communicated to nearby glyohids */ public static final int TASK_DIG = 6; - + protected boolean hasWaypoint = false; /** Yeah, fuck, whatever, anything goes now */ protected EntityWaypoint taskWaypoint = null; @@ -97,7 +98,7 @@ public class EntityGlyphid extends EntityMob implements IResistanceProvider { public static final int DW_WALL = 16; public static final int DW_ARMOR = 17; public static final int DW_SUBTYPE = 18; - + public EntityGlyphid(World world) { super(world); this.setSize(1.75F, 1F); @@ -127,7 +128,7 @@ public class EntityGlyphid extends EntityMob implements IResistanceProvider { this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(GlyphidStats.getStats().getGrunt().speed * (variant == TYPE_RADIOACTIVE ? 2D : 1D)); this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(GlyphidStats.getStats().getGrunt().damage * (variant == TYPE_RADIOACTIVE ? 5D : 1D)); } - + public StatBundle getStats() { return GlyphidStats.getStats().statsGrunt; } @@ -137,15 +138,15 @@ public class EntityGlyphid extends EntityMob implements IResistanceProvider { if(damage.isDamageAbsolute() || damage.isUnblockable()) return new float[] {0F, 0F}; StatBundle stats = this.getStats(); float threshold = stats.thresholdMultForArmor * getGlyphidArmor() / 5F; - + if(damage == ModDamageSource.nuclearBlast) return new float[] {threshold * 0.25F, 0F}; // nukes shred shrough glyphids if(damage.damageType.equals(DamageClass.LASER.name().toLowerCase(Locale.US))) return new float[] {threshold * 0.5F, stats.resistanceMult * 0.5F}; //lasers are quite powerful too if(damage.damageType.equals(DamageClass.ELECTRIC.name().toLowerCase(Locale.US))) return new float[] {threshold * 0.25F, stats.resistanceMult * 0.25F}; //electricity even more so if(damage.damageType.equals(DamageClass.SUBATOMIC.name().toLowerCase(Locale.US))) return new float[] {0F, stats.resistanceMult * 0.1F}; //and particles are almsot commpletely unaffected - + if(damage.isFireDamage()) return new float[] {0F, stats.resistanceMult * 0.2F}; //fire ignores DT and most DR if(damage.isExplosion()) return new float[] {threshold * 0.5F, stats.resistanceMult * 0.35F}; //explosions are still subject to DT and reduce DR by a fair amount - + return new float[] {threshold, stats.resistanceMult}; } @@ -249,7 +250,7 @@ public class EntityGlyphid extends EntityMob implements IResistanceProvider { } if(hasWaypoint) { - + if(canDig()) { MovingObjectPosition obstacle = findWaypointObstruction(); @@ -268,7 +269,7 @@ public class EntityGlyphid extends EntityMob implements IResistanceProvider { } } } - + this.worldObj.theProfiler.endSection(); } } @@ -318,11 +319,11 @@ public class EntityGlyphid extends EntityMob implements IResistanceProvider { protected boolean canDespawn() { return entityToAttack == null && getCurrentTask() == TASK_IDLE && this.ticksExisted > 100; } - + @Override public void onDeath(DamageSource source) { super.onDeath(source); - + if(doesInfectedSpawnMaggots() && this.dataWatcher.getWatchableObjectByte(DW_SUBTYPE) == TYPE_INFECTED) { int j = 2 + this.rand.nextInt(3); @@ -339,12 +340,12 @@ public class EntityGlyphid extends EntityMob implements IResistanceProvider { } worldObj.playSoundEffect(posX, posY, posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); - + NBTTagCompound vdat = new NBTTagCompound(); vdat.setString("type", "giblets"); vdat.setInteger("ent", this.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(vdat, posX, posY + height * 0.5, posZ), new TargetPoint(dimension, posX, posY + height * 0.5, posZ, 150)); - + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(vdat, posX, posY + height * 0.5, posZ), new TargetPoint(dimension, posX, posY + height * 0.5, posZ, 150)); + } } @@ -357,17 +358,17 @@ public class EntityGlyphid extends EntityMob implements IResistanceProvider { /** Provides a direct entrypoint from outside to access the superclass' implementation because otherwise we end up with infinite recursion */ public boolean attackSuperclass(DamageSource source, float amount) { - + /*NBTTagCompound data = new NBTTagCompound(); data.setString("type", "debug"); data.setInteger("color", 0x0000ff); data.setFloat("scale", 2.5F); data.setString("text", "" + (int) amount); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY + 2, posZ), new TargetPoint(dimension, posX, posY + 2, posZ, 50));*/ - + return super.attackEntityFrom(source, amount); } - + public boolean doesInfectedSpawnMaggots() { return true; } @@ -392,7 +393,7 @@ public class EntityGlyphid extends EntityMob implements IResistanceProvider { } } } - + public int getGlyphidArmor() { int total = 0; byte armor = this.dataWatcher.getWatchableObjectByte(DW_ARMOR); @@ -453,12 +454,12 @@ public class EntityGlyphid extends EntityMob implements IResistanceProvider { public boolean attackEntityAsMob(Entity victim) { if(this.isSwingInProgress) return false; this.swingItem(); - + if(this.dataWatcher.getWatchableObjectByte(DW_SUBTYPE) == TYPE_INFECTED && victim instanceof EntityLivingBase) { ((EntityLivingBase) victim).addPotionEffect(new PotionEffect(Potion.poison.id, 100, 2)); ((EntityLivingBase) victim).addPotionEffect(new PotionEffect(Potion.confusion.id, 100, 0)); } - + return super.attackEntityAsMob(victim); } @@ -540,14 +541,14 @@ public class EntityGlyphid extends EntityMob implements IResistanceProvider { } break; - + case TASK_DIG: shouldDig = true; break; default: break; - + } } @@ -617,7 +618,7 @@ public class EntityGlyphid extends EntityMob implements IResistanceProvider { } ///DIGGING END - + @Override public void writeEntityToNBT(NBTTagCompound nbt) { super.writeEntityToNBT(nbt); diff --git a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidNuclear.java b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidNuclear.java index 8b2128de0..ee7990e2e 100644 --- a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidNuclear.java +++ b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidNuclear.java @@ -10,6 +10,7 @@ import com.hbm.explosion.vanillant.standard.BlockMutatorDebris; import com.hbm.explosion.vanillant.standard.BlockProcessorStandard; import com.hbm.explosion.vanillant.standard.EntityProcessorStandard; import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard; +import com.hbm.handler.threading.PacketThreading; import com.hbm.main.MainRegistry; import com.hbm.main.ResourceManager; import com.hbm.packet.PacketDispatcher; @@ -29,14 +30,14 @@ import javax.annotation.Nullable; import java.util.List; public class EntityGlyphidNuclear extends EntityGlyphid { - + public int deathTicks; public EntityGlyphidNuclear(World world) { super(world); this.setSize(2.5F, 1.75F); this.isImmuneToFire = true; } - + @Override public ResourceLocation getSkin() { return ResourceManager.glyphid_nuclear_tex; @@ -54,7 +55,7 @@ public class EntityGlyphidNuclear extends EntityGlyphid { this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(GlyphidStats.getStats().getNuclear().speed); this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(GlyphidStats.getStats().getNuclear().damage); } - + public StatBundle getStats() { return GlyphidStats.getStats().statsNuclear; } @@ -120,7 +121,7 @@ public class EntityGlyphidNuclear extends EntityGlyphid { communicate(TASK_INITIATE_RETREAT, null); hasWaypoint = true; } - + if(deathTicks == 90){ int radius = 8; AxisAlignedBB bb = AxisAlignedBB.getBoundingBox(this.posX, this.posY, this.posZ, this.posX, this.posY, this.posZ).expand(radius, radius, radius); @@ -134,7 +135,7 @@ public class EntityGlyphidNuclear extends EntityGlyphid { } } if(this.deathTicks == 100) { - + if(!worldObj.isRemote) { ExplosionVNT vnt = new ExplosionVNT(worldObj, posX, posY, posZ, 25, this); @@ -154,22 +155,22 @@ public class EntityGlyphidNuclear extends EntityGlyphid { vnt.setBlockAllocator(new BlockAllocatorStandard(24)); vnt.setBlockProcessor(new BlockProcessorStandard().withBlockEffect(new BlockMutatorDebris(ModBlocks.volcanic_lava_block, 0)).setNoDrop()); } - + vnt.setEntityProcessor(new EntityProcessorStandard()); vnt.setPlayerProcessor(new PlayerProcessorStandard()); vnt.explode(); worldObj.playSoundEffect(posX, posY, posZ, "hbm:weapon.mukeExplosion", 15.0F, 1.0F); - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "muke"); // if the FX type is "muke", apply random BF effect if(MainRegistry.polaroidID == 11 || rand.nextInt(100) == 0) { data.setBoolean("balefire", true); } - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(dimension, posX, posY, posZ, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(dimension, posX, posY, posZ, 250)); } - + this.setDead(); } else { if(!worldObj.isRemote && this.deathTicks % 10 == 0) { diff --git a/src/main/java/com/hbm/entity/mob/siege/EntitySiegeCraft.java b/src/main/java/com/hbm/entity/mob/siege/EntitySiegeCraft.java index 47dfee456..b647a1f39 100644 --- a/src/main/java/com/hbm/entity/mob/siege/EntitySiegeCraft.java +++ b/src/main/java/com/hbm/entity/mob/siege/EntitySiegeCraft.java @@ -4,8 +4,8 @@ import java.util.List; import com.hbm.entity.mob.EntityUFOBase; import com.hbm.entity.projectile.EntitySiegeLaser; +import com.hbm.handler.threading.PacketThreading; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ContaminationUtil; import com.hbm.util.ContaminationUtil.ContaminationType; @@ -27,7 +27,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; public class EntitySiegeCraft extends EntityUFOBase implements IBossDisplayData { - + private int attackCooldown; private int beamCountdown; @@ -37,52 +37,52 @@ public class EntitySiegeCraft extends EntityUFOBase implements IBossDisplayData this.isImmuneToFire = true; this.ignoreFrustumCheck = true; } - + @Override public boolean attackEntityFrom(DamageSource source, float damage) { - + if(this.isEntityInvulnerable()) return false; - + SiegeTier tier = this.getTier(); - + if(tier.fireProof && source.isFireDamage()) { this.extinguish(); return false; } - + //noFF can't be harmed by other mobs if(tier.noFriendlyFire && source instanceof EntityDamageSource && !(((EntityDamageSource) source).getEntity() instanceof EntityPlayer)) return false; - + damage -= tier.dt; - + if(damage < 0) { worldObj.playSoundAtEntity(this, "random.break", 5F, 1.0F + rand.nextFloat() * 0.5F); return false; } - + damage *= (1F - tier.dr); - + return super.attackEntityFrom(source, damage); } - + @Override protected void onDeathUpdate() { - + this.beamCountdown = 200; this.setBeam(false); - + this.motionY -= 0.05D; - + if(this.deathTime == 19 && !worldObj.isRemote) { - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "tinytot"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(this.dimension, posX, posY, posZ, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(this.dimension, posX, posY, posZ, 250)); worldObj.playSoundEffect(posX, posY, posZ, "hbm:weapon.mukeExplosion", 15.0F, 1.0F); } - + super.onDeathUpdate(); } @@ -95,7 +95,7 @@ public class EntitySiegeCraft extends EntityUFOBase implements IBossDisplayData this.getDataWatcher().addObject(15, 0F); this.getDataWatcher().addObject(16, (byte) 0); } - + public void setTier(SiegeTier tier) { this.getDataWatcher().updateObject(12, tier.id); @@ -103,26 +103,26 @@ public class EntitySiegeCraft extends EntityUFOBase implements IBossDisplayData this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(tier.health * 25); this.setHealth(this.getMaxHealth()); } - + public SiegeTier getTier() { SiegeTier tier = SiegeTier.tiers[this.getDataWatcher().getWatchableObjectInt(12)]; return tier != null ? tier : SiegeTier.CLAY; } - + public void setBeam(boolean beam) { this.getDataWatcher().updateObject(16, beam ? (byte) 1 : (byte) 0); } - + public boolean getBeam() { return this.getDataWatcher().getWatchableObjectByte(16) == 1; } - + public void setLockon(double x, double y, double z) { this.getDataWatcher().updateObject(13, (float) x); this.getDataWatcher().updateObject(14, (float) y); this.getDataWatcher().updateObject(15, (float) z); } - + public Vec3 getLockon() { return Vec3.createVectorHelper( this.getDataWatcher().getWatchableObjectFloat(13), @@ -156,7 +156,7 @@ public class EntitySiegeCraft extends EntityUFOBase implements IBossDisplayData if(this.scanCooldown > 0) { this.scanCooldown--; } - + if(!worldObj.isRemote) { if(this.attackCooldown > 0) { this.attackCooldown--; @@ -164,64 +164,64 @@ public class EntitySiegeCraft extends EntityUFOBase implements IBossDisplayData if(this.beamCountdown > 0) { this.beamCountdown--; } - + if(rand.nextInt(50) == 0) { - + NBTTagCompound dPart = new NBTTagCompound(); dPart.setString("type", "tau"); dPart.setByte("count", (byte)(2 + rand.nextInt(3))); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(dPart, posX + rand.nextGaussian() * 2, posY + rand.nextGaussian(), posZ + rand.nextGaussian() * 2), new TargetPoint(worldObj.provider.dimensionId, posX, posY, posZ, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(dPart, posX + rand.nextGaussian() * 2, posY + rand.nextGaussian(), posZ + rand.nextGaussian() * 2), new TargetPoint(worldObj.provider.dimensionId, posX, posY, posZ, 50)); } - + boolean beam = false; - + if(this.target == null || this.beamCountdown <= 0) { this.beamCountdown = 300; //200 - 100: nothing, 100 - 40: update lockon, 40 - 20: fix lockon, 20 - 0: beam } else { - + if(this.beamCountdown >= 60 && this.beamCountdown < 120) { double x = this.target.posX; double y = this.target.posY + this.target.height * 0.5; double z = this.target.posZ; this.setLockon(x, y, z); - + if(this.beamCountdown == 110) { worldObj.playSoundAtEntity(this.target, "hbm:weapon.stingerLockOn", 2F, 0.75F); } } - + if(this.beamCountdown >= 40 && this.beamCountdown < 100) { - + Vec3 lockon = this.getLockon(); NBTTagCompound fx = new NBTTagCompound(); fx.setString("type", "vanillaburst"); fx.setString("mode", "reddust"); fx.setDouble("motion", 0.2D); fx.setInteger("count", 5); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(fx, lockon.xCoord, lockon.yCoord, lockon.zCoord), new TargetPoint(this.dimension, lockon.xCoord, lockon.yCoord, lockon.zCoord, 100)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(fx, lockon.xCoord, lockon.yCoord, lockon.zCoord), new TargetPoint(this.dimension, lockon.xCoord, lockon.yCoord, lockon.zCoord, 100)); } - + if(this.beamCountdown < 40) { Vec3 lockon = this.getLockon(); - + if(this.beamCountdown == 39) { worldObj.playSoundEffect(lockon.xCoord, lockon.yCoord, lockon.zCoord, "hbm:entity.ufoBlast", 5.0F, 0.9F + worldObj.rand.nextFloat() * 0.2F); } - + List entities = worldObj.getEntitiesWithinAABBExcludingEntity(this, AxisAlignedBB.getBoundingBox(lockon.xCoord, lockon.yCoord, lockon.zCoord, lockon.xCoord, lockon.yCoord, lockon.zCoord).expand(2, 2, 2)); - + for(Entity e : entities) { if(this.canAttackClass(e.getClass())) { e.attackEntityFrom(ModDamageSource.causeCombineDamage(this, e), 1000F); e.setFire(5); - + if(e instanceof EntityLivingBase) ContaminationUtil.contaminate((EntityLivingBase)e, HazardType.RADIATION, ContaminationType.CREATIVE, 5F); } } - - + + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "plasmablast"); data.setFloat("r", 0.0F); @@ -230,36 +230,36 @@ public class EntitySiegeCraft extends EntityUFOBase implements IBossDisplayData data.setFloat("pitch", -90 + rand.nextFloat() * 180); data.setFloat("yaw", rand.nextFloat() * 180F); data.setFloat("scale", 5F); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, lockon.xCoord, lockon.yCoord, lockon.zCoord), new TargetPoint(dimension, lockon.xCoord, lockon.yCoord, lockon.zCoord, 150)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, lockon.xCoord, lockon.yCoord, lockon.zCoord), new TargetPoint(dimension, lockon.xCoord, lockon.yCoord, lockon.zCoord, 150)); beam = true; } } - + this.setBeam(beam); - + if(this.attackCooldown == 0 && this.target != null) { this.attackCooldown = 30 + rand.nextInt(10); - + double x = posX; double y = posY; double z = posZ; - + Vec3 vec = Vec3.createVectorHelper(target.posX - x, target.posY + target.height * 0.5 - y, target.posZ - z).normalize(); SiegeTier tier = this.getTier(); - + float health = getHealth() / getMaxHealth(); int r = (int)(0xff * (1 - health)); int g = (int)(0xff * health); int b = 0; int color = (r << 16) | (g << 8) | b; - + for(int i = 0; i < 7; i++) { - + Vec3 copy = Vec3.createVectorHelper(vec.xCoord, vec.yCoord, vec.zCoord); - + copy.rotateAroundY((float)Math.PI / 180F * (i - 3) * 5F); - + EntitySiegeLaser laser = new EntitySiegeLaser(worldObj, this); laser.setPosition(x, y, z); laser.setThrowableHeading(copy.xCoord, copy.yCoord, copy.zCoord, 1F, 0.0F); @@ -269,11 +269,11 @@ public class EntitySiegeCraft extends EntityUFOBase implements IBossDisplayData if(tier.laserIncendiary) laser.setIncendiary(); worldObj.spawnEntityInWorld(laser); } - + this.playSound("hbm:weapon.ballsLaser", 2.0F, 1.0F); } } - + if(this.courseChangeCooldown > 0) { approachPosition(this.target == null ? 0.25D : 0.5D + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue() * 1); } @@ -306,7 +306,7 @@ public class EntitySiegeCraft extends EntityUFOBase implements IBossDisplayData @Override protected void dropFewItems(boolean byPlayer, int fortune) { - + if(byPlayer) { for(ItemStack drop : this.getTier().dropItem) { this.entityDropItem(drop.copy(), 0F); diff --git a/src/main/java/com/hbm/entity/projectile/EntityBombletZeta.java b/src/main/java/com/hbm/entity/projectile/EntityBombletZeta.java index 9618217ed..e6b3f672c 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityBombletZeta.java +++ b/src/main/java/com/hbm/entity/projectile/EntityBombletZeta.java @@ -10,7 +10,7 @@ import com.hbm.explosion.vanillant.standard.BlockProcessorStandard; import com.hbm.explosion.vanillant.standard.EntityProcessorCrossSmooth; import com.hbm.explosion.vanillant.standard.ExplosionEffectWeapon; import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -24,14 +24,14 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; public class EntityBombletZeta extends EntityThrowable { - + public int type = 0; public EntityBombletZeta(World p_i1582_1_) { super(p_i1582_1_); this.ignoreFrustumCheck = true; } - + @Override public void onUpdate() { @@ -79,14 +79,14 @@ public class EntityBombletZeta extends EntityThrowable { data.setString("type", "muke"); if(rand.nextInt(100) == 0) data.setBoolean("balefire", true); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(dimension, posX, posY, posZ, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(dimension, posX, posY, posZ, 250)); worldObj.playSoundEffect(posX, posY, posZ, "hbm:weapon.mukeExplosion", 15.0F, 1.0F); } this.setDead(); } } } - + public void rotation() { float f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); @@ -115,7 +115,7 @@ public class EntityBombletZeta extends EntityThrowable { @Override protected void onImpact(MovingObjectPosition p_70184_1_) { } - + @Override @SideOnly(Side.CLIENT) public boolean isInRangeToRenderDist(double distance) diff --git a/src/main/java/com/hbm/entity/projectile/EntityBoxcar.java b/src/main/java/com/hbm/entity/projectile/EntityBoxcar.java index 7baf2de1f..dd4632feb 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityBoxcar.java +++ b/src/main/java/com/hbm/entity/projectile/EntityBoxcar.java @@ -4,8 +4,8 @@ import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.explosion.ExplosionLarge; +import com.hbm.handler.threading.PacketThreading; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -26,7 +26,7 @@ public class EntityBoxcar extends EntityThrowable { this.ignoreFrustumCheck = true; this.isImmuneToFire = true; } - + @Override public void onUpdate() { @@ -34,7 +34,7 @@ public class EntityBoxcar extends EntityThrowable { for(int i = 0; i < 50; i++) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "bf"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX + (rand.nextDouble() - 0.5) * 3, posY + (rand.nextDouble() - 0.5) * 15, posZ + (rand.nextDouble() - 0.5) * 3), @@ -46,7 +46,7 @@ public class EntityBoxcar extends EntityThrowable { this.lastTickPosY = this.prevPosY = posY; this.lastTickPosZ = this.prevPosZ = posZ; this.setPosition(posX + this.motionX, posY + this.motionY, posZ + this.motionZ); - + this.motionY -= 0.03; if(motionY < -1.5) motionY = -1.5; @@ -73,7 +73,7 @@ public class EntityBoxcar extends EntityThrowable { @Override protected void onImpact(MovingObjectPosition p_70184_1_) { } - + @Override @SideOnly(Side.CLIENT) public boolean isInRangeToRenderDist(double distance) { diff --git a/src/main/java/com/hbm/entity/projectile/EntityBulletBaseNT.java b/src/main/java/com/hbm/entity/projectile/EntityBulletBaseNT.java index d6370efb8..64f7cf757 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityBulletBaseNT.java +++ b/src/main/java/com/hbm/entity/projectile/EntityBulletBaseNT.java @@ -23,9 +23,9 @@ import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard; import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.handler.BulletConfiguration; import com.hbm.handler.GunConfiguration; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.weapon.ItemGunBase; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.potion.HbmPotion; import com.hbm.util.ArmorUtil; @@ -58,7 +58,7 @@ import net.minecraft.world.World; * @author hbm */ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBulletBase { - + @Override public double prevX() { return prevRenderX; } @Override public double prevY() { return prevRenderY; } @Override public double prevZ() { return prevRenderZ; } @@ -66,7 +66,7 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet @Override public void prevY(double d) { prevRenderY = d; } @Override public void prevZ(double d) { prevRenderZ = d; } @Override public List> nodes() { return this.trailNodes; } - + private BulletConfiguration config; public float overrideDamage; @@ -74,7 +74,7 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet public double prevRenderY; public double prevRenderZ; public final List> trailNodes = new ArrayList>(); - + public BulletConfiguration getConfig() { return config; } @@ -92,15 +92,15 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet this.dataWatcher.updateObject(16, (byte)this.config.style); this.dataWatcher.updateObject(17, (byte)this.config.trail); this.renderDistanceWeight = 10.0D; - + if(this.config == null) { this.setDead(); return; } - + this.setSize(0.5F, 0.5F); } - + public EntityBulletBaseNT(World world, int config, EntityLivingBase entity) { super(world); this.config = BulletConfigSyncingUtil.pullConfig(config); @@ -108,11 +108,11 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet this.dataWatcher.updateObject(16, (byte)this.config.style); this.dataWatcher.updateObject(17, (byte)this.config.trail); thrower = entity; - + ItemStack gun = entity.getHeldItem(); boolean offsetShot = true; boolean accuracyBoost = false; - + if(gun != null && gun.getItem() instanceof ItemGunBase) { GunConfiguration cfg = ((ItemGunBase) gun.getItem()).mainConfig; @@ -129,10 +129,10 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet } this.setLocationAndAngles(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ, entity.rotationYaw, entity.rotationPitch); - + if(offsetShot) { double sideOffset = 0.16D; - + this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * sideOffset; this.posY -= 0.1D; this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * sideOffset; @@ -140,7 +140,7 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet this.posY -= 0.1D; } this.setPosition(this.posX, this.posY, this.posZ); - + this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI); this.motionZ = MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI); this.motionY = (-MathHelper.sin(this.rotationPitch / 180.0F * (float) Math.PI)); @@ -153,7 +153,7 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet public EntityBulletBaseNT(World world, int config, EntityLivingBase entity, EntityLivingBase target, float motion, float deviation) { super(world); - + this.config = BulletConfigSyncingUtil.pullConfig(config); this.dataWatcher.updateObject(18, config); this.dataWatcher.updateObject(16, (byte)this.config.style); @@ -190,17 +190,17 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet //bullet config sync this.dataWatcher.addObject(18, Integer.valueOf((int) 0)); } - + @Override public void onUpdate() { - + if(config == null) config = BulletConfigSyncingUtil.pullConfig(dataWatcher.getWatchableObjectInt(18)); if(config == null){ this.setDead(); return; } - + if(worldObj.isRemote && config.style == BulletConfiguration.STYLE_TAU) { if(trailNodes.isEmpty()) { this.ignoreFrustumCheck = true; @@ -209,9 +209,9 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet trailNodes.add(new Pair(Vec3.createVectorHelper(0, 0, 0), 1D)); } } - + if(worldObj.isRemote && this.config.blackPowder && this.ticksExisted == 1) { - + for(int i = 0; i < 15; i++) { double mod = rand.nextDouble(); this.worldObj.spawnParticle("smoke", this.posX, this.posY, this.posZ, @@ -219,38 +219,38 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet (this.motionY + rand.nextGaussian() * 0.05) * mod, (this.motionZ + rand.nextGaussian() * 0.05) * mod); } - + double mod = 0.5; this.worldObj.spawnParticle("flame", this.posX + this.motionX * mod, this.posY + this.motionY * mod, this.posZ + this.motionZ * mod, 0, 0, 0); } - + if(!worldObj.isRemote) { - + if(config.maxAge == 0) { if(this.config.bntUpdate != null) this.config.bntUpdate.behaveUpdate(this); this.setDead(); return; } - + if(this.ticksExisted > config.maxAge) this.setDead(); } - + if(this.config.bntUpdate != null) this.config.bntUpdate.behaveUpdate(this); this.prevPosX = posX; this.prevPosY = posY; this.prevPosZ = posZ; - + super.onUpdate(); - + if(worldObj.isRemote && !config.vPFX.isEmpty()) { - + Vec3 vec = Vec3.createVectorHelper(posX - prevPosX, posY - prevPosY, posZ - prevPosZ); double motion = Math.max(vec.lengthVector(), 0.1); vec = vec.normalize(); - + for(double d = 0; d < motion; d += 0.5) { - + NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("type", "vanillaExt"); nbt.setString("mode", config.vPFX); @@ -264,9 +264,9 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet @Override protected void onImpact(MovingObjectPosition mop) { - + if(mop.typeOfHit == MovingObjectType.BLOCK) { - + boolean hRic = rand.nextInt(100) < config.HBRC; boolean doesRic = config.doesRicochet && hRic; @@ -313,7 +313,7 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet this.setPosition(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); onRicochet(mop.blockX, mop.blockY, mop.blockZ); - + //worldObj.setBlock((int) Math.floor(posX), (int) Math.floor(posY), (int) Math.floor(posZ), Blocks.dirt); } else { @@ -326,44 +326,44 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet /*this.posX += (mop.hitVec.xCoord - this.posX) * 0.6; this.posY += (mop.hitVec.yCoord - this.posY) * 0.6; this.posZ += (mop.hitVec.zCoord - this.posZ) * 0.6;*/ - + this.motionX *= config.bounceMod; this.motionY *= config.bounceMod; this.motionZ *= config.bounceMod; } } - + } - + if(mop.entityHit != null) { DamageSource damagesource = this.config.getDamage(this, this.thrower); Entity victim = mop.entityHit; - + if(!config.doesPenetrate) { this.setPosition(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); onEntityImpact(victim); } else { onEntityHurt(victim); } - + float damage = rand.nextFloat() * (config.dmgMax - config.dmgMin) + config.dmgMin; - + if(overrideDamage != 0) damage = overrideDamage; - + boolean headshot = false; - + if(victim instanceof EntityLivingBase && this.config.headshotMult > 1F) { EntityLivingBase living = (EntityLivingBase) victim; double head = living.height - living.getEyeHeight(); - + if(!!living.isEntityAlive() && mop.hitVec != null && mop.hitVec.yCoord > (living.posY + living.height - head * 2)) { damage *= this.config.headshotMult; headshot = true; } } - + if(victim != null && !victim.attackEntityFrom(damagesource, damage)) { try { @@ -371,7 +371,7 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet float dmg = (float) damage + lastDamage.getFloat(victim); if(!victim.attackEntityFrom(damagesource, dmg)) headshot = false; } catch (Exception x) { } - + } if(!worldObj.isRemote && headshot) { @@ -384,25 +384,25 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet data.setDouble("motion", 0.1D); data.setString("mode", "blockdust"); data.setInteger("block", Block.getIdFromBlock(Blocks.redstone_block)); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, living.posX, living.posY + living.height - head, living.posZ), new TargetPoint(living.dimension, living.posX, living.posY, living.posZ, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, living.posX, living.posY + living.height - head, living.posZ), new TargetPoint(living.dimension, living.posX, living.posY, living.posZ, 50)); worldObj.playSoundEffect(victim.posX, victim.posY, victim.posZ, "mob.zombie.woodbreak", 1.0F, 0.95F + rand.nextFloat() * 0.2F); } } } } - + //for when a bullet dies by hitting a block private void onBlockImpact(int bX, int bY, int bZ, int sideHit) { Block block = worldObj.getBlock(bX, bY, bZ); - + if(config.bntImpact != null) config.bntImpact.behaveBlockHit(this, bX, bY, bZ, sideHit); - + if(!worldObj.isRemote) { if(!config.liveAfterImpact && !config.isSpectral && bY > -1 && !this.inGround) this.setDead(); if(!config.doesPenetrate && bY == -1) this.setDead(); } - + if(config.incendiary > 0 && !this.worldObj.isRemote) { if(worldObj.rand.nextInt(3) == 0 && worldObj.getBlock((int)posX, (int)posY, (int)posZ) == Blocks.air) worldObj.setBlock((int)posX, (int)posY, (int)posZ, Blocks.fire); if(worldObj.rand.nextInt(3) == 0 && worldObj.getBlock((int)posX + 1, (int)posY, (int)posZ) == Blocks.air) worldObj.setBlock((int)posX + 1, (int)posY, (int)posZ, Blocks.fire); @@ -415,22 +415,22 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet if(config.emp > 0) ExplosionNukeGeneric.empBlast(this.worldObj, (int)(this.posX + 0.5D), (int)(this.posY + 0.5D), (int)(this.posZ + 0.5D), config.emp); - + if(config.emp > 3) { if (!this.worldObj.isRemote) { - + EntityEMPBlast cloud = new EntityEMPBlast(this.worldObj, config.emp); cloud.posX = this.posX; cloud.posY = this.posY + 0.5F; cloud.posZ = this.posZ; - + this.worldObj.spawnEntityInWorld(cloud); } } - + if(config.jolt > 0 && !worldObj.isRemote) ExplosionLarge.jolt(worldObj, posX, posY, posZ, config.jolt, 150, 0.25); - + if(config.explosive > 0 && !worldObj.isRemote) { //worldObj.newExplosion(this.thrower, posX, posY, posZ, config.explosive, config.incendiary > 0, config.blockDamage); ExplosionVNT vnt = new ExplosionVNT(worldObj, posX, posY, posZ, config.explosive, this.thrower); @@ -442,21 +442,21 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet vnt.setSFX(new ExplosionEffectStandard()); vnt.explode(); } - + if(config.shrapnel > 0 && !worldObj.isRemote) ExplosionLarge.spawnShrapnels(worldObj, posX, posY, posZ, config.shrapnel); - + if(config.chlorine > 0 && !worldObj.isRemote) { ExplosionChaos.spawnChlorine(worldObj, posX, posY, posZ, config.chlorine, 1.5, 0); worldObj.playSoundEffect((double)(posX + 0.5F), (double)(posY + 0.5F), (double)(posZ + 0.5F), "random.fizz", 5.0F, 2.6F + (rand.nextFloat() - rand.nextFloat()) * 0.8F); } - + if(config.rainbow > 0 && !worldObj.isRemote) { EntityNukeExplosionMK3 ex = EntityNukeExplosionMK3.statFacFleija(worldObj, posX, posY, posZ, config.rainbow); if(!ex.isDead) { this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, "random.explode", 100.0f, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); worldObj.spawnEntityInWorld(ex); - + EntityCloudFleijaRainbow cloud = new EntityCloudFleijaRainbow(this.worldObj, config.rainbow); cloud.posX = this.posX; cloud.posY = this.posY; @@ -464,74 +464,74 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet this.worldObj.spawnEntityInWorld(cloud); } } - + if(config.nuke > 0 && !worldObj.isRemote) { worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, config.nuke, posX, posY, posZ)); NBTTagCompound data = new NBTTagCompound(); data.setString("type", "muke"); if(MainRegistry.polaroidID == 11 || rand.nextInt(100) == 0) data.setBoolean("balefire", true); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(dimension, posX, posY, posZ, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(dimension, posX, posY, posZ, 250)); worldObj.playSoundEffect(posX, posY, posZ, "hbm:weapon.mukeExplosion", 15.0F, 1.0F); } - + if(config.destroysBlocks && !worldObj.isRemote) { if(block.getBlockHardness(worldObj, bX, bY, bZ) <= 120) worldObj.func_147480_a(bX, bY, bZ, false); } else if(config.doesBreakGlass && !worldObj.isRemote) { if(block == Blocks.glass || block == Blocks.glass_pane || block == Blocks.stained_glass || block == Blocks.stained_glass_pane) worldObj.func_147480_a(bX, bY, bZ, false); - + if(block instanceof BlockDetonatable) { ((BlockDetonatable) block).onShot(worldObj, bX, bY, bZ); } } } - + //for when a bullet dies by hitting a block private void onRicochet(int bX, int bY, int bZ) { - + if(config.bntRicochet != null) config.bntRicochet.behaveBlockRicochet(this, bX, bY, bZ); } - + //for when a bullet dies by hitting an entity private void onEntityImpact(Entity e) { onEntityHurt(e); onBlockImpact(-1, -1, -1, -1); - + if(config.bntHit != null) config.bntHit.behaveEntityHit(this, e); - + //this.setDead(); } - + //for when a bullet hurts an entity, not necessarily dying private void onEntityHurt(Entity e) { - + if(config.bntHurt != null) config.bntHurt.behaveEntityHurt(this, e); - + if(config.incendiary > 0 && !worldObj.isRemote) { e.setFire(config.incendiary); } - + if(config.leadChance > 0 && !worldObj.isRemote && worldObj.rand.nextInt(100) < config.leadChance && e instanceof EntityLivingBase) { ((EntityLivingBase)e).addPotionEffect(new PotionEffect(HbmPotion.lead.id, 10 * 20, 0)); } - + if(e instanceof EntityLivingBase && config.effects != null && !config.effects.isEmpty() && !worldObj.isRemote) { - + for(PotionEffect effect : config.effects) { ((EntityLivingBase)e).addPotionEffect(new PotionEffect(effect)); } } - + if(config.instakill && e instanceof EntityLivingBase && !worldObj.isRemote) { - + if(!(e instanceof EntityPlayer && ((EntityPlayer)e).capabilities.isCreativeMode)) ((EntityLivingBase)e).setHealth(0.0F); } - + if(config.caustic > 0 && e instanceof EntityPlayer){ ArmorUtil.damageSuit((EntityPlayer)e, 0, config.caustic); ArmorUtil.damageSuit((EntityPlayer)e, 1, config.caustic); @@ -587,12 +587,12 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet this.config = BulletConfigSyncingUtil.pullConfig(cfg); this.dataWatcher.updateObject(16, (byte)this.config.style); this.dataWatcher.updateObject(17, (byte)this.config.trail); - + if(this.config == null) { this.setDead(); return; } - + this.overrideDamage = nbt.getFloat("damage"); this.dataWatcher.updateObject(18, cfg); } @@ -603,7 +603,7 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet nbt.setInteger("config", dataWatcher.getWatchableObjectInt(18)); nbt.setFloat("damage", this.overrideDamage); } - + public static interface IBulletHurtBehaviorNT { public void behaveEntityHurt(EntityBulletBaseNT bullet, Entity hit); } public static interface IBulletHitBehaviorNT { public void behaveEntityHit(EntityBulletBaseNT bullet, Entity hit); } public static interface IBulletRicochetBehaviorNT { public void behaveBlockRicochet(EntityBulletBaseNT bullet, int x, int y, int z); } diff --git a/src/main/java/com/hbm/entity/projectile/EntityCog.java b/src/main/java/com/hbm/entity/projectile/EntityCog.java index 8fb460a3e..ba28a98fd 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityCog.java +++ b/src/main/java/com/hbm/entity/projectile/EntityCog.java @@ -1,8 +1,8 @@ package com.hbm.entity.projectile; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -37,21 +37,21 @@ public class EntityCog extends EntityThrowableInterp { this.dataWatcher.addObject(10, new Integer(0)); this.dataWatcher.addObject(11, new Integer(0)); } - + public EntityCog setOrientation(int rot) { this.dataWatcher.updateObject(10, rot); return this; } - + public EntityCog setMeta(int meta) { this.dataWatcher.updateObject(11, meta); return this; } - + public int getOrientation() { return this.dataWatcher.getWatchableObjectInt(10); } - + public int getMeta() { return this.dataWatcher.getWatchableObjectInt(11); } @@ -60,10 +60,10 @@ public class EntityCog extends EntityThrowableInterp { public boolean interactFirst(EntityPlayer player) { if(!worldObj.isRemote) { - + if(player.inventory.addItemStackToInventory(new ItemStack(ModItems.gear_large, 1, this.getMeta()))) this.setDead(); - + player.inventoryContainer.detectAndSendChanges(); } @@ -77,7 +77,7 @@ public class EntityCog extends EntityThrowableInterp { @Override protected void onImpact(MovingObjectPosition mop) { - + if(worldObj != null && mop != null && mop.typeOfHit == MovingObjectType.ENTITY && mop.entityHit.isEntityAlive()) { Entity e = mop.entityHit; e.attackEntityFrom(ModDamageSource.rubble, 1000); @@ -86,18 +86,18 @@ public class EntityCog extends EntityThrowableInterp { vdat.setString("type", "giblets"); vdat.setInteger("ent", e.getEntityId()); vdat.setInteger("cDiv", 5); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(vdat, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY + e.height * 0.5, e.posZ, 150)); - + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(vdat, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY + e.height * 0.5, e.posZ, 150)); + worldObj.playSoundEffect(e.posX, e.posY, e.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); } } - + if(this.ticksExisted > 1 && worldObj != null && mop != null && mop.typeOfHit == MovingObjectType.BLOCK) { - + int orientation = this.dataWatcher.getWatchableObjectInt(10); if(orientation < 6) { - + if(Vec3.createVectorHelper(motionX, motionY, motionZ).lengthVector() < 0.75) { this.dataWatcher.updateObject(10, orientation + 6); orientation += 6; @@ -107,13 +107,13 @@ public class EntityCog extends EntityThrowableInterp { this.motionY *= 1 - (Math.abs(side.offsetY) * 2); this.motionZ *= 1 - (Math.abs(side.offsetZ) * 2); worldObj.createExplosion(this, posX, posY, posZ, 3F, false); - + if(worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ).getExplosionResistance(this) < 50) { worldObj.func_147480_a(mop.blockX, mop.blockY, mop.blockZ, false); } } } - + if(orientation >= 6) { this.motionX = 0; this.motionY = 0; @@ -122,20 +122,20 @@ public class EntityCog extends EntityThrowableInterp { } } } - + @Override public void onUpdate() { - + if(!worldObj.isRemote) { int orientation = this.dataWatcher.getWatchableObjectInt(10); if(orientation >= 6 && !this.inGround) { this.dataWatcher.updateObject(10, orientation - 6); } } - + super.onUpdate(); } - + @Override @SideOnly(Side.CLIENT) public boolean isInRangeToRenderDist(double distance) { diff --git a/src/main/java/com/hbm/entity/projectile/EntityDuchessGambit.java b/src/main/java/com/hbm/entity/projectile/EntityDuchessGambit.java index 57cae2213..5a75fb637 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityDuchessGambit.java +++ b/src/main/java/com/hbm/entity/projectile/EntityDuchessGambit.java @@ -4,8 +4,8 @@ import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.explosion.ExplosionLarge; +import com.hbm.handler.threading.PacketThreading; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -26,7 +26,7 @@ public class EntityDuchessGambit extends EntityThrowable { this.ignoreFrustumCheck = true; this.isImmuneToFire = true; } - + @Override public void onUpdate() { @@ -34,7 +34,7 @@ public class EntityDuchessGambit extends EntityThrowable { for(int i = 0; i < 50; i++) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "bf"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX + (rand.nextDouble() - 0.5) * 5, posY + (rand.nextDouble() - 0.5) * 7, posZ + (rand.nextDouble() - 0.5) * 20), @@ -47,7 +47,7 @@ public class EntityDuchessGambit extends EntityThrowable { this.lastTickPosY = this.prevPosY = posY; this.lastTickPosZ = this.prevPosZ = posZ; this.setPosition(posX + this.motionX, posY + this.motionY, posZ + this.motionZ); - + this.motionY -= 0.03; if(motionY < -1.5) motionY = -1.5; @@ -81,9 +81,9 @@ public class EntityDuchessGambit extends EntityThrowable { @Override protected void onImpact(MovingObjectPosition p_70184_1_) { - + } - + @Override @SideOnly(Side.CLIENT) public boolean isInRangeToRenderDist(double distance) diff --git a/src/main/java/com/hbm/entity/projectile/EntitySawblade.java b/src/main/java/com/hbm/entity/projectile/EntitySawblade.java index fcc0c5a79..62fb55b26 100644 --- a/src/main/java/com/hbm/entity/projectile/EntitySawblade.java +++ b/src/main/java/com/hbm/entity/projectile/EntitySawblade.java @@ -1,10 +1,9 @@ package com.hbm.entity.projectile; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; - import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -37,16 +36,16 @@ public class EntitySawblade extends EntityThrowableInterp { this.dataWatcher.addObject(10, new Integer(0)); this.dataWatcher.addObject(11, new Integer(0)); } - + public EntitySawblade setOrientation(int rot) { this.dataWatcher.updateObject(10, rot); return this; } - + public int getOrientation() { return this.dataWatcher.getWatchableObjectInt(10); } - + public int getMeta() { return this.dataWatcher.getWatchableObjectInt(11); } @@ -55,10 +54,10 @@ public class EntitySawblade extends EntityThrowableInterp { public boolean interactFirst(EntityPlayer player) { if(!worldObj.isRemote) { - + if(player.inventory.addItemStackToInventory(new ItemStack(ModItems.sawblade))) this.setDead(); - + player.inventoryContainer.detectAndSendChanges(); } @@ -72,7 +71,7 @@ public class EntitySawblade extends EntityThrowableInterp { @Override protected void onImpact(MovingObjectPosition mop) { - + if(worldObj != null && mop != null && mop.typeOfHit == MovingObjectType.ENTITY && mop.entityHit.isEntityAlive()) { Entity e = mop.entityHit; e.attackEntityFrom(ModDamageSource.rubble, 1000); @@ -81,18 +80,18 @@ public class EntitySawblade extends EntityThrowableInterp { vdat.setString("type", "giblets"); vdat.setInteger("ent", e.getEntityId()); vdat.setInteger("cDiv", 5); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(vdat, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY + e.height * 0.5, e.posZ, 150)); - + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(vdat, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY + e.height * 0.5, e.posZ, 150)); + worldObj.playSoundEffect(e.posX, e.posY, e.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); } } - + if(this.ticksExisted > 1 && worldObj != null && mop != null && mop.typeOfHit == MovingObjectType.BLOCK) { - + int orientation = this.dataWatcher.getWatchableObjectInt(10); if(orientation < 6) { - + if(Vec3.createVectorHelper(motionX, motionY, motionZ).lengthVector() < 0.75) { this.dataWatcher.updateObject(10, orientation + 6); orientation += 6; @@ -102,13 +101,13 @@ public class EntitySawblade extends EntityThrowableInterp { this.motionY *= 1 - (Math.abs(side.offsetY) * 2); this.motionZ *= 1 - (Math.abs(side.offsetZ) * 2); worldObj.createExplosion(this, posX, posY, posZ, 3F, false); - + if(worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ).getExplosionResistance(this) < 50) { worldObj.func_147480_a(mop.blockX, mop.blockY, mop.blockZ, false); } } } - + if(orientation >= 6) { this.motionX = 0; this.motionY = 0; @@ -117,20 +116,20 @@ public class EntitySawblade extends EntityThrowableInterp { } } } - + @Override public void onUpdate() { - + if(!worldObj.isRemote) { int orientation = this.dataWatcher.getWatchableObjectInt(10); if(orientation >= 6 && !this.inGround) { this.dataWatcher.updateObject(10, orientation - 6); } } - + super.onUpdate(); } - + @Override @SideOnly(Side.CLIENT) public boolean isInRangeToRenderDist(double distance) { diff --git a/src/main/java/com/hbm/entity/projectile/EntityTorpedo.java b/src/main/java/com/hbm/entity/projectile/EntityTorpedo.java index ddd1dc760..8dc541649 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityTorpedo.java +++ b/src/main/java/com/hbm/entity/projectile/EntityTorpedo.java @@ -1,7 +1,7 @@ package com.hbm.entity.projectile; import com.hbm.explosion.vanillant.ExplosionVNT; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.helper.ExplosionCreator; @@ -21,7 +21,7 @@ public class EntityTorpedo extends EntityThrowable { this.ignoreFrustumCheck = true; this.isImmuneToFire = true; } - + @Override public void onUpdate() { @@ -29,7 +29,7 @@ public class EntityTorpedo extends EntityThrowable { for(int i = 0; i < 15; i++) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "bf"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX + (rand.nextDouble() - 0.5) * 2, posY + (rand.nextDouble() - 0.5) * 1, posZ + (rand.nextDouble() - 0.5) * 2), @@ -40,9 +40,9 @@ public class EntityTorpedo extends EntityThrowable { this.lastTickPosX = this.prevPosX = posX; this.lastTickPosY = this.prevPosY = posY; this.lastTickPosZ = this.prevPosZ = posZ; - + this.setPosition(posX + this.motionX, posY + this.motionY, posZ + this.motionZ); - + this.motionY -= 0.04; if(motionY < -2.5) motionY = -2.5; @@ -59,7 +59,7 @@ public class EntityTorpedo extends EntityThrowable { @Override protected void onImpact(MovingObjectPosition p_70184_1_) { } - + @Override @SideOnly(Side.CLIENT) public boolean isInRangeToRenderDist(double distance) { diff --git a/src/main/java/com/hbm/explosion/ExplosionLarge.java b/src/main/java/com/hbm/explosion/ExplosionLarge.java index 4dcbc9e12..2674ee25d 100644 --- a/src/main/java/com/hbm/explosion/ExplosionLarge.java +++ b/src/main/java/com/hbm/explosion/ExplosionLarge.java @@ -5,7 +5,7 @@ import java.util.Random; import com.hbm.entity.projectile.EntityRubble; import com.hbm.entity.projectile.EntityShrapnel; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ParticleUtil; @@ -19,51 +19,51 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; public class ExplosionLarge { - + static Random rand = new Random(); @Deprecated public static void spawnParticles(World world, double x, double y, double z, int count) { - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "smoke"); data.setString("mode", "cloud"); data.setInteger("count", count); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(world.provider.dimensionId, x, y, z, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(world.provider.dimensionId, x, y, z, 250)); } public static void spawnParticlesRadial(World world, double x, double y, double z, int count) { - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "smoke"); data.setString("mode", "radial"); data.setInteger("count", count); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(world.provider.dimensionId, x, y, z, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(world.provider.dimensionId, x, y, z, 250)); } public static void spawnShock(World world, double x, double y, double z, int count, double strength) { - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "smoke"); data.setString("mode", "shock"); data.setInteger("count", count); data.setDouble("strength", strength); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y + 0.5, z), new TargetPoint(world.provider.dimensionId, x, y, z, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x, y + 0.5, z), new TargetPoint(world.provider.dimensionId, x, y, z, 250)); } public static void spawnBurst(World world, double x, double y, double z, int count, double strength) { - + Vec3 vec = Vec3.createVectorHelper(strength, 0, 0); vec.rotateAroundY(rand.nextInt(360)); - + for(int i = 0; i < count; i++) { ParticleUtil.spawnGasFlame(world, x, y, z, vec.xCoord, 0.0, vec.zCoord); - + vec.rotateAroundY(360 / count); } } - + public static void spawnRubble(World world, double x, double y, double z, int count) { - + for(int i = 0; i < count; i++) { EntityRubble rubble = new EntityRubble(world); rubble.posX = x; @@ -76,9 +76,9 @@ public class ExplosionLarge { world.spawnEntityInWorld(rubble); } } - + public static void spawnShrapnels(World world, double x, double y, double z, int count) { - + for(int i = 0; i < count; i++) { EntityShrapnel shrapnel = new EntityShrapnel(world); shrapnel.posX = x; @@ -91,9 +91,9 @@ public class ExplosionLarge { world.spawnEntityInWorld(shrapnel); } } - + public static void spawnTracers(World world, double x, double y, double z, int count) { - + for(int i = 0; i < count; i++) { EntityShrapnel shrapnel = new EntityShrapnel(world); shrapnel.posX = x; @@ -106,9 +106,9 @@ public class ExplosionLarge { world.spawnEntityInWorld(shrapnel); } } - + public static void spawnShrapnelShower(World world, double x, double y, double z, double motionX, double motionY, double motionZ, int count, double deviation) { - + for(int i = 0; i < count; i++) { EntityShrapnel shrapnel = new EntityShrapnel(world); shrapnel.posX = x; @@ -121,9 +121,9 @@ public class ExplosionLarge { world.spawnEntityInWorld(shrapnel); } } - + public static void spawnMissileDebris(World world, double x, double y, double z, double motionX, double motionY, double motionZ, double deviation, List debris, ItemStack rareDrop) { - + if(debris != null) { for(int i = 0; i < debris.size(); i++) { if(debris.get(i) != null) { @@ -136,23 +136,23 @@ public class ExplosionLarge { item.posX = item.posX + item.motionX * 2; item.posY = item.posY + item.motionY * 2; item.posZ = item.posZ + item.motionZ * 2; - + world.spawnEntityInWorld(item); } } } } - + if(rareDrop != null && rand.nextInt(10) == 0) { EntityItem item = new EntityItem(world, x, y, z, rareDrop.copy()); item.motionX = motionX + rand.nextGaussian() * deviation * 0.1; item.motionY = motionY + rand.nextGaussian() * deviation * 0.1; item.motionZ = motionZ + rand.nextGaussian() * deviation * 0.1; - + world.spawnEntityInWorld(item); } } - + @Deprecated public static void explode(World world, double x, double y, double z, float strength, boolean cloud, boolean rubble, boolean shrapnel, Entity exploder) { world.createExplosion(exploder, x, y, z, strength, true); if(cloud) @@ -162,7 +162,7 @@ public class ExplosionLarge { if(shrapnel) spawnShrapnels(world, x, y, z, shrapnelFunction((int)strength)); } - + @Deprecated public static void explode(World world, double x, double y, double z, float strength, boolean cloud, boolean rubble, boolean shrapnel) { world.createExplosion(null, x, y, z, strength, true); if(cloud) @@ -172,7 +172,7 @@ public class ExplosionLarge { if(shrapnel) spawnShrapnels(world, x, y, z, shrapnelFunction((int)strength)); } - + @Deprecated public static void explodeFire(World world, double x, double y, double z, float strength, boolean cloud, boolean rubble, boolean shrapnel) { world.newExplosion((Entity)null, (float)x, (float)y, (float)z, strength, true, true); if(cloud) @@ -182,60 +182,60 @@ public class ExplosionLarge { if(shrapnel) spawnShrapnels(world, x, y, z, shrapnelFunction((int)strength)); } - + public static void buster(World world, double x, double y, double z, Vec3 vector, float strength, float depth) { - + vector = vector.normalize(); - + for(int i = 0; i < depth; i += 2) { - + world.createExplosion((Entity)null, x + vector.xCoord * i, y + vector.yCoord * i, z + vector.zCoord * i, strength, true); } } - + public static void jolt(World world, double posX, double posY, double posZ, double strength, int count, double vel) { - + for(int j = 0; j < count; j++) { - + double phi = rand.nextDouble() * (Math.PI * 2); double costheta = rand.nextDouble() * 2 - 1; double theta = Math.acos(costheta); double x = Math.sin( theta) * Math.cos( phi ); double y = Math.sin( theta) * Math.sin( phi ); double z = Math.cos( theta ); - + Vec3 vec = Vec3.createVectorHelper(x, y, z); - + for(int i = 0; i < strength; i ++) { double x0 = posX + (vec.xCoord * i); double y0 = posY + (vec.yCoord * i); double z0 = posZ + (vec.zCoord * i); - + if(!world.isRemote) { if(world.getBlock((int)x0, (int)y0, (int)z0).getMaterial().isLiquid()) { world.setBlock((int)x0, (int)y0, (int)z0, Blocks.air); } - + if(world.getBlock((int)x0, (int)y0, (int)z0) != Blocks.air) { - + if(world.getBlock((int)x0, (int)y0, (int)z0).getExplosionResistance(null, world, (int)x0, (int)y0, (int)z0, posX, posY, posZ) > 70) continue; - + EntityRubble rubble = new EntityRubble(world); rubble.posX = x0 + 0.5F; rubble.posY = y0 + 0.5F; rubble.posZ = z0 + 0.5F; rubble.setMetaBasedOnBlock(world.getBlock((int)x0, (int)y0, (int)z0), world.getBlockMetadata((int)x0, (int)y0, (int)z0)); - + Vec3 vec4 = Vec3.createVectorHelper(posX - rubble.posX, posY - rubble.posY, posZ - rubble.posZ); vec4.normalize(); rubble.motionX = vec4.xCoord * vel; rubble.motionY = vec4.yCoord * vel; rubble.motionZ = vec4.zCoord * vel; - + world.spawnEntityInWorld(rubble); - + world.setBlock((int)x0, (int)y0, (int)z0, Blocks.air); break; } @@ -243,17 +243,17 @@ public class ExplosionLarge { } } } - + public static int cloudFunction(int i) { return (int)(850 * (1 - Math.pow(Math.E, -i/15)) + 15); } - + public static int rubbleFunction(int i) { return i/10; } - + public static int shrapnelFunction(int i) { return i/3; } - + } diff --git a/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java b/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java index cca47893b..9e0a4bc07 100644 --- a/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java +++ b/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java @@ -4,8 +4,8 @@ import com.hbm.config.BombConfig; import com.hbm.entity.logic.EntityNukeExplosionMK5; import com.hbm.explosion.ExplosionNT.ExAttrib; import com.hbm.handler.radiation.ChunkRadiationManager; +import com.hbm.handler.threading.PacketThreading; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -15,7 +15,7 @@ import net.minecraft.world.World; public class ExplosionNukeSmall { public static void explode(World world, double posX, double posY, double posZ, MukeParams params) { - + // spawn particles, if present if(params.particle != null) { NBTTagCompound data = new NBTTagCompound(); @@ -24,20 +24,20 @@ public class ExplosionNukeSmall { if(params.particle.equals("muke") && (MainRegistry.polaroidID == 11 || world.rand.nextInt(100) == 0)) { data.setBoolean("balefire", true); } - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 250)); } - + // play the sound in any case world.playSoundEffect(posX, posY, posZ, "hbm:weapon.mukeExplosion", 15.0F, 1.0F); - + if(params.shrapnelCount > 0) ExplosionLarge.spawnShrapnels(world, posX, posY, posZ, params.shrapnelCount); if(params.miniNuke && !params.safe) new ExplosionNT(world, null, posX, posY, posZ, params.blastRadius).addAllAttrib(params.explosionAttribs).overrideResolution(params.resolution).explode(); if(params.killRadius > 0) ExplosionNukeGeneric.dealDamage(world, posX, posY, posZ, params.killRadius); if(!params.miniNuke) world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, (int) params.blastRadius, posX, posY, posZ)); - + if(params.miniNuke) { float radMod = params.radiationLevel / 3F; - + for(int i = -2; i <= 2; i++) { for(int j = -2; j <= 2; j++) { if(Math.abs(i) + Math.abs(j) < 4) { @@ -53,7 +53,7 @@ public class ExplosionNukeSmall { public static MukeParams PARAMS_LOW = new MukeParams() {{ blastRadius = 15F; killRadius = 45F; radiationLevel = 2; }}; public static MukeParams PARAMS_MEDIUM = new MukeParams() {{ blastRadius = 20F; killRadius = 55F; radiationLevel = 3; }}; public static MukeParams PARAMS_HIGH = new MukeParams() {{ miniNuke = false; blastRadius = BombConfig.fatmanRadius; shrapnelCount = 0; }}; - + /* more sensible approach with more customization options, idea shamelessly stolen from Martin */ public static class MukeParams { public boolean miniNuke = true; diff --git a/src/main/java/com/hbm/explosion/vanillant/standard/ExplosionEffectAmat.java b/src/main/java/com/hbm/explosion/vanillant/standard/ExplosionEffectAmat.java index be83da6b2..b185af079 100644 --- a/src/main/java/com/hbm/explosion/vanillant/standard/ExplosionEffectAmat.java +++ b/src/main/java/com/hbm/explosion/vanillant/standard/ExplosionEffectAmat.java @@ -2,7 +2,7 @@ package com.hbm.explosion.vanillant.standard; import com.hbm.explosion.vanillant.ExplosionVNT; import com.hbm.explosion.vanillant.interfaces.IExplosionSFX; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -13,15 +13,15 @@ public class ExplosionEffectAmat implements IExplosionSFX { @Override public void doEffect(ExplosionVNT explosion, World world, double x, double y, double z, float size) { - + if(size < 15) world.playSoundEffect(x, y, z, "random.explode", 4.0F, (1.4F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.2F) * 0.7F); else world.playSoundEffect(x, y, z, "hbm:weapon.mukeExplosion", 15.0F, 1.0F); - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "amat"); data.setFloat("scale", size); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(world.provider.dimensionId, x, y, z, 200)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(world.provider.dimensionId, x, y, z, 200)); } } diff --git a/src/main/java/com/hbm/extprop/HbmLivingProps.java b/src/main/java/com/hbm/extprop/HbmLivingProps.java index b09d20d52..9201c7181 100644 --- a/src/main/java/com/hbm/extprop/HbmLivingProps.java +++ b/src/main/java/com/hbm/extprop/HbmLivingProps.java @@ -6,6 +6,7 @@ import java.util.UUID; import com.hbm.config.RadiationConfig; import com.hbm.entity.mob.EntityDuck; +import com.hbm.handler.threading.PacketThreading; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; @@ -164,7 +165,7 @@ public class HbmLivingProps implements IExtendedEntityProperties { data.setInteger("count", 50); data.setInteger("block", Block.getIdFromBlock(Blocks.soul_sand)); data.setInteger("entity", entity.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 50)); } if(entity instanceof EntityPlayer) { diff --git a/src/main/java/com/hbm/handler/EntityEffectHandler.java b/src/main/java/com/hbm/handler/EntityEffectHandler.java index 19536eace..b6c9e76e8 100644 --- a/src/main/java/com/hbm/handler/EntityEffectHandler.java +++ b/src/main/java/com/hbm/handler/EntityEffectHandler.java @@ -22,7 +22,6 @@ import com.hbm.items.armor.ArmorFSB; import com.hbm.items.weapon.sedna.factory.ConfettiUtil; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.packet.toclient.ExtPropPacket; import com.hbm.particle.helper.FlameCreator; @@ -238,7 +237,7 @@ public class EntityEffectHandler { nbt.setString("mode", "blood"); nbt.setInteger("count", 25); nbt.setInteger("entity", entity.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); if((world.getTotalWorldTime() + r600) % 600 == 1) { world.playSoundEffect(ix, iy, iz, "hbm:player.vomit", 1.0F, 1.0F); @@ -253,7 +252,7 @@ public class EntityEffectHandler { nbt.setString("mode", "normal"); nbt.setInteger("count", 15); nbt.setInteger("entity", entity.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); if((world.getTotalWorldTime() + r1200) % 1200 == 1) { world.playSoundEffect(ix, iy, iz, "hbm:player.vomit", 1.0F, 1.0F); @@ -269,7 +268,7 @@ public class EntityEffectHandler { nbt.setInteger("count", 1); nbt.setInteger("block", Block.getIdFromBlock(Blocks.redstone_block)); nbt.setInteger("entity", entity.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); } } else { @@ -303,7 +302,7 @@ public class EntityEffectHandler { data.setInteger("count", 1); data.setInteger("block", Block.getIdFromBlock(Blocks.soul_sand)); data.setInteger("entity", entity.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); } } } @@ -408,7 +407,7 @@ public class EntityEffectHandler { nbt.setString("mode", "blood"); nbt.setInteger("count", 25); nbt.setInteger("entity", entity.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); if((contagion + entity.getEntityId()) % 200 == 19) world.playSoundEffect(entity.posX, entity.posY, entity.posZ, "hbm:player.vomit", 1.0F, 1.0F); @@ -484,7 +483,7 @@ public class EntityEffectHandler { nbt.setString("mode", "blood"); nbt.setInteger("count", 5); nbt.setInteger("entity", entity.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); } if(coughsCoal) { @@ -493,7 +492,7 @@ public class EntityEffectHandler { nbt.setString("mode", "smoke"); nbt.setInteger("count", coughsALotOfCoal ? 50 : 10); nbt.setInteger("entity", entity.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); } } } @@ -520,7 +519,7 @@ public class EntityEffectHandler { nbt.setInteger("count", 1); nbt.setInteger("block", Block.getIdFromBlock(Blocks.coal_block)); nbt.setInteger("entity", entity.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); } } } diff --git a/src/main/java/com/hbm/handler/WeaponAbility.java b/src/main/java/com/hbm/handler/WeaponAbility.java index 46025acce..7a5c7407c 100644 --- a/src/main/java/com/hbm/handler/WeaponAbility.java +++ b/src/main/java/com/hbm/handler/WeaponAbility.java @@ -2,9 +2,9 @@ package com.hbm.handler; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockBobble.BobbleType; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; import com.hbm.items.tool.IItemAbility; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.potion.HbmPotion; import com.hbm.util.ContaminationUtil; @@ -37,22 +37,22 @@ import net.minecraft.util.DamageSource; import net.minecraft.world.World; public abstract class WeaponAbility { - + public abstract void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool); public abstract String getName(); public abstract String getFullName(); - + public static class RadiationAbility extends WeaponAbility { - + float rad; - + public RadiationAbility(float rad) { this.rad = rad; } @Override public void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool) { - + if(victim instanceof EntityLivingBase) ContaminationUtil.contaminate((EntityLivingBase)victim, HazardType.RADIATION, ContaminationType.CREATIVE, rad); } @@ -67,22 +67,22 @@ public abstract class WeaponAbility { return I18n.format(getName()) + " (" + rad + ")"; } } - + public static class VampireAbility extends WeaponAbility { - + float amount; - + public VampireAbility(float amount) { this.amount = amount; } @Override public void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool) { - + if(victim instanceof EntityLivingBase) { - + EntityLivingBase living = (EntityLivingBase) victim; - + living.setHealth(living.getHealth() - amount); if(living.getHealth() <= 0) living.onDeath(DamageSource.magic); player.heal(amount); @@ -99,20 +99,20 @@ public abstract class WeaponAbility { return I18n.format(getName()) + " (" + amount + ")"; } } - + public static class StunAbility extends WeaponAbility { - + int duration; - + public StunAbility(int duration) { this.duration = duration; } @Override public void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool) { - + if(victim instanceof EntityLivingBase) { - + EntityLivingBase living = (EntityLivingBase) victim; living.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, duration * 20, 4)); @@ -130,20 +130,20 @@ public abstract class WeaponAbility { return I18n.format(getName()) + " (" + duration + ")"; } } - + public static class PhosphorusAbility extends WeaponAbility { - + int duration; - + public PhosphorusAbility(int duration) { this.duration = duration; } @Override public void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool) { - + if(victim instanceof EntityLivingBase) { - + EntityLivingBase living = (EntityLivingBase) victim; living.addPotionEffect(new PotionEffect(HbmPotion.phosphorus.id, duration * 20, 4)); @@ -160,18 +160,18 @@ public abstract class WeaponAbility { return I18n.format(getName()) + " (" + duration + ")"; } } - + public static class FireAbility extends WeaponAbility { - + int duration; - + public FireAbility(int duration) { this.duration = duration; } @Override public void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool) { - + if(victim instanceof EntityLivingBase) { victim.setFire(duration); } @@ -187,31 +187,31 @@ public abstract class WeaponAbility { return I18n.format(getName()) + " (" + duration + ")"; } } - + public static class ChainsawAbility extends WeaponAbility { - + int divider; - + public ChainsawAbility(int divider) { this.divider = divider; } @Override public void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool) { - + if(victim instanceof EntityLivingBase) { - + EntityLivingBase living = (EntityLivingBase) victim; - + if(living.getHealth() <= 0.0F) { - + int count = Math.min((int)Math.ceil(living.getMaxHealth() / divider), 250); //safeguard to prevent funnies from bosses with obscene health - + for(int i = 0; i < count; i++) { living.entityDropItem(new ItemStack(ModItems.nitra_small), 1); world.spawnEntityInWorld(new EntityXPOrb(world, living.posX, living.posY, living.posZ, 1)); } - + if(player instanceof EntityPlayerMP) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaburst"); @@ -219,9 +219,9 @@ public abstract class WeaponAbility { data.setDouble("motion", 0.1D); data.setString("mode", "blockdust"); data.setInteger("block", Block.getIdFromBlock(Blocks.redstone_block)); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, living.posX, living.posY + living.height * 0.5, living.posZ), new TargetPoint(living.dimension, living.posX, living.posY, living.posZ, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, living.posX, living.posY + living.height * 0.5, living.posZ), new TargetPoint(living.dimension, living.posX, living.posY, living.posZ, 50)); } - + world.playSoundEffect(living.posX, living.posY + living.height * 0.5, living.posZ, "hbm:weapon.chainsaw", 0.5F, 1.0F); } } @@ -237,28 +237,28 @@ public abstract class WeaponAbility { return I18n.format(getName()) + " (1:" + divider + ")"; } } - + public static class BeheaderAbility extends WeaponAbility { @Override public void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool) { - + if(victim instanceof EntityLivingBase && ((EntityLivingBase) victim).getHealth() <= 0.0F) { - + EntityLivingBase living = (EntityLivingBase) victim; - + if(living instanceof EntitySkeleton) { - + if(((EntitySkeleton)living).getSkeletonType() == 0) { living.entityDropItem(new ItemStack(Items.skull, 1, 0), 0.0F); } else { - + if(world.rand.nextInt(20) == 0) living.entityDropItem(new ItemStack(Items.skull, 1, 1), 0.0F); else living.entityDropItem(new ItemStack(Items.coal, 3), 0.0F); } - + } else if(living instanceof EntityZombie) { living.entityDropItem(new ItemStack(Items.skull, 1, 2), 0.0F); } else if(living instanceof EntityCreeper) { @@ -268,7 +268,7 @@ public abstract class WeaponAbility { } else if(living instanceof EntitySlime) { living.entityDropItem(new ItemStack(Items.slime_ball, 3), 0.0F); } else if(living instanceof EntityPlayer) { - + ItemStack head = new ItemStack(Items.skull, 1, 3); head.stackTagCompound = new NBTTagCompound(); head.stackTagCompound.setString("SkullOwner", ((EntityPlayer) living).getDisplayName()); @@ -290,22 +290,22 @@ public abstract class WeaponAbility { return I18n.format(getName()); } } - + public static class BobbleAbility extends WeaponAbility { @Override public void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool) { - + if(victim instanceof EntityMob && ((EntityMob) victim).getHealth() <= 0.0F) { - + EntityMob mob = (EntityMob) victim; - + int chance = 1000; - + if(mob.getMaxHealth() > 20) { chance = 750; } - + if(world.rand.nextInt(chance) == 0) mob.entityDropItem(new ItemStack(ModBlocks.bobblehead, 1, world.rand.nextInt(BobbleType.values().length - 1) + 1), 0.0F); } diff --git a/src/main/java/com/hbm/handler/guncfg/BulletConfigFactory.java b/src/main/java/com/hbm/handler/guncfg/BulletConfigFactory.java index b20f47490..2290cedcb 100644 --- a/src/main/java/com/hbm/handler/guncfg/BulletConfigFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/BulletConfigFactory.java @@ -7,8 +7,8 @@ import com.hbm.entity.projectile.EntityBulletBaseNT.*; import com.hbm.explosion.ExplosionNukeSmall; import com.hbm.explosion.ExplosionNukeSmall.MukeParams; import com.hbm.handler.BulletConfiguration; +import com.hbm.handler.threading.PacketThreading; import com.hbm.lib.Library; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.potion.HbmPotion; import com.hbm.util.ArmorRegistry; @@ -27,15 +27,15 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; public class BulletConfigFactory { - + public static final float defaultSpread = 0.005F; - + /// STANDARD CONFIGS /// //do not include damage or ammo public static BulletConfiguration standardBulletConfig() { - + BulletConfiguration bullet = new BulletConfiguration(); - + bullet.velocity = 5.0F; bullet.spread = defaultSpread; bullet.wear = 10; @@ -54,7 +54,7 @@ public class BulletConfigFactory { bullet.style = BulletConfiguration.STYLE_NORMAL; bullet.plink = BulletConfiguration.PLINK_BULLET; bullet.leadChance = 5; - + return bullet; } public static BulletConfiguration standardPistolConfig() { @@ -63,11 +63,11 @@ public class BulletConfigFactory { bullet.plink = BulletConfiguration.PLINK_BULLET; return bullet; } - + public static BulletConfiguration standardBuckshotConfig() { - + BulletConfiguration bullet = new BulletConfiguration(); - + bullet.velocity = 5.0F; bullet.spread = defaultSpread * 10F; bullet.wear = 10; @@ -85,14 +85,14 @@ public class BulletConfigFactory { bullet.style = BulletConfiguration.STYLE_PELLET; bullet.plink = BulletConfiguration.PLINK_BULLET; bullet.leadChance = 10; - + return bullet; } - + public static BulletConfiguration standardRocketConfig() { - + BulletConfiguration bullet = new BulletConfiguration(); - + bullet.velocity = 2.0F; bullet.spread = defaultSpread; bullet.wear = 10; @@ -111,14 +111,14 @@ public class BulletConfigFactory { bullet.style = BulletConfiguration.STYLE_ROCKET; bullet.plink = BulletConfiguration.PLINK_GRENADE; bullet.vPFX = "smoke"; - + return bullet; } - + public static BulletConfiguration standardGrenadeConfig() { - + BulletConfiguration bullet = new BulletConfiguration(); - + bullet.velocity = 2.0F; bullet.spread = defaultSpread; bullet.wear = 10; @@ -137,14 +137,14 @@ public class BulletConfigFactory { bullet.style = BulletConfiguration.STYLE_GRENADE; bullet.plink = BulletConfiguration.PLINK_GRENADE; bullet.vPFX = "smoke"; - + return bullet; } - + public static BulletConfiguration standardShellConfig() { - + BulletConfiguration bullet = new BulletConfiguration(); - + bullet.velocity = 3.0F; bullet.spread = defaultSpread; bullet.wear = 10; @@ -162,14 +162,14 @@ public class BulletConfigFactory { bullet.style = BulletConfiguration.STYLE_GRENADE; bullet.plink = BulletConfiguration.PLINK_GRENADE; bullet.vPFX = "smoke"; - + return bullet; } - + public static BulletConfiguration standardNukeConfig() { - + BulletConfiguration bullet = new BulletConfiguration(); - + bullet.velocity = 3.0F; bullet.spread = defaultSpread; bullet.wear = 10; @@ -188,10 +188,10 @@ public class BulletConfigFactory { bullet.doesBreakGlass = false; bullet.style = BulletConfiguration.STYLE_NUKE; bullet.plink = BulletConfiguration.PLINK_GRENADE; - + return bullet; } - + /* * Sizes: * 0 - safe @@ -201,89 +201,89 @@ public class BulletConfigFactory { * 4 - big */ public static void nuclearExplosion(Entity entity, int x, int y, int z, MukeParams params) { - + if(!entity.worldObj.isRemote) { double posX = entity.posX; double posY = entity.posY + 0.5; double posZ = entity.posZ; - + if(y >= 0) { posX = x + 0.5; posY = y + 1.5; posZ = z + 0.5; } - + ExplosionNukeSmall.explode(entity.worldObj, posX, posY, posZ, params); } } - + public static void makeFlechette(BulletConfiguration bullet) { bullet.bntImpact = (bulletnt, x, y, z, sideHit) -> { bulletnt.getStuck(x, y, z, sideHit); }; } - + public static IBulletImpactBehaviorNT getPhosphorousEffect(final int radius, final int duration, final int count, final double motion, float hazeChance) { - + IBulletImpactBehaviorNT impact = new IBulletImpactBehaviorNT() { @Override public void behaveBlockHit(EntityBulletBaseNT bullet, int x, int y, int z, int sideHit) { - + List hit = bullet.worldObj.getEntitiesWithinAABBExcludingEntity(bullet, AxisAlignedBB.getBoundingBox(bullet.posX - radius, bullet.posY - radius, bullet.posZ - radius, bullet.posX + radius, bullet.posY + radius, bullet.posZ + radius)); - + for(Entity e : hit) { - + if(!Library.isObstructed(bullet.worldObj, bullet.posX, bullet.posY, bullet.posZ, e.posX, e.posY + e.getEyeHeight(), e.posZ)) { e.setFire(5); - + if(e instanceof EntityLivingBase) { - + PotionEffect eff = new PotionEffect(HbmPotion.phosphorus.id, duration, 0, true); eff.getCurativeItems().clear(); ((EntityLivingBase)e).addPotionEffect(eff); } } } - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaburst"); data.setString("mode", "flame"); data.setInteger("count", count); data.setDouble("motion", motion); - - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, bullet.posX, bullet.posY, bullet.posZ), new TargetPoint(bullet.dimension, bullet.posX, bullet.posY, bullet.posZ, 50)); - + + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, bullet.posX, bullet.posY, bullet.posZ), new TargetPoint(bullet.dimension, bullet.posX, bullet.posY, bullet.posZ, 50)); + if(bullet.worldObj.rand.nextFloat() < hazeChance) { NBTTagCompound haze = new NBTTagCompound(); haze.setString("type", "haze"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(haze, bullet.posX, bullet.posY, bullet.posZ), new TargetPoint(bullet.dimension, bullet.posX, bullet.posY, bullet.posZ, 150)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(haze, bullet.posX, bullet.posY, bullet.posZ), new TargetPoint(bullet.dimension, bullet.posX, bullet.posY, bullet.posZ, 150)); } } }; - + return impact; } - + public static IBulletImpactBehaviorNT getGasEffect(final int radius, final int duration) { - + IBulletImpactBehaviorNT impact = new IBulletImpactBehaviorNT() { @Override public void behaveBlockHit(EntityBulletBaseNT bullet, int x, int y, int z, int sideHit) { - + List hit = bullet.worldObj.getEntitiesWithinAABBExcludingEntity(bullet, AxisAlignedBB.getBoundingBox(bullet.posX - radius, bullet.posY - radius, bullet.posZ - radius, bullet.posX + radius, bullet.posY + radius, bullet.posZ + radius)); - + for(Entity e : hit) { - + if(!Library.isObstructed(bullet.worldObj, bullet.posX, bullet.posY, bullet.posZ, e.posX, e.posY + e.getEyeHeight(), e.posZ)) { - + if(e instanceof EntityLivingBase) { - + EntityLivingBase entity = (EntityLivingBase) e; - + if(ArmorRegistry.hasAllProtection(entity, 3, HazardClass.GAS_LUNG)) continue; @@ -302,75 +302,75 @@ public class BulletConfigFactory { } } } - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaburst"); data.setString("mode", "cloud"); data.setInteger("count", 15); data.setDouble("motion", 0.1D); - - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, bullet.posX, bullet.posY, bullet.posZ), new TargetPoint(bullet.dimension, bullet.posX, bullet.posY, bullet.posZ, 50)); + + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, bullet.posX, bullet.posY, bullet.posZ), new TargetPoint(bullet.dimension, bullet.posX, bullet.posY, bullet.posZ, 50)); } }; - + return impact; } - + public static IBulletUpdateBehaviorNT getLaserSteering() { - + IBulletUpdateBehaviorNT onUpdate = new IBulletUpdateBehaviorNT() { @Override public void behaveUpdate(EntityBulletBaseNT bullet) { - + if(bullet.getThrower() == null || !(bullet.getThrower() instanceof EntityPlayer)) return; - + if(Vec3.createVectorHelper(bullet.posX - bullet.getThrower().posX, bullet.posY - bullet.getThrower().posY, bullet.posZ - bullet.getThrower().posZ).lengthVector() > 100) return; - + MovingObjectPosition mop = Library.rayTrace((EntityPlayer)bullet.getThrower(), 200, 1); - + if(mop == null || mop.hitVec == null) return; - + Vec3 vec = Vec3.createVectorHelper(mop.hitVec.xCoord - bullet.posX, mop.hitVec.yCoord - bullet.posY, mop.hitVec.zCoord - bullet.posZ); - + if(vec.lengthVector() < 3) return; - + vec = vec.normalize(); - + double speed = Vec3.createVectorHelper(bullet.motionX, bullet.motionY, bullet.motionZ).lengthVector(); bullet.motionX = vec.xCoord * speed; bullet.motionY = vec.yCoord * speed; bullet.motionZ = vec.zCoord * speed; } - + }; - + return onUpdate; } - + public static IBulletUpdateBehaviorNT getHomingBehavior(final double range, final double angle) { IBulletUpdateBehaviorNT onUpdate = new IBulletUpdateBehaviorNT() { @Override public void behaveUpdate(EntityBulletBaseNT bullet) { - + if(bullet.worldObj.isRemote) return; - + if(bullet.worldObj.getEntityByID(bullet.getEntityData().getInteger("homingTarget")) == null) { chooseTarget(bullet); } - + Entity target = bullet.worldObj.getEntityByID(bullet.getEntityData().getInteger("homingTarget")); - + if(target != null) { - + Vec3 delta = Vec3.createVectorHelper(target.posX - bullet.posX, target.posY + target.height / 2 - bullet.posY, target.posZ - bullet.posZ); delta = delta.normalize(); double vel = Vec3.createVectorHelper(bullet.motionX, bullet.motionY, bullet.motionZ).lengthVector(); @@ -380,32 +380,32 @@ public class BulletConfigFactory { bullet.motionZ = delta.zCoord * vel; } } - + private void chooseTarget(EntityBulletBaseNT bullet) { - + List entities = bullet.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, bullet.boundingBox.expand(range, range, range)); - + Vec3 mot = Vec3.createVectorHelper(bullet.motionX, bullet.motionY, bullet.motionZ); - + EntityLivingBase target = null; double targetAngle = angle; - + for(EntityLivingBase e : entities) { - + if(!e.isEntityAlive() || e == bullet.getThrower()) continue; - + Vec3 delta = Vec3.createVectorHelper(e.posX - bullet.posX, e.posY + e.height / 2 - bullet.posY, e.posZ - bullet.posZ); - + if(bullet.worldObj.func_147447_a(Vec3.createVectorHelper(bullet.posX, bullet.posY, bullet.posZ), Vec3.createVectorHelper(e.posX, e.posY + e.height / 2, e.posZ), false, true, false) != null) continue; - + double dist = e.getDistanceSqToEntity(bullet); - + if(dist < range * range) { - + double deltaAngle = BobMathUtil.getCrossAngle(mot, delta); - + if(deltaAngle < targetAngle) { //Checks if the bullet is not already inside the entity's bounding box, so it doesn't pick the same target if(bullet.getConfig().doesPenetrate && bullet.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, bullet.boundingBox.expand(2, 2, 2)) == null) { @@ -416,13 +416,13 @@ public class BulletConfigFactory { } } } - + if(target != null) { bullet.getEntityData().setInteger("homingTarget", target.getEntityId()); } } }; - + return onUpdate; } /** Resets the bullet's target **/ diff --git a/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java b/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java index 2bdf1cb63..8b5cb54bb 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunNPCFactory.java @@ -8,11 +8,11 @@ import com.hbm.entity.projectile.EntityBulletBaseNT.IBulletUpdateBehaviorNT; import com.hbm.explosion.ExplosionNukeGeneric; import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.handler.BulletConfiguration; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.BobMathUtil; @@ -26,7 +26,7 @@ import net.minecraft.util.Vec3; public class GunNPCFactory { public static BulletConfiguration getMaskmanOrb() { - + BulletConfiguration bullet = new BulletConfiguration(); bullet.ammo = new ComparableStack(ModItems.coin_maskman); @@ -49,9 +49,9 @@ public class GunNPCFactory { bullet.style = BulletConfiguration.STYLE_ORB; bullet.trail = 1; bullet.explosive = 1.5F; - + bullet.bntUpdate = (bulletnt) -> { - + if(bulletnt.worldObj.isRemote) return; @@ -72,14 +72,14 @@ public class GunNPCFactory { bulletnt.worldObj.spawnEntityInWorld(bolt); } }; - + return bullet; } - + public static BulletConfiguration getMaskmanBolt() { - + BulletConfiguration bullet = BulletConfigFactory.standardBulletConfig(); - + bullet.ammo = new ComparableStack(ModItems.coin_maskman); bullet.spread = 0.0F; bullet.dmgMin = 15; @@ -90,14 +90,14 @@ public class GunNPCFactory { bullet.setToBolt(BulletConfiguration.BOLT_LACUNAE); bullet.vPFX = "reddust"; bullet.damageType = ModDamageSource.s_laser; - + return bullet; } - + public static BulletConfiguration getMaskmanBullet() { - + BulletConfiguration bullet = BulletConfigFactory.standardBulletConfig(); - + bullet.ammo = new ComparableStack(ModItems.coin_maskman); bullet.spread = 0.0F; bullet.dmgMin = 5; @@ -106,14 +106,14 @@ public class GunNPCFactory { bullet.leadChance = 15; bullet.style = BulletConfiguration.STYLE_FLECHETTE; bullet.vPFX = "bluedust"; - + return bullet; } - + public static BulletConfiguration getMaskmanTracer() { - + BulletConfiguration bullet = BulletConfigFactory.standardBulletConfig(); - + bullet.ammo = new ComparableStack(ModItems.coin_maskman); bullet.spread = 0.0F; bullet.dmgMin = 15; @@ -123,9 +123,9 @@ public class GunNPCFactory { bullet.setToBolt(BulletConfiguration.BOLT_NIGHTMARE); bullet.vPFX = "reddust"; bullet.damageType = ModDamageSource.s_laser; - + bullet.bntImpact = (bulletnt, x, y, z, sideHit) -> { - + if(bulletnt.worldObj.isRemote) return; @@ -135,14 +135,14 @@ public class GunNPCFactory { meteor.setThrower(bulletnt.getThrower()); bulletnt.worldObj.spawnEntityInWorld(meteor); }; - + return bullet; } - + public static BulletConfiguration getMaskmanRocket() { - + BulletConfiguration bullet = BulletConfigFactory.standardGrenadeConfig(); - + bullet.ammo = new ComparableStack(ModItems.coin_maskman); bullet.gravity = 0.1D; bullet.velocity = 1.0F; @@ -151,14 +151,14 @@ public class GunNPCFactory { bullet.blockDamage = false; bullet.explosive = 5.0F; bullet.style = BulletConfiguration.STYLE_ROCKET; - + return bullet; } - + public static BulletConfiguration getMaskmanMeteor() { - + BulletConfiguration bullet = BulletConfigFactory.standardGrenadeConfig(); - + bullet.ammo = new ComparableStack(ModItems.coin_maskman); bullet.gravity = 0.1D; bullet.velocity = 1.0F; @@ -168,7 +168,7 @@ public class GunNPCFactory { bullet.incendiary = 3; bullet.explosive = 2.5F; bullet.style = BulletConfiguration.STYLE_METEOR; - + bullet.bntUpdate = (bulletnt) -> { if(!bulletnt.worldObj.isRemote) @@ -186,14 +186,14 @@ public class GunNPCFactory { MainRegistry.proxy.effectNT(nbt); } }; - + return bullet; } public static BulletConfiguration getWormBolt() { - + BulletConfiguration bullet = BulletConfigFactory.standardBulletConfig(); - + bullet.ammo = new ComparableStack(ModItems.coin_worm); bullet.spread = 0.0F; bullet.maxAge = 60; @@ -203,14 +203,14 @@ public class GunNPCFactory { bullet.doesRicochet = false; bullet.setToBolt(BulletConfiguration.BOLT_WORM); bullet.damageType = ModDamageSource.s_laser; - + return bullet; } - + public static BulletConfiguration getWormHeadBolt() { - + BulletConfiguration bullet = BulletConfigFactory.standardBulletConfig(); - + bullet.ammo = new ComparableStack(ModItems.coin_worm); bullet.spread = 0.0F; bullet.maxAge = 100; @@ -220,46 +220,46 @@ public class GunNPCFactory { bullet.doesRicochet = false; bullet.setToBolt(BulletConfiguration.BOLT_LASER); bullet.damageType = ModDamageSource.s_laser; - + return bullet; } - + public static BulletConfiguration getRocketUFOConfig() { - + BulletConfiguration bullet = GunRocketFactory.getRocketConfig(); - + bullet.vPFX = "reddust"; bullet.destroysBlocks = false; bullet.explosive = 0F; - + bullet.bntUpdate = new IBulletUpdateBehaviorNT() { - + double angle = 90; double range = 100; @Override public void behaveUpdate(EntityBulletBaseNT bullet) { - + if(bullet.worldObj.isRemote) return; - + if(bullet.worldObj.getEntityByID(bullet.getEntityData().getInteger("homingTarget")) == null) { chooseTarget(bullet); } - + Entity target = bullet.worldObj.getEntityByID(bullet.getEntityData().getInteger("homingTarget")); - + if(target != null) { - + if(bullet.getDistanceSqToEntity(target) < 5) { bullet.getConfig().bntImpact.behaveBlockHit(bullet, -1, -1, -1, -1); bullet.setDead(); return; } - + Vec3 delta = Vec3.createVectorHelper(target.posX - bullet.posX, target.posY + target.height / 2 - bullet.posY, target.posZ - bullet.posZ); delta = delta.normalize(); - + double vel = Vec3.createVectorHelper(bullet.motionX, bullet.motionY, bullet.motionZ).lengthVector(); bullet.motionX = delta.xCoord * vel; @@ -267,45 +267,45 @@ public class GunNPCFactory { bullet.motionZ = delta.zCoord * vel; } } - + private void chooseTarget(EntityBulletBaseNT bullet) { - + List entities = bullet.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, bullet.boundingBox.expand(range, range, range)); - + Vec3 mot = Vec3.createVectorHelper(bullet.motionX, bullet.motionY, bullet.motionZ); - + EntityLivingBase target = null; double targetAngle = angle; - + for(EntityLivingBase e : entities) { - + if(!e.isEntityAlive() || e == bullet.getThrower()) continue; - + Vec3 delta = Vec3.createVectorHelper(e.posX - bullet.posX, e.posY + e.height / 2 - bullet.posY, e.posZ - bullet.posZ); - + if(bullet.worldObj.func_147447_a(Vec3.createVectorHelper(bullet.posX, bullet.posY, bullet.posZ), Vec3.createVectorHelper(e.posX, e.posY + e.height / 2, e.posZ), false, true, false) != null) continue; - + double dist = e.getDistanceSqToEntity(bullet); - + if(dist < range * range) { - + double deltaAngle = BobMathUtil.getCrossAngle(mot, delta); - + if(deltaAngle < targetAngle) { target = e; targetAngle = deltaAngle; } } } - + if(target != null) { bullet.getEntityData().setInteger("homingTarget", target.getEntityId()); } } }; - + bullet.bntImpact = (bulletnt, x, y, z, sideHit) -> { bulletnt.worldObj.playSoundEffect(bulletnt.posX, bulletnt.posY, bulletnt.posZ, "hbm:entity.ufoBlast", 5.0F, 0.9F + bulletnt.worldObj.rand.nextFloat() * 0.2F); @@ -321,11 +321,11 @@ public class GunNPCFactory { data.setFloat("pitch", -30F + 30F * i); data.setFloat("yaw", bulletnt.worldObj.rand.nextFloat() * 180F); data.setFloat("scale", 5F); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, bulletnt.posX, bulletnt.posY, bulletnt.posZ), + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, bulletnt.posX, bulletnt.posY, bulletnt.posZ), new TargetPoint(bulletnt.worldObj.provider.dimensionId, bulletnt.posX, bulletnt.posY, bulletnt.posZ, 100)); } }; - + return bullet; } } diff --git a/src/main/java/com/hbm/handler/threading/PacketThreading.java b/src/main/java/com/hbm/handler/threading/PacketThreading.java index 1111d0ae6..2f6fd16be 100644 --- a/src/main/java/com/hbm/handler/threading/PacketThreading.java +++ b/src/main/java/com/hbm/handler/threading/PacketThreading.java @@ -4,7 +4,8 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.hbm.config.GeneralConfig; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.PrecompiledPacket; +import com.hbm.packet.threading.PrecompiledPacket; +import com.hbm.packet.threading.ThreadedPacket; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.common.network.simpleimpl.IMessage; import net.minecraft.entity.player.EntityPlayerMP; @@ -63,23 +64,37 @@ public class PacketThreading { } } + // Prepares a packet by making a PreBuf (or invalidating due to incorrect class). + private static boolean preparePacket(IMessage message) { + // `message` can be precompiled or not. + if(message instanceof PrecompiledPacket) + ((PrecompiledPacket) message).getCompiledBuffer(); // Gets the precompiled buffer, doing nothing if it already exists. + totalCnt++; + + if(!(message instanceof ThreadedPacket)) { + MainRegistry.logger.error("Invalid packet class, expected ThreadedPacket, got {}.", message.getClass().getSimpleName()); + return true; + } + return false; + } + /** * Adds a packet to the thread pool to be processed in the future. This is only compatible with the `sendToAllAround` dispatch operation. * @param message Message to process. * @param target TargetPoint to send to. */ public static void createAllAroundThreadedPacket(IMessage message, TargetPoint target) { - // `message` can be precompiled or not. - if(message instanceof PrecompiledPacket) - ((PrecompiledPacket) message).getPreBuf(); // Gets the precompiled buffer, doing nothing if it already exists. - totalCnt++; + + if(preparePacket(message)) + return; + + ThreadedPacket packet = (ThreadedPacket) message; Runnable task = () -> { try { lock.lock(); PacketDispatcher.wrapper.sendToAllAround(message, target); - if (message instanceof PrecompiledPacket) - ((PrecompiledPacket) message).getPreBuf().release(); + packet.getCompiledBuffer().release(); } finally { lock.unlock(); } @@ -95,16 +110,17 @@ public class PacketThreading { * @param player PlayerMP to send to. */ public static void createSendToThreadedPacket(IMessage message, EntityPlayerMP player) { - if(message instanceof PrecompiledPacket) - ((PrecompiledPacket) message).getPreBuf(); - totalCnt++; + + if(preparePacket(message)) + return; + + ThreadedPacket packet = (ThreadedPacket) message; Runnable task = () -> { try { lock.lock(); PacketDispatcher.wrapper.sendTo(message, player); - if (message instanceof PrecompiledPacket) - ((PrecompiledPacket) message).getPreBuf().release(); + packet.getCompiledBuffer().release(); } finally { lock.unlock(); } diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java b/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java index 96d32b07f..39653d384 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java @@ -1,8 +1,11 @@ package com.hbm.inventory.container; +import com.hbm.util.InventoryUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; public class ContainerCrateBase extends ContainerBase { @@ -14,6 +17,14 @@ public class ContainerCrateBase extends ContainerBase { tile.openInventory(); } + @Override + public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { + // prevents the player from moving around the currently open box + if(mode == 2 && button == player.inventory.currentItem) return null; + if(index == player.inventory.currentItem + 27 + this.tile.getSizeInventory()) return null; + return super.slotClick(index, button, mode, player); + } + @Override public void onContainerClosed(EntityPlayer p_75134_1_) { super.onContainerClosed(p_75134_1_); diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrateIron.java b/src/main/java/com/hbm/inventory/container/ContainerCrateIron.java index 6c2a62671..15d808110 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrateIron.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrateIron.java @@ -1,14 +1,13 @@ package com.hbm.inventory.container; -import com.hbm.tileentity.machine.storage.TileEntityCrateIron; - import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; @invtweaks.api.container.ChestContainer(rowSize = 9, isLargeChest = false) public class ContainerCrateIron extends ContainerCrateBase { - - public ContainerCrateIron(InventoryPlayer invPlayer, TileEntityCrateIron tedf) { + + public ContainerCrateIron(InventoryPlayer invPlayer, IInventory tedf) { super(invPlayer,tedf); for(int i = 0; i < 4; i++) { diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrateTemplate.java b/src/main/java/com/hbm/inventory/container/ContainerCrateTemplate.java index 553451df8..8f8e02615 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrateTemplate.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrateTemplate.java @@ -1,14 +1,13 @@ package com.hbm.inventory.container; -import com.hbm.tileentity.machine.storage.TileEntityCrateTemplate; - import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; @invtweaks.api.container.ChestContainer(rowSize = 9, isLargeChest = false) public class ContainerCrateTemplate extends ContainerCrateBase { - - public ContainerCrateTemplate(InventoryPlayer invPlayer, TileEntityCrateTemplate tedf) { + + public ContainerCrateTemplate(InventoryPlayer invPlayer, IInventory tedf) { super(invPlayer,tedf); for(int i = 0; i < 3; i++) { @@ -19,4 +18,4 @@ public class ContainerCrateTemplate extends ContainerCrateBase { this.playerInv(invPlayer, 8, 86, 144); } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrateTungsten.java b/src/main/java/com/hbm/inventory/container/ContainerCrateTungsten.java index 55b2d3cfa..58bdf3f50 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrateTungsten.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrateTungsten.java @@ -1,14 +1,13 @@ package com.hbm.inventory.container; -import com.hbm.tileentity.machine.storage.TileEntityCrateTungsten; - import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; @invtweaks.api.container.ChestContainer(rowSize = 9, isLargeChest = false) public class ContainerCrateTungsten extends ContainerCrateBase { - public ContainerCrateTungsten(InventoryPlayer invPlayer, TileEntityCrateTungsten te) { + public ContainerCrateTungsten(InventoryPlayer invPlayer, IInventory te) { super(invPlayer,te); for(int i = 0; i < 3; i++) { diff --git a/src/main/java/com/hbm/inventory/container/ContainerSafe.java b/src/main/java/com/hbm/inventory/container/ContainerSafe.java index 03e334392..30fc1740c 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerSafe.java +++ b/src/main/java/com/hbm/inventory/container/ContainerSafe.java @@ -1,19 +1,18 @@ package com.hbm.inventory.container; -import com.hbm.tileentity.machine.storage.TileEntitySafe; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; //@invtweaks.api.container.ChestContainer(rowSize = 5) public class ContainerSafe extends Container { - private TileEntitySafe diFurnace; + private IInventory diFurnace; - public ContainerSafe(InventoryPlayer invPlayer, TileEntitySafe tedf) { + public ContainerSafe(InventoryPlayer invPlayer, IInventory tedf) { diFurnace = tedf; for(int i = 0; i < 3; i++) { diff --git a/src/main/java/com/hbm/inventory/gui/GUICrateIron.java b/src/main/java/com/hbm/inventory/gui/GUICrateIron.java index 04a354e53..42be50f2c 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICrateIron.java +++ b/src/main/java/com/hbm/inventory/gui/GUICrateIron.java @@ -1,10 +1,10 @@ package com.hbm.inventory.gui; +import net.minecraft.inventory.IInventory; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCrateIron; import com.hbm.lib.RefStrings; -import com.hbm.tileentity.machine.storage.TileEntityCrateIron; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.inventory.GuiContainer; @@ -13,22 +13,22 @@ import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; public class GUICrateIron extends GuiContainer { - - private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_crate_iron.png"); - private TileEntityCrateIron diFurnace; - public GUICrateIron(InventoryPlayer invPlayer, TileEntityCrateIron tedf) { - super(new ContainerCrateIron(invPlayer, tedf)); - diFurnace = tedf; - + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_crate_iron.png"); + private IInventory diFurnace; + + public GUICrateIron(InventoryPlayer invPlayer, IInventory inv) { + super(new ContainerCrateIron(invPlayer, inv)); + diFurnace = inv; + this.xSize = 176; this.ySize = 186; } - + @Override protected void drawGuiContainerForegroundLayer(int i, int j) { String name = this.diFurnace.hasCustomInventoryName() ? this.diFurnace.getInventoryName() : I18n.format(this.diFurnace.getInventoryName()); - + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } diff --git a/src/main/java/com/hbm/inventory/gui/GUICrateTemplate.java b/src/main/java/com/hbm/inventory/gui/GUICrateTemplate.java index 9968d461c..920e8deba 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICrateTemplate.java +++ b/src/main/java/com/hbm/inventory/gui/GUICrateTemplate.java @@ -1,10 +1,10 @@ package com.hbm.inventory.gui; +import net.minecraft.inventory.IInventory; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCrateTemplate; import com.hbm.lib.RefStrings; -import com.hbm.tileentity.machine.storage.TileEntityCrateTemplate; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.inventory.GuiContainer; @@ -13,22 +13,22 @@ import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; public class GUICrateTemplate extends GuiContainer { - - private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_crate_template.png"); - private TileEntityCrateTemplate diFurnace; - public GUICrateTemplate(InventoryPlayer invPlayer, TileEntityCrateTemplate tedf) { + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_crate_template.png"); + private IInventory diFurnace; + + public GUICrateTemplate(InventoryPlayer invPlayer, IInventory tedf) { super(new ContainerCrateTemplate(invPlayer, tedf)); diFurnace = tedf; - + this.xSize = 176; this.ySize = 168; } - + @Override protected void drawGuiContainerForegroundLayer(int i, int j) { String name = this.diFurnace.hasCustomInventoryName() ? this.diFurnace.getInventoryName() : I18n.format(this.diFurnace.getInventoryName()); - + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } @@ -39,4 +39,4 @@ public class GUICrateTemplate extends GuiContainer { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/inventory/gui/GUICrateTungsten.java b/src/main/java/com/hbm/inventory/gui/GUICrateTungsten.java index 30a0ec162..42a3a4e0c 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICrateTungsten.java +++ b/src/main/java/com/hbm/inventory/gui/GUICrateTungsten.java @@ -1,10 +1,11 @@ package com.hbm.inventory.gui; +import com.hbm.tileentity.machine.storage.TileEntityCrateTungsten; +import net.minecraft.inventory.IInventory; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCrateTungsten; import com.hbm.lib.RefStrings; -import com.hbm.tileentity.machine.storage.TileEntityCrateTungsten; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.inventory.GuiContainer; @@ -16,33 +17,41 @@ public class GUICrateTungsten extends GuiContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_crate_tungsten.png"); private static ResourceLocation texture_hot = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_crate_tungsten_hot.png"); - private TileEntityCrateTungsten diFurnace; - - public GUICrateTungsten(InventoryPlayer invPlayer, TileEntityCrateTungsten tedf) { + private IInventory diFurnace; + + public GUICrateTungsten(InventoryPlayer invPlayer, IInventory tedf) { super(new ContainerCrateTungsten(invPlayer, tedf)); + setupGUI(tedf); + } + + private void setupGUI(IInventory tedf) { diFurnace = tedf; - + this.xSize = 176; this.ySize = 168; } - + @Override protected void drawGuiContainerForegroundLayer(int i, int j) { String name = this.diFurnace.hasCustomInventoryName() ? this.diFurnace.getInventoryName() : I18n.format(this.diFurnace.getInventoryName()); - + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 0xffffff); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 0xffffff); } - + @Override protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - - if(diFurnace.getWorldObj().getBlockMetadata(diFurnace.xCoord, diFurnace.yCoord, diFurnace.zCoord) == 0) - Minecraft.getMinecraft().getTextureManager().bindTexture(texture); - else - Minecraft.getMinecraft().getTextureManager().bindTexture(texture_hot); - + + if (diFurnace instanceof TileEntityCrateTungsten) { + TileEntityCrateTungsten crate = (TileEntityCrateTungsten) diFurnace; + if(crate.getWorldObj().getBlockMetadata(crate.xCoord, crate.yCoord, crate.zCoord) == 0) + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + else + Minecraft.getMinecraft().getTextureManager().bindTexture(texture_hot); + } else + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); // Assuming it's in the inventory, we don't need to worry about it somehow being heated :ayo: + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUISafe.java b/src/main/java/com/hbm/inventory/gui/GUISafe.java index 8b49d5362..a5d465998 100644 --- a/src/main/java/com/hbm/inventory/gui/GUISafe.java +++ b/src/main/java/com/hbm/inventory/gui/GUISafe.java @@ -1,10 +1,10 @@ package com.hbm.inventory.gui; +import net.minecraft.inventory.IInventory; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerSafe; import com.hbm.lib.RefStrings; -import com.hbm.tileentity.machine.storage.TileEntitySafe; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.inventory.GuiContainer; @@ -15,24 +15,24 @@ import net.minecraft.util.ResourceLocation; public class GUISafe extends GuiContainer { private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_safe.png"); - private TileEntitySafe diFurnace; - - public GUISafe(InventoryPlayer invPlayer, TileEntitySafe tedf) { + private IInventory diFurnace; + + public GUISafe(InventoryPlayer invPlayer, IInventory tedf) { super(new ContainerSafe(invPlayer, tedf)); diFurnace = tedf; this.xSize = 176; this.ySize = 168; } - + @Override protected void drawGuiContainerForegroundLayer(int i, int j) { String name = this.diFurnace.hasCustomInventoryName() ? this.diFurnace.getInventoryName() : I18n.format(this.diFurnace.getInventoryName()); - + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } - + @Override protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); diff --git a/src/main/java/com/hbm/items/armor/ArmorBJJetpack.java b/src/main/java/com/hbm/items/armor/ArmorBJJetpack.java index 5702fed77..eca95704f 100644 --- a/src/main/java/com/hbm/items/armor/ArmorBJJetpack.java +++ b/src/main/java/com/hbm/items/armor/ArmorBJJetpack.java @@ -3,6 +3,7 @@ package com.hbm.items.armor; import java.util.List; import com.hbm.extprop.HbmPlayerProps; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.render.model.ModelArmorBJ; @@ -33,51 +34,51 @@ public class ArmorBJJetpack extends ArmorBJ { @Override @SideOnly(Side.CLIENT) public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) { - + if(model == null) { model = new ModelArmorBJ(5); } - + return model; } public void onArmorTick(World world, EntityPlayer player, ItemStack stack) { - + super.onArmorTick(world, player, stack); - + HbmPlayerProps props = HbmPlayerProps.getData(player); - + if(!world.isRemote) { - + if(this.hasFSBArmor(player) && props.isJetpackActive()) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "jetpack_bj"); data.setInteger("player", player.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, player.posX, player.posY, player.posZ), new TargetPoint(world.provider.dimensionId, player.posX, player.posY, player.posZ, 100)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, player.posX, player.posY, player.posZ), new TargetPoint(world.provider.dimensionId, player.posX, player.posY, player.posZ, 100)); } } if(this.hasFSBArmor(player)) { - + ArmorUtil.resetFlightTime(player); - + if(props.isJetpackActive()) { - + if(player.motionY < 0.4D) player.motionY += 0.1D; - + player.fallDistance = 0; - + world.playSoundEffect(player.posX, player.posY, player.posZ, "hbm:weapon.immolatorShoot", 0.125F, 1.5F); - + } else if(player.isSneaking()) { - + if(player.motionY < -0.08) { - + double mo = player.motionY * -0.4; player.motionY += mo; - + Vec3 vec = player.getLookVec(); vec.xCoord *= mo; vec.yCoord *= mo; diff --git a/src/main/java/com/hbm/items/armor/ArmorDNT.java b/src/main/java/com/hbm/items/armor/ArmorDNT.java index 7f245c7f2..1d2c6f7e4 100644 --- a/src/main/java/com/hbm/items/armor/ArmorDNT.java +++ b/src/main/java/com/hbm/items/armor/ArmorDNT.java @@ -5,8 +5,8 @@ import java.util.UUID; import com.google.common.collect.Multimap; import com.hbm.extprop.HbmPlayerProps; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.render.model.ModelArmorDNT; import com.hbm.util.ArmorUtil; @@ -53,42 +53,42 @@ public class ArmorDNT extends ArmorFSBPowered { return models[armorSlot]; } - + private static final UUID speed = UUID.fromString("6ab858ba-d712-485c-bae9-e5e765fc555a"); @Override public void onArmorTick(World world, EntityPlayer player, ItemStack stack) { super.onArmorTick(world, player, stack); - + if(this != ModItems.dns_plate) return; HbmPlayerProps props = HbmPlayerProps.getData(player); - + /// SPEED /// Multimap multimap = super.getAttributeModifiers(stack); multimap.put(SharedMonsterAttributes.movementSpeed.getAttributeUnlocalizedName(), new AttributeModifier(speed, "DNT SPEED", 0.25, 0)); player.getAttributeMap().removeAttributeModifiers(multimap); - + if(player.isSprinting()) { player.getAttributeMap().applyAttributeModifiers(multimap); } if(!world.isRemote) { - + /// JET /// if(this.hasFSBArmor(player) && (props.isJetpackActive() || (!player.onGround && !player.isSneaking() && props.enableBackpack))) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "jetpack_dns"); data.setInteger("player", player.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, player.posX, player.posY, player.posZ), new TargetPoint(world.provider.dimensionId, player.posX, player.posY, player.posZ, 100)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, player.posX, player.posY, player.posZ), new TargetPoint(world.provider.dimensionId, player.posX, player.posY, player.posZ, 100)); } } if(this.hasFSBArmor(player)) { - + ArmorUtil.resetFlightTime(player); if(props.isJetpackActive()) { @@ -102,7 +102,7 @@ public class ArmorDNT extends ArmorFSBPowered { } else if(!player.isSneaking() && !player.onGround && props.enableBackpack) { player.fallDistance = 0; - + if(player.motionY < -1) player.motionY += 0.4D; else if(player.motionY < -0.1) @@ -112,7 +112,7 @@ public class ArmorDNT extends ArmorFSBPowered { player.motionX *= 1.05D; player.motionZ *= 1.05D; - + if(player.moveForward != 0) { player.motionX += player.getLookVec().xCoord * 0.25 * player.moveForward; player.motionZ += player.getLookVec().zCoord * 0.25 * player.moveForward; @@ -120,13 +120,13 @@ public class ArmorDNT extends ArmorFSBPowered { world.playSoundEffect(player.posX, player.posY, player.posZ, "hbm:weapon.immolatorShoot", 0.125F, 1.5F); } - + if(player.isSneaking() && !player.onGround) { player.motionY -= 0.1D; } } } - + @Override public void handleAttack(LivingAttackEvent event) { @@ -136,14 +136,14 @@ public class ArmorDNT extends ArmorFSBPowered { EntityPlayer player = (EntityPlayer) e; if(ArmorFSB.hasFSBArmor(player)) { - + if(event.source.isExplosion()) { return; } //e.worldObj.playSoundAtEntity(e, "random.break", 5F, 1.0F + e.getRNG().nextFloat() * 0.5F); HbmPlayerProps.plink(player, "random.break", 0.5F, 1.0F + e.getRNG().nextFloat() * 0.5F); - + event.setCanceled(true); } } @@ -158,12 +158,12 @@ public class ArmorDNT extends ArmorFSBPowered { EntityPlayer player = (EntityPlayer) e; if(ArmorFSB.hasFSBArmor(player)) { - + if(event.source.isExplosion()) { event.ammount *= 0.001F; return; } - + event.ammount = 0; } } @@ -183,7 +183,7 @@ public class ArmorDNT extends ArmorFSBPowered { list.add(EnumChatFormatting.AQUA + " " + I18n.format(Potion.potionTypes[effect.getPotionID()].getName())); } } - + list.add(EnumChatFormatting.RED + " " + I18nUtil.resolveKey("armor.vats")); list.add(EnumChatFormatting.RED + " " + I18nUtil.resolveKey("armor.thermal")); list.add(EnumChatFormatting.RED + " " + I18nUtil.resolveKey("armor.hardLanding")); diff --git a/src/main/java/com/hbm/items/armor/ArmorDiesel.java b/src/main/java/com/hbm/items/armor/ArmorDiesel.java index 2bc61d99c..da8a6b3f8 100644 --- a/src/main/java/com/hbm/items/armor/ArmorDiesel.java +++ b/src/main/java/com/hbm/items/armor/ArmorDiesel.java @@ -3,10 +3,10 @@ package com.hbm.items.armor; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.hbm.handler.ArmorModHandler; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.render.model.ModelArmorDiesel; @@ -27,7 +27,7 @@ public class ArmorDiesel extends ArmorFSBFueled { public ArmorDiesel(ArmorMaterial material, int slot, String texture, FluidType fuelType, int maxFuel, int fillRate, int consumption, int drain) { super(material, slot, texture, fuelType, maxFuel, fillRate, consumption, drain); } - + @Override public Multimap getItemAttributeModifiers() { @@ -42,26 +42,26 @@ public class ArmorDiesel extends ArmorFSBFueled { @Override @SideOnly(Side.CLIENT) public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) { - + if(models == null) { models = new ModelArmorDiesel[4]; - + for(int i = 0; i < 4; i++) models[i] = new ModelArmorDiesel(i); } - + return models[armorSlot]; } @Override public void onArmorTick(World world, EntityPlayer player, ItemStack stack) { super.onArmorTick(world, player, stack); - + if(!world.isRemote && this == ModItems.dieselsuit_legs && this.hasFSBArmor(player) && world.getTotalWorldTime() % 3 == 0) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "bnuuy"); data.setInteger("player", player.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, player.posX, player.posY, player.posZ), new TargetPoint(world.provider.dimensionId, player.posX, player.posY, player.posZ, 100)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, player.posX, player.posY, player.posZ), new TargetPoint(world.provider.dimensionId, player.posX, player.posY, player.posZ, 100)); } } diff --git a/src/main/java/com/hbm/items/armor/ItemModKnife.java b/src/main/java/com/hbm/items/armor/ItemModKnife.java index 0c49f092f..9507dd03e 100644 --- a/src/main/java/com/hbm/items/armor/ItemModKnife.java +++ b/src/main/java/com/hbm/items/armor/ItemModKnife.java @@ -4,8 +4,8 @@ import java.util.List; import java.util.UUID; import com.hbm.handler.ArmorModHandler; +import com.hbm.handler.threading.PacketThreading; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -20,7 +20,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; public class ItemModKnife extends ItemArmorMod { - + public static final UUID trigamma_UUID = UUID.fromString("86d44ca9-44f1-4ca6-bdbb-d9d33bead251"); public ItemModKnife() { @@ -29,11 +29,11 @@ public class ItemModKnife extends ItemArmorMod { @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { - + list.add(EnumChatFormatting.RED + "Pain."); list.add(""); list.add(EnumChatFormatting.RED + "Hurts, doesn't it?"); - + list.add(""); super.addInformation(stack, player, list, bool); } @@ -42,45 +42,45 @@ public class ItemModKnife extends ItemArmorMod { public void addDesc(List list, ItemStack stack, ItemStack armor) { list.add(EnumChatFormatting.RED + " " + stack.getDisplayName()); } - + @Override public void modUpdate(EntityLivingBase entity, ItemStack armor) { - + if(!entity.worldObj.isRemote) { - + if(entity.ticksExisted % 50 == 0 && entity.getMaxHealth() > 2F) { entity.worldObj.playSoundAtEntity(entity, "hbm:entity.slicer", 1.0F, 1.0F); - + NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("type", "bloodvomit"); nbt.setInteger("entity", entity.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); - + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 25)); + IAttributeInstance attributeinstance = entity.getAttributeMap().getAttributeInstance(SharedMonsterAttributes.maxHealth); - + float health = entity.getMaxHealth(); - + try { attributeinstance.removeModifier(attributeinstance.getModifier(trigamma_UUID)); } catch(Exception ex) { } - + attributeinstance.applyModifier(new AttributeModifier(trigamma_UUID, "digamma", -(entity.getMaxHealth() - health + 2), 0)); - + if(entity instanceof EntityPlayerMP) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "properJolt"); - + if(entity.getMaxHealth() > 2F) { data.setInteger("time", 10000 + entity.getRNG().nextInt(10000)); data.setInteger("maxTime", 10000); } else { data.setInteger("time", 0); data.setInteger("maxTime", 0); - + ((EntityPlayer)entity).triggerAchievement(MainRegistry.achSomeWounds); } - PacketDispatcher.wrapper.sendTo(new AuxParticlePacketNT(data, 0, 0, 0), (EntityPlayerMP)entity); + PacketThreading.createSendToThreadedPacket(new AuxParticlePacketNT(data, 0, 0, 0), (EntityPlayerMP)entity); } } } diff --git a/src/main/java/com/hbm/items/armor/ItemModLens.java b/src/main/java/com/hbm/items/armor/ItemModLens.java index 7aeafb941..2e55ef0e0 100644 --- a/src/main/java/com/hbm/items/armor/ItemModLens.java +++ b/src/main/java/com/hbm/items/armor/ItemModLens.java @@ -4,8 +4,8 @@ import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.handler.ArmorModHandler; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ISatChip; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.saveddata.SatelliteSavedData; import com.hbm.saveddata.satellites.Satellite; @@ -27,12 +27,12 @@ public class ItemModLens extends ItemArmorMod implements ISatChip { public ItemModLens() { super(ArmorModHandler.extra, true, false, false, false); } - + @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { list.add(EnumChatFormatting.AQUA + "Satellite Frequency: " + this.getFreq(itemstack)); list.add(""); - + super.addInformation(itemstack, player, list, bool); } @@ -46,12 +46,12 @@ public class ItemModLens extends ItemArmorMod implements ISatChip { World world = entity.worldObj; if(world.isRemote) return; if(!(entity instanceof EntityPlayerMP)) return; - + EntityPlayerMP player = (EntityPlayerMP) entity; ItemStack lens = ArmorModHandler.pryMods(armor)[ArmorModHandler.extra]; - + if(lens == null) return; - + int freq = this.getFreq(lens); Satellite sat = SatelliteSavedData.getData(world).getSatFromFreq(freq); if(!(sat instanceof SatelliteScanner)) return; @@ -60,22 +60,22 @@ public class ItemModLens extends ItemArmorMod implements ISatChip { int y = (int) Math.floor(player.posY); int z = (int) Math.floor(player.posZ); int range = 3; - + int cX = x >> 4; int cZ = z >> 4; - + int height = Math.max(Math.min(y + 10, 255), 64); int seg = (int) (world.getTotalWorldTime() % height); - + int hits = 0; - + for(int chunkX = cX - range; chunkX <= cX + range; chunkX++) { for(int chunkZ = cZ - range; chunkZ <= cZ + range; chunkZ++) { Chunk c = world.getChunkFromChunkCoords(chunkX, chunkZ); - + for(int ix = 0; ix < 16; ix++) { for(int iz = 0; iz < 16; iz++) { - + Block b = c.getBlock(ix, seg, iz); int aX = (chunkX << 4) + ix; int aZ = (chunkZ << 4) + iz; @@ -94,14 +94,14 @@ public class ItemModLens extends ItemArmorMod implements ISatChip { if(addIf(ModBlocks.crate_ammo, b, 1, aX, seg, aZ, null, 0x800000, player)) hits++; if(addIf(ModBlocks.crate_can, b, 1, aX, seg, aZ, null, 0x800000, player)) hits++; if(addIf(ModBlocks.ore_bedrock, b, 1, aX, seg, aZ, "Bedrock Ore", 0xff0000, player)) hits++; - + if(hits > 100) return; } } } } } - + private boolean addIf(Block target, Block b, int chance, int x, int y, int z, String label, int color, EntityPlayerMP player) { if(target == b && player.getRNG().nextInt(chance) == 0) { @@ -111,10 +111,10 @@ public class ItemModLens extends ItemArmorMod implements ISatChip { data.setInteger("expires", 15_000); data.setDouble("dist", 300D); if(label != null) data.setString("label", label); - PacketDispatcher.wrapper.sendTo(new AuxParticlePacketNT(data, x, y, z), player); + PacketThreading.createSendToThreadedPacket(new AuxParticlePacketNT(data, x, y, z), player); return true; } - + return false; } } diff --git a/src/main/java/com/hbm/items/armor/JetpackBooster.java b/src/main/java/com/hbm/items/armor/JetpackBooster.java index de35ee89a..bbc157b7f 100644 --- a/src/main/java/com/hbm/items/armor/JetpackBooster.java +++ b/src/main/java/com/hbm/items/armor/JetpackBooster.java @@ -3,8 +3,9 @@ package com.hbm.items.armor; import java.util.List; import com.hbm.extprop.HbmPlayerProps; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.fluid.FluidType; -import com.hbm.packet.PacketDispatcher; + import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -40,7 +41,7 @@ public class JetpackBooster extends JetpackFueledBase { data.setString("type", "jetpack"); data.setInteger("player", player.getEntityId()); data.setInteger("mode", 1); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, player.posX, player.posY, player.posZ), new TargetPoint(world.provider.dimensionId, player.posX, player.posY, player.posZ, 100)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, player.posX, player.posY, player.posZ), new TargetPoint(world.provider.dimensionId, player.posX, player.posY, player.posZ, 100)); } } diff --git a/src/main/java/com/hbm/items/armor/JetpackBreak.java b/src/main/java/com/hbm/items/armor/JetpackBreak.java index 02251ed16..cb9962d7c 100644 --- a/src/main/java/com/hbm/items/armor/JetpackBreak.java +++ b/src/main/java/com/hbm/items/armor/JetpackBreak.java @@ -3,8 +3,8 @@ package com.hbm.items.armor; import java.util.List; import com.hbm.extprop.HbmPlayerProps; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.fluid.FluidType; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -30,34 +30,34 @@ public class JetpackBreak extends JetpackFueledBase { } public void onArmorTick(World world, EntityPlayer player, ItemStack stack) { - + HbmPlayerProps props = HbmPlayerProps.getData(player); - + if(!world.isRemote) { - + if(getFuel(stack) > 0 && (props.isJetpackActive() || (!player.onGround && !player.isSneaking() && props.enableBackpack))) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "jetpack"); data.setInteger("player", player.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, player.posX, player.posY, player.posZ), new TargetPoint(world.provider.dimensionId, player.posX, player.posY, player.posZ, 100)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, player.posX, player.posY, player.posZ), new TargetPoint(world.provider.dimensionId, player.posX, player.posY, player.posZ, 100)); } } if(getFuel(stack) > 0) { - + if(props.isJetpackActive()) { player.fallDistance = 0; - + if(player.motionY < 0.4D) player.motionY += 0.1D; - + world.playSoundEffect(player.posX, player.posY, player.posZ, "hbm:weapon.flamethrowerShoot", 0.25F, 1.5F); this.useUpFuel(player, stack, 5); - + } else if(!player.isSneaking() && !player.onGround && props.enableBackpack) { player.fallDistance = 0; - + if(player.motionY < -1) player.motionY += 0.2D; else if(player.motionY < -0.1) @@ -67,20 +67,20 @@ public class JetpackBreak extends JetpackFueledBase { player.motionX *= 1.025D; player.motionZ *= 1.025D; - + world.playSoundEffect(player.posX, player.posY, player.posZ, "hbm:weapon.flamethrowerShoot", 0.25F, 1.5F); this.useUpFuel(player, stack, 10); } } } - + @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { list.add("Regular jetpack that will automatically hover mid-air."); list.add("Sneaking will stop hover mode."); list.add("Hover mode will consume less fuel and increase air-mobility."); - + super.addInformation(stack, player, list, ext); } } diff --git a/src/main/java/com/hbm/items/armor/JetpackRegular.java b/src/main/java/com/hbm/items/armor/JetpackRegular.java index 6acaa030e..b5e52ea67 100644 --- a/src/main/java/com/hbm/items/armor/JetpackRegular.java +++ b/src/main/java/com/hbm/items/armor/JetpackRegular.java @@ -3,8 +3,8 @@ package com.hbm.items.armor; import java.util.List; import com.hbm.extprop.HbmPlayerProps; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.fluid.FluidType; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -38,7 +38,7 @@ public class JetpackRegular extends JetpackFueledBase { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "jetpack"); data.setInteger("player", player.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, player.posX, player.posY, player.posZ), new TargetPoint(world.provider.dimensionId, player.posX, player.posY, player.posZ, 100)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, player.posX, player.posY, player.posZ), new TargetPoint(world.provider.dimensionId, player.posX, player.posY, player.posZ, 100)); } } diff --git a/src/main/java/com/hbm/items/armor/JetpackVectorized.java b/src/main/java/com/hbm/items/armor/JetpackVectorized.java index e64593990..877f68909 100644 --- a/src/main/java/com/hbm/items/armor/JetpackVectorized.java +++ b/src/main/java/com/hbm/items/armor/JetpackVectorized.java @@ -3,8 +3,8 @@ package com.hbm.items.armor; import java.util.List; import com.hbm.extprop.HbmPlayerProps; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.fluid.FluidType; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -40,7 +40,7 @@ public class JetpackVectorized extends JetpackFueledBase { data.setString("type", "jetpack"); data.setInteger("player", player.getEntityId()); data.setInteger("mode", 1); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, player.posX, player.posY, player.posZ), new TargetPoint(world.provider.dimensionId, player.posX, player.posY, player.posZ, 100)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, player.posX, player.posY, player.posZ), new TargetPoint(world.provider.dimensionId, player.posX, player.posY, player.posZ, 100)); } } diff --git a/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java b/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java new file mode 100644 index 000000000..c3d68c3db --- /dev/null +++ b/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java @@ -0,0 +1,272 @@ +package com.hbm.items.block; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.container.*; +import com.hbm.inventory.gui.*; +import com.hbm.items.ModItems; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.machine.storage.*; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +import javax.annotation.Nonnull; +import java.io.IOException; +import java.util.Random; + +public class ItemBlockStorageCrate extends ItemBlockBase implements IGUIProvider { + + public ItemBlockStorageCrate(Block block) { + super(block); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + Block block = Block.getBlockFromItem(player.getHeldItem().getItem()); + if(block == ModBlocks.mass_storage) return stack; // Genuinely can't figure out how to make this part work, so I'm just not gonna mess with it. + + if(!world.isRemote && stack.stackSize == 1) { + if (stack.stackTagCompound != null && stack.stackTagCompound.hasKey("lock")) { + for (ItemStack item : player.inventory.mainInventory) { + if(item == null) // Skip if no item. + continue; + if(item.getItem() != ModItems.key || item.stackTagCompound == null) // Skip if item isn't a key or if the NBT is null (wouldn't open it either way). + continue; + if (item.stackTagCompound.getInteger("pins") == stack.stackTagCompound.getInteger("lock")) { // Check if pins are equal (if it can open it) + player.openGui(MainRegistry.instance, 0, world, 0, 0, 0); + break; + } + } + return stack; // Return early if it was locked. + } + + player.openGui(MainRegistry.instance, 0, world, 0, 0, 0); // If there is no lock then don't bother checking. + } + + return stack; + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + Block block = Block.getBlockFromItem(player.getHeldItem().getItem()); + if(block == ModBlocks.crate_iron) return new ContainerCrateIron(player.inventory, new InventoryCrate(player, player.getHeldItem())); + if(block == ModBlocks.crate_steel) return new ContainerCrateSteel(player.inventory, new InventoryCrate(player, player.getHeldItem())); + if(block == ModBlocks.crate_desh) return new ContainerCrateDesh(player.inventory, new InventoryCrate(player, player.getHeldItem())); + if(block == ModBlocks.crate_tungsten) return new ContainerCrateTungsten(player.inventory, new InventoryCrate(player, player.getHeldItem())); + if(block == ModBlocks.crate_template) return new ContainerCrateTemplate(player.inventory, new InventoryCrate(player, player.getHeldItem())); + if(block == ModBlocks.safe) return new ContainerSafe(player.inventory, new InventoryCrate(player, player.getHeldItem())); + throw new NullPointerException(); + } + + @Override + @SideOnly(Side.CLIENT) + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + Block block = Block.getBlockFromItem(player.getHeldItem().getItem()); + if(block == ModBlocks.crate_iron) return new GUICrateIron(player.inventory, new InventoryCrate(player, player.getHeldItem())); + if(block == ModBlocks.crate_steel) return new GUICrateSteel(player.inventory, new InventoryCrate(player, player.getHeldItem())); + if(block == ModBlocks.crate_desh) return new GUICrateDesh(player.inventory, new InventoryCrate(player, player.getHeldItem())); + if(block == ModBlocks.crate_tungsten) return new GUICrateTungsten(player.inventory, new InventoryCrate(player, player.getHeldItem())); + if(block == ModBlocks.crate_template) return new GUICrateTemplate(player.inventory, new InventoryCrate(player, player.getHeldItem())); + if(block == ModBlocks.safe) return new GUISafe(player.inventory, new InventoryCrate(player, player.getHeldItem())); + throw new NullPointerException(); + } + + public static class InventoryCrate implements IInventory { + + public final EntityPlayer player; + public final ItemStack crate; + public ItemStack[] slots; + + public InventoryCrate(EntityPlayer player, ItemStack crate) { + this.player = player; + this.crate = crate; + + slots = new ItemStack[this.getSizeInventory()]; + if(crate.stackTagCompound == null) + crate.stackTagCompound = new NBTTagCompound(); + else { + for (int i = 0; i < this.getSizeInventory(); i++) + this.setInventorySlotContents(i, ItemStack.loadItemStackFromNBT(crate.stackTagCompound.getCompoundTag("slot" + i))); + } + } + + @Nonnull + public static TileEntityCrateBase findCrateType(Item crate) { + Block block = Block.getBlockFromItem(crate); + if(block == ModBlocks.crate_iron) return new TileEntityCrateIron(); + if(block == ModBlocks.crate_steel) return new TileEntityCrateSteel(); + if(block == ModBlocks.crate_desh) return new TileEntityCrateDesh(); + if(block == ModBlocks.crate_tungsten) return new TileEntityCrateTungsten(); + if(block == ModBlocks.crate_template) return new TileEntityCrateTemplate(); + if(block == ModBlocks.safe) return new TileEntitySafe(); + throw new NullPointerException(); + } + + @Override + public int getSizeInventory() { + return findCrateType(crate.getItem()).getSizeInventory(); + } + + @Override + public String getInventoryName() { + return findCrateType(crate.getItem()).getInventoryName(); + } + + @Override + public ItemStack getStackInSlot(int slot) { + return slots[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int amount) { + ItemStack stack = getStackInSlot(slot); + if (stack != null) { + if (stack.stackSize > amount) { + stack = stack.splitStack(amount); + markDirty(); + } else { + setInventorySlotContents(slot, null); + } + } + return stack; + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + ItemStack stack = getStackInSlot(slot); + setInventorySlotContents(slot, null); + return stack; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) { + + if(stack != null) { + stack.stackSize = Math.min(stack.stackSize, this.getInventoryStackLimit()); + } + + slots[slot] = stack; + markDirty(); + } + + @Override + public boolean hasCustomInventoryName() { + return crate.hasDisplayName(); + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public void markDirty() { // I HATE THIS SO MUCH + + ItemStack item = new ItemStack(crate.getItem()); + + NBTTagCompound nbt = new NBTTagCompound(); + + for(int i = 0; i < this.getSizeInventory(); i++) { + + ItemStack stack = this.getStackInSlot(i); + if(stack == null) + continue; + + NBTTagCompound slot = new NBTTagCompound(); + stack.writeToNBT(slot); + nbt.setTag("slot" + i, slot); + } + + if(crate.stackTagCompound != null) { // yes it's a bit jank, but it wants to clear otherwise so... + if(crate.stackTagCompound.hasKey("lock")) + nbt.setInteger("lock", crate.stackTagCompound.getInteger("lock")); + if(crate.stackTagCompound.hasKey("lockMod")) + nbt.setDouble("lockMod", crate.stackTagCompound.getDouble("lockMod")); + if(crate.stackTagCompound.hasKey("spiders")) + nbt.setBoolean("spiders", crate.stackTagCompound.getBoolean("spiders")); // fuck you!! + } + + if(!nbt.hasNoTags()) { + + Random random = new Random(); + + try { + byte[] abyte = CompressedStreamTools.compress(nbt); + + if(abyte.length > 6000) { + player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.RED + "Warning: Container NBT exceeds 6kB, contents will be ejected!")); + for(int i1 = 0; i1 < this.getSizeInventory(); ++i1) { + ItemStack itemstack = this.getStackInSlot(i1); + + if(itemstack != null) { + float f = random.nextFloat() * 0.8F + 0.1F; + float f1 = random.nextFloat() * 0.8F + 0.1F; + float f2 = random.nextFloat() * 0.8F + 0.1F; + + while(itemstack.stackSize > 0) { + int j1 = random.nextInt(21) + 10; + + if(j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } + + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(player.worldObj, player.posX + f, player.posY + f1, player.posZ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + + if(itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entityitem.motionX = (float) random.nextGaussian() * f3 + player.motionX; + entityitem.motionY = (float) random.nextGaussian() * f3 + 0.2F + player.motionY; + entityitem.motionZ = (float) random.nextGaussian() * f3 + player.motionZ; + player.worldObj.spawnEntityInWorld(entityitem); + } + } + } + player.inventory.setInventorySlotContents(player.inventory.currentItem, null); + player.closeScreen(); + return; + } + } catch(IOException ignored) { } + } + + item.setTagCompound(nbt); + + player.inventory.setInventorySlotContents(player.inventory.currentItem, item); + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + return true; + } + + @Override + public void openInventory() { + player.worldObj.playSoundEffect(player.posX, player.posY, player.posZ, "hbm:block.crateOpen", 1.0F, 0.8F); + } + + @Override + public void closeInventory() { + player.worldObj.playSoundEffect(player.posX, player.posY, player.posZ, "hbm:block.crateClose", 1.0F, 0.8F); + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + return true; + } + } +} diff --git a/src/main/java/com/hbm/items/food/ItemLemon.java b/src/main/java/com/hbm/items/food/ItemLemon.java index 032fbf61a..b331b799e 100644 --- a/src/main/java/com/hbm/items/food/ItemLemon.java +++ b/src/main/java/com/hbm/items/food/ItemLemon.java @@ -2,10 +2,9 @@ package com.hbm.items.food; import java.util.List; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; - import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; @@ -20,55 +19,55 @@ public class ItemLemon extends ItemFood { public ItemLemon(int p_i45339_1_, float p_i45339_2_, boolean p_i45339_3_) { super(p_i45339_1_, p_i45339_2_, p_i45339_3_); - + if(this == ModItems.med_ipecac || this == ModItems.med_ptsd) { this.setAlwaysEdible(); } } - + @Override public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { if(this == ModItems.lemon) { list.add("Eh, good enough."); } - + if(this == ModItems.med_ipecac) { list.add("Bitter juice that will cause your stomach"); list.add("to forcefully eject its contents."); } - + if(this == ModItems.med_ptsd) { list.add("This isn't even PTSD mediaction, it's just"); list.add("Ipecac in a different bottle!"); } - + if(this == ModItems.med_schizophrenia) { list.add("Makes the voices go away. Just for a while."); list.add(""); list.add("..."); list.add("Better not take it."); } - + if(this == ModItems.med_schizophrenia) { list.add("Makes the voices go away. Just for a while."); list.add(""); list.add("..."); list.add("Better not take it."); } - + if(this == ModItems.loops) { list.add("Brøther, may I have some lööps?"); } - + if(this == ModItems.loop_stew) { list.add("A very, very healthy breakfast."); } - + if(this == ModItems.twinkie) { list.add("Expired 600 years ago!"); } - + if(this == ModItems.pudding) { list.add("What if he did?"); list.add("What if he didn't?"); @@ -96,18 +95,18 @@ public class ItemLemon extends ItemFood { { if(this == ModItems.med_ipecac || this == ModItems.med_ptsd) { player.addPotionEffect(new PotionEffect(Potion.hunger.id, 50, 49)); - + NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("type", "vomit"); nbt.setInteger("entity", player.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(player.dimension, player.posX, player.posY, player.posZ, 25)); - + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(player.dimension, player.posX, player.posY, player.posZ, 25)); + world.playSoundEffect(player.posX, player.posY, player.posZ, "hbm:entity.vomit", 1.0F, 1.0F); } - + if(this == ModItems.med_schizophrenia) { } - + if(this == ModItems.loop_stew) { player.addPotionEffect(new PotionEffect(Potion.regeneration.id, 20 * 20, 1)); player.addPotionEffect(new PotionEffect(Potion.resistance.id, 60 * 20, 2)); @@ -119,12 +118,12 @@ public class ItemLemon extends ItemFood { public ItemStack onEaten(ItemStack stack, World worldObj, EntityPlayer player) { ItemStack sta = super.onEaten(stack, worldObj, player); - + if(this == ModItems.loop_stew) return new ItemStack(Items.bowl); - + return sta; - + } } diff --git a/src/main/java/com/hbm/items/special/ItemCigarette.java b/src/main/java/com/hbm/items/special/ItemCigarette.java index b38fd2d29..47851f23e 100644 --- a/src/main/java/com/hbm/items/special/ItemCigarette.java +++ b/src/main/java/com/hbm/items/special/ItemCigarette.java @@ -3,9 +3,9 @@ package com.hbm.items.special; import java.util.List; import com.hbm.extprop.HbmLivingProps; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -44,41 +44,41 @@ public class ItemCigarette extends Item { stack.stackSize--; if(!world.isRemote) { - + if(this == ModItems.cigarette) { HbmLivingProps.incrementBlackLung(player, 2000); HbmLivingProps.incrementAsbestos(player, 2000); HbmLivingProps.incrementRadiation(player, 100F); - + ItemStack helmet = player.getEquipmentInSlot(4); if(helmet != null && helmet.getItem() == ModItems.no9) { player.triggerAchievement(MainRegistry.achNo9); } } - + if(this == ModItems.crackpipe) { HbmLivingProps.incrementBlackLung(player, 500); player.addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 0)); player.heal(10F); } - + world.playSoundEffect(player.posX, player.posY, player.posZ, "hbm:player.cough", 1.0F, 1.0F); - + NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("type", "vomit"); nbt.setString("mode", "smoke"); nbt.setInteger("count", 30); nbt.setInteger("entity", player.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(player.dimension, player.posX, player.posY, player.posZ, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(nbt, 0, 0, 0), new TargetPoint(player.dimension, player.posX, player.posY, player.posZ, 25)); } - + return stack; } @Override @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - + if(this == ModItems.cigarette) { list.add(EnumChatFormatting.RED + "✓ Asbestos filter"); list.add(EnumChatFormatting.RED + "✓ High in tar"); diff --git a/src/main/java/com/hbm/items/tool/ItemBlowtorch.java b/src/main/java/com/hbm/items/tool/ItemBlowtorch.java index 57698b4a0..bf14b38bc 100644 --- a/src/main/java/com/hbm/items/tool/ItemBlowtorch.java +++ b/src/main/java/com/hbm/items/tool/ItemBlowtorch.java @@ -3,12 +3,12 @@ package com.hbm.items.tool; import java.util.List; import java.util.Locale; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import api.hbm.block.IToolable; @@ -31,10 +31,10 @@ public class ItemBlowtorch extends Item implements IFillableItem { this.setMaxStackSize(1); this.setFull3D(); this.setCreativeTab(MainRegistry.controlTab); - + ToolType.TORCH.register(new ItemStack(this)); } - + @Override public Item setUnlocalizedName(String unlocalizedName) { super.setUnlocalizedName(unlocalizedName); @@ -47,20 +47,20 @@ public class ItemBlowtorch extends Item implements IFillableItem { if(this == ModItems.blowtorch) return type == Fluids.GAS; if(this == ModItems.acetylene_torch) return type == Fluids.UNSATURATEDS || type == Fluids.OXYGEN; - + return false; } @Override public int tryFill(FluidType type, int amount, ItemStack stack) { - + if(!acceptsFluid(type, stack)) return amount; - + int toFill = Math.min(amount, 50); toFill = Math.min(toFill, getMaxFill(type) - this.getFill(stack, type)); this.setFill(stack, type, this.getFill(stack, type) + toFill); - + return amount - toFill; } @@ -68,25 +68,25 @@ public class ItemBlowtorch extends Item implements IFillableItem { if(!stack.hasTagCompound()) { initNBT(stack); } - + //just in case String name = Fluids.toNameCompat(type); if(stack.stackTagCompound.hasKey(name)) { int fill = stack.stackTagCompound.getInteger(name); stack.stackTagCompound.removeTag(name); stack.stackTagCompound.setInteger(Integer.toString(type.getID()), fill); - + return fill; } - + return stack.stackTagCompound.getInteger(Integer.toString(type.getID())); } - + public int getMaxFill(FluidType type) { if(type == Fluids.GAS) return 4_000; if(type == Fluids.UNSATURATEDS) return 8_000; if(type == Fluids.OXYGEN) return 16_000; - + return 0; } @@ -94,12 +94,12 @@ public class ItemBlowtorch extends Item implements IFillableItem { if(!stack.hasTagCompound()) { initNBT(stack); } - + stack.stackTagCompound.setInteger(Integer.toString(type.getID()), fill); } - + public void initNBT(ItemStack stack) { - + stack.stackTagCompound = new NBTTagCompound(); if(this == ModItems.blowtorch) { @@ -110,7 +110,7 @@ public class ItemBlowtorch extends Item implements IFillableItem { this.setFill(stack, Fluids.OXYGEN, this.getMaxFill(Fluids.OXYGEN)); } } - + public static ItemStack getEmptyTool(Item item) { ItemBlowtorch tool = (ItemBlowtorch) item; ItemStack stack = new ItemStack(item); @@ -122,51 +122,51 @@ public class ItemBlowtorch extends Item implements IFillableItem { tool.setFill(stack, Fluids.UNSATURATEDS, 0); tool.setFill(stack, Fluids.OXYGEN, 0); } - + return stack; } @Override public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float fX, float fY, float fZ) { - + Block b = world.getBlock(x, y, z); - + if(b instanceof IToolable) { - + if(this == ModItems.blowtorch) { if(this.getFill(stack, Fluids.GAS) < 1000) return false; } - + if(this == ModItems.acetylene_torch) { if(this.getFill(stack, Fluids.UNSATURATEDS) < 20) return false; if(this.getFill(stack, Fluids.OXYGEN) < 10) return false; } - + if(((IToolable)b).onScrew(world, player, x, y, z, side, fX, fY, fZ, ToolType.TORCH)) { - + if(!world.isRemote) { - + if(this == ModItems.blowtorch) { this.setFill(stack, Fluids.GAS, this.getFill(stack, Fluids.GAS) - 250); } - + if(this == ModItems.acetylene_torch) { this.setFill(stack, Fluids.UNSATURATEDS, this.getFill(stack, Fluids.UNSATURATEDS) - 20); this.setFill(stack, Fluids.OXYGEN, this.getFill(stack, Fluids.OXYGEN) - 10); } - + player.inventoryContainer.detectAndSendChanges(); - + NBTTagCompound dPart = new NBTTagCompound(); dPart.setString("type", "tau"); dPart.setByte("count", (byte) 10); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(dPart, x + fX, y + fY, z + fZ), new TargetPoint(world.provider.dimensionId, x, y, z, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(dPart, x + fX, y + fY, z + fZ), new TargetPoint(world.provider.dimensionId, x, y, z, 50)); } - + return true; } } - + return false; } @@ -177,27 +177,27 @@ public class ItemBlowtorch extends Item implements IFillableItem { @Override public double getDurabilityForDisplay(ItemStack stack) { - + double frac = 0D; - + if(this == ModItems.blowtorch) { frac = (double) this.getFill(stack, Fluids.GAS) / (double) this.getMaxFill(Fluids.GAS); } - + if(this == ModItems.acetylene_torch) { frac = Math.min( (double) this.getFill(stack, Fluids.UNSATURATEDS) / (double) this.getMaxFill(Fluids.UNSATURATEDS), (double) this.getFill(stack, Fluids.OXYGEN) / (double) this.getMaxFill(Fluids.OXYGEN) ); } - + return 1 - frac; } @Override @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - + if(this == ModItems.blowtorch) { list.add(EnumChatFormatting.YELLOW + getFillGauge(stack, Fluids.GAS)); } diff --git a/src/main/java/com/hbm/items/tool/ItemBoltgun.java b/src/main/java/com/hbm/items/tool/ItemBoltgun.java index 837eb7207..ef85ff820 100644 --- a/src/main/java/com/hbm/items/tool/ItemBoltgun.java +++ b/src/main/java/com/hbm/items/tool/ItemBoltgun.java @@ -1,11 +1,11 @@ package com.hbm.items.tool; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.material.Mats; import com.hbm.items.IAnimatedItem; import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.render.anim.BusAnimation; import com.hbm.render.anim.BusAnimationSequence; @@ -32,29 +32,29 @@ public class ItemBoltgun extends Item implements IAnimatedItem { public ItemBoltgun() { this.setMaxStackSize(1); this.setCreativeTab(MainRegistry.controlTab); - + ToolType.BOLT.register(new ItemStack(this)); } - + @Override public Item setUnlocalizedName(String unlocalizedName) { super.setUnlocalizedName(unlocalizedName); this.setTextureName(RefStrings.MODID + ":"+ unlocalizedName); return this; } - + @Override public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { - + World world = player.worldObj; if(!entity.isEntityAlive()) return false; - + ItemStack[] bolts = new ItemStack[] { new ItemStack(ModItems.bolt_spike), Mats.MAT_STEEL.make(ModItems.bolt), Mats.MAT_TUNGSTEN.make(ModItems.bolt), Mats.MAT_DURA.make(ModItems.bolt)}; - + for(ItemStack bolt : bolts) { for(int i = 0; i < player.inventory.getSizeInventory(); i++) { ItemStack slot = player.inventory.getStackInSlot(i); - + if(slot != null) { if(slot.getItem() == bolt.getItem() && slot.getItemDamage() == bolt.getItemDamage()) { if(!world.isRemote) { @@ -62,7 +62,7 @@ public class ItemBoltgun extends Item implements IAnimatedItem { player.inventory.decrStackSize(i, 1); player.inventoryContainer.detectAndSendChanges(); EntityDamageUtil.attackEntityFromIgnoreIFrame(entity, DamageSource.causePlayerDamage(player).setDamageBypassesArmor(), 10F); - + if(!entity.isEntityAlive() && entity instanceof EntityPlayer) { ((EntityPlayer) entity).triggerAchievement(MainRegistry.achGoFish); } @@ -72,7 +72,7 @@ public class ItemBoltgun extends Item implements IAnimatedItem { data.setString("mode", "largeexplode"); data.setFloat("size", 1F); data.setByte("count", (byte)1); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, entity.posX, entity.posY + entity.height / 2 - entity.yOffset, entity.posZ), new TargetPoint(world.provider.dimensionId, entity.posX, entity.posY, entity.posZ, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, entity.posX, entity.posY + entity.height / 2 - entity.yOffset, entity.posZ), new TargetPoint(world.provider.dimensionId, entity.posX, entity.posY, entity.posZ, 50)); } else { // doing this on the client outright removes the packet delay and makes the animation silky-smooth NBTTagCompound d0 = new NBTTagCompound(); @@ -85,15 +85,15 @@ public class ItemBoltgun extends Item implements IAnimatedItem { } } } - + return false; } @Override public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float fX, float fY, float fZ) { - + Block b = world.getBlock(x, y, z); - + if(b instanceof IToolable && ((IToolable)b).onScrew(world, player, x, y, z, side, fX, fY, fZ, ToolType.BOLT)) { if(!world.isRemote) { @@ -108,17 +108,17 @@ public class ItemBoltgun extends Item implements IAnimatedItem { data.setString("mode", "largeexplode"); data.setFloat("size", 1F); data.setByte("count", (byte)1); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x + fX + dir.offsetX * off, y + fY + dir.offsetY * off, z + fZ + dir.offsetZ * off), new TargetPoint(world.provider.dimensionId, x, y, z, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x + fX + dir.offsetX * off, y + fY + dir.offsetY * off, z + fZ + dir.offsetZ * off), new TargetPoint(world.provider.dimensionId, x, y, z, 50)); NBTTagCompound d0 = new NBTTagCompound(); d0.setString("type", "anim"); d0.setString("mode", "generic"); - PacketDispatcher.wrapper.sendTo(new AuxParticlePacketNT(d0, 0, 0, 0), (EntityPlayerMP) player); + PacketThreading.createSendToThreadedPacket(new AuxParticlePacketNT(d0, 0, 0, 0), (EntityPlayerMP) player); } - + return false; } - + return false; } diff --git a/src/main/java/com/hbm/items/tool/ItemChainsaw.java b/src/main/java/com/hbm/items/tool/ItemChainsaw.java index b20f5ba3b..32a53c960 100644 --- a/src/main/java/com/hbm/items/tool/ItemChainsaw.java +++ b/src/main/java/com/hbm/items/tool/ItemChainsaw.java @@ -1,8 +1,8 @@ package com.hbm.items.tool; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.fluid.FluidType; import com.hbm.items.IHeldSoundProvider; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import net.minecraft.entity.EntityLivingBase; @@ -18,18 +18,18 @@ public class ItemChainsaw extends ItemToolAbilityFueled implements IHeldSoundPro @Override public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack) { - + if(!(entityLiving instanceof EntityPlayerMP)) return false; - + if(stack.getItemDamage() >= stack.getMaxDamage()) return false; - + NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("type", "anim"); nbt.setString("mode", "sSwing"); - PacketDispatcher.wrapper.sendTo(new AuxParticlePacketNT(nbt, 0, 0, 0), (EntityPlayerMP)entityLiving); - + PacketThreading.createSendToThreadedPacket(new AuxParticlePacketNT(nbt, 0, 0, 0), (EntityPlayerMP)entityLiving); + return false; } } diff --git a/src/main/java/com/hbm/items/tool/ItemPowerNetTool.java b/src/main/java/com/hbm/items/tool/ItemPowerNetTool.java index 660c0ed82..283504f71 100644 --- a/src/main/java/com/hbm/items/tool/ItemPowerNetTool.java +++ b/src/main/java/com/hbm/items/tool/ItemPowerNetTool.java @@ -3,7 +3,7 @@ package com.hbm.items.tool; import java.util.List; import com.hbm.blocks.BlockDummyable; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ChatBuilder; import com.hbm.util.fauxpointtwelve.BlockPos; @@ -26,29 +26,29 @@ public class ItemPowerNetTool extends Item { @Override public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float fX, float fY, float fZ) { - + Block b = world.getBlock(x, y, z); - + if(b instanceof BlockDummyable) { int[] pos = ((BlockDummyable) b).findCore(world, x, y, z); - + if(pos != null) { x = pos[0]; y = pos[1]; z = pos[2]; } } - + TileEntity te = world.getTileEntity(x, y, z); - + if(world.isRemote) return true; - + if((te instanceof IEnergyConductorMK2)) { PowerNode node = Nodespace.getNode(world, x, y, z); - + if(node != null && node.hasValidNet()) { - + PowerNetMK2 net = node.net; String id = Integer.toHexString(net.hashCode()); player.addChatComponentMessage(ChatBuilder.start("Start of diagnostic for network " + id).color(EnumChatFormatting.GOLD).flush()); @@ -56,29 +56,29 @@ public class ItemPowerNetTool extends Item { player.addChatComponentMessage(ChatBuilder.start("Providers: " + net.providerEntries.size()).color(EnumChatFormatting.YELLOW).flush()); player.addChatComponentMessage(ChatBuilder.start("Receivers: " + net.receiverEntries.size()).color(EnumChatFormatting.YELLOW).flush()); player.addChatComponentMessage(ChatBuilder.start("End of diagnostic for network " + id).color(EnumChatFormatting.GOLD).flush()); - + for(PowerNode link : net.links) { - + for(BlockPos pos : link.positions) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "debug"); data.setInteger("color", 0xffff00); data.setFloat("scale", 0.5F); data.setString("text", id); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.getX() + 0.5, pos.getY() + 1.5, pos.getZ() + 0.5), new TargetPoint(world.provider.dimensionId, pos.getX(), pos.getY(), pos.getZ(), radius)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, pos.getX() + 0.5, pos.getY() + 1.5, pos.getZ() + 0.5), new TargetPoint(world.provider.dimensionId, pos.getX(), pos.getY(), pos.getZ(), radius)); } } - + } else { player.addChatComponentMessage(ChatBuilder.start("Error: No network found!").color(EnumChatFormatting.RED).flush()); } - + return true; } - + return false; } - + private static final int radius = 20; @Override diff --git a/src/main/java/com/hbm/items/tool/ItemWandD.java b/src/main/java/com/hbm/items/tool/ItemWandD.java index 348203890..b3f1c4214 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandD.java +++ b/src/main/java/com/hbm/items/tool/ItemWandD.java @@ -4,12 +4,15 @@ import java.util.List; import com.hbm.explosion.vanillant.ExplosionVNT; import com.hbm.explosion.vanillant.standard.BlockAllocatorStandard; +import com.hbm.lib.HbmWorldGen; import com.hbm.lib.Library; import com.hbm.particle.helper.ExplosionCreator; +import com.hbm.tileentity.machine.storage.TileEntityCrateBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; @@ -17,14 +20,14 @@ public class ItemWandD extends Item { @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - + if(world.isRemote) return stack; - + MovingObjectPosition pos = Library.rayTrace(player, 500, 1, false, true, false); - + if(pos != null) { - + /*ExplosionVNT vnt = new ExplosionVNT(world, pos.hitVec.xCoord, pos.hitVec.yCoord, pos.hitVec.zCoord, 7); vnt.setBlockAllocator(new BlockAllocatorBulkie(60)); vnt.setBlockProcessor(new BlockProcessorStandard().withBlockEffect(new BlockMutatorBulkie(ModBlocks.block_slag)).setNoDrop()); @@ -32,25 +35,27 @@ public class ItemWandD extends Item { vnt.setPlayerProcessor(new PlayerProcessorStandard()); vnt.setSFX(new ExplosionEffectStandard()); vnt.explode();*/ - + //PollutionHandler.incrementPollution(world, pos.blockX, pos.blockY, pos.blockZ, PollutionType.SOOT, 15); - + /*int i = pos.blockX >> 4; int j = pos.blockZ >> 4; - + i = (i << 4) + 8; j = (j << 4) + 8; Component comp = new RuralHouse1(world.rand, i, j); comp.addComponentParts(world, world.rand, new StructureBoundingBox(i, j, i + 32, j + 32));*/ - + + /* ExplosionVNT vnt = new ExplosionVNT(world, pos.blockX + 0.5, pos.blockY + 1, pos.blockZ + 0.5, 15F); vnt.makeStandard(); vnt.setSFX(); vnt.setBlockAllocator(new BlockAllocatorStandard(32)); vnt.explode(); - + ExplosionCreator.composeEffectStandard(world, pos.blockX + 0.5, pos.blockY + 0.5, pos.blockZ + 0.5); - + */ + /*for(int i = 0; i < 10; i++) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "debris"); @@ -59,20 +64,20 @@ public class ItemWandD extends Item { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "oomph"); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.blockX, pos.blockY, pos.blockZ), new TargetPoint(world.provider.dimensionId, pos.blockX, pos.blockY, pos.blockZ, 100));*/ - + /*TimeAnalyzer.startCount("setBlock"); world.setBlock(pos.blockX, pos.blockY, pos.blockZ, Blocks.dirt); TimeAnalyzer.startEndCount("getBlock"); world.getBlock(pos.blockX, pos.blockY, pos.blockZ); TimeAnalyzer.endCount(); TimeAnalyzer.dump();*/ - + /*TomSaveData data = TomSaveData.forWorld(world); data.impact = true; data.fire = 0F; data.dust = 0F; data.markDirty();*/ - + /*for(int i = -5; i <= 5; i++) { for(int j = -5; j <= 5; j++) { WorldUtil.setBiome(world, pos.blockX + i, pos.blockZ + j, BiomeGenCraterBase.craterBiome); @@ -80,39 +85,39 @@ public class ItemWandD extends Item { } WorldUtil.syncBiomeChange(world, pos.blockX, pos.blockZ);*/ - + /*EntityTomBlast tom = new EntityTomBlast(world); tom.posX = pos.blockX; tom.posY = pos.blockY; tom.posZ = pos.blockZ; tom.destructionRange = 600; world.spawnEntityInWorld(tom);*/ - + /*List del = world.getEntitiesWithinAABB(EntityNukeTorex.class, AxisAlignedBB.getBoundingBox(pos.blockX, pos.blockY + 1, pos.blockZ, pos.blockX, pos.blockY + 1, pos.blockZ).expand(50, 50, 50)); - + if(!del.isEmpty()) { for(EntityNukeTorex torex : del) torex.setDead(); } else { EntityNukeTorex.statFac(world, pos.blockX, pos.blockY + 1, pos.blockZ, 150); }*/ - + /*EntityTracker entitytracker = ((WorldServer) world).getEntityTracker(); IntHashMap map = ReflectionHelper.getPrivateValue(EntityTracker.class, entitytracker, "trackedEntityIDs", "field_72794_c"); EntityTrackerEntry entry = (EntityTrackerEntry) map.lookup(torex.getEntityId()); entry.blocksDistanceThreshold = 1000;*/ //world.spawnEntityInWorld(EntityNukeExplosionMK5.statFacNoRad(world, 150, pos.blockX, pos.blockY + 1, pos.blockZ)); - + //DungeonToolbox.generateBedrockOreWithChance(world, world.rand, pos.blockX, pos.blockZ, EnumBedrockOre.TITANIUM, new FluidStack(Fluids.SULFURIC_ACID, 500), 2, 1); - + /*EntitySiegeTunneler tunneler = new EntitySiegeTunneler(world); tunneler.setPosition(pos.blockX, pos.blockY + 1, pos.blockZ); tunneler.onSpawnWithEgg(null); world.spawnEntityInWorld(tunneler);*/ - + //CellularDungeonFactory.meteor.generate(world, x, y, z, world.rand); - + /*int r = 5; - + int x = pos.blockX; int y = pos.blockY; int z = pos.blockZ; @@ -124,24 +129,24 @@ public class ItemWandD extends Item { } } }*/ - + //new Bunker().generate(world, world.rand, x, y, z); - + /*EntityBlockSpider spider = new EntityBlockSpider(world); spider.setPosition(x + 0.5, y, z + 0.5); spider.makeBlock(world.getBlock(x, y, z), world.getBlockMetadata(x, y, z)); world.setBlockToAir(x, y, z); world.spawnEntityInWorld(spider);*/ - - + + /*NBTTagCompound data = new NBTTagCompound(); data.setString("type", "rift"); data.setDouble("posX", x); data.setDouble("posY", y + 1); data.setDouble("posZ", z); - + MainRegistry.proxy.effectNT(data);*/ - + //new Spaceship().generate_r0(world, world.rand, x - 4, y, z - 8); //new Ruin001().generate_r0(world, world.rand, x, y - 8, z); @@ -149,11 +154,11 @@ public class ItemWandD extends Item { //CellularDungeonFactory.jungle.generate(world, x, y, z, world.rand); //CellularDungeonFactory.jungle.generate(world, x, y + 4, z, world.rand); //CellularDungeonFactory.jungle.generate(world, x, y + 8, z, world.rand); - + //new AncientTomb().build(world, world.rand, x, y + 10, z); - + //new ArcticVault().trySpawn(world, x, y, z); - + /*for(int ix = x - 10; ix <= x + 10; ix++) { for(int iz = z - 10; iz <= z + 10; iz++) { @@ -175,7 +180,7 @@ public class ItemWandD extends Item { } }*/ } - + return stack; } diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java index 0014cb736..58103bf86 100644 --- a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java @@ -20,10 +20,10 @@ import com.hbm.explosion.vanillant.standard.EntityProcessorCross; import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.SpentCasing; import com.hbm.particle.SpentCasing.CasingType; @@ -50,7 +50,7 @@ import net.minecraft.util.Vec3; import net.minecraft.util.MovingObjectPosition.MovingObjectType; public class ItemAmmoArty extends Item { - + public static Random rand = new Random(); public static ArtilleryShell[] itemTypes = new ArtilleryShell[ /* >>> */ 12 /* <<< */ ]; /* item types */ @@ -67,7 +67,7 @@ public class ItemAmmoArty extends Item { public final int PHOSGENE = 10; public final int MUSTARD = 11; /* non-item shell types */ - + public ItemAmmoArty() { this.setHasSubtypes(true); this.setCreativeTab(MainRegistry.weaponTab); @@ -97,7 +97,7 @@ public class ItemAmmoArty extends Item { String r = EnumChatFormatting.RED + ""; String y = EnumChatFormatting.YELLOW + ""; String b = EnumChatFormatting.BLUE + ""; - + switch(stack.getItemDamage()) { case NORMAL: list.add(y + "Strength: 10"); @@ -137,7 +137,7 @@ public class ItemAmmoArty extends Item { list.add(r + "minecraft's unicode has to offer)"); break; case CARGO: - + if(stack.hasTagCompound() && stack.stackTagCompound.getCompoundTag("cargo") != null) { ItemStack cargo = ItemStack.loadItemStackFromNBT(stack.stackTagCompound.getCompoundTag("cargo")); list.add(y + cargo.getDisplayName()); @@ -153,53 +153,53 @@ public class ItemAmmoArty extends Item { @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister reg) { - + this.icons = new IIcon[itemTypes.length]; for(int i = 0; i < icons.length; i++) { this.icons[i] = reg.registerIcon(RefStrings.MODID + ":" + itemTypes[i].name); } - + this.iconCargo = reg.registerIcon(RefStrings.MODID + ":ammo_arty_cargo_full"); } - + @SideOnly(Side.CLIENT) public IIcon getIconIndex(ItemStack stack) { - + if(stack.getItemDamage() == CARGO && stack.hasTagCompound() && stack.stackTagCompound.getCompoundTag("cargo") != null) { return this.iconCargo; } - + return this.getIconFromDamage(stack.getItemDamage()); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIconFromDamage(int meta) { return this.icons[meta]; } - + @Override public String getUnlocalizedName(ItemStack stack) { return "item." + itemTypes[Math.abs(stack.getItemDamage()) % itemTypes.length].name; } - + protected static SpentCasing SIXTEEN_INCH_CASE = new SpentCasing(CasingType.STRAIGHT).setScale(15F, 15F, 10F).setupSmoke(1F, 1D, 200, 60).setMaxAge(300); - + public abstract class ArtilleryShell { - + String name; public SpentCasing casing; - + public ArtilleryShell(String name, int casingColor) { this.name = name; this.casing = SIXTEEN_INCH_CASE.clone().register(name).setColor(casingColor); } - + public abstract void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop); public void onUpdate(EntityArtilleryShell shell) { } } - + public static void standardExplosion(EntityArtilleryShell shell, MovingObjectPosition mop, float size, float rangeMod, boolean breaksBlocks) { Vec3 vec = Vec3.createVectorHelper(shell.motionX, shell.motionY, shell.motionZ).normalize(); ExplosionVNT xnt = new ExplosionVNT(shell.worldObj, mop.hitVec.xCoord - vec.xCoord, mop.hitVec.yCoord - vec.yCoord, mop.hitVec.zCoord - vec.zCoord, size); @@ -213,22 +213,22 @@ public class ItemAmmoArty extends Item { xnt.explode(); shell.killAndClear(); } - + public static void standardCluster(EntityArtilleryShell shell, int clusterType, int amount, double splitHeight, double deviation) { if(!shell.getWhistle() || shell.motionY > 0) return; if(shell.getTargetHeight() + splitHeight < shell.posY) return; - + shell.killAndClear(); - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "plasmablast"); data.setFloat("r", 1.0F); data.setFloat("g", 1.0F); data.setFloat("b", 1.0F); data.setFloat("scale", 50F); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, shell.posX, shell.posY, shell.posZ), + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, shell.posX, shell.posY, shell.posZ), new TargetPoint(shell.dimension, shell.posX, shell.posY, shell.posZ, 500)); - + for(int i = 0; i < amount; i++) { EntityArtilleryShell cluster = new EntityArtilleryShell(shell.worldObj); cluster.setType(clusterType); @@ -242,7 +242,7 @@ public class ItemAmmoArty extends Item { shell.worldObj.spawnEntityInWorld(cluster); } } - + private void init() { /* STANDARD SHELLS */ this.itemTypes[NORMAL] = new ArtilleryShell("ammo_arty", SpentCasing.COLOR_CASE_16INCH) { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { standardExplosion(shell, mop, 10F, 3F, false); ExplosionCreator.composeEffect(shell.worldObj, mop.blockX + 0.5, mop.blockY + 0.5, mop.blockZ + 0.5, 10, 2F, 0.5F, 25F, 5, 0, 20, 0.75F, 1F, -2F, 150); }}; @@ -257,7 +257,7 @@ public class ItemAmmoArty extends Item { ExplosionNukeSmall.explode(shell.worldObj, mop.hitVec.xCoord - vec.xCoord, mop.hitVec.yCoord - vec.yCoord, mop.hitVec.zCoord - vec.zCoord, ExplosionNukeSmall.PARAMS_MEDIUM); } }; - + /* FULL NUKE */ this.itemTypes[NUKE] = new ArtilleryShell("ammo_arty_nuke", SpentCasing.COLOR_CASE_16INCH_NUKE) { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { @@ -266,7 +266,7 @@ public class ItemAmmoArty extends Item { shell.setDead(); } }; - + /* PHOSPHORUS */ this.itemTypes[PHOSPHORUS] = new ArtilleryShell("ammo_arty_phosphorus", SpentCasing.COLOR_CASE_16INCH_PHOS) { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { @@ -288,15 +288,15 @@ public class ItemAmmoArty extends Item { for(int i = 0; i < 5; i++) { NBTTagCompound haze = new NBTTagCompound(); haze.setString("type", "haze"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(haze, mop.hitVec.xCoord + shell.worldObj.rand.nextGaussian() * 10, mop.hitVec.yCoord, mop.hitVec.zCoord + shell.worldObj.rand.nextGaussian() * 10), new TargetPoint(shell.dimension, shell.posX, shell.posY, shell.posZ, 150)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(haze, mop.hitVec.xCoord + shell.worldObj.rand.nextGaussian() * 10, mop.hitVec.yCoord, mop.hitVec.zCoord + shell.worldObj.rand.nextGaussian() * 10), new TargetPoint(shell.dimension, shell.posX, shell.posY, shell.posZ, 150)); } NBTTagCompound data = new NBTTagCompound(); data.setString("type", "rbmkmush"); data.setFloat("scale", 10); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord), new TargetPoint(shell.dimension, shell.posX, shell.posY, shell.posZ, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord), new TargetPoint(shell.dimension, shell.posX, shell.posY, shell.posZ, 250)); } }; - + /* THIS DOOFUS */ this.itemTypes[CARGO] = new ArtilleryShell("ammo_arty_cargo", SpentCasing.COLOR_CASE_16INCH) { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { if(mop.typeOfHit == MovingObjectType.BLOCK) { @@ -304,7 +304,7 @@ public class ItemAmmoArty extends Item { shell.getStuck(mop.blockX, mop.blockY, mop.blockZ, mop.sideHit); } }}; - + /* GAS */ this.itemTypes[CHLORINE] = new ArtilleryShell("ammo_arty_chlorine", SpentCasing.COLOR_CASE_16INCH) { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { @@ -363,7 +363,7 @@ public class ItemAmmoArty extends Item { PollutionHandler.incrementPollution(shell.worldObj, mop.blockX, mop.blockY, mop.blockZ, PollutionType.POISON, 30F); } }; - + /* CLUSTER SHELLS */ this.itemTypes[PHOSPHORUS_MULTI] = new ArtilleryShell("ammo_arty_phosphorus_multi", SpentCasing.COLOR_CASE_16INCH_PHOS) { public void onImpact(EntityArtilleryShell shell, MovingObjectPosition mop) { ItemAmmoArty.this.itemTypes[PHOSPHORUS].onImpact(shell, mop); } diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java index f50d3ba0f..49d84dd35 100644 --- a/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java @@ -13,9 +13,9 @@ import com.hbm.explosion.vanillant.standard.BlockMutatorDebris; import com.hbm.explosion.vanillant.standard.BlockProcessorStandard; import com.hbm.explosion.vanillant.standard.EntityProcessorCross; import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard; +import com.hbm.handler.threading.PacketThreading; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.helper.ExplosionCreator; import com.hbm.potion.HbmPotion; @@ -39,7 +39,7 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.Vec3; public class ItemAmmoHIMARS extends Item { - + public static HIMARSRocket[] itemTypes = new HIMARSRocket[ /* >>> */ 8 /* <<< */ ]; public static final int SMALL = 0; @@ -50,7 +50,7 @@ public class ItemAmmoHIMARS extends Item { public static final int LARGE_TB = 5; public static final int SMALL_MINI_NUKE = 6; public static final int SMALL_LAVA = 7; - + public ItemAmmoHIMARS() { this.setHasSubtypes(true); this.setCreativeTab(MainRegistry.weaponTab); @@ -78,7 +78,7 @@ public class ItemAmmoHIMARS extends Item { String r = EnumChatFormatting.RED + ""; String y = EnumChatFormatting.YELLOW + ""; String b = EnumChatFormatting.BLUE + ""; - + switch(stack.getItemDamage()) { case SMALL: list.add(y + "Strength: 20"); @@ -123,30 +123,30 @@ public class ItemAmmoHIMARS extends Item { break; } } - + @Override public String getUnlocalizedName(ItemStack stack) { return "item.ammo_himars_" + itemTypes[Math.abs(stack.getItemDamage()) % itemTypes.length].name; } - + public abstract class HIMARSRocket { - + public final String name; public final ResourceLocation texture; public final int amount; public final int modelType; /* 0 = sixfold/standard ; 1 = single */ - + public HIMARSRocket(String name, String texture, int type) { this.name = name; this.texture = new ResourceLocation(RefStrings.MODID + ":textures/models/projectiles/" + texture + ".png"); this.amount = type == 0 ? 6 : 1; this.modelType = type; } - + public abstract void onImpact(EntityArtilleryRocket rocket, MovingObjectPosition mop); public void onUpdate(EntityArtilleryRocket rocket) { } } - + public static void standardExplosion(EntityArtilleryRocket rocket, MovingObjectPosition mop, float size, float rangeMod, boolean breaksBlocks, Block slag, int slagMeta) { Vec3 vec = Vec3.createVectorHelper(rocket.motionX, rocket.motionY, rocket.motionZ).normalize(); ExplosionVNT xnt = new ExplosionVNT(rocket.worldObj, mop.hitVec.xCoord - vec.xCoord, mop.hitVec.yCoord - vec.yCoord, mop.hitVec.zCoord - vec.zCoord, size); @@ -159,14 +159,14 @@ public class ItemAmmoHIMARS extends Item { xnt.explode(); rocket.killAndClear(); } - + public static void standardMush(EntityArtilleryRocket rocket, MovingObjectPosition mop, float size) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "rbmkmush"); data.setFloat("scale", size); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord), new TargetPoint(rocket.dimension, rocket.posX, rocket.posY, rocket.posZ, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord), new TargetPoint(rocket.dimension, rocket.posX, rocket.posY, rocket.posZ, 250)); } - + private void init() { /* STANDARD ROCKETS */ this.itemTypes[SMALL] = new HIMARSRocket("standard", "himars_standard", 0) { public void onImpact(EntityArtilleryRocket rocket, MovingObjectPosition mop) { standardExplosion(rocket, mop, 20F, 3F, false, ModBlocks.block_slag, 1); ExplosionCreator.composeEffect(rocket.worldObj, mop.blockX + 0.5, mop.blockY + 0.5, mop.blockZ + 0.5, 15, 5F, 1F, 45F, 10, 0, 50, 1F, 3F, -2F, 200); }}; @@ -181,7 +181,7 @@ public class ItemAmmoHIMARS extends Item { ExplosionNukeSmall.explode(rocket.worldObj, mop.hitVec.xCoord - vec.xCoord, mop.hitVec.yCoord - vec.yCoord, mop.hitVec.zCoord - vec.zCoord, ExplosionNukeSmall.PARAMS_MEDIUM); } }; - + this.itemTypes[SMALL_WP] = new HIMARSRocket("standard_wp", "himars_standard_wp", 0) { public void onImpact(EntityArtilleryRocket rocket, MovingObjectPosition mop) { rocket.worldObj.playSoundEffect(rocket.posX, rocket.posY, rocket.posZ, "hbm:weapon.explosionMedium", 20.0F, 0.9F + rocket.worldObj.rand.nextFloat() * 0.2F); @@ -201,11 +201,11 @@ public class ItemAmmoHIMARS extends Item { for(int i = 0; i < 10; i++) { NBTTagCompound haze = new NBTTagCompound(); haze.setString("type", "haze"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(haze, mop.hitVec.xCoord + rocket.worldObj.rand.nextGaussian() * 15, mop.hitVec.yCoord, mop.hitVec.zCoord + rocket.worldObj.rand.nextGaussian() * 15), new TargetPoint(rocket.dimension, rocket.posX, rocket.posY, rocket.posZ, 150)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(haze, mop.hitVec.xCoord + rocket.worldObj.rand.nextGaussian() * 15, mop.hitVec.yCoord, mop.hitVec.zCoord + rocket.worldObj.rand.nextGaussian() * 15), new TargetPoint(rocket.dimension, rocket.posX, rocket.posY, rocket.posZ, 150)); } standardMush(rocket, mop, 15); }}; - + this.itemTypes[SMALL_TB] = new HIMARSRocket("standard_tb", "himars_standard_tb", 0) { public void onImpact(EntityArtilleryRocket rocket, MovingObjectPosition mop) { rocket.worldObj.playSoundEffect(rocket.posX, rocket.posY, rocket.posZ, "hbm:weapon.explosionMedium", 20.0F, 0.9F + rocket.worldObj.rand.nextFloat() * 0.2F); @@ -213,7 +213,7 @@ public class ItemAmmoHIMARS extends Item { ExplosionLarge.spawnShrapnels(rocket.worldObj, (int) mop.hitVec.xCoord, (int) mop.hitVec.yCoord, (int) mop.hitVec.zCoord, 30); standardMush(rocket, mop, 20); }}; - + this.itemTypes[LARGE_TB] = new HIMARSRocket("single_tb", "himars_single_tb", 1) { public void onImpact(EntityArtilleryRocket rocket, MovingObjectPosition mop) { rocket.worldObj.playSoundEffect(rocket.posX, rocket.posY, rocket.posZ, "hbm:weapon.explosionMedium", 20.0F, 0.9F + rocket.worldObj.rand.nextFloat() * 0.2F); diff --git a/src/main/java/com/hbm/items/weapon/ItemCrucible.java b/src/main/java/com/hbm/items/weapon/ItemCrucible.java index b2201d593..d077dd131 100644 --- a/src/main/java/com/hbm/items/weapon/ItemCrucible.java +++ b/src/main/java/com/hbm/items/weapon/ItemCrucible.java @@ -4,9 +4,9 @@ import java.util.List; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.IEquipReceiver; import com.hbm.items.tool.ItemSwordAbility; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ShadyUtil; @@ -35,101 +35,101 @@ public class ItemCrucible extends ItemSwordAbility implements IEquipReceiver { @Override public void onEquip(EntityPlayer player, ItemStack stack) { - + if(!(player instanceof EntityPlayerMP)) return; - + if(player.getHeldItem() != null && player.getHeldItem().getItemDamage() < player.getHeldItem().getMaxDamage()) { - + World world = player.worldObj; world.playSoundEffect(player.posX, player.posY, player.posZ, "hbm:weapon.cDeploy", 1.0F, 1.0F); - + NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("type", "anim"); nbt.setString("mode", "crucible"); - PacketDispatcher.wrapper.sendTo(new AuxParticlePacketNT(nbt, 0, 0, 0), (EntityPlayerMP)player); + PacketThreading.createSendToThreadedPacket(new AuxParticlePacketNT(nbt, 0, 0, 0), (EntityPlayerMP)player); } } @Override public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack) { - + if(!(entityLiving instanceof EntityPlayerMP)) return false; - + if(entityLiving instanceof EntityPlayer && ((EntityPlayer)entityLiving).getUniqueID().toString().equals(ShadyUtil.Tankish)) { stack.setItemDamage(0); } - + if(stack.getItemDamage() >= stack.getMaxDamage()) return false; - + NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("type", "anim"); nbt.setString("mode", "cSwing"); - PacketDispatcher.wrapper.sendTo(new AuxParticlePacketNT(nbt, 0, 0, 0), (EntityPlayerMP)entityLiving); - + PacketThreading.createSendToThreadedPacket(new AuxParticlePacketNT(nbt, 0, 0, 0), (EntityPlayerMP)entityLiving); + return false; } @Override public boolean hitEntity(ItemStack stack, EntityLivingBase victim, EntityLivingBase attacker) { - + boolean active = stack.getItemDamage() < stack.getMaxDamage(); - + if(active) { - + attacker.worldObj.playSoundEffect(victim.posX, victim.posY, victim.posZ, "mob.zombie.woodbreak", 1.0F, 0.75F + victim.getRNG().nextFloat() * 0.2F); - + if(!attacker.worldObj.isRemote && !victim.isEntityAlive()) { int count = Math.min((int)Math.ceil(victim.getMaxHealth() / 3D), 250); - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaburst"); data.setInteger("count", count * 4); data.setDouble("motion", 0.1D); data.setString("mode", "blockdust"); data.setInteger("block", Block.getIdFromBlock(Blocks.redstone_block)); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, victim.posX, victim.posY + victim.height * 0.5, victim.posZ), new TargetPoint(victim.dimension, victim.posX, victim.posY + victim.height * 0.5, victim.posZ, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, victim.posX, victim.posY + victim.height * 0.5, victim.posZ), new TargetPoint(victim.dimension, victim.posX, victim.posY + victim.height * 0.5, victim.posZ, 50)); } - + if(attacker instanceof EntityPlayer && (((EntityPlayer)attacker).getDisplayName().equals("Tankish") || ((EntityPlayer)attacker).getDisplayName().equals("Tankish020"))) return true; - + return super.hitEntity(stack, victim, attacker); } else { - + if(!attacker.worldObj.isRemote && attacker instanceof EntityPlayer) ((EntityPlayer)attacker).addChatComponentMessage(new ChatComponentText("Not enough energy.").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); return false; } } - + public Multimap getAttributeModifiers(ItemStack stack) { Multimap multimap = HashMultimap.create(); - + if(stack.getItemDamage() < stack.getMaxDamage()) { multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Tool modifier", (double) this.damage, 0)); multimap.put(SharedMonsterAttributes.movementSpeed.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Tool modifier", movement, 1)); } - + return multimap; } @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - + String charge = EnumChatFormatting.RED + "Charge ["; - + for(int i = 2; i >= 0; i--) if(stack.getItemDamage() <= i) charge += "||||||"; else charge += " "; - + charge += "]"; - + list.add(charge); } } diff --git a/src/main/java/com/hbm/items/weapon/ItemGunBase.java b/src/main/java/com/hbm/items/weapon/ItemGunBase.java index b599776f0..e2afe0031 100644 --- a/src/main/java/com/hbm/items/weapon/ItemGunBase.java +++ b/src/main/java/com/hbm/items/weapon/ItemGunBase.java @@ -2,6 +2,7 @@ package com.hbm.items.weapon; import java.util.List; +import com.hbm.handler.threading.PacketThreading; import org.lwjgl.input.Mouse; import com.hbm.config.GeneralConfig; @@ -53,7 +54,7 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu public GunConfiguration mainConfig; public GunConfiguration altConfig; - + @SideOnly(Side.CLIENT) public boolean m1;// = false; @SideOnly(Side.CLIENT) @@ -63,7 +64,7 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu mainConfig = config; this.setMaxStackSize(1); } - + public ItemGunBase(GunConfiguration config, GunConfiguration alt) { this(config); altConfig = alt; @@ -71,11 +72,11 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu @Override public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isCurrentItem) { - + if(entity instanceof EntityPlayer) { - + isCurrentItem = ((EntityPlayer)entity).getHeldItem() == stack; - + if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT && world.isRemote) { updateClient(stack, world, (EntityPlayer)entity, slot, isCurrentItem); } else { @@ -86,15 +87,15 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu @SideOnly(Side.CLIENT) protected void updateClient(ItemStack stack, World world, EntityPlayer entity, int slot, boolean isCurrentItem) { - + if(!world.isRemote) return; - + boolean clickLeft = Mouse.isButtonDown(0); boolean clickRight = Mouse.isButtonDown(1); boolean left = m1; boolean right = m2; - + if(isCurrentItem) { if(left && right) { PacketDispatcher.wrapper.sendToServer(new GunButtonPacket(false, (byte) 0)); @@ -102,21 +103,21 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu m1 = false; m2 = false; } - + if(left && !clickLeft) { PacketDispatcher.wrapper.sendToServer(new GunButtonPacket(false, (byte) 0)); m1 = false; endActionClient(stack, world, entity, true); } - + if(right && !clickRight) { PacketDispatcher.wrapper.sendToServer(new GunButtonPacket(false, (byte) 1)); m2 = false; endActionClient(stack, world, entity, false); } - + if(mainConfig.reloadType != GunConfiguration.RELOAD_NONE || (altConfig != null && altConfig.reloadType != 0)) { - + if(GameSettings.isKeyDown(HbmKeybinds.reloadKey) && Minecraft.getMinecraft().currentScreen == null && (getMag(stack) < mainConfig.ammoCap || hasInfinity(stack, mainConfig))) { PacketDispatcher.wrapper.sendToServer(new GunButtonPacket(true, (byte) 2)); setIsReloading(stack, true); @@ -125,9 +126,9 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu } } } - + protected void updateServer(ItemStack stack, World world, EntityPlayer player, int slot, boolean isCurrentItem) { - + if(getDelay(stack) > 0 && isCurrentItem) setDelay(stack, getDelay(stack) - 1); @@ -137,7 +138,7 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu int burstDuration = getBurstDuration(stack); if(burstDuration > 0) { - + if(altConfig == null) { if (burstDuration % mainConfig.firingDuration == 0 && tryShoot(stack, world, player, true)) { fire(stack, world, player); @@ -155,96 +156,96 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu if(getIsAltDown(stack) && !isCurrentItem) { setIsAltDown(stack, false); } - + if(GeneralConfig.enableGuns && mainConfig.firingMode == 1 && getIsMouseDown(stack) && tryShoot(stack, world, player, isCurrentItem)) { fire(stack, world, player); setDelay(stack, mainConfig.rateOfFire); } - + if(getIsReloading(stack) && isCurrentItem) { reload2(stack, world, player); } - + BulletConfiguration queued = getCasing(stack); int timer = getCasingTimer(stack); - + if(queued != null && timer > 0) { - + timer--; - + if(timer <= 0) { trySpawnCasing(player, mainConfig.ejector, queued, stack); } - + setCasingTimer(stack, timer); } } - + //whether or not the gun can shoot in its current state protected boolean tryShoot(ItemStack stack, World world, EntityPlayer player, boolean main) { - + //cancel reload when trying to shoot if it's a single reload weapon and at least one round is loaded if(getIsReloading(stack) && mainConfig.reloadType == GunConfiguration.RELOAD_SINGLE && getMag(stack) > 0) { setReloadCycle(stack, 0); setIsReloading(stack, false); } - + if(main && getDelay(stack) == 0 && !getIsReloading(stack) && getItemWear(stack) < mainConfig.durability) { return hasAmmo(stack, player, main); } - + if(!main && altConfig != null && getDelay(stack) == 0 && !getIsReloading(stack) && getItemWear(stack) < mainConfig.durability) { - + return hasAmmo(stack, player, false); } - + return false; } - + public boolean hasAmmo(ItemStack stack, EntityPlayer player, boolean main) { - + GunConfiguration config = mainConfig; - + if(!main) config = altConfig; - + if(config.reloadType == GunConfiguration.RELOAD_NONE) { return getBeltSize(player, getBeltType(player, stack, main)) > 0; - + } else { //return getMag(stack) >= 0 + config.roundsPerCycle; return getMag(stack) > 0; } } - + //called every time the gun shoots successfully, calls spawnProjectile(), sets item wear protected void fire(ItemStack stack, World world, EntityPlayer player) { BulletConfiguration config = null; - + if(mainConfig.reloadType == GunConfiguration.RELOAD_NONE) { config = getBeltCfg(player, stack, true); } else { config = BulletConfigSyncingUtil.pullConfig(mainConfig.config.get(getMagType(stack))); } - + int bullets = config.bulletsMin; - + for(int k = 0; k < mainConfig.roundsPerCycle; k++) { - + if(!hasAmmo(stack, player, true)) break; - + if(config.bulletsMax > config.bulletsMin) bullets += world.rand.nextInt(config.bulletsMax - config.bulletsMin); - + for(int i = 0; i < bullets; i++) { spawnProjectile(world, player, stack, BulletConfigSyncingUtil.getKey(config)); } - + useUpAmmo(player, stack, true); player.inventoryContainer.detectAndSendChanges(); - + int wear = (int) Math.ceil(config.wear / (1F + EnchantmentHelper.getEnchantmentLevel(Enchantment.unbreaking.effectId, stack))); setItemWear(stack, getItemWear(stack) + wear); } @@ -253,58 +254,58 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu AnimType animType = getMag(stack) == 0 ? AnimType.CYCLE_EMPTY : AnimType.CYCLE; PacketDispatcher.wrapper.sendTo(new GunAnimationPacket(animType.ordinal()), (EntityPlayerMP) player); } - + String firingSound = mainConfig.firingSound; if (getMag(stack) == 0 && mainConfig.firingSoundEmpty != null) firingSound = mainConfig.firingSoundEmpty; world.playSoundAtEntity(player, firingSound, mainConfig.firingVolume, mainConfig.firingPitch); - + if(mainConfig.ejector != null && !mainConfig.ejector.getAfterReload()) queueCasing(player, mainConfig.ejector, config, stack); } - + //unlike fire(), being called does not automatically imply success, some things may still have to be handled before spawning the projectile protected void altFire(ItemStack stack, World world, EntityPlayer player) { - + if(altConfig == null) return; BulletConfiguration config = altConfig.reloadType == GunConfiguration.RELOAD_NONE ? getBeltCfg(player, stack, false) : BulletConfigSyncingUtil.pullConfig(altConfig.config.get(getMagType(stack))); - + int bullets = config.bulletsMin; - + for(int k = 0; k < altConfig.roundsPerCycle; k++) { - + if(altConfig.reloadType != GunConfiguration.RELOAD_NONE && !hasAmmo(stack, player, true)) break; - + if(config.bulletsMax > config.bulletsMin) bullets += world.rand.nextInt(config.bulletsMax - config.bulletsMin); - + for(int i = 0; i < bullets; i++) { spawnProjectile(world, player, stack, BulletConfigSyncingUtil.getKey(config)); } if(player instanceof EntityPlayerMP) PacketDispatcher.wrapper.sendTo(new GunAnimationPacket(AnimType.ALT_CYCLE.ordinal()), (EntityPlayerMP) player); - + useUpAmmo(player, stack, false); player.inventoryContainer.detectAndSendChanges(); - + setItemWear(stack, getItemWear(stack) + config.wear); } - + world.playSoundAtEntity(player, altConfig.firingSound, mainConfig.firingVolume, altConfig.firingPitch); - + if(altConfig.ejector != null) queueCasing(player, altConfig.ejector, config, stack); } - + //spawns the actual projectile, can be overridden to change projectile entity protected void spawnProjectile(World world, EntityPlayer player, ItemStack stack, int config) { EntityBulletBaseNT bullet = new EntityBulletBaseNT(world, config, player); world.spawnEntityInWorld(bullet); } - + //called on click (server side, called by mouse packet) for semi-automatics and specific events public void startAction(ItemStack stack, World world, EntityPlayer player, boolean main) { @@ -320,7 +321,7 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu setDelay(stack, mainConfig.rateOfFire); } } - + if(!main && altConfig != null && tryShoot(stack, world, player, main)) { if(altConfig.firingMode == GunConfiguration.FIRE_BURST && getBurstDuration(stack) <= 0){ @@ -331,38 +332,38 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu } } } - + //called on click (client side, called by mouse click event) public void startActionClient(ItemStack stack, World world, EntityPlayer player, boolean main) { } - + //called on click release (server side, called by mouse packet) for release actions like charged shots public void endAction(ItemStack stack, World world, EntityPlayer player, boolean main) { } - + //called on click release (client side, called by update cycle) public void endActionClient(ItemStack stack, World world, EntityPlayer player, boolean main) { } - + //current reload protected void reload2(ItemStack stack, World world, EntityPlayer player) { - + if(getMag(stack) >= mainConfig.ammoCap) { setIsReloading(stack, false); return; } - + if(getReloadCycle(stack) <= 0) { - + BulletConfiguration prevCfg = BulletConfigSyncingUtil.pullConfig(mainConfig.config.get(getMagType(stack))); - + BulletConfiguration cfg = BulletConfigSyncingUtil.pullConfig(mainConfig.config.get(getMagType(stack))); ComparableStack ammo = (ComparableStack) cfg.ammo.copy(); - + final int countNeeded = (mainConfig.reloadType == GunConfiguration.RELOAD_FULL) ? mainConfig.ammoCap - getMag(stack) : 1; final int availableStacks = InventoryUtil.countAStackMatches(player, ammo, true); final int availableFills = availableStacks * cfg.ammoCount; final boolean hasLoaded = availableFills > 0; final int toAdd = Math.min(availableFills * cfg.ammoCount, countNeeded); final int toConsume = (int) Math.ceil((double) toAdd / cfg.ammoCount); - + // Skip logic if cannot reload if(availableFills == 0) { setIsReloading(stack, false); @@ -370,7 +371,7 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu } String reloadSound = mainConfig.reloadSoundEmpty != null && getMag(stack) == 0 ? mainConfig.reloadSoundEmpty : mainConfig.reloadSound; - + ammo.stacksize = toConsume; setMag(stack, getMag(stack) + toAdd); if (getMag(stack) >= mainConfig.ammoCap) { @@ -383,103 +384,103 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu if (availableFills > 1 && !mainConfig.reloadSoundEnd) world.playSoundAtEntity(player, reloadSound, 1.0F, 1.0F); } - + if(hasLoaded && mainConfig.reloadSoundEnd) world.playSoundAtEntity(player, reloadSound, 1.0F, 1.0F); - + if(mainConfig.ejector != null && mainConfig.ejector.getAfterReload()) queueCasing(player, mainConfig.ejector, prevCfg, stack); - + InventoryUtil.tryConsumeAStack(player.inventory.mainInventory, 0, player.inventory.mainInventory.length - 1, ammo); } else { setReloadCycle(stack, getReloadCycle(stack) - 1); } - + if(stack != player.getHeldItem()) { setReloadCycle(stack, 0); setIsReloading(stack, false); } } - + //initiates a reload public void startReloadAction(ItemStack stack, World world, EntityPlayer player) { - + if(getMag(stack) == 0) resetAmmoType(stack, world, player); - + if(player.isSneaking() && hasInfinity(stack, mainConfig)) { - + if(getMag(stack) == mainConfig.ammoCap) { setMag(stack, 0); this.resetAmmoType(stack, world, player); world.playSoundAtEntity(player, "tile.piston.out", 1.0F, 1.0F); } - + return; } - + if(getMag(stack) == mainConfig.ammoCap) return; if(getIsReloading(stack)) return; - + if(!mainConfig.reloadSoundEnd) { String reloadSound = mainConfig.reloadSoundEmpty != null && getMag(stack) == 0 ? mainConfig.reloadSoundEmpty : mainConfig.reloadSound; world.playSoundAtEntity(player, reloadSound, 1.0F, 1.0F); } - + if(!world.isRemote) { AnimType reloadType = getMag(stack) == 0 ? AnimType.RELOAD_EMPTY : AnimType.RELOAD; PacketDispatcher.wrapper.sendTo(new GunAnimationPacket(reloadType.ordinal()), (EntityPlayerMP) player); } - + setIsReloading(stack, true); resetReloadCycle(player, stack); } - + public boolean canReload(ItemStack stack, World world, EntityPlayer player) { - + if(getMag(stack) == mainConfig.ammoCap && hasInfinity(stack, mainConfig)) return true; if(getMag(stack) == 0) { - + for(int config : mainConfig.config) { if(InventoryUtil.doesPlayerHaveAStack(player, BulletConfigSyncingUtil.pullConfig(config).ammo, false, false)) { return true; } } - + } else { ComparableStack ammo = BulletConfigSyncingUtil.pullConfig(mainConfig.config.get(getMagType(stack))).ammo; return InventoryUtil.doesPlayerHaveAStack(player, ammo, false, false); } - + return false; } - + //searches the player's inv for next fitting ammo type and changes the gun's mag protected void resetAmmoType(ItemStack stack, World world, EntityPlayer player) { for(int config : mainConfig.config) { BulletConfiguration cfg = BulletConfigSyncingUtil.pullConfig(config); - + if(InventoryUtil.doesPlayerHaveAStack(player, cfg.ammo, false, false)) { setMagType(stack, mainConfig.config.indexOf(config)); break; } } } - + //item mouseover text @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { - + ComparableStack ammo = BulletConfigSyncingUtil.pullConfig(mainConfig.config.get(getMagType(stack))).ammo; - + list.add(I18nUtil.resolveKey(HbmCollection.ammo, mainConfig.ammoCap > 0 ? I18nUtil.resolveKey(HbmCollection.ammoMag, getMag(stack), mainConfig.ammoCap) : I18nUtil.resolveKey(HbmCollection.ammoBelt))); - + try { list.add(I18nUtil.resolveKey(HbmCollection.ammoType, ammo.toStack().getDisplayName())); @@ -498,22 +499,22 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu addAdditionalInformation(stack, list); } - + protected void addAdditionalInformation(ItemStack stack, List list) { final BulletConfiguration bulletConfig = BulletConfigSyncingUtil.pullConfig(mainConfig.config.get(getMagType(stack))); list.add(I18nUtil.resolveKey(HbmCollection.gunDamage, bulletConfig.dmgMin, bulletConfig.dmgMax)); if(bulletConfig.bulletsMax != 1) list.add(I18nUtil.resolveKey(HbmCollection.gunPellets, bulletConfig.bulletsMin, bulletConfig.bulletsMax)); int dura = Math.max(mainConfig.durability - getItemWear(stack), 0); - + list.add(I18nUtil.resolveKey(HbmCollection.durability, dura + " / " + mainConfig.durability)); - + list.add(""); String unloc = "gun.name." + mainConfig.name; String loc = I18nUtil.resolveKey(unloc); list.add(I18nUtil.resolveKey(HbmCollection.gunName, unloc.equals(loc) ? mainConfig.name : loc)); list.add(I18nUtil.resolveKey(HbmCollection.gunMaker, I18nUtil.resolveKey(mainConfig.manufacturer.getKey()))); - + if(!mainConfig.comment.isEmpty()) { list.add(""); for(String s : mainConfig.comment) @@ -527,67 +528,67 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu list.add("RoF Cooldown: " + getDelay(stack)); } } - + //returns ammo item of belt-weapons public static ComparableStack getBeltType(EntityPlayer player, ItemStack stack, boolean main) { ItemGunBase gun = (ItemGunBase)stack.getItem(); GunConfiguration guncfg = main ? gun.mainConfig : (gun.altConfig != null ? gun.altConfig : gun.mainConfig); for(Integer config : guncfg.config) { - + BulletConfiguration cfg = BulletConfigSyncingUtil.pullConfig(config); - + if(InventoryUtil.doesPlayerHaveAStack(player, cfg.ammo, false, true)) { return cfg.ammo; } } - + return BulletConfigSyncingUtil.pullConfig(guncfg.config.get(0)).ammo; } - + //returns BCFG of belt-weapons public static BulletConfiguration getBeltCfg(EntityPlayer player, ItemStack stack, boolean main) { ItemGunBase gun = (ItemGunBase)stack.getItem(); GunConfiguration guncfg = main ? gun.mainConfig : (gun.altConfig != null ? gun.altConfig : gun.mainConfig); getBeltType(player, stack, main); - + for(int config : guncfg.config) { - + BulletConfiguration cfg = BulletConfigSyncingUtil.pullConfig(config); - + if(InventoryUtil.doesPlayerHaveAStack(player, cfg.ammo, false, false)) { return cfg; } } - + return BulletConfigSyncingUtil.pullConfig(guncfg.config.get(0)); } //returns ammo capacity of belt-weapons for current ammo public static int getBeltSize(EntityPlayer player, ComparableStack ammo) { - + int amount = 0; - + for(ItemStack stack : player.inventory.mainInventory) { if(stack != null && ammo.matchesRecipe(stack, true)) { amount += stack.stackSize; } } - + return amount; } - + //reduces ammo count for mag and belt-based weapons, should be called AFTER firing public void useUpAmmo(EntityPlayer player, ItemStack stack, boolean main) { - + if(!main && altConfig == null) return; - + GunConfiguration config = mainConfig; - + if(!main) config = altConfig; - + if(hasInfinity(stack, config)) return; if(isTrenchMaster(player) && player.getRNG().nextInt(3) == 0) return; if(hasAoS(player) && player.getRNG().nextInt(3) == 0) return; @@ -598,93 +599,93 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu InventoryUtil.doesPlayerHaveAStack(player, getBeltType(player, stack, main), true, false); } } - + public boolean hasInfinity(ItemStack stack, GunConfiguration config) { return config.allowsInfinity && EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, stack) > 0; } - + /// sets reload cycle to config defult /// public static void resetReloadCycle(EntityPlayer player, ItemStack stack) { writeNBT(stack, "reload", getReloadDuration(player, stack)); } - + /// if reloading routine is active /// public static void setIsReloading(ItemStack stack, boolean b) { writeNBT(stack, "isReloading", b ? 1 : 0); } - + public static boolean getIsReloading(ItemStack stack) { return readNBT(stack, "isReloading") == 1; } - + /// if left mouse button is down /// public static void setIsMouseDown(ItemStack stack, boolean b) { writeNBT(stack, "isMouseDown", b ? 1 : 0); } - + public static boolean getIsMouseDown(ItemStack stack) { return readNBT(stack, "isMouseDown") == 1; } - + /// if alt mouse button is down /// public static void setIsAltDown(ItemStack stack, boolean b) { writeNBT(stack, "isAltDown", b ? 1 : 0); } - + public static boolean getIsAltDown(ItemStack stack) { return readNBT(stack, "isAltDown") == 1; } - + /// RoF cooldown /// public static void setDelay(ItemStack stack, int i) { writeNBT(stack, "dlay", i); } - + public static int getDelay(ItemStack stack) { return readNBT(stack, "dlay"); } - + /// Gun wear /// public static void setItemWear(ItemStack stack, int i) { writeNBT(stack, "wear", i); } - + public static int getItemWear(ItemStack stack) { return readNBT(stack, "wear"); } - + /// R/W cycle animation timer /// public static void setCycleAnim(ItemStack stack, int i) { writeNBT(stack, "cycle", i); } - + public static int getCycleAnim(ItemStack stack) { return readNBT(stack, "cycle"); } - + /// R/W reload animation timer /// public static void setReloadCycle(ItemStack stack, int i) { writeNBT(stack, "reload", i); } - + public static int getReloadCycle(ItemStack stack) { return readNBT(stack, "reload"); } - + /// magazine capacity /// public static void setMag(ItemStack stack, int i) { writeNBT(stack, "magazine", i); } - + public static int getMag(ItemStack stack) { return readNBT(stack, "magazine"); } - + /// magazine type (int specified by index in bullet config list) /// public static void setMagType(ItemStack stack, int i) { writeNBT(stack, "magazineType", i); } - + public static int getMagType(ItemStack stack) { return readNBT(stack, "magazineType"); } @@ -696,39 +697,39 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu public static int getBurstDuration(ItemStack stack) { return readNBT(stack, "bduration"); } - + /// queued casing for ejection /// public static void setCasing(ItemStack stack, BulletConfiguration bullet) { writeNBT(stack, "casing", BulletConfigSyncingUtil.getKey(bullet)); } - + public static BulletConfiguration getCasing(ItemStack stack) { return BulletConfigSyncingUtil.pullConfig(readNBT(stack, "casing")); } - + /// timer for ejecting casing /// public static void setCasingTimer(ItemStack stack, int i) { writeNBT(stack, "casingTimer", i); } - + public static int getCasingTimer(ItemStack stack) { return readNBT(stack, "casingTimer"); } - + /// NBT utility /// public static void writeNBT(ItemStack stack, String key, int value) { - + if(!stack.hasTagCompound()) stack.stackTagCompound = new NBTTagCompound(); - + stack.stackTagCompound.setInteger(key, value); } - + public static int readNBT(ItemStack stack, String key) { - + if(!stack.hasTagCompound()) return 0; - + return stack.stackTagCompound.getInteger(key); } @@ -740,56 +741,56 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu @Override @SideOnly(Side.CLIENT) public void renderHUD(Pre event, ElementType type, EntityPlayer player, ItemStack stack) { - + ItemGunBase gun = ((ItemGunBase)stack.getItem()); GunConfiguration gcfg = gun.mainConfig; - + if(type == ElementType.HOTBAR) { int mag = ItemGunBase.getMagType(stack); if(gun.mainConfig.config.size() == 0) return; BulletConfiguration bcfg = BulletConfigSyncingUtil.pullConfig(gun.mainConfig.config.get(mag < gun.mainConfig.config.size() ? mag : 0)); - + if(bcfg == null) { return; } - + ComparableStack ammo = bcfg.ammo; int count = ItemGunBase.getMag(stack); int max = gcfg.ammoCap; boolean showammo = gcfg.showAmmo; - + if(gcfg.reloadType == GunConfiguration.RELOAD_NONE) { ammo = ItemGunBase.getBeltType(player, stack, true); count = ItemGunBase.getBeltSize(player, ammo); max = -1; } - + int dura = ItemGunBase.getItemWear(stack) * 50 / gcfg.durability; - + RenderScreenOverlay.renderAmmo(event.resolution, Minecraft.getMinecraft().ingameGUI, ammo.toStack(), count, max, dura, showammo); - + if(gun.altConfig != null && gun.altConfig.reloadType == GunConfiguration.RELOAD_NONE) { ComparableStack oldAmmo = ammo; ammo = ItemGunBase.getBeltType(player, stack, false); - + if(!ammo.isApplicable(oldAmmo)) { count = ItemGunBase.getBeltSize(player, ammo); RenderScreenOverlay.renderAmmoAlt(event.resolution, Minecraft.getMinecraft().ingameGUI, ammo.toStack(), count); } } } - + if(type == ElementType.CROSSHAIRS && GeneralConfig.enableCrosshairs) { event.setCanceled(true); - + if(!(gcfg.hasSights && player.isSneaking())) RenderScreenOverlay.renderCustomCrosshairs(event.resolution, Minecraft.getMinecraft().ingameGUI, ((IHoldableWeapon)player.getHeldItem().getItem()).getCrosshair()); else RenderScreenOverlay.renderCustomCrosshairs(event.resolution, Minecraft.getMinecraft().ingameGUI, Crosshair.NONE); } } - + @SideOnly(Side.CLIENT) public BusAnimation getAnimation(ItemStack stack, AnimType type) { GunConfiguration config = ((ItemGunBase) stack.getItem()).mainConfig; @@ -799,20 +800,20 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu } return config.animations.get(type); } - + @Override public void onEquip(EntityPlayer player, ItemStack stack) { if(!mainConfig.equipSound.isEmpty() && !player.worldObj.isRemote) { player.worldObj.playSoundAtEntity(player, mainConfig.equipSound, 1, 1); } - + if(player instanceof EntityPlayerMP) PacketDispatcher.wrapper.sendTo(new GunAnimationPacket(AnimType.EQUIP.ordinal()), (EntityPlayerMP) player); } - + protected static void queueCasing(Entity entity, CasingEjector ejector, BulletConfiguration bullet, ItemStack stack) { - + if(ejector == null || bullet == null || bullet.spentCasing == null) return; - + if(ejector.getDelay() <= 0) { trySpawnCasing(entity, ejector, bullet, stack); } else { @@ -820,13 +821,13 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu setCasingTimer(stack, ejector.getDelay()); } } - + protected static void trySpawnCasing(Entity entity, CasingEjector ejector, BulletConfiguration bullet, ItemStack stack) { - + if(ejector == null) return; //abort if the gun can't eject bullets at all if(bullet == null) return; //abort if there's no valid bullet cfg if(bullet.spentCasing == null) return; //abort if the bullet is caseless - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "casing"); data.setFloat("pitch", (float) Math.toRadians(entity.rotationPitch)); @@ -834,9 +835,9 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu data.setBoolean("crouched", entity.isSneaking()); data.setString("name", bullet.spentCasing.getName()); data.setInteger("ej", ejector.getId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ), new TargetPoint(entity.dimension, entity.posX, entity.posY, entity.posZ, 50)); } - + public static int getReloadDuration(EntityPlayer player, ItemStack stack) { GunConfiguration config = ((ItemGunBase) stack.getItem()).mainConfig; int cycle = config.reloadDuration; @@ -844,11 +845,11 @@ public class ItemGunBase extends Item implements IHoldableWeapon, IItemHUD, IEqu if(isTrenchMaster(player)) return Math.max(1, cycle / 2); return cycle; } - + public static boolean isTrenchMaster(EntityPlayer player) { return player.inventory.armorInventory[2] != null && player.inventory.armorInventory[2].getItem() == ModItems.trenchmaster_plate && ArmorFSB.hasFSBArmor(player); } - + public static boolean hasAoS(EntityPlayer player) { if(player.inventory.armorInventory[3] != null) { ItemStack[] mods = ArmorModHandler.pryMods(player.inventory.armorInventory[3]); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/ConfettiUtil.java b/src/main/java/com/hbm/items/weapon/sedna/factory/ConfettiUtil.java index 7bf6381df..8509bcac7 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/ConfettiUtil.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/ConfettiUtil.java @@ -2,7 +2,7 @@ package com.hbm.items.weapon.sedna.factory; import java.util.Locale; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.helper.AshesCreator; import com.hbm.particle.helper.SkeletonCreator; @@ -15,7 +15,7 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; public class ConfettiUtil { - + public static void decideConfetti(EntityLivingBase entity, DamageSource source) { if(entity.isEntityAlive()) return; if(source.damageType.equals(DamageClass.LASER.name().toLowerCase(Locale.US))) pulverize(entity); @@ -42,7 +42,7 @@ public class ConfettiUtil { NBTTagCompound vdat = new NBTTagCompound(); vdat.setString("type", "giblets"); vdat.setInteger("ent", entity.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(vdat, entity.posX, entity.posY + entity.height * 0.5, entity.posZ), new TargetPoint(entity.dimension, entity.posX, entity.posY + entity.height * 0.5, entity.posZ, 150)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(vdat, entity.posX, entity.posY + entity.height * 0.5, entity.posZ), new TargetPoint(entity.dimension, entity.posX, entity.posY + entity.height * 0.5, entity.posZ, 150)); entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + entity.getRNG().nextFloat() * 0.2F); } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java index 1f1ba45d3..941e7a4b5 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java @@ -3,6 +3,7 @@ package com.hbm.items.weapon.sedna.factory; import java.util.function.BiConsumer; import com.hbm.config.ClientConfig; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.items.weapon.sedna.Receiver; import com.hbm.items.weapon.sedna.impl.ItemGunStinger; @@ -10,7 +11,6 @@ import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; import com.hbm.items.weapon.sedna.mags.IMagazine; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.SpentCasing; import com.hbm.particle.helper.CasingCreator; @@ -30,13 +30,13 @@ import net.minecraft.util.MovingObjectPosition; * The orchestra only knows what animation is or was playing and how long it started, but not if it is still active. * Orchestras are useful for things like playing server-side sound, spawning casings or sending particle packets.*/ public class Orchestras { - + public static BiConsumer DEBUG_ORCHESTRA = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); - + if(type == AnimType.RELOAD) { if(timer == 3) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverCock", 1F, 1F); if(timer == 10) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallRemove", 1F, 1F); @@ -62,7 +62,7 @@ public class Orchestras { if(timer == 16) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_PEPPERBOX = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -88,7 +88,7 @@ public class Orchestras { if(timer == 45) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 0.6F); } }; - + public static BiConsumer ORCHESTRA_ATLAS = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -116,7 +116,7 @@ public class Orchestras { if(timer == 34) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_DANI = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -144,7 +144,7 @@ public class Orchestras { if(timer == 34) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_HENRY = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -181,7 +181,7 @@ public class Orchestras { if(timer == 12) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.leverCock", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_GREASEGUN = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -201,7 +201,7 @@ public class Orchestras { if(type == AnimType.CYCLE_DRY) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 0.8F); if(timer == 11) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.pistolCock", 1F, 0.8F); - + } if(type == AnimType.RELOAD) { if(timer == 2) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magRemove", 1F, 1F); @@ -217,7 +217,7 @@ public class Orchestras { if(timer == 26) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.pistolCock", 1F, 0.8F); } }; - + public static BiConsumer ORCHESTRA_MARESLEG = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -252,7 +252,7 @@ public class Orchestras { if(timer == 8) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.leverCock", 1F, 0.8F); } }; - + public static BiConsumer ORCHESTRA_MARESLEG_SHORT = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -287,14 +287,14 @@ public class Orchestras { if(timer == 8) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.leverCock", 1F, 0.8F); } }; - + public static BiConsumer ORCHESTRA_MARESLEG_AKIMBO = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); boolean aiming = ItemGunBaseNT.getIsAiming(stack); - + if(type == AnimType.CYCLE) { if(timer == 14) { int offset = ctx.configIndex == 0 ? -1 : 1; @@ -304,10 +304,10 @@ public class Orchestras { if(timer == 8) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.leverCock", 1F, 0.8F); return; } - + ORCHESTRA_MARESLEG_SHORT.accept(stack, ctx); }; - + public static BiConsumer ORCHESTRA_FLAREGUN = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -346,13 +346,13 @@ public class Orchestras { if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); - + if(type == AnimType.RELOAD) { if(timer == 3) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverCock", 1F, 1F); if(timer == 10) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallRemove", 1F, 1F); if(timer == 34) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallInsert", 1F, 1F); if(timer == 40) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1F); - + if(timer == 16) { Receiver rec = ctx.config.getReceivers(stack)[0]; IMagazine mag = rec.getMagazine(stack); @@ -379,7 +379,7 @@ public class Orchestras { AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); boolean aiming = ItemGunBaseNT.getIsAiming(stack); - + if(type == AnimType.CYCLE) { if(timer == 2) { SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory); @@ -413,7 +413,7 @@ public class Orchestras { AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); boolean aiming = ItemGunBaseNT.getIsAiming(stack); - + if(ClientConfig.GUN_ANIMS_LEGACY.get()) { if(type == AnimType.CYCLE) { if(timer == 0) { @@ -465,7 +465,7 @@ public class Orchestras { } } }; - + public static BiConsumer ORCHESTRA_LIBERATOR = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -508,14 +508,14 @@ public class Orchestras { if(timer == 20) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 0.9F); } }; - + public static BiConsumer ORCHESTRA_CONGOLAKE = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); boolean aiming = ItemGunBaseNT.getIsAiming(stack); - + if(type == AnimType.CYCLE) { if(timer == 15) { IMagazine mag = ctx.config.getReceivers(stack)[0].getMagazine(stack); @@ -531,15 +531,15 @@ public class Orchestras { if(timer == 27) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.glClose", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_FLAMER = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); - + if(type == AnimType.CYCLE && entity.worldObj.isRemote) { AudioWrapper runningAudio = ItemGunBaseNT.loopedSounds.get(entity); - + if(timer < 5) { //start sound if(runningAudio == null || !runningAudio.isPlaying()) { @@ -563,7 +563,7 @@ public class Orchestras { if(runningAudio != null && runningAudio.isPlaying()) runningAudio.stopSound(); } if(entity.worldObj.isRemote) return; - + if(type == AnimType.RELOAD) { if(timer == 15) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.openLatch", 1F, 1F); if(timer == 35) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.impact", 0.5F, 1F); @@ -572,13 +572,13 @@ public class Orchestras { if(timer == 85) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.pressureValve", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_FLAMER_DAYBREAKER = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); - + if(type == AnimType.RELOAD) { if(timer == 15) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.openLatch", 1F, 1F); if(timer == 35) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.impact", 0.5F, 1F); @@ -587,14 +587,14 @@ public class Orchestras { if(timer == 85) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.pressureValve", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_LAG = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); boolean aiming = ItemGunBaseNT.getIsAiming(stack); - + if(type == AnimType.CYCLE) { if(timer == 1) { SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory); @@ -604,7 +604,7 @@ public class Orchestras { if(type == AnimType.CYCLE_DRY) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 1F); if(timer == 8) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverCock", 1F, 1F); - + } if(type == AnimType.RELOAD) { if(timer == 8) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magRemove", 1F, 1F); @@ -617,7 +617,7 @@ public class Orchestras { if(timer == 36) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magInsert", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_UZI = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -637,7 +637,7 @@ public class Orchestras { if(type == AnimType.CYCLE_DRY) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 1F); if(timer == 8) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.pistolCock", 1F, 1F); - + } if(type == AnimType.RELOAD) { if(timer == 4) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magRemove", 1F, 1F); @@ -649,7 +649,7 @@ public class Orchestras { if(timer == 31) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.pistolCock", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_UZI_AKIMBO = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -669,7 +669,7 @@ public class Orchestras { if(type == AnimType.CYCLE_DRY) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 1F); if(timer == 8) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.pistolCock", 1F, 1F); - + } if(type == AnimType.RELOAD) { if(timer == 4) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magRemove", 1F, 1F); @@ -681,14 +681,14 @@ public class Orchestras { if(timer == 31) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.pistolCock", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_SPAS = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); boolean aiming = ItemGunBaseNT.getIsAiming(stack); - + if(type == AnimType.CYCLE || type == AnimType.ALT_CYCLE) { if(timer == 8) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.shotgunCock", 1F, 1F); if(timer == 10) { @@ -721,25 +721,25 @@ public class Orchestras { if(timer == 29) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.shotgunCockClose", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_PANERSCHRECK = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); - + if(type == AnimType.RELOAD) { if(timer == 30) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.insertCanister", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_G3 = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); boolean aiming = ItemGunBaseNT.getIsAiming(stack); - + if(type == AnimType.CYCLE) { if(timer == 0) { SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory); @@ -749,7 +749,7 @@ public class Orchestras { if(type == AnimType.CYCLE_DRY) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 0.8F); if(timer == 5) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.pistolCock", 1F, 0.9F); - + } if(type == AnimType.RELOAD) { if(timer == 2) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magRemove", 1F, 1F); @@ -768,7 +768,7 @@ public class Orchestras { if(timer == 28) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_STINGER = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -792,20 +792,20 @@ public class Orchestras { //stop sound due to timeout if(runningAudio != null && runningAudio.isPlaying()) runningAudio.stopSound(); } - + if(type == AnimType.RELOAD) { if(timer == 30) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.insertCanister", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_CHEMTHROWER = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); - + if(type == AnimType.CYCLE && entity.worldObj.isRemote) { AudioWrapper runningAudio = ItemGunBaseNT.loopedSounds.get(entity); - + if(timer < 5) { //start sound if(runningAudio == null || !runningAudio.isPlaying()) { @@ -829,7 +829,7 @@ public class Orchestras { if(runningAudio != null && runningAudio.isPlaying()) runningAudio.stopSound(); } }; - + public static BiConsumer ORCHESTRA_M2 = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -840,7 +840,7 @@ public class Orchestras { if(type == AnimType.EQUIP) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:turret.howard_reload", 1F, 1F); } - + if(type == AnimType.CYCLE) { if(timer == 0) { SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory); @@ -848,7 +848,7 @@ public class Orchestras { } } }; - + public static BiConsumer ORCHESTRA_SHREDDER = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -871,7 +871,7 @@ public class Orchestras { if(timer == 28) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magInsert", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_SHREDDER_SEXY = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -883,7 +883,7 @@ public class Orchestras { ItemGunBaseNT.setTimer(stack, 0, 20); } } - + if(type == AnimType.CYCLE_DRY) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 1F); } @@ -896,25 +896,25 @@ public class Orchestras { if(timer == 28) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magInsert", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_QUADRO = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); - + if(type == AnimType.RELOAD) { if(timer == 30) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.insertCanister", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_MINIGUN = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); boolean aiming = ItemGunBaseNT.getIsAiming(stack); - + if(type == AnimType.CYCLE) { if(timer == 0) { SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory); @@ -933,7 +933,7 @@ public class Orchestras { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverSpin", 1F, 0.75F); } }; - + public static BiConsumer ORCHESTRA_MISSILE_LAUNCHER = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -948,13 +948,13 @@ public class Orchestras { if(timer == 30) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.insertCanister", 1F, 1F); if(timer == 42) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.boltClose", 1F, 0.9F); } - + if(type == AnimType.JAMMED || type == AnimType.INSPECT) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.boltOpen", 1F, 0.9F); if(timer == 27) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.boltClose", 1F, 0.9F); } }; - + public static BiConsumer ORCHESTRA_TESLA = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -972,7 +972,7 @@ public class Orchestras { if(timer == 12) entity.worldObj.playSoundAtEntity(entity, "hbm:block.squeakyToy", 0.25F, 1F); } }; - + public static BiConsumer ORCHESTRA_STG77 = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -1002,7 +1002,7 @@ public class Orchestras { if(type == AnimType.INSPECT) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 0.9F); if(timer == 10) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallRemove", 1F, 1F); - + if(timer == 114) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallInsert", 1F, 1F); if(timer == 124) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1F); } @@ -1029,21 +1029,21 @@ public class Orchestras { if(type == AnimType.INSPECT) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 0.9F); if(timer == 11) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallRemove", 1F, 1F); - + if(timer == 72) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallInsert", 1F, 1F); if(timer == 84) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1F); } } }; - + public static BiConsumer ORCHESTRA_TAU = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); - + if(type == AnimType.SPINUP && entity.worldObj.isRemote) { AudioWrapper runningAudio = ItemGunBaseNT.loopedSounds.get(entity); - + if(timer < 300) { if(runningAudio == null || !runningAudio.isPlaying()) { AudioWrapper audio = MainRegistry.proxy.getLoopedSound("hbm:weapon.fire.tauLoop", (float) entity.posX, (float) entity.posY, (float) entity.posZ, 1F, 15F, 0.75F, 10); @@ -1066,15 +1066,15 @@ public class Orchestras { if(runningAudio != null && runningAudio.isPlaying()) runningAudio.stopSound(); } if(entity.worldObj.isRemote) return; - + if(type == AnimType.CYCLE) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.fire.tau", 0.5F, 0.9F + entity.getRNG().nextFloat() * 0.2F); } - + if(type == AnimType.ALT_CYCLE) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.fire.tau", 0.5F, 0.7F + entity.getRNG().nextFloat() * 0.2F); } - + if(type == AnimType.SPINUP) { if(timer % 10 == 0 && timer < 130) { IMagazine mag = ctx.config.getReceivers(stack)[0].getMagazine(stack); @@ -1084,14 +1084,14 @@ public class Orchestras { } mag.useUpAmmo(stack, ctx.inventory, 1); } - + if(timer > 200) { ItemGunBaseNT.playAnimation(ctx.getPlayer(), stack, AnimType.CYCLE_DRY, ctx.configIndex); - + entity.attackEntityFrom(ModDamageSource.tauBlast, 1_000F); - + ItemGunBaseNT.setWear(stack, ctx.configIndex, Math.min(ItemGunBaseNT.getWear(stack, ctx.configIndex) + 10_000F, ctx.config.getDurability(stack))); - + entity.worldObj.playSoundEffect(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ, "hbm:entity.ufoBlast", 5.0F, 0.9F); entity.worldObj.playSoundEffect(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ, "fireworks.blast", 5.0F, 0.5F); @@ -1105,24 +1105,24 @@ public class Orchestras { data.setFloat("pitch", -60F + 60F * i); data.setFloat("yaw", yaw); data.setFloat("scale", 2F); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ), + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ), new TargetPoint(entity.dimension, entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ, 100)); } } } }; - + public static BiConsumer ORCHESTRA_FATMAN = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); - + if(type == AnimType.RELOAD) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.fatmanFull", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_LASRIFLE = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -1132,38 +1132,38 @@ public class Orchestras { if(type == AnimType.CYCLE_DRY) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 1.5F); } - + if(type == AnimType.RELOAD) { if(timer == 2) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallRemove", 1F, 1F); if(timer == 18) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.impact", 0.25F, 1F); if(timer == 30) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magInsert", 1F, 1F); if(timer == 38) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1F); } - + if(type == AnimType.INSPECT) { if(timer == 2) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallRemove", 1F, 1F); if(timer == 12) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magInsert", 1F, 1F); if(timer == 20) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1F); } - + if(type == AnimType.JAMMED) { if(timer == 2) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallRemove", 1F, 1F); if(timer == 22) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magInsert", 1F, 1F); if(timer == 30) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_COILGUN = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); - + if(type == AnimType.RELOAD) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.coilgunReload", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_HANGMAN = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; @@ -1173,9 +1173,9 @@ public class Orchestras { if(type == AnimType.CYCLE_DRY) { if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 1F); } - + if(type == AnimType.RELOAD) { - + if(timer == 0) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverCock", 1F, 0.8F); if(timer == 5) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallRemove", 1F, 0.8F); if(timer == 25) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 1F); @@ -1188,7 +1188,7 @@ public class Orchestras { if(casing != null) for(int i = 0; i < mag.getCapacity(stack); i++) CasingCreator.composeEffect(entity.worldObj, entity, 0.25, -0.25, -0.125, -0.05, 0, 0, 0.01, casing.getName()); } } - + if(type == AnimType.INSPECT) { if(timer == 16 && ctx.getPlayer() != null) { MovingObjectPosition mop = EntityDamageUtil.getMouseOver(ctx.getPlayer(), 3.0D); @@ -1207,7 +1207,7 @@ public class Orchestras { } } } - + if(type == AnimType.JAMMED) { if(timer == 10) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverCock", 1F, 0.8F); if(timer == 15) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallRemove", 1F, 0.8F); @@ -1215,51 +1215,51 @@ public class Orchestras { if(timer == 25) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverCock", 1F, 0.75F); } }; - + public static BiConsumer ORCHESTRA_BOLTER = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); boolean aiming = ItemGunBaseNT.getIsAiming(stack); - + if(type == AnimType.CYCLE) { if(timer == 1) { SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory); if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, 0.5, aiming ? 0 : -0.125, aiming ? -0.0625 : -0.25D, 0, 0.18, -0.12, 0.01, casing.getName()); } } - + if(type == AnimType.RELOAD) { if(timer == 5) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magRemove", 1F, 1F); if(timer == 26) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magInsert", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_FOLLY = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); - + if(type == AnimType.RELOAD) { if(timer == 20) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.screw", 1F, 1F); if(timer == 80) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.insertRocket", 1F, 1F); if(timer == 120) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.screw", 1F, 1F); } }; - + public static BiConsumer ORCHESTRA_DOUBLE_BARREL = (stack, ctx) -> { EntityLivingBase entity = ctx.entity; if(entity.worldObj.isRemote) return; AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); - + if(type == AnimType.RELOAD) { if(timer == 5) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverCock", 1F, 0.75F); if(timer == 19) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallInsert", 1F, 0.9F); if(timer == 29) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 0.8F); - + if(timer == 12) { IMagazine mag = ctx.config.getReceivers(stack)[0].getMagazine(stack); int toEject = mag.getAmountAfterReload(stack) - mag.getAmount(stack, ctx.inventory); @@ -1267,12 +1267,12 @@ public class Orchestras { if(casing != null) for(int i = 0; i < toEject; i++) CasingCreator.composeEffect(entity.worldObj, entity, 0, -0.1875, -0.375D, -0.12, 0.18, 0, 0.01, casing.getName(), true, 60, 0.5D, 20); } } - + if(type == AnimType.INSPECT) { if(timer == 5) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverCock", 1F, 0.75F); if(timer == 19) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.revolverClose", 1F, 0.8F); } - + if(type == AnimType.CYCLE_DRY) { if(timer == 2) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 1F); } 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..cc10f48ef 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 @@ -13,6 +13,7 @@ import com.hbm.explosion.vanillant.standard.EntityProcessorCrossSmooth; import com.hbm.explosion.vanillant.standard.ExplosionEffectWeapon; import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard; import com.hbm.handler.radiation.ChunkRadiationManager; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.Crosshair; @@ -24,7 +25,6 @@ import com.hbm.items.weapon.sedna.ItemGunBaseNT.WeaponQuality; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; import com.hbm.items.weapon.sedna.mags.MagazineSingleReload; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.render.anim.BusAnimation; import com.hbm.render.anim.BusAnimationSequence; @@ -44,37 +44,37 @@ public class XFactoryCatapult { public static BulletConfig nuke_high; public static BulletConfig nuke_tots; public static BulletConfig nuke_hive; - + public static BiConsumer LAMBDA_NUKE_STANDARD = (bullet, mop) -> { 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, 10); vnt.setEntityProcessor(new EntityProcessorCrossSmooth(2, bullet.damage).withRangeMod(1.5F)); vnt.setPlayerProcessor(new PlayerProcessorStandard()); vnt.explode(); - + incrementRad(bullet.worldObj, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, 1F); spawnMush(bullet, mop); }; - + public static BiConsumer LAMBDA_NUKE_DEMO = (bullet, mop) -> { if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3) return; if(bullet.isDead) return; bullet.setDead(); - + ExplosionVNT vnt = new ExplosionVNT(bullet.worldObj, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, 10); vnt.setBlockAllocator(new BlockAllocatorStandard(64)); vnt.setBlockProcessor(new BlockProcessorStandard()); vnt.setEntityProcessor(new EntityProcessorCrossSmooth(2, bullet.damage).withRangeMod(1.5F)); vnt.setPlayerProcessor(new PlayerProcessorStandard()); vnt.explode(); - + incrementRad(bullet.worldObj, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, 1.5F); spawnMush(bullet, mop); }; - + public static BiConsumer LAMBDA_NUKE_HIGH = (bullet, mop) -> { if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3) return; if(bullet.isDead) return; @@ -82,7 +82,7 @@ public class XFactoryCatapult { bullet.worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(bullet.worldObj, 35, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord)); spawnMush(bullet, mop); }; - + public static void incrementRad(World world, double posX, double posY, double posZ, float mult) { for(int i = -2; i <= 2; i++) { for(int j = -2; j <= 2; j++) { if(Math.abs(i) + Math.abs(j) < 4) { @@ -91,33 +91,33 @@ public class XFactoryCatapult { } } } - + public static void spawnMush(EntityBulletBaseMK4 bullet, MovingObjectPosition mop) { bullet.worldObj.playSoundEffect(mop.hitVec.xCoord, mop.hitVec.yCoord + 0.5, mop.hitVec.zCoord, "hbm:weapon.mukeExplosion", 15.0F, 1.0F); NBTTagCompound data = new NBTTagCompound(); data.setString("type", "muke"); data.setBoolean("balefire", MainRegistry.polaroidID == 11 || bullet.worldObj.rand.nextInt(100) == 0); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, mop.hitVec.xCoord, mop.hitVec.yCoord + 0.5, mop.hitVec.zCoord), new TargetPoint(bullet.dimension, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, mop.hitVec.xCoord, mop.hitVec.yCoord + 0.5, mop.hitVec.zCoord), new TargetPoint(bullet.dimension, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, 250)); } - + public static BiConsumer LAMBDA_NUKE_TINYTOT = (bullet, mop) -> { if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3) return; if(bullet.isDead) return; bullet.setDead(); - + ExplosionVNT vnt = new ExplosionVNT(bullet.worldObj, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, 5); vnt.setEntityProcessor(new EntityProcessorCrossSmooth(2, bullet.damage).withRangeMod(1.5F)); vnt.setPlayerProcessor(new PlayerProcessorStandard()); vnt.explode(); - + incrementRad(bullet.worldObj, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, 0.25F); bullet.worldObj.playSoundEffect(mop.hitVec.xCoord, mop.hitVec.yCoord + 0.5, mop.hitVec.zCoord, "hbm:weapon.mukeExplosion", 15.0F, 1.0F); NBTTagCompound data = new NBTTagCompound(); data.setString("type", "tinytot"); data.setBoolean("balefire", MainRegistry.polaroidID == 11 || bullet.worldObj.rand.nextInt(100) == 0); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, mop.hitVec.xCoord, mop.hitVec.yCoord + 0.5, mop.hitVec.zCoord), new TargetPoint(bullet.dimension, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, mop.hitVec.xCoord, mop.hitVec.yCoord + 0.5, mop.hitVec.zCoord), new TargetPoint(bullet.dimension, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, 250)); }; - + public static BiConsumer LAMBDA_NUKE_HIVE = (bullet, mop) -> { if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3) return; if(bullet.isDead) return; @@ -128,7 +128,7 @@ public class XFactoryCatapult { vnt.setSFX(new ExplosionEffectWeapon(10, 2.5F, 1F)); vnt.explode(); }; - + public static void init() { nuke_standard = new BulletConfig().setItem(EnumAmmo.NUKE_STANDARD).setLife(300).setVel(3F).setGrav(0.025F).setOnImpact(LAMBDA_NUKE_STANDARD); @@ -148,7 +148,7 @@ public class XFactoryCatapult { .anim(LAMBDA_FATMAN_ANIMS).orchestra(Orchestras.ORCHESTRA_FATMAN) ).setUnlocalizedName("gun_fatman"); } - + public static BiConsumer LAMBDA_RECOIL_FATMAN = (stack, ctx) -> { }; @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_FATMAN_ANIMS = (stack, type) -> { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryEnergy.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryEnergy.java index 02a18afd0..5ad9b456e 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryEnergy.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryEnergy.java @@ -9,6 +9,7 @@ import com.hbm.explosion.vanillant.ExplosionVNT; import com.hbm.explosion.vanillant.standard.EntityProcessorCrossSmooth; import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard; import com.hbm.extprop.HbmLivingProps; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.Crosshair; @@ -22,7 +23,6 @@ import com.hbm.items.weapon.sedna.mags.MagazineBelt; import com.hbm.items.weapon.sedna.mags.MagazineFullReload; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.render.anim.BusAnimation; import com.hbm.render.anim.BusAnimationSequence; @@ -44,7 +44,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class XFactoryEnergy { - + public static final ResourceLocation scope_luna = new ResourceLocation(RefStrings.MODID, "textures/misc/scope_luna.png"); public static BulletConfig energy_tesla; @@ -53,16 +53,16 @@ public class XFactoryEnergy { public static BulletConfig energy_las; public static BulletConfig energy_las_overcharge; public static BulletConfig energy_las_ir; - + public static BiConsumer LAMBDA_LIGHTNING_HIT = (beam, mop) -> { - + if(mop.typeOfHit == mop.typeOfHit.BLOCK) { ForgeDirection dir = ForgeDirection.getOrientation(mop.sideHit); mop.hitVec.xCoord += dir.offsetX * 0.5; mop.hitVec.yCoord += dir.offsetY * 0.5; mop.hitVec.zCoord += dir.offsetZ * 0.5; } - + ExplosionVNT vnt = new ExplosionVNT(beam.worldObj, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, 2F, beam.getThrower()); vnt.setEntityProcessor(new EntityProcessorCrossSmooth(1, beam.damage).setDamageClass(beam.config.dmgClass)); vnt.setPlayerProcessor(new PlayerProcessorStandard()); @@ -80,10 +80,10 @@ public class XFactoryEnergy { data.setFloat("pitch", -60F + 60F * i); data.setFloat("yaw", yaw); data.setFloat("scale", 2F); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord), + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord), new TargetPoint(beam.worldObj.provider.dimensionId, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, 100)); } - + if(mop.typeOfHit == mop.typeOfHit.ENTITY) { if(mop.entityHit instanceof EntityLivingBase) { ((EntityLivingBase) mop.entityHit).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 60, 9)); @@ -91,10 +91,10 @@ public class XFactoryEnergy { } } }; - + public static BiConsumer LAMBDA_IR_HIT = (beam, mop) -> { BulletConfig.LAMBDA_STANDARD_BEAM_HIT.accept(beam, mop); - + if(mop.typeOfHit == mop.typeOfHit.ENTITY) { if(mop.entityHit instanceof EntityLivingBase) { EntityLivingBase living = (EntityLivingBase) mop.entityHit; @@ -113,13 +113,13 @@ public class XFactoryEnergy { return; } } - + EntityFireLingering fire = new EntityFireLingering(beam.worldObj).setArea(2, 1).setDuration(100).setType(EntityFireLingering.TYPE_DIESEL); fire.setPosition(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); beam.worldObj.spawnEntityInWorld(fire); } }; - + public static void init() { energy_tesla = new BulletConfig().setItem(EnumAmmo.CAPACITOR).setupDamageClass(DamageClass.ELECTRIC).setBeam().setSpread(0.0F).setLife(5).setRenderRotations(false).setDoesPenetrate(true) @@ -153,7 +153,7 @@ public class XFactoryEnergy { .anim(LAMBDA_LASRIFLE).orchestra(Orchestras.ORCHESTRA_LASRIFLE) ).setUnlocalizedName("gun_lasrifle"); } - + public static BiConsumer LAMBDA_RECOIL_ENERGY = (stack, ctx) -> { }; @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_TESLA_ANIMS = (stack, type) -> { @@ -171,7 +171,7 @@ public class XFactoryEnergy { .addBus("YOMI", new BusAnimationSequence().addPos(8, -4, 0, 0).addPos(4, -1, 0, 500, IType.SIN_DOWN).addPos(4, -1, 0, 1000).addPos(6, -6, 0, 500, IType.SIN_UP)) .addBus("SQUEEZE", new BusAnimationSequence().addPos(1, 1, 1, 0).addPos(1, 1, 1, 750).addPos(1, 1, 0.5, 125).addPos(1, 1, 1, 125)); } - + return null; }; @@ -197,7 +197,7 @@ public class XFactoryEnergy { .addBus("MAG", new BusAnimationSequence().addPos(0, 0, 0, 350).addPos(0, -2, 0, 200, IType.SIN_UP).addPos(0, -0.25, 0, 250, IType.SIN_FULL).addPos(0, -0.25, 0, 150).addPos(0, 0, 0, 350)) .addBus("EQUIP", new BusAnimationSequence().addPos(0, 0, 0, 800).addPos(-2, 0, 0, 100, IType.SIN_DOWN).addPos(0, 0, 0, 100, IType.SIN_FULL)); } - + return null; }; } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryFolly.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryFolly.java index 41caa05c7..86461c4ee 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryFolly.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryFolly.java @@ -9,6 +9,7 @@ import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.entity.logic.EntityNukeExplosionMK5; import com.hbm.entity.projectile.EntityBulletBaseMK4; import com.hbm.entity.projectile.EntityBulletBeamBase; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.Crosshair; @@ -20,7 +21,6 @@ import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; import com.hbm.items.weapon.sedna.ItemGunBaseNT.WeaponQuality; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; import com.hbm.items.weapon.sedna.mags.MagazineSingleReload; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.render.anim.BusAnimation; import com.hbm.render.anim.BusAnimationSequence; @@ -46,12 +46,12 @@ public class XFactoryFolly { public static BulletConfig folly_sm; public static BulletConfig folly_nuke; - + public static Consumer LAMBDA_SM_UPDATE = (entity) -> { if(entity.worldObj.isRemote) return; EntityBulletBeamBase beam = (EntityBulletBeamBase) entity; Vec3NT dir = new Vec3NT(beam.headingX, beam.headingY, beam.headingZ).normalizeSelf(); - + if(beam.ticksExisted < 50) { double spacing = 10; double dist = beam.ticksExisted * spacing; @@ -63,20 +63,20 @@ public class XFactoryFolly { data.setFloat("pitch", (float) beam.rotationPitch + 90); data.setFloat("yaw", (float) -beam.rotationYaw); data.setFloat("scale", 2F + beam.ticksExisted / (float)(beam.beamLength / spacing) * 3F); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, beam.posX + dir.xCoord * dist, beam.posY + dir.yCoord * dist, beam.posZ + dir.zCoord * dist), new TargetPoint(beam.dimension, beam.posX, beam.posY, beam.posZ, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, beam.posX + dir.xCoord * dist, beam.posY + dir.yCoord * dist, beam.posZ + dir.zCoord * dist), new TargetPoint(beam.dimension, beam.posX, beam.posY, beam.posZ, 250)); } - + if(entity.ticksExisted != 2) return; - + if(beam.thrower != null) ContaminationUtil.contaminate(beam.thrower, HazardType.RADIATION, ContaminationType.CREATIVE, 150F); List entities = beam.worldObj.getEntitiesWithinAABBExcludingEntity(beam, beam.boundingBox.addCoord(beam.headingX, beam.headingY, beam.headingZ).expand(1.0D, 1.0D, 1.0D)); - + for(int i = 1; i < beam.beamLength; i += 2) { int x = (int) Math.floor(beam.posX + dir.xCoord * i); int y = (int) Math.floor(beam.posY + dir.yCoord * i); int z = (int) Math.floor(beam.posZ + dir.zCoord * i); - + for(int ix = x - 1; ix <= x + 1; ix++) for(int iy = y - 1; iy <= y + 1; iy++) for(int iz = z - 1; iz <= z + 1; iz++) { if(iy > 0 && iy < 256) beam.worldObj.setBlock(ix, iy, iz, Blocks.air); AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(ix - 1, iy - 1, iz - 1, ix + 2, iy + 2, iz + 2); @@ -87,7 +87,7 @@ public class XFactoryFolly { } } }; - + public static BiConsumer LAMBDA_NUKE_IMPACT = (bullet, mop) -> { if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 2) return; if(bullet.isDead) return; @@ -95,7 +95,7 @@ public class XFactoryFolly { bullet.worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(bullet.worldObj, 100, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord)); EntityNukeTorex.statFac(bullet.worldObj, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, 100); }; - + public static void init() { folly_sm = new BulletConfig().setItem(EnumAmmoSecret.FOLLY_SM).setupDamageClass(DamageClass.SUBATOMIC).setBeam().setLife(100).setVel(2F).setGrav(0.015D).setRenderRotations(false).setSpectral(true).setDoesPenetrate(true) @@ -114,7 +114,7 @@ public class XFactoryFolly { .anim(LAMBDA_FOLLY_ANIMS).orchestra(Orchestras.ORCHESTRA_FOLLY) ).setUnlocalizedName("gun_folly"); } - + public static BiConsumer LAMBDA_TOGGLE_AIM = (stack, ctx) -> { if(ItemGunBaseNT.getState(stack, ctx.configIndex) == GunState.IDLE) { boolean wasAiming = ItemGunBaseNT.getIsAiming(stack); @@ -122,18 +122,18 @@ public class XFactoryFolly { if(!wasAiming) ItemGunBaseNT.playAnimation(ctx.getPlayer(), stack, AnimType.SPINUP, ctx.configIndex); } }; - + public static BiConsumer LAMBDA_FIRE = (stack, ctx) -> { Lego.doStandardFire(stack, ctx, AnimType.CYCLE, false); }; - + public static BiFunction LAMBDA_CAN_FIRE = (stack, ctx) -> { if(!ItemGunBaseNT.getIsAiming(stack)) return false; if(ItemGunBaseNT.getLastAnim(stack, ctx.configIndex) != AnimType.SPINUP) return false; if(ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex) < 100) return false; return ctx.config.getReceivers(stack)[0].getMagazine(stack).getAmount(stack, ctx.inventory) > 0; }; - + public static BiConsumer LAMBDA_RECOIL_FOLLY = (stack, ctx) -> { ItemGunBaseNT.setupRecoil(25, (float) (ctx.getPlayer().getRNG().nextGaussian() * 1.5)); }; @@ -151,7 +151,7 @@ public class XFactoryFolly { .addBus("BREECH", new BusAnimationSequence().addPos(0, 0, 0, 1000).addPos(0, 0, -0.5, 1000, IType.SIN_FULL).addPos(0, -4, -0.5, 1000, IType.SIN_FULL).addPos(0, -4, -0.5, 2000).addPos(0, 0, -0.5, 1000, IType.SIN_FULL).addPos(0, 0, 0, 1000, IType.SIN_FULL)) .addBus("SHELL", new BusAnimationSequence().addPos(0, -4, -4.5, 0).addPos(0, -4, -4.5, 3000).addPos(0, 0, -4.5, 1000, IType.SIN_FULL).addPos(0, 0, 0, 500, IType.SIN_UP)); } - + return null; }; } diff --git a/src/main/java/com/hbm/lib/HbmWorldGen.java b/src/main/java/com/hbm/lib/HbmWorldGen.java index 863b2876e..64bd8d1fa 100644 --- a/src/main/java/com/hbm/lib/HbmWorldGen.java +++ b/src/main/java/com/hbm/lib/HbmWorldGen.java @@ -540,6 +540,9 @@ public class HbmWorldGen implements IWorldGenerator { safe.setPins(rand.nextInt(999) + 1); safe.lock(); + if(rand.nextInt(10) < 3) // 30% chance + safe.fillWithSpiders(); + if(GeneralConfig.enableDebugMode) MainRegistry.logger.info("[Debug] Successfully spawned safe at " + x + " " + (y + 1) +" " + z); } diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 79ea907c7..280795d48 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -3,6 +3,8 @@ package com.hbm.main; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockAshes; +import com.hbm.blocks.generic.BlockCrate; +import com.hbm.blocks.generic.BlockStorageCrate; import com.hbm.config.ClientConfig; import com.hbm.config.GeneralConfig; import com.hbm.entity.mob.EntityHunterChopper; @@ -58,6 +60,7 @@ import com.hbm.tileentity.bomb.TileEntityNukeCustom; import com.hbm.tileentity.bomb.TileEntityNukeCustom.CustomNukeEntry; import com.hbm.tileentity.bomb.TileEntityNukeCustom.EnumEntryType; import com.hbm.tileentity.machine.TileEntityNukeFurnace; +import com.hbm.tileentity.machine.storage.TileEntityCrateBase; import com.hbm.util.*; import com.hbm.util.ArmorRegistry.HazardClass; import com.hbm.wiaj.GuiWorldInAJar; @@ -99,6 +102,7 @@ import net.minecraft.init.Items; import net.minecraft.inventory.Slot; import net.minecraft.item.Item; import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.network.play.client.C03PacketPlayer; import net.minecraft.network.play.client.C0CPacketInput; @@ -116,6 +120,7 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.client.event.sound.PlaySoundEvent17; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; diff --git a/src/main/java/com/hbm/main/NetworkHandler.java b/src/main/java/com/hbm/main/NetworkHandler.java index 06ff25dc1..bb56cde3b 100644 --- a/src/main/java/com/hbm/main/NetworkHandler.java +++ b/src/main/java/com/hbm/main/NetworkHandler.java @@ -1,7 +1,7 @@ package com.hbm.main; import com.hbm.handler.threading.PacketThreading; -import com.hbm.packet.PrecompiledPacket; +import com.hbm.packet.threading.ThreadedPacket; import cpw.mods.fml.common.network.FMLEmbeddedChannel; import cpw.mods.fml.common.network.FMLOutboundHandler; import cpw.mods.fml.common.network.NetworkRegistry; @@ -21,6 +21,7 @@ import io.netty.handler.codec.CodecException; import io.netty.handler.codec.MessageToMessageCodec; import net.minecraft.entity.player.EntityPlayerMP; + import java.lang.ref.WeakReference; import java.util.EnumMap; import java.util.List; @@ -55,8 +56,8 @@ public class NetworkHandler { discriminator = types.get(msgClass); outboundBuf.writeByte(discriminator); - if(msg instanceof PrecompiledPacket) // Precompiled packet to avoid race conditions/speed up serialization. - outboundBuf.writeBytes(((PrecompiledPacket) msg).getPreBuf()); + if(msg instanceof ThreadedPacket) // Precompiled packet to avoid race conditions/speed up serialization. + outboundBuf.writeBytes(((ThreadedPacket) msg).getCompiledBuffer()); else if(msg instanceof IMessage) ((IMessage) msg).toBytes(outboundBuf); else diff --git a/src/main/java/com/hbm/packet/PrecompiledPacket.java b/src/main/java/com/hbm/packet/PrecompiledPacket.java deleted file mode 100644 index 30d4c456d..000000000 --- a/src/main/java/com/hbm/packet/PrecompiledPacket.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.hbm.packet; - -import cpw.mods.fml.common.network.simpleimpl.IMessage; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; - -/** - * Abstract class for precompiled packets. This should be used if the packet is going to be threaded through the `PacketThreading` handler. - */ -public abstract class PrecompiledPacket implements IMessage { - - ByteBuf preCompiledBuf; - - /** - * Returns a precompiled buffer used to avoid race conditions when sending certain packets in threads. - * @return The precompiled packet in a `ByteBuf`. - */ - public ByteBuf getPreBuf() { - if(preCompiledBuf == null || preCompiledBuf.readableBytes() <= 0 /* No data written */) - this.makePreBuf(); - return preCompiledBuf; - } - - /** - * Forcefully creates the precompiled buffer, use `getPreBuf()` whenever possible. - */ - public void makePreBuf() { - if(preCompiledBuf != null) - preCompiledBuf.release(); - - preCompiledBuf = Unpooled.buffer(); - - this.toBytes(preCompiledBuf); // Create buffer and read data to it. - } -} diff --git a/src/main/java/com/hbm/packet/threading/PrecompiledPacket.java b/src/main/java/com/hbm/packet/threading/PrecompiledPacket.java new file mode 100644 index 000000000..461723645 --- /dev/null +++ b/src/main/java/com/hbm/packet/threading/PrecompiledPacket.java @@ -0,0 +1,9 @@ +package com.hbm.packet.threading; + +import io.netty.buffer.ByteBuf; + +/** + * Abstract class for precompiled packets. + * Contains no content of its own; purely for distinction between precompiling and normal packets. + * */ +public abstract class PrecompiledPacket extends ThreadedPacket { } diff --git a/src/main/java/com/hbm/packet/threading/ThreadedPacket.java b/src/main/java/com/hbm/packet/threading/ThreadedPacket.java new file mode 100644 index 000000000..630adc002 --- /dev/null +++ b/src/main/java/com/hbm/packet/threading/ThreadedPacket.java @@ -0,0 +1,31 @@ +package com.hbm.packet.threading; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +/** + * This is the base class for any packets passing through the PacketThreading system. + */ +public abstract class ThreadedPacket implements IMessage { + + ByteBuf compiledBuffer; + + public void compile() { + if(compiledBuffer != null) + compiledBuffer.release(); + + compiledBuffer = Unpooled.buffer(); + + this.toBytes(compiledBuffer); // Create buffer and read data to it. + } + + /** + * Returns the compiled buffer. + */ + public ByteBuf getCompiledBuffer() { + if(compiledBuffer == null || compiledBuffer.readableBytes() <= 0 /* No data written */) + this.compile(); + return compiledBuffer; + } +} diff --git a/src/main/java/com/hbm/packet/toclient/AuxParticlePacketNT.java b/src/main/java/com/hbm/packet/toclient/AuxParticlePacketNT.java index a9d44e0b7..c510c586c 100644 --- a/src/main/java/com/hbm/packet/toclient/AuxParticlePacketNT.java +++ b/src/main/java/com/hbm/packet/toclient/AuxParticlePacketNT.java @@ -1,56 +1,40 @@ package com.hbm.packet.toclient; -import java.io.IOException; - import com.hbm.main.MainRegistry; +import com.hbm.packet.threading.ThreadedPacket; +import com.hbm.util.BufferUtil; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; import net.minecraft.client.Minecraft; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; -public class AuxParticlePacketNT implements IMessage { +public class AuxParticlePacketNT extends ThreadedPacket { - PacketBuffer buffer; + ByteBuf buffer; + + NBTTagCompound nbt; public AuxParticlePacketNT() { } public AuxParticlePacketNT(NBTTagCompound nbt, double x, double y, double z) { - - this.buffer = new PacketBuffer(Unpooled.buffer()); - nbt.setDouble("posX", x); nbt.setDouble("posY", y); nbt.setDouble("posZ", z); - - try { - buffer.writeNBTTagCompoundToBuffer(nbt); - - } catch (IOException e) { - e.printStackTrace(); - } + this.nbt = nbt; } @Override public void fromBytes(ByteBuf buf) { - - if (buffer == null) { - buffer = new PacketBuffer(Unpooled.buffer()); - } - buffer.writeBytes(buf); + this.nbt = BufferUtil.readNBT(buf); + this.buffer = buf; } @Override public void toBytes(ByteBuf buf) { - - if (buffer == null) { - buffer = new PacketBuffer(Unpooled.buffer()); - } - buf.writeBytes(buffer); + BufferUtil.writeNBT(buf, nbt); } public static class Handler implements IMessageHandler { @@ -61,22 +45,12 @@ public class AuxParticlePacketNT implements IMessage { if(Minecraft.getMinecraft().theWorld == null) return null; + if(m.nbt != null) + MainRegistry.proxy.effectNT(m.nbt); - try { - - NBTTagCompound nbt = m.buffer.readNBTTagCompoundFromBuffer(); - - if(nbt != null) - MainRegistry.proxy.effectNT(nbt); - - } catch (IOException e) { - e.printStackTrace(); - } finally { - m.buffer.release(); - } + m.buffer.release(); return null; } } - } diff --git a/src/main/java/com/hbm/packet/toclient/BufPacket.java b/src/main/java/com/hbm/packet/toclient/BufPacket.java index 2cc78b657..fc0c14410 100644 --- a/src/main/java/com/hbm/packet/toclient/BufPacket.java +++ b/src/main/java/com/hbm/packet/toclient/BufPacket.java @@ -1,7 +1,7 @@ package com.hbm.packet.toclient; import com.hbm.main.MainRegistry; -import com.hbm.packet.PrecompiledPacket; +import com.hbm.packet.threading.PrecompiledPacket; import com.hbm.tileentity.IBufPacketReceiver; import cpw.mods.fml.common.network.simpleimpl.IMessage; diff --git a/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java b/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java index 97ac8016a..9d784ac6d 100644 --- a/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java +++ b/src/main/java/com/hbm/packet/toclient/ExtPropPacket.java @@ -3,7 +3,7 @@ package com.hbm.packet.toclient; import com.hbm.extprop.HbmLivingProps; import com.hbm.extprop.HbmPlayerProps; -import com.hbm.packet.PrecompiledPacket; +import com.hbm.packet.threading.PrecompiledPacket; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; diff --git a/src/main/java/com/hbm/particle/helper/IParticleCreator.java b/src/main/java/com/hbm/particle/helper/IParticleCreator.java index dce577ced..fcab9b78f 100644 --- a/src/main/java/com/hbm/particle/helper/IParticleCreator.java +++ b/src/main/java/com/hbm/particle/helper/IParticleCreator.java @@ -2,7 +2,7 @@ package com.hbm.particle.helper; import java.util.Random; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -24,8 +24,8 @@ public interface IParticleCreator { @SideOnly(Side.CLIENT) public void makeParticle(World world, EntityPlayer player, TextureManager texman, Random rand, double x, double y, double z, NBTTagCompound data); - + public static void sendPacket(World world, double x, double y, double z, int range, NBTTagCompound data) { - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(world.provider.dimensionId, x, y, z, range)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(world.provider.dimensionId, x, y, z, range)); } } diff --git a/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java b/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java index 74b61d7b0..d193810f8 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java @@ -71,7 +71,7 @@ public class TileEntityLoadedBase extends TileEntity implements ILoadedTile, IBu BufPacket packet = new BufPacket(xCoord, yCoord, zCoord, this); - ByteBuf preBuf = packet.getPreBuf(); + ByteBuf preBuf = packet.getCompiledBuffer(); // Don't send unnecessary packets, except for maybe one every second or so. // If we stop sending duplicate packets entirely, this causes issues when diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityFireworks.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityFireworks.java index ed97928b7..9d47fc511 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityFireworks.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityFireworks.java @@ -1,7 +1,7 @@ package com.hbm.tileentity.bomb; import com.hbm.entity.item.EntityFireworks; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -13,70 +13,70 @@ public class TileEntityFireworks extends TileEntity { public int color = 0xff0000; public String message = "NUCLEAR TECH"; public int charges; - + int index; int delay; - + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + if(worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord) && !message.isEmpty() && charges > 0) { - + delay--; - + if(delay <= 0) { delay = 30; - + int c = (int)(message.charAt(index)); - + int mod = index % 9; double offX = (mod / 3 - 1) * 0.3125; double offZ = (mod % 3 - 1) * 0.3125; - + EntityFireworks fireworks = new EntityFireworks(worldObj, xCoord + 0.5 + offX, yCoord + 1.5, zCoord + 0.5 + offZ, color, c); worldObj.spawnEntityInWorld(fireworks); - + worldObj.playSoundAtEntity(fireworks, "hbm:weapon.rocketFlame", 3.0F, 1.0F); - + charges--; this.markDirty(); - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaExt"); data.setString("mode", "flame"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5 + offX, yCoord + 1.125, zCoord + 0.5 + offZ), new TargetPoint(this.worldObj.provider.dimensionId, xCoord + 0.5 + offX, yCoord + 1.125, zCoord + 0.5 + offZ, 100)); - + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, xCoord + 0.5 + offX, yCoord + 1.125, zCoord + 0.5 + offZ), new TargetPoint(this.worldObj.provider.dimensionId, xCoord + 0.5 + offX, yCoord + 1.125, zCoord + 0.5 + offZ, 100)); + index++; - + if(index >= message.length()) { index = 0; delay = 100; } } - + } else { delay = 0; index = 0; } } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + this.charges = nbt.getInteger("charges"); this.color = nbt.getInteger("color"); this.message = nbt.getString("message"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setInteger("charges", charges); nbt.setInteger("color", color); nbt.setString("message", message); diff --git a/src/main/java/com/hbm/tileentity/deco/TileEntityGeysir.java b/src/main/java/com/hbm/tileentity/deco/TileEntityGeysir.java index ac6bfec24..273cb198d 100644 --- a/src/main/java/com/hbm/tileentity/deco/TileEntityGeysir.java +++ b/src/main/java/com/hbm/tileentity/deco/TileEntityGeysir.java @@ -7,7 +7,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.entity.particle.EntityOrangeFX; import com.hbm.entity.projectile.EntityShrapnel; import com.hbm.entity.projectile.EntityWaterSplash; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -23,18 +23,18 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; public class TileEntityGeysir extends TileEntity { - + int timer; @Override public void updateEntity() { - + if (!this.worldObj.isRemote && worldObj.getBlock(xCoord, yCoord + 1, zCoord) == Blocks.air) { - + timer--; - + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); - + if(timer <= 0) { timer = getDelay(); @@ -43,44 +43,44 @@ public class TileEntityGeysir extends TileEntity { else worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2); } - + if(meta == 1) { perform(); } } } - + private void water() { - + EntityWaterSplash fx = new EntityWaterSplash(worldObj, xCoord + 0.5, yCoord + 1.5, zCoord + 0.5); fx.motionX = worldObj.rand.nextGaussian() * 0.35; fx.motionZ = worldObj.rand.nextGaussian() * 0.35; fx.motionY = 2; - + worldObj.spawnEntityInWorld(fx); } - + private void chlorine() { - + for(int i = 0; i < 3; i++) { EntityOrangeFX fx = new EntityOrangeFX(worldObj, xCoord + 0.5, yCoord + 1.5, zCoord + 0.5, 0.0, 0.0, 0.0); - + fx.motionX = worldObj.rand.nextGaussian() * 0.45; fx.motionZ = worldObj.rand.nextGaussian() * 0.45; fx.motionY = timer * 0.3; - + worldObj.spawnEntityInWorld(fx); } - + } - + private void vapor() { List entities = this.worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(this.xCoord - 0.5, this.yCoord + 0.5, this.zCoord - 0.5, this.xCoord + 1.5, this.yCoord + 2, this.zCoord + 1.5)); - + if (!entities.isEmpty()) { for (Entity e : entities) { @@ -89,72 +89,72 @@ public class TileEntityGeysir extends TileEntity { } } } - + private void fire() { - + int range = 32; if(worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5).expand(range, range, range)).isEmpty()) return; - + if(worldObj.rand.nextInt(3) == 0) { EntityShrapnel fx = new EntityShrapnel(worldObj, xCoord + 0.5, yCoord + 1.5, zCoord + 0.5); fx.motionX = worldObj.rand.nextGaussian() * 0.05; fx.motionZ = worldObj.rand.nextGaussian() * 0.05; fx.motionY = 0.5 + worldObj.rand.nextDouble() * timer * 0.01; - + worldObj.spawnEntityInWorld(fx); } - + if(timer % 2 == 0) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "gasfire"); data.setDouble("mX", worldObj.rand.nextGaussian() * 0.05); data.setDouble("mY", 0.2); data.setDouble("mZ", worldObj.rand.nextGaussian() * 0.05); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, this.xCoord + 0.5F, this.yCoord + 1.1F, this.zCoord + 0.5F), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 75)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, this.xCoord + 0.5F, this.yCoord + 1.1F, this.zCoord + 0.5F), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 75)); } } - + private int getDelay() { - + Block b = worldObj.getBlock(xCoord, yCoord, zCoord); int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); Random rand = worldObj.rand; - + if(b == ModBlocks.geysir_water) { - + return (meta == 0 ? 30 : 100 + rand.nextInt(40)); - + } else if(b == ModBlocks.geysir_chlorine) { - + return (meta == 0 ? 20 : 400 + rand.nextInt(100)); - + } else if(b == ModBlocks.geysir_vapor) { - + return (meta == 0 ? 20 : 30 + rand.nextInt(20)); - + } else if(b == ModBlocks.geysir_nether) { - + return (meta == 0 ? (rand.nextBoolean() ? 300 : 450) : 80 + rand.nextInt(60)); - + } - + return 0; } - + private void perform() { Block b = worldObj.getBlock(xCoord, yCoord, zCoord); - + if(b == ModBlocks.geysir_water) { water(); - + } else if(b == ModBlocks.geysir_chlorine) { chlorine(); - + } else if(b == ModBlocks.geysir_vapor) { vapor(); - + } else if(b == ModBlocks.geysir_nether) { fire(); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java index fd3f5248d..717d865f9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCrucible.java @@ -9,6 +9,7 @@ import com.google.gson.stream.JsonWriter; import com.hbm.blocks.BlockDummyable; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.container.ContainerCrucible; import com.hbm.inventory.gui.GUICrucible; import com.hbm.inventory.material.MaterialShapes; @@ -18,7 +19,6 @@ import com.hbm.inventory.material.NTMMaterial; import com.hbm.inventory.recipes.CrucibleRecipes; import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; import com.hbm.items.ModItems; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IConfigurableMachine; import com.hbm.tileentity.IGUIProvider; @@ -170,7 +170,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro data.setFloat("off", 0.625F); data.setFloat("base", 0.625F); data.setFloat("len", Math.max(1F, yCoord - (float) (Math.ceil(impact.yCoord) - 0.875))); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord, zCoord + 0.5D + dir.offsetZ * 1.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord, zCoord + 0.5D + dir.offsetZ * 1.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); } @@ -210,7 +210,7 @@ public class TileEntityCrucible extends TileEntityMachineBase implements IGUIPro data.setFloat("off", 0.625F); data.setFloat("base", 0.625F); data.setFloat("len", Math.max(1F, yCoord - (float) (Math.ceil(impact.yCoord) - 0.875))); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord, zCoord + 0.5D + dir.offsetZ * 1.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 1.875D, yCoord, zCoord + 0.5D + dir.offsetZ * 1.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java index 2626569a2..69a79c1dc 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java @@ -6,6 +6,7 @@ import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; +import com.hbm.handler.threading.PacketThreading; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerElectrolyserFluid; @@ -24,7 +25,6 @@ import com.hbm.inventory.recipes.ElectrolyserMetalRecipes.ElectrolysisMetalRecip import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.*; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.BobMathUtil; @@ -180,7 +180,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn data.setFloat("off", 0.625F); data.setFloat("base", 0.625F); data.setFloat("len", Math.max(1F, yCoord - (float) (Math.ceil(impact.yCoord) - 0.875) + 2)); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 5.875D, yCoord + 2, zCoord + 0.5D + dir.offsetZ * 5.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 5.875D, yCoord + 2, zCoord + 0.5D + dir.offsetZ * 5.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); if(this.leftStack.amount <= 0) this.leftStack = null; } @@ -203,7 +203,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn data.setFloat("off", 0.625F); data.setFloat("base", 0.625F); data.setFloat("len", Math.max(1F, yCoord - (float) (Math.ceil(impact.yCoord) - 0.875) + 2)); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 5.875D, yCoord + 2, zCoord + 0.5D + dir.offsetZ * 5.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 5.875D, yCoord + 2, zCoord + 0.5D + dir.offsetZ * 5.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); if(this.rightStack.amount <= 0) this.rightStack = null; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java index a52ce34f3..1ee355a75 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundryOutlet.java @@ -1,8 +1,8 @@ package com.hbm.tileentity.machine; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.inventory.material.NTMMaterial; import com.hbm.util.CrucibleUtil; @@ -27,16 +27,16 @@ public class TileEntityFoundryOutlet extends TileEntityFoundryBase{ /** inverts redstone behavior, i.e. when TRUE, the outlet will be blocked by default and only open with redstone */ public boolean invertRedstone = false; public boolean lastClosed = false; - + /** if TRUE, prevents all fluids from flowing through the outlet and renders a small barrier */ public boolean isClosed() { return invertRedstone ^ this.worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); } - + @Override public void updateEntity() { super.updateEntity(); - + if(worldObj.isRemote) { boolean isClosed = isClosed(); if(this.lastClosed != isClosed || this.filter != this.lastFilter) { @@ -49,47 +49,47 @@ public class TileEntityFoundryOutlet extends TileEntityFoundryBase{ @Override public boolean canAcceptPartialPour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return false; } @Override public MaterialStack pour(World world, int x, int y, int z, double dX, double dY, double dZ, ForgeDirection side, MaterialStack stack) { return stack; } - + @Override public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - + if(filter != null && (filter != stack.material ^ invertFilter)) return false; if(isClosed()) return false; if(side != ForgeDirection.getOrientation(this.getBlockMetadata()).getOpposite()) return false; - + Vec3 start = Vec3.createVectorHelper(x + 0.5, y - 0.125, z + 0.5); Vec3 end = Vec3.createVectorHelper(x + 0.5, y + 0.125 - 4, z + 0.5); - + MovingObjectPosition[] mop = new MovingObjectPosition[1]; ICrucibleAcceptor acc = CrucibleUtil.getPouringTarget(world, start, end, mop); - + if(acc == null) { return false; } - + return acc.canAcceptPartialPour(world, mop[0].blockX, mop[0].blockY, mop[0].blockZ, mop[0].hitVec.xCoord, mop[0].hitVec.yCoord, mop[0].hitVec.zCoord, ForgeDirection.UP, stack); } - + @Override public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - + Vec3 start = Vec3.createVectorHelper(x + 0.5, y - 0.125, z + 0.5); Vec3 end = Vec3.createVectorHelper(x + 0.5, y + 0.125 - 4, z + 0.5); - + MovingObjectPosition[] mop = new MovingObjectPosition[1]; ICrucibleAcceptor acc = CrucibleUtil.getPouringTarget(world, start, end, mop); - + if(acc == null) return stack; - + MaterialStack didPour = acc.pour(world, mop[0].blockX, mop[0].blockY, mop[0].blockZ, mop[0].hitVec.xCoord, mop[0].hitVec.yCoord, mop[0].hitVec.zCoord, ForgeDirection.UP, stack); - + if(stack != null) { - + ForgeDirection dir = side.getOpposite(); double hitY = mop[0].blockY + 1; - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "foundry"); data.setInteger("color", stack.material.moltenColor); @@ -97,10 +97,10 @@ public class TileEntityFoundryOutlet extends TileEntityFoundryBase{ data.setFloat("off", 0.375F); data.setFloat("base", 0F); data.setFloat("len", Math.max(1F, yCoord - (float) (Math.ceil(hitY) - 0.875))); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D - dir.offsetX * 0.125, yCoord + 0.125, zCoord + 0.5D - dir.offsetZ * 0.125), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord, zCoord + 0.5, 50)); - + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, xCoord + 0.5D - dir.offsetX * 0.125, yCoord + 0.125, zCoord + 0.5D - dir.offsetZ * 0.125), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord, zCoord + 0.5, 50)); + } - + return didPour; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundrySlagtap.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundrySlagtap.java index ecf625688..8173293eb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundrySlagtap.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundrySlagtap.java @@ -2,8 +2,8 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockDynamicSlag.TileEntitySlag; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.material.Mats.MaterialStack; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.Compat; @@ -17,7 +17,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityFoundrySlagtap extends TileEntityFoundryOutlet implements ICrucibleAcceptor { - + @Override public boolean canAcceptPartialFlow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { if(filter != null && (filter != stack.material ^ invertFilter)) return false; @@ -26,37 +26,37 @@ public class TileEntityFoundrySlagtap extends TileEntityFoundryOutlet implements Vec3 start = Vec3.createVectorHelper(x + 0.5, y - 0.125, z + 0.5); Vec3 end = Vec3.createVectorHelper(x + 0.5, y + 0.125 - 15, z + 0.5); - + MovingObjectPosition mop = world.func_147447_a(start, end, true, true, true); - + if(mop == null || mop.typeOfHit != mop.typeOfHit.BLOCK) { return false; } - + return true; } - + @Override public MaterialStack flow(World world, int x, int y, int z, ForgeDirection side, MaterialStack stack) { - + if(stack == null || stack.material == null || stack.amount <= 0) { return null; } Vec3 start = Vec3.createVectorHelper(x + 0.5, y - 0.125, z + 0.5); Vec3 end = Vec3.createVectorHelper(x + 0.5, y + 0.125 - 15, z + 0.5); - + MovingObjectPosition mop = world.func_147447_a(start, end, true, true, true); - + if(mop == null || mop.typeOfHit != mop.typeOfHit.BLOCK) { return null; } Block hit = world.getBlock(mop.blockX, mop.blockY, mop.blockZ); Block above = world.getBlock(mop.blockX, mop.blockY + 1, mop.blockZ); - + boolean didFlow = false; - + if(hit == ModBlocks.slag) { TileEntitySlag tile = (TileEntitySlag) Compat.getTileStandard(world, mop.blockX, mop.blockY, mop.blockZ); if(tile.mat == stack.material) { @@ -78,7 +78,7 @@ public class TileEntityFoundrySlagtap extends TileEntityFoundryOutlet implements world.markBlockForUpdate(mop.blockX, mop.blockY, mop.blockZ); world.scheduleBlockUpdate(mop.blockX, mop.blockY, mop.blockZ, ModBlocks.slag, 1); } - + if(stack.amount > 0 && above.isReplaceable(world, mop.blockX, mop.blockY + 1, mop.blockZ)) { world.setBlock(mop.blockX, mop.blockY + 1, mop.blockZ, ModBlocks.slag); TileEntitySlag tile = (TileEntitySlag) Compat.getTileStandard(world, mop.blockX, mop.blockY + 1, mop.blockZ); @@ -90,11 +90,11 @@ public class TileEntityFoundrySlagtap extends TileEntityFoundryOutlet implements world.markBlockForUpdate(mop.blockX, mop.blockY + 1, mop.blockZ); world.scheduleBlockUpdate(mop.blockX, mop.blockY + 1, mop.blockZ, ModBlocks.slag, 1); } - + if(didFlow) { ForgeDirection dir = side.getOpposite(); double hitY = mop.blockY; - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "foundry"); data.setInteger("color", stack.material.moltenColor); @@ -102,13 +102,13 @@ public class TileEntityFoundrySlagtap extends TileEntityFoundryOutlet implements data.setFloat("off", 0.375F); data.setFloat("base", 0F); data.setFloat("len", Math.max(1F, yCoord - (float) (Math.ceil(hitY)))); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D - dir.offsetX * 0.125, yCoord + 0.125, zCoord + 0.5D - dir.offsetZ * 0.125), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord, zCoord + 0.5, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, xCoord + 0.5D - dir.offsetX * 0.125, yCoord + 0.125, zCoord + 0.5D - dir.offsetZ * 0.125), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord, zCoord + 0.5, 50)); } - + if(stack.amount <= 0) { stack = null; } - + return stack; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java index c2c737fda..fdfc5e861 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java @@ -9,13 +9,13 @@ import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.BlockHadronCoil; import com.hbm.blocks.machine.BlockHadronPlating; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.container.ContainerHadron; import com.hbm.inventory.gui.GUIHadron; import com.hbm.inventory.recipes.HadronRecipes; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; @@ -38,30 +38,30 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityHadron extends TileEntityMachineBase implements IEnergyReceiverMK2, IGUIProvider { - + public long power; public static final long maxPower = 10000000; - + public boolean isOn = false; public boolean analysisOnly = false; public int ioMode = 0; public static final int MODE_DEFAULT = 0; public static final int MODE_HOPPER = 1; public static final int MODE_SINGLE = 2; - + private int delay; public EnumHadronState state = EnumHadronState.IDLE; private static final int delaySuccess = 20; private static final int delayNoResult = 60; private static final int delayError = 100; - + public boolean stat_success = false; public EnumHadronState stat_state = EnumHadronState.IDLE; public int stat_charge = 0; public int stat_x = 0; public int stat_y = 0; public int stat_z = 0; - + public TileEntityHadron() { super(5); } @@ -70,9 +70,9 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe public String getName() { return "container.hadron"; } - + private static final int[] access = new int[] {0, 1, 2, 3}; - + @Override public int[] getAccessibleSlotsFromSide(int side) { return access; @@ -86,33 +86,33 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { if(i != 0 && i != 1) return false; - + if(this.ioMode == MODE_SINGLE) { return slots[i] == null; } - + //makes sure that equal items like the antimatter capsules are spread out evenly if(slots[0] != null && slots[1] != null && slots[0].getItem() == slots[1].getItem() && slots[0].getItemDamage() == slots[1].getItemDamage()) { if(i == 0) return slots[1].stackSize - slots[0].stackSize >= 0; if(i == 1) return slots[0].stackSize - slots[1].stackSize >= 0; } - + return true; } @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + power = Library.chargeTEFromItems(slots, 4, power, maxPower); drawPower(); particles.addAll(particlesToAdd); particlesToAdd.clear(); - + if(delay <= 0 && this.isOn && particles.size() < maxParticles && slots[0] != null && slots[1] != null && power >= maxPower * 0.75) { - + if(ioMode != MODE_HOPPER || (slots[0].stackSize > 1 && slots[1].stackSize > 1)) { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()); particles.add(new Particle(slots[0], slots[1], dir, xCoord, yCoord, zCoord)); @@ -122,20 +122,20 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe this.state = EnumHadronState.PROGRESS; } } - + if(delay > 0) delay--; else if(particles.isEmpty()) { this.state = EnumHadronState.IDLE; } - + if(!particles.isEmpty()) updateParticles(); - + for(Particle p : particlesToRemove) { particles.remove(p); } - + particlesToRemove.clear(); //Sort the virtual particles by momentum, and run through them until we have enough momentum to complete the recipe @@ -156,14 +156,14 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe particlesCompleted.clear(); } - + NBTTagCompound data = new NBTTagCompound(); data.setBoolean("isOn", isOn); data.setLong("power", power); data.setBoolean("analysis", analysisOnly); data.setInteger("ioMode", ioMode); data.setByte("state", (byte) state.ordinal()); - + data.setBoolean("stat_success", stat_success); data.setByte("stat_state", (byte) stat_state.ordinal()); data.setInteger("stat_charge", stat_charge); @@ -173,11 +173,11 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe this.networkPackNT(50); } } - + private void process(Particle p, ItemStack[] result) { //Collapse this particle to real by consuming power p.consumePower(); - + if(result == null) { this.state = HadronRecipes.returnCode; this.setStats(this.state, p.momentum, false); @@ -185,27 +185,27 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe worldObj.playSoundEffect(p.posX, p.posY, p.posZ, "random.orb", 2, 0.5F); return; } - + if((slots[2] == null || (slots[2].getItem() == result[0].getItem() && slots[2].stackSize < slots[2].getMaxStackSize())) && (slots[3] == null || (slots[3].getItem() == result[1].getItem() && slots[3].stackSize < slots[3].getMaxStackSize()))) { - + for(int i = 2; i <= 3; i++) { if(slots[i] == null) slots[i] = result[i - 2].copy(); else slots[i].stackSize++; } - + if(result[0].getItem() == ModItems.particle_digamma) { List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) .expand(128, 50, 128)); - + for(EntityPlayer player : players) player.triggerAchievement(MainRegistry.achOmega12); } } - + worldObj.playSoundEffect(p.posX, p.posY, p.posZ, "random.orb", 2, 1F); this.delay = delaySuccess; this.state = EnumHadronState.SUCCESS; @@ -248,7 +248,7 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe @Override public void handleButtonPacket(int value, int meta) { - + if(meta == 0) this.isOn = !this.isOn; if(meta == 1) @@ -257,55 +257,55 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe this.ioMode++; if(ioMode > 2) ioMode = 0; } - + this.markChanged(); } - + private void drawPower() { - + for(ForgeDirection dir : getRandomDirs()) { - + if(power == maxPower) return; int x = xCoord + dir.offsetX * 2; int y = yCoord + dir.offsetY * 2; int z = zCoord + dir.offsetZ * 2; - + TileEntity te = worldObj.getTileEntity(x, y, z); - + if(te instanceof TileEntityHadronPower) { - + TileEntityHadronPower plug = (TileEntityHadronPower)te; - + long toDraw = Math.min(maxPower - power, plug.getPower()); this.setPower(power + toDraw); plug.setPower(plug.getPower() - toDraw); } } } - + private void finishParticle(Particle p) { particlesToRemove.add(p); - + if(!p.isExpired()) particlesCompleted.add(p); - + p.expired = true; } - + static final int maxParticles = 1; List particles = new ArrayList(); List particlesToRemove = new ArrayList(); List particlesToAdd = new ArrayList(); List particlesCompleted = new ArrayList(); - + private void updateParticles() { for(Particle particle : particles) { particle.update(); } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -315,7 +315,7 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe this.analysisOnly = nbt.getBoolean("analysis"); this.ioMode = nbt.getInteger("ioMode"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -325,7 +325,7 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe nbt.setBoolean("analysis", analysisOnly); nbt.setInteger("ioMode", ioMode); } - + public int getPowerScaled(int i) { return (int)(power * i / maxPower); } @@ -345,18 +345,18 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe public long getMaxPower() { return maxPower; } - + @Override public boolean canConnect(ForgeDirection dir) { return false; } - + private void setStats(EnumHadronState state, int count, boolean success) { this.stat_state = state; this.stat_charge = count; this.stat_success = success; } - + private void setExpireStats(EnumHadronState state, int count, int x, int y, int z) { this.stat_state = state; this.stat_charge = count; @@ -365,11 +365,11 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe this.stat_z = z; this.stat_success = false; } - + public void expire(Particle particle, EnumHadronState reason) { if(particle.expired) return; - + particle.consumePower(); for(Particle p : particles) { p.expired = true; @@ -384,9 +384,9 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe delay = delayError; setExpireStats(reason, particle.momentum, particle.posX, particle.posY, particle.posZ); } - + public class Particle { - + //Starting values ItemStack item1; ItemStack item2; @@ -394,7 +394,7 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe int posX; int posY; int posZ; - + //Progressing values int momentum; int charge; @@ -402,7 +402,7 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe boolean isCheckExempt = false; int cl0 = 0; int cl1 = 0; - + boolean expired = false; boolean cloned = false; @@ -414,7 +414,7 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe //Quantum particles should only traverse a schottky direction ONCE //Keep a list of traversed diodes and directions HashMap> history = new HashMap>(); - + public Particle(ItemStack item1, ItemStack item2, ForgeDirection dir, int posX, int posY, int posZ) { this.item1 = item1.copy(); this.item2 = item2.copy(); @@ -424,7 +424,7 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe this.posX = posX; this.posY = posY; this.posZ = posZ; - + this.charge = 750; this.momentum = 0; } @@ -450,13 +450,13 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe return p; } - + public boolean isExpired() { return this.expired; } - + public void update() { - + if(expired) //just in case return; @@ -468,12 +468,12 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe } makeSteppy(this); - + if(!this.isExpired()) //only important for when the current segment is the core checkSegment(this); - + isCheckExempt = false; //clearing up the exemption we might have held from the previous turn, AFTER stepping - + if(charge < 0) expire(this, EnumHadronState.ERROR_NO_CHARGE); @@ -481,14 +481,14 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe if(cl1 > 0) cl1--; } - public void incrementCharge(int coilVal) { + public void incrementCharge(int coilVal) { //not the best code ever made but it works, dammit if(cl1 > 0) { - + double mult = 2D - (cl1 - 15D) * (cl1 - 15D) / 225D; mult = Math.max(mult, 0.1D); coilVal *= mult; - + } else if(cl0 > 0) { if(cl0 > 10) { coilVal *= 0.75; @@ -496,7 +496,7 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe coilVal *= 1.10; } } - + this.momentum += coilVal; } @@ -508,53 +508,53 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe } } } - + /** * Moves the particle and does all the checks required to do so * Handles diode entering behavior and whatnot * @param p */ public void makeSteppy(Particle p) { - + ForgeDirection dir = p.dir; p.posX += dir.offsetX; p.posY += dir.offsetY; p.posZ += dir.offsetZ; - + int x = p.posX; int y = p.posY; int z = p.posZ; - + Block block = worldObj.getBlock(x, y, z); TileEntity te = worldObj.getTileEntity(x, y, z); - + if(te instanceof TileEntityHadron) { if(p.analysis != 3) expire(p, EnumHadronState.ERROR_NO_ANALYSIS); else this.finishParticle(p); - + return; } - + if(block.getMaterial() != Material.air && block != ModBlocks.hadron_diode) expire(p, EnumHadronState.ERROR_OBSTRUCTED_CHANNEL); - + if(block == ModBlocks.hadron_diode) p.isCheckExempt = true; - + if(isValidCoil(worldObj.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ))) p.isCheckExempt = true; } - + /** * All the checks done *after* the particle moves one tile * @param p */ public void checkSegment(Particle p) { - + ForgeDirection dir = p.dir; int x = p.posX; int y = p.posY; @@ -565,60 +565,60 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe int dX = 1 - Math.abs(dir.offsetX); int dY = 1 - Math.abs(dir.offsetY); int dZ = 1 - Math.abs(dir.offsetZ); - + //whether the particle has entered an analysis chamber //-> all coils have to be air //-> all platings have to be analysis chamber walls boolean analysis = true; //ensures coolers are useful throughout their initial segment int totalValue = 0; - + for(int a = x - dX * 2; a <= x + dX * 2; a++) { for(int b = y - dY * 2; b <= y + dY * 2; b++) { for(int c = z - dZ * 2; c <= z + dZ * 2;c++) { - + Block block = worldObj.getBlock(a, b, c); int meta = worldObj.getBlockMetadata(a, b, c); - + /** ignore the center for now */ if(a == x && b == y && c == z) { - + //we are either in a diode or the core - no analysis for you now if(block.getMaterial() != Material.air) analysis = false; - + continue; } int ix = Math.abs(x - a); int iy = Math.abs(y - b); int iz = Math.abs(z - c); - + /** check coils, all abs deltas are 1 or less */ if(ix <= 1 && iy <= 1 && iz <= 1) { - + //are we exempt from the coil examination? nice, skip checks only for inner magnets, not the corners! if(p.isCheckExempt && ix + iy + iz == 1) { continue; } - + //coil is air, analysis can remain true if(block.getMaterial() == Material.air && analysis) { continue; } - + //not air -> not an analysis chamber analysis = false; - + int coilVal = coilValue(block); - + //not a valid coil: kablam! if(!isValidCoil(block)) { expire(p, EnumHadronState.ERROR_EXPECTED_COIL); } else { p.charge -= coilVal; totalValue += coilVal; - + if(block == ModBlocks.hadron_cooler) { if(meta == 0) p.cl0 += 10; if(meta == 1) p.cl1 += 5; @@ -627,37 +627,37 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe continue; } - + /** now we check the plating, sum of all local positions being 3 or less gives us the outer plating without corners */ if(ix + iy + iz <= 3) { - + //if the plating is for the analysis chamber, continue no matter what if(isAnalysis(block)) continue; //no analysis chamber -> turn off analysis and proceed analysis = false; - + //a plating? good, continue if(isPlating(block)) continue; - + TileEntity te = worldObj.getTileEntity(a, b, c); - + //power plugs are also ok, might as well succ some energy when passing if(te instanceof TileEntityHadronPower) { - + TileEntityHadronPower plug = (TileEntityHadronPower)te; - + long bit = 10000; //how much HE one "charge point" is int times = (int) (plug.getPower() / bit); //how many charges the plug has to offer - + p.charge += times; p.plugs.add(plug); - + continue; } - + //Are we exempt from checking the plating? skip all the plating blocks where branches could be if(p.isCheckExempt && ix + iy + iz == 2) { continue; @@ -670,22 +670,22 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe } //all errors prior to this point come from bad construction, where exact momentum is irrelevant p.incrementCharge(totalValue); - + if(analysis) { - + p.analysis++; - + //if the analysis chamber is too big, destroy if(p.analysis > 3) expire(p, EnumHadronState.ERROR_ANALYSIS_TOO_LONG); - + if(p.analysis == 2) { //Only pop for the first particle if(this.state != EnumHadronState.ANALYSIS) { this.worldObj.playSoundEffect(p.posX + 0.5, p.posY + 0.5, p.posZ + 0.5, "fireworks.blast", 2.0F, 2F); NBTTagCompound data = new NBTTagCompound(); data.setString("type", "hadron"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, p.posX + 0.5, p.posY + 0.5, p.posZ + 0.5), new TargetPoint(worldObj.provider.dimensionId, p.posX + 0.5, p.posY + 0.5, p.posZ + 0.5, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, p.posX + 0.5, p.posY + 0.5, p.posZ + 0.5), new TargetPoint(worldObj.provider.dimensionId, p.posX + 0.5, p.posY + 0.5, p.posZ + 0.5, 25)); } this.state = EnumHadronState.ANALYSIS; } @@ -694,7 +694,7 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe if(this.analysisOnly && p.analysis == 2) { this.finishParticle(p); } - + } else { //if the analysis stops despite being short of 3 steps in the analysis chamber, destroy @@ -702,16 +702,16 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe expire(p, EnumHadronState.ERROR_ANALYSIS_TOO_SHORT); } } - + /** * Checks whether we can go forward or if we might want to do a turn * Handles the better part of the diode behavior * @param p */ public void changeDirection(Particle p) { - + ForgeDirection dir = p.dir; - + int x = p.posX; int y = p.posY; int z = p.posZ; @@ -719,38 +719,38 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe int nx = x + dir.offsetX; int ny = y + dir.offsetY; int nz = z + dir.offsetZ; - + Block next = worldObj.getBlock(nx, ny, nz); - + TileEntity te = worldObj.getTileEntity(nx, ny, nz); - + //the next block appears to be a diode, let's see if we can enter if(te instanceof TileEntityHadronDiode) { TileEntityHadronDiode diode = (TileEntityHadronDiode)te; - + if(diode.getConfig(p.dir.getOpposite().ordinal()) != DiodeConfig.IN) { //it appears as if we have slammed into the side of a diode, ouch expire(p, EnumHadronState.ERROR_DIODE_COLLISION); } - + //there's a diode ahead, turn off checks so we can make the curve p.isCheckExempt = true; - + //the *next* block is a diode, we are not in it yet, which means no turning and no check exemption. too bad kiddo. return; } - + //instead of the next TE, we are looking at the current one - the diode (maybe) te = worldObj.getTileEntity(x, y, z); - + //if we are currently in a diode, we might want to consider changing dirs if(te instanceof TileEntityHadronDiode) { - + //since we are *in* a diode, we might want to call the warrant officer for //an exemption for the coil check, because curves NEED holes to turn into, and //checking for coils in spaces where there cannot be coils is quite not-good p.isCheckExempt = true; - + TileEntityHadronDiode diode = (TileEntityHadronDiode)te; boolean hasTurnedCurrent = false; @@ -783,30 +783,30 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe return; } - + //next step is air or the core, proceed if(next.getMaterial() == Material.air || next == ModBlocks.hadron_core) return; - + //so, the next block is most certainly a wall. not good. perhaps we could try turning? if(isValidCoil(next)) { - + ForgeDirection validDir = ForgeDirection.UNKNOWN; - + List dirs = getRandomDirs(); - + //let's look at every direction we could go in for(ForgeDirection d : dirs) { - + if(d == dir || d == dir.getOpposite()) continue; - + //there is air! we can pass! if(worldObj.getBlock(x + d.offsetX, y + d.offsetY, z + d.offsetZ).getMaterial() == Material.air) { - + if(validDir == ForgeDirection.UNKNOWN) { validDir = d; - + //it seems like there are two or more possible ways, which is not allowed without a diode //sorry kid, nothing personal } else { @@ -815,7 +815,7 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe } } } - + //set the new direction p.dir = validDir; p.isCheckExempt = true; @@ -824,13 +824,13 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe expire(p, EnumHadronState.ERROR_OBSTRUCTED_CHANNEL); } - + /** * Dear god please grant me the gift of death and end my eternal torment * @return */ private List getRandomDirs() { - + List rands = Arrays.asList(new Integer[] {0, 1, 2, 3, 4, 5} ); Collections.shuffle(rands); List dirs = new ArrayList(); @@ -839,25 +839,25 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe } return dirs; } - + public boolean isValidCoil(Block b) { if(coilValue(b) > 0) return true; - + if(b == ModBlocks.hadron_cooler) return true; - + return false; } - + public int coilValue(Block b) { - + if(b instanceof BlockHadronCoil) return ((BlockHadronCoil)b).factor; - + return 0; } - + public boolean isPlating(Block b) { - + return b instanceof BlockHadronPlating || b instanceof BlockHadronCoil || b == ModBlocks.hadron_plating_glass || @@ -865,13 +865,13 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe b == ModBlocks.hadron_access || b == ModBlocks.hadron_cooler; } - + public boolean isAnalysis(Block b) { - + return b == ModBlocks.hadron_analysis || b == ModBlocks.hadron_analysis_glass; } - + public static enum EnumHadronState { IDLE(0x8080ff), PROGRESS(0xffff00), @@ -891,14 +891,14 @@ public class TileEntityHadron extends TileEntityMachineBase implements IEnergyRe ERROR_DIODE_COLLISION(0xff0000, true), ERROR_BRANCHING_TURN(0xff0000, true), ERROR_GENERIC(0xff0000, true); - + public int color; public boolean showCoord; - + private EnumHadronState(int color) { this(color, false); } - + private EnumHadronState(int color, boolean showCoord) { this.color = color; this.showCoord = showCoord; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityICF.java b/src/main/java/com/hbm/tileentity/machine/TileEntityICF.java index b89dc9b42..55eb05ec2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityICF.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityICF.java @@ -1,6 +1,7 @@ package com.hbm.tileentity.machine; import com.hbm.handler.CompatHandler; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.container.ContainerICF; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -11,7 +12,6 @@ import com.hbm.inventory.gui.GUIICF; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemICFPellet; import com.hbm.lib.Library; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IFluidCopiable; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; @@ -40,7 +40,7 @@ import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider, IFluidStandardTransceiver, IInfoProviderEC, SimpleComponent, CompatHandler.OCComponent, IFluidCopiable { - + public long laser; public long maxLaser; public long heat; @@ -48,7 +48,7 @@ public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider public long heatup; public int consumption; public int output; - + public FluidTank[] tanks; public TileEntityICF() { @@ -66,17 +66,17 @@ public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + tanks[0].setType(11, slots); - + for(DirPos pos : getConPos()) { this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - + boolean markDirty = false; - + //eject depleted pellet if(slots[5] != null && slots[5].getItem() == ModItems.icf_pellet_depleted) { for(int i = 6; i < 11; i++) { @@ -88,7 +88,7 @@ public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider } } } - + //insert fresh pellet if(slots[5] == null) { for(int i = 0; i < 5; i++) { @@ -100,9 +100,9 @@ public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider } } } - + this.heatup = 0; - + if(slots[5] != null && slots[5].getItem() == ModItems.icf_pellet) { if(ItemICFPellet.getFusingDifficulty(slots[5]) <= this.laser) { this.heatup = ItemICFPellet.react(slots[5], this.laser); @@ -111,33 +111,33 @@ public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider slots[5] = new ItemStack(ModItems.icf_pellet_depleted); markDirty = true; } - + tanks[2].setFill(tanks[2].getFill() + (int) Math.ceil(this.heat * 2.5D / this.maxHeat)); if(tanks[2].getFill() > tanks[2].getMaxFill()) tanks[2].setFill(tanks[2].getMaxFill()); - + NBTTagCompound dPart = new NBTTagCompound(); dPart.setString("type", "hadron"); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(dPart, xCoord + 0.5, yCoord + 3.5, zCoord + 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(dPart, xCoord + 0.5, yCoord + 3.5, zCoord + 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 25)); } } - + if(heatup == 0) { this.heat += this.laser * 0.25D; } this.consumption = 0; this.output = 0; - + if(tanks[0].getTankType().hasTrait(FT_Heatable.class)) { FT_Heatable trait = tanks[0].getTankType().getTrait(FT_Heatable.class); HeatingStep step = trait.getFirstStep(); tanks[1].setTankType(step.typeProduced); - + int coolingCycles = tanks[0].getFill() / step.amountReq; int heatingCycles = (tanks[1].getMaxFill() - tanks[1].getFill()) / step.amountProduced; int heatCycles = (int) Math.min(this.heat / 4D / step.heatReq * trait.getEfficiency(HeatingType.ICF), this.heat / step.heatReq); //25% cooling per tick int cycles = Math.min(coolingCycles, Math.min(heatingCycles, heatCycles)); - + tanks[0].setFill(tanks[0].getFill() - step.amountReq * cycles); tanks[1].setFill(tanks[1].getFill() + step.amountProduced * cycles); this.heat -= step.heatReq * cycles; @@ -145,22 +145,22 @@ public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider this.consumption = step.amountReq * cycles; this.output = step.amountProduced * cycles; } - + for(DirPos pos : getConPos()) { this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.sendFluid(tanks[2], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - + this.heat *= 0.999D; if(this.heat > this.maxHeat) this.heat = this.maxHeat; if(markDirty) this.markDirty(); - + this.networkPackNT(150); this.laser = 0; this.maxLaser = 0; } } - + public DirPos[] getConPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); @@ -181,7 +181,7 @@ public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider buf.writeLong(heat); for(int i = 0; i < 3; i++) tanks[i].serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); this.laser = buf.readLong(); @@ -206,20 +206,20 @@ public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider public int[] getAccessibleSlotsFromSide(int side) { return io; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); for(int i = 0; i < 3; i++) tanks[i].readFromNBT(nbt, "t" + i); - + this.heat = nbt.getLong("heat"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); for(int i = 0; i < 3; i++) tanks[i].writeToNBT(nbt, "t" + i); - + nbt.setLong("heat", heat); } @@ -231,12 +231,12 @@ public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 256; } } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord + 0.5 - 8, @@ -247,10 +247,10 @@ public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider zCoord + 0.5 + 9 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -282,7 +282,7 @@ public class TileEntityICF extends TileEntityMachineBase implements IGUIProvider public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIICF(player.inventory, this); } - + @Override public void provideExtraInfo(NBTTagCompound data) { data.setBoolean(CompatEnergyControl.B_ACTIVE, heatup > 0); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java index 30ea58b03..fd92fb157 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java @@ -9,6 +9,7 @@ import com.hbm.explosion.ExplosionLarge; import com.hbm.explosion.ExplosionNT; import com.hbm.explosion.ExplosionNT.ExAttrib; import com.hbm.handler.CompatHandler; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.container.ContainerITER; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; @@ -21,7 +22,6 @@ import com.hbm.items.ModItems; import com.hbm.items.special.ItemFusionShield; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IFluidCopiable; @@ -53,20 +53,20 @@ import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) public class TileEntityITER extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiver, IGUIProvider, IInfoProviderEC, SimpleComponent, CompatHandler.OCComponent, IFluidCopiable { - + public long power; public static final long maxPower = 10000000; public static final int powerReq = 100000; public FluidTank[] tanks; public FluidTank plasma; - + public int progress; public static final int duration = 100; public long totalRuntime; - + @SideOnly(Side.CLIENT) public int blanket; - + public float rotor; public float lastRotor; public boolean isOn; @@ -90,36 +90,36 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece @Override public void updateEntity() { - + if(!worldObj.isRemote) { - + this.updateConnections(); power = Library.chargeTEFromItems(slots, 0, power, maxPower); /// START Processing part /// - + if(!isOn) { plasma.setFill(0); //jettison plasma if the thing is turned off } - + //explode either if there's plasma that is too hot or if the reactor is turned on but the magnets have no power if(plasma.getFill() > 0 && (this.plasma.getTankType().temperature >= this.getShield() || (this.isOn && this.power < this.powerReq))) { this.explode(); } - + if(isOn && power >= powerReq) { power -= powerReq; - + if(plasma.getFill() > 0) { this.totalRuntime++; int delay = FusionRecipes.getByproductDelay(plasma.getTankType()); if(delay > 0 && totalRuntime % delay == 0) produceByproduct(); } - + if(plasma.getFill() > 0 && this.getShield() != 0) { - + ItemFusionShield.setShieldDamage(slots[3], ItemFusionShield.getShieldDamage(slots[3]) + 1); - + if(ItemFusionShield.getShieldDamage(slots[3]) > ((ItemFusionShield)slots[3].getItem()).maxDamage) { slots[3] = null; worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:block.shutdown", 5F, 1F); @@ -127,51 +127,51 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece this.markDirty(); } } - + int prod = FusionRecipes.getSteamProduction(plasma.getTankType()); - + for(int i = 0; i < 20; i++) { - + if(plasma.getFill() > 0) { - + if(tanks[0].getFill() >= prod * 10) { tanks[0].setFill(tanks[0].getFill() - prod * 10); tanks[1].setFill(tanks[1].getFill() + prod); - + if(tanks[1].getFill() > tanks[1].getMaxFill()) tanks[1].setFill(tanks[1].getMaxFill()); } - + plasma.setFill(plasma.getFill() - 1); } } } - + doBreederStuff(); - + /// END Processing part /// /// START Notif packets /// - + for(DirPos pos : getConPos()) { if(tanks[1].getFill() > 0) { this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + this.networkPackNT(250); /// END Notif packets /// - + } else { this.lastRotor = this.rotor; this.rotor += this.rotorSpeed; - + if(this.rotor >= 360) { this.rotor -= 360; this.lastRotor -= 360; } - + if(this.isOn && this.power >= powerReq) { this.rotorSpeed = Math.max(0F, Math.min(15F, this.rotorSpeed + 0.05F)); @@ -185,7 +185,7 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece audio.updatePitch(0.25F + 0.75F * rotorSpeed); } else { this.rotorSpeed = Math.max(0F, Math.min(15F, this.rotorSpeed - 0.1F)); - + if(audio != null) { if(this.rotorSpeed > 0) { float rotorSpeed = this.rotorSpeed / 15F; @@ -199,45 +199,45 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece } } } - + protected List connections; - + private void updateConnections() { - + for(DirPos pos : getConPos()) { this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + protected List getConPos() { if(connections != null && !connections.isEmpty()) return connections; - + connections = new ArrayList(); connections.add(new DirPos(xCoord, yCoord + 3, zCoord, ForgeDirection.UP)); connections.add(new DirPos(xCoord, yCoord - 3, zCoord, ForgeDirection.DOWN)); - + Vec3 vec = Vec3.createVectorHelper(5.75, 0, 0); - + for(int i = 0; i < 16; i++) { vec.rotateAroundY((float) (Math.PI / 8)); connections.add(new DirPos(xCoord + (int)vec.xCoord, yCoord + 3, zCoord + (int)vec.zCoord, ForgeDirection.UP)); connections.add(new DirPos(xCoord + (int)vec.xCoord, yCoord - 3, zCoord + (int)vec.zCoord, ForgeDirection.DOWN)); } - + return connections; } - + private void explode() { this.disassemble(); - + if(this.plasma.getTankType() == Fluids.PLASMA_BF) { - + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:weapon.mukeExplosion", 15.0F, 1.0F); ExplosionLarge.spawnShrapnels(worldObj, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, 50); - + ExplosionNT exp = new ExplosionNT(worldObj, null, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, 20F) .addAttrib(ExAttrib.BALEFIRE) .addAttrib(ExAttrib.NOPARTICLE) @@ -246,70 +246,70 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece .overrideResolution(64); exp.doExplosionA(); exp.doExplosionB(false); - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "muke"); data.setBoolean("balefire", true); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 250)); - + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 250)); + } else { Vec3 vec = Vec3.createVectorHelper(5.5, 0, 0); vec.rotateAroundY(worldObj.rand.nextFloat() * (float)Math.PI * 2F); - + worldObj.newExplosion(null, xCoord + 0.5 + vec.xCoord, yCoord + 0.5 + worldObj.rand.nextGaussian() * 1.5D, zCoord + 0.5 + vec.zCoord, 2.5F, true, true); } - + } private void doBreederStuff() { - + if(plasma.getFill() == 0) { this.progress = 0; return; } - + BreederRecipe out = BreederRecipes.getOutput(slots[1]); - + if(slots[1] != null && slots[1].getItem() == ModItems.meteorite_sword_irradiated) out = new BreederRecipe(ModItems.meteorite_sword_fused, 1000); - + if(slots[1] != null && slots[1].getItem() == ModItems.meteorite_sword_fused) out = new BreederRecipe(ModItems.meteorite_sword_baleful, 4000); - + if(out == null) { this.progress = 0; return; } - + if(slots[2] != null && slots[2].stackSize >= slots[2].getMaxStackSize()) { this.progress = 0; return; } - + int level = FusionRecipes.getBreedingLevel(plasma.getTankType()); - + if(out.flux > level) { this.progress = 0; return; } - + progress++; - + if(progress > this.duration) { - + this.progress = 0; - + if(slots[2] != null) { slots[2].stackSize++; } else { slots[2] = out.output.copy(); } - + slots[1].stackSize--; - + if(slots[1].stackSize <= 0) slots[1] = null; - + this.markDirty(); } } @@ -326,35 +326,35 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { - + if(i == 1 && BreederRecipes.getOutput(itemStack) != null) return true; - + return false; } - + private void produceByproduct() { - + ItemStack by = FusionRecipes.getByproduct(plasma.getTankType()); - + if(by == null) return; - + if(slots[4] == null) { slots[4] = by; return; } - + if(slots[4].getItem() == by.getItem() && slots[4].getItemDamage() == by.getItemDamage() && slots[4].stackSize < slots[4].getMaxStackSize()) { slots[4].stackSize++; } } - + public int getShield() { - + if(slots[3] == null || !(slots[3].getItem() instanceof ItemFusionShield)) return 0; - + return ((ItemFusionShield)slots[3].getItem()).maxTemp; } @@ -422,11 +422,11 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece audio = null; } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + this.power = nbt.getLong("power"); this.isOn = nbt.getBoolean("isOn"); this.totalRuntime = nbt.getLong("totalRuntime"); @@ -435,11 +435,11 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece tanks[1].readFromNBT(nbt, "steam"); plasma.readFromNBT(nbt, "plasma"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setLong("power", this.power); nbt.setBoolean("isOn", isOn); nbt.setLong("totalRuntime", this.totalRuntime); @@ -448,12 +448,12 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece tanks[1].writeToNBT(nbt, "steam"); plasma.writeToNBT(nbt, "plasma"); } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord + 0.5 - 8, @@ -464,35 +464,35 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece zCoord + 0.5 + 8 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { return 65536.0D; } - + public void disassemble() { - + MachineITER.drop = false; - + int[][][] layout = TileEntityITERStruct.layout; - + for(int y = 0; y < 5; y++) { for(int x = 0; x < layout[0].length; x++) { for(int z = 0; z < layout[0][0].length; z++) { - + int ly = y > 2 ? 4 - y : y; - + int width = 7; - + if(x == width && y == 0 && z == width) continue; - + int b = layout[ly][x][z]; - + switch(b) { case 1: worldObj.setBlock(xCoord - width + x, yCoord + y - 2, zCoord - width + z, ModBlocks.fusion_conductor, 1, 3); break; case 2: worldObj.setBlock(xCoord - width + x, yCoord + y - 2, zCoord - width + z, ModBlocks.fusion_center); break; @@ -502,14 +502,14 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece } } } - + worldObj.setBlock(xCoord, yCoord - 2, zCoord, ModBlocks.struct_iter_core); - + MachineITER.drop = true; - + List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5).expand(50, 10, 50)); - + for(EntityPlayer player : players) { player.triggerAchievement(MainRegistry.achMeltdown); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java index 7ec5ae47f..c9c23b3eb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java @@ -7,6 +7,7 @@ import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; +import com.hbm.handler.threading.PacketThreading; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMachineArcFurnaceLarge; @@ -22,7 +23,6 @@ import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; @@ -171,7 +171,7 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl data.setFloat("off", 0.625F); data.setFloat("base", 0.625F); data.setFloat("len", Math.max(1F, yCoord + 1 - (float) (Math.ceil(impact.yCoord) - 0.875))); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 2.875D, yCoord + 1, zCoord + 0.5D + dir.offsetZ * 2.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, xCoord + 0.5D + dir.offsetX * 2.875D, yCoord + 1, zCoord + 0.5D + dir.offsetZ * 2.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java index 6ab6585c6..605cd06db 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java @@ -3,6 +3,7 @@ package com.hbm.tileentity.machine; import java.util.HashMap; import java.util.List; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.UpgradeManagerNT; @@ -15,7 +16,6 @@ import com.hbm.inventory.recipes.ArcWelderRecipes.ArcWelderRecipe; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.*; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.I18nUtil; @@ -120,7 +120,7 @@ public class TileEntityMachineArcWelder extends TileEntityMachineBase implements NBTTagCompound dPart = new NBTTagCompound(); dPart.setString("type", worldObj.getTotalWorldTime() % 20 == 0 ? "tau" : "hadron"); dPart.setByte("count", (byte) 5); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(dPart, xCoord + 0.5 - dir.offsetX * 0.5, yCoord + 1.25, zCoord + 0.5 - dir.offsetZ * 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(dPart, xCoord + 0.5 - dir.offsetX * 0.5, yCoord + 1.25, zCoord + 0.5 - dir.offsetZ * 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 25)); } } else { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java index b5bba66f0..af5d11cf7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutosaw.java @@ -5,11 +5,11 @@ import java.util.List; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockTallPlant.EnumTallFlower; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IFluidCopiable; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IBufPacketReceiver; @@ -107,7 +107,7 @@ public class TileEntityMachineAutosaw extends TileEntityLoadedBase implements IB data.setDouble("motion", 0.1D); data.setString("mode", "blockdust"); data.setInteger("block", Block.getIdFromBlock(Blocks.redstone_block)); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY, e.posZ, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY, e.posZ, 50)); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineOreSlopper.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineOreSlopper.java index 35fcc77e6..0c04b8f33 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineOreSlopper.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineOreSlopper.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerOreSlopper; import com.hbm.inventory.fluid.FluidType; @@ -19,7 +20,6 @@ import com.hbm.items.special.ItemBedrockOreNew.BedrockOreType; import com.hbm.lib.Library; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IFluidCopiable; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; @@ -150,7 +150,7 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement vdat.setString("type", "giblets"); vdat.setInteger("ent", e.getEntityId()); vdat.setInteger("cDiv", 5); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(vdat, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY + e.height * 0.5, e.posZ, 150)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(vdat, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY + e.height * 0.5, e.posZ, 150)); worldObj.playSoundEffect(e.posX, e.posY, e.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java index a63acd692..26c0861a7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java @@ -4,6 +4,7 @@ import java.util.Random; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.pollution.PollutionHandler.PollutionType; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.container.ContainerMachineRotaryFurnace; import com.hbm.inventory.fluid.Fluids; @@ -16,7 +17,6 @@ import com.hbm.inventory.recipes.RotaryFurnaceRecipes; import com.hbm.inventory.recipes.RotaryFurnaceRecipes.RotaryFurnaceRecipe; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IConditionalInvAccess; import com.hbm.tileentity.IFluidCopiable; @@ -42,7 +42,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting implements IFluidStandardTransceiver, IGUIProvider, IFluidCopiable, IConditionalInvAccess { - + public FluidTank[] tanks; public boolean isProgressing; public float progress; @@ -51,7 +51,7 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i public boolean isVenting; public MaterialStack output; public static final int maxOutput = MaterialShapes.BLOCK.q(16); - + public int anim; public int lastAnim; @@ -70,12 +70,12 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i @Override public void updateEntity() { - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); - + if(!worldObj.isRemote) { - + tanks[0].setType(3, slots); for(DirPos pos : getSteamPos()) { @@ -85,11 +85,11 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i if(tanks[0].getTankType() != Fluids.NONE) for(DirPos pos : getFluidPos()) { this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - + if(smoke.getFill() > 0) this.sendFluid(smoke, worldObj, xCoord + rot.offsetX, yCoord + 5, zCoord + rot.offsetZ, Library.POS_Y); - + if(this.output != null) { - + int prev = this.output.amount; Vec3 impact = Vec3.createVectorHelper(0, 0, 0); MaterialStack leftover = CrucibleUtil.pourSingleStack(worldObj, xCoord + 0.5D + rot.offsetX * 2.875D, yCoord + 1.25D, zCoord + 0.5D + rot.offsetZ * 2.875D, 6, true, this.output, MaterialShapes.INGOT.q(1), impact); @@ -103,33 +103,33 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i data.setFloat("off", 0.625F); data.setFloat("base", 0.625F); data.setFloat("len", Math.max(1F, yCoord + 1 - (float) (Math.ceil(impact.yCoord) - 1.125))); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D + rot.offsetX * 2.875D, yCoord + 0.75, zCoord + 0.5D + rot.offsetZ * 2.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, xCoord + 0.5D + rot.offsetX * 2.875D, yCoord + 0.75, zCoord + 0.5D + rot.offsetZ * 2.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); } - + if(output.amount <= 0) this.output = null; } - + RotaryFurnaceRecipe recipe = RotaryFurnaceRecipes.getRecipe(slots[0], slots[1], slots[2]); this.isProgressing = false; - + if(recipe != null) { - + if(this.burnTime <= 0 && slots[4] != null && TileEntityFurnace.isItemFuel(slots[4])) { this.maxBurnTime = this.burnTime = TileEntityFurnace.getItemBurnTime(slots[4]) / 2; this.decrStackSize(4, 1); this.markChanged(); } - + if(this.canProcess(recipe)) { this.progress += 1F / recipe.duration; tanks[1].setFill(tanks[1].getFill() - recipe.steam); tanks[2].setFill(tanks[2].getFill() + recipe.steam / 100); this.isProgressing = true; - + if(this.progress >= 1F) { this.progress -= 1F; this.consumeItems(recipe); - + if(this.output == null) { this.output = recipe.output.copy(); } else { @@ -137,31 +137,31 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i } this.markDirty(); } - + } else { this.progress = 0; } } else { this.progress = 0; } - + this.isVenting = false; if(this.burnTime > 0) { this.pollute(PollutionType.SOOT, PollutionHandler.SOOT_PER_SECOND / 10F); this.burnTime--; } - + this.networkPackNT(50); - + } else { - + if(this.burnTime > 0 && MainRegistry.proxy.me().getDistance(xCoord, yCoord, zCoord) < 25) { Random rand = worldObj.rand; worldObj.spawnParticle("flame", xCoord + 0.5 + dir.offsetX * 0.5 + rot.offsetX + rand.nextGaussian() * 0.25, yCoord + 0.375, zCoord + 0.5 + dir.offsetZ * 0.5 + rot.offsetZ + rand.nextGaussian() * 0.25, 0, 0, 0); } if(isVenting && worldObj.getTotalWorldTime() % 2 == 0) { - + NBTTagCompound fx = new NBTTagCompound(); fx.setString("type", "tower"); fx.setFloat("lift", 10F); @@ -191,7 +191,7 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i buf.writeFloat(progress); buf.writeInt(burnTime); buf.writeInt(maxBurnTime); - + if(this.output != null) { buf.writeBoolean(true); buf.writeInt(this.output.material.id); @@ -200,7 +200,7 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i buf.writeBoolean(false); } } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); tanks[0].deserialize(buf); @@ -211,14 +211,14 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i progress = buf.readFloat(); burnTime = buf.readInt(); maxBurnTime = buf.readInt(); - + if(buf.readBoolean()) { this.output = new MaterialStack(Mats.matById.get(buf.readInt()), buf.readInt()); } else { this.output = null; } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -229,7 +229,7 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i this.burnTime = nbt.getInteger("burn"); this.maxBurnTime = nbt.getInteger("maxBurn"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -240,31 +240,31 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i nbt.setInteger("burn", burnTime); nbt.setInteger("maxBurn", maxBurnTime); } - + public DirPos[] getSteamPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); - + return new DirPos[] { new DirPos(xCoord - dir.offsetX * 2 - rot.offsetX * 2, yCoord, zCoord - dir.offsetZ * 2 - rot.offsetZ * 2, dir.getOpposite()), new DirPos(xCoord - dir.offsetX * 2 - rot.offsetX, yCoord, zCoord - dir.offsetZ * 2 - rot.offsetZ, dir.getOpposite()) }; } - + public DirPos[] getFluidPos() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); - + return new DirPos[] { new DirPos(xCoord + dir.offsetX + rot.offsetX * 3, yCoord, zCoord + dir.offsetZ + rot.offsetZ * 3, rot), new DirPos(xCoord - dir.offsetX + rot.offsetX * 3, yCoord, zCoord - dir.offsetZ + rot.offsetZ * 3, rot) }; } - + public boolean canProcess(RotaryFurnaceRecipe recipe) { - + if(this.burnTime <= 0) return false; - + if(recipe.fluid != null) { if(this.tanks[0].getTankType() != recipe.fluid.type) return false; if(this.tanks[0].getFill() < recipe.fluid.fill) return false; @@ -272,19 +272,19 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i if(tanks[1].getFill() < recipe.steam) return false; if(tanks[2].getMaxFill() - tanks[2].getFill() < recipe.steam / 100) return false; - + if(this.output != null) { if(this.output.material != recipe.output.material) return false; if(this.output.amount + recipe.output.amount > this.maxOutput) return false; } - + return true; } - + public void consumeItems(RotaryFurnaceRecipe recipe) { - + for(AStack aStack : recipe.ingredients) { - + for(int i = 0; i < 3; i++) { ItemStack stack = slots[i]; if(aStack.matchesRecipe(stack, true) && stack.stackSize >= aStack.stacksize) { @@ -293,19 +293,19 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i } } } - + if(recipe.fluid != null) { this.tanks[0].setFill(tanks[0].getFill() - recipe.fluid.fill); } } - + @Override public void pollute(PollutionType type, float amount) { FluidTank tank = type == PollutionType.SOOT ? smoke : type == PollutionType.HEAVYMETAL ? smoke_leaded : smoke_poison; - + int fluidAmount = (int) Math.ceil(amount * 100); tank.setFill(tank.getFill() + fluidAmount); - + if(tank.getFill() > tank.getMaxFill()) { int overflow = tank.getFill() - tank.getMaxFill(); tank.setFill(tank.getMaxFill()); @@ -320,12 +320,12 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i @Override public boolean isItemValidForSlot(int x, int y, int z, int slot, ItemStack stack) { return slot < 3 || slot == 4; } @Override public boolean canExtractItem(int x, int y, int z, int slot, ItemStack stack, int side) { return false; } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 2, @@ -336,10 +336,10 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i zCoord + 3 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { @@ -352,7 +352,7 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); BlockPos core = new BlockPos(xCoord, yCoord, zCoord); - + //Red if(side == dir.getOpposite().ordinal() && pos.equals(core.clone().offset(dir, -1).offset(rot, -2))) return new int[] {0}; //Yellow @@ -361,7 +361,7 @@ public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting i if(side == dir.getOpposite().ordinal() && pos.equals(core.clone().offset(dir, -1))) return new int[] {2}; //Fuel if(side == dir.ordinal() && pos.equals(core.clone().offset(dir, 1).offset(rot, -1))) return new int[] {4}; - + return new int[] { }; } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java index bf1c795da..995b449e9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSolderingStation.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; +import com.hbm.handler.threading.PacketThreading; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.RecipesCommon.AStack; @@ -16,7 +17,6 @@ import com.hbm.inventory.recipes.SolderingRecipes.SolderingRecipe; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IFluidCopiable; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; @@ -127,7 +127,7 @@ public class TileEntityMachineSolderingStation extends TileEntityMachineBase imp NBTTagCompound dPart = new NBTTagCompound(); dPart.setString("type", "tau"); dPart.setByte("count", (byte) 3); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(dPart, xCoord + 0.5 - dir.offsetX * 0.5 + rot.offsetX * 0.5, yCoord + 1.125, zCoord + 0.5 - dir.offsetZ * 0.5 + rot.offsetZ * 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 25)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(dPart, xCoord + 0.5 - dir.offsetX * 0.5 + rot.offsetX * 0.5, yCoord + 1.125, zCoord + 0.5 - dir.offsetZ * 0.5 + rot.offsetZ * 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 25)); } } else { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java index 3af43d301..bab03ab96 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java @@ -6,6 +6,7 @@ import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.handler.MultiblockHandlerXR; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMachineTurbofan; import com.hbm.inventory.fluid.Fluids; @@ -19,7 +20,6 @@ import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IFluidCopiable; @@ -203,7 +203,7 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem data.setDouble("mX", -dir.offsetX * speed + deviation); data.setDouble("mZ", -dir.offsetZ * speed + deviation); data.setFloat("scale", 8F); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, this.xCoord + 0.5F - dir.offsetX * (3 - i), this.yCoord + 1.5F, this.zCoord + 0.5F - dir.offsetZ * (3 - i)), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, this.xCoord + 0.5F - dir.offsetX * (3 - i), this.yCoord + 1.5F, this.zCoord + 0.5F - dir.offsetZ * (3 - i)), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); } /*if(this.afterburner > 90 && worldObj.rand.nextInt(60) == 0) { @@ -219,7 +219,7 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem data.setString("type", "gasfire"); data.setDouble("mY", 0.1 * worldObj.rand.nextDouble()); data.setFloat("scale", 4F); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, this.xCoord + 0.5F + dir.offsetX * (worldObj.rand.nextDouble() * 4 - 2) + rot.offsetX * (worldObj.rand.nextDouble() * 2 - 1), this.yCoord + 1F + worldObj.rand.nextDouble() * 2, this.zCoord + 0.5F - dir.offsetZ * (worldObj.rand.nextDouble() * 4 - 2) + rot.offsetZ * (worldObj.rand.nextDouble() * 2 - 1) @@ -272,7 +272,7 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem vdat.setString("type", "giblets"); vdat.setInteger("ent", e.getEntityId()); vdat.setInteger("cDiv", 5); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(vdat, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY + e.height * 0.5, e.posZ, 150)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(vdat, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY + e.height * 0.5, e.posZ, 150)); worldObj.playSoundEffect(e.posX, e.posY, e.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java index a6f591167..5e5280d94 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySawmill.java @@ -5,10 +5,10 @@ import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.entity.projectile.EntitySawblade; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.tileentity.machine.TileEntityMachineAutocrafter.InventoryCraftingAuto; @@ -103,7 +103,7 @@ public class TileEntitySawmill extends TileEntityMachineBase { data.setDouble("motion", 0.1D); data.setString("mode", "blockdust"); data.setInteger("block", Block.getIdFromBlock(Blocks.redstone_block)); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY, e.posZ, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY, e.posZ, 50)); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java index 20852c6e2..741971bb5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityWatz.java @@ -7,6 +7,7 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.entity.projectile.EntityShrapnel; import com.hbm.handler.radiation.ChunkRadiationManager; +import com.hbm.handler.threading.PacketThreading; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerWatz; import com.hbm.inventory.fluid.Fluids; @@ -18,7 +19,6 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemWatzPellet; import com.hbm.items.machine.ItemWatzPellet.EnumWatzType; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IFluidCopiable; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; @@ -46,18 +46,18 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityWatz extends TileEntityMachineBase implements IFluidStandardTransceiver, IControlReceiver, IGUIProvider, IFluidCopiable { - + public FluidTank[] tanks; public int heat; public double fluxLastBase; //flux created by the previous passive emission, only used for display public double fluxLastReaction; //flux created by the previous reaction, used for the next reaction public double fluxDisplay; public boolean isOn; - + /* lock types for item IO */ public boolean isLocked = false; public ItemStack[] locks; - + public TileEntityWatz() { super(24); this.locks = new ItemStack[slots.length]; @@ -74,14 +74,14 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand @Override public void updateEntity() { - + if(!worldObj.isRemote && !updateLock()) { - + boolean turnedOn = worldObj.getBlock(xCoord, yCoord + 3, zCoord) == ModBlocks.watz_pump && worldObj.getIndirectPowerLevelTo(xCoord, yCoord + 5, zCoord, 0) > 0; List segments = new ArrayList(); segments.add(this); this.subscribeToTop(); - + /* accumulate all segments */ for(int y = yCoord - 3; y >= 0; y -= 3) { TileEntity tile = Compat.getTileStandard(worldObj, xCoord, y, zCoord); @@ -91,11 +91,11 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand break; } } - + /* set up shared tanks */ FluidTank[] sharedTanks = new FluidTank[3]; for(int i = 0; i < 3; i++) sharedTanks[i] = new FluidTank(tanks[i].getTankType(), 0); - + for(TileEntityWatz segment : segments) { segment.setupCoolant(); for(int i = 0; i < 3; i++) { @@ -103,13 +103,13 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand sharedTanks[i].setFill(sharedTanks[i].getFill() + segment.tanks[i].getFill()); } } - + //update coolant, bottom to top for(int i = segments.size() - 1; i >= 0; i--) { TileEntityWatz segment = segments.get(i); segment.updateCoolant(sharedTanks); } - + /* update reaction, top to bottom */ this.updateReaction(null, sharedTanks, turnedOn); for(int i = 1; i < segments.size(); i++) { @@ -117,14 +117,14 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand TileEntityWatz above = segments.get(i - 1); segment.updateReaction(above, sharedTanks, turnedOn); } - + /* send sync packets (order doesn't matter) */ for(TileEntityWatz segment : segments) { segment.isOn = turnedOn; this.networkPackNT(25); segment.heat *= 0.99; //cool 1% per tick } - + /* re-distribute fluid from shared tanks back into actual tanks, bottom to top */ for(int i = segments.size() - 1; i >= 0; i--) { TileEntityWatz segment = segments.get(i); @@ -134,9 +134,9 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand segment.tanks[j].setFill(min); } } - + segments.get(segments.size() - 1).sendOutBottom(); - + /* explode on mud overflow */ if(sharedTanks[2].getFill() > 0) { for(int x = -3; x <= 3; x++) { @@ -147,39 +147,39 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand } } this.disassemble(); - + ChunkRadiationManager.proxy.incrementRad(worldObj, xCoord, yCoord + 1, zCoord, 1_000F); - + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 2, zCoord + 0.5, "hbm:block.rbmk_explosion", 50.0F, 1.0F); NBTTagCompound data = new NBTTagCompound(); data.setString("type", "rbmkmush"); data.setFloat("scale", 5); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5, yCoord + 2, zCoord + 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, xCoord + 0.5, yCoord + 2, zCoord + 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 250)); MainRegistry.proxy.effectNT(data); - + return; } } } - + /** basic sanity checking, usually wouldn't do anything except when NBT loading borks */ public void setupCoolant() { tanks[0].setTankType(Fluids.COOLANT); tanks[1].setTankType(tanks[0].getTankType().getTrait(FT_Heatable.class).getFirstStep().typeProduced); } - + public void updateCoolant(FluidTank[] tanks) { - + double coolingFactor = 0.2D; //20% per tick double heatToUse = this.heat * coolingFactor; - + FT_Heatable trait = tanks[0].getTankType().getTrait(FT_Heatable.class); HeatingStep step = trait.getFirstStep(); - + int heatCycles = (int) (heatToUse / step.heatReq); int coolCycles = tanks[0].getFill() / step.amountReq; int hotCycles = (tanks[1].getMaxFill() - tanks[1].getFill()) / step.amountProduced; - + int cycles = Math.min(heatCycles, Math.min(hotCycles, coolCycles)); this.heat -= cycles * step.heatReq; tanks[0].setFill(tanks[0].getFill() - cycles * step.amountReq); @@ -188,34 +188,34 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand /** enforces strict top to bottom update order (instead of semi-random based on placement) */ public void updateReaction(TileEntityWatz above, FluidTank[] tanks, boolean turnedOn) { - + if(turnedOn) { List pellets = new ArrayList(); - + for(int i = 0; i < 24; i++) { ItemStack stack = slots[i]; if(stack != null && stack.getItem() == ModItems.watz_pellet) { pellets.add(stack); } } - + double baseFlux = 0D; - + /* init base flux */ for(ItemStack stack : pellets) { EnumWatzType type = EnumUtil.grabEnumSafely(EnumWatzType.class, stack.getItemDamage()); baseFlux += type.passive; } - + double inputFlux = baseFlux + fluxLastReaction; double addedFlux = 0D; double addedHeat = 0D; - + for(ItemStack stack : pellets) { EnumWatzType type = EnumUtil.grabEnumSafely(EnumWatzType.class, stack.getItemDamage()); Function burnFunc = type.burnFunc; Function heatDiv = type.heatDiv; - + if(burnFunc != null) { double div = heatDiv != null ? heatDiv.effonix(heat) : 1D; double burn = burnFunc.effonix(inputFlux) / div; @@ -225,11 +225,11 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand tanks[2].setFill(tanks[2].getFill() + (int) Math.round(type.mudContent * burn)); } } - + for(ItemStack stack : pellets) { EnumWatzType type = EnumUtil.grabEnumSafely(EnumWatzType.class, stack.getItemDamage()); Function absorbFunc = type.absorbFunc; - + if(absorbFunc != null) { double absorb = absorbFunc.effonix(baseFlux + fluxLastReaction); addedHeat += absorb; @@ -237,38 +237,38 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand tanks[2].setFill(tanks[2].getFill() + (int) Math.round(type.mudContent * absorb)); } } - + this.heat += addedHeat; this.fluxLastBase = baseFlux; this.fluxLastReaction = addedFlux; - + } else { this.fluxLastBase = 0; this.fluxLastReaction = 0; - + } - + for(int i = 0; i < 24; i++) { ItemStack stack = slots[i]; - + /* deplete */ if(stack != null && stack.getItem() == ModItems.watz_pellet && ItemWatzPellet.getEnrichment(stack) <= 0) { slots[i] = new ItemStack(ModItems.watz_pellet_depleted, 1, stack.getItemDamage()); continue; // depleted pellets may persist for one tick } } - + if(above != null) { for(int i = 0; i < 24; i++) { ItemStack stackBottom = slots[i]; ItemStack stackTop = above.slots[i]; - + /* items fall down if the bottom slot is empty */ if(stackBottom == null && stackTop != null) { slots[i] = stackTop.copy(); above.decrStackSize(i, stackTop.stackSize); } - + /* items switch places if the top slot is depleted */ if(stackBottom != null && stackBottom.getItem() == ModItems.watz_pellet && stackTop != null && stackTop.getItem() == ModItems.watz_pellet_depleted) { ItemStack buf = stackTop.copy(); @@ -302,12 +302,12 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand tank.deserialize(buf); } } - + /** Prevent manual updates when another segment is above this one */ public boolean updateLock() { return Compat.getTileStandard(worldObj, xCoord, yCoord + 3, zCoord) instanceof TileEntityWatz; } - + protected void subscribeToTop() { this.trySubscribe(tanks[0].getTankType(), worldObj, xCoord, yCoord + 3, zCoord, ForgeDirection.UP); this.trySubscribe(tanks[0].getTankType(), worldObj, xCoord + 2, yCoord + 3, zCoord, ForgeDirection.UP); @@ -315,15 +315,15 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand this.trySubscribe(tanks[0].getTankType(), worldObj, xCoord, yCoord + 3, zCoord + 2, ForgeDirection.UP); this.trySubscribe(tanks[0].getTankType(), worldObj, xCoord, yCoord + 3, zCoord - 2, ForgeDirection.UP); } - + protected void sendOutBottom() { - + for(DirPos pos : getSendingPos()) { if(tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); if(tanks[2].getFill() > 0) this.sendFluid(tanks[2], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } } - + protected DirPos[] getSendingPos() { return new DirPos[] { new DirPos(xCoord, yCoord - 1, zCoord, ForgeDirection.DOWN), @@ -333,13 +333,13 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand new DirPos(xCoord, yCoord - 1, zCoord - 2, ForgeDirection.DOWN) }; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTTagList list = nbt.getTagList("locks", 10); - + for(int i = 0; i < list.tagCount(); i++) { NBTTagCompound nbt1 = list.getCompoundTagAt(i); byte b0 = nbt1.getByte("slot"); @@ -347,21 +347,21 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand locks[b0] = ItemStack.loadItemStackFromNBT(nbt1); } } - + for(int i = 0; i < tanks.length; i++) tanks[i].readFromNBT(nbt, "t" + i); this.heat = nbt.getInteger("heat"); this.fluxLastBase = nbt.getDouble("lastFluxB"); this.fluxLastReaction = nbt.getDouble("lastFluxR"); - + this.isLocked = nbt.getBoolean("isLocked"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + NBTTagList list = new NBTTagList(); - + for(int i = 0; i < locks.length; i++) { if(locks[i] != null) { NBTTagCompound nbt1 = new NBTTagCompound(); @@ -371,12 +371,12 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand } } nbt.setTag("locks", list); - + for(int i = 0; i < tanks.length; i++) tanks[i].writeToNBT(nbt, "t" + i); nbt.setInteger("heat", this.heat); nbt.setDouble("lastFluxB", fluxLastBase); nbt.setDouble("lastFluxR", fluxLastReaction); - + nbt.setBoolean("isLocked", isLocked); } @@ -387,9 +387,9 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand @Override public void receiveControl(NBTTagCompound data) { - + if(data.hasKey("lock")) { - + if(this.isLocked) { this.locks = new ItemStack[slots.length]; } else { @@ -397,7 +397,7 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand this.locks[i] = slots[i]; } } - + this.isLocked = !this.isLocked; this.markChanged(); } @@ -409,7 +409,7 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand if(!this.isLocked) return true; return this.locks[i] != null && this.locks[i].getItem() == stack.getItem() && locks[i].getItemDamage() == stack.getItemDamage(); } - + @Override public int[] getAccessibleSlotsFromSide(int side) { return new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}; @@ -426,10 +426,10 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand } AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 3, @@ -440,16 +440,16 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand zCoord + 4 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { return 65536.0D; } - + private void disassemble() { int count = 20; @@ -469,7 +469,7 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand worldObj.setBlock(xCoord, yCoord, zCoord, ModBlocks.mud_block); worldObj.setBlock(xCoord, yCoord + 1, zCoord, ModBlocks.mud_block); worldObj.setBlock(xCoord, yCoord + 2, zCoord, ModBlocks.mud_block); - + setBrokenColumn(0, ModBlocks.watz_element, 0, 1, 0); setBrokenColumn(0, ModBlocks.watz_element, 0, 2, 0); setBrokenColumn(0, ModBlocks.watz_element, 0, 0, 1); @@ -490,7 +490,7 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand setBrokenColumn(0, ModBlocks.watz_cooler, 0, -2, -1); setBrokenColumn(0, ModBlocks.watz_cooler, 0, 1, -2); setBrokenColumn(0, ModBlocks.watz_cooler, 0, -1, -2); - + for(int j = -1; j < 2; j++) { setBrokenColumn(1, ModBlocks.watz_end, 1, 3, j); setBrokenColumn(1, ModBlocks.watz_end, 1, j, 3); @@ -501,20 +501,20 @@ public class TileEntityWatz extends TileEntityMachineBase implements IFluidStand setBrokenColumn(1, ModBlocks.watz_end, 1, 2, -2); setBrokenColumn(1, ModBlocks.watz_end, 1, -2, 2); setBrokenColumn(1, ModBlocks.watz_end, 1, -2, -2); - + List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5).expand(50, 50, 50)); - + for(EntityPlayer player : players) { player.triggerAchievement(MainRegistry.achWatzBoom); } } - + private void setBrokenColumn(int minHeight, Block b, int meta, int x, int z) { - + int height = minHeight + worldObj.rand.nextInt(3 - minHeight); - + for(int i = 0; i < 3; i++) { - + if(i <= height) { worldObj.setBlock(xCoord + x, yCoord + i, zCoord + z, b, meta, 3); } else { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityZirnoxDestroyed.java b/src/main/java/com/hbm/tileentity/machine/TileEntityZirnoxDestroyed.java index 562109830..e24fc2318 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityZirnoxDestroyed.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityZirnoxDestroyed.java @@ -2,8 +2,8 @@ package com.hbm.tileentity.machine; import java.util.List; +import com.hbm.handler.threading.PacketThreading; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ContaminationUtil; import com.hbm.util.ContaminationUtil.ContaminationType; @@ -21,34 +21,34 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; public class TileEntityZirnoxDestroyed extends TileEntity { - + public boolean onFire = true; - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); onFire = nbt.getBoolean("fire"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setBoolean("onFire", onFire); } - + @Override public void updateEntity() { if(!worldObj.isRemote) { radiate(worldObj, this.xCoord, this.yCoord, this.zCoord); - + if(this.worldObj.rand.nextInt(5000) == 0) onFire = false; - + if(onFire && this.worldObj.getTotalWorldTime() % 50 == 0) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "rbmkflame"); data.setInteger("maxAge", 90); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.25 + worldObj.rand.nextDouble() * 0.5, yCoord + 1.75, zCoord + 0.25 + worldObj.rand.nextDouble() * 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1.75, zCoord + 0.5, 75)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, xCoord + 0.25 + worldObj.rand.nextDouble() * 0.5, yCoord + 1.75, zCoord + 0.25 + worldObj.rand.nextDouble() * 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1.75, zCoord + 0.5, 75)); MainRegistry.proxy.effectNT(data); worldObj.playSoundEffect(xCoord + 0.5F, yCoord + 0.5, zCoord + 0.5, "fire.fire", 1.0F + worldObj.rand.nextFloat(), worldObj.rand.nextFloat() * 0.7F + 0.3F); } @@ -102,4 +102,4 @@ public class TileEntityZirnoxDestroyed extends TileEntity { public double getMaxRenderDistanceSquared() { return 65536.0D; } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java index 2d44341e6..c5480f753 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java @@ -2,7 +2,7 @@ package com.hbm.tileentity.machine.pile; import com.hbm.blocks.ModBlocks; import com.hbm.config.GeneralConfig; -import com.hbm.packet.PacketDispatcher; +import com.hbm.handler.threading.PacketThreading; import com.hbm.packet.toclient.AuxParticlePacketNT; import api.hbm.block.IPileNeutronReceiver; @@ -37,7 +37,7 @@ public class TileEntityPileFuel extends TileEntityPileBase implements IPileNeutr data.setString("type", "vanillaExt"); data.setString("mode", "smoke"); data.setDouble("mY", 0.05); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.25 + worldObj.rand.nextDouble() * 0.5, yCoord + 1, zCoord + 0.25 + worldObj.rand.nextDouble() * 0.5), + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, xCoord + 0.25 + worldObj.rand.nextDouble() * 0.5, yCoord + 1, zCoord + 0.25 + worldObj.rand.nextDouble() * 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 20)); } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java index 8ee80176b..a0576f2b7 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKBase.java @@ -10,8 +10,8 @@ import com.hbm.entity.projectile.EntityRBMKDebris; import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType; import com.hbm.handler.neutron.NeutronNodeWorld; import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKType; +import com.hbm.handler.threading.PacketThreading; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.saveddata.TomSaveData; import com.hbm.tileentity.IBufPacketReceiver; @@ -524,7 +524,7 @@ public abstract class TileEntityRBMKBase extends TileEntityLoadedBase implements NBTTagCompound data = new NBTTagCompound(); data.setString("type", "rbmkmush"); data.setFloat("scale", smallDim); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, avgX + 0.5, yCoord + 1, avgZ + 0.5), new TargetPoint(worldObj.provider.dimensionId,avgX + 0.5, yCoord + 1, avgZ + 0.5, 250)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, avgX + 0.5, yCoord + 1, avgZ + 0.5), new TargetPoint(worldObj.provider.dimensionId,avgX + 0.5, yCoord + 1, avgZ + 0.5, 250)); MainRegistry.proxy.effectNT(data); worldObj.playSoundEffect(avgX + 0.5, yCoord + 1, avgZ + 0.5, "hbm:block.rbmk_explosion", 50.0F, 1.0F); diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java index 3bdf405c2..e7583d91a 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java @@ -14,6 +14,8 @@ public abstract class TileEntityCrateBase extends TileEntityLockableBase impleme protected ItemStack slots[]; public String customName; + public boolean hasSpiders = false; + public TileEntityCrateBase(int count) { slots = new ItemStack[count]; } @@ -108,7 +110,7 @@ public abstract class TileEntityCrateBase extends TileEntityLockableBase impleme public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTTagList list = nbt.getTagList("items", 10); - + slots = new ItemStack[getSizeInventory()]; for (int i = 0; i < list.tagCount(); i++) { @@ -118,12 +120,13 @@ public abstract class TileEntityCrateBase extends TileEntityLockableBase impleme slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); } } + this.hasSpiders = nbt.getBoolean("spiders"); } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + NBTTagList list = new NBTTagList(); for (int i = 0; i < slots.length; i++) { @@ -135,6 +138,7 @@ public abstract class TileEntityCrateBase extends TileEntityLockableBase impleme } } nbt.setTag("items", list); + nbt.setBoolean("spiders", hasSpiders); } @Override @@ -153,4 +157,9 @@ public abstract class TileEntityCrateBase extends TileEntityLockableBase impleme public boolean canExtractItem(int i, ItemStack itemStack, int j) { return !this.isLocked(); } + + // Spiders!!! + public void fillWithSpiders() { + this.hasSpiders = true; + } } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java index 7c514664b..53b035310 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java @@ -7,6 +7,7 @@ import com.hbm.explosion.vanillant.ExplosionVNT; import com.hbm.extprop.HbmPlayerProps; import com.hbm.handler.CompatHandler.OCComponent; import com.hbm.handler.MultiblockHandlerXR; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.OreDictManager; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.OreDictStack; @@ -19,7 +20,6 @@ import com.hbm.inventory.gui.GUIMachineFluidTank; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.*; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ParticleUtil; @@ -49,7 +49,7 @@ import java.util.Random; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")}) public class TileEntityMachineFluidTank extends TileEntityMachineBase implements SimpleComponent, OCComponent, IFluidStandardTransceiver, IPersistentNBT, IOverpressurable, IGUIProvider, IRepairable, IFluidCopiable{ - + public FluidTank tank; public short mode = 0; public static final short modes = 4; @@ -58,9 +58,9 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements public boolean onFire = false; public byte lastRedstone = 0; public Explosion lastExplosion = null; - + public int age = 0; - + public TileEntityMachineFluidTank() { super(6); tank = new FluidTank(Fluids.NONE, 256000); @@ -81,7 +81,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements public void updateEntity() { if(!worldObj.isRemote) { - + //meta below 12 means that it's an old multiblock configuration if(this.getBlockMetadata() < 12) { //get old direction @@ -97,19 +97,19 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements worldObj.getTileEntity(xCoord, yCoord, zCoord).readFromNBT(data); return; } - + if(!hasExploded) { age++; - + if(age >= 20) { age = 0; this.markChanged(); } - + this.sendingBrake = true; tank.setFill(TileEntityBarrel.transmitFluidFairly(worldObj, tank, this, tank.getFill(), this.mode == 0 || this.mode == 1, this.mode == 1 || this.mode == 2, getConPos())); this.sendingBrake = false; - + tank.loadTank(2, 3, slots); tank.setType(0, 1, slots); } else { @@ -129,11 +129,11 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements this.explode(); this.tank.setFill(0); } - + if(tank.getTankType().hasTrait(FT_Corrosive.class) && tank.getTankType().getTrait(FT_Corrosive.class).isHighlyCorrosive()) { this.explode(); } - + if(this.hasExploded) { int leaking = 0; @@ -144,20 +144,20 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements } else { leaking = Math.min(tank.getFill(), tank.getMaxFill() / 10000); } - + updateLeak(leaking); } } - + tank.unloadTank(4, 5, slots); - + this.networkPackNT(150); } - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 2.875, zCoord + 1).offset(dir.offsetX * 0.5 - rot.offsetX * 2.25, 0, dir.offsetZ * 0.5 - rot.offsetZ * 2.25)); - + for(EntityPlayer player : players) { HbmPlayerProps props = HbmPlayerProps.getData(player); props.isOnLadder = true; @@ -171,7 +171,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements buf.writeBoolean(hasExploded); tank.serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -179,39 +179,39 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements hasExploded = buf.readBoolean(); tank.deserialize(buf); } - + /** called when the tank breaks due to hazardous materials or external force, can be used to quickly void part of the tank or spawn a mushroom cloud */ public void explode() { this.hasExploded = true; this.onFire = tank.getTankType().hasTrait(FT_Flammable.class); this.markChanged(); } - + /** called every tick post explosion, used for leaking fluid and spawning particles */ public void updateLeak(int amount) { if(!hasExploded) return; if(amount <= 0) return; - + this.tank.getTankType().onFluidRelease(this, tank, amount); this.tank.setFill(Math.max(0, this.tank.getFill() - amount)); - + FluidType type = tank.getTankType(); - + if(type.hasTrait(FT_Amat.class)) { new ExplosionVNT(worldObj, xCoord + 0.5, yCoord + 1.5, zCoord + 0.5, 5F).makeAmat().setBlockAllocator(null).setBlockProcessor(null).explode(); - + } else if(type.hasTrait(FT_Flammable.class) && onFire) { List affected = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(xCoord - 1.5, yCoord, zCoord - 1.5, xCoord + 2.5, yCoord + 5, zCoord + 2.5)); for(Entity e : affected) e.setFire(5); Random rand = worldObj.rand; ParticleUtil.spawnGasFlame(worldObj, xCoord + rand.nextDouble(), yCoord + 0.5 + rand.nextDouble(), zCoord + rand.nextDouble(), rand.nextGaussian() * 0.2, 0.1, rand.nextGaussian() * 0.2); - + if(worldObj.getTotalWorldTime() % 5 == 0) { FT_Polluting.pollute(worldObj, xCoord, yCoord, zCoord, tank.getTankType(), FluidReleaseType.BURN, amount * 5); } - + } else if(type.hasTrait(FT_Gaseous.class) || type.hasTrait(FT_Gaseous_ART.class)) { - + if(worldObj.getTotalWorldTime() % 5 == 0) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "tower"); @@ -220,7 +220,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements data.setFloat("max", 5F); data.setInteger("life", 100 + worldObj.rand.nextInt(20)); data.setInteger("color", tank.getTankType().getColor()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5, yCoord + 1, zCoord + 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, xCoord + 0.5, yCoord + 1, zCoord + 0.5), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); } if(worldObj.getTotalWorldTime() % 5 == 0 ) { @@ -231,7 +231,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements @Override public void explode(World world, int x, int y, int z) { - + if(this.hasExploded) return; this.onFire = tank.getTankType().hasTrait(FT_Flammable.class); this.hasExploded = true; @@ -241,7 +241,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements @Override public void tryExtinguish(World world, int x, int y, int z, EnumExtinguishType type) { if(!this.hasExploded || !this.onFire) return; - + if(type == EnumExtinguishType.WATER) { if(tank.getTankType().hasTrait(FT_Liquid.class)) { // extinguishing oil with water is a terrible idea! worldObj.newExplosion(null, xCoord + 0.5, yCoord + 1.5, zCoord + 0.5, 5F, true, true); @@ -251,13 +251,13 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements return; } } - + if(type == EnumExtinguishType.FOAM || type == EnumExtinguishType.CO2) { this.onFire = false; this.markChanged(); } } - + protected DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord + 2, yCoord, zCoord - 1, Library.POS_X), @@ -270,17 +270,17 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements new DirPos(xCoord + 1, yCoord, zCoord - 2, Library.NEG_Z) }; } - + public void handleButtonPacket(int value, int meta) { mode = (short) ((mode + 1) % modes); this.markChanged(); } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 2, @@ -291,30 +291,30 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements zCoord + 3 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { return 65536.0D; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + mode = nbt.getShort("mode"); tank.readFromNBT(nbt, "tank"); hasExploded = nbt.getBoolean("exploded"); onFire = nbt.getBoolean("onFire"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setShort("mode", mode); tank.writeToNBT(nbt, "tank"); nbt.setBoolean("exploded", hasExploded); @@ -330,12 +330,12 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements @Override public long getDemand(FluidType type, int pressure) { - + if(this.mode == 2 || this.mode == 3 || this.sendingBrake) return 0; - + if(tank.getPressure() != pressure) return 0; - + return type == tank.getTankType() ? tank.getMaxFill() - tank.getFill() : 0; } @@ -401,14 +401,14 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements public boolean isDamaged() { return this.hasExploded; } - + List repair = new ArrayList<>(); @Override public List getRepairMaterials() { - + if(!repair.isEmpty()) return repair; - + repair.add(new OreDictStack(OreDictManager.STEEL.plate(), 6)); return repair; } @@ -474,4 +474,4 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements } throw new NoSuchMethodException(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java index 60d4fc53d..c3cd4e131 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java @@ -5,13 +5,13 @@ import java.util.List; import com.hbm.entity.projectile.EntityArtilleryShell; import com.hbm.handler.CasingEjector; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.container.ContainerTurretBase; import com.hbm.inventory.gui.GUITurretArty; import com.hbm.items.ModItems; import com.hbm.items.weapon.ItemAmmoArty; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; @@ -32,7 +32,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implements IGUIProvider { - + public short mode = 0; public static final short MODE_ARTILLERY = 0; public static final short MODE_CANNON = 1; @@ -41,23 +41,23 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen private boolean retracting = false; public double barrelPos = 0; public double lastBarrelPos = 0; - + @Override @SideOnly(Side.CLIENT) public List getAmmoTypesForDisplay() { - + if(ammoStacks != null) return ammoStacks; - + ammoStacks = new ArrayList(); List list = new ArrayList(); ModItems.ammo_arty.getSubItems(ModItems.ammo_arty, MainRegistry.weaponTab, list); this.ammoStacks.addAll(list); - + return ammoStacks; } - + @Override protected List getAmmoList() { return new ArrayList(); @@ -82,7 +82,7 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen public double getAcceptableInaccuracy() { return 0; } - + @Override public double getHeightOffset() { return 3D; @@ -92,7 +92,7 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen public double getDecetorRange() { return this.mode == this.MODE_CANNON ? 250D : 3000D; } - + @Override public double getDecetorGrace() { return this.mode == this.MODE_CANNON ? 32D : 250D; @@ -107,7 +107,7 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen public double getTurretPitchSpeed() { return 0.5D; } - + @Override public double getTurretDepression() { return 30D; @@ -117,7 +117,7 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen public double getTurretElevation() { return 90D; } - + @Override public int getDecetorInterval() { return mode == MODE_CANNON ? 20 : 200; @@ -127,12 +127,12 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen public boolean doLOSCheck() { return this.mode == this.MODE_CANNON; } - + @Override protected void alignTurret() { Vec3 pos = this.getTurretPos(); - + Vec3 barrel = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); barrel.rotateAroundZ((float) -this.rotationPitch); barrel.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); @@ -145,10 +145,10 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen pos.xCoord += barrel.xCoord; pos.yCoord += barrel.yCoord; pos.zCoord += barrel.zCoord; - + Vec3 delta = Vec3.createVectorHelper(tPos.xCoord - pos.xCoord, tPos.yCoord - pos.yCoord, tPos.zCoord - pos.zCoord); double targetYaw = -Math.atan2(delta.xCoord, delta.zCoord); - + double x = Math.sqrt(delta.xCoord * delta.xCoord + delta.zCoord * delta.zCoord); double y = delta.yCoord; double v0 = getV0(); @@ -156,16 +156,16 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen double g = 9.81 * 0.05; double upperLower = mode == MODE_CANNON ? -1 : 1; double targetPitch = Math.atan((v02 + Math.sqrt(v02*v02 - g*(g*x*x + 2*y*v02)) * upperLower) / (g*x)); - + this.turnTowardsAngle(targetPitch, targetYaw); } - + public double getV0() { return mode == MODE_CANNON ? 20D : 50D; } - + public ItemStack getShellLoaded() { - + for(int i = 1; i < 10; i++) { if(slots[i] != null) { if(slots[i].getItem() == ModItems.ammo_arty) { @@ -173,69 +173,69 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen } } } - + return null; } - + public void conusmeAmmo(Item ammo) { - + for(int i = 1; i < 10; i++) { if(slots[i] != null && slots[i].getItem() == ammo) { this.decrStackSize(i, 1); return; } } - + this.markDirty(); } public void spawnShell(ItemStack type) { - + Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - + EntityArtilleryShell proj = new EntityArtilleryShell(worldObj); proj.setPositionAndRotation(pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord, 0.0F, 0.0F); proj.setThrowableHeading(vec.xCoord, vec.yCoord, vec.zCoord, (float) getV0(), 0.0F); proj.setTarget((int) tPos.xCoord, (int) tPos.yCoord, (int) tPos.zCoord); proj.setType(type.getItemDamage()); - + if(type.getItemDamage() == 8 && type.hasTagCompound()) { NBTTagCompound cargo = type.stackTagCompound.getCompoundTag("cargo"); - + if(cargo != null) { proj.setCargo(ItemStack.loadItemStackFromNBT(cargo)); } } - + if(this.mode != this.MODE_CANNON) proj.setWhistle(true); - + worldObj.spawnEntityInWorld(proj); - + casingDelay = this.casingDelay(); } - + @Override public int casingDelay() { return 7; } - + @Override public void updateEntity() { - + if(worldObj.isRemote) { this.lastBarrelPos = this.barrelPos; - + if(this.retracting) { this.barrelPos += 0.5; - + if(this.barrelPos >= 1) { this.retracting = false; } - + } else { this.barrelPos -= 0.05; if(this.barrelPos < 0) { @@ -247,7 +247,7 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen this.rotationPitch = this.syncRotationPitch; this.rotationYaw = this.syncRotationYaw; } - + if(!worldObj.isRemote) { if(this.mode == this.MODE_MANUAL) { if(!this.targetQueue.isEmpty()) { @@ -256,22 +256,22 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen } else { this.targetQueue.clear(); } - + this.aligned = false; - + this.updateConnections(); - + if(this.target != null && !target.isEntityAlive()) { this.target = null; this.stattrak++; } - + if(target != null && this.mode != this.MODE_MANUAL) { if(!this.entityInLOS(this.target)) { this.target = null; } } - + if(target != null) { this.tPos = this.getEntityPos(target); } else { @@ -279,60 +279,60 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen this.tPos = null; } } - + if(isOn() && hasPower()) { - + if(tPos != null) this.alignTurret(); } else { this.target = null; this.tPos = null; } - + if(!isOn()) this.targetQueue.clear(); - + if(this.target != null && !target.isEntityAlive()) { this.target = null; this.tPos = null; this.stattrak++; } - + if(isOn() && hasPower()) { searchTimer--; - + this.setPower(this.getPower() - this.getConsumption()); - + if(searchTimer <= 0) { searchTimer = this.getDecetorInterval(); - + if(this.target == null && this.mode != this.MODE_MANUAL) this.seekNewTarget(); } } else { searchTimer = 0; } - + if(this.aligned) { this.updateFiringTick(); } - + this.power = Library.chargeTEFromItems(slots, 10, this.power, this.getMaxPower()); this.networkPackNT(250); - + this.didJustShoot = false; - + if(casingDelay > 0) { casingDelay--; } else { spawnCasing(); } - + } else { - + //this will fix the interpolation error when the turret crosses the 360° point if(Math.abs(this.lastRotationYaw - this.rotationYaw) > Math.PI) { - + if(this.lastRotationYaw < this.rotationYaw) this.lastRotationYaw += Math.PI * 2; else @@ -342,18 +342,18 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen } int timer; - + @Override public void updateFiringTick() { - + timer++; - + int delay = mode == MODE_ARTILLERY ? 300 : 40; - + if(timer % delay == 0) { - + ItemStack conf = this.getShellLoaded(); - + if(conf != null) { cachedCasingConfig = ItemAmmoArty.itemTypes[conf.getItemDamage()].casing; this.spawnShell(conf); @@ -364,15 +364,15 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); this.didJustShoot = true; - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaExt"); data.setString("mode", "largeexplode"); data.setFloat("size", 0F); data.setByte("count", (byte)5); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); } - + if(this.mode == this.MODE_MANUAL && !this.targetQueue.isEmpty()) { this.targetQueue.remove(0); this.tPos = null; @@ -381,7 +381,7 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen } protected static CasingEjector ejector = new CasingEjector().setMotion(0, 0.6, -1).setAngleRange(0.1F, 0.1F); - + @Override protected CasingEjector getEjector() { return ejector; @@ -398,10 +398,10 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen this.mode++; if(this.mode > 2) this.mode = 0; - + this.tPos = null; this.targetQueue.clear(); - + } else{ super.handleButtonPacket(value, meta); } @@ -420,27 +420,27 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen this.mode = buf.readShort(); this.retracting = buf.readBoolean(); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + this.mode = nbt.getShort("mode"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setShort("mode", this.mode); } - + @Override protected void spawnCasing() { - + if(cachedCasingConfig == null) return; CasingEjector ej = getEjector(); - + Vec3 spawn = this.getCasingSpawnPos(); NBTTagCompound data = new NBTTagCompound(); data.setString("type", "casing"); @@ -449,8 +449,8 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen data.setBoolean("crouched", false); data.setString("name", cachedCasingConfig.getName()); if(ej != null) data.setInteger("ej", ej.getId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, spawn.xCoord, spawn.yCoord, spawn.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, spawn.xCoord, spawn.yCoord, spawn.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + cachedCasingConfig = null; } diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java index c5e41d3b7..18b960f67 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java @@ -13,6 +13,7 @@ import com.hbm.entity.projectile.EntityBulletBaseMK4; import com.hbm.entity.train.EntityRailCarBase; import com.hbm.handler.CasingEjector; import com.hbm.handler.CompatHandler; +import com.hbm.handler.threading.PacketThreading; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.container.ContainerTurretBase; @@ -20,7 +21,6 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemTurretBiometry; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.lib.Library; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.SpentCasing; import com.hbm.tileentity.IGUIProvider; @@ -879,7 +879,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple data.setBoolean("crouched", false); data.setString("name", cachedCasingConfig.getName()); if(ej != null) data.setInteger("ej", ej.getId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, spawn.xCoord, spawn.yCoord, spawn.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, spawn.xCoord, spawn.yCoord, spawn.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); cachedCasingConfig = null; } diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretChekhov.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretChekhov.java index f7dd78176..f765987c8 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretChekhov.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretChekhov.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.List; import com.hbm.handler.CasingEjector; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.gui.GUITurretChekhov; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.factory.XFactory50; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -21,7 +21,7 @@ import net.minecraft.world.World; public class TileEntityTurretChekhov extends TileEntityTurretBaseNT { static List configs = new ArrayList(); - + //because cramming it into the ArrayList's constructor with nested curly brackets and all that turned out to be not as pretty //also having a floaty `static` like this looks fun //idk if it's just me though @@ -32,7 +32,7 @@ public class TileEntityTurretChekhov extends TileEntityTurretBaseNT { configs.add(XFactory50.bmg50_ap.id); configs.add(XFactory50.bmg50_du.id); } - + @Override protected List getAmmoList() { return configs; @@ -62,107 +62,107 @@ public class TileEntityTurretChekhov extends TileEntityTurretBaseNT { public double getAcceptableInaccuracy() { return 15; } - + int timer; @Override public void updateFiringTick() { - + timer++; - + if(timer > 20 && timer % getDelay() == 0) { - + BulletConfig conf = this.getFirstConfigLoaded(); - + if(conf != null) { this.cachedCasingConfig = conf.casing; this.spawnBullet(conf, 10F); this.conusmeAmmo(conf.ammo); this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.chekhov_fire", 2.0F, 1.0F); - + Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaExt"); data.setString("mode", "largeexplode"); data.setFloat("size", 1.5F); data.setByte("count", (byte)1); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); } } } @Override protected Vec3 getCasingSpawnPos() { - + Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(-1.125, 0.125, 0.25); vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - + return Vec3.createVectorHelper(pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord); } protected static CasingEjector ejector = new CasingEjector().setMotion(-0.8, 0.8, 0).setAngleRange(0.1F, 0.1F); - + @Override protected CasingEjector getEjector() { return ejector; } - + public int getDelay() { return 2; } - + public float spin; public float lastSpin; private float accel; private boolean manual; - + @Override public void updateEntity() { super.updateEntity(); - + if(worldObj.isRemote) { - + if(this.tPos != null || manual) { this.accel = Math.min(45F, this.accel += 2); } else { this.accel = Math.max(0F, this.accel -= 2); } - + manual = false; - + this.lastSpin = this.spin; this.spin += this.accel; - + if(this.spin >= 360F) { this.spin -= 360F; this.lastSpin -= 360F; } } else { - + if(this.tPos == null && !manual) { - + this.timer--; - + if(timer > 20) timer = 20; - + if(timer < 0) timer = 0; } } } - + @Override public void manualSetup() { manual = true; } - + @Override public boolean usesCasings() { return true; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java index ccd00b3e1..650308411 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretFritz.java @@ -5,6 +5,7 @@ import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.entity.projectile.EntityBulletBaseMK4; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; @@ -15,7 +16,6 @@ import com.hbm.inventory.gui.GUITurretFritz; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.factory.XFactoryFlamer; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import api.hbm.fluid.IFluidStandardReceiver; @@ -32,14 +32,14 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class TileEntityTurretFritz extends TileEntityTurretBaseNT implements IFluidStandardReceiver, IFluidCopiable { - + public FluidTank tank; - + public TileEntityTurretFritz() { super(); this.tank = new FluidTank(Fluids.DIESEL, 16000); } - + @Override public String getName() { return "container.turretFritz"; @@ -52,28 +52,28 @@ public class TileEntityTurretFritz extends TileEntityTurretBaseNT implements IFl @SideOnly(Side.CLIENT) public List getAmmoTypesForDisplay() { - + if(ammoStacks != null) return ammoStacks; - + ammoStacks = new ArrayList(); ammoStacks.add(new ItemStack(ModItems.ammo_standard, 1, EnumAmmo.FLAME_DIESEL.ordinal())); - + for(FluidType type : Fluids.getInNiceOrder()) { if(type.hasTrait(FT_Combustible.class) && type.hasTrait(FT_Liquid.class)) { ammoStacks.add(new ItemStack(ModItems.fluid_icon, 1, type.getID())); } } - + return ammoStacks; } - + @Override public double getDecetorRange() { return 32D; } - + @Override public double getDecetorGrace() { return 2D; @@ -101,46 +101,46 @@ public class TileEntityTurretFritz extends TileEntityTurretBaseNT implements IFl @Override public void updateFiringTick() { - + if(this.tank.getTankType().hasTrait(FT_Flammable.class) && this.tank.getTankType().hasTrait(FT_Liquid.class) && this.tank.getFill() >= 2) { - + FT_Flammable trait = this.tank.getTankType().getTrait(FT_Flammable.class); this.tank.setFill(this.tank.getFill() - 2); - + Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - + EntityBulletBaseMK4 proj = new EntityBulletBaseMK4(worldObj, XFactoryFlamer.flame_nograv, (float) (trait.getHeatEnergy() / 500_000F), 0.05F, (float) rotationYaw, (float) rotationPitch); proj.setPositionAndRotation(pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord, proj.rotationYaw, proj.rotationPitch); worldObj.spawnEntityInWorld(proj); - + worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:weapon.flamethrowerShoot", 2F, 1F + worldObj.rand.nextFloat() * 0.5F); - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaburst"); data.setString("mode", "flame"); data.setInteger("count", 2); data.setDouble("motion", 0.025D); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); } } - + public int getDelay() { return 2; } - + @Override public void updateEntity() { super.updateEntity(); - + if(!worldObj.isRemote) { tank.setType(9, 9, slots); tank.loadTank(0, 1, slots); - + for(int i = 1; i < 10; i++) { - + if(slots[i] != null && slots[i].getItem() == ModItems.ammo_standard && slots[i].getItemDamage() == EnumAmmo.FLAME_DIESEL.ordinal()) { if(this.tank.getTankType() == Fluids.DIESEL && this.tank.getFill() + 1000 <= this.tank.getMaxFill()) { this.tank.setFill(this.tank.getFill() + 1000); @@ -186,13 +186,13 @@ public class TileEntityTurretFritz extends TileEntityTurretBaseNT implements IFl this.trySubscribe(tank.getTankType(), worldObj, xCoord + dir.offsetX * 2 + rot.offsetX * 0, yCoord, zCoord + dir.offsetZ * 2 + rot.offsetZ * 0, dir); this.trySubscribe(tank.getTankType(), worldObj, xCoord + dir.offsetX * 2 + rot.offsetX * -1, yCoord, zCoord + dir.offsetZ * 2 + rot.offsetZ * -1, dir); } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.tank.readFromNBT(nbt, "diesel"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHoward.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHoward.java index 71993d569..e9348bdbb 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHoward.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHoward.java @@ -6,11 +6,11 @@ import java.util.List; import com.hbm.config.WeaponConfig; import com.hbm.handler.CasingEjector; import com.hbm.handler.guncfg.GunDGKFactory; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.gui.GUITurretHoward; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.factory.XFactoryTurret; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.particle.SpentCasing; import com.hbm.util.EntityDamageUtil; @@ -26,11 +26,11 @@ import net.minecraft.world.World; public class TileEntityTurretHoward extends TileEntityTurretBaseNT { static List configs = new ArrayList(); - + static { configs.add(XFactoryTurret.dgk_normal.id); } - + @Override protected List getAmmoList() { return configs; @@ -95,27 +95,27 @@ public class TileEntityTurretHoward extends TileEntityTurretBaseNT { int timer; public float spin; public float lastSpin; - + @Override public void updateEntity() { - + if(worldObj.isRemote) { - + this.lastSpin = this.spin; - + if(this.tPos != null) { this.spin += 45; } - + if(this.spin >= 360F) { this.spin -= 360F; this.lastSpin -= 360F; } } else { - + if(loaded <= 0) { BulletConfig conf = this.getFirstConfigLoaded(); - + if(conf != null) { this.conusmeAmmo(conf.ammo); this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.howard_reload", 4.0F, 1F); @@ -123,67 +123,67 @@ public class TileEntityTurretHoward extends TileEntityTurretBaseNT { } } } - + super.updateEntity(); } @Override public void updateFiringTick() { - + timer++; - + if(loaded > 0 && this.tPos != null) { - + SpentCasing cfg = GunDGKFactory.CASINGDGK; - + this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.howard_fire", 4.0F, 0.9F + worldObj.rand.nextFloat() * 0.3F); this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.howard_fire", 4.0F, 1F + worldObj.rand.nextFloat() * 0.3F); - + for(int i = 0; i < 2; i++) { this.cachedCasingConfig = cfg; this.spawnCasing(); } - + if(timer % 2 == 0) { loaded--; - + if(worldObj.rand.nextInt(100) + 1 <= WeaponConfig.ciwsHitrate) EntityDamageUtil.attackEntityFromIgnoreIFrame(this.target, ModDamageSource.shrapnel, 2F + worldObj.rand.nextInt(2)); - + Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - + Vec3 hOff = Vec3.createVectorHelper(0, 0.25, 0); hOff.rotateAroundZ((float) -this.rotationPitch); hOff.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - + for(int i = 0; i < 2; i++) { - + if(i == 1) { hOff.xCoord *= -1; hOff.yCoord *= -1; hOff.zCoord *= -1; } - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaExt"); data.setString("mode", "largeexplode"); data.setFloat("size", 1.5F); data.setByte("count", (byte)1); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord + hOff.xCoord, pos.yCoord + vec.yCoord + hOff.yCoord, pos.zCoord + vec.zCoord + hOff.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord + hOff.xCoord, pos.yCoord + vec.yCoord + hOff.yCoord, pos.zCoord + vec.zCoord + hOff.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); } } } } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.loaded = nbt.getInteger("loaded"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); @@ -192,22 +192,22 @@ public class TileEntityTurretHoward extends TileEntityTurretBaseNT { @Override protected Vec3 getCasingSpawnPos() { - + Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(-0.875, 0.2, -0.125); vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - + return Vec3.createVectorHelper(pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord); } protected static CasingEjector ejector = new CasingEjector().setAngleRange(0.01F, 0.01F).setMotion(0, 0, -0.1); - + @Override protected CasingEjector getEjector() { return ejector.setMotion(0.4, 0, 0).setAngleRange(0.02F, 0.03F); } - + @Override public boolean usesCasings() { return true; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHowardDamaged.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHowardDamaged.java index 4ef7fd51e..32d790ed5 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHowardDamaged.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHowardDamaged.java @@ -2,8 +2,8 @@ package com.hbm.tileentity.turret; import com.hbm.config.WeaponConfig; import com.hbm.handler.guncfg.GunDGKFactory; +import com.hbm.handler.threading.PacketThreading; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.EntityDamageUtil; @@ -54,57 +54,57 @@ public class TileEntityTurretHowardDamaged extends TileEntityTurretHoward { public boolean hasThermalVision() { return false; } - + @Override public boolean entityAcceptableTarget(Entity e) { //will fire at any living entity - + if(e instanceof EntityPlayer && ((EntityPlayer)e).capabilities.isCreativeMode) return false; - + return e instanceof EntityLivingBase; } @Override public void updateFiringTick() { - + timer++; - + if(this.tPos != null) { - + if(timer % 4 == 0) { - + this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.howard_fire", 4.0F, 0.7F + worldObj.rand.nextFloat() * 0.3F); - + this.cachedCasingConfig = GunDGKFactory.CASINGDGK; this.spawnCasing(); - + if(worldObj.rand.nextInt(100) + 1 <= WeaponConfig.ciwsHitrate * 0.5) EntityDamageUtil.attackEntityFromIgnoreIFrame(this.target, ModDamageSource.shrapnel, 2F + worldObj.rand.nextInt(2)); - + Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - + Vec3 hOff = Vec3.createVectorHelper(0, 0.25, 0); hOff.rotateAroundZ((float) -this.rotationPitch); hOff.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaExt"); data.setString("mode", "largeexplode"); data.setFloat("size", 1.5F); data.setByte("count", (byte)1); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord + hOff.xCoord, pos.yCoord + vec.yCoord + hOff.yCoord, pos.zCoord + vec.zCoord + hOff.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord + hOff.xCoord, pos.yCoord + vec.yCoord + hOff.yCoord, pos.zCoord + vec.zCoord + hOff.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); } } } - + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return null; } - + @Override @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretJeremy.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretJeremy.java index b2af72b35..48504f6e8 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretJeremy.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretJeremy.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.List; import com.hbm.handler.CasingEjector; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.gui.GUITurretJeremy; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.factory.XFactoryTurret; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -19,9 +19,9 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; public class TileEntityTurretJeremy extends TileEntityTurretBaseNT { - + static List configs = new ArrayList(); - + static { configs.add(XFactoryTurret.shell_normal.id); configs.add(XFactoryTurret.shell_explosive.id); @@ -29,7 +29,7 @@ public class TileEntityTurretJeremy extends TileEntityTurretBaseNT { configs.add(XFactoryTurret.shell_du.id); configs.add(XFactoryTurret.shell_w9.id); } - + @Override protected List getAmmoList() { return configs; @@ -39,7 +39,7 @@ public class TileEntityTurretJeremy extends TileEntityTurretBaseNT { public String getName() { return "container.turretJeremy"; } - + @Override public double getDecetorGrace() { return 16D; @@ -64,31 +64,31 @@ public class TileEntityTurretJeremy extends TileEntityTurretBaseNT { public double getDecetorRange() { return 80D; } - + int timer; int reload; - + @Override public void updateEntity() { - + if(reload > 0) reload--; - + if(reload == 1) this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.jeremy_reload", 2.0F, 1.0F); - + super.updateEntity(); } @Override public void updateFiringTick() { - + timer++; - + if(timer % 40 == 0) { - + BulletConfig conf = this.getFirstConfigLoaded(); - + if(conf != null) { this.cachedCasingConfig = conf.casing; this.spawnBullet(conf, 50F); @@ -98,37 +98,37 @@ public class TileEntityTurretJeremy extends TileEntityTurretBaseNT { Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - + reload = 20; - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaExt"); data.setString("mode", "largeexplode"); data.setFloat("size", 0F); data.setByte("count", (byte)5); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); } } } @Override protected Vec3 getCasingSpawnPos() { - + Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(-2, 0, 0); vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - + return Vec3.createVectorHelper(pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord); } protected static CasingEjector ejector = new CasingEjector().setAngleRange(0.01F, 0.01F).setMotion(0, 0, -0.2); - + @Override protected CasingEjector getEjector() { return ejector; } - + @Override public boolean usesCasings() { return true; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java index 5b8f99bbd..bd2bd5c92 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretMaxwell.java @@ -5,11 +5,11 @@ import java.util.HashMap; import java.util.List; import com.hbm.blocks.ModBlocks; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.gui.GUITurretMaxwell; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.potion.HbmPotion; import com.hbm.tileentity.IUpgradeInfoProvider; @@ -254,7 +254,7 @@ public class TileEntityTurretMaxwell extends TileEntityTurretBaseNT implements I NBTTagCompound vdat = new NBTTagCompound(); vdat.setString("type", "giblets"); vdat.setInteger("ent", this.target.getEntityId()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(vdat, this.target.posX, this.target.posY + this.target.height * 0.5, this.target.posZ), new TargetPoint(this.target.dimension, this.target.posX, this.target.posY + this.target.height * 0.5, this.target.posZ, 150)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(vdat, this.target.posX, this.target.posY + this.target.height * 0.5, this.target.posZ), new TargetPoint(this.target.dimension, this.target.posX, this.target.posY + this.target.height * 0.5, this.target.posZ, 150)); if(this.screm) worldObj.playSoundEffect(this.target.posX, this.target.posY, this.target.posZ, "hbm:block.screm", 20.0F, 1.0F); diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java index 0561ee499..90e7f326b 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentry.java @@ -4,11 +4,11 @@ import java.util.ArrayList; import java.util.List; import com.hbm.handler.CasingEjector; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.container.ContainerTurretBase; import com.hbm.inventory.gui.GUITurretSentry; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.factory.XFactory9mm; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.IGUIProvider; @@ -182,7 +182,7 @@ public class TileEntityTurretSentry extends TileEntityTurretBaseNT implements IG data.setString("mode", "largeexplode"); data.setFloat("size", 1F); data.setByte("count", (byte)1); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord + side.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord + side.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord + side.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord + side.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); if(shotSide) { this.didJustShootLeft = true; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentryDamaged.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentryDamaged.java index 5fa6c3ef0..e8811fbc6 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentryDamaged.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretSentryDamaged.java @@ -1,8 +1,8 @@ package com.hbm.tileentity.turret; +import com.hbm.handler.threading.PacketThreading; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.factory.XFactory9mm; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -38,44 +38,44 @@ public class TileEntityTurretSentryDamaged extends TileEntityTurretSentry { public boolean hasThermalVision() { return false; } - + @Override public boolean entityAcceptableTarget(Entity e) { //will fire at any living entity - + if(e instanceof EntityPlayer && ((EntityPlayer)e).capabilities.isCreativeMode) return false; - + return e instanceof EntityLivingBase; } @Override public void updateFiringTick() { - + timer++; - + if(timer % 10 == 0) { - + BulletConfig conf = XFactory9mm.p9_fmj; - + if(conf != null) { - + Vec3 pos = this.getTurretPos(); Vec3 vec = Vec3.createVectorHelper(0, 0, 0); Vec3 side = Vec3.createVectorHelper(0, 0, 0); - + this.cachedCasingConfig = conf.casing; - + if(shotSide) { this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.sentry_fire", 2.0F, 1.0F); this.spawnBullet(conf, 5F); - + vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); side = Vec3.createVectorHelper(0.125 * (shotSide ? 1 : -1), 0, 0); side.rotateAroundY((float) -(this.rotationYaw)); - + } else { this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.sentry_fire", 2.0F, 0.75F); if(usesCasings()) { @@ -86,14 +86,14 @@ public class TileEntityTurretSentryDamaged extends TileEntityTurretSentry { } } } - + NBTTagCompound data = new NBTTagCompound(); data.setString("type", "vanillaExt"); data.setString("mode", "largeexplode"); data.setFloat("size", 1F); data.setByte("count", (byte) 1); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord + side.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord + side.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord + side.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord + side.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + if(shotSide) { this.didJustShootLeft = true; } else { diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java index ea2b2f17d..55582f25f 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretTauon.java @@ -3,11 +3,11 @@ package com.hbm.tileentity.turret; import java.util.ArrayList; import java.util.List; +import com.hbm.handler.threading.PacketThreading; import com.hbm.inventory.gui.GUITurretTauon; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.factory.XFactoryAccelerator; import com.hbm.lib.ModDamageSource; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -143,7 +143,7 @@ public class TileEntityTurretTauon extends TileEntityTurretBaseNT { NBTTagCompound dPart = new NBTTagCompound(); dPart.setString("type", "tau"); dPart.setByte("count", (byte)5); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(dPart, pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(dPart, pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); } } } diff --git a/src/main/java/com/hbm/util/ParticleUtil.java b/src/main/java/com/hbm/util/ParticleUtil.java index b4eca3ac1..b4da2edff 100644 --- a/src/main/java/com/hbm/util/ParticleUtil.java +++ b/src/main/java/com/hbm/util/ParticleUtil.java @@ -1,7 +1,7 @@ package com.hbm.util; +import com.hbm.handler.threading.PacketThreading; import com.hbm.main.MainRegistry; -import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.nbt.NBTTagCompound; @@ -23,7 +23,7 @@ public class ParticleUtil { data.setDouble("posZ", z); MainRegistry.proxy.effectNT(data); } else { - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(world.provider.dimensionId, x, y, z, 150)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(world.provider.dimensionId, x, y, z, 150)); } } @@ -41,7 +41,7 @@ public class ParticleUtil { data.setDouble("posZ", z); MainRegistry.proxy.effectNT(data); } else { - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(world.provider.dimensionId, x, y, z, 150)); + PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, x, y, z), new TargetPoint(world.provider.dimensionId, x, y, z, 150)); } } } From e2d64ff37628bc70a08052e2d78bd1781ccbad70 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+ballofenergy1@users.noreply.github.com> Date: Sun, 9 Feb 2025 18:00:52 -0600 Subject: [PATCH 2/6] Fix for main issue #1933. --- .../hbm/handler/neutron/RBMKNeutronHandler.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java index d3f883589..3b78af0e1 100644 --- a/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java @@ -378,7 +378,19 @@ public class RBMKNeutronHandler { TileEntityRBMKControl rod = (TileEntityRBMKControl) lastNode.tile; if (rod.getMult() > 0.0D) { this.fluxQuantity *= rod.getMult(); - irradiateFromFlux(new BlockPos(lastNode.tile.xCoord + this.vector.xCoord, lastNode.tile.yCoord, lastNode.tile.zCoord + this.vector.zCoord)); + BlockPos posAfter = new BlockPos(lastNode.tile.xCoord + this.vector.xCoord, lastNode.tile.yCoord, lastNode.tile.zCoord + this.vector.zCoord); + + // The below code checks if the block after the control rod is actually a block or if it's an RBMK rod. + // Resolves GitHub issue #1933. + if(!NeutronNodeWorld.nodeCache.containsKey(posAfter)) { + TileEntity te = blockPosToTE(worldObj, posAfter); + if (te instanceof TileEntityRBMKBase) { + RBMKNeutronNode node = makeNode((TileEntityRBMKBase) te); + NeutronNodeWorld.addNode(node); + } else { + irradiateFromFlux(posAfter); // I'm so mad about this... + } + } } } } @@ -390,7 +402,7 @@ public class RBMKNeutronHandler { // holy fucking shit // I have had this one line cause me like tens of problems // I FUCKING HATE THIS - // total count of bugs fixed attributed to this function: 13 + // total count of bugs fixed attributed to this function: 14 Block block = origin.tile.getWorldObj().getBlock(pos.getX(), pos.getY() + h, pos.getZ()); if (block.isOpaqueCube()) hits += 1; From c6ca31eb2358c1c0f37bfc78c12f769ed0743eca Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+ballofenergy1@users.noreply.github.com> Date: Sat, 8 Mar 2025 17:26:12 -0600 Subject: [PATCH 3/6] what was i doing again? seriously someone idk what i was doing help --- .../com/hbm/handler/neutron/package-info.java | 76 +++++++++++++++++++ .../items/block/ItemBlockStorageCrate.java | 13 +++- .../machine/rbmk/TileEntityRBMKRod.java | 2 +- .../network/TileEntityRadioTelex.java | 13 ++-- 4 files changed, 94 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/hbm/handler/neutron/package-info.java diff --git a/src/main/java/com/hbm/handler/neutron/package-info.java b/src/main/java/com/hbm/handler/neutron/package-info.java new file mode 100644 index 000000000..17b5ba872 --- /dev/null +++ b/src/main/java/com/hbm/handler/neutron/package-info.java @@ -0,0 +1,76 @@ +package com.hbm.handler.neutron; + +/* +Hello all, especially Bobcat!! +This very well could be my last contribution here, so let's make it quick (I am 24 vicodin deep and in a majorly depressive state). + +Neutron Nodespace: + The neutron nodespace is a system inspired by the power net nodespace that allows for caching and + calculation of neutron streams from node to node. This is used in both the RBMK and the Chicago Pile, + and is planned to be used in future reactors if needed. + +How actually does the Neutron Nodespace work? + The neutron system is separated into a few different parts: + 1. The Neutron Node World + Neutron node worlds hold, well, the neutron nodes for a world. Each world has its own list, and the + nodes are updated based on their respective adding/removing functions. Only adding nodes is done automatically when a stream + passes through an unregistered node, so unregistering nodes must be done manually. This can also be done using a system + that automatically clears any unused nodes after a certain amount of time, see checkNode() in RBMKNeutronHandler for an example. + + 2. The Neutron Node + Neutron nodes are the actual nodes that interact with neutron streams. These hold a few parameters, + namely the neutron type (held as a NeutronType enum), the position of the node, the TileEntity + the node is encapsulating (optional for blocks), and a special data field. The data field is fully + optional and is mostly used in the RBMK space for holding data about the columns themselves to speed + up grabbing data. This field can hold any sort of data and is meant to be used similar to an NBT storage. + + 3. The Neutron Stream + Neutron streams are where the magic happens (figuratively speaking). Neutron streams can be defined + as a specific type, allowing them only to interact with one type of neutron node. Neutron streams have + a few values, including their origin (in the form of a NeutronNode object), flux quantity, flux ratio, and the + stream vector. The flux quantity and ratio (double 0-1) is a special way of handling the slow/fast flux. The flux ratio can be + calculated by taking the amount of fast flux over the total amount of flux (flux quantity). The amount of fast flux + can be calculated by doing the inverse of this, meaning multiplying the flux quantity by the flux ratio. The slow + flux can be found in nearly the same way, simply by multiplying the flux quantity by one minus the flux ratio. The stream + vector determines the "direction" of the neutron stream, and can be defined as any rotational vector. + The neutron stream class has a few functions that can be used: + 1. Iterator getBlocks(int range): This function returns an iterator over all the blocks in a stream's + path, determined by a given range and the stream's vector. + 2. void runStreamInteraction(World worldObj): This abstract function must be defined in any implementation of the + neutron stream algorithm. This can be seen in the `RBMKNeutronHandler` and the `PileNeutronHandler`. This function + will be run *once* for each and every stream, then they will be removed from the list. + *Each neutron stream only lasts for a single tick in an optimal system.* + +Using the Neutron Nodespace: + Using the neutron nodespace in a new system is not extremely complex, but also requires a few interlocking steps. + New systems should contain a main handler class, normally in the format of nameOfSystemNeutronHandler (see PileNeutronHandler + and RBMKNeutronHandler). This is required to contain at least two things: + 1. Extension of the abstract NeutronStream class. + This is required for the system to operate, as it contains the main code for actually handling the interactions for the stream. + 2. Extension of the abstract NeutronNode class. + This is also required, as this holds the constructor for defining the node type. This can also, optionally, contain special + functions for interfacing with the data field inside the node structure. + + Additional code for handling the streams as they are processed can be placed inside the NeutronHandler class, right above the loop + for processing all the stream interactions. This can be done for optimizing out gamerule checking and the like. + + As mentioned before, the nodes have to be manually destroyed by the TE, normally done within `invalidate()`. + There is also an experimental system for automatically clearing nodes from the nodespace when streams have not passed through + them every second. This can be seen at the end of the onServerTick() function in the NeutronHandler class. Additional + checks for other types can be added here if needed/desired. + +As a final note, this system is potentially way more complicated than it could need to be. +For any extra examples, below is a few files that contain some basic neutron nodespace code that can serve as a base for making new +systems. + +Stream Creation: + 2D Generic stream creation: spreadFlux() in tileentity.machine.rbmk.TileEntityRBMKRod + 2D Non-cardinal direction stream creation: spreadFlux() in tileentity.machine.rbmk.TileEntityRBMKRodReaSim + 3D non-cardinal direction stream creation: castRay() in tileentity.machine.pile.TileEntityPileBase + +Node Management: + Node invalidation: invalidate() in tileentity.machine.rbmk.TileEntityRBMKBase and tileentity.machine.pile.TileEntityPileBase + +See handler.neutron.PileNeutronHandler and handler.neutron.RBMKNeutronHandler for example system handlers. +See handler.neutron.NeutronHandler for the overarching class. +*/ diff --git a/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java b/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java index c3d68c3db..1ed2a9d56 100644 --- a/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java +++ b/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java @@ -90,16 +90,18 @@ public class ItemBlockStorageCrate extends ItemBlockBase implements IGUIProvider public ItemStack[] slots; public InventoryCrate(EntityPlayer player, ItemStack crate) { + this.player = player; this.crate = crate; slots = new ItemStack[this.getSizeInventory()]; if(crate.stackTagCompound == null) crate.stackTagCompound = new NBTTagCompound(); - else { + else if(!player.worldObj.isRemote) { for (int i = 0; i < this.getSizeInventory(); i++) - this.setInventorySlotContents(i, ItemStack.loadItemStackFromNBT(crate.stackTagCompound.getCompoundTag("slot" + i))); + this.setInventorySlotContents(i, ItemStack.loadItemStackFromNBT(crate.stackTagCompound.getCompoundTag("slot" + i)), false); } + this.markDirty(); } @Nonnull @@ -152,13 +154,18 @@ public class ItemBlockStorageCrate extends ItemBlockBase implements IGUIProvider @Override public void setInventorySlotContents(int slot, ItemStack stack) { + setInventorySlotContents(slot, stack, true); + } + + public void setInventorySlotContents(int slot, ItemStack stack, boolean markDirty) { if(stack != null) { stack.stackSize = Math.min(stack.stackSize, this.getInventoryStackLimit()); } slots[slot] = stack; - markDirty(); + if(markDirty) // This is purely so we don't re-serialize *all* the data when *each* item is loaded during the inventory creation. + markDirty(); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index 14bff0eb1..92b5ecfe2 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -413,7 +413,7 @@ public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBM @Callback(direct = true) @Optional.Method(modid = "OpenComputers") public Object[] getFluxQuantity(Context context, Arguments args) { - return new Object[] {fluxQuantity}; + return new Object[] {lastFluxQuantity}; } @Callback(direct = true) diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTelex.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTelex.java index 3db91ad96..751904a4f 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTelex.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTelex.java @@ -302,14 +302,15 @@ public class TileEntityRadioTelex extends TileEntityLoadedBase implements IContr // check if it was never given or if it's an empty string // if it was never given then just assign it as an empty string // this also checks if it's even a string at all - if(args.checkAny(i) == null || args.checkString(i).equals("")) + if(args.checkAny(i) == null || args.checkString(i).isEmpty()) { this.txBuffer[i] = ""; - if(!args.checkString(i).equals("")) { // if it isn't an empty string - if(args.checkString(i).length() > TileEntityRadioTelex.lineWidth) { // line longer than allowed - this.txBuffer[i] = args.checkString(i).substring(0, TileEntityRadioTelex.lineWidth); // truncate it - } else - this.txBuffer[i] = args.checkString(i); // else just set it directly + continue; } + // if it isn't an empty string + if(args.checkString(i).length() > TileEntityRadioTelex.lineWidth) // line longer than allowed + this.txBuffer[i] = args.checkString(i).substring(0, TileEntityRadioTelex.lineWidth); // truncate it + else + this.txBuffer[i] = args.checkString(i); // else just set it directly } return new Object[] {true}; } From ac81021ddf91167abc1f8407bb7d20e60806a801 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+ballofenergy1@users.noreply.github.com> Date: Sat, 8 Mar 2025 17:34:08 -0600 Subject: [PATCH 4/6] small fix --- .../java/com/hbm/handler/neutron/RBMKNeutronHandler.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java index dfe595599..fadaea505 100644 --- a/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java @@ -380,11 +380,11 @@ public class RBMKNeutronHandler { // The below code checks if the block after the control rod is actually a block or if it's an RBMK rod. // Resolves GitHub issue #1933. - if(!NeutronNodeWorld.nodeCache.containsKey(posAfter)) { + if(NeutronNodeWorld.getNode(worldObj, pos) == null) { TileEntity te = blockPosToTE(worldObj, posAfter); if (te instanceof TileEntityRBMKBase) { - RBMKNeutronNode node = makeNode((TileEntityRBMKBase) te); - NeutronNodeWorld.addNode(node); + RBMKNeutronNode nodeAfter = makeNode(NeutronNodeWorld.getOrAddWorld(worldObj), (TileEntityRBMKBase) te); + NeutronNodeWorld.getOrAddWorld(worldObj).addNode(nodeAfter); } else { irradiateFromFlux(posAfter); // I'm so mad about this... } From c73ec3a0acf6cd6f9ed29cd3b2669dda06783956 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+ballofenergy1@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:31:56 -0500 Subject: [PATCH 5/6] i fucked around, i found out this shit WORKS --- .../hbm/blocks/generic/BlockStorageCrate.java | 18 +------ .../container/ContainerCrateBase.java | 2 - .../items/block/ItemBlockStorageCrate.java | 49 ++++++++++++------- .../java/com/hbm/items/tool/ItemWandD.java | 44 +++++++++++++++++ src/main/java/com/hbm/lib/HbmWorldGen.java | 10 ++-- .../machine/storage/TileEntityCrateBase.java | 45 ++++++++++++++++- 6 files changed, 123 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockStorageCrate.java b/src/main/java/com/hbm/blocks/generic/BlockStorageCrate.java index 944323a40..e2d29a9f8 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockStorageCrate.java +++ b/src/main/java/com/hbm/blocks/generic/BlockStorageCrate.java @@ -24,8 +24,6 @@ import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.monster.EntityCaveSpider; -import net.minecraft.entity.monster.EntitySpider; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; @@ -178,21 +176,7 @@ public class BlockStorageCrate extends BlockContainer implements IBlockMulti, IT if(entity instanceof TileEntityCrateBase && ((TileEntityCrateBase) entity).canAccess(player)) { FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); TileEntityCrateBase crate = (TileEntityCrateBase) entity; - if(crate.hasSpiders) { - Random random = new Random(); - int numSpiders = 3; // leave that at 3 for now TODO: maybe a config option or smth - - for (int i = 0; i < numSpiders; i++) { - - EntityCaveSpider spider = new EntityCaveSpider(crate.getWorldObj()); // lord - spider.setLocationAndAngles(x + random.nextGaussian() * 2, y + 1, z + random.nextGaussian() * 2, random.nextFloat(), 0); - spider.setAttackTarget(player); - - world.spawnEntityInWorld(spider); - - crate.hasSpiders = false; - } - } + TileEntityCrateBase.spawnSpiders(player, world, crate); } return true; } else { diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java b/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java index 39653d384..b19725c1f 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java @@ -1,10 +1,8 @@ package com.hbm.inventory.container; -import com.hbm.util.InventoryUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; public class ContainerCrateBase extends ContainerBase { diff --git a/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java b/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java index 1ed2a9d56..83d7d64b7 100644 --- a/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java +++ b/src/main/java/com/hbm/items/block/ItemBlockStorageCrate.java @@ -3,7 +3,7 @@ package com.hbm.items.block; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.container.*; import com.hbm.inventory.gui.*; -import com.hbm.items.ModItems; +import com.hbm.items.tool.ItemKey; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.machine.storage.*; @@ -42,16 +42,19 @@ public class ItemBlockStorageCrate extends ItemBlockBase implements IGUIProvider for (ItemStack item : player.inventory.mainInventory) { if(item == null) // Skip if no item. continue; - if(item.getItem() != ModItems.key || item.stackTagCompound == null) // Skip if item isn't a key or if the NBT is null (wouldn't open it either way). + if(!(item.getItem() instanceof ItemKey)) // Skip if item isn't a key. + continue; + if(item.stackTagCompound == null) // Skip if there is no NBT (wouldn't open it anyway). continue; if (item.stackTagCompound.getInteger("pins") == stack.stackTagCompound.getInteger("lock")) { // Check if pins are equal (if it can open it) + TileEntityCrateBase.spawnSpiders(player, world, stack); player.openGui(MainRegistry.instance, 0, world, 0, 0, 0); break; } } return stack; // Return early if it was locked. } - + TileEntityCrateBase.spawnSpiders(player, world, stack); player.openGui(MainRegistry.instance, 0, world, 0, 0, 0); // If there is no lock then don't bother checking. } @@ -89,6 +92,8 @@ public class ItemBlockStorageCrate extends ItemBlockBase implements IGUIProvider public final ItemStack crate; public ItemStack[] slots; + private boolean toMarkDirty = false; + public InventoryCrate(EntityPlayer player, ItemStack crate) { this.player = player; @@ -99,9 +104,11 @@ public class ItemBlockStorageCrate extends ItemBlockBase implements IGUIProvider crate.stackTagCompound = new NBTTagCompound(); else if(!player.worldObj.isRemote) { for (int i = 0; i < this.getSizeInventory(); i++) - this.setInventorySlotContents(i, ItemStack.loadItemStackFromNBT(crate.stackTagCompound.getCompoundTag("slot" + i)), false); + this.setInventorySlotContents(i, ItemStack.loadItemStackFromNBT(crate.stackTagCompound.getCompoundTag("slot" + i))); } + toMarkDirty = true; this.markDirty(); + toMarkDirty = false; } @Nonnull @@ -137,7 +144,6 @@ public class ItemBlockStorageCrate extends ItemBlockBase implements IGUIProvider if (stack != null) { if (stack.stackSize > amount) { stack = stack.splitStack(amount); - markDirty(); } else { setInventorySlotContents(slot, null); } @@ -154,18 +160,11 @@ public class ItemBlockStorageCrate extends ItemBlockBase implements IGUIProvider @Override public void setInventorySlotContents(int slot, ItemStack stack) { - setInventorySlotContents(slot, stack, true); - } - - public void setInventorySlotContents(int slot, ItemStack stack, boolean markDirty) { - if(stack != null) { stack.stackSize = Math.min(stack.stackSize, this.getInventoryStackLimit()); } slots[slot] = stack; - if(markDirty) // This is purely so we don't re-serialize *all* the data when *each* item is loaded during the inventory creation. - markDirty(); } @Override @@ -181,11 +180,19 @@ public class ItemBlockStorageCrate extends ItemBlockBase implements IGUIProvider @Override public void markDirty() { // I HATE THIS SO MUCH - ItemStack item = new ItemStack(crate.getItem()); + if(player.worldObj.isRemote) { // go the fuck away + return; + } + + if(!toMarkDirty) { // ok fuck you too + return; + } NBTTagCompound nbt = new NBTTagCompound(); - for(int i = 0; i < this.getSizeInventory(); i++) { + int invSize = this.getSizeInventory(); + + for(int i = 0; i < invSize; i++) { ItemStack stack = this.getStackInSlot(i); if(stack == null) @@ -214,7 +221,7 @@ public class ItemBlockStorageCrate extends ItemBlockBase implements IGUIProvider if(abyte.length > 6000) { player.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.RED + "Warning: Container NBT exceeds 6kB, contents will be ejected!")); - for(int i1 = 0; i1 < this.getSizeInventory(); ++i1) { + for(int i1 = 0; i1 < invSize; ++i1) { ItemStack itemstack = this.getStackInSlot(i1); if(itemstack != null) { @@ -244,16 +251,17 @@ public class ItemBlockStorageCrate extends ItemBlockBase implements IGUIProvider } } } - player.inventory.setInventorySlotContents(player.inventory.currentItem, null); - player.closeScreen(); + + crate.setTagCompound(null); // Wipe tag compound to clear crate. + player.inventory.setInventorySlotContents(player.inventory.currentItem, crate); return; } } catch(IOException ignored) { } } - item.setTagCompound(nbt); + crate.setTagCompound(nbt); - player.inventory.setInventorySlotContents(player.inventory.currentItem, item); + player.inventory.setInventorySlotContents(player.inventory.currentItem, crate); } @Override @@ -268,6 +276,9 @@ public class ItemBlockStorageCrate extends ItemBlockBase implements IGUIProvider @Override public void closeInventory() { + toMarkDirty = true; + markDirty(); + toMarkDirty = false; player.worldObj.playSoundEffect(player.posX, player.posY, player.posZ, "hbm:block.crateClose", 1.0F, 0.8F); } diff --git a/src/main/java/com/hbm/items/tool/ItemWandD.java b/src/main/java/com/hbm/items/tool/ItemWandD.java index b3f1c4214..cce9d0193 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandD.java +++ b/src/main/java/com/hbm/items/tool/ItemWandD.java @@ -1,19 +1,27 @@ package com.hbm.items.tool; import java.util.List; +import java.util.Random; +import com.hbm.blocks.ModBlocks; +import com.hbm.config.GeneralConfig; import com.hbm.explosion.vanillant.ExplosionVNT; import com.hbm.explosion.vanillant.standard.BlockAllocatorStandard; +import com.hbm.itempool.ItemPool; +import com.hbm.itempool.ItemPoolsSingle; import com.hbm.lib.HbmWorldGen; import com.hbm.lib.Library; +import com.hbm.main.MainRegistry; import com.hbm.particle.helper.ExplosionCreator; import com.hbm.tileentity.machine.storage.TileEntityCrateBase; +import com.hbm.tileentity.machine.storage.TileEntitySafe; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.WeightedRandomChestContent; import net.minecraft.world.World; public class ItemWandD extends Item { @@ -28,6 +36,42 @@ public class ItemWandD extends Item { if(pos != null) { + int y = world.getHeightValue(pos.blockX, pos.blockZ); + + Random rand = new Random(); + + if(world.getBlock(pos.blockX, y - 1, pos.blockZ).canPlaceTorchOnTop(world, pos.blockX, y - 1, pos.blockZ)) { + world.setBlock(pos.blockX, y, pos.blockZ, ModBlocks.safe, rand.nextInt(4) + 2, 2); + TileEntitySafe safe = (TileEntitySafe) world.getTileEntity(pos.blockX, y, pos.blockZ); + + switch(rand.nextInt(10)) { + case 0: case 1: case 2: case 3: + safe.setMod(1); + WeightedRandomChestContent.generateChestContents(rand, ItemPool.getPool(ItemPoolsSingle.POOL_VAULT_RUSTY), safe, rand.nextInt(4) + 3); + break; + case 4: case 5: case 6: + safe.setMod(0.1); + WeightedRandomChestContent.generateChestContents(rand, ItemPool.getPool(ItemPoolsSingle.POOL_VAULT_STANDARD), safe, rand.nextInt(3) + 2); + break; + case 7: case 8: + safe.setMod(0.02); + WeightedRandomChestContent.generateChestContents(rand, ItemPool.getPool(ItemPoolsSingle.POOL_VAULT_REINFORCED), safe, rand.nextInt(3) + 1); + break; + case 9: + safe.setMod(0.0); + WeightedRandomChestContent.generateChestContents(rand, ItemPool.getPool(ItemPoolsSingle.POOL_VAULT_UNBREAKABLE), safe, rand.nextInt(2) + 1); + break; + } + + safe.setPins(rand.nextInt(999) + 1); + safe.lock(); + + safe.fillWithSpiders(); // debug + + if(GeneralConfig.enableDebugMode) + MainRegistry.logger.info("[Debug] Successfully spawned safe at " + pos.blockX + " " + (y + 1) +" " + pos.blockZ); + } + /*ExplosionVNT vnt = new ExplosionVNT(world, pos.hitVec.xCoord, pos.hitVec.yCoord, pos.hitVec.zCoord, 7); vnt.setBlockAllocator(new BlockAllocatorBulkie(60)); vnt.setBlockProcessor(new BlockProcessorStandard().withBlockEffect(new BlockMutatorBulkie(ModBlocks.block_slag)).setNoDrop()); diff --git a/src/main/java/com/hbm/lib/HbmWorldGen.java b/src/main/java/com/hbm/lib/HbmWorldGen.java index 1c4ade7fb..35010d2af 100644 --- a/src/main/java/com/hbm/lib/HbmWorldGen.java +++ b/src/main/java/com/hbm/lib/HbmWorldGen.java @@ -513,7 +513,7 @@ public class HbmWorldGen implements IWorldGenerator { safe.setPins(rand.nextInt(999) + 1); safe.lock(); - if(rand.nextInt(10) < 3) // 30% chance + if(rand.nextInt(10) < 3) // 30% chance; those safes have been sitting there for ages, they gotta have some spiders in them safe.fillWithSpiders(); if(GeneralConfig.enableDebugMode) @@ -706,8 +706,8 @@ public class HbmWorldGen implements IWorldGenerator { int d = 16 + rand.nextInt(96); for(int y = d - 5; y <= d; y++) - if(world.getBlock(x, y + 1, z) == Blocks.air && world.getBlock(x, y, z) == Blocks.netherrack) - world.setBlock(x, y, z, ModBlocks.ore_nether_smoldering); + if(world.getBlock(x, y + 1, z) == Blocks.air && world.getBlock(x, y, z) == Blocks.netherrack) + world.setBlock(x, y, z, ModBlocks.ore_nether_smoldering); } for(int k = 0; k < 1; k++){ @@ -716,8 +716,8 @@ public class HbmWorldGen implements IWorldGenerator { int d = 16 + rand.nextInt(96); for(int y = d - 5; y <= d; y++) - if(world.getBlock(x, y + 1, z) == Blocks.air && world.getBlock(x, y, z) == Blocks.netherrack) - world.setBlock(x, y, z, ModBlocks.geysir_nether); + if(world.getBlock(x, y + 1, z) == Blocks.air && world.getBlock(x, y, z) == Blocks.netherrack) + world.setBlock(x, y, z, ModBlocks.geysir_nether); } } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java index 60db07350..896112e17 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java @@ -3,15 +3,19 @@ package com.hbm.tileentity.machine.storage; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.machine.TileEntityLockableBase; +import net.minecraft.entity.monster.EntityCaveSpider; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.world.World; + +import java.util.Random; public abstract class TileEntityCrateBase extends TileEntityLockableBase implements ISidedInventory, IGUIProvider { - protected ItemStack slots[]; + protected ItemStack[] slots; public String customName; public boolean hasSpiders = false; @@ -52,7 +56,7 @@ public abstract class TileEntityCrateBase extends TileEntityLockableBase impleme @Override public boolean hasCustomInventoryName() { - return this.customName != null && this.customName.length() > 0; + return this.customName != null && !this.customName.isEmpty(); } public void setCustomName(String name) { @@ -164,4 +168,41 @@ public abstract class TileEntityCrateBase extends TileEntityLockableBase impleme public void fillWithSpiders() { this.hasSpiders = true; } + + private static final int numSpiders = 3; // leave that at 3 for now TODO: maybe a config option or smth + + /// For when opening from a TileEntity. + public static void spawnSpiders(EntityPlayer player, World worldObj, TileEntityCrateBase crate) { + if(crate.hasSpiders) { + Random random = new Random(); + + for (int i = 0; i < numSpiders; i++) { + + EntityCaveSpider spider = new EntityCaveSpider(worldObj); // lord + spider.setLocationAndAngles(crate.xCoord + random.nextGaussian() * 2, crate.yCoord + 1, crate.zCoord + random.nextGaussian() * 2, random.nextFloat(), 0); + spider.setAttackTarget(player); + + worldObj.spawnEntityInWorld(spider); + } + crate.hasSpiders = false; + crate.markDirty(); + } + } + + /// For when opening from a player's inventory. + public static void spawnSpiders(EntityPlayer player, World worldObj, ItemStack crate) { + if(crate.getTagCompound().getBoolean("spiders")) { + Random random = new Random(); + + for (int i = 0; i < numSpiders; i++) { + + EntityCaveSpider spider = new EntityCaveSpider(worldObj); + spider.setLocationAndAngles(player.posX + random.nextGaussian() * 2, player.posY + 1, player.posZ + random.nextGaussian() * 2, random.nextFloat(), 0); + spider.setAttackTarget(player); + + worldObj.spawnEntityInWorld(spider); + } + crate.getTagCompound().removeTag("spiders"); + } + } } From 8608796a09bd4500acb3765ff660100801b4401c Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+ballofenergy1@users.noreply.github.com> Date: Wed, 19 Mar 2025 20:44:39 -0500 Subject: [PATCH 6/6] ok i want this listen ok im proud of them and i dont want them to fade --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 57936ce9d..7e329bde9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -48,7 +48,7 @@ credits=HbMinecraft,\ \ TehTemmie (reacher radiation function),\ \ Silly541 (config for safe ME drives),\ \ Voxelstice (OpenComputers integration, turbine spinup),\ - \ BallOfEnergy1 (OpenComputers integration),\ + \ BallOfEnergy1 (OpenComputers integration, RBMK and packet optimization, crate backpacks),\ \ sdddddf80 (recipe configs, chinese localization, custom machine holograms),\ \ Abel1502 (optimization, crate upgrade recipes, strand caster improvements, varous tweaks),\ \ SuperCraftAlex (tooltips)\