Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Arrowgene.Ddon.GameServer/Characters/QuestManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ public static HashSet<uint> CollectQuestScheduleIds(GameClient client, StageLayo
questScheduleIds.UnionWith(client.Party.QuestState.StageQuests(stageId));
if (client.Party.Leader is not null)
{
questScheduleIds.UnionWith(client.Party.Leader.QuestState.StageQuests(stageId));
questScheduleIds.UnionWith(client.Party.Leader.Client.QuestState.StageQuests(stageId));
}

return questScheduleIds;
Expand Down
8 changes: 2 additions & 6 deletions Arrowgene.Ddon.GameServer/GameClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public GameClient(ITcpSocket socket, PacketFactory packetFactory, DdonGameServer
InstanceDropItemManager = new(this, server);
InstanceShopManager = new InstanceShopManager(server.ShopManager);
GameMode = GameMode.Normal;
QuestState = new SoloQuestStateManager(this, server);
}

public void UpdateIdentity()
Expand Down Expand Up @@ -47,12 +48,7 @@ public void UpdateIdentity()
public InstanceDropItemManager InstanceDropItemManager { get; }

public GameMode GameMode { get; set; }

public QuestStateManager QuestState { get
{
return ((PlayerPartyMember)Party?.GetPartyMemberByCharacter(Character))?.QuestState;
}
}
public SoloQuestStateManager QuestState { get; private set; }

public bool IsPartyLeader()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,11 +161,7 @@ public override S2CInstanceEnemyKillRes Handle(GameClient client, C2SInstanceEne
}
}

// TODO: This will be revisited so we can properly handle EXP assigned by tool and
// TODO: EXP determined by the mixin. For now, the default behavior of the mixin
// TODO: is the same as the original server behavior.
var enemyExpMixin = Server.ScriptManager.MixinModule.Get<IExpMixin>("enemy_exp");

