/// <summary>
        /// Player is allowed to join game, controllable actor should be created
        /// </summary>
        private void OnPacketCreateControllablePlayer(ref CreateControllablePlayer p)
        {
            // ToDo: throw on mismatch?
            localPlayerIndex = p.Index;

            PlayerType type         = p.Type;
            Vector3    pos          = p.Pos;
            byte       health       = p.Health;
            bool       controllable = p.Controllable;

            Await.NextAfterUpdate().OnCompleted(() => {
                if (players.Count > 0)
                {
                    Player oldPlayer = players[0];
                    if (oldPlayer.PlayerType == type)
                    {
                        oldPlayer.Respawn(pos.Xy);
                        oldPlayer.Health = health;
                        return;
                    }

                    RemoveActor(oldPlayer);
                    Players.Remove(oldPlayer);
                }

                Player player = new Player();
                player.OnActivated(new ActorActivationDetails {
                    LevelHandler = this,
                    Pos          = pos,
                    Params       = new[] { (ushort)type, (ushort)0 }
                });
                player.Health = health;
                AddPlayer(player);

                cameras[0].Transform.Pos = new Vector3(pos.Xy, 0);
                cameras[0].GetComponent <CameraController>().TargetObject = player;

                Hud hud          = rootObject.AddComponent <Hud>();
                hud.LevelHandler = this;
                player.AttachToHud(hud);

                //player.ReceiveLevelCarryOver(data.ExitType, ref data.PlayerCarryOvers[i]);

                // Wait for server to start game
                player.IsControllableExternal = controllable;
            });
        }
Beispiel #2
0
        private void OnCreateControllablePlayer(ref CreateControllablePlayer p)
        {
            // ToDo: throw on mismatch?
            localPlayerIndex = p.Index;

            PlayerType type   = p.Type;
            Vector3    pos    = p.Pos;
            byte       health = p.Health;

            Root.DispatchToMainThread(delegate {
                if (players.Count > 0)
                {
                    Player oldPlayer = players[0];
                    if (oldPlayer.PlayerType == type)
                    {
                        oldPlayer.Respawn(pos.Xy);
                        oldPlayer.Health = health;
                        return;
                    }

                    RemoveActor(oldPlayer);
                    Players.Remove(oldPlayer);
                }

                Player player = new Player();
                player.OnActivated(new ActorActivationDetails {
                    Api    = Api,
                    Pos    = pos,
                    Params = new[] { (ushort)type, (ushort)0 }
                });
                player.Health = health;
                AddPlayer(player);

                cameras[0].Transform.Pos = new Vector3(pos.Xy, 0);
                cameras[0].GetComponent <CameraController>().TargetObject = player;

                player.AttachToHud(rootObject.AddComponent <Hud>());

                //player.ReceiveLevelCarryOver(data.ExitType, ref data.PlayerCarryOvers[i]);
            });
        }