Skip to content

Commit ab404a4

Browse files
committed
Fix hunt quests not restoring progress properly. Fix quest decay catching non-board quests. Adjust migration versioning. Default generators now use all available questIds daily.
1 parent df3809a commit ab404a4

15 files changed

Lines changed: 272 additions & 167 deletions

File tree

Arrowgene.Ddon.Database/DdonDatabaseBuilder.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
using System;
2-
using System.IO;
3-
using System.Text;
4-
using System.Text.RegularExpressions;
51
using Arrowgene.Ddon.Database.Model;
62
using Arrowgene.Ddon.Database.Sql;
73
using Arrowgene.Ddon.Shared.Entity;
84
using Arrowgene.Logging;
5+
using System;
6+
using System.IO;
7+
using System.Text;
8+
using System.Text.RegularExpressions;
99

1010
namespace Arrowgene.Ddon.Database;
1111

1212
public static class DdonDatabaseBuilder
1313
{
1414
private const string DefaultSchemaFile = "Script/schema_sqlite.sql";
1515

16-
public const uint Version = 44;
16+
public const uint Version = 45;
1717
private static readonly ILogger Logger = LogProvider.Logger<Logger>(typeof(DdonDatabaseBuilder));
1818

1919
public static IDatabase Build(DatabaseSetting settings)

Arrowgene.Ddon.Database/Sql/Core/Migration/00000044_LightQuestRotationMigration.cs renamed to Arrowgene.Ddon.Database/Sql/Core/Migration/00000045_LightQuestRotationMigration.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,17 @@
1-
using Arrowgene.Ddon.Database.Model;
21
using Arrowgene.Ddon.Shared.Model.Quest;
32
using Arrowgene.Logging;
4-
using System;
53
using System.Collections.Generic;
64
using System.Data.Common;
7-
using System.Diagnostics;
85
using System.Linq;
9-
using System.Text;
10-
using System.Threading.Tasks;
116

127
namespace Arrowgene.Ddon.Database.Sql.Core.Migration
138
{
149
public class LightQuestRotationMigration : IMigrationStrategy
1510
{
1611
private static readonly ILogger Logger = LogProvider.Logger<Logger>(typeof(LightQuestRotationMigration));
1712

18-
public uint From => 43;
19-
public uint To => 44;
13+
public uint From => 44;
14+
public uint To => 45;
2015

2116
private readonly DatabaseSetting DatabaseSetting;
2217

Arrowgene.Ddon.GameServer/Characters/EquipManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ public PacketQueue HandleChangeEquipList(DdonGameServer server, GameClient clien
179179
);
180180

181181
//Check for ensemble requirements
182-
ClientItemInfo itemInfo = server.ItemManager.LookupInfoByUID(server, itemUId);
182+
ClientItemInfo itemInfo = server.ItemManager.LookupInfoByUID(server, itemUId, connectionIn);
183183
if (itemInfo.SubCategory == ItemSubCategory.EquipEnsemble)
184184
{
185185
foreach (EquipSlot slot in EnsembleSlots)

Arrowgene.Ddon.GameServer/Handler/CharacterSwitchGameModeHandler.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Arrowgene.Ddon.GameServer.Characters;
2+
using Arrowgene.Ddon.GameServer.Quests;
23
using Arrowgene.Ddon.Server;
34
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
45
using Arrowgene.Ddon.Shared.Entity.Structure;

Arrowgene.Ddon.GameServer/Handler/EquipChangeCharacterEquipHandler.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ public EquipChangeCharacterEquipHandler(DdonGameServer server) : base(server)
2121

2222
public override PacketQueue Handle(GameClient client, C2SEquipChangeCharacterEquipReq request)
2323
{
24-
(S2CItemUpdateCharacterItemNtc itemNtc, S2CEquipChangeCharacterEquipNtc equipNtc) equipResult = (null, null);
25-
2624
PacketQueue queue = new();
2725

2826
if (!Server.EquipManager.CanMeetStorageRequirements(Server, client, client.Character, request.ChangeCharacterEquipList, new List<StorageType>() { StorageType.ItemBagEquipment }))

Arrowgene.Ddon.GameServer/Handler/QuestGetCycleContentsStateListHandler.cs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Arrowgene.Ddon.GameServer.Characters;
22
using Arrowgene.Ddon.GameServer.Dump;
3+
using Arrowgene.Ddon.GameServer.Quests.LightQuests;
34
using Arrowgene.Ddon.Server;
45
using Arrowgene.Ddon.Shared.Entity;
56
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
@@ -62,15 +63,29 @@ public override S2CQuestGetCycleContentsStateListRes Handle(GameClient client, C
6263

6364
List<QuestProgress> allQuestsInProgress = new();
6465
List<uint> priorityQuests = new();
65-
bool decayedQuests = false;
66+
List<uint> decayedQuests = new();
6667
Server.Database.ExecuteInTransaction(connection =>
6768
{
6869
allQuestsInProgress = Server.Database.GetQuestProgressByType(client.Character.CommonId, QuestType.All, connection);
6970
priorityQuests = client.Party is not null ? Server.Database.GetPriorityQuestScheduleIds(client.Party.Leader.Client.Character.CommonId, connection) : new();
7071

71-
decayedQuests = Server.LightQuestManager.HandleQuestDecay(client.Character, allQuestsInProgress, priorityQuests, connection).Any();
72+
decayedQuests = Server.LightQuestManager.HandleQuestDecay(client.Character, allQuestsInProgress, priorityQuests, connection).ToList();
7273
});
7374

75+
foreach(var decayedScheduleId in decayedQuests)
76+
{
77+
var quest = QuestManager.GetQuestByScheduleId(decayedScheduleId);
78+
if (quest is null)
79+
{
80+
continue;
81+
}
82+
ntc.ExpiredQuestList.Add(new()
83+
{
84+
QuestId = quest.QuestId,
85+
QuestScheduleId = quest.QuestScheduleId,
86+
});
87+
}
88+
7489
foreach (var questProgress in allQuestsInProgress)
7590
{
7691
var quest = QuestManager.GetQuestByScheduleId(questProgress.QuestScheduleId);
@@ -118,9 +133,7 @@ public override S2CQuestGetCycleContentsStateListRes Handle(GameClient client, C
118133
}
119134
}
120135

121-
client.Send(ntc);
122-
123-
if (decayedQuests)
136+
if (decayedQuests.Count > 0)
124137
{
125138
client.Send(new S2CLobbyChatMsgNotice()
126139
{
@@ -129,6 +142,8 @@ public override S2CQuestGetCycleContentsStateListRes Handle(GameClient client, C
129142
});
130143
}
131144

145+
client.Send(ntc);
146+
132147
return new();
133148
}
134149
}

Arrowgene.Ddon.GameServer/Handler/QuestGetPartyQuestProgressInfoHandler.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using Arrowgene.Ddon.GameServer.Characters;
22
using Arrowgene.Ddon.GameServer.Dump;
3+
using Arrowgene.Ddon.GameServer.Quests;
4+
using Arrowgene.Ddon.GameServer.Quests.LightQuests;
35
using Arrowgene.Ddon.Server;
46
using Arrowgene.Ddon.Shared.Entity;
57
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
@@ -8,6 +10,7 @@
810
using Arrowgene.Logging;
911
using System;
1012
using System.Collections.Generic;
13+
using System.Linq;
1114

1215
namespace Arrowgene.Ddon.GameServer.Handler
1316
{
@@ -58,9 +61,20 @@ public override S2CQuestGetPartyQuestProgressInfoRes Handle(GameClient client, C
5861
}
5962
var questStateManager = QuestManager.GetQuestStateManager(client, quest);
6063
var questState = questStateManager.GetQuestState(questScheduleId);
61-
pcap.QuestOrderList.Add(quest.ToCDataQuestOrderList(questState.Step));
64+
65+
var questOrder = quest.ToCDataQuestOrderList(questState.Step);
66+
67+
//if (quest.BackingObject is LightQuestHuntQuest lightBackingObject
68+
// && questOrder.QuestProcessStateList.FirstOrDefault()?.WorkList.ElementAtOrDefault(0) != null)
69+
//{
70+
// var huntRecord = questState.HuntRecords.Values.FirstOrDefault();
71+
// questOrder.QuestProcessStateList.FirstOrDefault().WorkList[0] = lightBackingObject.StepAsWork((huntRecord?.AmountHunted ?? 0) + 1);
72+
//}
73+
74+
pcap.QuestOrderList.Add(questOrder);
6275
}
6376

77+
((SoloQuestStateManager)client.QuestState).ResendQuestWork().Send();
6478
#if false
6579
EntitySerializer<S2CQuestGetPartyQuestProgressInfoRes> serializer = EntitySerializer.Get<S2CQuestGetPartyQuestProgressInfoRes>();
6680
S2CQuestGetPartyQuestProgressInfoRes pcap = serializer.Read(early_stream);

Arrowgene.Ddon.GameServer/Handler/StageAreaChangeHandler.cs

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Arrowgene.Ddon.GameServer.Characters;
22
using Arrowgene.Ddon.GameServer.Context;
3+
using Arrowgene.Ddon.GameServer.Quests.LightQuests;
34
using Arrowgene.Ddon.Server;
45
using Arrowgene.Ddon.Server.Network;
56
using Arrowgene.Ddon.Shared.Entity.PacketStructure;
@@ -78,40 +79,44 @@ public override PacketQueue Handle(GameClient client, C2SStageAreaChangeReq pack
7879
client.Party.ResetInstance();
7980
client.Party.SendToAll(new S2CInstanceAreaResetNtc());
8081

81-
foreach(var member in client.Party.Clients)
82+
Server.Database.ExecuteInTransaction(connection =>
8283
{
83-
var activeScheduleIds = member.QuestState.GetActiveQuestScheduleIds();
84-
var droppedQuests = Server.LightQuestManager.GetDecayedQuests(activeScheduleIds);
85-
foreach(var droppedQuest in droppedQuests)
84+
foreach (var member in client.Party.Clients)
8685
{
87-
Logger.Debug($"Quest {droppedQuest} has decayed and will be cancelled.");
88-
89-
var quest = QuestManager.GetQuestByScheduleId(droppedQuest);
90-
if (quest is not null)
86+
var activeScheduleIds = member.QuestState.GetActiveQuestScheduleIds().Where(x => LightQuestManager.IsLightQuestScheduleId(x));
87+
var droppedQuests = Server.LightQuestManager.GetDecayedQuests(activeScheduleIds);
88+
foreach (var droppedQuest in droppedQuests)
9189
{
92-
// TODO: Is this the right notice?
93-
client.Enqueue(new S2CQuestQuestCancelSilentNtc()
90+
Logger.Debug($"Quest {droppedQuest} has decayed and will be cancelled.");
91+
92+
var quest = QuestManager.GetQuestByScheduleId(droppedQuest);
93+
if (quest is not null)
9494
{
95-
QuestScheduleId = droppedQuest
96-
}, queue);
95+
// TODO: Is this the right notice?
96+
client.Enqueue(new S2CQuestQuestCancelSilentNtc()
97+
{
98+
QuestScheduleId = droppedQuest
99+
}, queue);
100+
}
101+
member.QuestState.CancelQuest(droppedQuest);
102+
Server.Database.RemoveQuestProgress(member.Character.CommonId, droppedQuest, quest.QuestType, connection);
97103
}
98-
member.QuestState.CancelQuest(droppedQuest);
99-
}
100104

101-
if (droppedQuests.Any())
102-
{
103-
member.Enqueue(new S2CLobbyChatMsgNotice()
105+
if (droppedQuests.Any())
104106
{
105-
Type = LobbyChatMsgType.ManagementAlertC,
106-
Message = "A quest has been canceled because the\ndelivery time period has ended."
107-
}, queue);
107+
member.Enqueue(new S2CLobbyChatMsgNotice()
108+
{
109+
Type = LobbyChatMsgType.ManagementAlertC,
110+
Message = "A quest has been canceled because the\ndelivery time period has ended."
111+
}, queue);
108112

109-
if (member.Party.IsSolo || member.Party.Leader?.Client == member)
110-
{
111-
queue.AddRange(member.Party.QuestState.UpdatePriorityQuestList(member.Party.Leader.Client));
113+
if (member.Party.IsSolo || member.Party.Leader?.Client == member)
114+
{
115+
queue.AddRange(member.Party.QuestState.UpdatePriorityQuestList(member.Party.Leader.Client, connection));
116+
}
112117
}
113118
}
114-
}
119+
});
115120
}
116121
}
117122

Arrowgene.Ddon.GameServer/Quests/GenericQuest.cs

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -604,14 +604,6 @@ private static CDataQuestProcessState BlockAsCDataQuestProcessState(GenericQuest
604604
foreach (var item in questBlock.DeliveryRequests)
605605
{
606606
checkCommands.Add(QuestManager.CheckCommand.DeliverItem((int)item.ItemId, (int)item.Amount, questBlock.NpcOrderDetails[0].NpcId, questBlock.NpcOrderDetails[0].MsgId));
607-
workCommands.Add(new CDataQuestProgressWork()
608-
{
609-
CommandNo = (uint)QuestNotifyCommand.FulfillDeliverItem,
610-
Work01 = 0,
611-
Work02 = 1,
612-
Work03 = 2,
613-
Work04 = 3,
614-
});
615607
}
616608
resultCommands.Add(QuestManager.ResultCommand.SetDeliverInfo(StageManager.ConvertIdToStageNo(questBlock.StageLayoutId), questBlock.NpcOrderDetails[0].NpcId, questBlock.NpcOrderDetails[0].MsgId));
617609
}
@@ -748,15 +740,15 @@ private static CDataQuestProcessState BlockAsCDataQuestProcessState(GenericQuest
748740
{
749741
// Handles kill x amount of monster type quests
750742
checkCommands.Add(QuestManager.CheckCommand.EmDieLight((int)questBlock.TargetEnemy.EnemyId, (int)questBlock.TargetEnemy.Level, (int)questBlock.TargetEnemy.Amount));
751-
workCommands.Add(
752-
new CDataQuestProgressWork()
753-
{
754-
CommandNo = (uint)QuestNotifyCommand.KilledEnemyLight,
755-
Work01 = (int)questBlock.TargetEnemy.EnemyId,
756-
Work02 = (int)questBlock.TargetEnemy.Level,
757-
Work03 = 0,
758-
Work04 = 0,
759-
});
743+
//workCommands.Add(
744+
// new CDataQuestProgressWork()
745+
// {
746+
// CommandNo = (uint)QuestNotifyCommand.KilledEnemyLight,
747+
// Work01 = (int)questBlock.TargetEnemy.EnemyId,
748+
// Work02 = (int)questBlock.TargetEnemy.Level,
749+
// Work03 = 0,
750+
// Work04 = 0,
751+
// });
760752
}
761753
break;
762754
case QuestBlockType.DeliverItemsLight:

Arrowgene.Ddon.GameServer/Quests/LightQuests/LightQuestQuest.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ public LightQuestQuest(LightQuestRecord record)
8181

8282
return GenericQuest.FromAsset(server, assetData, this);
8383
}
84+
85+
public abstract CDataQuestProgressWork StepAsWork(uint step);
8486
}
8587

8688
public class LightQuestHuntQuest(LightQuestRecord record) : LightQuestQuest(record)
@@ -96,6 +98,18 @@ protected override void InitializeBlocks()
9698

9799
process0.AddProcessEndBlock(true);
98100
}
101+
102+
public override CDataQuestProgressWork StepAsWork(uint step)
103+
{
104+
return new CDataQuestProgressWork()
105+
{
106+
CommandNo = (uint)QuestNotifyCommand.KilledEnemyLight,
107+
Work01 = QuestRecord.Target,
108+
Work02 = QuestRecord.Level,
109+
Work03 = (int)(step - 1),
110+
Work04 = 0,
111+
};
112+
}
99113
}
100114

101115
public class LightQuestDeliveryQuest(LightQuestRecord record) : LightQuestQuest(record)
@@ -113,5 +127,10 @@ protected override void InitializeBlocks()
113127

114128
process0.AddProcessEndBlock(true);
115129
}
130+
131+
public override CDataQuestProgressWork StepAsWork(uint step)
132+
{
133+
return null;
134+
}
116135
}
117136
}

0 commit comments

Comments
 (0)