public void GetByID_OneItem_ReturnsPCBaseStructureItem() { // Arrange var id = Guid.NewGuid(); PCBaseStructureItem entity = new PCBaseStructureItem { ID = id }; // Act MessageHub.Instance.Publish(new OnCacheObjectSet <PCBaseStructureItem>(entity)); // Assert Assert.AreNotSame(entity, _cache.GetByID(id)); }
public bool Run(params object[] args) { NWPlayer oPC = (_.GetLastDisturbed()); NWItem item = (_.GetInventoryDisturbItem()); NWPlaceable container = (Object.OBJECT_SELF); int disturbType = _.GetInventoryDisturbType(); var structureID = new Guid(container.GetLocalString("PC_BASE_STRUCTURE_ID")); var structure = _data.Single <PCBaseStructure>(x => x.ID == structureID); var baseStructure = _data.Get <BaseStructure>(structure.BaseStructureID); int itemLimit = baseStructure.Storage + structure.StructureBonus; int itemCount = container.InventoryItems.Count(); string itemResref = item.Resref; if (disturbType == INVENTORY_DISTURB_TYPE_ADDED) { if (itemCount > itemLimit) { ReturnItem(oPC, item); oPC.SendMessage(_color.Red("No more items can be placed inside.")); } else if (item.BaseItemType == BASE_ITEM_GOLD) { ReturnItem(oPC, item); oPC.SendMessage(_color.Red("Credits cannot be placed inside.")); } else { PCBaseStructureItem itemEntity = new PCBaseStructureItem { ItemName = item.Name, ItemResref = itemResref, ItemTag = item.Tag, PCBaseStructureID = structureID, ItemGlobalID = item.GlobalID.ToString(), ItemObject = _serialization.Serialize(item) }; _data.SubmitDataChange(itemEntity, DatabaseActionType.Insert); } } else if (disturbType == INVENTORY_DISTURB_TYPE_REMOVED) { var dbItem = _data.Single <PCBaseStructureItem>(x => x.ItemGlobalID == item.GlobalID.ToString()); _data.SubmitDataChange(dbItem, DatabaseActionType.Delete); } oPC.SendMessage(_color.White("Item Limit: " + itemCount + " / ") + _color.Red(itemLimit.ToString())); return(true); }
public static void Impound(PCBaseStructureItem pcBaseStructureItem) { var pcBaseStructure = DataService.PCBaseStructure.GetByID(pcBaseStructureItem.PCBaseStructureID); var pcBase = DataService.PCBase.GetByID(pcBaseStructure.PCBaseID); var impoundItem = new PCImpoundedItem { DateImpounded = DateTime.UtcNow, ItemName = pcBaseStructureItem.ItemName, ItemResref = pcBaseStructureItem.ItemResref, ItemObject = pcBaseStructureItem.ItemObject, ItemTag = pcBaseStructureItem.ItemTag, PlayerID = pcBase.PlayerID }; DataService.SubmitDataChange(impoundItem, DatabaseActionType.Insert); }
public void GetByID_TwoItems_ReturnsCorrectObject() { // Arrange var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); PCBaseStructureItem entity1 = new PCBaseStructureItem { ID = id1 }; PCBaseStructureItem entity2 = new PCBaseStructureItem { ID = id2 }; // Act MessageHub.Instance.Publish(new OnCacheObjectSet <PCBaseStructureItem>(entity1)); MessageHub.Instance.Publish(new OnCacheObjectSet <PCBaseStructureItem>(entity2)); // Assert Assert.AreNotSame(entity1, _cache.GetByID(id1)); Assert.AreNotSame(entity2, _cache.GetByID(id2)); }
public void GetByID_RemovedItem_ReturnsCorrectObject() { // Arrange var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); PCBaseStructureItem entity1 = new PCBaseStructureItem { ID = id1 }; PCBaseStructureItem entity2 = new PCBaseStructureItem { ID = id2 }; // Act MessageHub.Instance.Publish(new OnCacheObjectSet <PCBaseStructureItem>(entity1)); MessageHub.Instance.Publish(new OnCacheObjectSet <PCBaseStructureItem>(entity2)); MessageHub.Instance.Publish(new OnCacheObjectDeleted <PCBaseStructureItem>(entity1)); // Assert Assert.Throws <KeyNotFoundException>(() => { _cache.GetByID(id1); }); Assert.AreNotSame(entity2, _cache.GetByID(id2)); }
private static void OnRemoveStructureItem(NWPlayer player, PCBaseStructureItem entity) { PCBaseStructure pcBaseStructure = DataService.PCBaseStructure.GetByID(entity.PCBaseStructureID); var @event = new ModuleEvent { ModuleEventTypeID = 8, PlayerID = player.GlobalID, CDKey = GetPCPublicCDKey(player), AccountName = GetPCPlayerName(player), ItemID = new Guid(entity.ItemGlobalID), ItemName = entity.ItemName, ItemTag = entity.ItemTag, ItemResref = entity.ItemResref, PCBaseID = pcBaseStructure.PCBaseID, PCBaseStructureID = entity.PCBaseStructureID, BaseStructureID = pcBaseStructure.BaseStructureID, CustomName = pcBaseStructure.CustomName }; // Bypass the caching logic DataService.DataQueue.Enqueue(new DatabaseAction(@event, DatabaseActionType.Insert)); }
public void ApplyEffects(NWCreature user, NWItem item, NWObject target, Location targetLocation, CustomData customData) { NWArea area = user.Area; NWPlayer player = new NWPlayer(user); string structureID = area.GetLocalString("PC_BASE_STRUCTURE_ID"); PCBaseStructure pcbs = DataService.Single <PCBaseStructure>(x => x.ID.ToString() == structureID); BaseStructure structure = DataService.Get <BaseStructure>(pcbs.BaseStructureID); var dbItem = new PCBaseStructureItem { PCBaseStructureID = pcbs.ID, ItemGlobalID = item.GlobalID.ToString(), ItemName = item.Name, ItemResref = item.Resref, ItemTag = item.Tag, ItemObject = SerializationService.Serialize(item) }; DataService.SubmitDataChange(dbItem, DatabaseActionType.Insert); player.SendMessage(item.Name + " was successfully added to your ship. Access the cargo bay via the ship's computer to remove it."); item.Destroy(); }
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(); }
public void Main() { NWPlayer oPC = (_.GetLastDisturbed()); NWItem item = (_.GetInventoryDisturbItem()); NWPlaceable container = (NWGameObject.OBJECT_SELF); int disturbType = _.GetInventoryDisturbType(); var structureID = new Guid(container.GetLocalString("PC_BASE_STRUCTURE_ID")); var structure = DataService.PCBaseStructure.GetByID(structureID); var baseStructure = DataService.BaseStructure.GetByID(structure.BaseStructureID); int itemLimit = baseStructure.Storage + structure.StructureBonus; int itemCount = container.InventoryItems.Count(); string itemResref = item.Resref; if (disturbType == _.INVENTORY_DISTURB_TYPE_ADDED) { if (_.GetHasInventory(item) == _.TRUE) { item.SetLocalInt("RETURNING_ITEM", _.TRUE); ItemService.ReturnItem(oPC, item); oPC.SendMessage(ColorTokenService.Red("Containers cannot currently be stored inside banks.")); return; } if (itemCount > itemLimit) { ItemService.ReturnItem(oPC, item); oPC.SendMessage(ColorTokenService.Red("No more items can be placed inside.")); } else if (item.BaseItemType == _.BASE_ITEM_GOLD) { ItemService.ReturnItem(oPC, item); oPC.SendMessage(ColorTokenService.Red("Credits cannot be placed inside.")); } else { PCBaseStructureItem itemEntity = new PCBaseStructureItem { ItemName = item.Name, ItemResref = itemResref, ItemTag = item.Tag, PCBaseStructureID = structureID, ItemGlobalID = item.GlobalID.ToString(), ItemObject = SerializationService.Serialize(item) }; DataService.SubmitDataChange(itemEntity, DatabaseActionType.Insert); MessageHub.Instance.Publish(new OnStoreStructureItem(oPC, itemEntity)); } } else if (disturbType == _.INVENTORY_DISTURB_TYPE_REMOVED) { if (item.GetLocalInt("RETURNING_ITEM") == _.TRUE) { item.DeleteLocalInt("RETURNING_ITEM"); } else { var dbItem = DataService.PCBaseStructureItem.GetByItemGlobalID(item.GlobalID.ToString()); DataService.SubmitDataChange(dbItem, DatabaseActionType.Delete); MessageHub.Instance.Publish(new OnRemoveStructureItem(oPC, dbItem)); } } oPC.SendMessage(ColorTokenService.White("Item Limit: " + itemCount + " / ") + ColorTokenService.Red(itemLimit.ToString())); }
public bool Run(params object[] args) { NWPlaceable drill = Object.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(false); } Guid structureGUID = new Guid(structureID); PCBaseStructure pcStructure = _data.Get <PCBaseStructure>(structureGUID); PCBase pcBase = _data.Get <PCBase>(pcStructure.PCBaseID); PCBaseStructure tower = _base.GetBaseControlTower(pcBase.ID); // Check whether there's space in this tower. int capacity = _base.CalculateResourceCapacity(pcBase.ID); int count = _data.Where <PCBaseStructureItem>(x => x.PCBaseStructureID == tower.ID).Count() + 1; if (count > capacity) { return(false); } BaseStructure baseStructure = _data.Get <BaseStructure>(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(VFX_DUR_AURA_RED); outOfPowerEffect = _.TagEffect(outOfPowerEffect, "CONTROL_TOWER_OUT_OF_POWER"); _.ApplyEffectToObject(DURATION_TYPE_PERMANENT, outOfPowerEffect, drill); } return(true); } 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); _data.SubmitDataChange(pcStructure, DatabaseActionType.Update); } if (!(now >= pcStructure.DateNextActivity)) { return(true); } // Time to spawn a new item and reset the timer. var dbArea = _data.Single <Area>(x => x.Resref == 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(false); } pcStructure.DateNextActivity = now.AddMinutes(increaseMinutes); var controlTower = _base.GetBaseControlTower(pcStructure.PCBaseID); var itemDetails = _loot.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(false); } if (!string.IsNullOrWhiteSpace(itemDetails.SpawnRule)) { App.ResolveByInterface <ISpawnRule>("SpawnRule." + itemDetails.SpawnRule, action => { action.Run(item, retrievalRating); }); } var dbItem = new PCBaseStructureItem { PCBaseStructureID = controlTower.ID, ItemGlobalID = item.GlobalID.ToString(), ItemName = item.Name, ItemResref = item.Resref, ItemTag = item.Tag, ItemObject = _serialization.Serialize(item) }; _data.SubmitDataChange(pcStructure, DatabaseActionType.Update); _data.SubmitDataChange(dbItem, DatabaseActionType.Insert); item.Destroy(); return(true); }
public OnStoreStructureItem(NWPlayer player, PCBaseStructureItem entity) { Player = player; Entity = entity; }
public bool Run(params object[] args) { NWPlaceable drill = Object.OBJECT_SELF; int structureID = drill.GetLocalInt("PC_BASE_STRUCTURE_ID"); PCBaseStructure structure = _data.Get <PCBaseStructure>(structureID); PCBase pcBase = _data.Get <PCBase>(structure.PCBaseID); BaseStructure baseStructure = _data.Get <BaseStructure>(structure.BaseStructureID); DateTime now = DateTime.UtcNow; if (now >= pcBase.DateFuelEnds) { var outOfPowerEffect = drill.Effects.SingleOrDefault(x => _.GetEffectTag(x) == "CONTROL_TOWER_OUT_OF_POWER"); if (outOfPowerEffect == null) { outOfPowerEffect = _.EffectVisualEffect(VFX_DUR_AURA_RED); outOfPowerEffect = _.TagEffect(outOfPowerEffect, "CONTROL_TOWER_OUT_OF_POWER"); _.ApplyEffectToObject(DURATION_TYPE_PERMANENT, outOfPowerEffect, drill); } return(true); } int minuteReduce = 2 * structure.StructureBonus; int increaseMinutes = 60 - minuteReduce; int retrievalRating = baseStructure.RetrievalRating; if (increaseMinutes <= 20) { increaseMinutes = 20; } if (structure.DateNextActivity == null) { structure.DateNextActivity = now.AddMinutes(increaseMinutes); _data.SubmitDataChange(structure, DatabaseActionType.Update); } if (!(now >= structure.DateNextActivity)) { return(true); } // Time to spawn a new item and reset the timer. var dbArea = _data.Single <Area>(x => x.Resref == 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(false); } structure.DateNextActivity = now.AddMinutes(increaseMinutes); var controlTower = _base.GetBaseControlTower(structure.PCBaseID); var itemDetails = _loot.PickRandomItemFromLootTable(lootTableID); var tempStorage = _.GetObjectByTag("TEMP_ITEM_STORAGE"); NWItem item = _.CreateItemOnObject(itemDetails.Resref, tempStorage, itemDetails.Quantity); if (!string.IsNullOrWhiteSpace(itemDetails.SpawnRule)) { App.ResolveByInterface <ISpawnRule>("SpawnRule." + itemDetails.SpawnRule, action => { action.Run(item, retrievalRating); }); } var dbItem = new PCBaseStructureItem { PCBaseStructureID = controlTower.ID, ItemGlobalID = item.GlobalID.ToString(), ItemName = item.Name, ItemResref = item.Resref, ItemTag = item.Tag, ItemObject = _serialization.Serialize(item) }; _data.SubmitDataChange(structure, DatabaseActionType.Update); _data.SubmitDataChange(dbItem, DatabaseActionType.Insert); item.Destroy(); return(true); }