public void Initialize(NWPlayer player, int questID) { var status = DataService.PCQuestStatus.GetByPlayerAndQuestID(player.GlobalID, questID); PCQuestItemProgress itemProgress = new PCQuestItemProgress { Resref = _resref, PlayerID = status.PlayerID, PCQuestStatusID = status.ID, Remaining = _quantity, MustBeCraftedByPlayer = _mustBeCraftedByPlayer }; DataService.SubmitDataChange(itemProgress, DatabaseActionType.Insert); }
public void GetByID_OneItem_ReturnsPCQuestItemProgress() { // Arrange var id = Guid.NewGuid(); PCQuestItemProgress entity = new PCQuestItemProgress { ID = id }; // Act MessageHub.Instance.Publish(new OnCacheObjectSet <PCQuestItemProgress>(entity)); // Assert Assert.AreNotSame(entity, _cache.GetByID(id)); }
public void GetByID_TwoItems_ReturnsCorrectObject() { // Arrange var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); PCQuestItemProgress entity1 = new PCQuestItemProgress { ID = id1 }; PCQuestItemProgress entity2 = new PCQuestItemProgress { ID = id2 }; // Act MessageHub.Instance.Publish(new OnCacheObjectSet <PCQuestItemProgress>(entity1)); MessageHub.Instance.Publish(new OnCacheObjectSet <PCQuestItemProgress>(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(); PCQuestItemProgress entity1 = new PCQuestItemProgress { ID = id1 }; PCQuestItemProgress entity2 = new PCQuestItemProgress { ID = id2 }; // Act MessageHub.Instance.Publish(new OnCacheObjectSet <PCQuestItemProgress>(entity1)); MessageHub.Instance.Publish(new OnCacheObjectSet <PCQuestItemProgress>(entity2)); MessageHub.Instance.Publish(new OnCacheObjectDeleted <PCQuestItemProgress>(entity1)); // Assert Assert.Throws <KeyNotFoundException>(() => { _cache.GetByID(id1); }); Assert.AreNotSame(entity2, _cache.GetByID(id2)); }
/// <summary> /// Quests which require items, kill targets, etc. all need to have their entries added for this player's /// quest progress. This method handles that. /// </summary> /// <param name="status"></param> private static void CreateExtendedQuestDataEntries(PCQuestStatus status) { // Retrieve the quest and state information from the cache. var quest = DataService.Get <Quest>(status.QuestID); var state = DataService.Single <QuestState>(x => x.QuestID == quest.ID && x.ID == status.CurrentQuestStateID); // Retrieve the kill targets and required items necessary for this quest state. var killTargets = DataService.Where <QuestKillTarget>(x => x.QuestStateID == state.ID); var requiredItems = DataService.Where <QuestRequiredItem>(x => x.QuestStateID == state.ID); // Create entries for the PC kill targets. foreach (var kt in killTargets) { PCQuestKillTargetProgress pcKT = new PCQuestKillTargetProgress { RemainingToKill = kt.Quantity, NPCGroupID = kt.NPCGroupID, PCQuestStatusID = status.ID, PlayerID = status.PlayerID }; DataService.SubmitDataChange(pcKT, DatabaseActionType.Insert); } // Create entries for PC items required. foreach (var item in requiredItems) { PCQuestItemProgress itemProgress = new PCQuestItemProgress { Resref = item.Resref, PlayerID = status.PlayerID, PCQuestStatusID = status.ID, Remaining = item.Quantity, MustBeCraftedByPlayer = item.MustBeCraftedByPlayer }; DataService.SubmitDataChange(itemProgress, DatabaseActionType.Insert); } // Submit changes to the cache/DB. DataService.SubmitDataChange(status, DatabaseActionType.Update); }
private void CreateExtendedQuestDataEntries(PCQuestStatus status) { var quest = _data.Get <Quest>(status.QuestID); var state = _data.Single <QuestState>(x => x.QuestID == quest.ID && x.ID == status.CurrentQuestStateID); var killTargets = _data.Where <QuestKillTarget>(x => x.QuestStateID == state.ID); var requiredItems = _data.Where <QuestRequiredItem>(x => x.QuestStateID == state.ID); // Create entries for the PC kill targets. foreach (var kt in killTargets) { PCQuestKillTargetProgress pcKT = new PCQuestKillTargetProgress { RemainingToKill = kt.Quantity, NPCGroupID = kt.NPCGroupID, PCQuestStatusID = status.ID, PlayerID = status.PlayerID }; _data.SubmitDataChange(pcKT, DatabaseActionType.Insert); } // Create entries for PC items required. foreach (var item in requiredItems) { PCQuestItemProgress itemProgress = new PCQuestItemProgress { Resref = item.Resref, PlayerID = status.PlayerID, PCQuestStatusID = status.ID, Remaining = item.Quantity, MustBeCraftedByPlayer = item.MustBeCraftedByPlayer }; _data.SubmitDataChange(itemProgress, DatabaseActionType.Insert); } _data.SubmitDataChange(status, DatabaseActionType.Update); }
public void Main() { NWPlaceable container = NWGameObject.OBJECT_SELF; NWObject owner = container.GetLocalObject("QUEST_OWNER"); NWPlayer player = _.GetLastDisturbed(); NWItem item = _.GetInventoryDisturbItem(); int disturbType = _.GetInventoryDisturbType(); string crafterPlayerID = item.GetLocalString("CRAFTER_PLAYER_ID"); Guid? crafterPlayerGUID = null; if (!string.IsNullOrWhiteSpace(crafterPlayerID)) { crafterPlayerGUID = new Guid(crafterPlayerID); } if (disturbType == _.INVENTORY_DISTURB_TYPE_ADDED) { int questID = container.GetLocalInt("QUEST_ID"); PCQuestStatus status = DataService.PCQuestStatus.GetByPlayerAndQuestID(player.GlobalID, questID); PCQuestItemProgress progress = DataService.PCQuestItemProgress.GetByPCQuestStatusIDAndResrefOrDefault(status.ID, item.Resref); DatabaseActionType action = DatabaseActionType.Update; if (progress == null) { _.CopyItem(item, player, _.TRUE); player.SendMessage(ColorTokenService.Red("That item is not required for this quest.")); } else if (progress.MustBeCraftedByPlayer && crafterPlayerGUID != player.GlobalID) { _.CopyItem(item, player, _.TRUE); player.SendMessage(ColorTokenService.Red("You may only submit items which you have personally created for this quest.")); } else { progress.Remaining--; if (progress.Remaining <= 0) { var progressCopy = progress; progress = DataService.PCQuestItemProgress.GetByID(progressCopy.ID); action = DatabaseActionType.Delete; } DataService.SubmitDataChange(progress, action); // Recalc the remaining items needed. int remainingCount = DataService.PCQuestItemProgress.GetCountByPCQuestStatusID(status.ID); if (remainingCount <= 0) { QuestService.AdvanceQuestState(player, owner, questID); } player.SendMessage("You need " + progress.Remaining + "x " + item.Name + " for this quest."); } item.Destroy(); var questItemProgresses = DataService.PCQuestItemProgress.GetAllByPCQuestStatusID(status.ID); if (!questItemProgresses.Any()) { string conversation = _.GetLocalString(owner, "CONVERSATION"); // Either start a SWLOR conversation if (!string.IsNullOrWhiteSpace(conversation)) { DialogService.StartConversation(player, owner, conversation); } // Or a regular NWN conversation. else { player.AssignCommand(() => { _.ActionStartConversation(owner, "", _.TRUE, _.FALSE); }); } } } }
public bool Run(params object[] args) { NWPlaceable container = Object.OBJECT_SELF; NWObject owner = container.GetLocalObject("QUEST_OWNER"); NWPlayer player = _.GetLastDisturbed(); NWItem item = _.GetInventoryDisturbItem(); int disturbType = _.GetInventoryDisturbType(); string crafterPlayerID = item.GetLocalString("CRAFTER_PLAYER_ID"); Guid? crafterPlayerGUID = null; if (!string.IsNullOrWhiteSpace(crafterPlayerID)) { crafterPlayerGUID = new Guid(crafterPlayerID); } if (disturbType == INVENTORY_DISTURB_TYPE_ADDED) { int questID = container.GetLocalInt("QUEST_ID"); PCQuestStatus status = _data.Single <PCQuestStatus>(x => x.PlayerID == player.GlobalID && x.QuestID == questID); PCQuestItemProgress progress = _data.SingleOrDefault <PCQuestItemProgress>(x => x.PCQuestStatusID == status.ID && x.Resref == item.Resref); DatabaseActionType action = DatabaseActionType.Update; if (progress == null) { _.CopyItem(item, player, TRUE); player.SendMessage(_color.Red("That item is not required for this quest.")); } else if (progress.MustBeCraftedByPlayer && crafterPlayerGUID != player.GlobalID) { _.CopyItem(item, player, TRUE); player.SendMessage(_color.Red("You may only submit items which you have personally created for this quest.")); } else { progress.Remaining--; if (progress.Remaining <= 0) { var progressCopy = progress; progress = _data.Single <PCQuestItemProgress>(x => x.ID == progressCopy.ID); action = DatabaseActionType.Delete; } _data.SubmitDataChange(progress, action); // Recalc the remaining items needed. int remainingCount = _data.GetAll <PCQuestItemProgress>().Count(x => x.PCQuestStatusID == status.ID); if (remainingCount <= 0) { _quest.AdvanceQuestState(player, owner, questID); } player.SendMessage("You need " + progress.Remaining + " " + item.Name + " for this quest."); } item.Destroy(); var questItemProgresses = _data.Where <PCQuestItemProgress>(x => x.PCQuestStatusID == status.ID); if (!questItemProgresses.Any()) { string conversation = _.GetLocalString(owner, "CONVERSATION"); if (!string.IsNullOrWhiteSpace(conversation)) { _dialog.StartConversation(player, owner, conversation); } else { player.AssignCommand(() => { _.ActionStartConversation(owner, "", TRUE, FALSE); }); } } } return(true); }