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.
This commit is contained in:
Scionwest_cp 2012-06-05 20:46:11 -07:00
parent ca97b9c439
commit f977376ac3
6 changed files with 54 additions and 18 deletions

View file

@ -2,6 +2,5 @@
{ {
public interface ILoadable public interface ILoadable
{ {
} }
} }

View file

@ -3,7 +3,7 @@
public interface IPlayer public interface IPlayer
{ {
IState CurrentState { get; } IState CurrentState { get; }
string Name { get; set; }
void Disconnect(); void Disconnect();
} }
} }

View file

@ -9,12 +9,15 @@ namespace WinPC.Engine.Core
public Socket Connection { get; private set; } public Socket Connection { get; private set; }
public IState CurrentState { get; private set; } public IState CurrentState { get; private set; }
public List<byte> buffer = new List<byte>(); public List<byte> buffer = new List<byte>();
public string Name { get; set; }
public Player(IState initialState, Socket connection) public Player(IState initialState, Socket connection)
{ {
Connection = connection; Connection = connection;
CurrentState = initialState; CurrentState = initialState;
Name = "Player";
} }
public void Disconnect() public void Disconnect()
@ -26,5 +29,10 @@ namespace WinPC.Engine.Core
{ {
CurrentState = state; CurrentState = state;
} }
public override string ToString()
{
return this.Name;
}
} }
} }

View file

@ -2,10 +2,12 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Net.Sockets; using System.Net.Sockets;
using System.Threading; using System.Threading;
using System.Linq;
using WinPC.Engine.Abstract.Directors; using WinPC.Engine.Abstract.Directors;
using WinPC.Engine.Abstract.Networking; using WinPC.Engine.Abstract.Networking;
using WinPC.Engine.Core; using WinPC.Engine.Core;
using WinPC.Engine.States; using WinPC.Engine.States;
using WinPC.Engine.Abstract.Core;
namespace WinPC.Engine.Directors namespace WinPC.Engine.Directors
{ {
@ -15,7 +17,8 @@ namespace WinPC.Engine.Directors
public List<Thread> ConnectionThreads { get; private set; } public List<Thread> ConnectionThreads { get; private set; }
public List<Player> ConnectedPlayers { get; private set; } public List<Player> ConnectedPlayers { get; private set; }
public Dictionary<Player, Thread> ConnectedUsers { get; private set; }
public IServer Server { get; set; } public IServer Server { get; set; }
public ServerDirector(IServer server) public ServerDirector(IServer server)
@ -23,7 +26,7 @@ namespace WinPC.Engine.Directors
Server = server; Server = server;
ConnectedPlayers = new List<Player>(Server.MaxConnections); ConnectedPlayers = new List<Player>(Server.MaxConnections);
ConnectionThreads = new List<Thread>(Server.MaxConnections); ConnectionThreads = new List<Thread>(Server.MaxConnections);
ConnectedUsers = new Dictionary<Player, Thread>();
} }
public void AddConnection(Socket connection) public void AddConnection(Socket connection)
@ -31,8 +34,12 @@ namespace WinPC.Engine.Directors
var player = new Player(new ConnectState(this), connection); var player = new Player(new ConnectState(this), connection);
ConnectedPlayers.Add(player); 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; var index = ConnectionThreads.Count - 1;
ConnectionThreads[index].Name = "Player"; ConnectionThreads[index].Name = "Player";
@ -43,11 +50,11 @@ namespace WinPC.Engine.Directors
public void ReceiveDataThread(object index) public void ReceiveDataThread(object index)
{ {
var player = ConnectedPlayers[(int) index]; var player = ConnectedPlayers[(int)index];
while (Server.Enabled) while (Server.Enabled)
{ {
player.CurrentState.Render((int) index); player.CurrentState.Render((int)index);
var command = player.CurrentState.GetCommand(); var command = player.CurrentState.GetCommand();
command.Execute(); command.Execute();
} }
@ -55,7 +62,7 @@ namespace WinPC.Engine.Directors
public void DisconnectAll() public void DisconnectAll()
{ {
foreach(var player in ConnectedPlayers) foreach (var player in ConnectedPlayers)
{ {
player.Disconnect(); player.Disconnect();
} }
@ -100,19 +107,35 @@ namespace WinPC.Engine.Directors
} }
else if (recved == 0) //Disconnected else if (recved == 0) //Disconnected
{ {
// ConnectedPlayers[index]. Connected = false; // ConnectedPlayers[index]. Connected = false;
// this.LoggedIn = false; // this.LoggedIn = false;
return "Disconnected."; return "Disconnected.";
} }
} }
catch (Exception e) catch (Exception e)
{ {
//Flag as disabled //Flag as disabled
// this.Connected = false; // this.Connected = false;
// this.LoggedIn = false; // this.LoggedIn = false;
return e.Message; return e.Message;
} }
} }
} }
/// <summary>
/// Returns a reference to the specified player if s/he is connected to the server.
/// </summary>
/// <param name="player">Name of the player to return</param>
/// <returns></returns>
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;
}
} }
} }

View file

@ -4,6 +4,7 @@ using System.Text;
using WinPC.Engine.Abstract.Core; using WinPC.Engine.Abstract.Core;
using WinPC.Engine.Commands; using WinPC.Engine.Commands;
using WinPC.Engine.Directors; using WinPC.Engine.Directors;
using WinPC.Engine.Core;
namespace WinPC.Engine.States namespace WinPC.Engine.States
{ {
@ -26,11 +27,17 @@ namespace WinPC.Engine.States
Connection = Director.ConnectedPlayers[index].Connection; Connection = Director.ConnectedPlayers[index].Connection;
Director.ConnectedPlayers[index].Connection.Send(Encoding.GetBytes("Welcome to Scionwest's Mud Engine!"+"\n\r")); 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("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() public ICommand GetCommand()

View file

@ -27,7 +27,6 @@ namespace WinPC.Engine.States
Connection = Director.ConnectedPlayers[index].Connection; Connection = Director.ConnectedPlayers[index].Connection;
Director.ConnectedPlayers[index].Connection.Send(Encoding.GetBytes("Your now in the Main Menu State Welcome!! !"+"\n\r")); Director.ConnectedPlayers[index].Connection.Send(Encoding.GetBytes("Your now in the Main Menu State Welcome!! !"+"\n\r"));