diff --git a/MarketPriceLookup.Common/Models/Items.cs b/MarketPriceLookup.Common/Models/Items.cs index 600aeec..e5721e9 100644 --- a/MarketPriceLookup.Common/Models/Items.cs +++ b/MarketPriceLookup.Common/Models/Items.cs @@ -28,6 +28,7 @@ namespace MarketPriceLookup.Common.Models public int LootExperience { get; set; } public int ExamineExperience { get; set; } public bool CanSellOnRagfair { get;set;} + public List StackSlots { get ; set; } } public class Chamber @@ -56,4 +57,24 @@ namespace MarketPriceLookup.Common.Models { public List filter { get; set; } } + + public class StackSlot + { + public string _name { get; set; } + public string _id { get; set; } + public string _parent { get; set; } + public int _max_count { get; set; } + public StackSlotProps _props { get; set; } + public string _proto { get; set; } + } + + public class StackSlotProps + { + public List filters { get; set; } + } + + public class StackSlotFilter + { + public List Filter { get; set; } + } } diff --git a/MarketPriceLookup/Program.cs b/MarketPriceLookup/Program.cs index 04fb16a..29ca368 100644 --- a/MarketPriceLookup/Program.cs +++ b/MarketPriceLookup/Program.cs @@ -1,16 +1,24 @@ using MarketPriceLookup.Common; using MarketPriceLookup.Common.Helpers; +using System; using System.Collections.Generic; using System.IO; +using System.Linq; namespace MarketPriceLookup { public class Program { + private static readonly Dictionary _specialCases = new Dictionary + { + { "627e14b21713922ded6f2c15", (250000, null, -1)}, // Accuracy International AXMC .338 LM bolt-action sniper rifle + }; + static void Main(string[] args) { // loop over all items and get a price for each var priceList = new Dictionary(); + var handbookPrices = HandbookHelper.Items; foreach (var item in ItemTemplateHelper.Items) { var priceData = MarketPricesHelper.GetItemPrice(item.Key); @@ -20,11 +28,65 @@ namespace MarketPriceLookup } } + // Ammo packs are easy to exploit, they're never listed on flea which casues server to use handbook price, often contain ammo worth x100 the cost of handbook price + var ammoPacks = ItemTemplateHelper.Items.Values + .Where(x => (x._parent == "5661632d4bdc2d903d8b456b" || x._parent == "543be5cb4bdc2deb348b4568") + && x._name.Contains("item_ammo_box_") + && !x._name.Contains("_damaged")); + + foreach (var ammoPack in ammoPacks) + { + if (!priceList.ContainsKey(ammoPack._id)) + { + LoggingHelpers.LogWarning($"edge case ammo pack {ammoPack._name} not found in prices, adding manually"); + // get price of item to multiply price of + var itemMultipler = ammoPack._props.StackSlots[0]._max_count; + var singleItemPrice = GetItemPrice(priceList, handbookPrices.Items, ammoPack._props.StackSlots[0]._props.filters[0].Filter[0]); + var price = singleItemPrice * itemMultipler; + + priceList.Add(ammoPack._id, price); + + } + } + + // Some items dont get listed on flea often, manually add prices for these + foreach (var specialCase in _specialCases) + { + if (!priceList.ContainsKey(specialCase.Key)) + { + LoggingHelpers.LogWarning($"edge case item {specialCase.Key} not found in prices, adding manually"); + if (specialCase.Value.Item1 == -1) + { + // get price of item to multiply price of + var itemTpl = specialCase.Value.Item2; + var itemMultipler = specialCase.Value.Item3; + var singleItemPrice = GetItemPrice(priceList, handbookPrices.Items, itemTpl); + var price = singleItemPrice * itemMultipler; + + priceList.Add(specialCase.Key, price); + + continue; + } + + priceList.Add(specialCase.Key, specialCase.Value.Item1); + } + } + // save found prices to json JsonWriter.WriteJson(priceList, "output", Directory.GetCurrentDirectory(), "prices"); } + private static int GetItemPrice(Dictionary priceList, HandbookItem[] handbookItems, string itemTpl) + { + var fleaPrice = priceList.FirstOrDefault(x => x.Key == itemTpl); + if (fleaPrice.Key == null) + { + return handbookItems.FirstOrDefault(x => x.Id == itemTpl).Price; + } + return fleaPrice.Value; + } + public class OutputPrices { public int LivePrice { get; set; }