From f977376ac33d26ff44188ebb6c55a5c787f0a2d4 Mon Sep 17 00:00:00 2001 From: Scionwest_cp Date: Tue, 5 Jun 2012 20:46:11 -0700 Subject: [PATCH] Player.ToString retuns IPlayer.Name ServerDirector.GetPlayer() helper method added for getting a player from the server without providing access to the servers collection libraries. ConnectState.Render() has some test code used when writing ServerDirector.GetPlayer() Started converting ConnectedPlayer and ConnectedThread collections to a single Dictionary collection. Not migrating everything to it until helper methods are finished. --- .../Abstract.Actions/ILoadable.cs | 1 - .../WinPC.Engine/Abstract.Core/IPlayer.cs | 2 +- MudEngine/WinPC.Engine/Core/Player.cs | 10 ++++- .../WinPC.Engine/Directors/ServerDirector.cs | 43 ++++++++++++++----- MudEngine/WinPC.Engine/States/ConnectState.cs | 15 +++++-- .../WinPC.Engine/States/MainMenuState.cs | 1 - 6 files changed, 54 insertions(+), 18 deletions(-) diff --git a/MudEngine/WinPC.Engine/Abstract.Actions/ILoadable.cs b/MudEngine/WinPC.Engine/Abstract.Actions/ILoadable.cs index d617125..4885cc0 100644 --- a/MudEngine/WinPC.Engine/Abstract.Actions/ILoadable.cs +++ b/MudEngine/WinPC.Engine/Abstract.Actions/ILoadable.cs @@ -2,6 +2,5 @@ { public interface ILoadable { - } } \ No newline at end of file diff --git a/MudEngine/WinPC.Engine/Abstract.Core/IPlayer.cs b/MudEngine/WinPC.Engine/Abstract.Core/IPlayer.cs index 9821eea..d0df55c 100644 --- a/MudEngine/WinPC.Engine/Abstract.Core/IPlayer.cs +++ b/MudEngine/WinPC.Engine/Abstract.Core/IPlayer.cs @@ -3,7 +3,7 @@ public interface IPlayer { IState CurrentState { get; } - + string Name { get; set; } void Disconnect(); } } \ No newline at end of file diff --git a/MudEngine/WinPC.Engine/Core/Player.cs b/MudEngine/WinPC.Engine/Core/Player.cs index 2da0550..73d3a1f 100644 --- a/MudEngine/WinPC.Engine/Core/Player.cs +++ b/MudEngine/WinPC.Engine/Core/Player.cs @@ -9,12 +9,15 @@ namespace WinPC.Engine.Core public Socket Connection { get; private set; } public IState CurrentState { get; private set; } - public List buffer = new List(); + public List buffer = new List(); + + public string Name { get; set; } public Player(IState initialState, Socket connection) { Connection = connection; CurrentState = initialState; + Name = "Player"; } public void Disconnect() @@ -26,5 +29,10 @@ namespace WinPC.Engine.Core { CurrentState = state; } + + public override string ToString() + { + return this.Name; + } } } \ No newline at end of file diff --git a/MudEngine/WinPC.Engine/Directors/ServerDirector.cs b/MudEngine/WinPC.Engine/Directors/ServerDirector.cs index c500af5..09be286 100644 --- a/MudEngine/WinPC.Engine/Directors/ServerDirector.cs +++ b/MudEngine/WinPC.Engine/Directors/ServerDirector.cs @@ -2,10 +2,12 @@ using System.Collections.Generic; using System.Net.Sockets; using System.Threading; +using System.Linq; using WinPC.Engine.Abstract.Directors; using WinPC.Engine.Abstract.Networking; using WinPC.Engine.Core; using WinPC.Engine.States; +using WinPC.Engine.Abstract.Core; namespace WinPC.Engine.Directors { @@ -15,7 +17,8 @@ namespace WinPC.Engine.Directors public List ConnectionThreads { get; private set; } public List ConnectedPlayers { get; private set; } - + public Dictionary ConnectedUsers { get; private set; } + public IServer Server { get; set; } public ServerDirector(IServer server) @@ -23,7 +26,7 @@ namespace WinPC.Engine.Directors Server = server; ConnectedPlayers = new List(Server.MaxConnections); ConnectionThreads = new List(Server.MaxConnections); - + ConnectedUsers = new Dictionary(); } public void AddConnection(Socket connection) @@ -31,8 +34,12 @@ namespace WinPC.Engine.Directors var player = new Player(new ConnectState(this), connection); ConnectedPlayers.Add(player); + Thread userThread = new Thread(ReceiveDataThread); + + //TODO: Replace ConnectedPlayers and ConnectionThreads with ConnectedUsers + ConnectedUsers.Add(player, userThread); - ConnectionThreads.Add(new Thread(ReceiveDataThread)); + ConnectionThreads.Add(userThread); var index = ConnectionThreads.Count - 1; ConnectionThreads[index].Name = "Player"; @@ -43,11 +50,11 @@ namespace WinPC.Engine.Directors public void ReceiveDataThread(object index) { - var player = ConnectedPlayers[(int) index]; + var player = ConnectedPlayers[(int)index]; while (Server.Enabled) { - player.CurrentState.Render((int) index); + player.CurrentState.Render((int)index); var command = player.CurrentState.GetCommand(); command.Execute(); } @@ -55,7 +62,7 @@ namespace WinPC.Engine.Directors public void DisconnectAll() { - foreach(var player in ConnectedPlayers) + foreach (var player in ConnectedPlayers) { player.Disconnect(); } @@ -100,19 +107,35 @@ namespace WinPC.Engine.Directors } else if (recved == 0) //Disconnected { - // ConnectedPlayers[index]. Connected = false; - // this.LoggedIn = false; + // ConnectedPlayers[index]. Connected = false; + // this.LoggedIn = false; return "Disconnected."; } } catch (Exception e) { //Flag as disabled - // this.Connected = false; - // this.LoggedIn = false; + // this.Connected = false; + // this.LoggedIn = false; return e.Message; } } } + + /// + /// Returns a reference to the specified player if s/he is connected to the server. + /// + /// Name of the player to return + /// + public bool GetPlayer(string name, out IPlayer player) + { + var connectedPlayer = from p in ConnectedUsers + where p.Key.Name == name + select p.Key; + + player = connectedPlayer.First(); + + return player == null ? true : false; + } } } \ No newline at end of file diff --git a/MudEngine/WinPC.Engine/States/ConnectState.cs b/MudEngine/WinPC.Engine/States/ConnectState.cs index f3b3c2b..514c2dc 100644 --- a/MudEngine/WinPC.Engine/States/ConnectState.cs +++ b/MudEngine/WinPC.Engine/States/ConnectState.cs @@ -4,6 +4,7 @@ using System.Text; using WinPC.Engine.Abstract.Core; using WinPC.Engine.Commands; using WinPC.Engine.Directors; +using WinPC.Engine.Core; namespace WinPC.Engine.States { @@ -26,11 +27,17 @@ namespace WinPC.Engine.States Connection = Director.ConnectedPlayers[index].Connection; - Director.ConnectedPlayers[index].Connection.Send(Encoding.GetBytes("Welcome to Scionwest's Mud Engine!"+"\n\r")); - Director.ConnectedPlayers[index].Connection.Send(Encoding.GetBytes("Please enter your name" + "\n\r")); + Connection.Send(Encoding.GetBytes("Welcome to Scionwest's Mud Engine!"+"\n\r")); + Connection.Send(Encoding.GetBytes("Please enter your name" + "\n\r")); - - + //Just used for testing ServerDirector.GetPlayer method + IPlayer player = null; + bool validPlayer = Director.GetPlayer("Player", out player); + + //player = player ?? new IPlayer().Create(); + + if (validPlayer) + Connection.Send(Encoding.GetBytes("Welcome " + player.Name)); } public ICommand GetCommand() diff --git a/MudEngine/WinPC.Engine/States/MainMenuState.cs b/MudEngine/WinPC.Engine/States/MainMenuState.cs index 0a5f4e5..58e2592 100644 --- a/MudEngine/WinPC.Engine/States/MainMenuState.cs +++ b/MudEngine/WinPC.Engine/States/MainMenuState.cs @@ -27,7 +27,6 @@ namespace WinPC.Engine.States Connection = Director.ConnectedPlayers[index].Connection; Director.ConnectedPlayers[index].Connection.Send(Encoding.GetBytes("Your now in the Main Menu State Welcome!! !"+"\n\r")); -