Пример #1
0
        /// <summary>
        /// Share supplied <see cref="Quest"/> with another <see cref="Player"/>.
        /// </summary>
        public void QuestShare(ushort questId)
        {
            QuestInfo info = GlobalQuestManager.Instance.GetQuestInfo(questId);

            if (info == null)
            {
                throw new ArgumentException($"Invalid quest {questId}!");
            }

            Quest.Quest quest = GetQuest(questId);
            if (quest == null)
            {
                throw new QuestException($"Player {player.CharacterId} tried to share quest {questId} which they don't have!");
            }

            if (!quest.CanShare())
            {
                throw new QuestException($"Player {player.CharacterId} tried to share quest {questId} which can't be shared!");
            }

            Player recipient = player.GetVisible <Player>(player.TargetGuid);

            if (recipient == null)
            {
                throw new QuestException($"Player {player.CharacterId} tried to share quest {questId} to an invalid player!");
            }

            // TODO

            log.Trace($"Shared quest {questId} with player {recipient.Name}.");
        }
Пример #2
0
        /// <summary>
        /// Track or hide an active <see cref="Quest"/>.
        /// </summary>
        public void QuestTrack(ushort questId, bool tracked)
        {
            if (GlobalQuestManager.Instance.GetQuestInfo(questId) == null)
            {
                throw new ArgumentException($"Invalid quest {questId}!");
            }

            Quest.Quest quest = GetQuest(questId, GetQuestFlags.Active);
            if (quest == null)
            {
                throw new QuestException($"Player {player.CharacterId} tried to track quest {questId} which they don't have!");
            }

            if (quest.State != QuestState.Accepted && quest.State != QuestState.Achieved)
            {
                throw new QuestException($"Player {player.CharacterId} tried to track quest {questId} with invalid state!");
            }

            if (tracked)
            {
                quest.Flags |= QuestFlags.Tracked;
            }
            else
            {
                quest.Flags &= ~QuestFlags.Tracked;
            }

            log.Trace($"Updated tracked state of quest {questId} to {tracked}.");
        }
Пример #3
0
        private Quest.Quest LoadQuestItem(QuestUIComponets questUIComponent, SaveData.QuestInfo savedQuestInfo = null, int lvl = 1)
        {
            if (questUIComponent.quest == null)
            {
                if (savedQuestInfo != null)
                {
                    Quest.Quest quest = new Quest.Quest(savedQuestInfo.id, savedQuestInfo.level).SetupRandomQuest();
                    quest.mainCondition.UpdateProgress(savedQuestInfo.progress);

                    questUIComponent.quest = quest;
                    questUIComponent.ShowQuestData(questUIComponent.quest);
                }
                else
                {
                    questUIComponent.quest = new Quest.Quest(0, lvl).SetupRandomQuest();
                    questUIComponent.ShowQuestData(questUIComponent.quest);
                }
            }
            else
            {
                Debug.Log($"{GetType().FullName} :: Quest in component is not null");
                questUIComponent.ShowQuestData(questUIComponent.quest);
            }

            //Setup claim btn
            questUIComponent.claimBTN.onClick.AddListener(() => OnClaimClicked(questUIComponent, questUIComponent.quest));

            return(questUIComponent.quest);
        }
Пример #4
0
        public void Init(MySqlConnection connection)
        {
            using (var command = connection.CreateCommand())
            {
                command.CommandText = "SELECT * FROM character_quests WHERE char_id=@char_id";
                command.Parameters.AddWithValue("@char_id", _character.DbId);
                command.Prepare();
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var quest = new Quest.Quest
                        {
                            Id        = reader.GetUInt16("quest_id"),
                            Completed =
                            {
                                [0] = reader.GetByte("req_1"),
                                [1] = reader.GetByte("req_2"),
                                [2] = reader.GetByte("req_3"),
                                [3] = reader.GetByte("req_4"),
                                [4] = reader.GetByte("req_5"),
                            },
                            IsDone = reader.GetBoolean("is_done"),
                        };
                        quest.QuestData = DataManager.Instance.QuestData.GetData(quest.Id);

                        if (quest.QuestData != null)
                        {
                            _quests.Add(quest.Id, quest);
                        }
                    }
                }
            }
        }
