public virtual void FireGun(Vector3 targetPos, float aimCone, Transform muzzleToUse = null, BaseCombatEntity target = null) { if (IsOffline()) { return; } if (muzzleToUse == null) { muzzleToUse = muzzlePos; } Vector3 vector = GetCenterMuzzle().transform.position - GetCenterMuzzle().forward * 0.25f; Vector3 vector2 = GetCenterMuzzle().transform.forward; Vector3 modifiedAimConeDirection = AimConeUtil.GetModifiedAimConeDirection(aimCone, vector2); targetPos = vector + modifiedAimConeDirection * 300f; List <RaycastHit> obj = Facepunch.Pool.GetList <RaycastHit>(); GamePhysics.TraceAll(new Ray(vector, modifiedAimConeDirection), 0f, obj, 300f, 1219701521); bool flag = false; for (int i = 0; i < obj.Count; i++) { RaycastHit hit = obj[i]; BaseEntity entity = RaycastHitEx.GetEntity(hit); if ((entity != null && (entity == this || entity.EqualNetID(this))) || (PeacekeeperMode() && target != null && entity != null && entity.GetComponent <BasePlayer>() != null && !entity.EqualNetID(target))) { continue; } BaseCombatEntity baseCombatEntity = entity as BaseCombatEntity; if (baseCombatEntity != null) { ApplyDamage(baseCombatEntity, hit.point, modifiedAimConeDirection); if (baseCombatEntity.EqualNetID(target)) { flag = true; } } if (!(entity != null) || entity.ShouldBlockProjectiles()) { targetPos = hit.point; vector2 = (targetPos - vector).normalized; break; } } int num = 2; if (!flag) { numConsecutiveMisses++; } else { numConsecutiveMisses = 0; } if (target != null && targetVisible && numConsecutiveMisses > num) { ApplyDamage(target, target.transform.position - vector2 * 0.25f, vector2); numConsecutiveMisses = 0; } ClientRPC(null, "CLIENT_FireGun", StringPool.Get(muzzleToUse.gameObject.name), targetPos); Facepunch.Pool.FreeList(ref obj); }