예제 #1
0
        public void Message_PlayerUpdateReceived(PlayerUpdateMessage message)
        {
            if(message.Action == PlayerUpdateAction.Add)
            {
                PokePlayer player = new PokePlayer();
                player.ID = message.NetworkID;
                player.IsLoaded = false;

                this.network.AddPlayer(message.NetworkID, player);

                PlayerRequestMessage msg = new PlayerRequestMessage () { RequestedPlayerNetworkID = message.NetworkID };

                this.network.Send(msg);
            }
            else
            {
                this.network.RemovePlayer(message.NetworkID);
            }
        }
        private void UpdateRanges()
        {
            while(this.Started)
            {
                var result = this.players.UpdateRanges ();

                foreach(var player in result)
                {
                    foreach(var playerchange in player.Value)
                    {
                        if(playerchange.State == RangeChangeStates.Add)
                        {
                            PlayerUpdateMessage updmsg = new PlayerUpdateMessage ()
                            {
                                NetworkID = playerchange.Player.NetworkID,
                                Action = PlayerUpdateAction.Add,
                                CharacterName = playerchange.Player.Character.Name,
                            };

                            player.Key.Connection.Send (updmsg);
                        }
                        else
                        {
                            PlayerUpdateMessage updmsg = new PlayerUpdateMessage ()
                            {
                                NetworkID = playerchange.Player.NetworkID,
                                Action = PlayerUpdateAction.Remove,
                                CharacterName = playerchange.Player.Character.Name,
                            };

                            player.Key.Connection.Send (updmsg);
                        }

                    }
                }

                Thread.Sleep (this.RangeUpdateFrequency);
            }
        }
        private void LoginRequestReceived(MessageReceivedEventArgs ev)
        {
            var msg = (LoginMessage)ev.Message;

            ISession session = this.sessionfactory.OpenSession ();

            Account account = session.CreateCriteria<Account>()
                .Add(Restrictions.InsensitiveLike("Username", msg.Username ))
                .Add(Restrictions.Eq("Password", msg.Password ))
                .List<Account>().FirstOrDefault();

            if (account == null || this.players.ContainsPlayer((uint)account.ID))
            {
                ev.Connection.Send (new LoginFailedMessage (ConnectionRejectedReason.BadLogin));
                return;
            }

            Character character = session.CreateCriteria<Character> ()
                .Add(Restrictions.Eq("AccountID", account.ID))
                .List<Character>().FirstOrDefault();

            character.Location = new ScreenPoint(character.MapX * 32, character.MapY * 32);
            character.Animation = Enum.GetName (typeof(Directions), character.Direction);
            character.NextMoveActive = true;

            // Create player
            NetworkPlayer player = new NetworkPlayer();
            player.Character = character;
            player.AccountID = account.ID;
            //player.NetworkID = ++networkid;
            player.NetworkID = (uint) account.ID;
            player.Character.NetworkID = player.NetworkID;
            player.Connection = ev.Connection;
            player.Character.MapChunkName = this.GetChunkName(player.Character.WorldName, player.Character.MapLocation);
            player.State = PlayerState.LoggedIn;

            // Add to the list of players in the servers memory
            this.players.AddPlayer(player);

            // Send them authentication ID
            player.Connection.Send(new LoginSuccessMessage () { NetworkIDAssigned = player.NetworkID });

            var handler = this.UserLoggedIn;
            if(handler != null)
                handler(this, new UserEventArgs(player));

            // Update other players
            var updatemsg = new PlayerUpdateMessage ()
            {
                CharacterName = player.Character.Name,
                NetworkID = player.NetworkID,
                Action = PlayerUpdateAction.Add
            };

            foreach (var tmp in this.players.GetPlayers())
                tmp.Connection.Send(updatemsg);

            session.Close ();
        }
        public void Disconnect(IConnection connection)
        {
            connection.MessageReceived -= this.Server_MessageReceived;
            connection.Disconnected -= this.Server_Disconnected;

            if(connection.IsConnected)
                connection.Disconnect();

            NetworkPlayer player = this.players.GetPlayer(connection);

            PlayerUpdateMessage updatemsg = new PlayerUpdateMessage();
            updatemsg.Action = PlayerUpdateAction.Remove;
            updatemsg.NetworkID = player.NetworkID;

            lock(this.players.PlayerLock)
            {
                foreach(var nplayer in this.players.PlayerRanges[player.NetworkID])
                    nplayer.Connection.Send (updatemsg);
            }

            this.players.RemovePlayer (connection);

            this.SaveCharacter(player.Character);

            // fire logged out event
            var handler = this.UserLoggedOut;
            if(handler != null)
                handler (this, new UserEventArgs (player));
        }