Beispiel #1
0
        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);
        }
Beispiel #2
0
        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));
        }
Beispiel #3
0
        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));
        }
Beispiel #4
0
        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));
        }
Beispiel #5
0
        /// <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);
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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); });
                    }
                }
            }
        }
Beispiel #8
0
        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);
        }