Пример #5
0
        /// <summary>
        /// Complete single <see cref="QuestObjective"/> for supplied active <see cref="Quest"/>.
        /// </summary>
        public void QuestAchieveObjective(ushort questId, byte index)
        {
            if (GlobalQuestManager.Instance.GetQuestInfo(questId) == null)
            {
                throw new ArgumentException($"Invalid quest {questId}!");
            }

            Quest.Quest quest = GetQuest(questId);
            if (quest == null || quest.PendingDelete)
            {
                throw new QuestException();
            }

            if (quest.State != QuestState.Accepted)
            {
                throw new QuestException();
            }

            QuestObjective objective = quest.SingleOrDefault(o => o.Index == index);

            if (objective == null)
            {
                throw new QuestException();
            }

            quest.ObjectiveUpdate((QuestObjectiveType)objective.Entry.Type, objective.Entry.Data, objective.Entry.Count);
        }
Пример #6
0
        /// <summary>
        /// Create a new <see cref="QuestManager"/> from existing <see cref="CharacterModel"/> database model.
        /// </summary>
        public QuestManager(Player owner, CharacterModel model)
        {
            player = owner;

            foreach (CharacterQuestModel questModel in model.Quest)
            {
                QuestInfo info = GlobalQuestManager.Instance.GetQuestInfo(questModel.QuestId);
                if (info == null)
                {
                    log.Error($"Player {player.CharacterId} has an invalid quest {questModel.QuestId}!");
                    continue;
                }

                var quest = new Quest.Quest(player, info, questModel);
                switch (quest.State)
                {
                case QuestState.Completed:
                    completedQuests.Add(quest.Id, quest);
                    break;

                case QuestState.Botched:
                case QuestState.Ignored:
                    inactiveQuests.Add(quest.Id, quest);
                    break;

                case QuestState.Accepted:
                case QuestState.Achieved:
                    activeQuests.Add(quest.Id, quest);
                    break;
                }
            }
        }
Пример #7
0
        private void QuestAdd(QuestInfo info, Quest.Quest quest, Item item)
        {
            if (quest?.State == QuestState.Accepted || quest?.State == QuestState.Achieved)
            {
                throw new QuestException($"Player {player.CharacterId} tried to start quest {info.Entry.Id} which is already in progress!");
            }

            // if quest has already been completed make sure it's repeatable and the reset period has elapsed
            if (quest?.State == QuestState.Completed)
            {
                if (info.Entry.QuestRepeatPeriodEnum == 0u)
                {
                    throw new QuestException($"Player {player.CharacterId} tried to start quest {info.Entry.Id} which they have already completed!");
                }

                DateTime?resetTime = GetQuest((ushort)info.Entry.Id, GetQuestFlags.Completed).Reset;
                if (DateTime.UtcNow < resetTime)
                {
                    throw new QuestException($"Player {player.CharacterId} tried to start quest {info.Entry.Id} which hasn't reset yet!");
                }
            }

            if (item != null)
            {
                if (info.Entry.Id != item.Entry.Quest2IdActivation)
                {
                    throw new QuestException($"Player {player.CharacterId} tried to start quest {info.Entry.Id} from invalid item {item.Entry.Id}!");
                }

                // TODO: consume charge
            }
            else
            {
                // make sure the player is in range of a quest giver or they are eligible for a communicator message that starts the quest
                if (!GlobalQuestManager.Instance.GetQuestGivers((ushort)info.Entry.Id)
                    .Any(c => player.GetVisibleCreature <WorldEntity>(c).Any()))
                {
                    if (!info.IsCommunicatorReceived())
                    {
                        throw new QuestException($"Player {player.CharacterId} tried to start quest {info.Entry.Id} without quest giver!");
                    }

                    if (!GlobalQuestManager.Instance.GetQuestCommunicatorMessages((ushort)info.Entry.Id)
                        .Any(m => m.Meets(player)))
                    {
                        throw new QuestException($"Player {player.CharacterId} tried to start quest {info.Entry.Id} without communicator message!");
                    }
                }
            }

            // server doesn't send an error message for prerequisites since the client does the exact same checks
            // it's assumed that a player could never get here without cheating in some way
            if (!MeetsPrerequisites(info))
            {
                throw new QuestException($"Player {player.CharacterId} tried to start quest {info.Entry.Id} without meeting the prerequisites!");
            }

            QuestAdd(info);
        }
