diff --git a/AssortUpdater/AssortFlattener.cs b/AssortUpdater/AssortFlattener.cs index cae0fb3..d34d9e6 100644 --- a/AssortUpdater/AssortFlattener.cs +++ b/AssortUpdater/AssortFlattener.cs @@ -45,7 +45,7 @@ namespace AssortUpdater } } } - assortToAddTo.SubItems.Add(subAssort); + assortToAddTo?.SubItems.Add(subAssort); } return results; @@ -95,24 +95,6 @@ namespace AssortUpdater return results; } - public class FlatAssort - { - public FlatAssort() - { - SubItems = new List(); - BarterDetails = new List(); - } - - public string AssortId { get; set; } - public string ItemId { get; set; } - public string ItemName { get; set; } - public List SubItems { get; set; } - public Assort.Item RawItem { get;set;} - public int Level { get; set; } - public bool IsMoney { get; set; } - public List BarterDetails { get; set; } - } - public static Assort UnFlatten(List flatAssorts) { var result = new Assort(); diff --git a/AssortUpdater/AssortMerger.cs b/AssortUpdater/AssortMerger.cs index 3b71451..c5a9332 100644 --- a/AssortUpdater/AssortMerger.cs +++ b/AssortUpdater/AssortMerger.cs @@ -1,4 +1,5 @@ using AssortValidator.Common.Helpers; +using AssortValidator.Common.Models; using static AssortUpdater.AssortFlattener; namespace AssortUpdater diff --git a/AssortUpdater/Program.cs b/AssortUpdater/Program.cs index 3b5f18b..14b0091 100644 --- a/AssortUpdater/Program.cs +++ b/AssortUpdater/Program.cs @@ -34,15 +34,15 @@ class Program //LogItemsMissingInLiveAssorts(trader.Key.ToString(), flattenedExistingAssorts, flattenedLiveAssorts); //LogItemsMissingInExistingAssorts(trader.Key.ToString(), flattenedExistingAssorts, flattenedLiveAssorts); - var flatAssorts = AssortMerger.CreateMergedFlattenedAssorts(trader.Key.ToString(), flattenedLiveAssorts, flattenedExistingAssorts); + List? flatAssorts = AssortMerger.CreateMergedFlattenedAssorts(trader.Key.ToString(), flattenedLiveAssorts, flattenedExistingAssorts); LoggingHelpers.LogInfo($"trader: {TraderHelper.GetTraderIdByName(trader.Key)}"); AssortMerger.ListDuplicatesInMergedAssorts(flatAssorts); Assort unflattenedAssorts = AssortFlattener.UnFlatten(flatAssorts); - JsonWriter.WriteJson(unflattenedAssorts, traderId, Directory.GetCurrentDirectory(), "assort"); + //JsonWriter.WriteJson(unflattenedAssorts, traderId, Directory.GetCurrentDirectory(), "assort"); - var questAssorts = QuestHelper.CreateQuestAssortsList(traderQuestAssortUnlocks); + var questAssorts = QuestHelper.CreateQuestAssortsList(trader.Key, traderQuestAssortUnlocks, flatAssorts); LogQuestUnlocks(questAssorts, unflattenedAssorts); JsonWriter.WriteJson(questAssorts, traderId, Directory.GetCurrentDirectory(), "questassort"); } @@ -57,11 +57,11 @@ class Program var assortData = unflattenedAssorts.items.Find(x => x._id == assortId); - LoggingHelpers.LogToConsole($"Item {assortId} {assortData?.ItemName} is unlocked by quest {QuestNames.GetNameById(questId)}"); + LoggingHelpers.LogToConsole($"Assort: {assortId} Item: {assortData?.ItemName} is unlocked by quest {QuestNames.GetNameById(questId)}"); } } - private static void LogItemsMissingInExistingAssorts(string traderName, List flattenedExistingAssorts, List flattenedLiveAssorts) + private static void LogItemsMissingInExistingAssorts(string traderName, List flattenedExistingAssorts, List flattenedLiveAssorts) { foreach (var liveAssort in flattenedLiveAssorts) { @@ -94,7 +94,7 @@ class Program } } - private static void LogItemsMissingInLiveAssorts(string traderName, List flattenedExistingAssorts, List flattenedLiveAssorts) + private static void LogItemsMissingInLiveAssorts(string traderName, List flattenedExistingAssorts, List flattenedLiveAssorts) { foreach (var existingAssort in flattenedExistingAssorts) { diff --git a/AssortValidator.Common/Helpers/CurrencyHelper.cs b/AssortValidator.Common/Helpers/CurrencyHelper.cs new file mode 100644 index 0000000..7bde36a --- /dev/null +++ b/AssortValidator.Common/Helpers/CurrencyHelper.cs @@ -0,0 +1,33 @@ +using AssortValidator.Common.Models; +using System.Collections.Generic; + +namespace AssortValidator.Common.Helpers +{ + public static class CurrencyHelper + { + private static readonly Dictionary questLookup = new() + { + { CurrencyEnum.Rouble, "5936d90786f7742b1420ba5b" }, + { CurrencyEnum.Euro, "5936da9e86f7742d65037edf" }, + { CurrencyEnum.USD, "59674cd986f7744ab26e32f2" }, + }; + + public static string GetCurrencyByEnum(CurrencyEnum currencyType) + { + return questLookup[currencyType]; + } + + public static CurrencyEnum GetCurrencyById(string itemId) + { + foreach (var item in questLookup) + { + if (item.Value == itemId) + { + return item.Key; + } + } + + return 0; + } + } +} diff --git a/AssortValidator.Common/Helpers/QuestAssortMappingHelper.cs b/AssortValidator.Common/Helpers/QuestAssortMappingHelper.cs new file mode 100644 index 0000000..3149f79 --- /dev/null +++ b/AssortValidator.Common/Helpers/QuestAssortMappingHelper.cs @@ -0,0 +1,65 @@ +using AssortValidator.Common.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static AssortValidator.Common.Models.Assort; + +namespace AssortValidator.Common.Helpers +{ + public static class QuestAssortMappingHelper + { + private static readonly Dictionary> mappings = new() + { + { + "59689ee586f7740d1570bbd5", + new List() { new QuestAssortMapping { QuestType = QuestEnum.SanitaryStandardsP1, ItemTplId = "590c661e86f7741e566b646a", Level = 1, Trader = Trader.Therapist, IsMoneyBarter = false } } + }, // car first aid + { + "5c0bde0986f77479cf22c2f8", + new List() { new QuestAssortMapping { QuestType = QuestEnum.AShooterBornInHeaven, ItemTplId = "5c127c4486f7745625356c13", Level = 3, Trader = Trader.Mechanic, IsMoneyBarter = false } } + }, + { + "5967725e86f774601a446662", + new List() { new QuestAssortMapping { QuestType = QuestEnum.ShakingUpTeller, ItemTplId = "59c0ec5b86f77435b128bfca", Level = 2, Trader = Trader.Skier, IsMoneyBarter = false } } + + }, // Hexagon 12K 12ga sound suppressor + { + "5a27b7d686f77460d847e6a6", + new List() { new QuestAssortMapping { QuestType = QuestEnum.ScrapMetal, ItemTplId = "5926bb2186f7744b1c6c6e60", Trader = Trader.Peacekeeper, Level = 2, IsMoneyBarter = true, SubItemCount = 7 } } + + }, // HK MP5 9x19 submachine gun (Navy 3 Round Burst) + { + "5ae327c886f7745c7b3f2f3f", + new List() { new QuestAssortMapping { QuestType = QuestEnum.GunsmithP10, ItemTplId = "5447a9cd4bdc2dbd208b4567", Trader = Trader.Mechanic, Level = 3, IsMoneyBarter = false } } + + }, // Colt M4A1 5.56x45 assault rifle (variant SOPMOD I) + { + "5c0bbaa886f7746941031d82", + new List() + { new QuestAssortMapping { QuestType = QuestEnum.Bullshit, ItemTplId = "5c1127d0d174af29be75cf68", Trader = Trader.Skier, Level = 3, IsMoneyBarter = false }, // 12/70 RIP 5 shell ammo box + new QuestAssortMapping { QuestType = QuestEnum.Bullshit, ItemTplId = "606587252535c57a13424cfd", Trader = Trader.Skier, Level = 3, IsMoneyBarter = true }} //mutant mk47 + + }, + + }; + + public static List GetQuestAssortMappingDetails(string questId) + { + return mappings[questId]; + } + } + + public class QuestAssortMapping + { + public QuestEnum QuestType { get; set; } + public string ItemTplId { get; set; } + public Trader Trader { get; set; } + public bool IsMoneyBarter { get; set; } + public int Level { get; set; } + public CurrencyEnum? CurrencyTypeId { get; set; } + + public int SubItemCount { get; set; } + } +} diff --git a/AssortValidator.Common/Helpers/QuestHelper.cs b/AssortValidator.Common/Helpers/QuestHelper.cs index bcf413e..ee28d55 100644 --- a/AssortValidator.Common/Helpers/QuestHelper.cs +++ b/AssortValidator.Common/Helpers/QuestHelper.cs @@ -1,6 +1,8 @@ using AssortHelpers.Common.Helpers; using AssortValidator.Common.Helpers.Models; +using AssortValidator.Common.Models; using AssortValidator.Models; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -298,16 +300,17 @@ namespace AssortValidator.Common.Helpers foreach (var quest in quests) { - foreach (var assortUnlockReward in quest.rewards.Success.Where(x=>x.type == "AssortmentUnlock")) + foreach (var assortUnlockReward in quest.rewards.Success.Where(x => x.type == "AssortmentUnlock")) { - results.Add(new QuestAssortUnlock{ + results.Add(new QuestAssortUnlock + { QuestId = quest._id, QuestName = GetQuestNameById(quest._id), TraderId = assortUnlockReward.traderId, TraderType = TraderHelper.GetTraderTypeById(assortUnlockReward.traderId), - AssortId = assortUnlockReward.items[0]._id, + AssortItems = assortUnlockReward.items, AssortTemplateId = assortUnlockReward.items[0]._tpl, - LoyaltyLevel = assortUnlockReward.loyaltyLevel.GetValueOrDefault(0), + LoyaltyLevel = assortUnlockReward.loyaltyLevel.GetValueOrDefault(1), QuestState = "success" }); } @@ -316,17 +319,78 @@ namespace AssortValidator.Common.Helpers return results; } - public static QuestAssorts CreateQuestAssortsList(IEnumerable questAssortData) + public static QuestAssorts CreateQuestAssortsList(Trader trader, IEnumerable questAssortData, List flatAssorts) { var result = new QuestAssorts(); + int count = 1; foreach (var questAssortUnlock in questAssortData) { - result.success.Add(questAssortUnlock.AssortId, questAssortUnlock.QuestId); + if (questAssortUnlock.QuestId == "5c0bbaa886f7746941031d82") + { + var x = 1; + } + + // find assort by item tpl and level + IEnumerable associatedAssort = flatAssorts.Where(x => x.ItemId == questAssortUnlock.AssortItems[0]._tpl && x.Level == questAssortUnlock.LoyaltyLevel); + + if (associatedAssort is null || !associatedAssort.Any()) + { + //throw new System.Exception($"no assort found for quest {questAssortUnlock.QuestName}"); + result.success.Add($"MISSING{count}", questAssortUnlock.QuestId); + count++; + continue; + } + + // just one item found, woo yeah + if (associatedAssort.Count() == 1) + { + result.success.Add(associatedAssort.Single().AssortId, questAssortUnlock.QuestId); + continue; + } + + // multiple found, time to use hand-made data from QuestAssortMappingHelper + if (associatedAssort.Count() > 1) + { + var matchingAssort = GetMatchingAssortUsingManualMapping(trader, associatedAssort, questAssortUnlock); + + if (matchingAssort.Count == 1) + { + result.success.Add(associatedAssort.FirstOrDefault().AssortId, questAssortUnlock.QuestId); + continue; + } + + if (matchingAssort.Count == 0) + { + result.success.Add($"none found {Guid.NewGuid()}", questAssortUnlock.QuestId); + continue; + } + + result.success.Add($"too many {Guid.NewGuid()}", questAssortUnlock.QuestId); + } } return result; } + private static List GetMatchingAssortUsingManualMapping(Trader trader, IEnumerable possibleAssorts, QuestAssortUnlock questToFindAssortFor) + { + var results = new List(); + List manualAssortMappings = QuestAssortMappingHelper.GetQuestAssortMappingDetails(questToFindAssortFor.QuestId); + var singleMapping = manualAssortMappings.Single(x => x.Trader == trader && x.ItemTplId == questToFindAssortFor.AssortTemplateId && x.Level == questToFindAssortFor.LoyaltyLevel); + results = possibleAssorts.Where(x => x.IsMoney == singleMapping.IsMoneyBarter + && trader == singleMapping.Trader + && x.Level == singleMapping.Level + && x.RawItem._tpl == singleMapping.ItemTplId + ).ToList(); + + if (results.Count > 1) + { + results = results.Where(x => x.SubItems.Count == singleMapping.SubItemCount).ToList(); + } + + return results; + } + public class QuestAssorts { public QuestAssorts() @@ -349,7 +413,7 @@ namespace AssortValidator.Common.Helpers } return "Unknown Quest"; - + } } } diff --git a/AssortValidator.Common/Helpers/QuestNames.cs b/AssortValidator.Common/Helpers/QuestNames.cs new file mode 100644 index 0000000..784cd12 --- /dev/null +++ b/AssortValidator.Common/Helpers/QuestNames.cs @@ -0,0 +1,545 @@ +using AssortValidator.Common.Models; +using System.Collections.Generic; +namespace QuestValidator.Common.Helpers +{ + public static class QuestNames + { + private static readonly Dictionary questLookup = new() + { + { QuestEnum.Debut, "5936d90786f7742b1420ba5b" }, + { QuestEnum.Checking, "5936da9e86f7742d65037edf"}, + { QuestEnum.ShootoutPicnic, "59674cd986f7744ab26e32f2"}, + { QuestEnum.DeliveryFromThePast, "59674eb386f774539f14813a"}, + { QuestEnum.BadRepEvidence, "5967530a86f77462ba22226b"}, + { QuestEnum.IceCreamCones, "59675d6c86f7740a842fc482"}, + { QuestEnum.PostmanPatP1, "59675ea386f77414b32bded2"}, + { QuestEnum.PostmanPatP2, "596760e186f7741e11214d58"}, + { QuestEnum.ShakingUpTeller, "5967725e86f774601a446662"}, + { QuestEnum.Shortage, "5967733e86f774602332fc84"}, + { QuestEnum.SanitaryStandardsP1, "59689ee586f7740d1570bbd5"}, + { QuestEnum.OperationAquarius, "59689fbd86f7740d137ebfc4"}, + { QuestEnum.OperationAquariusP2, "5968eb3186f7741dde183a4d"}, + { QuestEnum.Painkiller, "5969f90786f77420d2328015"}, + { QuestEnum.Pharmacist, "5969f9e986f7741dde183a50"}, + { QuestEnum.SupplyPlans, "596a0e1686f7741ddf17dbee"}, + { QuestEnum.KindOfSabotage, "596a101f86f7741ddb481582" }, + { QuestEnum.GeneralWares, "596a1e6c86f7741ddc2d3206"}, + { QuestEnum.SanitaryStandardsP2, "596a204686f774576d4c95de"}, + { QuestEnum.CarRepair, "596a218586f77420d232807c"}, + { QuestEnum.Supplier, "596b36c586f77450d6045ad2"}, + { QuestEnum.TheExtortionist, "596b43fb86f77457ca186186"}, + { QuestEnum.Stirrup, "596b455186f77457cb50eccb"}, + { QuestEnum.WhatsOnTheFlashDrive, "5979ed3886f77431307dc512"}, + { QuestEnum.GoldenSwag, "5979eee086f774311955e614"}, + { QuestEnum.PolikhimHobo, "5979f8bb86f7743ec214c7a6"}, + { QuestEnum.ChemicalP1, "5979f9ba86f7740f6c3fe9f2"}, + { QuestEnum.ChemicalP2, "597a0b2986f77426d66c0633"}, + { QuestEnum.ChemicalP3, "597a0e5786f77426d66c0636"}, + { QuestEnum.ChemicalP4, "597a0f5686f774273b74f676"}, + { QuestEnum.OutOfCuriosity, "597a160786f77477531d39d2"}, + { QuestEnum.BigCustomer, "597a171586f77405ba6887d3"}, + { QuestEnum.BPDepot, "59c124d686f774189b3c843f"}, + { QuestEnum.ThePunisherP1, "59c50a9e86f7745fef66f4ff"}, + { QuestEnum.ThePunisherP2, "59c50c8886f7745fed3193bf"}, + { QuestEnum.ThePunisherP3, "59c512ad86f7741f0d09de9b"}, + { QuestEnum.TrustRegain, "59c9392986f7742f6923add2"}, + { QuestEnum.LoyaltyBuyout, "59c93e8e86f7742a406989c4"}, + { QuestEnum.NoOffence, "59ca1a6286f774509a270942"}, + { QuestEnum.ThePunisherP4, "59ca264786f77445a80ed044"}, + { QuestEnum.ThePunisherP5, "59ca29fb86f77445ab465c87"}, + { QuestEnum.ThePunisherP6, "59ca2eb686f77445a80ed049"}, + { QuestEnum.NoQuestNameGiven, "59f9da6786f774714230d751"}, + { QuestEnum.SpaTourP1, "5a03153686f77442d90e2171"}, + { QuestEnum.SpaTourP2, "5a03173786f77451cb427172"}, + { QuestEnum.SpaTourP3, "5a0327ba86f77456b9154236"}, + { QuestEnum.SpaTourP4, "5a03296886f774569778596a"}, + { QuestEnum.SpaTourP5, "5a0449d586f77474e66227b7"}, + { QuestEnum.FishingGear, "5a27b75b86f7742e97191958"}, + { QuestEnum.TigrSafari, "5a27b7a786f774579c3eb376"}, + { QuestEnum.ScrapMetal, "5a27b7d686f77460d847e6a6"}, + { QuestEnum.EagleEye, "5a27b80086f774429a5d7e20"}, + { QuestEnum.HumanitarianSupplies, "5a27b87686f77460de0252a8"}, + { QuestEnum.TheCultP1, "5a27b9de86f77464e5044585"}, + { QuestEnum.TheCultP2, "5a27ba1c86f77461ea5a3c56"}, + { QuestEnum.SpaTourP6, "5a27ba9586f7741b543d8e85"}, + { QuestEnum.SpaTourP7, "5a27bafb86f7741c73584017"}, + { QuestEnum.CargoXP1, "5a27bb1e86f7741f27621b7e"}, + { QuestEnum.CargoXP2, "5a27bb3d86f77411ea361a21"}, + { QuestEnum.CargoXP3, "5a27bb5986f7741dfb660900"}, + { QuestEnum.WetJobP1, "5a27bb8386f7741c770d2d0a"}, + { QuestEnum.WetJobP2, "5a27bbf886f774333a418eeb"}, + { QuestEnum.WetJobP3, "5a27bc1586f7741f6d40fa2f"}, + { QuestEnum.WetJobP4, "5a27bc3686f7741c73584026"}, + { QuestEnum.WetJobP5, "5a27bc6986f7741c7358402b"}, + { QuestEnum.WetJobP6, "5a27bc8586f7741b543d8ea4"}, + { QuestEnum.FriendFromTheWestP1, "5a27c99a86f7747d2c6bdd8e"}, + { QuestEnum.FriendFromTheWestP2, "5a27d2af86f7744e1115b323"}, + { QuestEnum.HippocraticVow, "5a5642ce86f77445c63c3419"}, + { QuestEnum.HealthCarePrivacyP1, "5a68661a86f774500f48afb0"}, + { QuestEnum.HealthCarePrivacyP2, "5a68663e86f774501078f78a"}, + { QuestEnum.HealthCarePrivacyP3, "5a68665c86f774255929b4c7"}, + { QuestEnum.HealthCarePrivacyP4, "5a68667486f7742607157d28"}, + { QuestEnum.HealthCarePrivacyP5, "5a68669a86f774255929b4d4"}, + { QuestEnum.GunsmithP1, "5ac23c6186f7741247042bad"}, + { QuestEnum.GunsmithP2, "5ac2426c86f774138762edfe"}, + { QuestEnum.GunsmithP3, "5ac2428686f77412450b42bf"}, + { QuestEnum.GunsmithP5, "5ac242ab86f77412464f68b4"}, + { QuestEnum.GunsmithP6, "5ac244c486f77413e12cf945"}, + { QuestEnum.GunsmithP4, "5ac244eb86f7741356335af1"}, + { QuestEnum.FarmingP1, "5ac345dc86f774288030817f"}, + { QuestEnum.FarmingP2, "5ac3460c86f7742880308185"}, + { QuestEnum.FarmingP3, "5ac3462b86f7741d6118b983"}, + { QuestEnum.FarmingP4, "5ac3464c86f7741d651d6877"}, + { QuestEnum.SignalP1, "5ac3467986f7741d6224abc2"}, + { QuestEnum.SignalP2, "5ac346a886f7744e1b083d67"}, + { QuestEnum.SignalP3, "5ac346cf86f7741d63233a02"}, + { QuestEnum.SignalP4, "5ac346e886f7741d6118b99b"}, + { QuestEnum.BadHabit, "5ac3475486f7741d6224abd3"}, + { QuestEnum.Scout, "5ac3477486f7741d651d6885"}, + { QuestEnum.Insider, "5ac3479086f7742880308199"}, + { QuestEnum.GunsmithP7, "5ae3267986f7742a413592fe"}, + { QuestEnum.GunsmithP8, "5ae3270f86f77445ba41d4dd"}, + { QuestEnum.GunsmithP9, "5ae3277186f7745973054106"}, + { QuestEnum.GunsmithP10, "5ae327c886f7745c7b3f2f3f"}, + { QuestEnum.GunsmithP11, "5ae3280386f7742a41359364"}, + { QuestEnum.OnlyBusiness, "5ae448a386f7744d3730fff0"}, + { QuestEnum.MakeUltraGreatAgain, "5ae448bf86f7744d733e55ee"}, + { QuestEnum.BigSale, "5ae448e586f7744dcf0c2a67"}, + { QuestEnum.TheBloodOfWar, "5ae448f286f77448d73c0131"}, + { QuestEnum.DressedToKill, "5ae4490786f7744ca822adcc"}, + { QuestEnum.DatabaseP1, "5ae4493486f7744efa289417"}, + { QuestEnum.DatabaseP2, "5ae4493d86f7744b8e15aa8f"}, + { QuestEnum.SewItGoodP1, "5ae4495086f77443c122bc40"}, + { QuestEnum.SewItGoodP2, "5ae4495c86f7744e87761355"}, + { QuestEnum.SewItGoodP3, "5ae4496986f774459e77beb6"}, + { QuestEnum.SewItGoodP4, "5ae4497b86f7744cf402ed00"}, + { QuestEnum.TheKeyToSuccess, "5ae4498786f7744bde357695"}, + { QuestEnum.CharismaBringsSuccess, "5ae4499a86f77449783815db"}, + { QuestEnum.NoFussNeeded, "5ae449a586f7744bde357696"}, + { QuestEnum.Gratitude, "5ae449b386f77446d8741719"}, + { QuestEnum.SalesNight, "5ae449c386f7744bde357697"}, + { QuestEnum.Supervisor, "5ae449d986f774453a54a7e1"}, + { QuestEnum.GunsmithP12, "5b47749f86f7746c5d6a5fd4"}, + { QuestEnum.GunsmithP13, "5b47799d86f7746c5d6a5fd8"}, + { QuestEnum.GunsmithP14, "5b477b6f86f7747290681823"}, + { QuestEnum.GunsmithP15, "5b477f7686f7744d1b23c4d2"}, + { QuestEnum.GunsmithP16, "5b47825886f77468074618d3"}, + { QuestEnum.TheBloodOfWarP2, "5b47876e86f7744d1c353205"}, + { QuestEnum.LivingHighIsNotACrime, "5b47891f86f7744d1b23c571"}, + { QuestEnum.HotDelivery, "5b478b1886f7744d1b23c57d"}, + { QuestEnum.Minibus, "5b478d0f86f7744d190d91b5"}, + { QuestEnum.VitaminsP1, "5b478eca86f7744642012254"}, + { QuestEnum.VitaminsP2, "5b478ff486f7744d184ecbbf"}, + { QuestEnum.InformedMeansArmed, "5b47926a86f7747ccc057c15"}, + { QuestEnum.LendLeaseP1, "5b4794cb86f774598100d5d4"}, + { QuestEnum.Chumming, "5b4795fb86f7745876267770"}, + { QuestEnum.TheTarkovShooterP1, "5bc4776586f774512d07cf05"}, + { QuestEnum.TheTarkovShooterP2, "5bc479e586f7747f376c7da3"}, + { QuestEnum.TheTarkovShooterP3, "5bc47dbf86f7741ee74e93b9"}, + { QuestEnum.TheTarkovShooterP4, "5bc480a686f7741af0342e29"}, + { QuestEnum.TheTarkovShooterP5, "5bc4826c86f774106d22d88b"}, + { QuestEnum.TheTarkovShooterP6, "5bc4836986f7740c0152911c"}, + { QuestEnum.TheTarkovShooterP7, "5bc4856986f77454c317bea7"}, + { QuestEnum.TheTarkovShooterP8, "5bc4893c86f774626f5ebf3e"}, + { QuestEnum.Bullshit, "5c0bbaa886f7746941031d82"}, + { QuestEnum.SilentCaliber, "5c0bc91486f7746ab41857a2"}, + { QuestEnum.Insomnia, "5c0bd01e86f7747cdd799e56"}, + { QuestEnum.TestDriveP1, "5c0bd94186f7747a727f09b2"}, + { QuestEnum.Flint, "5c0bdb5286f774166e38eed4"}, + { QuestEnum.AShooterBornInHeaven, "5c0bde0986f77479cf22c2f8"}, + { QuestEnum.PsychoSniper, "5c0be13186f7746f016734aa"}, + { QuestEnum.PrivateClinic, "5c0be5fc86f774467a116593"}, + { QuestEnum.Athlete, "5c0d0d5086f774363760aef2"}, + { QuestEnum.LendLeaseP2, "5c0d0f1886f77457b8210226"}, + { QuestEnum.Grenadier, "5c0d190cd09282029f5390d8"}, + { QuestEnum.DecontaminationService, "5c0d1c4cd0928202a02a6f5c"}, + { QuestEnum.PeacekeepingMission, "5c0d4c12d09282029f539173"}, + { QuestEnum.TheGuide, "5c0d4e61d09282029f53920e"}, + { QuestEnum.TheBloodOfWarP3, "5c10f94386f774227172c572"}, + { QuestEnum.Fertilizers, "5c1128e386f7746565181106"}, + { QuestEnum.Scavenger, "5c112d7e86f7740d6f647486"}, + { QuestEnum.LivingHighIsNotACrimeP2, "5c1141f386f77430ff393792"}, + { QuestEnum.Setup, "5c1234c286f77406fa13baeb"}, + { QuestEnum.PerfectMediator, "5c12452c86f7744b83469073"}, + { QuestEnum.Import, "5c139eb686f7747878361a6f"}, + { QuestEnum.Collector, "5c51aac186f77432ea65c552"}, + { QuestEnum.Introduction, "5d2495a886f77425cd51e403"}, + { QuestEnum.Acquaintance, "5d24b81486f77439c92d6ba8"}, + { QuestEnum.TheSurvivalistPathUnprotectedButDangerous, "5d25aed386f77442734d25d2"}, + { QuestEnum.TheSurvivalistPathThrifty, "5d25b6be86f77444001e1b89"}, + { QuestEnum.TheSurvivalistPathZhivchik, "5d25bfd086f77442734d3007"}, + { QuestEnum.TheSurvivalistPathWoundedBeast, "5d25c81b86f77443e625dd71"}, + { QuestEnum.TheSurvivalistPathToughGuy, "5d25cf2686f77443e75488d4"}, + { QuestEnum.TheSurvivalistPathColdBlooded, "5d25d2c186f77443e35162e5"}, + { QuestEnum.TheSurvivalistPathZatoichi, "5d25dae186f77443e55d2f78"}, + { QuestEnum.TheSurvivalistPathEagleOwl, "5d25e29d86f7740a22516326"}, + { QuestEnum.TheSurvivalistPathCombatMedic, "5d25e2a986f77409dd5cdf2a"}, + { QuestEnum.TheSurvivalistPathJunkie, "5eaaaa7c93afa0558f3b5a1c"}, + { QuestEnum.HuntsmanPathSecuredPerimeter, "5d25e2b486f77409de05bba0"}, + { QuestEnum.HuntsmanPathTheTrophy, "5d25e2c386f77443e7549029"}, + { QuestEnum.HuntsmanPathWoodsCleaning, "5d25e2cc86f77443e47ae019"}, + { QuestEnum.HuntsmanPathController, "5d25e2d886f77442734d335e"}, + { QuestEnum.HuntsmanPathSellOut, "5d25e2e286f77444001e2e48"}, + { QuestEnum.HuntsmanPathWoodsKeeper, "5d25e2ee86f77443e35162ea"}, + { QuestEnum.HuntsmanPathJustice, "5d25e43786f7740a212217fa"}, + { QuestEnum.HuntsmanPathEvilWatchman, "5d25e44386f77409453bce7b"}, + { QuestEnum.HuntsmanPathFactoryChief, "60c0c018f7afb4354815096a"}, + { QuestEnum.HuntsmanPathEraser, "5d25e44f86f77443e625e385"}, + { QuestEnum.HuntsmanPathEraserP2, "5d25e45e86f77408251c4bfa"}, + { QuestEnum.Ambulance, "5d25e46e86f77409453bce7c"}, + { QuestEnum.CourtesyVisit, "5d25e48186f77443e625e386"}, + { QuestEnum.ShadyBusiness, "5d25e48d86f77408251c4bfb"}, + { QuestEnum.Nostalgia, "5d25e4ad86f77443e625e387"}, + { QuestEnum.FishingPlace, "5d25e4b786f77408251c4bfc"}, + { QuestEnum.HuntingTrip, "5d25e4ca86f77409dd5cdf2c"}, + { QuestEnum.Reserv, "5d25e4d586f77443e625e388"}, + { QuestEnum.RegulatedMaterials, "5d4bec3486f7743cac246665"}, + { QuestEnum.AnAppleADayKeepsTheDoctorAway, "5d6fb2c086f77449da599c24"}, + { QuestEnum.Mentor, "5d6fbc2886f77449d825f9d3"}, + { QuestEnum.TheStylishOne, "5dc53acb86f77469c740c893"}, + { QuestEnum.TextileP1Usec, "5e381b0286f77420e3417a74"}, + { QuestEnum.TextileP2Usec, "5e4d4ac186f774264f758336"}, + { QuestEnum.TextileP1Bear, "5e383a6386f77465910ce1f3"}, + { QuestEnum.TextileP2Bear, "5e4d515e86f77438b2195244"}, + { QuestEnum.BunkerP1, "5ede55112c95834b583f052a"}, + { QuestEnum.BunkerP2, "5ede567cfa6dc072ce15d6e3"}, + { QuestEnum.Anesthesia, "5eda19f0edce541157209cee"}, + { QuestEnum.HuntsmanPathSadist, "5edab4b1218d181e29451435"}, + { QuestEnum.ColleaguesP1, "5edab736cc183c769d778bc2"}, + { QuestEnum.ColleaguesP2, "5edaba7c0c502106f869bc02"}, + { QuestEnum.ColleaguesP3, "5edac34d0bb72a50635c2bfa"}, + { QuestEnum.RiggedGame, "5edabd13218d181e29451442"}, + { QuestEnum.Samples, "5edac020218d181e29451446"}, + { QuestEnum.TerraGroupEmployee, "5edac63b930f5454f51e128b"}, + { QuestEnum.TheChemistryCloset, "5f04886a3937dc337a6b8238"}, + { QuestEnum.SearchMission, "5fd9fad9c1ce6b1a3b486d00"}, + { QuestEnum.Hunter, "600302d73b897b11364cd161"}, + { QuestEnum.Revision, "6086c852c945025d41566124"}, + { QuestEnum.PestControl, "608a768d82e40b3c727fd17d"}, + { QuestEnum.BackDoor, "6089736efa70fc097863b8f6"}, + { QuestEnum.SafeCorridor, "6089743983426423753cd58a"}, + { QuestEnum.InventoryCheck, "608974af4b05530f55550c21"}, + { QuestEnum.FuelMatter, "608974d01a66564e74191fc0"}, + { QuestEnum.NoPlaceForRenegades, "60896bca6ee58f38c417d4f2"}, + { QuestEnum.DiseaseHistory, "60896e28e4a85c72ef3fa301"}, + { QuestEnum.Documents, "60896b7bfa70fc097863b8f5"}, + { QuestEnum.SurplusGoods, "6089732b59b92115597ad789"}, + { QuestEnum.ExperienceExchange, "60896888e4a85c72ef3fa300"}, + { QuestEnum.LongLine, "60e71dc0a94be721b065bbfc" }, + { QuestEnum.Booze, "60e71dc67fcf9c556f325056" }, + { QuestEnum.HuntsmanPathRelentless, "60e71e8ed54b755a3b53eb67" }, + { QuestEnum.SwiftOne, "60e729cf5698ee7b05057439"}, + { QuestEnum.TheChoice, "60effd818b669d08a35bfad5" }, + { QuestEnum.NightSweep, "60e71c11d54b755a3b53eb65" }, + { QuestEnum.Intimidator, "60e71bb4e456d449cd47ca75"}, + { QuestEnum.Crisis, "60e71c48c1bfa3050473b8e5"}, + { QuestEnum.CapturingOutposts, "60e71b9bbd90872cb85440f3"}, + { QuestEnum.Escort, "60e71b62a0beca400d69efc4"}, + { QuestEnum.Calibration, "60e71d23c1bfa3050473b8e6"}, + { QuestEnum.MutualInterest, "60e71c9ad54b755a3b53eb66"}, + { QuestEnum.EasyJobPart1, "6179ac7511973d018217d0b9" }, + { QuestEnum.EasyJobPart2, "6179acbdc760af5ad2053585" }, + { QuestEnum.EnergyCrisis, "6179b3a12153c15e937d52bc" }, + { QuestEnum.CommunicationDifficulties, "6179ad74bca27a099552e03a" }, + { QuestEnum.Overpopulation, "6179aff8f57fb279792c60a1" }, + { QuestEnum.SeasideVacation, "6179ad56c760af5ad2053587" }, + { QuestEnum.CorporateSecrets, "6179b3bdc7560e13d23eeb8d" }, + { QuestEnum.Counteraction, "6179b5eabca27a099552e052" }, + { QuestEnum.HuntsmanPathOutcasts, "6179ad0a6e9dd54ac275e3f2" }, + { QuestEnum.MissingCargo, "6179b4f16e9dd54ac275e407" }, + { QuestEnum.RevisionPart2, "6179b4d1bca27a099552e04e" }, + { QuestEnum.OurOwnLand, "6179b5b06e9dd54ac275e409" }, + { QuestEnum.TheHermit, "61904daa7d0d857927447b9c" }, + { QuestEnum.LongRoad, "6193850f60b34236ee0483de" }, + { QuestEnum.CargoXP4, "61958c366726521dd96828ec" }, + { QuestEnum.LostContact, "6179afd0bca27a099552e040"}, + { QuestEnum.ActionTest, "613708a7f8333a5d15594368"} + }; + + private static readonly Dictionary questNames = new Dictionary + { + { "5936d90786f7742b1420ba5b", "Debut" }, + { "5936da9e86f7742d65037edf", "Checking"}, + { "59674cd986f7744ab26e32f2", "Shootout picnic"}, + { "59674eb386f774539f14813a", "Delivery from the past"}, + { "5967530a86f77462ba22226b", "Bad rep evidence"}, + { "59675d6c86f7740a842fc482", "Ice cream cones"}, + { "59675ea386f77414b32bded2", "Postman Pat Part 1"}, + { "596760e186f7741e11214d58", "Postman Pat Part 2"}, + { "5967725e86f774601a446662", "Shaking up teller"}, + { "5967733e86f774602332fc84", "Shortage"}, + { "59689ee586f7740d1570bbd5", "Sanitary Standards Part 1"}, + { "59689fbd86f7740d137ebfc4", "Operation Aquarius Part 1"}, + { "5968eb3186f7741dde183a4d", "Operation Aquarius Part 2"}, + { "5969f90786f77420d2328015", "Painkiller"}, + { "5969f9e986f7741dde183a50", "Pharmacist"}, + { "596a0e1686f7741ddf17dbee", "Supply plans"}, + { "596a101f86f7741ddb481582", "Kind of sabotage" }, + { "596a1e6c86f7741ddc2d3206", "General wares"}, + { "596a204686f774576d4c95de", "Sanitary Standards Part 2"}, + { "596a218586f77420d232807c", "Car repair"}, + { "596b36c586f77450d6045ad2", "Supplier"}, + { "596b43fb86f77457ca186186", "The Extortionist"}, + { "596b455186f77457cb50eccb", "Stirrup"}, + { "5979ed3886f77431307dc512", "Whats on the flash drive?"}, + { "5979eee086f774311955e614", "Golden swag"}, + { "5979f8bb86f7743ec214c7a6", "Polikhim hobo"}, + { "5979f9ba86f7740f6c3fe9f2", "Chemical Part 1"}, + { "597a0b2986f77426d66c0633", "Chemical Part 2"}, + { "597a0e5786f77426d66c0636", "Chemical Part 3"}, + { "597a0f5686f774273b74f676", "Chemical Part 4"}, + { "597a160786f77477531d39d2", "Out of curiosity"}, + { "597a171586f77405ba6887d3", "Big customer"}, + { "59c124d686f774189b3c843f", "BP depot"}, + { "59c50a9e86f7745fef66f4ff", "The Punisher Part 1"}, + { "59c50c8886f7745fed3193bf", "The Punisher Part 2"}, + { "59c512ad86f7741f0d09de9b", "The Punisher Part 3"}, + { "59c9392986f7742f6923add2", "Trust regain"}, + { "59c93e8e86f7742a406989c4", "Loyalty buyout"}, + { "59ca1a6286f774509a270942", "No offence"}, + { "59ca264786f77445a80ed044", "The Punisher Part 4"}, + { "59ca29fb86f77445ab465c87", "The Punisher Part 5"}, + { "59ca2eb686f77445a80ed049", "The Punisher Part 6"}, + { "59f9da6786f774714230d751", "No idea"}, + { "5a03153686f77442d90e2171", "Spa Tour Part 1"}, + { "5a03173786f77451cb427172", "Spa Tour Part 2"}, + { "5a0327ba86f77456b9154236", "Spa Tour Part 3"}, + { "5a03296886f774569778596a", "Spa Tour Part 4"}, + { "5a0449d586f77474e66227b7", "Spa Tour Part 5"}, + { "5a27b75b86f7742e97191958", "Fishing Gear"}, + { "5a27b7a786f774579c3eb376", "Tigr Safari"}, + { "5a27b7d686f77460d847e6a6", "Scrap Metal"}, + { "5a27b80086f774429a5d7e20", "Eagle Eye"}, + { "5a27b87686f77460de0252a8", "Humanitarian Supplies"}, + { "5a27b9de86f77464e5044585", "The Cult Part 1"}, + { "5a27ba1c86f77461ea5a3c56", "The Cult Part 2"}, + { "5a27ba9586f7741b543d8e85", "Spa Tour Part 6"}, + { "5a27bafb86f7741c73584017", "Spa Tour Part 7"}, + { "5a27bb1e86f7741f27621b7e", "Cargo X Part 1"}, + { "5a27bb3d86f77411ea361a21", "Cargo X Part 2"}, + { "5a27bb5986f7741dfb660900", "Cargo X Part 3"}, + { "5a27bb8386f7741c770d2d0a", "Wet Job Part 1"}, + { "5a27bbf886f774333a418eeb", "Wet Job Part 2"}, + { "5a27bc1586f7741f6d40fa2f", "Wet Job Part 3"}, + { "5a27bc3686f7741c73584026", "Wet Job Part 4"}, + { "5a27bc6986f7741c7358402b", "Wet Job Part 5"}, + { "5a27bc8586f7741b543d8ea4", "Wet Job Part 6"}, + { "5a27c99a86f7747d2c6bdd8e", "Friend from the West Part 1"}, + { "5a27d2af86f7744e1115b323", "Friend from the West Part 2"}, + { "5a5642ce86f77445c63c3419", "Hippocratic Vow"}, + { "5a68661a86f774500f48afb0", "Health Care Privacy Part 1"}, + { "5a68663e86f774501078f78a", "Health Care Privacy Part 2"}, + { "5a68665c86f774255929b4c7", "Health Care Privacy Part 3"}, + { "5a68667486f7742607157d28", "Health Care Privacy Part 4"}, + { "5a68669a86f774255929b4d4", "Health Care Privacy Part 5"}, + { "5ac23c6186f7741247042bad", "Gunsmith Part 1"}, + { "5ac2426c86f774138762edfe", "Gunsmith Part 2"}, + { "5ac2428686f77412450b42bf", "Gunsmith Part 3"}, + { "5ac242ab86f77412464f68b4", "Gunsmith Part 5"}, + { "5ac244c486f77413e12cf945", "Gunsmith Part 6"}, + { "5ac244eb86f7741356335af1", "Gunsmith Part 4"}, + { "5ac345dc86f774288030817f", "Farming Part 1"}, + { "5ac3460c86f7742880308185", "Farming Part 2"}, + { "5ac3462b86f7741d6118b983", "Farming Part 3"}, + { "5ac3464c86f7741d651d6877", "Farming Part 4"}, + { "5ac3467986f7741d6224abc2", "Signal Part 1"}, + { "5ac346a886f7744e1b083d67", "Signal Part 2"}, + { "5ac346cf86f7741d63233a02", "Signal Part 3"}, + { "5ac346e886f7741d6118b99b", "Signal Part 4"}, + { "5ac3475486f7741d6224abd3", "Bad habit"}, + { "5ac3477486f7741d651d6885", "Scout"}, + { "5ac3479086f7742880308199", "Insider"}, + { "5ae3267986f7742a413592fe", "Gunsmith Part 7"}, + { "5ae3270f86f77445ba41d4dd", "Gunsmith Part 8"}, + { "5ae3277186f7745973054106", "Gunsmith Part 9"}, + { "5ae327c886f7745c7b3f2f3f", "Gunsmith Part 10"}, + { "5ae3280386f7742a41359364", "Gunsmith Part 11"}, + { "5ae448a386f7744d3730fff0", "Only business"}, + { "5ae448bf86f7744d733e55ee", "Make ULTRA Great Again"}, + { "5ae448e586f7744dcf0c2a67", "Big sale" }, + { "5ae448f286f77448d73c0131", "The Blood of War" }, + { "5ae4490786f7744ca822adcc", "Dressed to kill" }, + { "5ae4493486f7744efa289417", "Database Part 1" }, + { "5ae4493d86f7744b8e15aa8f", "Database Part 2" }, + { "5ae4495086f77443c122bc40", "Sew it good Part 1"}, + { "5ae4495c86f7744e87761355", "Sew it good Part 2"}, + { "5ae4496986f774459e77beb6", "Sew it good Part 3"}, + { "5ae4497b86f7744cf402ed00", "Sew it good Part 4"}, + { "5ae4498786f7744bde357695", "The key to success"}, + { "5ae4499a86f77449783815db", "Charisma brings success" }, + { "5ae449a586f7744bde357696", "No fuss needed" }, + { "5ae449b386f77446d8741719", "Gratitude" }, + { "5ae449c386f7744bde357697", "Sales Night" }, + { "5ae449d986f774453a54a7e1", "Supervisor" }, + { "5b47749f86f7746c5d6a5fd4", "Gunsmith Part 12" }, + { "5b47799d86f7746c5d6a5fd8", "Gunsmith Part 13" }, + { "5b477b6f86f7747290681823", "Gunsmith Part 14" }, + { "5b477f7686f7744d1b23c4d2", "Gunsmith Part 15" }, + { "5b47825886f77468074618d3", "Gunsmith Part 16" }, + { "5b47876e86f7744d1c353205", "The Blood of War Part 2" }, + { "5b47891f86f7744d1b23c571", "Living high is not a crime" }, + { "5b478b1886f7744d1b23c57d", "Hot delivery"}, + { "5b478d0f86f7744d190d91b5", "Minibus"}, + { "5b478eca86f7744642012254", "Vitamins Part 1"}, + { "5b478ff486f7744d184ecbbf", "Vitamins Part 2"}, + { "5b47926a86f7747ccc057c15", "Informed means armed"}, + { "5b4794cb86f774598100d5d4", "Lend lease pt 1"}, + { "5b4795fb86f7745876267770", "Chumming"}, + { "5bc4776586f774512d07cf05", "The Tarkov shooter Part 1"}, + { "5bc479e586f7747f376c7da3", "The Tarkov shooter Part 2"}, + { "5bc47dbf86f7741ee74e93b9", "The Tarkov shooter Part 3"}, + { "5bc480a686f7741af0342e29", "The Tarkov shooter Part 4"}, + { "5bc4826c86f774106d22d88b", "The Tarkov shooter Part 5"}, + { "5bc4836986f7740c0152911c", "The Tarkov shooter Part 6"}, + { "5bc4856986f77454c317bea7", "The Tarkov shooter Part 7"}, + { "5bc4893c86f774626f5ebf3e", "The Tarkov shooter Part 8"}, + { "5c0bbaa886f7746941031d82", "Bullshit" }, + { "5c0bc91486f7746ab41857a2", "Silent caliber" }, + { "5c0bd01e86f7747cdd799e56", "Insomnia" }, + { "5c0bd94186f7747a727f09b2", "Test drive Part 1" }, + { "5c0bdb5286f774166e38eed4", "Flint" }, + { "5c0bde0986f77479cf22c2f8", "A Shooter Born in Heaven" }, + { "5c0be13186f7746f016734aa", "Psycho Sniper" }, + { "5c0be5fc86f774467a116593", "Private clinic" }, + { "5c0d0d5086f774363760aef2", "Athlete" }, + { "5c0d0f1886f77457b8210226", "Lend lease Part 2" }, + { "5c0d190cd09282029f5390d8", "Grenadier" }, + { "5c0d1c4cd0928202a02a6f5c", "Decontamination service" }, + { "5c0d4c12d09282029f539173", "Peacekeeping mission" }, + { "5c0d4e61d09282029f53920e", "The guide" }, + { "5c10f94386f774227172c572", "The Blood of War Part 3" }, + { "5c1128e386f7746565181106", "Fertilizers" }, + { "5c112d7e86f7740d6f647486", "Scavenger" }, + { "5c1141f386f77430ff393792", "Living high is not a crime Part 2"}, + { "5c1234c286f77406fa13baeb", "Setup" }, + { "5c12452c86f7744b83469073", "Perfect mediator" }, + { "5c139eb686f7747878361a6f", "Import" }, + { "5c51aac186f77432ea65c552", "Collector" }, + { "5d2495a886f77425cd51e403", "Introduction" }, + { "5d24b81486f77439c92d6ba8", "Acquaintance" }, + { "5d25aed386f77442734d25d2", "The survivalist path Unprotected but dangerous"}, + { "5d25b6be86f77444001e1b89", "The survivalist path Thrifty" }, + { "5d25bfd086f77442734d3007", "The survivalist path Zhivchik" }, + { "5d25c81b86f77443e625dd71", "The survivalist path Wounded beast" }, + { "5d25cf2686f77443e75488d4", "The survivalist path Tough guy" }, + { "5d25d2c186f77443e35162e5", "The survivalist path Cold blooded" }, + { "5d25dae186f77443e55d2f78", "The survivalist path Zatoichi" }, + { "5d25e29d86f7740a22516326", "The survivalist path Eagle-owl" }, + { "5d25e2a986f77409dd5cdf2a", "The survivalist path Combat medic" }, + { "5eaaaa7c93afa0558f3b5a1c", "The survivalist path Junkie" }, + { "5d25e2b486f77409de05bba0", "Huntsman path Secured perimeter" }, + { "5d25e2c386f77443e7549029", "Huntsman path The trophy" }, + { "5d25e2cc86f77443e47ae019", "Huntsman path Woods cleaning" }, + { "5d25e2d886f77442734d335e", "Huntsman path Controller" }, + { "5d25e2e286f77444001e2e48", "Huntsman path Sell-out" }, + { "5d25e2ee86f77443e35162ea", "Huntsman path Woods keeper" }, + { "5d25e43786f7740a212217fa", "Huntsman path Justice" }, + { "5d25e44386f77409453bce7b", "Huntsman path Evil watchman" }, + { "60c0c018f7afb4354815096a", "Huntsman Path- Factory Chief"}, + { "5d25e44f86f77443e625e385", "Huntsman path Eraser Part 1"}, + { "5d25e45e86f77408251c4bfa", "Huntsman path Eraser Part 2"}, + { "5edab4b1218d181e29451435", "Huntsman path Sadist"}, + { "60e71e8ed54b755a3b53eb67", "Huntsman Path - Relentless" }, + { "5d25e46e86f77409453bce7c", "Ambulance"}, + { "5d25e48186f77443e625e386", "Courtesy visit"}, + { "5d25e48d86f77408251c4bfb", "Shady business" }, + { "5d25e4ad86f77443e625e387", "Nostalgia" }, + { "5d25e4b786f77408251c4bfc", "Fishing place" }, + { "5d25e4ca86f77409dd5cdf2c", "Hunting trip" }, + { "5d25e4d586f77443e625e388", "Reserv" }, + { "5d4bec3486f7743cac246665", "Regulated materials"}, + { "5d6fb2c086f77449da599c24", "An apple a day - keeps the doctor away"}, + { "5d6fbc2886f77449d825f9d3", "Mentor"}, + { "5dc53acb86f77469c740c893", "The stylish one"}, + { "5e381b0286f77420e3417a74", "Textile Part 1 - Usec"}, + { "5e4d4ac186f774264f758336", "Textile Part 2 - Usec"}, + { "5e383a6386f77465910ce1f3", "Textile Part 1 - Bear"}, + { "5e4d515e86f77438b2195244", "Textile Part 2 - Bear"}, + { "5ede55112c95834b583f052a", "Bunker Part 1"}, + { "5ede567cfa6dc072ce15d6e3", "Bunker Part 2"}, + { "5eda19f0edce541157209cee", "Anesthesia"}, + { "5edab736cc183c769d778bc2", "Colleagues Part 1"}, + { "5edaba7c0c502106f869bc02", "Colleagues Part 2"}, + { "5edac34d0bb72a50635c2bfa", "Colleagues Part 3"}, + { "5edabd13218d181e29451442", "Rigged game"}, + { "5edac020218d181e29451446", "Samples"}, + { "5edac63b930f5454f51e128b", "TerraGroup employee"}, + { "5f04886a3937dc337a6b8238", "The chemistry closet"}, + { "5fd9fad9c1ce6b1a3b486d00", "Search Mission"}, + { "600302d73b897b11364cd161", "Hunter"}, + { "6086c852c945025d41566124", "Revision"}, + { "608a768d82e40b3c727fd17d", "Pest control"}, + { "6089736efa70fc097863b8f6", "Back door"}, + { "6089743983426423753cd58a", "Safe corridor"}, + { "608974af4b05530f55550c21", "Inventory check"}, + { "608974d01a66564e74191fc0", "Fuel matter"}, + { "60896bca6ee58f38c417d4f2", "No place for renegades"}, + { "60896e28e4a85c72ef3fa301", "Disease history"}, + { "60896b7bfa70fc097863b8f5", "Documents"}, + { "6089732b59b92115597ad789", "Surplus goods"}, + { "60896888e4a85c72ef3fa300", "Experience exchange"}, + { "60e71dc0a94be721b065bbfc", "Long Line" }, + { "60e71dc67fcf9c556f325056", "Booze" }, + { "60e729cf5698ee7b05057439", "Swift One" }, + { "60effd818b669d08a35bfad5", "The Choice" }, + { "60e71c11d54b755a3b53eb65", "Night Sweep" }, + { "60e71bb4e456d449cd47ca75", "Intimidator"}, + { "60e71c48c1bfa3050473b8e5", "Crisis"}, + { "60e71b9bbd90872cb85440f3", "Capturing Outposts"}, + { "60e71b62a0beca400d69efc4", "Escort"}, + { "60e71d23c1bfa3050473b8e6", "Calibration"}, + { "60e71c9ad54b755a3b53eb66", "Mutual Interest"}, + { "6179ac7511973d018217d0b9", "Easy Job Part 1" }, + { "6179acbdc760af5ad2053585", "Easy Job Part 2" }, + { "6179b3a12153c15e937d52bc", "Energy Crisis" }, + { "6179ad74bca27a099552e03a", "Communication Difficulties" }, + { "6179aff8f57fb279792c60a1", "Overpopulation" }, + { "6179ad56c760af5ad2053587", "Seaside Vacation" }, + { "6179b3bdc7560e13d23eeb8d", "Corporate Secrets" }, + { "6179b5eabca27a099552e052", "Counteraction" }, + { "6179ad0a6e9dd54ac275e3f2", "Huntsman Path Outcasts" }, + { "6179b4f16e9dd54ac275e407", "MissingCargo" }, + { "6179b4d1bca27a099552e04e", "Revision Part 2" }, + { "6179b5b06e9dd54ac275e409", "Our Own Land" }, + { "61904daa7d0d857927447b9c", "The Hermit" }, + { "6193850f60b34236ee0483de", "Long Road" }, + { "61958c366726521dd96828ec", "Cargo X Part 4" }, + { "6179afd0bca27a099552e040", "Lost Contact"}, + { "613708a7f8333a5d15594368", "Action Test"} + }; + + public static string GetNameById(string id) + { + if (!questNames.ContainsKey(id)) + { + return "Unknown quest"; + } + + return questNames[id]; + } + + internal static string GetIdByEnum(QuestEnum quest) + { + return questLookup[quest]; + } + + internal static string GetNameByEnum(QuestEnum quest) + { + var id = GetIdByEnum(quest); + return questNames[id]; + } + + internal static QuestEnum GetEnumById(string questId) + { + foreach (var quest in questLookup) + { + if (quest.Value == questId) + { + return quest.Key; + } + } + + return QuestEnum.NOQUESTFOUND; + } + } +} diff --git a/AssortValidator.Common/Models/CurrencyEnum.cs b/AssortValidator.Common/Models/CurrencyEnum.cs new file mode 100644 index 0000000..02ed765 --- /dev/null +++ b/AssortValidator.Common/Models/CurrencyEnum.cs @@ -0,0 +1,9 @@ +namespace AssortValidator.Common.Models +{ + public enum CurrencyEnum + { + Rouble = 1, + Euro = 2, + USD = 3, + } +} \ No newline at end of file diff --git a/AssortValidator.Common/Models/FlatAssort.cs b/AssortValidator.Common/Models/FlatAssort.cs new file mode 100644 index 0000000..592bad0 --- /dev/null +++ b/AssortValidator.Common/Models/FlatAssort.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace AssortValidator.Common.Models +{ + public class FlatAssort + { + public FlatAssort() + { + SubItems = new List(); + BarterDetails = new List(); + } + + public string AssortId { get; set; } + public string ItemId { get; set; } + public string ItemName { get; set; } + public List SubItems { get; set; } + public Assort.Item RawItem { get; set; } + public int Level { get; set; } + public bool IsMoney { get; set; } + public List BarterDetails { get; set; } + } + +} diff --git a/AssortValidator.Common/Models/QuestAssortUnlock.cs b/AssortValidator.Common/Models/QuestAssortUnlock.cs index e5fe42f..1454553 100644 --- a/AssortValidator.Common/Models/QuestAssortUnlock.cs +++ b/AssortValidator.Common/Models/QuestAssortUnlock.cs @@ -1,4 +1,6 @@ using AssortValidator.Common.Models; +using AssortValidator.Models; +using System.Collections.Generic; namespace AssortValidator.Common.Helpers.Models { @@ -8,7 +10,7 @@ namespace AssortValidator.Common.Helpers.Models public string QuestName { get; set; } public string TraderId { get; set; } public Trader TraderType { get; set; } - public string AssortId { get; set; } + public List AssortItems { get; set; } public string AssortTemplateId { get; set; } public int LoyaltyLevel { get; set; } public string QuestState { get; internal set; } diff --git a/AssortValidator.Common/Models/QuestEnum.cs b/AssortValidator.Common/Models/QuestEnum.cs new file mode 100644 index 0000000..42f84c4 --- /dev/null +++ b/AssortValidator.Common/Models/QuestEnum.cs @@ -0,0 +1,255 @@ +namespace AssortValidator.Common.Models +{ + public enum QuestEnum + { + NOQUESTFOUND = 0, + Debut = 1, + Checking = 2, + ShootoutPicnic = 3, + DeliveryFromThePast = 4, + BadRepEvidence = 5, + IceCreamCones = 6, + PostmanPatP1 = 7, + PostmanPatP2 = 8, + ShakingUpTeller = 9, + Shortage = 10, + SanitaryStandardsP1 = 11, + OperationAquarius = 12, + OperationAquariusP2 = 13, + Painkiller = 14, + Pharmacist = 15, + SupplyPlans = 16, + KindOfSabotage = 17, + GeneralWares = 18, + SanitaryStandardsP2 = 19, + CarRepair = 20, + Supplier = 21, + TheExtortionist = 22, + Stirrup = 23, + WhatsOnTheFlashDrive = 24, + GoldenSwag = 25, + PolikhimHobo = 26, + ChemicalP1 = 27, + ChemicalP2 = 28, + ChemicalP3 = 29, + ChemicalP4 = 30, + OutOfCuriosity = 31, + BigCustomer = 32, + BPDepot = 33, + ThePunisherP1 = 34, + ThePunisherP2 = 35, + ThePunisherP3 = 36, + TrustRegain = 37, + LoyaltyBuyout = 38, + NoOffence = 39, + ThePunisherP4 = 40, + ThePunisherP5 = 41, + ThePunisherP6 = 42, + NoQuestNameGiven = 43, + SpaTourP1 = 44, + SpaTourP2 = 45, + SpaTourP3 = 46, + SpaTourP4 = 47, + SpaTourP5 = 48, + FishingGear = 49, + TigrSafari = 50, + ScrapMetal = 51, + EagleEye = 52, + HumanitarianSupplies = 53, + TheCultP1 = 54, + TheCultP2 = 55, + SpaTourP6 = 56, + SpaTourP7 = 57, + CargoXP1 = 58, + CargoXP2 = 59, + CargoXP3 = 60, + WetJobP1 = 61, + WetJobP2 = 62, + WetJobP3 = 63, + WetJobP4 = 64, + WetJobP5 = 65, + WetJobP6 = 66, + FriendFromTheWestP1 = 67, + FriendFromTheWestP2 = 68, + HippocraticVow = 69, + HealthCarePrivacyP1 = 70, + HealthCarePrivacyP2 = 71, + HealthCarePrivacyP3 = 72, + HealthCarePrivacyP4 = 73, + HealthCarePrivacyP5 = 74, + GunsmithP1 = 75, + GunsmithP2 = 76, + GunsmithP3 = 77, + GunsmithP4 = 78, + GunsmithP5 = 79, + GunsmithP6 = 80, + FarmingP1 = 81, + FarmingP2 = 82, + FarmingP3 = 83, + FarmingP4 = 84, + SignalP1 = 85, + SignalP2 = 86, + SignalP3 = 87, + SignalP4 = 88, + BadHabit = 89, + Scout = 90, + Insider = 91, + GunsmithP7 = 92, + GunsmithP8 = 93, + GunsmithP9 = 94, + GunsmithP10 = 95, + GunsmithP11 = 96, + OnlyBusiness = 97, + MakeUltraGreatAgain = 98, + BigSale = 99, + TheBloodOfWar = 100, + DressedToKill = 101, + DatabaseP1 = 102, + DatabaseP2 = 103, + SewItGoodP1 = 104, + SewItGoodP2 = 105, + SewItGoodP3 = 106, + SewItGoodP4 = 107, + TheKeyToSuccess = 108, + CharismaBringsSuccess = 109, + NoFussNeeded = 110, + Gratitude = 111, + SalesNight = 112, + Supervisor = 113, + GunsmithP12 = 114, + GunsmithP13 = 115, + GunsmithP14 = 116, + GunsmithP15 = 117, + GunsmithP16 = 118, + TheBloodOfWarP2 = 119, + LivingHighIsNotACrime = 120, + HotDelivery = 121, + Minibus = 122, + VitaminsP1 = 123, + VitaminsP2 = 124, + InformedMeansArmed = 125, + LendLeaseP1 = 126, + Chumming = 127, + TheTarkovShooterP1 = 128, + TheTarkovShooterP2 = 129, + TheTarkovShooterP3 = 130, + TheTarkovShooterP4 = 131, + TheTarkovShooterP5 = 132, + TheTarkovShooterP6 = 133, + TheTarkovShooterP7 = 134, + TheTarkovShooterP8 = 135, + Bullshit = 136, + SilentCaliber = 137, + Insomnia = 138, + TestDriveP1 = 139, + Flint = 140, + AShooterBornInHeaven = 141, + PsychoSniper = 142, + PrivateClinic = 143, + Athlete = 144, + LendLeaseP2 = 145, + Grenadier = 146, + DecontaminationService = 147, + PeacekeepingMission = 148, + TheGuide = 149, + Fertilizers = 150, + TheBloodOfWarP3 = 151, + Scavenger = 152, + LivingHighIsNotACrimeP2 = 153, + Setup = 154, + PerfectMediator = 155, + Import = 156, + Collector = 157, + Introduction = 158, + Acquaintance = 159, + TheSurvivalistPathUnprotectedButDangerous = 160, + TheSurvivalistPathThrifty = 161, + TheSurvivalistPathZhivchik = 162, + TheSurvivalistPathWoundedBeast = 163, + TheSurvivalistPathToughGuy = 164, + TheSurvivalistPathColdBlooded = 165, + TheSurvivalistPathZatoichi = 166, + TheSurvivalistPathEagleOwl = 167, + TheSurvivalistPathCombatMedic = 168, + TheSurvivalistPathJunkie = 169, + HuntsmanPathSecuredPerimeter = 170, + HuntsmanPathTheTrophy = 171, + HuntsmanPathWoodsCleaning = 172, + HuntsmanPathController = 173, + HuntsmanPathSellOut = 174, + HuntsmanPathWoodsKeeper = 175, + HuntsmanPathJustice = 176, + HuntsmanPathEvilWatchman = 177, + HuntsmanPathFactoryChief = 178, + HuntsmanPathEraser = 179, + HuntsmanPathEraserP2 = 180, + Ambulance = 181, + CourtesyVisit = 182, + ShadyBusiness = 183, + Nostalgia = 184, + FishingPlace = 185, + HuntingTrip = 186, + Reserv = 187, + RegulatedMaterials = 188, + AnAppleADayKeepsTheDoctorAway = 189, + Mentor = 190, + TheStylishOne = 191, + TextileP1Usec = 192, + TextileP2Usec = 193, + BunkerP1 = 194, + BunkerP2 = 195, + Anesthesia = 196, + HuntsmanPathSadist = 197, + ColleaguesP1 = 198, + ColleaguesP2 = 199, + ColleaguesP3 = 200, + RiggedGame = 201, + Samples = 202, + TerraGroupEmployee = 203, + TheChemistryCloset = 204, + SearchMission = 205, + Hunter = 206, + Revision = 207, + PestControl = 208, + BackDoor = 209, + SafeCorridor = 210, + InventoryCheck = 211, + FuelMatter = 212, + NoPlaceForRenegades = 213, + DiseaseHistory = 214, + Documents = 215, + SurplusGoods = 216, + ExperienceExchange = 217, + LongLine = 218, + Booze = 219, + HuntsmanPathRelentless = 220, + SwiftOne = 221, + TheChoice = 222, + NightSweep = 223, + Intimidator = 224, + Crisis = 225, + CapturingOutposts = 226, + Escort = 227, + Calibration = 228, + MutualInterest = 229, + TextileP1Bear = 230, + TextileP2Bear = 231, + EasyJobPart1 = 232, + EasyJobPart2 = 233, + EnergyCrisis = 234, + CommunicationDifficulties = 235, + Overpopulation = 236, + SeasideVacation = 237, + CorporateSecrets = 238, + Counteraction = 239, + HuntsmanPathOutcasts = 240, + MissingCargo = 241, + RevisionPart2 = 242, + OurOwnLand = 243, + TheHermit = 244, + LongRoad = 245, + CargoXP4 = 246, + LostContact = 247, + ActionTest = 248, + } +}