public override void Initialize() { Guid structureID = new Guid(_.GetLocalString(_.GetArea(GetDialogTarget()), "PC_BASE_STRUCTURE_ID")); PCBaseStructure structure = DataService.PCBaseStructure.GetByID(structureID); PCBase pcBase = DataService.PCBase.GetByID(structure.PCBaseID); BaseStructure baseStructure = DataService.BaseStructure.GetByID(structure.BaseStructureID); NWPlaceable bay = SpaceService.GetCargoBay(GetPC().Area, null); int currentReinforcedFuel = pcBase.ReinforcedFuel; int currentFuel = pcBase.Fuel; int currentResources = DataService.PCBaseStructureItem.GetAllByPCBaseStructureID(structure.ID).Count(); int maxReinforcedFuel = BaseService.CalculateMaxReinforcedFuel(pcBase.ID) + 25 * SpaceService.GetCargoBonus(bay, ItemPropertyType.StarshipStronidiumBonus); int maxFuel = BaseService.CalculateMaxFuel(pcBase.ID) + 25 * SpaceService.GetCargoBonus(bay, ItemPropertyType.StarshipFuelBonus); int maxResources = BaseService.CalculateResourceCapacity(pcBase.ID); string locationDescription; if (SpaceService.IsLocationSpace(pcBase.ShipLocation)) { locationDescription = "Ship is in orbit around " + ColorTokenService.Cyan(SpaceService.GetPlanetFromLocation(pcBase.ShipLocation)) + ".\n"; } else if (SpaceService.IsLocationPublicStarport(pcBase.ShipLocation)) { locationDescription = "Ship is docked in the public starport on " + ColorTokenService.Cyan(SpaceService.GetPlanetFromLocation(pcBase.ShipLocation)) + ".\n"; } else { locationDescription = "Ship is docked on " + ColorTokenService.Cyan(SpaceService.GetPlanetFromLocation(pcBase.ShipLocation)) + ".\n"; } string header = locationDescription; header += ColorTokenService.Green("Fuel: ") + currentFuel + " / " + maxFuel + "\n"; header += ColorTokenService.Green("Reinforced Fuel: ") + currentReinforcedFuel + " / " + maxReinforcedFuel + "\n"; header += ColorTokenService.Green("Resource Bay: ") + currentResources + " / " + maxResources + "\n"; header += ColorTokenService.Green("Hull integrity: ") + structure.Durability + " / " + baseStructure.Durability + "\n"; header += "The computer awaits your orders."; SetPageHeader("MainPage", header); }
public void Main() { NWPlaceable drill = _.OBJECT_SELF; string structureID = drill.GetLocalString("PC_BASE_STRUCTURE_ID"); if (string.IsNullOrWhiteSpace(structureID)) { string areaName = drill.Area.Name; Console.WriteLine("There was an error retrieving the PC_BASE_STRUCTURE_ID variable on drill in area: " + areaName); return; } Guid structureGUID = new Guid(structureID); PCBaseStructure pcStructure = DataService.PCBaseStructure.GetByID(structureGUID); PCBase pcBase = DataService.PCBase.GetByID(pcStructure.PCBaseID); PCBaseStructure tower = BaseService.GetBaseControlTower(pcBase.ID); if (tower == null) { Console.WriteLine("Could not locate valid tower in Drill OnHeartbeat. PCBaseID = " + pcBase.ID); return; } // Check whether there's space in this tower. int capacity = BaseService.CalculateResourceCapacity(pcBase.ID); int count = DataService.PCBaseStructureItem.GetNumberOfItemsContainedBy(tower.ID) + 1; if (count > capacity) { return; } BaseStructure baseStructure = DataService.BaseStructure.GetByID(pcStructure.BaseStructureID); DateTime now = DateTime.UtcNow; var outOfPowerEffect = drill.Effects.SingleOrDefault(x => _.GetEffectTag(x) == "CONTROL_TOWER_OUT_OF_POWER"); if (now >= pcBase.DateFuelEnds) { if (outOfPowerEffect == null) { outOfPowerEffect = _.EffectVisualEffect(VisualEffect.Vfx_Dur_Aura_Red); outOfPowerEffect = _.TagEffect(outOfPowerEffect, "CONTROL_TOWER_OUT_OF_POWER"); _.ApplyEffectToObject(DurationType.Permanent, outOfPowerEffect, drill); } return; } else if (now < pcBase.DateFuelEnds && outOfPowerEffect != null) { _.RemoveEffect(drill, outOfPowerEffect); } int minuteReduce = 2 * pcStructure.StructureBonus; int increaseMinutes = 60 - minuteReduce; int retrievalRating = baseStructure.RetrievalRating; if (increaseMinutes <= 20) { increaseMinutes = 20; } if (pcStructure.DateNextActivity == null) { pcStructure.DateNextActivity = now.AddMinutes(increaseMinutes); DataService.SubmitDataChange(pcStructure, DatabaseActionType.Update); } if (!(now >= pcStructure.DateNextActivity)) { return; } // Time to spawn a new item and reset the timer. var dbArea = DataService.Area.GetByResref(pcBase.AreaResref); string sector = pcBase.Sector; int lootTableID = 0; switch (sector) { case "NE": lootTableID = dbArea.NortheastLootTableID ?? 0; break; case "NW": lootTableID = dbArea.NorthwestLootTableID ?? 0; break; case "SE": lootTableID = dbArea.SoutheastLootTableID ?? 0; break; case "SW": lootTableID = dbArea.SouthwestLootTableID ?? 0; break; } if (lootTableID <= 0) { Console.WriteLine("WARNING: Loot table ID not defined for area " + dbArea.Name + ". Drills cannot retrieve items."); return; } pcStructure.DateNextActivity = now.AddMinutes(increaseMinutes); var controlTower = BaseService.GetBaseControlTower(pcStructure.PCBaseID); if (controlTower == null) { Console.WriteLine("Could not locate control tower in drill heartbeat. PCBaseID = " + pcStructure.PCBaseID); return; } var itemDetails = LootService.PickRandomItemFromLootTable(lootTableID); var tempStorage = _.GetObjectByTag("TEMP_ITEM_STORAGE"); NWItem item = _.CreateItemOnObject(itemDetails.Resref, tempStorage, itemDetails.Quantity); // Guard against invalid resrefs and missing items. if (!item.IsValid) { Console.WriteLine("ERROR: Could not create base drill item with resref '" + itemDetails.Resref + "'. Is this item valid?"); return; } if (!string.IsNullOrWhiteSpace(itemDetails.SpawnRule)) { var rule = SpawnService.GetSpawnRule(itemDetails.SpawnRule); rule.Run(item, retrievalRating); } var dbItem = new PCBaseStructureItem { PCBaseStructureID = controlTower.ID, ItemGlobalID = item.GlobalID.ToString(), ItemName = item.Name, ItemResref = item.Resref, ItemTag = item.Tag, ItemObject = SerializationService.Serialize(item) }; DataService.SubmitDataChange(pcStructure, DatabaseActionType.Update); DataService.SubmitDataChange(dbItem, DatabaseActionType.Insert); item.Destroy(); }
private void DoRetrieveStructure() { var data = BaseService.GetPlayerTempData(GetPC()); PCBaseStructure structure = DataService.PCBaseStructure.GetByID(data.ManipulatingStructure.PCBaseStructureID); BaseStructure baseStructure = DataService.BaseStructure.GetByID(structure.BaseStructureID); PCBase pcBase = DataService.PCBase.GetByID(structure.PCBaseID); BaseStructureType structureType = (BaseStructureType)baseStructure.BaseStructureTypeID; var tempStorage = _.GetObjectByTag("TEMP_ITEM_STORAGE"); var pcStructureID = structure.ID; int impoundedCount = 0; var controlTower = BaseService.GetBaseControlTower(pcBase.ID); int maxShields = BaseService.CalculateMaxShieldHP(controlTower); if (structureType == BaseStructureType.Starship) { GetPC().SendMessage("You cannot pick up starships once they are built. You can only fly them away."); return; } if (pcBase.PCBaseTypeID != (int)Enumeration.PCBaseType.Starship && 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 = BasePermissionService.HasBasePermission(GetPC(), data.ManipulatingStructure.PCBaseID, BasePermission.CanRetrieveStructures); } else if (data.BuildingType == Enumeration.BuildingType.Interior || data.BuildingType == Enumeration.BuildingType.Starship) { var structureID = new Guid(data.ManipulatingStructure.Structure.Area.GetLocalString("PC_BASE_STRUCTURE_ID")); canRetrieveStructures = BasePermissionService.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 = DataService.PCBaseStructure.GetAllByPCBaseID(structure.PCBaseID).Count(); if (structureCount > 1) { GetPC().FloatingText("You must remove all structures in this sector before picking up the control tower."); return; } // Impound resources retrieved by drills. var items = DataService.PCBaseStructureItem.GetAllByPCBaseStructureID(structure.ID); foreach (var item in items) { ImpoundService.Impound(item); DataService.SubmitDataChange(item, DatabaseActionType.Delete); impoundedCount++; } } else if (structureType == BaseStructureType.Building) { var childStructures = DataService.PCBaseStructure.GetAllByParentPCBaseStructureID(structure.ID).ToList(); for (int x = childStructures.Count - 1; x >= 0; x--) { var furniture = childStructures.ElementAt(x); NWItem furnitureItem = BaseService.ConvertStructureToItem(furniture, tempStorage); ImpoundService.Impound(GetPC().GlobalID, furnitureItem); furnitureItem.Destroy(); DataService.SubmitDataChange(furniture, DatabaseActionType.Delete); impoundedCount++; } // Remove any primary owner permissions. var primaryOwner = DataService.Player.GetByPrimaryResidencePCBaseStructureIDOrDefault(structure.ID); if (primaryOwner != null) { primaryOwner.PrimaryResidencePCBaseStructureID = null; DataService.SubmitDataChange(primaryOwner, DatabaseActionType.Update); } // Remove any access permissions. foreach (var buildingPermission in DataService.PCBaseStructurePermission.GetAllByPCBaseStructureID(structure.ID)) { DataService.SubmitDataChange(buildingPermission, DatabaseActionType.Delete); } } else if (structureType == BaseStructureType.StarshipProduction && data.ManipulatingStructure.Structure.GetLocalInt("DOCKED_STARSHIP") == 1) { GetPC().SendMessage("You cannot move a dock that has a starship docked in it. Fly the ship away first."); return; } BaseService.ConvertStructureToItem(structure, GetPC()); DataService.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 = BaseService.CalculateMaxFuel(pcBase.ID); int maxReinforcedFuel = BaseService.CalculateMaxReinforcedFuel(pcBase.ID); if (pcBase.Fuel > maxFuel) { int returnAmount = pcBase.Fuel - maxFuel; NWItem refund = _.CreateItemOnObject("fuel_cell", tempStorage, returnAmount); pcBase.Fuel = maxFuel; ImpoundService.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; ImpoundService.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 = BaseService.CalculateResourceCapacity(pcBase.ID); var items = DataService.PCBaseStructureItem.GetAllByPCBaseStructureID(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 }; DataService.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."); DataService.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 override void Initialize() { Guid structureID = new Guid(GetDialogTarget().GetLocalString("PC_BASE_STRUCTURE_ID")); PCBaseStructure structure = DataService.PCBaseStructure.GetByID(structureID); Guid pcBaseID = structure.PCBaseID; PCBase pcBase = DataService.PCBase.GetByID(pcBaseID); double currentCPU = BaseService.GetCPUInUse(pcBaseID); double currentPower = BaseService.GetPowerInUse(pcBaseID); double maxCPU = BaseService.GetMaxBaseCPU(pcBaseID); double maxPower = BaseService.GetMaxBasePower(pcBaseID); int currentReinforcedFuel = pcBase.ReinforcedFuel; int currentFuel = pcBase.Fuel; int currentResources = DataService.PCBaseStructureItem.GetNumberOfItemsContainedBy(structure.ID); int maxReinforcedFuel = BaseService.CalculateMaxReinforcedFuel(pcBaseID); int maxFuel = BaseService.CalculateMaxFuel(pcBaseID); int maxResources = BaseService.CalculateResourceCapacity(pcBaseID); string time; if (pcBase.DateFuelEnds > DateTime.UtcNow) { TimeSpan deltaTime = pcBase.DateFuelEnds - DateTime.UtcNow; var tower = BaseService.GetBaseControlTower(pcBaseID); if (tower == null) { Console.WriteLine("Could not locate control tower in ControlTower -> Initialize. PCBaseID = " + pcBaseID); return; } var towerStructure = DataService.BaseStructure.GetByID(tower.BaseStructureID); int fuelRating = towerStructure.FuelRating; int minutes; switch (fuelRating) { case 1: // Small minutes = 45; break; case 2: // Medium minutes = 15; break; case 3: // Large minutes = 5; break; default: throw new Exception("Invalid fuel rating value: " + fuelRating); } TimeSpan timeSpan = TimeSpan.FromMinutes(minutes * currentFuel) + deltaTime; time = TimeService.GetTimeLongIntervals(timeSpan.Days, timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds, false); time = "Fuel will expire in " + time; } else { time = ColorTokenService.Red("Fuel has expired."); } string header = ColorTokenService.Green("Power: ") + currentPower + " / " + maxPower + "\n"; header += ColorTokenService.Green("CPU: ") + currentCPU + " / " + maxCPU + "\n"; header += ColorTokenService.Green("Fuel: ") + currentFuel + " / " + maxFuel + "\n"; header += ColorTokenService.Green("Reinforced Fuel: ") + currentReinforcedFuel + " / " + maxReinforcedFuel + "\n"; header += ColorTokenService.Green("Resource Bay: ") + currentResources + " / " + maxResources + "\n"; header += time + "\n"; header += "What would you like to do with this control tower?"; SetPageHeader("MainPage", header); if (!BasePermissionService.HasBasePermission(GetPC(), structure.PCBaseID, BasePermission.CanManageBaseFuel)) { SetResponseVisible("MainPage", 1, false); SetResponseVisible("MainPage", 2, false); } if (!BasePermissionService.HasBasePermission(GetPC(), structure.PCBaseID, BasePermission.CanAccessStructureInventory)) { SetResponseVisible("MainPage", 3, false); } }