foreach (PartyMember member in client.Party.Members)
{
if (member.JoinState != JoinState.On) continue; // Only fully joined members get rewards.
Expand All @@ -191,7 +187,7 @@ public override S2CInstanceEnemyKillRes Handle(GameClient client, C2SInstanceEne
gainedExp = (0, 0);
}

var huntPackets = playerMember.QuestState.HandleEnemyHuntRequests(enemyKilled, connectionIn);
var huntPackets = playerMember.Client.QuestState.HandleEnemyHuntRequests(enemyKilled, connectionIn);
queuedPackets.AddRange(huntPackets);

S2CItemUpdateCharacterItemNtc updateCharacterItemNtc = new S2CItemUpdateCharacterItemNtc();
Expand Down
2 changes: 1 addition & 1 deletion Arrowgene.Ddon.GameServer/Handler/PartyPartyJoinHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public override S2CPartyPartyJoinRes Handle(GameClient client, C2SPartyPartyJoin
var quest = QuestManager.GetQuestByScheduleId(questProgress.QuestScheduleId);
if (quest != null && quest.IsPersonal)
{
join.QuestState.AddNewQuest(questProgress.QuestScheduleId, questProgress.Step);
client.QuestState.AddNewQuest(questProgress.QuestScheduleId, questProgress.Step);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this where we want to keep this? Shouldn't this move to somewhere on login, rather than party joining, if it persists across party membership? This feels like it'll run multiple times per session whenever they join a new party, and AddNewQuest may complain if the quest is already present.

}
}

Expand Down
3 changes: 0 additions & 3 deletions Arrowgene.Ddon.GameServer/Party/PlayerPartyMember.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,10 @@ public class PlayerPartyMember : PartyMember
public PlayerPartyMember(GameClient client, DdonGameServer server)
{
Client = client;
QuestState = new SoloQuestStateManager(this, server);
}

public GameClient Client { get; set; }

public SoloQuestStateManager QuestState { get; set; }

public override CDataPartyMember GetCDataPartyMember()
{
CDataPartyMember obj = new CDataPartyMember();
Expand Down
48 changes: 24 additions & 24 deletions Arrowgene.Ddon.GameServer/Quests/QuestStateManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1020,13 +1020,13 @@ public override bool UpdateQuestProgress( uint questScheduleId, DbConnection? co

public class SoloQuestStateManager : QuestStateManager
{
private readonly PlayerPartyMember Member;
private readonly DdonGameServer Server;
private readonly GameClient Client;

public SoloQuestStateManager(PlayerPartyMember member, DdonGameServer server)
public SoloQuestStateManager(GameClient client, DdonGameServer server)
{
this.Member = member;
this.Server = server;
this.Client = client;
}

public override bool UpdateQuestProgress(uint questScheduleId, DbConnection? connectionIn = null)
Expand All @@ -1040,7 +1040,7 @@ public override bool UpdateQuestProgress(uint questScheduleId, DbConnection? con
return false;
}

var result = Server.Database.GetQuestProgressByScheduleId(Member.Client.Character.CommonId, questState.QuestScheduleId, connectionIn);
var result = Server.Database.GetQuestProgressByScheduleId(Client.Character.CommonId, questState.QuestScheduleId, connectionIn);
if (result == null)
{
return false;
Expand All @@ -1051,7 +1051,7 @@ public override bool UpdateQuestProgress(uint questScheduleId, DbConnection? con
return false;
}

Server.Database.UpdateQuestProgress(Member.Client.Character.CommonId, questState.QuestScheduleId, questState.QuestType, questState.Step + 1, connectionIn);
Server.Database.UpdateQuestProgress(Client.Character.CommonId, questState.QuestScheduleId, questState.QuestType, questState.Step + 1, connectionIn);

questState.Step += 1;

Expand All @@ -1063,7 +1063,7 @@ public override bool CompleteQuestProgress(uint questScheduleId, DbConnection? c
Quest quest = GetQuest(questScheduleId);
var questState = GetQuestState(quest);

var result = Server.Database.GetQuestProgressByScheduleId(Member.Client.Character.CommonId, questScheduleId, connectionIn);
var result = Server.Database.GetQuestProgressByScheduleId(Client.Character.CommonId, questScheduleId, connectionIn);
if (result == null)
{
return false;
Expand All @@ -1074,28 +1074,28 @@ public override bool CompleteQuestProgress(uint questScheduleId, DbConnection? c
return false;
}

Server.Database.DeletePriorityQuest(Member.Client.Character.CommonId, questScheduleId, connectionIn);
Server.Database.RemoveQuestProgress(Member.Client.Character.CommonId, questScheduleId, quest.QuestType, connectionIn);
Server.Database.DeletePriorityQuest(Client.Character.CommonId, questScheduleId, connectionIn);
Server.Database.RemoveQuestProgress(Client.Character.CommonId, questScheduleId, quest.QuestType, connectionIn);
if (quest.NextQuestId != QuestId.None)
{
var nextQuest = GetQuest((uint)quest.NextQuestId);
Server.Database.InsertQuestProgress(Member.Client.Character.CommonId, nextQuest.QuestScheduleId, nextQuest.QuestType, 0, connectionIn);
Server.Database.InsertQuestProgress(Client.Character.CommonId, nextQuest.QuestScheduleId, nextQuest.QuestType, 0, connectionIn);
}

if (!Member.Client.Character.CompletedQuests.ContainsKey(quest.QuestId))
if (!Client.Character.CompletedQuests.ContainsKey(quest.QuestId))
{
Member.Client.Character.CompletedQuests.Add(quest.QuestId, new CompletedQuest()
Client.Character.CompletedQuests.Add(quest.QuestId, new CompletedQuest()
{
QuestId = quest.QuestId,
QuestType = quest.QuestType,
ClearCount = 1,
});
Server.Database.InsertCompletedQuest(Member.Client.Character.CommonId, quest.QuestId, quest.QuestType, connectionIn);
Server.Database.InsertCompletedQuest(Client.Character.CommonId, quest.QuestId, quest.QuestType, connectionIn);
}
else
{
uint clearCount = ++Member.Client.Character.CompletedQuests[quest.QuestId].ClearCount;
Server.Database.ReplaceCompletedQuest(Member.Client.Character.CommonId, quest.QuestId, quest.QuestType, clearCount, connectionIn);
uint clearCount = ++Client.Character.CompletedQuests[quest.QuestId].ClearCount;
Server.Database.ReplaceCompletedQuest(Client.Character.CommonId, quest.QuestId, quest.QuestType, clearCount, connectionIn);
}

CompleteQuest(quest.QuestScheduleId);
Expand All @@ -1111,14 +1111,14 @@ public override PacketQueue DistributeQuestRewards(uint questScheduleId, DbConne
var questState = GetQuestState(quest);
if (quest.HasRewards())
{
Server.RewardManager.AddQuestRewards(Member.Client, quest, connectionIn);
Server.RewardManager.AddQuestRewards(Client, quest, connectionIn);
}

// Check for Exp, Rift and Gold Rewards
packets.AddRange(SendWalletRewards(Server, Member.Client, quest, connectionIn));
packets.AddRange(SendWalletRewards(Server, Client, quest, connectionIn));

// Check for any content released by completing the quest
packets.AddRange(RewardReleasedContent(Member.Client, quest, connectionIn));
packets.AddRange(RewardReleasedContent(Client, quest, connectionIn));

return packets;
}
Expand All @@ -1132,7 +1132,7 @@ public PacketQueue HandleEnemyHuntRequests(Enemy enemy, DbConnection? connection
{
PacketQueue packets = new();

if (Member.Client.Character.GameMode != GameMode.Normal)
if (Client.Character.GameMode != GameMode.Normal)
{
return packets;
}
Expand All @@ -1143,7 +1143,7 @@ public PacketQueue HandleEnemyHuntRequests(Enemy enemy, DbConnection? connection
{
Quest questObject = QuestManager.GetQuestByScheduleId(questScheduleId);

if (questObject is null || Member.Client.Party.ExmInProgress && questObject?.QuestType == QuestType.Light)
if (questObject is null || Client.Party.ExmInProgress && questObject?.QuestType == QuestType.Light)
{
// The UI indicates that light quests cannot progress during EXMs.
continue;
Expand All @@ -1160,7 +1160,7 @@ public PacketQueue HandleEnemyHuntRequests(Enemy enemy, DbConnection? connection
// Stage 0 -> Not accepted, should never occur.
// Stage 1 -> Accepted, but no work done
// Stage N+1 -> Accepted, but with N work done.
Server.Database.UpdateQuestProgress(Member.Client.Character.CommonId, questState.QuestScheduleId, questState.QuestType, huntRecord.AmountHunted + 1, connectionIn);
Server.Database.UpdateQuestProgress(Client.Character.CommonId, questState.QuestScheduleId, questState.QuestType, huntRecord.AmountHunted + 1, connectionIn);
}

S2CQuestQuestProgressWorkSaveNtc ntc = new()
Expand All @@ -1178,7 +1178,7 @@ public PacketQueue HandleEnemyHuntRequests(Enemy enemy, DbConnection? connection
Work03 = (int)huntRecord.AmountHunted
});

Member.Client.Enqueue(ntc, packets);
Client.Enqueue(ntc, packets);
}
}
}
Expand All @@ -1189,7 +1189,7 @@ public PacketQueue ResendQuestWork()
{
PacketQueue packets = new();

if (Member.Client.Character.GameMode != GameMode.Normal)
if (Client.Character.GameMode != GameMode.Normal)
{
return packets;
}
Expand All @@ -1200,7 +1200,7 @@ public PacketQueue ResendQuestWork()
{
Quest questObject = QuestManager.GetQuestByScheduleId(questScheduleId);

if (questObject is null || Member.Client.Party.ExmInProgress && questObject?.QuestType == QuestType.Light)
if (questObject is null || Client.Party.ExmInProgress && questObject?.QuestType == QuestType.Light)
{
// The UI indicates that light quests cannot progress during EXMs.
continue;
Expand All @@ -1223,7 +1223,7 @@ public PacketQueue ResendQuestWork()
Work03 = (int)huntRecord.AmountHunted
});

Member.Client.Enqueue(ntc, packets);
Client.Enqueue(ntc, packets);
}

}
Expand Down
Loading