Final-Bomber  0.1
Bomberman/Dynablaster remake in C# using XNA.
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties Events Pages
GameServer.cs
Go to the documentation of this file.
1 using System;
2 using Lidgren.Network;
3 
4 namespace FBServer.Host
5 {
6  partial class GameServer
7  {
8  # region Variables/Properties
9 
10  bool hostStarted = false;
11 
12  NetServer server;
13 
14  int clientId = 1;
16 
17  #region DisconnectedClientEvent
18  public delegate void DisconnectedClientEventHandler(Client sender, EventArgs e);
19  public event DisconnectedClientEventHandler DisconnectedClient;
20  protected virtual void OnDisconnectedClient(Client sender, EventArgs e)
21  {
22  if (DisconnectedClient != null)
23  DisconnectedClient(sender, e);
24  }
25  #endregion
26  #region ConnectedClientEvent
27  public delegate void ConnectedClientEventHandler(Client sender, EventArgs e);
28  public event ConnectedClientEventHandler ConnectedClient;
29  protected virtual void OnConnectedClient(Client sender, EventArgs e)
30  {
31  if (ConnectedClient != null)
32  ConnectedClient(sender, e);
33  }
34  #endregion
35 
36  public bool HostStarted
37  {
38  get { return hostStarted; }
39  }
40 
41  #endregion
42 
43  public void StartServer()
44  {
45  var config = new NetPeerConfiguration("Final-Bomber")
46  {
47  MaximumConnections = ServerSettings.MaxConnection,
48  Port = ServerSettings.Port
49  };
50 
51 #if DEBUG
52  config.PingInterval = 1f;
53  //config.SimulatedLoss = 0.5f;
54  config.SimulatedMinimumLatency = 0.05f;
55 #endif
56  config.SetMessageTypeEnabled(NetIncomingMessageType.ConnectionLatencyUpdated, true);
57 
58  bool checkPort;
59  do
60  {
61  checkPort = false;
62  try
63  {
64  server = new NetServer(config);
65  server.Start();
66  }
67  catch (NetException)
68  {
69  checkPort = true;
70  config.Port++;
71  WriteOutput("Can't use old port, trying with Port: " + config.Port);
72  if (config.Port > 6800)
73  {
74  checkPort = false;
75  }
76  }
77  } while (checkPort);
78 
79  Clients = new ClientCollection();
80 
81  hostStarted = true;
82  WriteOutput("[START]Game server has started");
83  WriteOutput("[PORT]: " + config.Port);
84  }
85 
86  public void RunServer()
87  {
88  NetIncomingMessage message;
89 
90  while ((message = server.ReadMessage()) != null)
91  {
92  NetConnection sender = message.SenderConnection;
93  Client currentClient = Clients.GetClientFromConnection(sender);
94 
95  switch (message.MessageType)
96  {
97  #region StatusChanged
98  case NetIncomingMessageType.StatusChanged:
99  if (sender.Status == NetConnectionStatus.Connected)
100  {
101  if (currentClient == null)
102  {
103  var con = new Client(ref sender, clientId);
104  WriteOutput("[Connected]Client " + con.ClientId + " connected with ip: " + sender.RemoteEndPoint.ToString());
105  Clients.AddClient(con);
106  clientId++;
107  OnConnectedClient(con, new EventArgs());
108  }
109  }
110  else
111  {
112  if (sender.Status != NetConnectionStatus.Connected)
113  {
114  if (currentClient != null)
115  {
116  message.ReadByte(); // the message type
117  WriteOutput("[Disconnected]Client " + currentClient.ClientId + " has disconnected (" + message.ReadString() + ")");
118 
119  Clients.RemoveClient(currentClient);
120  OnDisconnectedClient(currentClient, new EventArgs());
121  }
122  }
123  }
124  break;
125  #endregion
126 
127  case NetIncomingMessageType.Data:
128  if (message.LengthBytes > 0)
129  {
130  try
131  {
132  DataProcessing(message, ref currentClient);
133  }
134  catch (Exception e)
135  {
136  WriteOutput("[ERROR]Client Id: " + '\"' + currentClient.ClientId + '\"' +
137  " Ip: " + sender.RemoteEndPoint.ToString() + " caused server exception");
138  WriteOutput("EXCEPTION: " + e.ToString());
139  sender.Disconnect("Caused server error");
140  }
141  }
142  break;
143 
144  case NetIncomingMessageType.ConnectionLatencyUpdated:
145  float ping = message.ReadFloat() * 1000;
146  Program.Log.Info("Player #" + currentClient.Player.Id + " ping: " + ping + "ms");
147  currentClient.Ping = ping;
148 
149  // TODO: Send this client's ping to everyone
150 
151  break;
152 
153  }
154  }
155  }
156 
157  public void EndServer(string reson)
158  {
159  WriteOutput("[END]Server has ended at " + System.DateTime.Now.ToString());
160  server.Shutdown(reson);
161  hostStarted = false;
162  }
163 
164  #region Private
165 
166  public void WriteOutput(string msg)
167  {
168  Program.Log.Info(msg);
169  }
170 
171  #endregion
172  }
173 }
void WriteOutput(string msg)
Definition: GameServer.cs:166
ConnectedClientEventHandler ConnectedClient
Definition: GameServer.cs:28
virtual void OnDisconnectedClient(Client sender, EventArgs e)
Definition: GameServer.cs:20
void EndServer(string reson)
Definition: GameServer.cs:157
virtual void OnConnectedClient(Client sender, EventArgs e)
Definition: GameServer.cs:29
DisconnectedClientEventHandler DisconnectedClient
Definition: GameServer.cs:19
ClientCollection Clients
Definition: GameServer.cs:15