using 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.Text; using BepInEx; using BepInEx.Configuration; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("ArgusMagnus")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyCopyright("ArgusMagnus")] [assembly: AssemblyDescription("Automatically feeds processing stations such as smelters, kilns, windmills, shield generators, etc. from nearby containers")] [assembly: AssemblyFileVersion("1.99.2.0")] [assembly: AssemblyInformationalVersion("1.99.2-beta+409ce8a87a5191770ee23cbbde9294d6a844dd0b")] [assembly: AssemblyProduct("ServersideQoL.AutoProcess")] [assembly: AssemblyTitle("ServersideQoL.AutoProcess")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/ArgusMagnus/ValheimServersideQoL")] [assembly: AssemblyVersion("1.99.2.0")] [module: RefSafetyRules(11)] [CompilerGenerated] internal sealed class <>z__ReadOnlySingleElementList : IEnumerable, ICollection, IList, IEnumerable, IReadOnlyCollection, IReadOnlyList, ICollection, IList { private sealed class Enumerator : IDisposable, IEnumerator, IEnumerator { object IEnumerator.Current => _item; T IEnumerator.Current => _item; public Enumerator(T item) { _item = item; } bool IEnumerator.MoveNext() { return !_moveNextCalled && (_moveNextCalled = true); } 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.Count => 1; T IReadOnlyList.this[int index] { get { if (index != 0) { throw new IndexOutOfRangeException(); } return _item; } } int ICollection.Count => 1; bool ICollection.IsReadOnly => true; T IList.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.Default.Equals(_item, (T)value); } int IList.IndexOf(object value) { return (!EqualityComparer.Default.Equals(_item, (T)value)) ? (-1) : 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 IEnumerable.GetEnumerator() { return new Enumerator(_item); } void ICollection.Add(T item) { throw new NotSupportedException(); } void ICollection.Clear() { throw new NotSupportedException(); } bool ICollection.Contains(T item) { return EqualityComparer.Default.Equals(_item, item); } void ICollection.CopyTo(T[] array, int arrayIndex) { array[arrayIndex] = _item; } bool ICollection.Remove(T item) { throw new NotSupportedException(); } int IList.IndexOf(T item) { return (!EqualityComparer.Default.Equals(_item, item)) ? (-1) : 0; } void IList.Insert(int index, T item) { throw new NotSupportedException(); } void IList.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", "1.99.2")] public sealed class AutoProcessPlugin : ServersideQoLPluginBase { public const string Author = "ArgusMagnus"; public const string PluginName = "ServersideQoL.AutoProcess"; public const string PluginGuid = "ArgusMagnus.ServersideQoL.AutoProcess"; public const string PluginVersion = "1.99.2"; public const string PluginInformationalVersion = "1.99.2-beta"; internal const string DependencyDirectory = "C:\\repos\\Valheim.ServersideQoL\\Dependencies\\"; private DateTimeOffset BuildTimestamp { get; } = new DateTimeOffset(639207788837708255L, default(TimeSpan)); protected override Config CreateConfigSingleton(ConfigFile configFile, Logger logger) { return new Config(configFile, logger); } protected override void RegisterProcessors(IProcessorCollection processors) { processors.Add(); } private void Awake() { bool flag = true; ServersideQoLPluginBase.Logger.LogWarning((object)string.Format("You are running a pre-release version: {0} ({1})", "1.99.2-beta", BuildTimestamp.LocalDateTime)); } } public sealed class Config : ConfigBase { 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 Section = "AutoProcess"; public override ConfigEntry Enabled { get; } = ConfigBase.BindEx(cfg, "AutoProcess", true, "Enables/disables the entire mod", (AcceptableValueBase)null, (Deprecated)null, "Enabled"); public ConfigEntry FeedFromContainers { get; } = ConfigBase.BindEx(cfg, "AutoProcess", true, "True to automatically feed smelters from nearby containers", (AcceptableValueBase)null, (Deprecated)null, "FeedFromContainers"); public ConfigEntry FeedFromContainersRange { get; } = ConfigBase.BindEx(cfg, "AutoProcess", 4f, "Required proximity of a container to a smelter to be used as feeding source.\r\nCan be overridden per chest with the ServersideQoL.ContainerSigns mod.", (AcceptableValueBase)null, (Deprecated)null, "FeedFromContainersRange"); public int? FeedFromContainersMaxRange => Shared.FeedFromContainersMaxRange?.Value; public ConfigEntry FeedFromContainersMinPlayerDistance { get; } = ConfigBase.BindEx(cfg, "AutoProcess", 4f, "Min distance all players must have to a processing station", (AcceptableValueBase)null, (Deprecated)null, "FeedFromContainersMinPlayerDistance"); public ConfigEntry FeedFromContainersLeaveAtLeastFuel { get; } = ConfigBase.BindEx(cfg, "AutoProcess", 1, "Minimum amount of fuel to leave in a container", (AcceptableValueBase)null, (Deprecated)null, "FeedFromContainersLeaveAtLeastFuel"); public ConfigEntry FeedFromContainersLeaveAtLeastOre { get; } = ConfigBase.BindEx(cfg, "AutoProcess", 1, "Minimum amount of ore to leave in a container", (AcceptableValueBase)null, (Deprecated)null, "FeedFromContainersLeaveAtLeastOre"); public ConfigEntry OreOrFuelAddedMessageType { get; } = ConfigBase.BindEx(cfg, "AutoProcess", (MessageTypes)0, "Type of message to show when ore or fuel is added to a smelter", (AcceptableValueBase)(object)AcceptableEnum.Default, (Deprecated)null, "OreOrFuelAddedMessageType"); public ConfigEntry CapacityMultiplier { get; } = ConfigBase.BindEx(cfg, "AutoProcess", 1f, "Multiply a smelter's ore/fuel capacity by this factor", (AcceptableValueBase)null, (Deprecated)null, "CapacityMultiplier"); public ConfigEntry TimePerProductMultiplier { get; } = ConfigBase.BindEx(cfg, "AutoProcess", 1f, "Multiply the time it takes to produce one product by this factor (will not go below 1 second per product).", (AcceptableValueBase)null, (Deprecated)null, "TimePerProductMultiplier"); public YamlConfigEntry Localization { get; } = ConfigBase.BindYaml(cfg, "Localization"); public Config(ConfigFile cfg, Logger logger) : base(cfg, logger) { } } [Processor("1db73d4d-e930-402f-933e-cb92e5748312")] [RunAfter] public sealed class SmelterProcessor : Processor { 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.Default.GetHashCode(Smelter)) * -1521134295 + EqualityComparer.Default.GetHashCode(ShieldGenerator)) * -1521134295 + EqualityComparer.Default.GetHashCode(HasProduct); } [CompilerGenerated] public sealed override bool Equals(ProcessorPrefabInfo? other) { return ((object)this).Equals((object?)other); } [CompilerGenerated] public bool Equals(PrefabInfo? other) { return (object)this == other || (((ProcessorPrefabInfo)this).Equals((ProcessorPrefabInfo)(object)other) && EqualityComparer.Default.Equals(Smelter, other.Smelter) && EqualityComparer.Default.Equals(ShieldGenerator, other.ShieldGenerator) && EqualityComparer.Default.Equals(HasProduct, other.HasProduct)); } [CompilerGenerated] private PrefabInfo(PrefabInfo original) : base((ProcessorPrefabInfo)(object)original) { Smelter = original.Smelter; ShieldGenerator = original.ShieldGenerator; HasProduct = original.HasProduct; } } private SectorDictionary>? _smelters; private SectorDictionary>? _containersByItemName; protected override void Initialize() { Processor.Instance().ContainerChanged -= OnContainerChanged; if (ConfigBase.Instance.FeedFromContainers.Value) { _smelters = new SectorDictionary>(Mathf.Max(ConfigBase.Instance.FeedFromContainersRange.Value, (float)ConfigBase.Instance.FeedFromContainersMaxRange.GetValueOrDefault())); _containersByItemName = Processor.Instance().GetContainersByItemName(_smelters.SectorWidth); Processor.Instance().ContainerChanged += OnContainerChanged; } else { _smelters = null; _containersByItemName = null; } } protected override ProcessResult Process(ServersideQoLZDO zdo, IReadOnlyList peers, PrefabInfo prefabInfo) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_0209: Unknown result type (might be due to invalid IL or missing references) //IL_02e5: Unknown result type (might be due to invalid IL or missing references) //IL_02e7: Unknown result type (might be due to invalid IL or missing references) //IL_02e8: Unknown result type (might be due to invalid IL or missing references) //IL_02c9: Unknown result type (might be due to invalid IL or missing references) //IL_030e: Unknown result type (might be due to invalid IL or missing references) //IL_0311: Unknown result type (might be due to invalid IL or missing references) //IL_0312: Unknown result type (might be due to invalid IL or missing references) //IL_0ee9: Unknown result type (might be due to invalid IL or missing references) //IL_038d: Unknown result type (might be due to invalid IL or missing references) //IL_0392: Unknown result type (might be due to invalid IL or missing references) //IL_0ee4: Unknown result type (might be due to invalid IL or missing references) //IL_0ee5: Unknown result type (might be due to invalid IL or missing references) //IL_095d: Unknown result type (might be due to invalid IL or missing references) //IL_0962: Unknown result type (might be due to invalid IL or missing references) //IL_09d3: Unknown result type (might be due to invalid IL or missing references) //IL_09e4: Unknown result type (might be due to invalid IL or missing references) //IL_09ee: Unknown result type (might be due to invalid IL or missing references) //IL_09f3: Unknown result type (might be due to invalid IL or missing references) //IL_09f7: Unknown result type (might be due to invalid IL or missing references) //IL_09fc: Unknown result type (might be due to invalid IL or missing references) //IL_043f: Unknown result type (might be due to invalid IL or missing references) //IL_0450: Unknown result type (might be due to invalid IL or missing references) //IL_045a: Unknown result type (might be due to invalid IL or missing references) //IL_045f: Unknown result type (might be due to invalid IL or missing references) //IL_0463: Unknown result type (might be due to invalid IL or missing references) //IL_0468: Unknown result type (might be due to invalid IL or missing references) //IL_0e9c: Unknown result type (might be due to invalid IL or missing references) //IL_08d8: Unknown result type (might be due to invalid IL or missing references) //IL_0a6a: Unknown result type (might be due to invalid IL or missing references) //IL_0a6f: Unknown result type (might be due to invalid IL or missing references) //IL_04d6: Unknown result type (might be due to invalid IL or missing references) //IL_04db: Unknown result type (might be due to invalid IL or missing references) //IL_0ac6: Unknown result type (might be due to invalid IL or missing references) //IL_0ad2: Unknown result type (might be due to invalid IL or missing references) //IL_0532: Unknown result type (might be due to invalid IL or missing references) //IL_053e: Unknown result type (might be due to invalid IL or missing references) //IL_07b4: Unknown result type (might be due to invalid IL or missing references) //IL_07b9: Unknown result type (might be due to invalid IL or missing references) //IL_0d45: Unknown result type (might be due to invalid IL or missing references) //IL_0d4a: Unknown result type (might be due to invalid IL or missing references) //IL_0d8e: Unknown result type (might be due to invalid IL or missing references) //IL_0d93: Unknown result type (might be due to invalid IL or missing references) ProcessResult val = (ProcessResult)0; if (ConfigBase.Instance.CapacityMultiplier.Value == 1f) { if (prefabInfo.Smelter != null) { zdo.Fields().Reset((Func>>)(() => (Smelter x) => x.m_maxFuel), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 44).Reset((Func>>)(() => (Smelter x) => x.m_maxOre), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 45); } else { zdo.Fields().Reset((Func>>)(() => (ShieldGenerator x) => x.m_maxFuel), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 48); } } else if (prefabInfo.ShieldGenerator != null) { if (zdo.Fields().UpdateValue((Func>>)(() => (ShieldGenerator x) => x.m_maxFuel), Mathf.RoundToInt(ConfigBase.Instance.CapacityMultiplier.Value * (float)prefabInfo.ShieldGenerator.m_maxFuel), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 54)) { val = (ProcessResult)8; } } else if (prefabInfo.Smelter != null) { if (zdo.Fields().UpdateValue((Func>>)(() => (Smelter x) => x.m_maxFuel), Mathf.RoundToInt(ConfigBase.Instance.CapacityMultiplier.Value * (float)prefabInfo.Smelter.m_maxFuel), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 59)) { val = (ProcessResult)8; } if (zdo.Fields().UpdateValue((Func>>)(() => (Smelter x) => x.m_maxOre), Mathf.RoundToInt(ConfigBase.Instance.CapacityMultiplier.Value * (float)prefabInfo.Smelter.m_maxOre), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 61)) { val = (ProcessResult)8; } } if (prefabInfo.HasProduct) { if (ConfigBase.Instance.TimePerProductMultiplier.Value == 1f) { zdo.Fields().Reset((Func>>)(() => (Smelter x) => x.m_secPerProduct), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 69); } else if (zdo.Fields().UpdateValue((Func>>)(() => (Smelter x) => x.m_secPerProduct), Mathf.Max(1f, prefabInfo.Smelter.m_secPerProduct * ConfigBase.Instance.TimePerProductMultiplier.Value), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 70)) { val = (ProcessResult)8; } } if (_smelters == null || _containersByItemName == null) { return (ProcessResult)(val | 2); } if (!Processor.CheckMinDistance(peers, zdo, ConfigBase.Instance.FeedFromContainersMinPlayerDistance.Value)) { return (ProcessResult)(val | 0x20); } List list = null; List list2 = null; int num = ((prefabInfo.Smelter != null) ? zdo.Fields().GetInt((Func>>)(() => (Smelter x) => x.m_maxFuel), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 86) : zdo.Fields().GetInt((Func>>)(() => (ShieldGenerator x) => x.m_maxFuel), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 87)); 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(prefabInfo.Smelter.m_fuelItem.m_itemData)) { int num4 = 0; AdjacentEnumerator> enumerator2 = _containersByItemName.EnumerateAdjacent((zdo.ZDO.GetPosition(), SharedItemDataKey.op_Implicit(fuelItem.m_shared))).GetEnumerator(); try { while (enumerator2.MoveNext()) { HashSet current = enumerator2.Current; list?.Clear(); foreach (ServersideQoLZDO item in current) { ContainerState state = Processor.Instance().GetState(item); if (state == null) { (list ?? (list = new List())).Add(item); continue; } vars = item.Vars; if (((ZDOVars)(ref vars)).GetInUse(false)) { continue; } float num5 = state.FeedRange ?? ConfigBase.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.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(num3, item2.m_stack); int num9 = Math.Min(num8, num7); num7 -= num9; num8 -= num9; if (num8 != 0) { if (!item.IsOwnerOrUnassigned()) { flag2 = true; break; } num6 += num8; item2.m_stack -= num8; if (item2.m_stack == 0) { (list2 ?? (list2 = new List())).Add(item2); } num3 -= num8; if (num3 == 0) { break; } } } if (flag2) { Processor.Instance().RequestOwnership(item, 0L, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 147); continue; } if (num6 == 0) { if (!flag) { (list ?? (list = new List())).Add(item); } continue; } if (list2 != null && list2.Count > 0) { foreach (ItemData item3 in list2) { inventory.Items.Remove(item3); } List items = inventory.Items; if (items != null && items.Count == 0) { (list ?? (list = new List())).Add(item); } } zdo.ReleaseOwnership(); num2 += (float)num6; vars = zdo.Vars; ((ZDOVars)(ref vars)).SetFuel(num2, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 169); 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)peers, zdo, ConfigBase.Instance.Localization.Value.FormatFuelAdded(prefabInfo.Smelter?.m_name ?? prefabInfo.ShieldGenerator.m_name, fuelItem.m_shared.m_name, num4), ConfigBase.Instance.OreOrFuelAddedMessageType.Value, (TextType)0); } if (num3 == 0) { break; } } } if (prefabInfo.Smelter != null) { int num10 = zdo.Fields().GetInt((Func>>)(() => (Smelter x) => x.m_maxOre), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 204); 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> enumerator8 = _containersByItemName.EnumerateAdjacent((zdo.ZDO.GetPosition(), SharedItemDataKey.op_Implicit(oreItem.m_shared))).GetEnumerator(); try { while (enumerator8.MoveNext()) { HashSet current7 = enumerator8.Current; list?.Clear(); foreach (ServersideQoLZDO item6 in current7) { ContainerState state2 = Processor.Instance().GetState(item6); if (state2 == null) { (list ?? (list = new List())).Add(item6); continue; } vars = item6.Vars; if (((ZDOVars)(ref vars)).GetInUse(false)) { continue; } float num14 = state2.FeedRange ?? ConfigBase.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.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(num12, item7.m_stack); int num18 = Math.Min(num17, num16); num16 -= num18; num17 -= num18; if (num17 != 0) { if (!item6.IsOwnerOrUnassigned()) { flag4 = true; break; } num15 += num17; item7.m_stack -= num17; if (item7.m_stack == 0) { (list2 ?? (list2 = new List())).Add(item7); } num12 -= num17; if (num12 == 0) { break; } } } if (flag4) { Processor.Instance().RequestOwnership(item6, 0L, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 265); continue; } if (num15 == 0) { if (!flag3) { (list ?? (list = new List())).Add(item6); } continue; } if (list2 != null && list2.Count > 0) { foreach (ItemData item8 in list2) { inventory2.Items.Remove(item8); } List items = inventory2.Items; if (items != null && items.Count == 0) { (list ?? (list = new List())).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", 287); } num11 += num15; vars = zdo.Vars; ((ZDOVars)(ref vars)).SetQueued(num11, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 289); 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)peers, zdo, ConfigBase.Instance.Localization.Value.FormatOreAdded(prefabInfo.Smelter.m_name, oreItem.m_shared.m_name, num13), ConfigBase.Instance.OreOrFuelAddedMessageType.Value, (TextType)0); } if (num12 == 0) { break; } } } } SectorDictionary.TryAdd(_smelters, zdo, true); return val; } private void OnContainerChanged(ServersideQoLZDO containerZdo, ContainerState state) { //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0096: 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_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) if (_smelters == null) { return; } float num = state.FeedRange ?? ConfigBase.Instance.FeedFromContainersRange.Value; num *= num; if (num == 0f) { return; } IInventory inventory = state.GetInventory(); if (inventory == null) { return; } List items = inventory.Items; if (items == null || items.Count <= 0) { return; } AdjacentEnumerator> enumerator = _smelters.EnumerateAdjacent(containerZdo.ZDO.GetPosition()).GetEnumerator(); try { while (enumerator.MoveNext()) { HashSet current = enumerator.Current; foreach (ServersideQoLZDO item in current) { if (Utils.DistanceSqr(item.ZDO.GetPosition(), containerZdo.ZDO.GetPosition()) <= num) { ((Processor)this).ScheduleReprocessing(item); } } } } finally { ((IDisposable)enumerator/*cast due to .constrained prefix*/).Dispose(); } } } }