Ejemplo n.º 1
0
    /// <summary>
    /// Geht in Intervallen die Ziellisten durch und attackiert pro Durchlauf ein
    /// Ziel. Ausserdem wird darauf geachtet, dass zuerst die NPCs angegriffen werden.
    /// </summary>
    ///
    void Attack()
    {
        // Greife NPC an
        // temp -> wegen doppelter Zugriff auf List mit Remove bei null
        // während eines Angriffs kann das Ziel jemand anderes toeten
        NPCDamageReciever[] tempNpcTargets = new NPCDamageReciever[npcTargets.Count];
        npcTargets.CopyTo(tempNpcTargets);

        // Gehe alle Ziele durch bis ein Treffer
        foreach (NPCDamageReciever t in tempNpcTargets)
        {
            if (t)
            {
                target = t.transform;
                t.TakeDamage(damage, name, t.netId.Value);

                return;
            }
            else
            {
                npcTargets.Remove(t);
            }
        }

        // kein NPC vorhanden bzw. getroffen weil null wegen gestorben
        // Greife Spieler an
        PlayerDamageReciever[] tempPlayerTargets = new PlayerDamageReciever[pdrTargets.Count];
        pdrTargets.CopyTo(tempPlayerTargets);

        foreach (PlayerDamageReciever t in tempPlayerTargets)
        {
            if (t && Vector3.Distance(transform.position, t.transform.position) < 5)
            {
                target = t.transform;
                t.TakeDamage(damage, name, t.netId.Value);

                return;
            }
            else
            {
                pdrTargets.Remove(t);
            }
        }

        // Ersatz für OnTriggerExit, wenn innerhalb des Radius alle
        // Listen leer werden.
        Reset();
    }
Ejemplo n.º 2
0
    /// <summary>
    /// Prueft, ob das neue Objekt im Angriffsradius angreifbar ist. Falls ja,
    /// dann wird es in die Zielliste eingetragen und ein Angriff wird gestartet.
    /// </summary>
    /// <param name="target">Collider eines moeglichen Ziels.</param>
    ///
    void OnTriggerEnter(Collider target)
    {
        if (target.tag.Equals("" + team) || (!target.tag.Equals("0") && !target.tag.Equals("1")))
        {
            return;
        }

        if (npcStats = target.GetComponent <NPCDamageReciever> ())
        {
            npcTargets.Add(npcStats);
        }

        else if (pdr = target.GetComponent <PlayerDamageReciever> ())
        {
            pdrTargets.Add(pdr);
        }

        if (!IsInvoking("Attack"))
        {
            InvokeRepeating("Attack", 0, interval);
        }
    }
Ejemplo n.º 3
0
    // ......................................................................... Ein Ziel in Reichweite?

    /// <summary>
    /// Prueft, ob das neue Objekt im Angriffsradius angreifbar ist. Falls ja,
    /// dann wird es in die Zielliste eingetragen und ein Angriff wird gestartet.
    /// </summary>
    /// <param name="target">Collider eines moeglichen Ziels.</param>
    ///
    void OnTriggerEnter(Collider target)
    {
        if (target.tag.Equals("" + team) || (!target.tag.Equals("0") && !target.tag.Equals("1")))
        {
            return;
        }

        if (npcStats = target.GetComponent <NPCDamageReciever> ())
        {
            npcTargets.Add(npcStats);
        }

        else if (playerStats = target.GetComponent <PlayerDamageReciever> ())
        {
            playerTargets.Add(playerStats);
        }

        if (!IsInvoking("Attack") && !IsInvoking("Follow"))
        {
            float tempTime = Time.fixedTime - ttt;
            InvokeRepeating("Attack", (tempTime > 2) ? 0 : 2 - tempTime, interval);
        }
    }
Ejemplo n.º 4
0
    // ......................................................................................... Angriff


    /// <summary>
    /// Geht in Intervallen die Ziellisten durch und attackiert pro Durchlauf ein
    /// Ziel. Ausserdem wird darauf geachtet, dass zuerst die NPCs angegriffen werden.
    /// </summary>
    ///
    void Attack()
    {
        ttt = Time.fixedTime;
        // Greife NPC an
        // temp -> wegen doppelter Zugriff auf List mit Remove bei null
        // während eines Angriffs kann das Ziel jemand anderes toeten
        NPCDamageReciever[] tempNpcTargets = new NPCDamageReciever[npcTargets.Count];
        npcTargets.CopyTo(tempNpcTargets);

        // Gehe alle Ziele durch bis ein Treffer
        foreach (NPCDamageReciever t in tempNpcTargets)
        {
            if (t)
            {
                if (Vector3.Distance(t.transform.position, transform.position) <= range * 2)
                {
                    t.TakeDamage(damage, attacker, t.netId.Value);
                }
                else
                {
                    secondTarget = t.transform;
                    InvokeRepeating("Follow", 0, Time.deltaTime);
                    CancelInvoke("Attack");
                    Reset();
                }

                return;
            }
            else
            {
                npcTargets.Remove(t);
            }
        }


        // kein NPC vorhanden bzw. getroffen weil null wegen gestorben
        // Greife Spieler an
        PlayerDamageReciever[] tempPlayerTargets = new PlayerDamageReciever[playerTargets.Count];
        playerTargets.CopyTo(tempPlayerTargets);

        foreach (PlayerDamageReciever t in tempPlayerTargets)
        {
            if (t)
            {
                if (Vector3.Distance(t.transform.position, transform.position) <= range * 2)
                {
                    t.TakeDamage(damage, attacker, t.netId.Value);
                }
                else
                {
                    secondTarget = t.transform;
                    InvokeRepeating("Follow", 0, Time.deltaTime);
                    CancelInvoke("Attack");
                    Reset();
                }

                return;
            }
            else
            {
                playerTargets.Remove(t);
            }
        }

        // Ersatz für OnTriggerExit, wenn innerhalb des Radius alle
        // Listen leer werden.
        Reset();
    }