using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Globalization; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Xml.Linq; using Barotrauma.LuaCs.Services; using Barotrauma.Steam; using OneOf; namespace Barotrauma.LuaCs.Data; #region ModConfigurationInfo public partial record ModConfigInfo : IModConfigInfo { public ContentPackage Package { get; init; } public string PackageName { get; init; } public ImmutableArray Assemblies { get; init; } public ImmutableArray LuaScripts { get; init; } public ImmutableArray Configs { get; init; } public ImmutableArray ConfigProfiles { get; init; } } #endregion #region DataContracts_Resources public record AssemblyResourcesInfo(ImmutableArray Assemblies) : IAssembliesResourcesInfo; public record LuaScriptsResourcesInfo(ImmutableArray LuaScripts) : ILuaScriptsResourcesInfo; public record ConfigResourcesInfo(ImmutableArray Configs) : IConfigsResourcesInfo; public record ConfigProfilesResourcesInfo(ImmutableArray ConfigProfiles) : IConfigProfilesResourcesInfo; public record AssemblyResourceInfo : IAssemblyResourceInfo { public ContentPackage OwnerPackage { get; init; } public string FriendlyName { get; init; } public bool IsScript { get; init; } public string InternalName { get; init; } public bool LazyLoad { get; init; } public Platform SupportedPlatforms { get; init; } public Target SupportedTargets { get; init; } public int LoadPriority { get; init; } public ImmutableArray FilePaths { get; init; } public ImmutableArray SupportedCultures { get; init; } public ImmutableArray Dependencies { get; init; } public bool Optional { get; init; } } public record PackageDependency : IPackageDependency { public PackageDependency(ContentPackage package, IPackageInfo dependencyInfo, string internalName) { Dependency = dependencyInfo ?? throw new ArgumentNullException(nameof(dependencyInfo)); OwnerPackage = package ?? throw new ArgumentNullException(nameof(package)); InternalName = internalName ?? throw new ArgumentNullException(nameof(internalName)); } public string InternalName { get; init; } public ContentPackage OwnerPackage { get; init; } public IPackageInfo Dependency { get; init; } public override int GetHashCode() => Dependency.GetHashCode(); } public record PackageInfo : IPackageInfo { public string Name { get; private set; } public ulong SteamWorkshopId { get; private set; } public uint Id { get; private set; } private readonly Func _getPackage; public ContentPackage GetPackage() => _getPackage?.Invoke(this) ?? null; public void UpdateInfo(string name, ulong steamId, uint packageId) { if (name.IsNullOrWhiteSpace() || steamId == 0 || packageId == 0) { throw new ArgumentException( $"{nameof(PackageInfo)}: You cannot update a package with an invalid name or steam id with a valid id, or vice-versa."); } Name = name; SteamWorkshopId = steamId; Id = packageId; } public PackageInfo(ContentPackage package, uint id, Func getPackage) { if (package is null) throw new ArgumentNullException($"{nameof(PackageInfo)}: package is null"); if (id == 0) throw new ArgumentNullException($"{nameof(PackageInfo)}: id is zero."); this.Name = package.Name; this.SteamWorkshopId = package.TryExtractSteamWorkshopId(out var sId) ? sId.Value : 0; this.Id = id; this._getPackage = getPackage; } public PackageInfo(string name, ulong steamWorkshopId, uint id, Func getPackage) { Name = !name.IsNullOrWhiteSpace() ? name : throw new ArgumentNullException($"{nameof(PackageInfo)}: name cannot be null or empty."); SteamWorkshopId = steamWorkshopId != 0 ? steamWorkshopId : throw new ArgumentNullException($"{nameof(PackageInfo)}: steam id cannot be 0."); this.Id = id; this._getPackage = getPackage; } public PackageInfo(string name, uint id, Func getPackage) { Name = name ?? throw new ArgumentNullException($"{nameof(PackageInfo)}: name cannot be null or empty."); this.SteamWorkshopId = 0; this.Id = id; this._getPackage = getPackage; } public PackageInfo(ulong steamWorkshopId, uint id, Func getPackage) { SteamWorkshopId = steamWorkshopId != 0 ? steamWorkshopId : throw new ArgumentNullException($"{nameof(PackageInfo)}: steamid cannot be 0."); this.Id = id; this._getPackage = getPackage; } public override int GetHashCode() { return (int)Id; } public virtual bool Equals(PackageInfo other) { return ((IEquatable)this).Equals(other); } } public record ConfigResourceInfo : IConfigResourceInfo { public Platform SupportedPlatforms { get; init; } public Target SupportedTargets { get; init; } public int LoadPriority { get; init; } public ImmutableArray FilePaths { get; init; } public bool Optional { get; init; } public ImmutableArray SupportedCultures { get; init; } public ImmutableArray Dependencies { get; init; } public string InternalName { get; init; } public ContentPackage OwnerPackage { get; init; } } public record ConfigProfileResourceInfo : IConfigProfileResourceInfo { public Platform SupportedPlatforms { get; init; } public Target SupportedTargets { get; init; } public int LoadPriority { get; init; } public ImmutableArray FilePaths { get; init; } public bool Optional { get; init; } public ImmutableArray SupportedCultures { get; init; } public ImmutableArray Dependencies { get; init; } public string InternalName { get; init; } public ContentPackage OwnerPackage { get; init; } } public readonly struct LuaScriptsResourceInfo : ILuaScriptResourceInfo { public ContentPackage OwnerPackage { get; init; } public Platform SupportedPlatforms { get; init; } public Target SupportedTargets { get; init; } public int LoadPriority { get; init; } public ImmutableArray FilePaths { get; init; } public ImmutableArray SupportedCultures { get; init; } public ImmutableArray Dependencies { get; init; } public bool Optional { get; init; } public string InternalName { get; init; } public bool IsAutorun { get; init; } } #endregion #region DataContracts_ParsedInfo public record ConfigInfo : IConfigInfo { public string InternalName { get; init; } public ContentPackage OwnerPackage { get; init; } public Type DataType { get; init; } public OneOf DefaultValue { get; init; } public OneOf Value { get; init; } public RunState EditableStates { get; init; } public NetSync NetSync { get; init; } #if CLIENT // IConfigDisplayInfo public string DisplayName { get; init; } public string Description { get; init; } public string DisplayCategory { get; init; } public bool ShowInMenus { get; init; } public string Tooltip { get; init; } public string ImageIconPath { get; init; } #endif } public record ConfigProfileInfo : IConfigProfileInfo { public string InternalName { get; init; } public ContentPackage OwnerPackage { get; init; } public IReadOnlyList<(string ConfigName, OneOf Value)> ProfileValues { get; init; } } #endregion