示例#1
0
    /// <summary>
    ///
    /// </summary>
    public void Fire(FireReason fireReason = FireReason.Normal)
    {
        if (!canFire || AI.ObstacleBetweenTarget)
        {
            return;
        }
        if (fireReason == FireReason.Normal)
        {
            if (!AI.playerInFront)
            {
                return;
            }
        }
        if (Weapon == null)
        {
            return;
        }

        if (Time.time >= attackTime)
        {
            if (Grenades > 0 && AI.TargetDistance >= 12 && FollowingShoots > 5)
            {
                if ((Random.Range(0, 200) > 185))
                {
                    StartCoroutine(ThrowGrenade(false, Vector3.zero, Vector3.zero));
                    attackTime = Time.time + 3.3f;
                    return;
                }
            }
            Anim.SetInteger("UpperState", 1);
            attackTime = (fireReason == FireReason.OnMove) ? Time.time + Random.Range(Weapon.AttackRate * 2, Weapon.AttackRate * 5) : Time.time + Weapon.AttackRate;
            bullet     = Pooling.Instantiate(Weapon.BulletName, Weapon.FirePoint.position, transform.root.rotation);
            bullet.transform.LookAt(AI.TargetPosition);
            //build bullet data
            m_BulletData.Damage     = Weapon.Damage;
            m_BulletData.isNetwork  = false;
            m_BulletData.Position   = transform.position;
            m_BulletData.WeaponID   = Weapon.GunID;
            m_BulletData.Spread     = 2f;
            m_BulletData.MaxSpread  = 3f;
            m_BulletData.Speed      = 200;
            m_BulletData.LifeTime   = 10;
            m_BulletData.WeaponName = Weapon.Info.Name;
            bullet.GetComponent <bl_Bullet>().SetUp(m_BulletData);
            bullet.GetComponent <bl_Bullet>().AISetUp(AI.AIName, photonView.ViewID, AI.AITeam);
            if (FireSource.enabled)
            {
                FireSource.pitch = Random.Range(0.85f, 1.1f);
                FireSource.clip  = Weapon.FireAudio;
                FireSource.Play();
            }
            if (Weapon.MuzzleFlash != null)
            {
                Weapon.MuzzleFlash.Play();
            }
            bullets--;
            FollowingShoots++;
            photonView.RPC("RpcFire", RpcTarget.Others, Weapon.FirePoint.position, AI.TargetPosition);
#if UMM
            ShowMiniMapItem();
#endif
            if (bullets <= 0)
            {
                canFire = false;
                StartCoroutine(Reload());
            }
            else
            {
                if (FollowingShoots > 5)
                {
                    if (Random.Range(0, 15) > 12)
                    {
                        attackTime     += Random.Range(0.01f, 5);
                        FollowingShoots = 0;
                    }
                }
            }
            isFiring = true;
        }
    }
示例#2
0
        private List <Unit> FireUnits(int difference, FireReason fireReason)
        {
            Random rand = new Random();
            Dictionary <int, int> unitsToRemove = new Dictionary <int, int>();

            //létrehozzuk az üres listát, értelmetlen
            //foreach (Unit unit in AttackingArmy.Units)
            //{
            //    unitsToRemove.Add(unit.Type.Id, 0);
            //}
            bool stop = false;

            List <Unit> defUnitsToRemove = new List <Unit>();
            List <Unit> attUnitsToRemove = new List <Unit>();
            Unit        target;

            while (!stop)
            {
                //defending army ritkítása
                foreach (Unit unit in DefendingArmy.Units)
                {
                    //fölösleges, ha üres lenne a lista, akkor nem is menne a foreach
                    //if (unit.Count > 0)
                    //{
                    target = DefendingArmy.Units[rand.Next(0, DefendingArmy.Units.Count - 1)];
                    defUnitsToRemove.Add(target);
                    switch (fireReason)
                    {
                    case FireReason.Coral:
                        difference -= target.Type.CoralCostPerTurn;
                        break;

                    case FireReason.Pearl:
                        difference -= target.Type.PearlCostPerTurn;
                        break;
                    }
                    if (difference <= 0)
                    {
                        stop = true;
                        break;
                    }
                    //}
                }
                if (stop)
                {
                    break;
                }
                //attacking army ritkítása
                foreach (Unit unit in AttackingArmy.Units)
                {
                    //if (unit.Count > 0)
                    //{

                    target = AttackingArmy.Units[rand.Next(0, DefendingArmy.Units.Count - 1)];
                    attUnitsToRemove.Add(target);
                    switch (fireReason)
                    {
                    case FireReason.Coral:
                        difference -= target.Type.CoralCostPerTurn;
                        break;

                    case FireReason.Pearl:
                        difference -= target.Type.PearlCostPerTurn;
                        break;
                    }
                    if (difference <= 0)
                    {
                        stop = true;
                        break;
                    }
                    //}
                }
            }
            //eltávolítás a sima listákból
            foreach (var unit in attUnitsToRemove)
            {
                AttackingArmy.Units.Remove(unit);
            }
            foreach (var unit in defUnitsToRemove)
            {
                DefendingArmy.Units.Remove(unit);
            }

            //visszatérünk azzal amit kivettünk, hogy ki tudjuk venni az attacklist-ből
            return(attUnitsToRemove);
        }