Robert Paciorek 446c40ccea merge House into SavedData, WoJS 1.1 vs 1.21 store
- use generic XML save system (SavedData) for Houses
- add support for return different stores for WoJS 1.1 and 1.21 (based on ApiKey)
- change values of ClientVersion / gameVersion for non SoD games and some version checks logic
- common function for Viking creation for call in RegisterChild and in RegisterParent
- add SS (standard) apiKey and WoJS 1.21 (custom) apiKey
2024-03-17 20:46:40 +00:00

85 lines
3.6 KiB
C#

using sodoff.Schema;
using sodoff.Util;
namespace sodoff.Services;
public class StoreService {
Dictionary<int, ItemsInStoreData> stores = new();
public StoreService(ItemService itemService, ModdingService moddingService) {
StoreData[] storeArray = XmlUtil.DeserializeXml<StoreData[]>(XmlUtil.ReadResourceXmlString("store"));
foreach (var s in storeArray) {
ItemsInStoreData newStore = new() {
ID = s.Id % 1000, // % 1000 for support store variants (for example 30123 and 123 is the same store but for different games / versions)
StoreName = s.StoreName,
Description = s.Description,
SalesAtStore = s.SalesAtStore,
PopularItems = s.PopularItems
};
List<ItemData> itemsList = new();
IEnumerable<ItemsInStoreDataSale>? memberSales = s.SalesAtStore?.Where(x => x.ForMembers == true);
IEnumerable<ItemsInStoreDataSale>? normalSales = s.SalesAtStore?.Where(x => x.ForMembers == false || x.ForMembers == null);
for (int i = 0; i < s.ItemId.Length; ++i) {
ItemData item = itemService.GetItem(s.ItemId[i]);
if (item is null) continue; // skip removed items
itemsList.Add(item);
UpdateItemSaleModifier(item, memberSales, normalSales);
}
foreach (int itemID in moddingService.GetStoreItem(s.Id)) {
ItemData item = itemService.GetItem(itemID);
itemsList.Add(item);
UpdateItemSaleModifier(item, memberSales, normalSales);
}
newStore.Items = itemsList.ToArray();
stores.Add(s.Id, newStore);
}
}
public ItemsInStoreData GetStore(int id) {
return stores[id];
}
public ItemsInStoreData GetStore(int id, uint gameVersion) {
if (gameVersion < ClientVersion.WoJS_NewAvatar) {
if (stores.ContainsKey(id+30000))
return stores[id+30000];
}
return stores[id];
}
private bool IsSaleOutdated(ItemsInStoreDataSale sale) {
if (sale.EndDate == null)
return false;
return sale.EndDate < DateTime.Now;
}
private void UpdateItemSaleModifier(ItemData item, IEnumerable<ItemsInStoreDataSale>? memberSales, IEnumerable<ItemsInStoreDataSale>? normalSales) {
if (memberSales != null) {
foreach (var memberSale in memberSales) {
if (IsSaleOutdated(memberSale)) continue;
if (item.Category != null && memberSale.CategoryIDs != null && item.Category.Any(x => memberSale.CategoryIDs.Contains(x.CategoryId))) {
item.MemberDiscountModifier = memberSale.Modifier;
break;
}
if (memberSale.ItemIDs != null && memberSale.ItemIDs.Contains(item.ItemID)) {
item.MemberDiscountModifier = memberSale.Modifier;
break;
}
}
}
if (normalSales != null) {
foreach (var normalSale in normalSales) {
if (IsSaleOutdated(normalSale)) continue;
if (item.Category != null && normalSale.CategoryIDs != null && item.Category.Any(x => normalSale.CategoryIDs.Contains(x.CategoryId))) {
item.NormalDiscoutModifier = normalSale.Modifier;
break;
}
if (normalSale.ItemIDs != null && normalSale.ItemIDs.Contains(item.ItemID)) {
item.NormalDiscoutModifier = normalSale.Modifier;
break;
}
}
}
}
}