Skip to content

Commit ecfeff6

Browse files
committed
feat: Filter World Quests by party Leader Area Rank
Don't allow World quests to be selected when the server rolls them if the party leader does not meet the minimum area rank requirements. That way a large amount of quests won't show up for new players and show them as unable to participate.
1 parent eeb294e commit ecfeff6

2 files changed

Lines changed: 42 additions & 4 deletions

File tree

Arrowgene.Ddon.GameServer/Handler/QuestGetSetQuestListHandler.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Arrowgene.Ddon.Shared.Model.Quest;
77
using Arrowgene.Logging;
88
using System.Collections.Generic;
9+
using System.Linq;
910

1011
namespace Arrowgene.Ddon.GameServer.Handler
1112
{
@@ -40,6 +41,8 @@ public override S2CQuestGetSetQuestListRes Handle(GameClient client, C2SQuestGet
4041
* are random fetch, deliver and kill type quests.
4142
*/
4243

44+
var leaderCharacter = client.Party.Leader?.Client.Character;
45+
4346
// Populate state for all quests currently in progress by the player
4447
foreach (var questScheduleId in client.Party.QuestState.GetActiveQuestScheduleIds())
4548
{
@@ -49,7 +52,7 @@ public override S2CQuestGetSetQuestListRes Handle(GameClient client, C2SQuestGet
4952
continue;
5053
}
5154

52-
CompletedQuest questStats = client.Party.Leader?.Client.Character.CompletedQuests.GetValueOrDefault(quest.QuestId);
55+
CompletedQuest questStats = leaderCharacter?.CompletedQuests.GetValueOrDefault(quest.QuestId);
5356
QuestState questState = client.Party.QuestState.GetQuestState(quest);
5457
res.SetQuestList.Add(quest.ToCDataSetQuestList(questState?.Step ?? 0, questStats?.ClearCount ?? 0));
5558
}
@@ -66,7 +69,15 @@ public override S2CQuestGetSetQuestListRes Handle(GameClient client, C2SQuestGet
6669
continue;
6770
}
6871

69-
CompletedQuest questStats = client.Party.Leader?.Client.Character.CompletedQuests.GetValueOrDefault(quest.QuestId);
72+
if (quest.OrderConditions.Any(c => c.Type == QuestOrderConditionType.AreaRank
73+
&& (leaderCharacter == null
74+
|| !leaderCharacter.AreaRanks.TryGetValue((QuestAreaId)c.Param01, out var areaRank)
75+
|| areaRank.Rank < (uint)c.Param02)))
76+
{
77+
continue;
78+
}
79+
80+
CompletedQuest questStats = leaderCharacter?.CompletedQuests.GetValueOrDefault(quest.QuestId);
7081
res.SetQuestList.Add(quest.ToCDataSetQuestList(0, questStats?.ClearCount ?? 0));
7182
client.Party.QuestState.AddNewQuest(quest, 0);
7283
// Enemy requests arrive before the quest list, so loaded groups may have generic enemies. Reset them.

Arrowgene.Ddon.GameServer/Quests/QuestStateManager.cs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,20 @@ public HashSet<uint> AreaQuests(QuestAreaId areaId)
529529
}
530530
}
531531

532+
protected Quest RollEligibleQuestVariant(QuestId questId, Character leaderCharacter)
533+
{
534+
var candidates = QuestManager.GetQuestScheduleIdsForQuestId(questId)
535+
.Select(id => QuestManager.GetQuestByScheduleId(id))
536+
.Where(q => q != null && !q.OrderConditions.Any(c => c.Type == QuestOrderConditionType.AreaRank
537+
&& (leaderCharacter == null
538+
|| !leaderCharacter.AreaRanks.TryGetValue((QuestAreaId)c.Param01, out var rank)
539+
|| rank.Rank < (uint)c.Param02)))
540+
.ToList();
541+
542+
if (candidates.Count == 0) return null;
543+
return candidates[Random.Shared.Next(candidates.Count)];
544+
}
545+
532546
public QuestState GetQuestState(uint questScheduleId)
533547
{
534548
lock (ActiveQuests)
@@ -707,14 +721,22 @@ protected PacketQueue SendWalletRewards(DdonGameServer server, GameClient client
707721
return packets;
708722
}
709723

724+
protected virtual Quest RollQuestVariant(QuestId questId)
725+
{
726+
return QuestManager.RollQuestForQuestId(questId);
727+
}
728+
710729
public void ResetInstance()
711730
{
712731
lock (ActiveQuests)
713732
{
714733
foreach (var questId in CompletedWorldQuests)
715734
{
716-
var quest = QuestManager.RollQuestForQuestId(questId);
717-
RolledInstanceWorldQuests[quest.QuestAreaId].Add(quest.QuestScheduleId);
735+
var quest = RollQuestVariant(questId);
736+
if (quest != null)
737+
{
738+
RolledInstanceWorldQuests[quest.QuestAreaId].Add(quest.QuestScheduleId);
739+
}
718740
}
719741
CompletedWorldQuests.Clear();
720742
}
@@ -812,6 +834,11 @@ public SharedQuestStateManager(PartyGroup party, DdonGameServer server)
812834
this.Server = server;
813835
}
814836

837+
protected override Quest RollQuestVariant(QuestId questId)
838+
{
839+
return RollEligibleQuestVariant(questId, Party.Leader?.Client.Character);
840+
}
841+
815842
public override bool CompleteQuestProgress(uint questScheduleId, DbConnection? connectionIn = null)
816843
{
817844
Quest quest = GetQuest(questScheduleId);

0 commit comments

Comments
 (0)