Пример #8
0
        public Quest.Quest AddQuest(QuestJson quest)
        {
            if (_quests.ContainsKey(quest.Id))
            {
                return(null);
            }
            var temp = new Quest.Quest
            {
                Id        = quest.Id,
                QuestData = quest,
            };

            return(_quests.TryAdd(quest.Id, temp) ? temp : null);
        }
Пример #9
0
        /// <summary>
        /// Add a <see cref="Quest"/> from supplied id, optionally supplying <see cref="Item"/> which was used to start the quest.
        /// </summary>
        public void QuestAdd(ushort questId, Item item)
        {
            QuestInfo info = GlobalQuestManager.Instance.GetQuestInfo(questId);

            if (info == null)
            {
                throw new ArgumentException($"Invalid quest {questId}!");
            }

            if (DisableManager.Instance.IsDisabled(DisableType.Quest, questId))
            {
                player.SendSystemMessage($"Unable to add quest {questId} because it is disabled.");
                return;
            }

            Quest.Quest quest = GetQuest(questId);
            QuestAdd(info, quest, item);
        }
Пример #10
0
        public void UpdateFromQuestReward(Quest.Quest quest, MaterialItemSheet materialItemSheet)
        {
            var items = new List <Material>();

            foreach (var pair in quest.Reward.ItemMap.OrderBy(kv => kv.Key))
            {
                var row  = materialItemSheet.OrderedList.First(itemRow => itemRow.Id == pair.Key);
                var item = ItemFactory.CreateMaterial(row);
                var map  = inventory.AddItem(item, pair.Value);
                itemMap.Add(map);
                items.Add(item);
            }

            quest.IsPaidInAction = true;
            questList.UpdateCollectQuest(itemMap);
            questList.UpdateItemTypeCollectQuest(items);
            UpdateCompletedQuest();
        }
Пример #11
0
        public void UpdateFromQuestReward(Quest.Quest quest, IActionContext context)
        {
            var items = new List <Material>();

            foreach (var pair in quest.Reward.ItemMap)
            {
                var row = TableSheets.FromActionContext(context)
                          .MaterialItemSheet.Values.First(itemRow => itemRow.Id == pair.Key);
                var item = ItemFactory.CreateMaterial(row);
                var map  = inventory.AddItem(item, pair.Value);
                itemMap.Add(map);
                items.Add(item);
            }

            quest.IsPaidInAction = true;
            questList.UpdateCollectQuest(itemMap);
            questList.UpdateItemTypeCollectQuest(items);
            UpdateCompletedQuest();
        }
Пример #12
0
        /// <summary>
        /// Abandon an active <see cref="Quest"/>.
        /// </summary>
        public void QuestAbandon(ushort questId)
        {
            if (GlobalQuestManager.Instance.GetQuestInfo(questId) == null)
            {
                throw new ArgumentException($"Invalid quest {questId}!");
            }

            Quest.Quest quest = GetQuest(questId, GetQuestFlags.Active | GetQuestFlags.Inactive);
            if (quest == null || quest.PendingDelete)
            {
                throw new QuestException($"Player {player.CharacterId} tried to abandon quest {questId} which they don't have!");
            }

            if (!quest.CanAbandon())
            {
                throw new QuestException($"Player {player.CharacterId} tried to abandon quest {questId} which can't be abandoned!");
            }

            if (!quest.PendingCreate)
            {
                quest.EnqueueDelete(true);
            }
            else
            {
                switch (quest.State)
                {
                case QuestState.Accepted:
                case QuestState.Achieved:
                    activeQuests.Remove(questId);
                    break;

                case QuestState.Botched:
                    inactiveQuests.Remove(quest.Id);
                    break;
                }
            }

            quest.State = QuestState.Abandoned;

            log.Trace($"Abandoned quest {questId}.");
        }
