/// <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(); }
/// <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(); }
/// <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; }
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); }