00001
00009 using System;
00010 using System.Collections.Generic;
00011 using System.Text;
00012 using System.Net;
00013 using System.Net.Sockets;
00014 using System.Threading;
00015 using System.IO;
00016 using System.Windows.Forms;
00017
00018 using Objects3D;
00019
00020 namespace Cubes3D
00021 {
00029 public class ServerHandler
00030 {
00031 private Controller[] FControllers = null;
00032 private Player[] FPlayers = null;
00033 private ServerCube[] FServerCubes = null;
00034
00035 private Thread FServerReceiver = null;
00036 private UdpClient FServerSender = null;
00037 private IPEndPoint FClientEndPoint = null;
00038
00039 private bool FMap = true;
00040
00041 private bool FActive = false;
00042 private bool FGameRunning = false;
00043 private bool FKill = false;
00044
00045 private int FClientPort = 9999;
00046 private int FServerPort = 8888;
00047
00048 private int FTickCount;
00049
00050 private System.Windows.Forms.Timer FServerTimer = null;
00051
00052 private bool FLocal;
00053
00054 public ServerHandler(String AMapFile, bool ALocal)
00055 {
00056 FLocal = ALocal;
00057
00058 int LTimeStamp = 0;
00059
00060 if (File.Exists(AMapFile))
00061 {
00062 Network.SetServerCubes(File.ReadAllBytes(AMapFile), ref FServerCubes, ref LTimeStamp);
00063 }
00064
00065 if (FLocal)
00066 {
00067 FClientEndPoint = new IPEndPoint(IPAddress.Loopback, FClientPort);
00068 }
00069 else
00070 {
00071 FClientEndPoint = new IPEndPoint(IPAddress.Broadcast, FClientPort);
00072 }
00073
00074 FServerSender = new UdpClient();
00075 FServerSender.EnableBroadcast = (!(FLocal));
00076
00077 FTickCount = System.Environment.TickCount;
00078
00079 FServerReceiver = new Thread(new ThreadStart(StartServerReceiver));
00080 FServerReceiver.IsBackground = true;
00081 FServerReceiver.Start();
00082
00083 FServerTimer = new System.Windows.Forms.Timer();
00084 FServerTimer.Interval = 10;
00085 FServerTimer.Tick += ServerTimerTick;
00086 FServerTimer.Enabled = true;
00087 }
00088
00096 public bool Active
00097 {
00098 get
00099 {
00100 return FActive;
00101 }
00102
00103 set
00104 {
00105 FActive = value;
00106
00107 if (!(FServerReceiver.IsAlive))
00108 {
00109 FServerReceiver.Start();
00110 }
00111 }
00112 }
00113
00121 public bool GameRunning
00122 {
00123 get
00124 {
00125 return FGameRunning;
00126 }
00127
00128 set
00129 {
00130 FGameRunning = value;
00131 }
00132 }
00133
00141 public bool Kill
00142 {
00143 get
00144 {
00145 return FKill;
00146 }
00147
00148 set
00149 {
00150 FKill = value;
00151 }
00152 }
00153
00161 public byte PlayerCount
00162 {
00163 get
00164 {
00165 if (FPlayers != null)
00166 {
00167 return (byte)FPlayers.Length;
00168 }
00169 else
00170 {
00171 return 0;
00172 }
00173 }
00174 }
00175
00183 private void StartServerReceiver()
00184 {
00185 IPEndPoint LServerEndPoint = null;
00186 if (FLocal)
00187 {
00188 LServerEndPoint = new IPEndPoint(IPAddress.Loopback, FServerPort);
00189 }
00190 else
00191 {
00192 LServerEndPoint = new IPEndPoint(IPAddress.Any, FServerPort);
00193 }
00194
00195 UdpClient LServerReceiver = new UdpClient(FServerPort);
00196 LServerReceiver.EnableBroadcast = (!(FLocal));
00197
00198 Controller LController = null;
00199
00200 byte[] LReceivedData;
00201 int LTickCount = 0; ;
00202
00203 FActive = true;
00204 while (!(FKill))
00205 {
00206 if (FActive)
00207 {
00208 LReceivedData = LServerReceiver.Receive(ref LServerEndPoint);
00209 LReceivedData = Convert.FromBase64String(new ASCIIEncoding().GetString(LReceivedData));
00210
00211 if (FGameRunning)
00212 {
00213 if (Network.SetController(LReceivedData, ref LController, ref LTickCount))
00214 {
00215 if (LController.ID < FControllers.Length)
00216 {
00217 FControllers[LController.ID] = LController;
00218
00219 if (LController.ID < FPlayers.Length)
00220 {
00221 FPlayers[LController.ID].Rotation = LController.Rotation;
00222 }
00223 }
00224 }
00225 }
00226 else
00227 {
00228 bool LFound = false;
00229 int LRandom = 0;
00230 byte LID = 0;
00231 if (Network.SetEnter(LReceivedData, ref LRandom, ref LTickCount))
00232 {
00233 LFound = false;
00234 if (FPlayers != null)
00235 {
00236 foreach (Player LPlayer in FPlayers)
00237 {
00238 LFound = (LPlayer.Random == LRandom);
00239 if (LFound)
00240 {
00241 LID = LPlayer.ID;
00242 break;
00243 }
00244 }
00245 }
00246
00247 if (!(LFound))
00248 {
00249 if (FPlayers == null)
00250 {
00251 FPlayers = new Player[1];
00252
00253 LID = 0;
00254
00255 FPlayers[LID] = new Player();
00256 FPlayers[LID].ID = LID;
00257 FPlayers[LID].Random = LRandom;
00258
00259 FControllers = new Controller[1];
00260
00261 FControllers[LID] = new Controller();
00262 FControllers[LID].ID = LID;
00263 }
00264 else
00265 {
00266 Player[] LPlayers = new Player[FPlayers.Length + 1];
00267 for (int LIndex = 0; LIndex < FPlayers.Length; LIndex++)
00268 {
00269 LPlayers[LIndex] = FPlayers[LIndex];
00270 }
00271
00272 LID = (byte)(LPlayers.Length - 1);
00273
00274 LPlayers[LID] = new Player();
00275 LPlayers[LID].ID = (byte)(LID);
00276 LPlayers[LID].Random = LRandom;
00277
00278 FPlayers = LPlayers;
00279
00280 Controller[] LControllers = new Controller[FControllers.Length + 1];
00281 for (int LIndex = 0; LIndex < FControllers.Length; LIndex++)
00282 {
00283 LControllers[LIndex] = FControllers[LIndex];
00284 }
00285
00286 LControllers[LID] = new Controller();
00287 LControllers[LID].ID = LID;
00288
00289 FControllers = LControllers;
00290 }
00291
00292 if (FServerCubes != null)
00293 {
00294 if (FServerCubes.Length > 0)
00295 {
00296 FPlayers[LID].Collided = true;
00297 FPlayers[LID].LastCube = FServerCubes[0];
00298
00299 FPlayers[LID].Position.X = -FServerCubes[0].Cube.Pos.X;
00300 FPlayers[LID].Position.Y = FServerCubes[0].Cube.Pos.Y - Player.Scale - (FServerCubes[0].Cube.Scale.Y * FServerCubes[0].Cube.ScaleMultiplier);
00301 FPlayers[LID].Position.Z = -FServerCubes[0].Cube.Pos.Z;
00302 }
00303 }
00304 }
00305
00306 byte[] LData = new ASCIIEncoding().GetBytes(Convert.ToBase64String(Network.GetAcknowledge(LRandom, LID, 0)));
00307 FServerSender.Send(LData, LData.Length, FClientEndPoint);
00308 }
00309 }
00310 }
00311 }
00312 }
00313
00324 private void ServerTimerTick(object sender, EventArgs e)
00325 {
00326 byte[] LData;
00327
00328 if (FGameRunning)
00329 {
00330 if (FMap)
00331 {
00332 foreach (ServerCube LServerCube in FServerCubes)
00333 {
00334 LServerCube.Cube.Rot.X += LServerCube.RotSpeed.X;
00335 LServerCube.Cube.Rot.X %= 360.0F;
00336
00337 LServerCube.Cube.Rot.Y += LServerCube.RotSpeed.Y;
00338 LServerCube.Cube.Rot.Y %= 360.0F;
00339
00340 LServerCube.Cube.Rot.Z += LServerCube.RotSpeed.Z;
00341 LServerCube.Cube.Rot.Z %= 360.0F;
00342 }
00343
00344 LData = new ASCIIEncoding().GetBytes(Convert.ToBase64String(Network.GetServerCubesAsCubes(FServerCubes, System.Environment.TickCount - FTickCount)));
00345 FServerSender.Send(LData, LData.Length, FClientEndPoint);
00346 }
00347 else
00348 {
00349 float LRadY = 0.0F;
00350
00351 bool LProceed = false;
00352 foreach (Controller LController in FControllers)
00353 {
00354 if (LController.ID < FPlayers.Length)
00355 {
00356 if (!(FPlayers[LController.ID].Finished))
00357 {
00358 LProceed = true;
00359
00360 LRadY = Coordinate.DegToRad(LController.Rotation.Y);
00361
00362 if (LController.GetKeyState(ControllerKey.KEY_DOWN))
00363 {
00364 FPlayers[LController.ID].Position.X += 5.0F * (float)Math.Sin(LRadY);
00365 FPlayers[LController.ID].Position.Z -= 5.0F * (float)Math.Cos(LRadY);
00366 }
00367 if (LController.GetKeyState(ControllerKey.KEY_LEFT))
00368 {
00369 FPlayers[LController.ID].Position.X += 2.5F * (float)Math.Cos(LRadY);
00370 FPlayers[LController.ID].Position.Z += 2.5F * (float)Math.Sin(LRadY);
00371 }
00372 if (LController.GetKeyState(ControllerKey.KEY_RIGHT))
00373 {
00374 FPlayers[LController.ID].Position.X -= 2.5F * (float)Math.Cos(LRadY);
00375 FPlayers[LController.ID].Position.Z -= 2.5F * (float)Math.Sin(LRadY);
00376 }
00377 if (LController.GetKeyState(ControllerKey.KEY_UP))
00378 {
00379 FPlayers[LController.ID].Position.X -= 5.0F * (float)Math.Sin(LRadY);
00380 FPlayers[LController.ID].Position.Z += 5.0F * (float)Math.Cos(LRadY);
00381 }
00382
00383 bool LCollision = false;
00384 float LMovement = FPlayers[LController.ID].Gravity;
00385 ServerCube LServerCube = null;
00386 while (Math.Abs(LMovement) >= 1.0F)
00387 {
00388 if (!(FPlayers[LController.ID].StartJump))
00389 {
00390 foreach (ServerCube LCube in FServerCubes)
00391 {
00392 float LNewY = 0.0F;
00393 LCollision = LCube.Cube.IsInBoundingBox(-FPlayers[LController.ID].Position.X, FPlayers[LController.ID].Position.Y, -FPlayers[LController.ID].Position.Z, Player.Scale, ref LNewY);
00394 if (LCollision)
00395 {
00396 FPlayers[LController.ID].Collided = true;
00397 FPlayers[LController.ID].LastCube = LCube;
00398
00399
00400
00401 FPlayers[LController.ID].Gravity = 0.0F;
00402 FPlayers[LController.ID].Jump = false;
00403
00404 LServerCube = LCube;
00405 break;
00406 }
00407 }
00408 }
00409
00410 if (LCollision)
00411 {
00412 break;
00413 }
00414 else
00415 {
00416 if (LMovement > 0.0F)
00417 {
00418 FPlayers[LController.ID].Position.Y += 1.0F;
00419 LMovement -= 1.0F;
00420 }
00421 else
00422 {
00423 FPlayers[LController.ID].Position.Y -= 1.0F;
00424 LMovement += 1.0F;
00425 }
00426 }
00427 }
00428
00429 if (FPlayers[LController.ID].StartJump)
00430 {
00431 FPlayers[LController.ID].StartJump = false;
00432 }
00433
00434 if (LController.GetKeyState(ControllerKey.KEY_JUMP))
00435 {
00436 if (LCollision)
00437 {
00438 if (!(FPlayers[LController.ID].Jump))
00439 {
00440 FPlayers[LController.ID].Gravity = -10F;
00441 FPlayers[LController.ID].Jump = true;
00442 FPlayers[LController.ID].StartJump = true;
00443 }
00444 }
00445 }
00446
00447 if (LCollision)
00448 {
00449 if (FPlayers[LController.ID].LastCube == FServerCubes[FServerCubes.Length - 1])
00450 {
00451 FPlayers[LController.ID].Finished = true;
00452 }
00453 }
00454 else
00455 {
00456 FPlayers[LController.ID].Gravity += Player.Acceleration / 25F;
00457
00458 if (FPlayers[LController.ID].Position.Y > 1200F)
00459 {
00460 if (FPlayers[LController.ID].LastCube != null)
00461 {
00462 FPlayers[LController.ID].Gravity = 0F;
00463 FPlayers[LController.ID].Jump = false;
00464 FPlayers[LController.ID].StartJump = false;
00465
00466 FPlayers[LController.ID].Position.X = -FPlayers[LController.ID].LastCube.Cube.Pos.X;
00467 FPlayers[LController.ID].Position.Y = FPlayers[LController.ID].LastCube.Cube.Pos.Y - Player.Scale - FPlayers[LController.ID].LastCube.Cube.Scale.Y * FPlayers[LController.ID].LastCube.Cube.ScaleMultiplier;
00468 FPlayers[LController.ID].Position.Z = -FPlayers[LController.ID].LastCube.Cube.Pos.Z;
00469 }
00470 }
00471 }
00472
00473 if (FPlayers[LController.ID].Finished)
00474 {
00475 LData = new ASCIIEncoding().GetBytes(Convert.ToBase64String(Network.GetFinish(LController.ID, System.Environment.TickCount - FTickCount)));
00476 FServerSender.Send(LData, LData.Length, FClientEndPoint);
00477 }
00478 }
00479 }
00480 }
00481
00482 if (LProceed)
00483 {
00484 LData = new ASCIIEncoding().GetBytes(Convert.ToBase64String(Network.GetPlayers(FPlayers, System.Environment.TickCount - FTickCount)));
00485 FServerSender.Send(LData, LData.Length, FClientEndPoint);
00486 }
00487 else
00488 {
00489 LData = new ASCIIEncoding().GetBytes(Convert.ToBase64String(Network.GetEnd(System.Environment.TickCount - FTickCount)));
00490 FServerSender.Send(LData, LData.Length, FClientEndPoint);
00491
00492 FActive = false;
00493 FGameRunning = false;
00494 FKill = true;
00495 }
00496 }
00497
00498 FMap = (!(FMap));
00499 }
00500 else
00501 {
00502 LData = new ASCIIEncoding().GetBytes(Convert.ToBase64String(Network.GetNew(System.Environment.TickCount - FTickCount)));
00503 FServerSender.Send(LData, LData.Length, FClientEndPoint);
00504 }
00505 }
00506 }
00507 }