Skip to content

Commit 4052fef

Browse files
authored
Added SQL output for conditional quest texts (#830)
1 parent e740174 commit 4052fef

File tree

5 files changed

+177
-10
lines changed

5 files changed

+177
-10
lines changed

WowPacketParser/SQL/Builders/QuestMisc.cs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,62 @@ public static string QuestRequestItems()
126126
return SQLUtil.Compare(Storage.QuestRequestItems, templatesDb, StoreNameType.Quest);
127127
}
128128

129+
[BuilderMethod]
130+
public static string QuestDescriptionConditional()
131+
{
132+
if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.quest_template))
133+
return string.Empty;
134+
135+
if (Storage.QuestDescriptionConditional.IsEmpty())
136+
return string.Empty;
137+
138+
var templatesDb = SQLDatabase.Get(Storage.QuestDescriptionConditional);
139+
140+
return SQLUtil.Compare(Storage.QuestDescriptionConditional, templatesDb, StoreNameType.Quest);
141+
}
142+
143+
[BuilderMethod]
144+
public static string QuestCompletionLogConditional()
145+
{
146+
if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.quest_template))
147+
return string.Empty;
148+
149+
if (Storage.QuestCompletionLogConditional.IsEmpty())
150+
return string.Empty;
151+
152+
var templatesDb = SQLDatabase.Get(Storage.QuestCompletionLogConditional);
153+
154+
return SQLUtil.Compare(Storage.QuestCompletionLogConditional, templatesDb, StoreNameType.Quest);
155+
}
156+
157+
[BuilderMethod]
158+
public static string QuestOfferRewardConditional()
159+
{
160+
if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.quest_template))
161+
return string.Empty;
162+
163+
if (Storage.QuestOfferRewardConditional.IsEmpty())
164+
return string.Empty;
165+
166+
var templatesDb = SQLDatabase.Get(Storage.QuestOfferRewardConditional);
167+
168+
return SQLUtil.Compare(Storage.QuestOfferRewardConditional, templatesDb, StoreNameType.Quest);
169+
}
170+
171+
[BuilderMethod]
172+
public static string QuestRequestItemsConditional()
173+
{
174+
if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.quest_template))
175+
return string.Empty;
176+
177+
if (Storage.QuestRequestItemsConditional.IsEmpty())
178+
return string.Empty;
179+
180+
var templatesDb = SQLDatabase.Get(Storage.QuestRequestItemsConditional);
181+
182+
return SQLUtil.Compare(Storage.QuestRequestItemsConditional, templatesDb, StoreNameType.Quest);
183+
}
184+
129185
[BuilderMethod]
130186
public static string CreatureQuestStarters()
131187
{
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
using WowPacketParser.Enums;
2+
using WowPacketParser.Misc;
3+
using WowPacketParser.SQL;
4+
5+
namespace WowPacketParser.Store.Objects
6+
{
7+
public record QuestTextConditional : IDataModel
8+
{
9+
[DBFieldName("QuestId", true)]
10+
public int? QuestId;
11+
12+
[DBFieldName("PlayerConditionId", true)]
13+
public int? PlayerConditionId;
14+
15+
[DBFieldName("QuestgiverCreatureId", true)]
16+
public int? QuestgiverCreatureId;
17+
18+
[DBFieldName("locale", true)]
19+
public string Locale = ClientLocale.PacketLocaleString;
20+
21+
[DBFieldName("Text")]
22+
public string Text;
23+
24+
[DBFieldName("OrderIndex")]
25+
public int? OrderIndex;
26+
27+
[DBFieldName("VerifiedBuild")]
28+
public int? VerifiedBuild = ClientVersion.BuildInt;
29+
30+
public QuestTextConditional(QuestTextConditional questTextConditional)
31+
{
32+
QuestId = questTextConditional.QuestId;
33+
PlayerConditionId = questTextConditional.PlayerConditionId;
34+
QuestgiverCreatureId = questTextConditional.QuestgiverCreatureId;
35+
Locale = ClientLocale.PacketLocaleString;
36+
Text = questTextConditional.Text;
37+
OrderIndex = questTextConditional.OrderIndex;
38+
VerifiedBuild = ClientVersion.BuildInt;
39+
}
40+
}
41+
42+
[DBTableName("quest_description_conditional", TargetedDatabaseFlag.SinceDragonflight)]
43+
public sealed record QuestDescriptionConditional : QuestTextConditional
44+
{
45+
public QuestDescriptionConditional() { }
46+
public QuestDescriptionConditional(QuestTextConditional questTextConditional) : base(questTextConditional) { }
47+
}
48+
49+
[DBTableName("quest_completion_log_conditional", TargetedDatabaseFlag.SinceDragonflight)]
50+
public sealed record QuestCompletionLogConditional : QuestTextConditional
51+
{
52+
public QuestCompletionLogConditional() { }
53+
public QuestCompletionLogConditional(QuestTextConditional questTextConditional) : base(questTextConditional) { }
54+
}
55+
56+
[DBTableName("quest_offer_reward_conditional", TargetedDatabaseFlag.SinceDragonflight)]
57+
public sealed record QuestOfferRewardConditional : QuestTextConditional
58+
{
59+
public QuestOfferRewardConditional() { }
60+
public QuestOfferRewardConditional(QuestTextConditional questTextConditional) : base(questTextConditional) { }
61+
}
62+
63+
[DBTableName("quest_request_items_conditional", TargetedDatabaseFlag.SinceDragonflight)]
64+
public sealed record QuestRequestItemsConditional : QuestTextConditional
65+
{
66+
public QuestRequestItemsConditional() { }
67+
public QuestRequestItemsConditional(QuestTextConditional questTextConditional) : base(questTextConditional) { }
68+
}
69+
}

WowPacketParser/Store/Storage.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ public static class Storage
9999
public static readonly DataBag<QuestGreeting> QuestGreetings = new DataBag<QuestGreeting>(new List<SQLOutput> { SQLOutput.quest_template });
100100
public static readonly DataBag<QuestDetails> QuestDetails = new DataBag<QuestDetails>(new List<SQLOutput> { SQLOutput.quest_template });
101101
public static readonly DataBag<QuestRequestItems> QuestRequestItems = new DataBag<QuestRequestItems>(new List<SQLOutput> { SQLOutput.quest_template });
102+
public static readonly DataBag<QuestDescriptionConditional> QuestDescriptionConditional = new DataBag<QuestDescriptionConditional>(new List<SQLOutput> { SQLOutput.quest_template });
103+
public static readonly DataBag<QuestCompletionLogConditional> QuestCompletionLogConditional = new DataBag<QuestCompletionLogConditional>(new List<SQLOutput> { SQLOutput.quest_template });
104+
public static readonly DataBag<QuestOfferRewardConditional> QuestOfferRewardConditional = new DataBag<QuestOfferRewardConditional>(new List<SQLOutput> { SQLOutput.quest_template });
105+
public static readonly DataBag<QuestRequestItemsConditional> QuestRequestItemsConditional = new DataBag<QuestRequestItemsConditional>(new List<SQLOutput> { SQLOutput.quest_template });
102106

103107
// Names
104108
public static readonly DataBag<ObjectName> ObjectNames = new DataBag<ObjectName>();
@@ -1206,6 +1210,10 @@ public static void ClearContainers()
12061210
QuestGreetings.Clear();
12071211
QuestDetails.Clear();
12081212
QuestRequestItems.Clear();
1213+
QuestDescriptionConditional.Clear();
1214+
QuestCompletionLogConditional.Clear();
1215+
QuestOfferRewardConditional.Clear();
1216+
QuestRequestItemsConditional.Clear();
12091217

12101218
ObjectNames.Clear();
12111219

WowPacketParserModule.V10_0_0_46181/Parsers/QueryHandler.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,10 +236,10 @@ public static void HandleQuestQueryResponse(Packet packet)
236236
quest.QuestCompletionLog = packet.ReadWoWString("QuestCompletionLog", questCompletionLogLen);
237237

238238
for (int i = 0; i < conditionalQuestDescriptionCount; i++)
239-
QuestHandler.ReadConditionalQuestText(packet, "ConditionalQuestDescription", i);
239+
QuestHandler.ReadConditionalQuestText(packet, id.Key, i, QuestHandler.ConditionalTextType.Description, i, "ConditionalDescriptionText");
240240

241241
for (int i = 0; i < conditionalQuestCompletionLogCount; i++)
242-
QuestHandler.ReadConditionalQuestText(packet, "ConditionalQuestCompletionLog", i);
242+
QuestHandler.ReadConditionalQuestText(packet, id.Key, i, QuestHandler.ConditionalTextType.CompletionLog, i, "ConditionalCompletionLogText");
243243

244244
ObjectName objectName = new ObjectName
245245
{

WowPacketParserModule.V10_0_0_46181/Parsers/QuestHandler.cs

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11

2-
using Org.BouncyCastle.Crypto.Operators;
32
using WowPacketParser.Enums;
43
using WowPacketParser.Misc;
54
using WowPacketParser.Parsing;
@@ -12,14 +11,49 @@ namespace WowPacketParserModule.V10_0_0_46181.Parsers
1211
{
1312
public static class QuestHandler
1413
{
15-
public static void ReadConditionalQuestText(Packet packet, params object[] indexes)
14+
public enum ConditionalTextType
1615
{
17-
packet.ReadInt32("PlayerConditionID", indexes);
18-
packet.ReadInt32("QuestGiverCreatureID", indexes);
16+
Description = 0,
17+
CompletionLog = 1,
18+
OfferReward = 2,
19+
RequestItems = 3
20+
}
21+
22+
public static void ReadConditionalQuestText(Packet packet, int questId, int idx, ConditionalTextType type, params object[] indexes)
23+
{
24+
var playerConditionId = packet.ReadInt32("PlayerConditionID", indexes);
25+
var questgiverCreatureId = packet.ReadInt32("QuestGiverCreatureID", indexes);
1926

2027
packet.ResetBitReader();
2128
var textLength = packet.ReadBits(12);
22-
packet.ReadWoWString("Text", textLength, indexes);
29+
var text = packet.ReadWoWString("Text", textLength, indexes);
30+
31+
QuestTextConditional questTextConditional = new QuestTextConditional
32+
{
33+
QuestId = questId,
34+
PlayerConditionId = playerConditionId,
35+
QuestgiverCreatureId = questgiverCreatureId,
36+
Text = text,
37+
OrderIndex = idx
38+
};
39+
40+
switch (type)
41+
{
42+
case ConditionalTextType.Description:
43+
Storage.QuestDescriptionConditional.Add(new QuestDescriptionConditional(questTextConditional), packet.TimeSpan);
44+
break;
45+
case ConditionalTextType.CompletionLog:
46+
Storage.QuestCompletionLogConditional.Add(new QuestCompletionLogConditional(questTextConditional), packet.TimeSpan);
47+
break;
48+
case ConditionalTextType.OfferReward:
49+
Storage.QuestOfferRewardConditional.Add(new QuestOfferRewardConditional(questTextConditional), packet.TimeSpan);
50+
break;
51+
case ConditionalTextType.RequestItems:
52+
Storage.QuestRequestItemsConditional.Add(new QuestRequestItemsConditional(questTextConditional), packet.TimeSpan);
53+
break;
54+
default:
55+
break;
56+
}
2357
}
2458

2559
[Parser(Opcode.SMSG_QUEST_GIVER_QUEST_DETAILS)]
@@ -100,7 +134,7 @@ public static void HandleQuestGiverQuestDetails(Packet packet)
100134
packet.ReadWoWString("PortraitTurnInName", portraitTurnInNameLen);
101135

102136
for (int i = 0; i < conditionalDescriptionTextCount; i++)
103-
ReadConditionalQuestText(packet, "ConditionalDescriptionText");
137+
ReadConditionalQuestText(packet, id, i, ConditionalTextType.Description, i, "ConditionalDescriptionText");
104138

105139
Storage.QuestDetails.Add(questDetails, packet.TimeSpan);
106140
}
@@ -177,7 +211,7 @@ public static void HandleQuestGiverRequestItems(Packet packet)
177211
completionTextLen = packet.ReadBits(12);
178212

179213
for (int i = 0; i < conditionalCompletionTextCount; i++)
180-
ReadConditionalQuestText(packet, "ConditionalCompletionText");
214+
ReadConditionalQuestText(packet, id, i, ConditionalTextType.RequestItems, i, "ConditionalCompletionText");
181215

182216
requestItems.QuestTitle = packet.ReadWoWString("QuestTitle", questTitleLen);
183217
string completionText = requestItems.CompletionText = packet.ReadWoWString("CompletionText", completionTextLen);
@@ -258,7 +292,7 @@ public static void QuestGiverOfferReward(Packet packet)
258292
uint portraitTurnInNameLen = packet.ReadBits(8);
259293

260294
for (int i = 0; i < conditionalRewardTextCount; i++)
261-
ReadConditionalQuestText(packet, "ConditionalRewardText");
295+
ReadConditionalQuestText(packet, (int)questOfferReward.ID, i, ConditionalTextType.OfferReward, i, "ConditionalRewardText");
262296

263297
packet.ReadWoWString("QuestTitle", questTitleLen);
264298
questOfferReward.RewardText = packet.ReadWoWString("RewardText", rewardTextLen);

0 commit comments

Comments
 (0)