/// <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(); }
/// <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); } }
// ......................................................................... 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); } }
// ......................................................................................... 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(); }