Skip to content

Commit a217ca2

Browse files
committed
Move vendor discount calcuation code to separate function
1 parent f74e9b4 commit a217ca2

5 files changed

Lines changed: 41 additions & 175 deletions

File tree

WowPacketParser/Parsing/Parsers/NpcHandler.cs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.Globalization;
43
using WowPacketParser.Enums;
54
using WowPacketParser.Enums.Version;
@@ -160,6 +159,31 @@ public static void AddGossipOptionAddon(int? garrTalentTreeID, TimeSpan timeSpan
160159
TempGossipOptionPOI.Reset();
161160
}
162161

162+
public static float? GetFactionVendorDiscount(WowGuid vendorGuid)
163+
{
164+
if (Settings.UseDBC && Settings.RecalcDiscount && Storage.Objects.TryGetValue(vendorGuid, out WoWObject obj) && obj is Unit unit)
165+
{
166+
int factionTemplateId = unit.UnitData.FactionTemplate ?? 0;
167+
int faction = 0;
168+
if (DBC.DBC.FactionTemplate.TryGetValue(factionTemplateId, out var factionEntry))
169+
faction = factionEntry.Faction;
170+
171+
if (!AchievementHandler.FactionReputationStore.TryGetValue(faction, out var reputation))
172+
return 1.0f;
173+
174+
return reputation switch
175+
{
176+
>= 42000 => 0.80f, // Exalted
177+
>= 21000 => 0.85f, // Revered
178+
>= 9000 => 0.90f, // Honored
179+
>= 3000 => 0.95f, // Friendly
180+
_ => 1.0f
181+
};
182+
}
183+
184+
return null;
185+
}
186+
163187
[Parser(Opcode.SMSG_GOSSIP_POI)]
164188
public static void HandleGossipPoi(Packet packet)
165189
{

WowPacketParserModule.V3_4_0_45166/Parsers/NpcHandler.cs

Lines changed: 4 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Globalization;
3-
using WowPacketParser.DBC;
43
using WowPacketParser.Enums;
54
using WowPacketParser.Enums.Version;
65
using WowPacketParser.Misc;
@@ -368,46 +367,7 @@ public static void HandleServerTrainerList(Packet packet)
368367
Trainer trainer = new Trainer();
369368

370369
WowGuid guid = packet.ReadPackedGuid128("TrainerGUID");
371-
bool hasFaction = false;
372-
float discount = 1.0f;
373-
374-
if (Settings.UseDBC && Settings.RecalcDiscount)
375-
if (Storage.Objects != null && Storage.Objects.ContainsKey(guid))
376-
{
377-
WoWObject obj = Storage.Objects[guid].Item1;
378-
if (obj.Type == ObjectType.Unit)
379-
{
380-
int factionTemplateId = (obj as Unit).UnitData.FactionTemplate ?? 0;
381-
int faction = 0;
382-
383-
if (factionTemplateId != 0 && DBC.FactionTemplate.ContainsKey(factionTemplateId))
384-
faction = DBC.FactionTemplate[factionTemplateId].Faction;
385-
386-
ulong reputation = 0;
387-
388-
if (CoreParsers.AchievementHandler.FactionReputationStore.ContainsKey(faction))
389-
{
390-
reputation = CoreParsers.AchievementHandler.FactionReputationStore[faction];
391-
hasFaction = true;
392-
}
393-
394-
uint multiplier = 0;
395-
396-
if (reputation >= 3000) // Friendly
397-
multiplier = 1;
398-
if (reputation >= 9000) // Honored
399-
multiplier = 2;
400-
if (reputation >= 21000) // Revered
401-
multiplier = 3;
402-
if (reputation >= 42000) // Exalted
403-
multiplier = 4;
404-
405-
if (multiplier != 0)
406-
discount = 1.0f - 0.05f * multiplier;
407-
408-
packet.WriteLine("ReputationDiscount: {0}%", (int)((discount * 100) - 100));
409-
}
410-
}
370+
float? discount = CoreParsers.NpcHandler.GetFactionVendorDiscount(guid);
411371

412372
trainer.Type = packet.ReadInt32E<TrainerType>("TrainerType");
413373
trainer.Id = packet.ReadUInt32("TrainerID");
@@ -424,9 +384,10 @@ public static void HandleServerTrainerList(Packet packet)
424384
uint moneyCost = packet.ReadUInt32("MoneyCost", i);
425385
uint moneyCostOriginal = moneyCost;
426386

427-
if (Settings.UseDBC && Settings.RecalcDiscount && hasFaction)
387+
if (Settings.UseDBC && Settings.RecalcDiscount && discount != null)
428388
{
429-
moneyCostOriginal = (uint)(Math.Round((moneyCost / discount) / 5)) * 5;
389+
moneyCostOriginal = (uint)(Math.Round((moneyCost / discount.Value) / 5)) * 5;
390+
packet.WriteLine("[{0}] ReputationDiscount: {1}%", i, (int)(100 - (discount * 100)));
430391
packet.WriteLine("[{0}] MoneyCostOriginal: {1}", i, moneyCostOriginal);
431392
trainerSpell.FactionHelper = "MoneyCost recalculated";
432393
}

WowPacketParserModule.V4_4_0_54481/Parsers/NpcHandler.cs

Lines changed: 4 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Globalization;
3-
using WowPacketParser.DBC;
43
using WowPacketParser.Enums;
54
using WowPacketParser.Enums.Version;
65
using WowPacketParser.Misc;
@@ -240,46 +239,7 @@ public static void HandleServerTrainerList(Packet packet)
240239
Trainer trainer = new Trainer();
241240

242241
WowGuid guid = packet.ReadPackedGuid128("TrainerGUID");
243-
bool hasFaction = false;
244-
float discount = 1.0f;
245-
246-
if (Settings.UseDBC && Settings.RecalcDiscount)
247-
if (Storage.Objects != null && Storage.Objects.ContainsKey(guid))
248-
{
249-
WoWObject obj = Storage.Objects[guid].Item1;
250-
if (obj.Type == ObjectType.Unit)
251-
{
252-
int factionTemplateId = (obj as Unit).UnitData.FactionTemplate ?? 0;
253-
int faction = 0;
254-
255-
if (factionTemplateId != 0 && DBC.FactionTemplate.ContainsKey(factionTemplateId))
256-
faction = DBC.FactionTemplate[factionTemplateId].Faction;
257-
258-
ulong reputation = 0;
259-
260-
if (CoreParsers.AchievementHandler.FactionReputationStore.ContainsKey(faction))
261-
{
262-
reputation = CoreParsers.AchievementHandler.FactionReputationStore[faction];
263-
hasFaction = true;
264-
}
265-
266-
uint multiplier = 0;
267-
268-
if (reputation >= 3000) // Friendly
269-
multiplier = 1;
270-
if (reputation >= 9000) // Honored
271-
multiplier = 2;
272-
if (reputation >= 21000) // Revered
273-
multiplier = 3;
274-
if (reputation >= 42000) // Exalted
275-
multiplier = 4;
276-
277-
if (multiplier != 0)
278-
discount = 1.0f - 0.05f * multiplier;
279-
280-
packet.WriteLine("ReputationDiscount: {0}%", (int)((discount * 100) - 100));
281-
}
282-
}
242+
float? discount = CoreParsers.NpcHandler.GetFactionVendorDiscount(guid);
283243

284244
trainer.Type = packet.ReadInt32E<TrainerType>("TrainerType");
285245
trainer.Id = packet.ReadUInt32("TrainerID");
@@ -296,9 +256,10 @@ public static void HandleServerTrainerList(Packet packet)
296256
uint moneyCost = packet.ReadUInt32("MoneyCost", i);
297257
uint moneyCostOriginal = moneyCost;
298258

299-
if (Settings.UseDBC && Settings.RecalcDiscount && hasFaction)
259+
if (Settings.UseDBC && Settings.RecalcDiscount && discount != null)
300260
{
301-
moneyCostOriginal = (uint)(Math.Round((moneyCost / discount) / 5)) * 5;
261+
moneyCostOriginal = (uint)(Math.Round((moneyCost / discount.Value) / 5)) * 5;
262+
packet.WriteLine("[{0}] ReputationDiscount: {1}%", i, (int)(100 - (discount * 100)));
302263
packet.WriteLine("[{0}] MoneyCostOriginal: {1}", i, moneyCostOriginal);
303264
trainerSpell.FactionHelper = "MoneyCost recalculated";
304265
}

WowPacketParserModule.V5_5_0_61735/Parsers/NpcHandler.cs

Lines changed: 4 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Globalization;
3-
using WowPacketParser.DBC;
43
using WowPacketParser.Enums;
54
using WowPacketParser.Enums.Version;
65
using WowPacketParser.Misc;
@@ -257,46 +256,7 @@ public static void HandleServerTrainerList(Packet packet)
257256
Trainer trainer = new Trainer();
258257

259258
WowGuid guid = packet.ReadPackedGuid128("TrainerGUID");
260-
bool hasFaction = false;
261-
float discount = 1.0f;
262-
263-
if (Settings.UseDBC && Settings.RecalcDiscount)
264-
if (Storage.Objects != null && Storage.Objects.ContainsKey(guid))
265-
{
266-
WoWObject obj = Storage.Objects[guid].Item1;
267-
if (obj.Type == ObjectType.Unit)
268-
{
269-
int factionTemplateId = (obj as Unit).UnitData.FactionTemplate ?? 0;
270-
int faction = 0;
271-
272-
if (factionTemplateId != 0 && DBC.FactionTemplate.ContainsKey(factionTemplateId))
273-
faction = DBC.FactionTemplate[factionTemplateId].Faction;
274-
275-
ulong reputation = 0;
276-
277-
if (CoreParsers.AchievementHandler.FactionReputationStore.ContainsKey(faction))
278-
{
279-
reputation = CoreParsers.AchievementHandler.FactionReputationStore[faction];
280-
hasFaction = true;
281-
}
282-
283-
uint multiplier = 0;
284-
285-
if (reputation >= 3000) // Friendly
286-
multiplier = 1;
287-
if (reputation >= 9000) // Honored
288-
multiplier = 2;
289-
if (reputation >= 21000) // Revered
290-
multiplier = 3;
291-
if (reputation >= 42000) // Exalted
292-
multiplier = 4;
293-
294-
if (multiplier != 0)
295-
discount = 1.0f - 0.05f * multiplier;
296-
297-
packet.WriteLine("ReputationDiscount: {0}%", (int)((discount * 100) - 100));
298-
}
299-
}
259+
float? discount = CoreParsers.NpcHandler.GetFactionVendorDiscount(guid);
300260

301261
trainer.Type = packet.ReadInt32E<TrainerType>("TrainerType");
302262
trainer.Id = packet.ReadUInt32("TrainerID");
@@ -313,9 +273,10 @@ public static void HandleServerTrainerList(Packet packet)
313273
uint moneyCost = packet.ReadUInt32("MoneyCost", i);
314274
uint moneyCostOriginal = moneyCost;
315275

316-
if (Settings.UseDBC && Settings.RecalcDiscount && hasFaction)
276+
if (Settings.UseDBC && Settings.RecalcDiscount && discount != null)
317277
{
318-
moneyCostOriginal = (uint)(Math.Round((moneyCost / discount) / 5)) * 5;
278+
moneyCostOriginal = (uint)(Math.Round((moneyCost / discount.Value) / 5)) * 5;
279+
packet.WriteLine("[{0}] ReputationDiscount: {1}%", i, (int)(100 - (discount * 100)));
319280
packet.WriteLine("[{0}] MoneyCostOriginal: {1}", i, moneyCostOriginal);
320281
trainerSpell.FactionHelper = "MoneyCost recalculated";
321282
}

WowPacketParserModule.V6_0_2_19033/Parsers/NpcHandler.cs

Lines changed: 4 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
using System;
2-
using System.Diagnostics.CodeAnalysis;
32
using System.Globalization;
4-
using WowPacketParser.DBC;
53
using WowPacketParser.Enums;
64
using WowPacketParser.Enums.Version;
75
using WowPacketParser.Misc;
@@ -14,7 +12,6 @@
1412

1513
namespace WowPacketParserModule.V6_0_2_19033.Parsers
1614
{
17-
[SuppressMessage("ReSharper", "UseObjectOrCollectionInitializer")]
1815
public static class NpcHandler
1916
{
2017
public static uint LastGossipPOIEntry;
@@ -385,46 +382,7 @@ public static void HandleServerTrainerList(Packet packet)
385382
Trainer trainer = new Trainer();
386383

387384
WowGuid guid = packet.ReadPackedGuid128("TrainerGUID");
388-
bool hasFaction = false;
389-
float discount = 1.0f;
390-
391-
if (Settings.UseDBC && Settings.RecalcDiscount)
392-
if (Storage.Objects != null && Storage.Objects.ContainsKey(guid))
393-
{
394-
WoWObject obj = Storage.Objects[guid].Item1;
395-
if (obj.Type == ObjectType.Unit)
396-
{
397-
int factionTemplateId = (obj as Unit).UnitData.FactionTemplate ?? 0;
398-
int faction = 0;
399-
400-
if (factionTemplateId != 0 && DBC.FactionTemplate.ContainsKey(factionTemplateId))
401-
faction = DBC.FactionTemplate[factionTemplateId].Faction;
402-
403-
ulong reputation = 0;
404-
405-
if (CoreParsers.AchievementHandler.FactionReputationStore.ContainsKey(faction))
406-
{
407-
reputation = CoreParsers.AchievementHandler.FactionReputationStore[faction];
408-
hasFaction = true;
409-
}
410-
411-
uint multiplier = 0;
412-
413-
if (reputation >= 3000) // Friendly
414-
multiplier = 1;
415-
if (reputation >= 9000) // Honored
416-
multiplier = 2;
417-
if (reputation >= 21000) // Revered
418-
multiplier = 3;
419-
if (reputation >= 42000) // Exalted
420-
multiplier = 4;
421-
422-
if (multiplier != 0)
423-
discount = 1.0f - 0.05f * multiplier;
424-
425-
packet.WriteLine("ReputationDiscount: {0}%", (int)((discount * 100) - 100));
426-
}
427-
}
385+
float? discount = CoreParsers.NpcHandler.GetFactionVendorDiscount(guid);
428386

429387
if (ClientVersion.AddedInVersion(ClientVersionBuild.V11_2_5_63704))
430388
trainer.Type = packet.ReadByteE<TrainerType>("TrainerType");
@@ -445,9 +403,10 @@ public static void HandleServerTrainerList(Packet packet)
445403
uint moneyCost = packet.ReadUInt32("MoneyCost", i);
446404
uint moneyCostOriginal = moneyCost;
447405

448-
if (Settings.UseDBC && Settings.RecalcDiscount && hasFaction)
406+
if (Settings.UseDBC && Settings.RecalcDiscount && discount != null)
449407
{
450-
moneyCostOriginal = (uint)(Math.Round((moneyCost / discount) / 5)) * 5;
408+
moneyCostOriginal = (uint)(Math.Round((moneyCost / discount.Value) / 5)) * 5;
409+
packet.WriteLine("[{0}] ReputationDiscount: {1}%", i, (int)(100 - (discount * 100)));
451410
packet.WriteLine("[{0}] MoneyCostOriginal: {1}", i, moneyCostOriginal);
452411
trainerSpell.FactionHelper = "MoneyCost recalculated";
453412
}

0 commit comments

Comments
 (0)