Exemplo n.º 1
0
    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);
    }