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."); } }
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); }