public void RocketAttack(ref int lapCount, RocketAmmunition rocket, bool force = false) { lock (_rocketLock) { #region {[ CHECKING ]} if (PlayerController.Locked == null || (rocket.ID != RocketAmmunition.R_IC3.ID && PlayerController.Locked.MovementAssembly.ActualPosition() .DistanceTo(PlayerController.MovementAssembly.ActualPosition()) > 650) || PlayerController.Locked.MovementAssembly.ActualPosition() .DistanceTo(PlayerController.MovementAssembly.ActualPosition()) > 550 || (!force && !_attackRunning)) { return; } if (PlayerController.Locked.ZoneAssembly.IsInDMZ) { PlayerController.Send(PacketBuilder.Messages.PeaceArea()); return; } if (!CheckRocketCount(rocket, false, out int currentCount)) { PlayerController.Send(PacketBuilder.Messages.NoRocketAmmo()); return; } if (!RocketCooldown(ref lapCount, rocket)) { return; } #endregion CheckRocketCount(rocket, true, out currentCount); // deduct count LastAttack = PlayerController.CurrentClock.ElapsedMilliseconds; ICommand attackCommand = PacketBuilder.AttackRocketCommand(PlayerController, PlayerController.Locked, rocket.ID); PlayerController.Send(attackCommand, PacketBuilder.Slotbar.RocketItemStatus(rocket.Name, currentCount, true)); PlayerController.EntitesInRange(x => x.Send(attackCommand)); if (PlayerController.Locked.EffectsAssembly.HasProtection || (PlayerController.Locked is PlayerController lockedPlayerController && lockedPlayerController.SpecialItemsAssembly.IsInvicible) || (!PlayerController.PlayerTechAssembly.PrecisionTargeterActive && Miss())) { PlayerController.Locked.AttackTraceAssembly.LogAttack(PlayerController, 0, 0); ICommand missCommand = new AttackMissedCommand(new AttackTypeModule(AttackTypeModule.LASER), PlayerController.Locked.ID, 0); PlayerController.Locked.Send(new AttackMissedCommand(new AttackTypeModule(AttackTypeModule.LASER), PlayerController.Locked.ID, 1)); PlayerController.Locked.EntitiesLocked(x => x.Send(missCommand)); return; } RocketDelayedAttack(PlayerController.Locked, rocket); } }