Exemplo n.º 1
0
        private void DoRetrieveStructure()
        {
            var               data           = _base.GetPlayerTempData(GetPC());
            PCBaseStructure   structure      = _data.Get <PCBaseStructure>(data.ManipulatingStructure.PCBaseStructureID);
            BaseStructure     baseStructure  = _data.Get <BaseStructure>(structure.BaseStructureID);
            PCBase            pcBase         = _data.Get <PCBase>(structure.PCBaseID);
            BaseStructureType structureType  = (BaseStructureType)baseStructure.BaseStructureTypeID;
            var               tempStorage    = _.GetObjectByTag("TEMP_ITEM_STORAGE");
            var               pcStructureID  = structure.ID;
            int               impoundedCount = 0;

            var controlTower = _base.GetBaseControlTower(pcBase.ID);
            int maxShields   = _base.CalculateMaxShieldHP(controlTower);

            if (pcBase.ShieldHP < maxShields && structureType != BaseStructureType.ControlTower)
            {
                GetPC().FloatingText("You cannot retrieve any structures because the control tower has less than 100% shields.");
                return;
            }

            bool canRetrieveStructures;

            if (data.BuildingType == Enumeration.BuildingType.Exterior ||
                data.BuildingType == Enumeration.BuildingType.Apartment)
            {
                canRetrieveStructures = _perm.HasBasePermission(GetPC(), data.ManipulatingStructure.PCBaseID, BasePermission.CanRetrieveStructures);
            }
            else if (data.BuildingType == Enumeration.BuildingType.Interior)
            {
                var structureID = new Guid(data.ManipulatingStructure.Structure.Area.GetLocalString("PC_BASE_STRUCTURE_ID"));
                canRetrieveStructures = _perm.HasStructurePermission(GetPC(), structureID, StructurePermission.CanRetrieveStructures);
            }
            else
            {
                throw new Exception("BaseManagementTool -> DoRetrieveStructure: Cannot handle building type " + data.BuildingType);
            }

            if (!canRetrieveStructures)
            {
                GetPC().FloatingText("You don't have permission to retrieve structures.");
                return;
            }


            if (structureType == BaseStructureType.ControlTower)
            {
                var structureCount = _data.GetAll <PCBaseStructure>().Count(x => x.PCBaseID == structure.PCBaseID);

                if (structureCount > 1)
                {
                    GetPC().FloatingText("You must remove all structures in this sector before picking up the control tower.");
                    return;
                }
            }
            else if (structureType == BaseStructureType.Building)
            {
                var childStructures = _data.Where <PCBaseStructure>(x => x.ParentPCBaseStructureID == structure.ID).ToList();
                for (int x = childStructures.Count - 1; x >= 0; x--)
                {
                    var    furniture     = childStructures.ElementAt(x);
                    NWItem furnitureItem = _base.ConvertStructureToItem(furniture, tempStorage);
                    _impound.Impound(GetPC().GlobalID, furnitureItem);
                    furnitureItem.Destroy();

                    _data.SubmitDataChange(furniture, DatabaseActionType.Delete);
                    impoundedCount++;
                }
            }

            _base.ConvertStructureToItem(structure, GetPC());
            _data.SubmitDataChange(structure, DatabaseActionType.Delete);
            data.ManipulatingStructure.Structure.Destroy();

            // Impound any fuel that's over the limit.
            if (structureType == BaseStructureType.StronidiumSilo || structureType == BaseStructureType.FuelSilo)
            {
                int maxFuel           = _base.CalculateMaxFuel(pcBase.ID);
                int maxReinforcedFuel = _base.CalculateMaxReinforcedFuel(pcBase.ID);

                if (pcBase.Fuel > maxFuel)
                {
                    int    returnAmount = pcBase.Fuel - maxFuel;
                    NWItem refund       = _.CreateItemOnObject("fuel_cell", tempStorage, returnAmount);
                    pcBase.Fuel = maxFuel;
                    _impound.Impound(pcBase.PlayerID, refund);
                    GetPC().SendMessage("Excess fuel cells have been impounded by the planetary government. The owner of the base will need to retrieve it.");
                    refund.Destroy();
                }

                if (pcBase.ReinforcedFuel > maxReinforcedFuel)
                {
                    int    returnAmount = pcBase.ReinforcedFuel - maxReinforcedFuel;
                    NWItem refund       = _.CreateItemOnObject("stronidium", tempStorage, returnAmount);
                    pcBase.ReinforcedFuel = maxReinforcedFuel;
                    _impound.Impound(pcBase.PlayerID, refund);
                    GetPC().SendMessage("Excess stronidium units have been impounded by the planetary government. The owner of the base will need to retrieve it.");
                    refund.Destroy();
                }
            }
            else if (structureType == BaseStructureType.ResourceSilo)
            {
                int maxResources = _base.CalculateResourceCapacity(pcBase.ID);
                var items        = _data.Where <PCBaseStructureItem>(x => x.PCBaseStructureID == controlTower.ID).ToList();

                while (items.Count > maxResources)
                {
                    var item = items.ElementAt(0);

                    var impoundItem = new PCImpoundedItem
                    {
                        PlayerID      = pcBase.PlayerID,
                        ItemResref    = item.ItemResref,
                        ItemObject    = item.ItemObject,
                        DateImpounded = DateTime.UtcNow,
                        ItemName      = item.ItemName,
                        ItemTag       = item.ItemTag
                    };

                    _data.SubmitDataChange(impoundItem, DatabaseActionType.Insert);
                    GetPC().SendMessage(item.ItemName + " has been impounded by the planetary government because your base ran out of space to store resources. The owner of the base will need to retrieve it.");
                    _data.SubmitDataChange(item, DatabaseActionType.Delete);
                }
            }

            // Update the cache
            List <AreaStructure> areaStructures = data.TargetArea.Data["BASE_SERVICE_STRUCTURES"];
            var records = areaStructures.Where(x => x.PCBaseStructureID == pcStructureID).ToList();

            for (int x = records.Count() - 1; x >= 0; x--)
            {
                var record = records[x];
                record.ChildStructure?.Destroy();
                areaStructures.Remove(record);
            }

            EndConversation();

            if (impoundedCount > 0)
            {
                GetPC().FloatingText(impoundedCount + " item(s) were sent to the planetary impound.");
            }
        }
