Esempio n. 1
0
 public override void OnServerReady(NetworkConnection conn)
 {
     NetworkServer.SetClientReady(conn);
     foreach (var player in PlayerManager.MatchPlayers)
     {
         conn.Send(Messages.UpdatePlayer, UpdatePlayerMessage.FromPlayer(player));
     }
 }
Esempio n. 2
0
 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));
             }
         };
     }
 }
Esempio n. 3
0
        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);
            });
        }