Exemple #1
0
        public SpacemapController(int map)
        {
            MapInfo = ItemsExtension <Map> .Lookup(map);

            _entities = new Dictionary <int, EntityControllerBase>();
            _mines    = new Dictionary <int, MineObject>();

            _lock     = new ReaderWriterLockSlim();
            _mineLock = new ReaderWriterLockSlim();
        }
Exemple #2
0
        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;
        }