public override void OnServerReady(NetworkConnection conn) { NetworkServer.SetClientReady(conn); foreach (var player in PlayerManager.MatchPlayers) { conn.Send(Messages.UpdatePlayer, UpdatePlayerMessage.FromPlayer(player)); } }
public override void OnStartServer() { DestroyLeftoverPlayers(); // Update players when they change foreach (var player in PlayerManager.MatchPlayers) { player.Changed += () => { if (Network.isServer) { NetworkServer.SendToAll(Messages.UpdatePlayer, UpdatePlayerMessage.FromPlayer(player)); } }; } }
void AddPlayer(NetworkConnection conn, short playerControllerId, PlayerSelection selection) { if (playerControllerId < conn.playerControllers.Count && conn.playerControllers[playerControllerId].IsValid && conn.playerControllers[playerControllerId].gameObject != null) { Log.Error("There is already a player at that playerControllerId for this connections."); return; } var startPosition = GetStartPosition(); var character = selection.Character; bool random = character == null; Analytics.CustomEvent("characterSelected", new Dictionary <string, object> { { "character", character != null ? character.name : "Random" }, { "color", selection.Pallete }, }); if (random) { Log.Info("No character was specfied, randomly selecting character and pallete..."); selection.Character = DataManager.Characters.Random(); selection.Pallete = Mathf.FloorToInt(Random.value * selection.Character.PalleteCount); } var sameCharacterSelections = new HashSet <PlayerSelection>(PlayerManager.MatchPlayers.Select(p => p.Selection)); if (sameCharacterSelections.Contains(selection)) { bool success = false; for (var i = 0; i < selection.Character.PalleteCount; i++) { selection.Pallete = i; if (!sameCharacterSelections.Contains(selection)) { success = true; break; } } if (!success) { Log.Error("Two players made the same selection, and no remaining palletes remain. {0} doesn't have enough colors".With(selection.Character)); ClientScene.RemovePlayer(playerControllerId); return; } } selection.Character.Prefab.LoadAsync().Then(prefab => { if (prefab == null) { Log.Error("The character {0} does not have a prefab. Please add a prefab object to it.", selection.Character); return; } if (prefab.GetComponent <NetworkIdentity>() == null) { Log.Error( "The character prefab for {0} does not have a NetworkIdentity. Please add a NetworkIdentity to it's prefab.", selection.Character); return; } GameObject playerObj; if (startPosition != null) { playerObj = Instantiate(prefab, startPosition.position, startPosition.rotation); } else { playerObj = Instantiate(prefab, Vector3.zero, Quaternion.identity); } var player = PlayerManager.MatchPlayers.Get(playerCount); playerObj.name = "Player {0} ({1},{2})".With(playerCount + 1, selection.Character.name, selection.Pallete); NetworkServer.AddPlayerForConnection(conn, playerObj, playerControllerId); var colorState = playerObj.GetComponentInChildren <ColorState>(); if (colorState != null) { colorState.Pallete = selection.Pallete; } player.Selection = selection; player.Type = PlayerType.HumanPlayer; player.PlayerObject = playerObj; playerCount++; NetworkServer.SendToAll(Messages.UpdatePlayer, UpdatePlayerMessage.FromPlayer(player)); var playerConnection = new PlayerConnection { ConnectionID = conn.connectionId, PlayerControllerID = playerControllerId }; PlayerMap[playerConnection] = player; playerObj.GetComponentsInChildren <IDataComponent <Player> >().SetData(player); //player.Changed += () => playerObj.GetComponentInChildren<IDataComponent<Player>>().SetData(player); }); }