Пример #13
0
        /// <summary>
        /// Retry an inactive <see cref="Quest"/> that was previously failed.
        /// </summary>
        public void QuestRetry(ushort questId)
        {
            QuestInfo info = GlobalQuestManager.Instance.GetQuestInfo(questId);

            if (info == null)
            {
                throw new ArgumentException($"Invalid quest {questId}!");
            }

            Quest.Quest quest = GetQuest(questId, GetQuestFlags.Inactive);
            if (quest == null)
            {
                throw new QuestException($"Player {player.CharacterId} tried to restart quest {questId} which they don't have!");
            }

            if (quest.State != QuestState.Botched)
            {
                throw new QuestException($"Player {player.CharacterId} tried to restart quest {questId} which hasn't been failed!");
            }

            QuestAdd(info, quest, null);
        }
Пример #14
0
        /// <summary>
        /// Complete all <see cref="QuestObjective"/>'s for supplied active <see cref="Quest"/>.
        /// </summary>
        public void QuestAchieve(ushort questId)
        {
            if (GlobalQuestManager.Instance.GetQuestInfo(questId) == null)
            {
                throw new ArgumentException($"Invalid quest {questId}!");
            }

            Quest.Quest quest = GetQuest(questId);
            if (quest == null || quest.PendingDelete)
            {
                throw new QuestException($"Player {player.CharacterId} tried to achieve quest {questId} which they don't have!");
            }

            if (quest.State != QuestState.Accepted)
            {
                throw new QuestException($"Player {player.CharacterId} tried to achieve quest {questId} with invalid state!");
            }

            foreach (QuestObjectiveEntry entry in quest.Info.Objectives)
            {
                quest.ObjectiveUpdate((QuestObjectiveType)entry.Type, entry.Data, entry.Count);
            }
        }
Пример #15
0
        private void OnClaimClicked(QuestUIComponets questUIComponent, Quest.Quest quest)
        {
            if (quest.completed)
            {
                questUIComponent.claimBTN.onClick.RemoveAllListeners();

                questUIComponent.quest = null;
                if (saveData.quest1.id == quest.id)
                {
                    saveData.quest1 = null;
                    saveData.quest1 = LoadQuestItem(questUIComponent, null, 1).GetQuestInfo();
                }

                if (saveData.quest2.id == quest.id)
                {
                    saveData.quest2 = null;
                    saveData.quest2 = LoadQuestItem(questUIComponent, null, 2).GetQuestInfo();
                }

                if (saveData.quest3.id == quest.id)
                {
                    saveData.quest3 = null;
                    saveData.quest3 = LoadQuestItem(questUIComponent, null, 3).GetQuestInfo();
                }


                quest.mainCondition.GiveAllRewards();

                UpdateAllQuestDisplays();

                SaveJson();
            }
            else
            {
                Debug.LogError($"{GetType().FullName} :: Quest is not completed and is trying to be redeemed");
            }
        }
Пример #16
0
 public CommandAddQuest(Quest.Quest quest)
 {
     m_quest = quest;
 }
