//Loops through each drone to update their position and remove them from the world if necessary private async Task NavigateDrones() { var toRemove = new List <int>(); foreach (var drone in Drones.ToList()) { toRemove.Add(await NavigateToNexPoint(drone)); } foreach (var key in toRemove.Where(x => x != 0)) { var drone = Drones.ContainsKey(key) ? Drones[key] : null; SceneSystem.SceneInstance.RootScene.Entities.Remove(drone); Drones.Remove(key); DistanceTravelled.Remove(key); _routes.Remove(key); _waypointIndexes.Remove(key); Speeds.Remove(key); DroneLogic.SetDroneNotLive(key); } }
private void CheckDrones(IGameLogger logger, int accountId, VaultView vault, Ship ship) { if (Drones == null) { Drones = new List <DroneView>(); } // check drones, items and upgrades List <DroneView> tempDrones = Drones.ToList(); foreach (var dronePair in Drones) { int newDroneId = vault.Drones[dronePair.Position]; if (!vault.Drones.ContainsKey(dronePair.Position)) { logger.LogInformation($"Check for player {accountId} on hangar with ship {ship.ID} resulted with a drone [Position: {dronePair.Position}, ID: {dronePair.DroneID}] equipped which is not even owned!"); tempDrones.RemoveAll(x => x.Position == dronePair.Position); } else if (newDroneId != dronePair.DroneID) { int index = tempDrones.FindIndex(x => x.Position == dronePair.Position); if ((dronePair.DroneID / 10) == (newDroneId / 10)) // check same class, if true -> Drone lvl changed! { tempDrones[index] = new DroneView(newDroneId, dronePair.StatsDesignID, dronePair.VisualDesignID, dronePair.Position, dronePair.WeaponItems, dronePair.ShieldItems); } else { if (ItemsExtension <Drone> .Lookup(newDroneId).Slots < ItemsExtension <Drone> .Lookup(dronePair.DroneID).Slots) { int diff = Math.Abs(dronePair.ShieldItems.Count + dronePair.WeaponItems.Count - ItemsExtension <Drone> .Lookup(newDroneId).Slots); int weaponsToRemove = Math.Min(diff, dronePair.WeaponItems.Count); int shieldsToRemove = Math.Min(diff - weaponsToRemove, dronePair.ShieldItems.Count); tempDrones[index] = new DroneView(newDroneId, dronePair.StatsDesignID, dronePair.VisualDesignID, dronePair.Position, dronePair.WeaponItems.Take(dronePair.WeaponItems.Count - weaponsToRemove).ToList(), dronePair.ShieldItems.Take(dronePair.ShieldItems.Count - shieldsToRemove).ToList()); } else { tempDrones[index] = new DroneView(newDroneId, dronePair.StatsDesignID, dronePair.VisualDesignID, dronePair.Position, dronePair.WeaponItems, dronePair.ShieldItems); } } } } // add new drones, which are not present in the hangar if (tempDrones.Count < vault.Drones.Count) { foreach (var drone in vault.Drones) { int count = tempDrones.Count(x => x.Position == drone.Key); if (count > 1) // saftiges problem { logger.LogWarning($"Check for player {accountId} on hangar with ship {ship.ID} resulted with multiple drones at the same position {drone.Key}!"); } if (count <= 0) { tempDrones.Add(new DroneView(drone.Value, DroneDesign.NONE.ID, 0, drone.Key, new List <int>(), new List <int>())); } } } // Check designs foreach (var design in tempDrones.GroupBy(x => x.StatsDesignID)) { if (design.Key != 0 && (!vault.DroneDesigns.TryGetValue(design.Key, out int count) || count < design.Count())) { int toRemove = design.Count() - count; for (int i = 0; i < tempDrones.Count; i++) { if (tempDrones[i].StatsDesignID == design.Key) { if (toRemove-- == 0) { break; } var tempDrone = tempDrones[i]; tempDrones[i] = new DroneView(tempDrone.DroneID, DroneDesign.NONE.ID, tempDrone.VisualDesignID, tempDrone.Position, tempDrone.WeaponItems, tempDrone.ShieldItems); } } } } Drones = tempDrones; }