コード例 #1
0
        void Update(object o)
        {
            if (LoggedIn && Connected)
            {
                NetworkStream stream = tcpClient.GetStream();
                ClientRequest req    = new ClientRequest(this.LocalID);

                if (ServerInfo.GamePhase == GamePhase.Lobby)
                {
                    Stopwatch stopky = new Stopwatch();
                    stopky.Start();

                    req.Purpose = RequestPurpose.LobbyStatus;
                    req.Data    = new object[] { ServersideClientInfo.FromClient(this) };
                    req.SendTo(stream);

                    ServerResponse resp = ServerResponse.ReceiveFrom(stream);

                    if (resp.Purpose == ResponseType.LobbyInfo)
                    {
                        this.ServerInfo = (ClientsideServerInfo)resp.Data[0];
                        this.LobbyMenu.UpdateItems();
                        this.LobbyMenu.Draw();
                    }
                    else
                    {
                        throw new NotImplementedException();
                    }

                    stopky.Stop();
                    this.Ping = (int)stopky.ElapsedMilliseconds;
                }
            }
        }
コード例 #2
0
        void OnConnect(IAsyncResult result)
        {
            work++;
            if (tcpClient.Connected)
            {
                NetworkStream stream = tcpClient.GetStream();

                ClientRequest req = new ClientRequest(-1);
                req.Purpose = RequestPurpose.Login;
                req.Data    = new object[] { Character.Name, Character.ToString() };
                req.SendTo(stream);

                ServerResponse resp = ServerResponse.ReceiveFrom(stream);
                if (resp.Purpose == ResponseType.LoginAccepted)
                {
                    this.LocalID    = (int)resp.Data[0];
                    this.ServerInfo = (ClientsideServerInfo)resp.Data[1];
                    LoggedIn        = true;
                }
                else // resp.Purpose == ResponseType.ActionDenied;
                {
                    this.ErrorMessage = (string)resp.Data[0];
                }
            }
            work--;
        }
コード例 #3
0
 public GameClient()
 {
     LobbyMenu  = new LobbyMenu(this);
     ServerInfo = new ClientsideServerInfo();
     tcpClient  = new TcpClient();
     Character  = new PlayerCharacter();
     Character.Randomize();
 }
コード例 #4
0
        void OnConnect(TcpServerConnection connection)
        {
            NetworkStream stream = connection.Socket.GetStream();
            ClientRequest req    = null;

            try
            {
                req = ClientRequest.ReceiveFrom(stream);
            }
            catch
            {
                return;
            }

            if (req.Purpose == RequestPurpose.Login)
            {
                if (FreeSlots > 0 && CurrentGame.Phase == GamePhase.Lobby)
                {
                    ServersideClientInfo client = new ServersideClientInfo();
                    client.Connection        = connection;
                    client.PlayerName        = (string)req.Data[0];
                    client.CharacterToString = (string)req.Data[1];
                    client.ClientID          = Clients.Count;
                    Clients.Add(client);

                    ServerResponse toSend = new ServerResponse();
                    toSend.Purpose = ResponseType.LoginAccepted;
                    toSend.Data    = new object[] { client.ClientID, ClientsideServerInfo.FromServer(this) };
                    toSend.SendTo(stream);
                }
                else
                {
                    ServerResponse toSend = new ServerResponse();
                    toSend.Purpose = ResponseType.ActionDenied;
                    toSend.Data    = new object[] { "" };
                    if (FreeSlots == 0)
                    {
                        toSend.Data[0] = "Server full";
                    }
                    else
                    {
                        toSend.Data[0] = "Game in progress";
                    }

                    toSend.SendTo(stream);
                    server.Connections.Remove(connection);
                }
            }
        }
コード例 #5
0
        public ServerResponse ProcessRequest(ClientRequest req)
        {
            if (CurrentGame.Phase == GamePhase.Lobby)
            {
                if (req.Purpose == RequestPurpose.LobbyStatus)
                {
                    this.Clients[req.ClientID] = (ServersideClientInfo)req.Data[0];

                    ServerResponse toSend = new ServerResponse();
                    toSend.Purpose = ResponseType.LobbyInfo;
                    toSend.Data    = new object[] { ClientsideServerInfo.FromServer(this) };
                    return(toSend);
                }
            }

            ServerResponse denied = new ServerResponse();

            denied.Purpose = ResponseType.ActionDenied;
            denied.Data    = new object[] { "" };
            return(denied);
        }