using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using Microsoft.CodeAnalysis; using ServersideQoL.Processors; using ServersideQoL.Utilities; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("ArgusMagnus")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("ArgusMagnus")] [assembly: AssemblyDescription("Remove Mistland's mist. Configure trader progression requirements. Let workstations share their build range.")] [assembly: AssemblyFileVersion("2.0.0.0")] [assembly: AssemblyInformationalVersion("2.0.0+cdafe98fecdc9c33d99ba13f064e37dcaca41712")] [assembly: AssemblyProduct("ServersideQoL.WorldOptions")] [assembly: AssemblyTitle("ServersideQoL.WorldOptions")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/ArgusMagnus/ValheimServersideQoL")] [assembly: AssemblyVersion("2.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ServersideQoL.WorldOptions { public sealed class Config : ConfigBase { public enum RemoveMistlandsMistOptions { Never, Always, AfterQueenKilled } private const string Section = "WorldOptions"; internal const string GlobalKeyNone = "--"; public override ConfigEntry Enabled { get; } = ConfigBase.BindEx(cfg, "WorldOptions", true, "Enables/disables the entire mod", (AcceptableValueBase)null, (Deprecated)null, "Enabled"); public ConfigEntry RemoveMistlandsMist { get; } = ConfigBase.BindEx(cfg, "WorldOptions", RemoveMistlandsMistOptions.AfterQueenKilled, "Condition to remove the mist from the mistlands.\r\nBeware that there are a few cases of mist (namely mist around POIs like ancient bones/skulls)\r\nthat cannot be removed by this mod and will remain regardless of this setting.", (AcceptableValueBase)(object)AcceptableEnum.Default, (Deprecated)null, "RemoveMistlandsMist"); public ConfigEntry MapTableMapViewDistance { get; } = ConfigBase.BindEx(cfg, "WorldOptions", 0f, $"Max distance to a map table at which players can view their map.\r\nHas no effect unless the {(object)(GlobalKeys)31} global key is set.\r\n0 to disable this feature.", (AcceptableValueBase)null, (Deprecated)null, "MapTableMapViewDistance"); public ConfigEntry CraftingStationsShareBuildRadius { get; } = ConfigBase.BindEx(cfg, "WorldOptions", false, "True to make crafting stations share their build radius.\r\nFor example, a workbench and a stone cutter with overlapping build radius will enable players to build\r\nwith stone also in the workbench's build range and vice versa.", (AcceptableValueBase)null, (Deprecated)null, "CraftingStationsShareBuildRadius"); public IReadOnlyDictionary>> TaderProgressRequirements { get; } = GetTaderProgressRequirements(cfg); public Config(ConfigFile cfg, Logger logger) : base(cfg, logger) { } private static IReadOnlyDictionary>> GetTaderProgressRequirements(ConfigFile cfg) { //IL_0322: Unknown result type (might be due to invalid IL or missing references) //IL_032c: Expected O, but got Unknown List list = new List(); Dictionary keys = new Dictionary(); foreach (GameObject prefab in ZNetScene.instance.m_prefabs) { Trader component = prefab.GetComponent(); if (component != null) { list.Add(component); foreach (string item in from x in component.m_items select x.m_requiredGlobalKey into x where !string.IsNullOrEmpty(x) select x) { keys.TryAdd(item, null); } continue; } Character component2 = prefab.GetComponent(); if (component2 != null) { string defeatSetGlobalKey = component2.m_defeatSetGlobalKey; if (defeatSetGlobalKey != null && defeatSetGlobalKey.Length > 0) { keys[component2.m_defeatSetGlobalKey] = component2; } } } List list2 = new List(); list2.Add("--"); list2.AddRange(from x in keys orderby x.Key select x.Key); AcceptableValueList val = new AcceptableValueList(list2.ToArray()); Dictionary>> dictionary = null; foreach (Trader item2 in list) { List> list3 = null; foreach (IGrouping item3 in from x in item2.m_items where !string.IsNullOrEmpty(x.m_requiredGlobalKey) group x by x.m_requiredGlobalKey into x orderby keys[x.Key]?.m_health ?? float.MaxValue, x.Key select x) { Character? obj = keys[item3.Key]; string text = "Set" + NormalizeKey(((obj != null) ? ((Object)obj).name : null) ?? item3.Key); string key = item3.Key; string text2 = string.Join(", ", item3.Select((TradeItem x) => Localization.instance.Localize((x.m_prefab == null) ? x.m_name : x.m_prefab.m_itemData.m_shared.m_name))); (list3 ?? (list3 = new List>())).Add(cfg.Bind(((Object)item2).name + "ProgressionRequirements", text, key, new ConfigDescription("The required global key for buying " + text2 + " from " + Localization.instance.Localize(item2.m_name), (AcceptableValueBase)(object)val, Array.Empty()))); } if (list3 != null) { (dictionary ?? (dictionary = new Dictionary>>())).Add(item2, list3); } } IReadOnlyDictionary>> readOnlyDictionary = dictionary; return readOnlyDictionary ?? EmptyReadOnlyCollections>>.Dictionary; static string NormalizeKey(string input) { return Regex.Replace(input, "(?:^|_)([a-z])", (Match m) => m.Groups[1].Value.ToUpperInvariant()); } } } [Processor("aaa674b7-2a64-42f1-aab5-e871f5dc0c63")] public sealed class CraftingStationProcessor : Processor { public sealed record PrefabInfo(CraftingStation? CraftingStation, StationExtension? StationExtension) : ProcessorPrefabInfo() { [CompilerGenerated] public override string ToString() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append("PrefabInfo"); stringBuilder.Append(" { "); if (((ProcessorPrefabInfo)this).PrintMembers(stringBuilder)) { stringBuilder.Append(' '); } stringBuilder.Append('}'); return stringBuilder.ToString(); } [CompilerGenerated] protected override bool PrintMembers(StringBuilder builder) { if (((ProcessorPrefabInfo)this).PrintMembers(builder)) { builder.Append(", "); } builder.Append("CraftingStation = "); builder.Append(CraftingStation); builder.Append(", StationExtension = "); builder.Append(StationExtension); return true; } [CompilerGenerated] public override int GetHashCode() { return (((ProcessorPrefabInfo)this).GetHashCode() * -1521134295 + EqualityComparer.Default.GetHashCode(CraftingStation)) * -1521134295 + EqualityComparer.Default.GetHashCode(StationExtension); } [CompilerGenerated] public sealed override bool Equals(ProcessorPrefabInfo? other) { return ((object)this).Equals((object?)other); } [CompilerGenerated] public bool Equals(PrefabInfo? other) { if ((object)this != other) { if (((ProcessorPrefabInfo)this).Equals((ProcessorPrefabInfo)(object)other) && EqualityComparer.Default.Equals(CraftingStation, other.CraftingStation)) { return EqualityComparer.Default.Equals(StationExtension, other.StationExtension); } return false; } return true; } [CompilerGenerated] private PrefabInfo(PrefabInfo original) : base((ProcessorPrefabInfo)(object)original) { CraftingStation = original.CraftingStation; StationExtension = original.StationExtension; } } private sealed class StationInfo(CraftingStation craftingStation) { public CraftingStation CraftingStation { get; } = craftingStation; public Dictionary States { get; } = new Dictionary(); public List Extensions { get; } = new List(); } private sealed class State(ServersideQoLZDO zdo, StationInfo info) { private float? _buildRange; public ServersideQoLZDO ZDO { get; } = zdo; public StationInfo Info { get; } = info; public Dictionary? Stations { get; set; } public void ResetBuildRange() { _buildRange = null; } public float GetBuildRange() { //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) float? buildRange = _buildRange; float result; if (buildRange.HasValue) { result = buildRange.GetValueOrDefault(); } else { int num = 0; foreach (ServersideQoLZDO extension in Info.Extensions) { float num2 = extension.Fields().GetFloat((Func>>)(() => (StationExtension x) => x.m_maxStationDistance), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.WorldOptions\\CraftingStationProcessor.cs", 155); num2 *= num2; if (Utils.DistanceSqr(ZDO.ZDO.GetPosition(), extension.ZDO.GetPosition()) <= num2) { num++; } } ComponentFieldAccessor val = ZDO.Fields(); _buildRange = (result = val.GetFloat((Func>>)(() => (CraftingStation x) => x.m_rangeBuild), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.WorldOptions\\CraftingStationProcessor.cs", 162) + (float)num * val.GetFloat((Func>>)(() => (CraftingStation x) => x.m_extraRangePerLevel), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.WorldOptions\\CraftingStationProcessor.cs", 163)); } return result; } } public const string Id = "aaa674b7-2a64-42f1-aab5-e871f5dc0c63"; private readonly Dictionary _infos = new Dictionary(); protected override void Initialize() { _infos.Clear(); } protected override ProcessResult Process(ServersideQoLZDO zdo, IReadOnlyList peers, PrefabInfo prefabInfo) { //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) if (ConfigBase.Instance.CraftingStationsShareBuildRadius.Value && !((Processor)this).PlacedObjects.Contains(zdo)) { if (prefabInfo.CraftingStation != null) { if (!_infos.TryGetValue(prefabInfo.CraftingStation, out StationInfo value)) { _infos.Add(prefabInfo.CraftingStation, value = new StationInfo(prefabInfo.CraftingStation)); } if (!value.States.TryGetValue(zdo, out State value2)) { value.States.Add(zdo, value2 = new State(zdo, value)); zdo.Destroyed += OnCraftingStationDestroyed; } Dictionary stations = value2.Stations; if (stations != null && stations.Count > 0) { foreach (ServersideQoLZDO value4 in value2.Stations.Values) { ((Processor)this).DestroyObject(value4); } value2.Stations.Clear(); } foreach (StationInfo value5 in _infos.Values) { if (value5 == value) { continue; } foreach (State value6 in value5.States.Values) { float num = value2.GetBuildRange() + value6.GetBuildRange(); num *= num; if (!(Utils.DistanceSqr(zdo.ZDO.GetPosition(), value6.ZDO.ZDO.GetPosition()) > num)) { PlaceStation(value2, value6.ZDO.ZDO.GetPrefab()); PlaceStation(value6, zdo.ZDO.GetPrefab()); break; } } } return (ProcessResult)0; } if (prefabInfo.StationExtension != null) { if (!_infos.TryGetValue(prefabInfo.StationExtension.m_craftingStation, out StationInfo value3)) { _infos.Add(prefabInfo.StationExtension.m_craftingStation, value3 = new StationInfo(prefabInfo.StationExtension.m_craftingStation)); } value3.Extensions.Add(zdo); zdo.Destroyed += OnExtensionDestroyed; ScheduleReprocessStationsInRange(value3, zdo, prefabInfo.StationExtension); } return (ProcessResult)2; } return (ProcessResult)2; } private void OnCraftingStationDestroyed(ServersideQoLZDO zdo) { CraftingStation val = Processor.GetProcessorPrefabInfo(zdo)?.CraftingStation; if (val == null || !_infos.TryGetValue(val, out StationInfo value) || !value.States.Remove(zdo, out State value2)) { return; } Dictionary stations = value2.Stations; if (stations != null && stations.Count > 0) { foreach (ServersideQoLZDO value3 in value2.Stations.Values) { ((Processor)this).DestroyObject(value3); } } foreach (StationInfo value4 in _infos.Values) { if (value4 == value) { continue; } foreach (ServersideQoLZDO key in value4.States.Keys) { ((Processor)this).ScheduleReprocessing(key, 0f); } } } private void OnExtensionDestroyed(ServersideQoLZDO zdo) { StationExtension val = Processor.GetProcessorPrefabInfo(zdo)?.StationExtension; if (val != null && _infos.TryGetValue(val.m_craftingStation, out StationInfo value) && value.Extensions.Remove(zdo)) { ScheduleReprocessStationsInRange(value, zdo, val); } } private void ScheduleReprocessStationsInRange(StationInfo info, ServersideQoLZDO zdo, StationExtension stationExtension) { //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) float num = zdo.Fields().GetFloat((Func>>)(() => (StationExtension x) => x.m_maxStationDistance), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.WorldOptions\\CraftingStationProcessor.cs", 106); num *= num; foreach (State value in info.States.Values) { if (!((Object)(object)info.CraftingStation != (Object)(object)stationExtension.m_craftingStation) && !(Utils.DistanceSqr(value.ZDO.ZDO.GetPosition(), zdo.ZDO.GetPosition()) > num)) { value.ResetBuildRange(); ((Processor)this).ScheduleReprocessing(value.ZDO, 0f); } } } private void PlaceStation(State state, int prefab) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) if (!((!(state.Stations?.ContainsKey(prefab))) ?? true)) { return; } Vector3 position = state.ZDO.ZDO.GetPosition(); position.y -= 10000f; ServersideQoLZDO val = ((Processor)this).PlacePiece(position, prefab, 0f, (CreatorMarkers)0); val.Fields().Set((Func>>)(() => (CraftingStation x) => x.m_rangeBuild), state.GetBuildRange(), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.WorldOptions\\CraftingStationProcessor.cs", 129).Set((Func>>)(() => (CraftingStation x) => x.m_extraRangePerLevel), 0f, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.WorldOptions\\CraftingStationProcessor.cs", 130); (state.Stations ?? (state.Stations = new Dictionary())).Add(prefab, val); } } [Processor("09966489-a911-4bc0-be43-4dbd01212f19")] [DependsOn] public sealed class MapTableProcessor : Processor> { public const string Id = "09966489-a911-4bc0-be43-4dbd01212f19"; private float _mapTableRangeSqr; protected override void Initialize() { _mapTableRangeSqr = ConfigBase.Instance.MapTableMapViewDistance.Value * ConfigBase.Instance.MapTableMapViewDistance.Value; if (_mapTableRangeSqr > 0f && !ZoneSystem.instance.GetGlobalKey((GlobalKeys)31)) { _mapTableRangeSqr = 0f; ((Processor)this).Logger.LogWarning((object)$"[{((ConfigEntryBase)ConfigBase.Instance.MapTableMapViewDistance).Definition.Section}].[{((ConfigEntryBase)ConfigBase.Instance.MapTableMapViewDistance).Definition.Key}] has no effect unless the {(object)(GlobalKeys)31} global key is set"); } } protected override ProcessResult Process(ServersideQoLZDO zdo, IReadOnlyList peers, ProcessorPrefabInfo prefabInfo) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) Enumerator enumerator = ListExtensions.Enumerate(peers).GetEnumerator(); try { while (enumerator.MoveNext()) { Peer current = enumerator.Current; PlayerState playerState = current.PlayerState; if (playerState != null) { if (Utils.DistanceSqr(current.RefPos, zdo.ZDO.GetPosition()) < _mapTableRangeSqr) { playerState.AddGlobalKeyModification(new GlobalKey((GlobalKeys)31), false, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.WorldOptions\\MapTableProcessor.cs"); } else { playerState.RemoveGlobalKeyModification(new GlobalKey((GlobalKeys)31), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.WorldOptions\\MapTableProcessor.cs"); } } } } finally { ((IDisposable)enumerator/*cast due to .constrained prefix*/).Dispose(); } return ((Processor)this).ScheduleReprocessing(0f); } } [Processor("edd9c927-c22e-413d-b6d9-a67c0a3268b9")] public sealed class MisterProcessor : Processor> { private const string QueenDefeatedKey = "defeated_queen"; private bool _queenDefeated; private readonly HashSet _misters = new HashSet(); protected override void Initialize() { _queenDefeated = ZoneSystem.instance.GetGlobalKey("defeated_queen"); _misters.Clear(); ServersideQoLPluginBase.Instance.GlobalKeysChanged -= OnGlobalKeysChanged; if (!_queenDefeated) { ServersideQoLPluginBase.Instance.GlobalKeysChanged += OnGlobalKeysChanged; } } protected override ProcessResult Process(ServersideQoLZDO zdo, IReadOnlyList peers, ProcessorPrefabInfo prefabInfo) { switch (ConfigBase.Instance.RemoveMistlandsMist.Value) { case Config.RemoveMistlandsMistOptions.Always: if (zdo.Fields().UpdateValue((Func>>)(() => (Mister x) => x.m_radius), float.MinValue, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.WorldOptions\\MisterProcessor.cs", 30)) { return (ProcessResult)10; } break; case Config.RemoveMistlandsMistOptions.AfterQueenKilled: if (_queenDefeated) { if (zdo.Fields().UpdateValue((Func>>)(() => (Mister x) => x.m_radius), float.MinValue, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.WorldOptions\\MisterProcessor.cs", 37)) { return (ProcessResult)10; } break; } _misters.Add(zdo); return (ProcessResult)0; } return (ProcessResult)2; } private void OnGlobalKeysChanged() { _queenDefeated = ZoneSystem.instance.GetGlobalKey("defeated_queen"); if (!_queenDefeated) { return; } ServersideQoLPluginBase.Instance.GlobalKeysChanged -= OnGlobalKeysChanged; foreach (ServersideQoLZDO mister in _misters) { ((Processor)this).ScheduleReprocessing(mister, 0f); } _misters.Clear(); } } [Processor("a4dbfa59-0d8c-4910-8f02-5097a0449786")] [DependsOn] public sealed class TraderProcessor : Processor> { private readonly record struct GlobalKeyModification(GlobalKey Key, bool Add); public const string Id = "a4dbfa59-0d8c-4910-8f02-5097a0449786"; private readonly Dictionary> _globalKeyModifications = new Dictionary>(); protected override void Initialize() { ServersideQoLPluginBase.Instance.GlobalKeysChanged -= OnGlobalKeysChanged; OnGlobalKeysChanged(); ServersideQoLPluginBase.Instance.GlobalKeysChanged += OnGlobalKeysChanged; } protected override ProcessResult Process(ServersideQoLZDO zdo, IReadOnlyList peers, ProcessorPrefabInfo prefabInfo) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) if (!_globalKeyModifications.TryGetValue(prefabInfo.Component, out IReadOnlyList value)) { return ((Processor)this).ScheduleReprocessing(0f); } float num = prefabInfo.Component.m_standRange * prefabInfo.Component.m_standRange; Enumerator enumerator = ListExtensions.Enumerate(peers).GetEnumerator(); try { while (enumerator.MoveNext()) { Peer current = enumerator.Current; PlayerState playerState = current.PlayerState; if (playerState == null) { continue; } GlobalKey Key; bool Add; if (Utils.DistanceSqr(current.RefPos, zdo.ZDO.GetPosition()) < num) { foreach (GlobalKeyModification item in value) { item.Deconstruct(out Key, out Add); GlobalKey val = Key; bool flag = Add; playerState.AddGlobalKeyModification(val, flag, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.WorldOptions\\TraderProcessor.cs"); } continue; } foreach (GlobalKeyModification item2 in value) { item2.Deconstruct(out Key, out Add); GlobalKey val2 = Key; playerState.RemoveGlobalKeyModification(val2, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.WorldOptions\\TraderProcessor.cs"); } } } finally { ((IDisposable)enumerator/*cast due to .constrained prefix*/).Dispose(); } return ((Processor)this).ScheduleReprocessing(0f); } private void OnGlobalKeysChanged() { //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Unknown result type (might be due to invalid IL or missing references) if (!((ConfigBase)(object)ConfigBase.Instance).Enabled.Value) { ServersideQoLPluginBase.Instance.GlobalKeysChanged -= OnGlobalKeysChanged; return; } _globalKeyModifications.Clear(); foreach (KeyValuePair>> taderProgressRequirement in ConfigBase.Instance.TaderProgressRequirements) { taderProgressRequirement.Deconstruct(out var key, out var value); Trader key2 = key; IReadOnlyList> readOnlyList = value; List list = null; foreach (ConfigEntry item in readOnlyList) { if (item.Value.Equals(((ConfigEntryBase)item).BoxedValue)) { continue; } string key3 = (string)((ConfigEntryBase)item).DefaultValue; bool globalKey = ZoneSystem.instance.GetGlobalKey(key3); if (globalKey == (item.Value == "--" || ZoneSystem.instance.GetGlobalKey(item.Value))) { continue; } bool flag = !globalKey; if (list == null) { list = new List(1) { new GlobalKeyModification(new GlobalKey(key3), flag) }; continue; } int num = list.FindIndex(delegate(GlobalKeyModification x) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) GlobalKey key4 = x.Key; return GlobalKey.op_Implicit(ref key4) == key3; }); if (num < 0) { list.Add(new GlobalKeyModification(new GlobalKey(key3), flag)); } else if (list[num].Add != flag) { ((Processor)this).Logger.LogWarning((object)("[" + ((ConfigEntryBase)item).Definition.Section + "].[" + ((ConfigEntryBase)item).Definition.Key + "]: Conflicting requirements for global key " + key3)); if (flag) { list[num] = new GlobalKeyModification(new GlobalKey(key3), flag); } } } if (list != null) { _globalKeyModifications.Add(key2, list); } } } } [BepInPlugin("ArgusMagnus.ServersideQoL.WorldOptions", "ServersideQoL.WorldOptions", "2.0.0")] public sealed class WorldOptionsPlugin : ServersideQoLPluginBase { public const string Author = "ArgusMagnus"; public const string PluginName = "ServersideQoL.WorldOptions"; public const string PluginGuid = "ArgusMagnus.ServersideQoL.WorldOptions"; public const string PluginVersion = "2.0.0"; public const string PluginInformationalVersion = "2.0.0"; private DateTimeOffset BuildTimestamp { get; } = new DateTimeOffset(639245732005598855L, default(TimeSpan)); protected override Config CreateConfigSingleton(ConfigFile configFile, Logger logger) { return new Config(configFile, logger); } protected override void RegisterProcessors(IProcessorCollection processors) { processors.Add().Add().Add() .Add(); } private void Awake() { } } }