Пример #17
0
        /// <summary>
        /// Add a <see cref="Quest"/> from supplied <see cref="QuestInfo"/>, skipping any prerequisites checks.
        /// </summary>
        public void QuestAdd(QuestInfo info)
        {
            // make sure player has room for all pushed items
            if (player.Inventory.GetInventoryFreeBagIndexCount()
                < info.Entry.PushedItemIds.Count(i => i != 0u))
            {
                player.SendGenericError(GenericError.ItemInventoryFull);
                return;
            }

            for (int i = 0; i < info.Entry.PushedItemIds.Length; i++)
            {
                uint itemId = info.Entry.PushedItemIds[i];
                if (itemId != 0u)
                {
                    player.Inventory.ItemCreate(itemId, info.Entry.PushedItemCounts[i]);
                }
            }

            // TODO: virtual items

            Quest.Quest quest = GetQuest((ushort)info.Entry.Id);
            if (quest == null)
            {
                quest = new Quest.Quest(player, info);
            }
            else
            {
                // remove existing quest from its current home before
                switch (quest.State)
                {
                case QuestState.Abandoned:
                    activeQuests.Remove(quest.Id);
                    break;

                case QuestState.Completed:
                    completedQuests.Remove(quest.Id);
                    break;

                case QuestState.Botched:
                case QuestState.Ignored:
                    inactiveQuests.Remove(quest.Id);
                    break;
                }

                if (quest.PendingDelete)
                {
                    quest.EnqueueDelete(false);
                }

                // reset previous objective progress
                foreach (QuestObjective objective in quest)
                {
                    objective.Progress = 0u;
                }
            }

            quest.Flags |= QuestFlags.Tracked;
            quest.State  = QuestState.Accepted;
            activeQuests.Add((ushort)info.Entry.Id, quest);

            quest.InitialiseTimer();

            log.Trace($"Accepted new quest {info.Entry.Id}.");
        }
Пример #18
0
        /// <summary>
        /// Complete an achieved <see cref="Quest"/> supplying an optional reward and whether the quest was completed from the communicator.
        /// </summary>
        public void QuestComplete(ushort questId, ushort reward, bool communicator)
        {
            QuestInfo questInfo = GlobalQuestManager.Instance.GetQuestInfo(questId);

            if (questInfo == null)
            {
                throw new ArgumentException($"Invalid quest {questId}!");
            }

            if (DisableManager.Instance.IsDisabled(DisableType.Quest, questId))
            {
                player.SendSystemMessage($"Unable to complete quest {questId} because it is disabled.");
                return;
            }

            Quest.Quest quest = GetQuest(questId, GetQuestFlags.Active);
            if (quest == null)
            {
                if (!questInfo.IsAutoComplete())
                {
                    throw new QuestException($"Player {player.CharacterId} tried to complete quest {questId} which they don't have!");
                }

                QuestAdd(questId, null);
                quest       = GetQuest(questId);
                quest.State = QuestState.Achieved;
            }

            if (quest.State != QuestState.Achieved)
            {
                throw new QuestException($"Player {player.CharacterId} tried to complete quest {questId} which wasn't complete!");
            }

            if (communicator)
            {
                if (!quest.Info.IsCommunicatorReceived())
                {
                    throw new QuestException($"Player {player.CharacterId} tried to complete quest {questId} without communicator message!");
                }
            }
            else
            {
                if (!GlobalQuestManager.Instance.GetQuestReceivers(questId).Any(c => player.GetVisibleCreature <WorldEntity>(c).Any()))
                {
                    throw new QuestException($"Player {player.CharacterId} tried to complete quest {questId} without any quest receiver!");
                }
            }

            // reclaim any quest specific items
            for (int i = 0; i < quest.Info.Entry.PushedItemIds.Length; i++)
            {
                uint itemId = quest.Info.Entry.PushedItemIds[i];
                if (itemId != 0u)
                {
                    player.Inventory.ItemDelete(itemId, quest.Info.Entry.PushedItemCounts[i]);
                }
            }

            RewardQuest(quest.Info, reward);
            quest.State = QuestState.Completed;

            // mark repeatable quests for reset
            switch ((QuestRepeatPeriod)quest.Info.Entry.QuestRepeatPeriodEnum)
            {
            case QuestRepeatPeriod.Daily:
                quest.Reset = GlobalQuestManager.Instance.NextDailyReset;
                break;

            case QuestRepeatPeriod.Weekly:
                quest.Reset = GlobalQuestManager.Instance.NextWeeklyReset;
                break;
            }

            activeQuests.Remove(questId);
            completedQuests.Add(questId, quest);

            player.AchievementManager.CheckAchievements(player, AchievementType.QuestComplete, questId);
        }
Пример #19
0
 public virtual void AddQuest(Quest.Quest quest)
 {
 }