public void SpawnTowersOnRequest(uint _playerNetId) { //Find the player that requested towers by it's network id var player = GameEntityRegister.FindEntity(typeof(DestinationController), _playerNetId) as DestinationController; //Get it's position var playerPosition = player.transform.position; //Get all the towers var towers = GameEntityRegister.GetAllEntity(typeof(TowerEntityController)).Cast <TowerEntityController>(); //Find towers near the player var nearTowers = FindTowersByDistance(towers, TOWER_SPAWN_DISTANCE, playerPosition); //spawn a sufficient number of towers if (nearTowers.Count <= NEAR_TOWERS_NUM) { int remaining = Mathf.Abs(nearTowers.Count - NEAR_TOWERS_NUM); List <Vector2> newTowersPositions = new List <Vector2>(); for (int i = 0; i < remaining; i++) { var newRandGPSCoords = RandGPSCoord(playerPosition, TOWER_SPAWN_DISTANCE); newTowersPositions.Add(newRandGPSCoords); } if (remaining > 0) { SpawnTowers(newTowersPositions); } } }
//TODO : This function must be moved somewhere else /// <summary> /// Find the nearest tower to the transform given in input that is not captured /// by no faction /// </summary> /// <param name="_gameEntityRegister"></param> /// <param name="_originPosition"></param> /// <returns>The nearest tower entity controller found</returns> public static TowerEntityController FindNearestTower(GameEntityRegister _gameEntityRegister, Vector3 _originPosition) { TowerEntityController res = null; if (!ReferenceEquals(_gameEntityRegister, null) && !ReferenceEquals(_originPosition, null)) { var allTowersReg = _gameEntityRegister.GetAllEntity(typeof(TowerEntityController)); var allTowers = allTowersReg.Cast <TowerEntityController>(); res = allTowers.Where <TowerEntityController>(x => !x.IsTowerCaptured()). OrderBy <TowerEntityController, double>(x => Vector3.Distance(_originPosition, x.transform.position)). FirstOrDefault <TowerEntityController>(); } else { Debug.LogError("No game entity register supplied."); } return(res); }
/// <summary> /// This function is used in order to send a message to all the players /// that are connect that the winner faction for this period is declared /// and reset for all towers the owner /// </summary> public void DeclareWinnerFaction(string winningFaction) { var destIregistrable = GameEntityRegister.GetAllEntity(typeof(DestinationController)); var connectedPlayerDest = destIregistrable.Cast <DestinationController>(); if (!ReferenceEquals(winningFaction, null) && winningFaction.Length > 0 && destIregistrable.Count > 0) { //Notify all players connectedPlayerDest.ToList().ForEach(x => { x.NotifyWinningFaction(winningFaction); }); //Reset the owner for all towers TowersController.ResetAllTowers(); } else { Debug.LogError("Invalid faction name or empty player list"); } }