/// <summary> /// initialise the first game with the initial player /// </summary> /// <param name="initialClient">the first player</param> public Game(Client initialClient) { gameId = Guid.NewGuid(); initialClient.SetGameId(gameId); commandManager = new CommandManager(this); spawnManager = new SpawnManager(commandManager); PlayerSpawnLocation spawn = spawnManager.GetPlayerSpawnLocation(); Player initialPlayer = new Player(initialClient, spawn.x, spawn.y, spawn.z, spawn.rotationX, spawn.rotationY, spawn.rotationZ); worldObjects.Add(initialPlayer); gameName = initialClient.username + "'s Game"; //subscribes commandmanager and client to each other initialClient.Subscribe(commandManager); commandManager.Subscribe(initialClient); commandManager.InitializePlayer(initialPlayer); gameThread = new Thread(TickTimer); gameThread.Start(); gameTimer = new Timer(); gameTimer.Interval = 1000; gameTimer.AutoReset = true; gameTimer.Elapsed += (v, e) => GameTimerElapsed(); gameTimer.Start(); }
/// <summary> /// handle updateplayer commands from clients /// </summary> /// <param name="uPlayer">a command message contiaing details about hte player/client</param> public void PlayerUpdateHandler(UpdatePlayerCommand uPlayer) { List <Object3D> worldObjects = game.getWorldObjects(); List <Object3D> deleteCueue = new List <Object3D>(); for (int i = 0; i < worldObjects.Count; i++) { if (worldObjects[i] == null) { continue; } else if (worldObjects[i] is Player) { if (worldObjects[i].guid == uPlayer.playerGuid) { if (uPlayer.y > -100) { worldObjects[i].Move(uPlayer.x, uPlayer.y, uPlayer.z); worldObjects[i].Rotate(uPlayer.rotationX, uPlayer.rotationY, uPlayer.rotationZ); deleteCueue = CheckForPickup(uPlayer, worldObjects[i]); for (int j = 0; j < deleteCueue.Count; j++) { if (worldObjects.Contains(deleteCueue[j])) { worldObjects.Remove(deleteCueue[j]); } } deleteCueue.Clear(); UpdateObjectCommand cmd = new UpdateObjectCommand(worldObjects[i]); SendCommandsToObservers(cmd); } else { PlayerSpawnLocation respawnLocation = playerSpawnList.GetSpawnLocation(); DeathCommand cmd = new DeathCommand((Player)worldObjects[i], respawnLocation); ((Player)worldObjects[i]).addDeath(); UpdatePlayerStatsCommand cmd2 = new UpdatePlayerStatsCommand((Player)worldObjects[i]); SendCommandsToObservers(cmd); SendCommandsToObservers(cmd2); } } } } }
/// <summary> /// adds a new player to the game /// </summary> /// <param name="newClient">the new player</param> /// <returns></returns> public bool AddPlayer(Client newClient) { if (GetPlayerCount() < 7) { PlayerSpawnLocation spawn = spawnManager.GetPlayerSpawnLocation(); Player newPlayer = new Player(newClient, spawn.x, spawn.y, spawn.z, spawn.rotationX, spawn.rotationY, spawn.rotationZ); worldObjects.Add(newPlayer); //subscribes commandmanager and client to each other newClient.Subscribe(commandManager); commandManager.Subscribe(newClient); commandManager.InitializePlayer(newPlayer); return(true); } else { return(false); } }
/// <summary> /// handlees hit messages from clients and determines if one scored a kill or died /// </summary> /// <param name="hit">a hitcommand containing detail about a hit</param> public void HitHandler(HitCommand hit) { List <Object3D> worldObjects = game.getWorldObjects(); Player hitPlayer = null; Player shootingPlayer = null; foreach (Object3D obj in worldObjects) { if (obj is Player) { if (obj.guid == hit.hitPlayerGuid) { hitPlayer = (Player)obj; } else if (obj.guid == hit.shootingPlayerGuid) { shootingPlayer = (Player)obj; } } } if (hitPlayer.DoDamage(hit.damage)) { shootingPlayer.addKill(); PlayerSpawnLocation respawnLocation = playerSpawnList.GetSpawnLocation(); DeathCommand cmd = new DeathCommand(hitPlayer, respawnLocation); UpdatePlayerStatsCommand cmd2 = new UpdatePlayerStatsCommand(shootingPlayer); SendCommandsToObservers(cmd); SendCommandsToObservers(cmd2); } else { UpdatePlayerStatsCommand cmd = new UpdatePlayerStatsCommand(hitPlayer); SendCommandsToObservers(cmd); } }
public DeathCommand(Player deadPlayer, PlayerSpawnLocation spawnLocation) : base("DeathCommand") { this.deadPlayer = deadPlayer; this.spawnLocation = spawnLocation; }