Exemplo n.º 2
0
        public void ClearPCBaseByID(Guid pcBaseID)
        {
            var pcBase     = _data.Get <PCBase>(pcBaseID);
            var structures = _data.Where <PCBaseStructure>(x => x.PCBaseID == pcBaseID).ToList();
            var areas      = NWModule.Get().Areas;
            var baseArea   = areas.Single(x => x.Resref == pcBase.AreaResref && !x.IsInstance);
            List <AreaStructure> areaStructures = baseArea.Data["BASE_SERVICE_STRUCTURES"];

            areaStructures = areaStructures.Where(x => x.PCBaseID == pcBaseID).ToList();

            // Remove all players who are a resident of any structure in this base or the base itself.
            var residents = _data.Where <Player>(x =>
            {
                if (x.PrimaryResidencePCBaseID == pcBaseID)
                {
                    return(true);
                }
                if (x.PrimaryResidencePCBaseStructureID == null)
                {
                    return(false);
                }
                var primaryResidenceStructure = _data.Get <PCBaseStructure>(x.PrimaryResidencePCBaseStructureID);
                return(primaryResidenceStructure.PCBaseID == pcBaseID);
            }).ToList();

            foreach (var resident in residents)
            {
                resident.PrimaryResidencePCBaseID          = null;
                resident.PrimaryResidencePCBaseStructureID = null;

                _data.SubmitDataChange(resident, DatabaseActionType.Update);
            }

            foreach (var structure in areaStructures)
            {
                BootPlayersOutOfInstance(structure.PCBaseStructureID);

                ((List <AreaStructure>)baseArea.Data["BASE_SERVICE_STRUCTURES"]).Remove(structure);
                structure.Structure.Destroy();
            }

            for (int x = structures.Count - 1; x >= 0; x--)
            {
                // Impound item storage
                var pcBaseStructure = structures.ElementAt(x);
                var items           = _data.Where <PCBaseStructureItem>(i => i.PCBaseStructureID == pcBaseStructure.ID).ToList();

                for (int i = items.Count - 1; i >= 0; i--)
                {
                    var item = items.ElementAt(i);
                    _impound.Impound(item);
                    _data.SubmitDataChange(item, DatabaseActionType.Delete);
                }

                // Clear structure permissions
                var structurePermissions = _data.Where <PCBaseStructurePermission>(p => p.PCBaseStructureID == pcBaseStructure.ID).ToList();
                for (int p = structurePermissions.Count - 1; p >= 0; p--)
                {
                    var permission = structurePermissions.ElementAt(p);
                    _data.SubmitDataChange(permission, DatabaseActionType.Delete);
                }

                var    tempStorage = (_.GetObjectByTag("TEMP_ITEM_STORAGE"));
                NWItem copy        = ConvertStructureToItem(pcBaseStructure, tempStorage);
                _impound.Impound(pcBase.PlayerID, copy);
                copy.Destroy();
                _data.SubmitDataChange(pcBaseStructure, DatabaseActionType.Delete);
            }

            // Clear base permissions
            var permissions = _data.Where <PCBasePermission>(x => x.PCBaseID == pcBaseID).ToList();

            for (int p = permissions.Count - 1; p >= 0; p--)
            {
                var permission = permissions.ElementAt(p);
                _data.SubmitDataChange(permission, DatabaseActionType.Delete);
            }

            _data.SubmitDataChange(pcBase, DatabaseActionType.Delete);

            Area dbArea = _data.Single <Area>(x => x.Resref == pcBase.AreaResref);

            if (pcBase.Sector == AreaSector.Northeast)
            {
                dbArea.NortheastOwner = null;
            }
            else if (pcBase.Sector == AreaSector.Northwest)
            {
                dbArea.NorthwestOwner = null;
            }
            else if (pcBase.Sector == AreaSector.Southeast)
            {
                dbArea.SoutheastOwner = null;
            }
            else if (pcBase.Sector == AreaSector.Southwest)
            {
                dbArea.SouthwestOwner = null;
            }

            _data.SubmitDataChange(dbArea, DatabaseActionType.Update);
        }