using ServerManagerTool.Common.Utils; using ServerManagerTool.Enums; using System; using System.Collections.Generic; using System.IO; using System.Runtime.Serialization; namespace ServerManagerTool.Utils { public static class GameDataUtils { public static void ReadAllData(out MainGameData data, string dataFolder, string extension, string application, bool isUserData = false) { data = new MainGameData(); if (string.IsNullOrWhiteSpace(dataFolder)) return; if (!Directory.Exists(dataFolder)) return; foreach (var file in Directory.GetFiles(dataFolder, $"*{extension}", SearchOption.TopDirectoryOnly)) { try { var fileData = MainGameData.Load(file, isUserData); if (fileData == null) continue; if (!fileData.Application.Equals(application, StringComparison.OrdinalIgnoreCase)) continue; data.Creatures.AddRange(fileData.Creatures); data.Engrams.AddRange(fileData.Engrams); data.Items.AddRange(fileData.Items); data.MapSpawners.AddRange(fileData.MapSpawners); data.SupplyCrates.AddRange(fileData.SupplyCrates); data.Inventories.AddRange(fileData.Inventories); data.GameMaps.AddRange(fileData.GameMaps); data.TotalConversions.AddRange(fileData.TotalConversions); data.PlayerLevels.AddRange(fileData.PlayerLevels); data.CreatureLevels.AddRange(fileData.CreatureLevels); data.Branches.AddRange(fileData.Branches); data.Events.AddRange(fileData.Events); data.OfficialMods.AddRange(fileData.OfficialMods); if (fileData.PlayerAdditionalLevels > 0 && fileData.PlayerAdditionalLevels > data.PlayerAdditionalLevels) data.PlayerAdditionalLevels = fileData.PlayerAdditionalLevels; } catch { // do nothing, just swallow the error } } } } [DataContract] public class BaseGameData { public string GameDataFile = string.Empty; [DataMember] public string Application = string.Empty; [DataMember] public string Version = "1.0.0"; [DataMember] public DateTime Created = DateTime.UtcNow; [DataMember] public string Color = "White"; public static BaseGameData Load(string file) { if (string.IsNullOrWhiteSpace(file) || !File.Exists(file)) return null; var data = JsonUtils.DeserializeFromFile(file); if (data != null) { data.GameDataFile = file; } return data; } public bool Save(string file) { var folder = Path.GetDirectoryName(file); if (!Directory.Exists(folder)) Directory.CreateDirectory(folder); return JsonUtils.SerializeToFile(this, file); } } [DataContract] public class MainGameData : BaseGameData { [DataMember(IsRequired = false)] public List Creatures = new List(); [DataMember(IsRequired = false)] public List Engrams = new List(); [DataMember(IsRequired = false)] public List Items = new List(); [DataMember(IsRequired = false)] public List MapSpawners = new List(); [DataMember(IsRequired = false)] public List SupplyCrates = new List(); [DataMember(IsRequired = false)] public List Inventories = new List(); [DataMember(IsRequired = false)] public List GameMaps = new List(); [DataMember(IsRequired = false)] public List TotalConversions = new List(); [DataMember(IsRequired = false)] public List PlayerLevels = new List(); [DataMember(IsRequired = false)] public int PlayerAdditionalLevels = 0; [DataMember(IsRequired = false)] public List CreatureLevels = new List(); [DataMember(IsRequired = false)] public List Branches = new List(); [DataMember(IsRequired = false)] public List Events = new List(); [DataMember(IsRequired = false)] public List OfficialMods = new List(); public static MainGameData Load(string file, bool isUserData) { if (string.IsNullOrWhiteSpace(file) || !File.Exists(file)) return null; var data = JsonUtils.DeserializeFromFile(file); if (data != null) { data.GameDataFile = file; data.Creatures.ForEach(c => c.IsUserData = isUserData); data.Engrams.ForEach(c => c.IsUserData = isUserData); data.Items.ForEach(c => c.IsUserData = isUserData); data.MapSpawners.ForEach(c => c.IsUserData = isUserData); data.SupplyCrates.ForEach(c => c.IsUserData = isUserData); data.Inventories.ForEach(c => c.IsUserData = isUserData); data.GameMaps.ForEach(c => c.IsUserData = isUserData); data.TotalConversions.ForEach(c => c.IsUserData = isUserData); data.Branches.ForEach(c => c.IsUserData = isUserData); data.Events.ForEach(c => c.IsUserData = isUserData); data.OfficialMods.ForEach(c => c.IsUserData = isUserData); } return data; } } [DataContract] public class BaseDataItem { [DataMember] public string ClassName = string.Empty; [DataMember] public string Description = string.Empty; [DataMember] public string Mod = string.Empty; public bool IsUserData = false; } [DataContract] public class CreatureDataItem : BaseDataItem { [DataMember] public string NameTag = string.Empty; [DataMember] public bool IsSpawnable = false; [DataMember(Name = "IsTameable")] public string IsTameableString { get { return IsTameable.ToString(); } set { if (!Enum.TryParse(value, true, out IsTameable)) IsTameable = DinoTamable.False; } } public DinoTamable IsTameable = DinoTamable.False; } [DataContract] public class EngramDataItem : BaseDataItem { [DataMember] public int Level = 0; [DataMember] public int Points = 0; [DataMember] public bool IsTekGram = false; } [DataContract] public class ItemDataItem : BaseDataItem { [DataMember] public string Category = string.Empty; [DataMember] public bool IsHarvestable = false; } [DataContract] public class MapSpawnerDataItem : BaseDataItem { } [DataContract] public class SupplyCrateDataItem : BaseDataItem { } [DataContract] public class InventoryDataItem : BaseDataItem { } [DataContract] public class GameMapDataItem : BaseDataItem { [DataMember] public bool IsSotF = false; } [DataContract] public class TotalConversionDataItem : BaseDataItem { [DataMember] public bool IsSotF = false; } [DataContract] public class PlayerLevelDataItem { [DataMember] public long XPRequired = 0; [DataMember] public long EngramPoints = 0; } [DataContract] public class CreatureLevelDataItem { [DataMember] public long XPRequired = 0; } [DataContract] public class BranchDataItem { [DataMember] public bool IsSotF = false; [DataMember] public string BranchName = string.Empty; [DataMember] public string Description = string.Empty; public bool IsUserData = false; } [DataContract] public class EventDataItem { [DataMember] public bool IsSotF = false; [DataMember] public string EventName = string.Empty; [DataMember] public string Description = string.Empty; public bool IsUserData = false; } [DataContract] public class OfficialModItem { [DataMember] public string ModId = string.Empty; [DataMember] public string ModName = string.Empty; public bool IsUserData = false; } }