/// <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> /// Initialisiert die lokale Instanz. /// </summary> public override void OnStartLocalPlayer() { // Gebe Daten an Duplikate weiter CmdSyncPlayerData(data); NetworkManager.singleton.client.connection.RegisterHandler(9999, OnGlobalMatchEvent); // Setze Teamzugehoerigkeit lokaler Instanz GameObject.Find("NetworkManager").GetComponent <Manager>().myTeam = data.team; transform.tag = "" + data.team; // Erstelle Symbol in der Miniaturkarte GetComponentInParent <DynamicMiniMapSymbol> ().CreateLokalPlayerSymbol(); // Aktiviere Charaktersteuerung SetUpPlayerController(); // Aktiviere aufladbare Faehigkeit (GUI) GetComponentInParent <PlayerSkillsGUI> ().enabled = true; // GUI Elemente linke obere Ecke sliderExp = GameObject.Find("slider_exp").GetComponent <Slider> (); sliderExp.maxValue = 10; sliderExp.value = sliderExp.minValue; sliderLife = GameObject.Find("slider_life").GetComponent <Slider> (); sliderLife.maxValue = 300; sliderLife.value = sliderLife.maxValue; txtExp = GameObject.Find("txt_exp").GetComponent <Text> (); txtLife = GameObject.Find("txt_life").GetComponent <Text> (); txtExp.text = "Erfahrung: " + sliderExp.value + "/" + sliderExp.maxValue + " | Level: "; txtLife.text = "Leben: " + sliderLife.value + "/" + sliderLife.maxValue; txtArmor = GameObject.Find("txt_armor").GetComponent <Text> (); txtDamage = GameObject.Find("txt_damage").GetComponent <Text> (); // Initialisiere Komponente die die Schadenspunkte verarbeitet pdr = GetComponentInParent <PlayerDamageReciever> (); // Aktiviere aufladbare Faehigkeit enemy = (transform.tag.Equals("0")) ? "1" : "0"; GetComponentInParent <PlayerSkills> ().Init(damage, enemy); }
/// <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(); }