Exemple #1
0
        /// <summary>
        /// Sends the quest states of the legacy quest system.
        /// </summary>
        /// <param name="questState">State of the quest.</param>
        /// <param name="player">The player.</param>
        internal static void SendLegacyQuestState(this CharacterQuestState questState, RemotePlayer player)
        {
            var questCount = 7;

            using var writer = player.Connection.StartSafeWrite(LegacyQuestStateList.HeaderType, LegacyQuestStateList.GetRequiredSize(questCount));
            var message = new LegacyQuestStateList(writer.Span)
            {
                QuestCount = (byte)questCount,
            };

            if (questState != null)
            {
                for (int i = 0; i < questState.LastFinishedQuest.Number; i++)
                {
                    message[i] = LegacyQuestState.Complete;
                }

                if (questState.ActiveQuest != null)
                {
                    message[questState.ActiveQuest.Number] = LegacyQuestState.Active;
                }
            }

            if (player.SelectedCharacter.CharacterClass.GetBaseClass(player.GameContext.Configuration).Number != (byte)CharacterClassNumber.DarkKnight)
            {
                message.SecretOfDarkStoneState = LegacyQuestState.Undefined;
            }

            writer.Commit();
        }
Exemple #2
0
        /// <summary>
        /// Clears the quest state for the specified player.
        /// </summary>
        /// <param name="questState">State of the quest.</param>
        /// <param name="persistenceContext">The persistence context of the player.</param>
        public static void Clear(this CharacterQuestState questState, IContext persistenceContext)
        {
            questState.ActiveQuest           = null;
            questState.ClientActionPerformed = false;
            foreach (var requirementState in questState.RequirementStates)
            {
                persistenceContext.Delete(requirementState);
            }

            questState.RequirementStates.Clear();
        }
Exemple #3
0
        /// <summary>
        /// Assigns the <paramref name="questState"/> to this <paramref name="message"/>.
        /// </summary>
        /// <param name="message">The message.</param>
        /// <param name="questState">State of the quest.</param>
        /// <param name="player">The player.</param>
        internal static void AssignActiveQuestData(this QuestState message, CharacterQuestState questState, RemotePlayer player)
        {
            var activeQuest = questState.ActiveQuest;

            if (activeQuest is null)
            {
                return;
            }

            message.QuestNumber = (ushort)activeQuest.Number;

            var itemSerializer = player.ItemSerializer;

            if (activeQuest.RequiredItems.Any())
            {
                message.ConditionCount = (byte)activeQuest.RequiredItems.Count;
                int i = 0;
                foreach (var requiredItem in activeQuest.RequiredItems)
                {
                    requiredItem.AssignTo(message.GetQuestCondition(i), player);
                    i++;
                }
            }
            else if (activeQuest.RequiredMonsterKills.Any())
            {
                message.ConditionCount = (byte)activeQuest.RequiredMonsterKills.Count;
                int i = 0;
                foreach (var requiredKill in activeQuest.RequiredMonsterKills)
                {
                    requiredKill.AssignTo(message.GetQuestCondition(i), questState);
                    i++;
                }
            }
            else
            {
                // no requirement states available
            }

            int r = 0;

            foreach (var reward in activeQuest.Rewards)
            {
                reward.AssignTo(message.GetQuestReward(r), itemSerializer);
                r++;
            }

            message.RewardCount = (byte)r;
        }
Exemple #4
0
 private static void AssignTo(this QuestMonsterKillRequirement killRequirement, QuestCondition condition, CharacterQuestState questState)
 {
     condition.Type          = ConditionType.MonsterKills;
     condition.RequiredCount = (uint)killRequirement.MinimumNumber;
     condition.RequirementId = (ushort)killRequirement.Monster.Number;
     condition.CurrentCount  = (uint)(questState.RequirementStates.FirstOrDefault(s => s.Requirement == killRequirement)?.KillCount ?? 0);
 }