/// <summary> /// Erstellt einen Spielcharakter, den ein Client mit Voreinstellungen angefragt hat. Nach der Erstellung wird alle Clients /// der neue Spieler mitgeteilt. /// (INFO: Die Methode wird in der Serverinstanz aufgerufen, wenn Client einen Spielcharakter erstellen bzw. haben moechte.) /// </summary> /// <param name="conn">Verbindung zum Client, der die Anfrage gesendet hat.</param> /// <param name="playerControllerId">ID des Spielers, der in Vebindung zum Objekt steht.</param> /// <param name="extraMessageReader">Voreinstellungen.</param> public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId, NetworkReader extraMessageReader) { // Lasse keinen Client mitspielen, wenn Match zu ende if (gameOver) { conn.Disconnect(); return; } // Lese Voreinstellungen aus der ersten Szene und erstelle daraus den angefragten Charakter SettingsNetworkMessage message = extraMessageReader.ReadMessage <SettingsNetworkMessage>(); GameObject player = Instantiate(Resources.Load("playable_chars/" + message.character, typeof(GameObject))) as GameObject; // Schreibe Matchdaten in die lokale Konfiguration, die der Client an seine Duplikate verteilt player.transform.GetComponent <PlayerConfig> ().SetPlayerData(matchData.AddPlayer(conn.connectionId, message.playerName)); NetworkServer.AddPlayerForConnection(conn, player, playerControllerId); // Sende diesbezueglich globale Nachricht (aktuelle Anzahl der Spieler) GlobalMatchEventMessage gmem = new GlobalMatchEventMessage(); if (NetworkServer.connections.Count == (maxConnections + 1)) { gmem.message = NetworkServer.connections.Count + " / " + (maxConnections + 1) + " Spieler on"; gmem.gameState = true; } else { gmem.message = NetworkServer.connections.Count + " / " + (maxConnections + 1) + " Spieler on"; } NetworkServer.SendToAll(9999, gmem); }
/// <summary> /// Entfernt einen Client aus Matchdaten, sobald dieser die Verbindung abbricht. Nach der /// Entfernung wird weiteren Spielern die neue Spielerzahl mitgeteilt. /// (INFO: Die Methode wird in der Serverinstanz aufgerufen, wenn Verbindung zum Client abbricht.) /// </summary> /// <param name="conn">Verbindung zum Client.</param> public override void OnServerDisconnect(NetworkConnection conn) { matchData.RemovePlayer(conn.connectionId); base.OnServerDisconnect(conn); // Sende diesbezueglich globale Nachricht GlobalMatchEventMessage gmem = new GlobalMatchEventMessage(); gmem.message = (NetworkServer.connections.Count - 1) + " / " + (maxConnections + 1) + " Spieler on"; NetworkServer.SendToAll(9999, gmem); }
/// <summary> /// Aktuallisiert die Lebenspunkte, nachdem die Variable ([SyncVar] life) den /// Zustand aendert. /// </summary> /// <param name="life">Aktuelle lebenspunkte.</param> private void UpdateLifeState(float life) { info.SetHealthBarValue(life); if (life < 1) { // Wenn Ziel eine Basis, dann Sende diesbezueglich globale Nachricht // (Event: Matchende) if (transform.name.Contains("base")) { GlobalMatchEventMessage gmem = new GlobalMatchEventMessage(); gmem.gameState = false; NetworkServer.SendToAll(9999, gmem); } Destroy(gameObject); } }
/// <summary> /// Verarbeitet globale Netzwerknachrichten vor dem Start einer Spielrunde. /// </summary> /// <param name="message">Globale Netzwerknachricht.</param> private void OnGlobalMatchEvent(NetworkMessage message) { GlobalMatchEventMessage gmem = message.ReadMessage <GlobalMatchEventMessage> (); // Spieler vollzaehlig if (isLocalPlayer && gmem.gameState) { // Erzeuge dynamische NPCs if (isServer) { GameObject.Find("NPCManager").GetComponent <NPCManager>().CreateNPCs(); } // Entferne Begrenzung, damit Einheiten durchlaufen und sich gegenseitig angreifen koennen Destroy(GameObject.Find("block")); // Aktiviere Inventra bzw. Shop SetUpPlayerInventar(); } // Schreibe aktuelle Anzahl der Spieler, die dem Match beigetreten sind GameObject.Find("txt_player_num").GetComponent <Text> ().text = gmem.message; }