public void DeRegisterObject(IHasGalaxyID obj) { ISimulatable tempSim; IHasGalaxyID tempGal; //Maybe a type check is faster than TryRemove? _collisionManager.TryRemoveCollidableKey(obj.Id); _galaxyManager.DeRegisterArea(obj.Id); _galaxyManager.AllSimulatableObjects.TryRemove(obj.Id, out tempSim); _galaxyManager.AllObjects.TryRemove(obj.Id, out tempGal); _shipManager.DeregisterShip(obj.Id); _galaxyIDManager.PushFreeID(obj.Id); }
/// <summary> /// Dissolves the team with the given team number /// I kind of half assed this function, needs testing /// </summary> /// <param name="teamNumber"></param> /// <returns></returns> public void dissolveTeam(Team team) { var areas = new HashSet <IArea>(); //Keeps track of all areas which need to recieve notification HashSet <int> playerIDs = team.PlayerIDs; HashSet <int> nonlocalPlayerIDs = new HashSet <int>(); foreach (int i in team.PlayerIDs) { Player p = _playerLocator.GetPlayerAsync(i).Result; if (p == null) { nonlocalPlayerIDs.Add(i); } else { p.RemoveTeam(team.Id); areas.Add(p.GetArea()); } } if (nonlocalPlayerIDs.Count != 0) { NetworkMessageContainer msgc = new NetworkMessageContainer(); msgc.MessageData = new PlayerRemoveTeam(nonlocalPlayerIDs, team.Id); _redisServer.PublishObject(MessageTypes.Redis_PlayerRemoveTeam, msgc); } //Send removeships message to areas in which this team exists foreach (var a in areas) { if (a.NumOnlinePlayers == 0) { continue; } var data = new MessageAddRemoveShipsTeam(); data.AddOrRemove = false; data.TeamID = team.Id; foreach (var s in a.GetShips()) { if (team.PlayerIDs.Contains(s.Value.Id)) { data.IDs.Add(s.Value.Id); } } a.BroadcastMessage(new NetworkMessageContainer(data, MessageTypes.AddRemoveShipsTeam)); } _databaseManager.DeleteTeam(team.Id); _teamIDSupplier.PushFreeID(team.Id); }