Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of ServersideQoL AutoProcess v2.3.0
ServersideQoL.AutoProcess.dll
Decompiled 2 weeks agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; 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("Automatically feeds processing stations such as smelters, kilns, windmills, shield generators, etc. from nearby containers")] [assembly: AssemblyFileVersion("2.3.0.0")] [assembly: AssemblyInformationalVersion("2.3.0+fa2d6368df524c9e10cfac8661269ed815ef1b12")] [assembly: AssemblyProduct("ServersideQoL.AutoProcess")] [assembly: AssemblyTitle("ServersideQoL.AutoProcess")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/ArgusMagnus/ValheimServersideQoL")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.3.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [CompilerGenerated] internal sealed class <>z__ReadOnlyList<T> : IEnumerable, ICollection, IList, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T>, IList<T> { int ICollection.Count => _items.Count; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot => this; object IList.this[int index] { get { return _items[index]; } set { throw new NotSupportedException(); } } bool IList.IsFixedSize => true; bool IList.IsReadOnly => true; int IReadOnlyCollection<T>.Count => _items.Count; T IReadOnlyList<T>.this[int index] => _items[index]; int ICollection<T>.Count => _items.Count; bool ICollection<T>.IsReadOnly => true; T IList<T>.this[int index] { get { return _items[index]; } set { throw new NotSupportedException(); } } public <>z__ReadOnlyList(List<T> items) { _items = items; } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)_items).GetEnumerator(); } void ICollection.CopyTo(Array array, int index) { ((ICollection)_items).CopyTo(array, index); } int IList.Add(object value) { throw new NotSupportedException(); } void IList.Clear() { throw new NotSupportedException(); } bool IList.Contains(object value) { return ((IList)_items).Contains(value); } int IList.IndexOf(object value) { return ((IList)_items).IndexOf(value); } void IList.Insert(int index, object value) { throw new NotSupportedException(); } void IList.Remove(object value) { throw new NotSupportedException(); } void IList.RemoveAt(int index) { throw new NotSupportedException(); } IEnumerator<T> IEnumerable<T>.GetEnumerator() { return ((IEnumerable<T>)_items).GetEnumerator(); } void ICollection<T>.Add(T item) { throw new NotSupportedException(); } void ICollection<T>.Clear() { throw new NotSupportedException(); } bool ICollection<T>.Contains(T item) { return _items.Contains(item); } void ICollection<T>.CopyTo(T[] array, int arrayIndex) { _items.CopyTo(array, arrayIndex); } bool ICollection<T>.Remove(T item) { throw new NotSupportedException(); } int IList<T>.IndexOf(T item) { return _items.IndexOf(item); } void IList<T>.Insert(int index, T item) { throw new NotSupportedException(); } void IList<T>.RemoveAt(int index) { throw new NotSupportedException(); } } [CompilerGenerated] internal sealed class <>z__ReadOnlySingleElementList<T> : IEnumerable, ICollection, IList, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T>, IList<T> { private sealed class Enumerator : IDisposable, IEnumerator, IEnumerator<T> { object IEnumerator.Current => _item; T IEnumerator<T>.Current => _item; public Enumerator(T item) { _item = item; } bool IEnumerator.MoveNext() { if (!_moveNextCalled) { return _moveNextCalled = true; } return false; } void IEnumerator.Reset() { _moveNextCalled = false; } void IDisposable.Dispose() { } } int ICollection.Count => 1; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot => this; object IList.this[int index] { get { if (index != 0) { throw new IndexOutOfRangeException(); } return _item; } set { throw new NotSupportedException(); } } bool IList.IsFixedSize => true; bool IList.IsReadOnly => true; int IReadOnlyCollection<T>.Count => 1; T IReadOnlyList<T>.this[int index] { get { if (index != 0) { throw new IndexOutOfRangeException(); } return _item; } } int ICollection<T>.Count => 1; bool ICollection<T>.IsReadOnly => true; T IList<T>.this[int index] { get { if (index != 0) { throw new IndexOutOfRangeException(); } return _item; } set { throw new NotSupportedException(); } } public <>z__ReadOnlySingleElementList(T item) { _item = item; } IEnumerator IEnumerable.GetEnumerator() { return new Enumerator(_item); } void ICollection.CopyTo(Array array, int index) { array.SetValue(_item, index); } int IList.Add(object value) { throw new NotSupportedException(); } void IList.Clear() { throw new NotSupportedException(); } bool IList.Contains(object value) { return EqualityComparer<T>.Default.Equals(_item, (T)value); } int IList.IndexOf(object value) { if (!EqualityComparer<T>.Default.Equals(_item, (T)value)) { return -1; } return 0; } void IList.Insert(int index, object value) { throw new NotSupportedException(); } void IList.Remove(object value) { throw new NotSupportedException(); } void IList.RemoveAt(int index) { throw new NotSupportedException(); } IEnumerator<T> IEnumerable<T>.GetEnumerator() { return new Enumerator(_item); } void ICollection<T>.Add(T item) { throw new NotSupportedException(); } void ICollection<T>.Clear() { throw new NotSupportedException(); } bool ICollection<T>.Contains(T item) { return EqualityComparer<T>.Default.Equals(_item, item); } void ICollection<T>.CopyTo(T[] array, int arrayIndex) { array[arrayIndex] = _item; } bool ICollection<T>.Remove(T item) { throw new NotSupportedException(); } int IList<T>.IndexOf(T item) { if (!EqualityComparer<T>.Default.Equals(_item, item)) { return -1; } return 0; } void IList<T>.Insert(int index, T item) { throw new NotSupportedException(); } void IList<T>.RemoveAt(int index) { throw new NotSupportedException(); } } 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.AutoProcess { [BepInPlugin("ArgusMagnus.ServersideQoL.AutoProcess", "ServersideQoL.AutoProcess", "2.3.0")] public sealed class AutoProcessPlugin : ServersideQoLPluginBase<AutoProcessPlugin, Config> { public const string Author = "ArgusMagnus"; public const string PluginName = "ServersideQoL.AutoProcess"; public const string PluginGuid = "ArgusMagnus.ServersideQoL.AutoProcess"; public const string PluginVersion = "2.3.0"; public const string PluginInformationalVersion = "2.3.0"; private DateTimeOffset BuildTimestamp { get; } = new DateTimeOffset(639273812576652814L, default(TimeSpan)); protected override Config CreateConfigSingleton(ConfigFile configFile, Logger logger) { return new Config(configFile, logger); } protected override void RegisterProcessors(IProcessorCollection processors) { processors.Add<SmelterProcessor>().Add<FermenterProcessor>(); } private void Awake() { } } public sealed class Config : ConfigBase<Config> { public sealed class LocalizationConfig { private string FuelAdded { get; init; } = "{0}: $msg_added {1} {2}x"; private string OreAdded { get; init; } = "{0}: $msg_added {1} {2}x"; public string FormatFuelAdded(string smelterName, string itemName, int stack) { return string.Format(FuelAdded, smelterName, itemName, stack); } public string FormatOreAdded(string smelterName, string itemName, int stack) { return string.Format(OreAdded, smelterName, itemName, stack); } } private const string DefaultRangeEmoji = "↔\ufe0f"; public override ConfigEntry<bool> Enabled { get; } = ConfigBase<Config>.BindEx<bool>(cfg, true, "Enables/disables the entire mod", (IAcceptableValueBase<bool>)null, (Deprecated<Config>)null, "Enabled"); public ConfigEntry<bool> FeedFromContainers { get; } = Shared.AutoProcessFeedFromContainers = ConfigBase<Config>.BindEx<bool>(cfg, true, "True to automatically feed smelters from nearby containers", (IAcceptableValueBase<bool>)null, (Deprecated<Config>)null, "FeedFromContainers"); public ConfigEntry<bool> FeedFermenters { get; } = ConfigBase<Config>.BindEx<bool>(cfg, false, "True to automatically add fermentable items (e.g. mead bases) to empty fermenters from nearby containers. Requires FeedFromContainers", (IAcceptableValueBase<bool>)null, (Deprecated<Config>)null, "FeedFermenters"); public ConfigEntry<bool> TapFermenters { get; } = ConfigBase<Config>.BindEx<bool>(cfg, false, "True to automatically tap fermenters when the content is ready. The products (e.g. mead) are dropped like when tapping by hand, use AutoStore to put them into containers", (IAcceptableValueBase<bool>)null, (Deprecated<Config>)null, "TapFermenters"); public ConfigEntry<float> FeedFromContainersRange { get; } = ConfigBase<Config>.BindEx<float>(cfg, 4f, "Required proximity of a container to a smelter to be used as feeding source.\r\nCan be overridden per chest by putting '<FeedFromContainersRangeSignPrefix><Range>' on a chest sign, e.g. '↔\ufe0f64'.\r\n For example, '↔\ufe0f64' increase the range of that chest to 64m.\r\n Only works with automatic chest signs added by the ServersideQoL.ContainerSigns mod.", (IAcceptableValueBase<float>)null, (Deprecated<Config>)null, "FeedFromContainersRange"); public ConfigEntry<string> FeedFromContainersRangeSignPrefix { get; } = Shared.AutoProcessFeedFromContainersRangeSignPrefix = ConfigBase<Config>.BindEx<string>(cfg, "↔\ufe0f", "Requires the ServersideQoL.ContainerSigns mod.\r\nThe prefix used to identify the container specifc feed range value in chest sign text.", (IAcceptableValueBase<string>)null, (Deprecated<Config>)null, "FeedFromContainersRangeSignPrefix"); public ConfigEntry<int> FeedFromContainersMaxRange { get; } = Shared.AutoProcessFeedFromContainersMaxRange = ConfigBase<Config>.BindEx<int>(cfg, 64, "Requires the ServersideQoL.ContainerSigns mod.\r\nMax feeding range players can set per chest (by putting '<FeedFromContainersRangeSignPrefix><Range>' on a chest sign)", (IAcceptableValueBase<int>)null, (Deprecated<Config>)null, "FeedFromContainersMaxRange"); public ConfigEntry<float> FeedFromContainersMinPlayerDistance { get; } = ConfigBase<Config>.BindEx<float>(cfg, 4f, "Min distance all players must have to a processing station", (IAcceptableValueBase<float>)null, (Deprecated<Config>)null, "FeedFromContainersMinPlayerDistance"); public ConfigEntry<ConfigArray<string>> FeedFromContainersExcludeContainers { get; } public ConfigEntry<int> FeedFromContainersLeaveAtLeastFuel { get; } public ConfigEntry<int> FeedFromContainersLeaveAtLeastOre { get; } public ConfigEntry<int> FeedFromContainersLeaveAtLeastFermentable { get; } public ConfigEntry<MessageTypes> OreOrFuelAddedMessageType { get; } public ConfigEntry<float> CapacityMultiplier { get; } public ConfigEntry<float> TimePerProductMultiplier { get; } public YamlConfigEntry<LocalizationConfig> Localization { get; } public Config(ConfigFile cfg, Logger logger) { ConfigArray<string> obj = new ConfigArray<string>((IReadOnlyList<string>)Array.Empty<string>()); List<string> list = new List<string>(); list.AddRange(ConfigBase.PlaceableContainers.Select((PlaceableContainer x) => x.Name)); FeedFromContainersExcludeContainers = ConfigBase<Config>.BindEx<ConfigArray<string>>(cfg, obj, "", (IAcceptableValueBase<ConfigArray<string>>)(object)AcceptableArrayValues.Get<string>((IReadOnlyList<string>)new <>z__ReadOnlyList<string>(list)), (Deprecated<Config>)null, "FeedFromContainersExcludeContainers"); FeedFromContainersLeaveAtLeastFuel = ConfigBase<Config>.BindEx<int>(cfg, 1, "Minimum amount of fuel to leave in a container", (IAcceptableValueBase<int>)null, (Deprecated<Config>)null, "FeedFromContainersLeaveAtLeastFuel"); FeedFromContainersLeaveAtLeastOre = ConfigBase<Config>.BindEx<int>(cfg, 1, "Minimum amount of ore to leave in a container", (IAcceptableValueBase<int>)null, (Deprecated<Config>)null, "FeedFromContainersLeaveAtLeastOre"); FeedFromContainersLeaveAtLeastFermentable = ConfigBase<Config>.BindEx<int>(cfg, 0, "Minimum amount of fermentable items (e.g. mead bases) to leave in a container", (IAcceptableValueBase<int>)null, (Deprecated<Config>)null, "FeedFromContainersLeaveAtLeastFermentable"); OreOrFuelAddedMessageType = ConfigBase<Config>.BindEx<MessageTypes>(cfg, (MessageTypes)0, "Type of message to show when ore or fuel is added to a smelter", (IAcceptableValueBase<MessageTypes>)(object)AcceptableEnum<MessageTypes>.Default, (Deprecated<Config>)null, "OreOrFuelAddedMessageType"); CapacityMultiplier = ConfigBase<Config>.BindEx<float>(cfg, 1f, "Multiply a smelter's ore/fuel capacity by this factor", (IAcceptableValueBase<float>)null, (Deprecated<Config>)null, "CapacityMultiplier"); TimePerProductMultiplier = ConfigBase<Config>.BindEx<float>(cfg, 1f, "Multiply the time it takes to produce one product by this factor (will not go below 1 second per product).", (IAcceptableValueBase<float>)null, (Deprecated<Config>)null, "TimePerProductMultiplier"); Localization = ConfigBase<Config>.BindYaml<LocalizationConfig>(cfg, "Localization"); base..ctor(cfg, logger); } } [Processor("4d9ff5be-1a2e-469e-8046-addadfd58bab")] [RunAfter<ContainerRegistryProcessor>] public sealed class FermenterProcessor : Processor<FermenterProcessor.PrefabInfo> { public sealed record PrefabInfo(Fermenter Fermenter) : 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("Fermenter = "); builder.Append(Fermenter); return true; } [CompilerGenerated] public override int GetHashCode() { return ((ProcessorPrefabInfo)this).GetHashCode() * -1521134295 + EqualityComparer<Fermenter>.Default.GetHashCode(Fermenter); } [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)) { return EqualityComparer<Fermenter>.Default.Equals(Fermenter, other.Fermenter); } return false; } return true; } [CompilerGenerated] private PrefabInfo(PrefabInfo original) : base((ProcessorPrefabInfo)(object)original) { Fermenter = original.Fermenter; } } public const string Id = "4d9ff5be-1a2e-469e-8046-addadfd58bab"; private const float TapRetryDelay = 10f; private SectorDictionary<HashSet<ServersideQoLZDO>>? _fermenters; private SectorDictionary<SharedItemDataKey, HashSet<ServersideQoLZDO>>? _containersByItemName; protected override void Initialize() { Processor.Instance<ContainerRegistryProcessor>().ContainerChanged -= OnContainerChanged; if (ConfigBase<Config>.Instance.FeedFromContainers.Value && ConfigBase<Config>.Instance.FeedFermenters.Value) { _fermenters = new SectorDictionary<HashSet<ServersideQoLZDO>>(Mathf.Max(ConfigBase<Config>.Instance.FeedFromContainersRange.Value, (float)ConfigBase<Config>.Instance.FeedFromContainersMaxRange.Value)); _containersByItemName = Processor.Instance<ContainerRegistryProcessor>().GetContainersByItemName(_fermenters.SectorWidth); Processor.Instance<ContainerRegistryProcessor>().ContainerChanged += OnContainerChanged; } else { _fermenters = null; _containersByItemName = null; } } protected override ProcessResult Process(ServersideQoLZDO zdo, IReadOnlyList<Peer> peers, PrefabInfo 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_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) ZDOVars vars = zdo.Vars; PlayerID val = default(PlayerID); val = ((ZDOVars)(ref vars)).GetCreator(val); if (((PlayerID)(ref val)).Value == 0L) { return (ProcessResult)2; } if (_fermenters == null && !ConfigBase<Config>.Instance.TapFermenters.Value) { return (ProcessResult)2; } SectorDictionary<HashSet<ServersideQoLZDO>>? fermenters = _fermenters; if (fermenters != null) { SectorDictionary.TryAdd(fermenters, zdo, true); } if (!Processor.CheckMinDistance(peers, zdo, ConfigBase<Config>.Instance.FeedFromContainersMinPlayerDistance.Value)) { return ((Processor)this).ScheduleReprocessing(0f); } vars = zdo.Vars; if (((ZDOVars)(ref vars)).GetContent(0) == 0) { if (_fermenters == null) { return (ProcessResult)0; } return Feed(zdo, peers, prefabInfo); } if (!ConfigBase<Config>.Instance.TapFermenters.Value) { return (ProcessResult)0; } return Tap(zdo); } private ProcessResult Feed(ServersideQoLZDO zdo, IReadOnlyList<Peer> peers, PrefabInfo prefabInfo) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0421: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_0271: Unknown result type (might be due to invalid IL or missing references) //IL_027c: Unknown result type (might be due to invalid IL or missing references) //IL_0282: Unknown result type (might be due to invalid IL or missing references) //IL_0289: Unknown result type (might be due to invalid IL or missing references) //IL_028e: Unknown result type (might be due to invalid IL or missing references) //IL_028f: Unknown result type (might be due to invalid IL or missing references) //IL_02ec: Unknown result type (might be due to invalid IL or missing references) //IL_02f1: Unknown result type (might be due to invalid IL or missing references) //IL_0318: Unknown result type (might be due to invalid IL or missing references) //IL_031d: Unknown result type (might be due to invalid IL or missing references) //IL_037b: Unknown result type (might be due to invalid IL or missing references) ProcessResult val = (ProcessResult)0; bool flag = false; List<ServersideQoLZDO> list = null; foreach (ItemConversion item in prefabInfo.Fermenter.m_conversion) { ItemData baseItem = item.m_from.m_itemData; AdjacentEnumerator<SharedItemDataKey, HashSet<ServersideQoLZDO>> enumerator2 = _containersByItemName.EnumerateAdjacent((zdo.ZDO.GetPosition(), SharedItemDataKey.op_Implicit(baseItem.m_shared))).GetEnumerator(); try { while (enumerator2.MoveNext()) { HashSet<ServersideQoLZDO> current2 = enumerator2.Current; list?.Clear(); foreach (ServersideQoLZDO item2 in current2) { if (Processor.Instance<SmelterProcessor>().ExcludedContainers.Contains(item2.ZDO.GetPrefab())) { continue; } ContainerState state = Processor.Instance<ContainerRegistryProcessor>().GetState(item2); if (state == null) { (list ?? (list = new List<ServersideQoLZDO>())).Add(item2); continue; } ZDOVars vars = item2.Vars; if (((ZDOVars)(ref vars)).GetInUse(false)) { continue; } float num = state.AutoProcessFeedRange ?? ConfigBase<Config>.Instance.FeedFromContainersRange.Value; num *= num; if (num == 0f || Utils.DistanceSqr(zdo.ZDO.GetPosition(), item2.ZDO.GetPosition()) > num) { continue; } IInventory inventory = state.GetInventory(); int num2 = ConfigBase<Config>.Instance.FeedFromContainersLeaveAtLeastFermentable.Value; ItemData val2 = null; bool flag2 = false; foreach (ItemData item3 in from x in inventory.Items where new ItemDataKey(x) == ItemDataKey.op_Implicit(baseItem) orderby x.m_stack select x) { flag2 = flag2 || (item3 != null && item3.m_stack > 0); int num3 = Math.Min(item3.m_stack, num2); num2 -= num3; if (item3.m_stack > num3) { val2 = item3; break; } } if (val2 == null) { if (!flag2) { (list ?? (list = new List<ServersideQoLZDO>())).Add(item2); } continue; } if (!item2.IsOwnerOrUnassigned()) { val |= ((Processor)this).ScheduleReprocessing(Processor.Instance<ContainerRegistryProcessor>().RequestOwnership(item2, default(PlayerID))); continue; } ItemData obj = val2; obj.m_stack--; if (val2.m_stack == 0) { inventory.Items.Remove(val2); List<ItemData> items = inventory.Items; if (items != null && items.Count == 0) { (list ?? (list = new List<ServersideQoLZDO>())).Add(item2); } } zdo.ReleaseOwnership(); vars = zdo.Vars; ((ZDOVars)(ref vars)).SetContent(StringExtensionMethods.GetStableHashCode(((Object)((Component)item.m_from).gameObject).name), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\FermenterProcessor.cs", 125); vars = zdo.Vars; ((ZDOVars)(ref vars)).SetStartTime(ZNet.instance.GetTime(), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\FermenterProcessor.cs", 126); inventory.Save(); Processor.ShowMessage((IEnumerable<Peer>)peers, zdo, ConfigBase<Config>.Instance.Localization.Value.FormatOreAdded(prefabInfo.Fermenter.m_name, baseItem.m_shared.m_name, 1), ConfigBase<Config>.Instance.OreOrFuelAddedMessageType.Value, (TextType)0); flag = true; break; } if (list != null) { foreach (ServersideQoLZDO item4 in list) { current2.Remove(item4); } } if (flag) { break; } } } finally { ((IDisposable)enumerator2/*cast due to .constrained prefix*/).Dispose(); } if (flag) { break; } } return val; } private ProcessResult Tap(ServersideQoLZDO zdo) { //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_0083: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009b: 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) ZDOVars vars = zdo.Vars; DateTime startTime = ((ZDOVars)(ref vars)).GetStartTime(default(DateTime)); if (startTime.Ticks == 0L) { return (ProcessResult)0; } float num = zdo.Fields<Fermenter>().GetFloat((Func<Expression<Func<Fermenter, float>>>)(() => (Fermenter x) => x.m_fermentationDuration), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\FermenterProcessor.cs", 161) - (float)(ZNet.instance.GetTime() - startTime).TotalSeconds; if (num >= 0f) { return ((Processor)this).ScheduleReprocessing(num + 1f); } if (!zdo.IsOwnerOrUnassigned()) { ZDORpc rPC = zdo.RPC; FermenterRpc fermenter = ((ZDORpc)(ref rPC)).Fermenter; ((FermenterRpc)(ref fermenter)).Tap(); } return ((Processor)this).ScheduleReprocessing(10f); } private void OnContainerChanged(ServersideQoLZDO containerZdo, ContainerState state) { //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) if (_fermenters == null) { Processor.Instance<ContainerRegistryProcessor>().ContainerChanged -= OnContainerChanged; } else { if (Processor.Instance<SmelterProcessor>().ExcludedContainers.Contains(containerZdo.ZDO.GetPrefab())) { return; } float num = state.AutoProcessFeedRange ?? ConfigBase<Config>.Instance.FeedFromContainersRange.Value; num *= num; if (num == 0f) { return; } AdjacentEnumerator<HashSet<ServersideQoLZDO>> enumerator = _fermenters.EnumerateAdjacent(containerZdo.ZDO.GetPosition()).GetEnumerator(); try { while (enumerator.MoveNext()) { HashSet<ServersideQoLZDO> current = enumerator.Current; foreach (ServersideQoLZDO item in current) { if (Utils.DistanceSqr(item.ZDO.GetPosition(), containerZdo.ZDO.GetPosition()) <= num) { ((Processor)this).ScheduleReprocessing(item, 0f); } } } } finally { ((IDisposable)enumerator/*cast due to .constrained prefix*/).Dispose(); } } } } [Processor("1db73d4d-e930-402f-933e-cb92e5748312")] [RunAfter<ContainerRegistryProcessor>] public sealed class SmelterProcessor : Processor<SmelterProcessor.PrefabInfo> { public sealed record PrefabInfo(Smelter? Smelter, ShieldGenerator? ShieldGenerator) : ProcessorPrefabInfo() { [MemberNotNullWhen(true, "Smelter")] public bool HasProduct { [MemberNotNullWhen(true, "Smelter")] get; } = Smelter?.m_conversion.Any((ItemConversion x) => x.m_to != null) ?? false; [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("Smelter = "); builder.Append(Smelter); builder.Append(", ShieldGenerator = "); builder.Append(ShieldGenerator); builder.Append(", HasProduct = "); builder.Append(HasProduct.ToString()); return true; } [CompilerGenerated] public override int GetHashCode() { return ((((ProcessorPrefabInfo)this).GetHashCode() * -1521134295 + EqualityComparer<Smelter>.Default.GetHashCode(Smelter)) * -1521134295 + EqualityComparer<ShieldGenerator>.Default.GetHashCode(ShieldGenerator)) * -1521134295 + EqualityComparer<bool>.Default.GetHashCode(HasProduct); } [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<Smelter>.Default.Equals(Smelter, other.Smelter) && EqualityComparer<ShieldGenerator>.Default.Equals(ShieldGenerator, other.ShieldGenerator)) { return EqualityComparer<bool>.Default.Equals(HasProduct, other.HasProduct); } return false; } return true; } [CompilerGenerated] private PrefabInfo(PrefabInfo original) : base((ProcessorPrefabInfo)(object)original) { Smelter = original.Smelter; ShieldGenerator = original.ShieldGenerator; HasProduct = original.HasProduct; } } private SectorDictionary<HashSet<ServersideQoLZDO>>? _smelters; private SectorDictionary<SharedItemDataKey, HashSet<ServersideQoLZDO>>? _containersByItemName; internal HashSet<int> ExcludedContainers { get; private set; } = new HashSet<int>(); protected override void Initialize() { ExcludedContainers.Clear(); Processor.Instance<ContainerRegistryProcessor>().ContainerChanged -= OnContainerChanged; if (ConfigBase<Config>.Instance.FeedFromContainers.Value) { HashSet<int> hashSet = new HashSet<int>(); foreach (int item in ConfigBase<Config>.Instance.FeedFromContainersExcludeContainers.Value.Items.Select((string x) => StringExtensionMethods.GetStableHashCode(x))) { hashSet.Add(item); } ExcludedContainers = hashSet; _smelters = new SectorDictionary<HashSet<ServersideQoLZDO>>(Mathf.Max(ConfigBase<Config>.Instance.FeedFromContainersRange.Value, (float)ConfigBase<Config>.Instance.FeedFromContainersMaxRange.Value)); _containersByItemName = Processor.Instance<ContainerRegistryProcessor>().GetContainersByItemName(_smelters.SectorWidth); Processor.Instance<ContainerRegistryProcessor>().ContainerChanged += OnContainerChanged; } else { _smelters = null; _containersByItemName = null; } } protected override ProcessResult Process(ServersideQoLZDO zdo, IReadOnlyList<Peer> peers, PrefabInfo prefabInfo) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0298: Unknown result type (might be due to invalid IL or missing references) //IL_029a: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_02b4: Unknown result type (might be due to invalid IL or missing references) //IL_02bb: Unknown result type (might be due to invalid IL or missing references) //IL_02c0: Unknown result type (might be due to invalid IL or missing references) //IL_0287: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_0334: Unknown result type (might be due to invalid IL or missing references) //IL_0339: Unknown result type (might be due to invalid IL or missing references) //IL_0d5d: Unknown result type (might be due to invalid IL or missing references) //IL_086a: Unknown result type (might be due to invalid IL or missing references) //IL_086f: Unknown result type (might be due to invalid IL or missing references) //IL_08d6: Unknown result type (might be due to invalid IL or missing references) //IL_08e7: Unknown result type (might be due to invalid IL or missing references) //IL_08f1: Unknown result type (might be due to invalid IL or missing references) //IL_08f6: Unknown result type (might be due to invalid IL or missing references) //IL_08fa: Unknown result type (might be due to invalid IL or missing references) //IL_08ff: Unknown result type (might be due to invalid IL or missing references) //IL_03da: Unknown result type (might be due to invalid IL or missing references) //IL_03eb: Unknown result type (might be due to invalid IL or missing references) //IL_03f5: Unknown result type (might be due to invalid IL or missing references) //IL_03fa: Unknown result type (might be due to invalid IL or missing references) //IL_03fe: Unknown result type (might be due to invalid IL or missing references) //IL_0403: Unknown result type (might be due to invalid IL or missing references) //IL_0d22: Unknown result type (might be due to invalid IL or missing references) //IL_07fd: Unknown result type (might be due to invalid IL or missing references) //IL_0977: Unknown result type (might be due to invalid IL or missing references) //IL_097c: Unknown result type (might be due to invalid IL or missing references) //IL_047b: Unknown result type (might be due to invalid IL or missing references) //IL_0480: Unknown result type (might be due to invalid IL or missing references) //IL_09d0: Unknown result type (might be due to invalid IL or missing references) //IL_09dc: Unknown result type (might be due to invalid IL or missing references) //IL_04d4: Unknown result type (might be due to invalid IL or missing references) //IL_04e0: Unknown result type (might be due to invalid IL or missing references) //IL_0b36: Unknown result type (might be due to invalid IL or missing references) //IL_0b41: Unknown result type (might be due to invalid IL or missing references) //IL_0b47: Unknown result type (might be due to invalid IL or missing references) //IL_0b4e: Unknown result type (might be due to invalid IL or missing references) //IL_0b53: Unknown result type (might be due to invalid IL or missing references) //IL_0b54: Unknown result type (might be due to invalid IL or missing references) //IL_063a: Unknown result type (might be due to invalid IL or missing references) //IL_0645: Unknown result type (might be due to invalid IL or missing references) //IL_064b: Unknown result type (might be due to invalid IL or missing references) //IL_0652: Unknown result type (might be due to invalid IL or missing references) //IL_0657: Unknown result type (might be due to invalid IL or missing references) //IL_0658: Unknown result type (might be due to invalid IL or missing references) //IL_0700: Unknown result type (might be due to invalid IL or missing references) //IL_0705: Unknown result type (might be due to invalid IL or missing references) //IL_0bf9: Unknown result type (might be due to invalid IL or missing references) //IL_0bfe: Unknown result type (might be due to invalid IL or missing references) //IL_0c3b: Unknown result type (might be due to invalid IL or missing references) //IL_0c40: Unknown result type (might be due to invalid IL or missing references) ProcessResult val = (ProcessResult)0; if (ConfigBase<Config>.Instance.CapacityMultiplier.Value == 1f) { if (prefabInfo.Smelter != null) { zdo.Fields<Smelter>().Reset((Func<Expression<Func<Smelter, int>>>)(() => (Smelter x) => x.m_maxFuel), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 50).Reset((Func<Expression<Func<Smelter, int>>>)(() => (Smelter x) => x.m_maxOre), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 51); } else { zdo.Fields<ShieldGenerator>().Reset((Func<Expression<Func<ShieldGenerator, int>>>)(() => (ShieldGenerator x) => x.m_maxFuel), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 54); } } else if (prefabInfo.ShieldGenerator != null) { if (zdo.Fields<ShieldGenerator>().UpdateValue((Func<Expression<Func<ShieldGenerator, int>>>)(() => (ShieldGenerator x) => x.m_maxFuel), Mathf.RoundToInt(ConfigBase<Config>.Instance.CapacityMultiplier.Value * (float)prefabInfo.ShieldGenerator.m_maxFuel), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 60)) { val = (ProcessResult)8; } } else if (prefabInfo.Smelter != null) { if (zdo.Fields<Smelter>().UpdateValue((Func<Expression<Func<Smelter, int>>>)(() => (Smelter x) => x.m_maxFuel), Mathf.RoundToInt(ConfigBase<Config>.Instance.CapacityMultiplier.Value * (float)prefabInfo.Smelter.m_maxFuel), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 65)) { val = (ProcessResult)8; } if (zdo.Fields<Smelter>().UpdateValue((Func<Expression<Func<Smelter, int>>>)(() => (Smelter x) => x.m_maxOre), Mathf.RoundToInt(ConfigBase<Config>.Instance.CapacityMultiplier.Value * (float)prefabInfo.Smelter.m_maxOre), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 67)) { val = (ProcessResult)8; } } if (prefabInfo.HasProduct) { if (ConfigBase<Config>.Instance.TimePerProductMultiplier.Value == 1f) { zdo.Fields<Smelter>().Reset((Func<Expression<Func<Smelter, float>>>)(() => (Smelter x) => x.m_secPerProduct), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 75); } else if (zdo.Fields<Smelter>().UpdateValue((Func<Expression<Func<Smelter, float>>>)(() => (Smelter x) => x.m_secPerProduct), Mathf.Max(1f, prefabInfo.Smelter.m_secPerProduct * ConfigBase<Config>.Instance.TimePerProductMultiplier.Value), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 76)) { val = (ProcessResult)8; } } if (_smelters == null || _containersByItemName == null) { return (ProcessResult)(val | 2); } if (!Processor.CheckMinDistance(peers, zdo, ConfigBase<Config>.Instance.FeedFromContainersMinPlayerDistance.Value)) { return (ProcessResult)(val | ((Processor)this).ScheduleReprocessing(0f)); } List<ServersideQoLZDO> list = null; List<ItemData> list2 = null; int num = ((prefabInfo.Smelter != null) ? zdo.Fields<Smelter>().GetInt((Func<Expression<Func<Smelter, int>>>)(() => (Smelter x) => x.m_maxFuel), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 92) : zdo.Fields<ShieldGenerator>().GetInt((Func<Expression<Func<ShieldGenerator, int>>>)(() => (ShieldGenerator x) => x.m_maxFuel), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 93)); ZDOVars vars = zdo.Vars; float num2 = ((ZDOVars)(ref vars)).GetFuel(0f); int num3 = (int)((float)num - num2); if (num3 > num / 2) { foreach (ItemData fuelItem in prefabInfo.ShieldGenerator?.m_fuelItems.Select((ItemDrop x) => x.m_itemData) ?? new <>z__ReadOnlySingleElementList<ItemData>(prefabInfo.Smelter.m_fuelItem.m_itemData)) { int num4 = 0; AdjacentEnumerator<SharedItemDataKey, HashSet<ServersideQoLZDO>> enumerator2 = _containersByItemName.EnumerateAdjacent((zdo.ZDO.GetPosition(), SharedItemDataKey.op_Implicit(fuelItem.m_shared))).GetEnumerator(); try { while (enumerator2.MoveNext()) { HashSet<ServersideQoLZDO> current = enumerator2.Current; list?.Clear(); foreach (ServersideQoLZDO item in current) { if (ExcludedContainers.Contains(item.ZDO.GetPrefab())) { continue; } ContainerState state = Processor.Instance<ContainerRegistryProcessor>().GetState(item); if (state == null) { (list ?? (list = new List<ServersideQoLZDO>())).Add(item); continue; } vars = item.Vars; if (((ZDOVars)(ref vars)).GetInUse(false)) { continue; } float num5 = state.AutoProcessFeedRange ?? ConfigBase<Config>.Instance.FeedFromContainersRange.Value; num5 *= num5; if (num5 == 0f || Utils.DistanceSqr(zdo.ZDO.GetPosition(), item.ZDO.GetPosition()) > num5) { continue; } IInventory inventory = state.GetInventory(); list2?.Clear(); int num6 = 0; int num7 = ConfigBase<Config>.Instance.FeedFromContainersLeaveAtLeastFuel.Value; bool flag = false; bool flag2 = false; foreach (ItemData item2 in from x in inventory.Items where new ItemDataKey(x) == ItemDataKey.op_Implicit(fuelItem) orderby x.m_stack select x) { flag = flag || (item2 != null && item2.m_stack > 0); int num8 = Math.Min(item2.m_stack, num7); int num9 = Math.Min(num3, item2.m_stack - num8); num7 -= num8; if (num9 != 0) { if (!item.IsOwnerOrUnassigned()) { flag2 = true; break; } num6 += num9; item2.m_stack -= num9; if (item2.m_stack == 0) { (list2 ?? (list2 = new List<ItemData>())).Add(item2); } num3 -= num9; if (num3 == 0) { break; } } } if (flag2) { val |= ((Processor)this).ScheduleReprocessing(Processor.Instance<ContainerRegistryProcessor>().RequestOwnership(item, default(PlayerID))); continue; } if (num6 == 0) { if (!flag) { (list ?? (list = new List<ServersideQoLZDO>())).Add(item); } continue; } if (list2 != null && list2.Count > 0) { foreach (ItemData item3 in list2) { inventory.Items.Remove(item3); } List<ItemData> items = inventory.Items; if (items != null && items.Count == 0) { (list ?? (list = new List<ServersideQoLZDO>())).Add(item); } } zdo.ReleaseOwnership(); num2 += (float)num6; vars = zdo.Vars; ((ZDOVars)(ref vars)).SetFuel(num2, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 177); inventory.Save(); num4 += num6; if (num3 != 0) { continue; } break; } if (list != null) { foreach (ServersideQoLZDO item4 in list) { current.Remove(item4); } } if (num3 == 0) { break; } } } finally { ((IDisposable)enumerator2/*cast due to .constrained prefix*/).Dispose(); } if (num4 != 0) { Processor.ShowMessage((IEnumerable<Peer>)peers, zdo, ConfigBase<Config>.Instance.Localization.Value.FormatFuelAdded(prefabInfo.Smelter?.m_name ?? prefabInfo.ShieldGenerator.m_name, fuelItem.m_shared.m_name, num4), ConfigBase<Config>.Instance.OreOrFuelAddedMessageType.Value, (TextType)0); } if (num3 == 0) { break; } } } if (prefabInfo.Smelter != null) { int num10 = zdo.Fields<Smelter>().GetInt((Func<Expression<Func<Smelter, int>>>)(() => (Smelter x) => x.m_maxOre), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 212); vars = zdo.Vars; int num11 = ((ZDOVars)(ref vars)).GetQueued(0); int num12 = num10 - num11; if (num12 > num10 / 2) { foreach (ItemConversion item5 in prefabInfo.Smelter.m_conversion) { ItemData oreItem = item5.m_from.m_itemData; int num13 = 0; AdjacentEnumerator<SharedItemDataKey, HashSet<ServersideQoLZDO>> enumerator8 = _containersByItemName.EnumerateAdjacent((zdo.ZDO.GetPosition(), SharedItemDataKey.op_Implicit(oreItem.m_shared))).GetEnumerator(); try { while (enumerator8.MoveNext()) { HashSet<ServersideQoLZDO> current7 = enumerator8.Current; list?.Clear(); foreach (ServersideQoLZDO item6 in current7) { if (ExcludedContainers.Contains(item6.ZDO.GetPrefab())) { continue; } ContainerState state2 = Processor.Instance<ContainerRegistryProcessor>().GetState(item6); if (state2 == null) { (list ?? (list = new List<ServersideQoLZDO>())).Add(item6); continue; } vars = item6.Vars; if (((ZDOVars)(ref vars)).GetInUse(false)) { continue; } float num14 = state2.AutoProcessFeedRange ?? ConfigBase<Config>.Instance.FeedFromContainersRange.Value; num14 *= num14; if (num14 == 0f || Utils.DistanceSqr(zdo.ZDO.GetPosition(), item6.ZDO.GetPosition()) > num14) { continue; } IInventory inventory2 = state2.GetInventory(); list2?.Clear(); int num15 = 0; int num16 = ConfigBase<Config>.Instance.FeedFromContainersLeaveAtLeastOre.Value; bool flag3 = false; bool flag4 = false; foreach (ItemData item7 in from x in inventory2.Items where new ItemDataKey(x) == ItemDataKey.op_Implicit(oreItem) orderby x.m_stack select x) { flag3 = flag3 || (item7 != null && item7.m_stack > 0); int num17 = Math.Min(item7.m_stack, num16); int num18 = Math.Min(num12, item7.m_stack - num17); num16 -= num17; if (num18 != 0) { if (!item6.IsOwnerOrUnassigned()) { flag4 = true; break; } num15 += num18; item7.m_stack -= num18; if (item7.m_stack == 0) { (list2 ?? (list2 = new List<ItemData>())).Add(item7); } num12 -= num18; if (num12 == 0) { break; } } } if (flag4) { val |= ((Processor)this).ScheduleReprocessing(Processor.Instance<ContainerRegistryProcessor>().RequestOwnership(item6, default(PlayerID))); continue; } if (num15 == 0) { if (!flag3) { (list ?? (list = new List<ServersideQoLZDO>())).Add(item6); } continue; } if (list2 != null && list2.Count > 0) { foreach (ItemData item8 in list2) { inventory2.Items.Remove(item8); } List<ItemData> items = inventory2.Items; if (items != null && items.Count == 0) { (list ?? (list = new List<ServersideQoLZDO>())).Add(item6); } } zdo.ReleaseOwnership(); for (int num19 = 0; num19 < num15; num19++) { vars = zdo.Vars; ((ZDOVars)(ref vars)).SetItem(num11 + num19, ((Object)((Component)item5.m_from).gameObject).name, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 297); } num11 += num15; vars = zdo.Vars; ((ZDOVars)(ref vars)).SetQueued(num11, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 299); inventory2.Save(); num13 += num15; if (num12 != 0) { continue; } break; } if (list != null) { foreach (ServersideQoLZDO item9 in list) { current7.Remove(item9); } } if (num12 == 0) { break; } } } finally { ((IDisposable)enumerator8/*cast due to .constrained prefix*/).Dispose(); } if (num13 != 0) { Processor.ShowMessage((IEnumerable<Peer>)peers, zdo, ConfigBase<Config>.Instance.Localization.Value.FormatOreAdded(prefabInfo.Smelter.m_name, oreItem.m_shared.m_name, num13), ConfigBase<Config>.Instance.OreOrFuelAddedMessageType.Value, (TextType)0); } if (num12 == 0) { break; } } } } SectorDictionary.TryAdd(_smelters, zdo, true); return val; } private void OnContainerChanged(ServersideQoLZDO containerZdo, ContainerState state) { //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) if (_smelters == null) { Processor.Instance<ContainerRegistryProcessor>().ContainerChanged -= OnContainerChanged; } else { if (ExcludedContainers.Contains(containerZdo.ZDO.GetPrefab())) { return; } float num = state.AutoProcessFeedRange ?? ConfigBase<Config>.Instance.FeedFromContainersRange.Value; num *= num; if (num == 0f) { return; } IInventory inventory = state.GetInventory(); if (inventory == null) { return; } List<ItemData> items = inventory.Items; if (items == null || items.Count <= 0) { return; } AdjacentEnumerator<HashSet<ServersideQoLZDO>> enumerator = _smelters.EnumerateAdjacent(containerZdo.ZDO.GetPosition()).GetEnumerator(); try { while (enumerator.MoveNext()) { HashSet<ServersideQoLZDO> current = enumerator.Current; foreach (ServersideQoLZDO item in current) { if (Utils.DistanceSqr(item.ZDO.GetPosition(), containerZdo.ZDO.GetPosition()) <= num) { ((Processor)this).ScheduleReprocessing(item, 0f); } } } } finally { ((IDisposable)enumerator/*cast due to .constrained prefix*/).Dispose(); } } } } }