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 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.0.0.0")] [assembly: AssemblyInformationalVersion("2.0.0+cdafe98fecdc9c33d99ba13f064e37dcaca41712")] [assembly: AssemblyProduct("ServersideQoL.AutoProcess")] [assembly: AssemblyTitle("ServersideQoL.AutoProcess")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/ArgusMagnus/ValheimServersideQoL")] [assembly: AssemblyVersion("2.0.0.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() { 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.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) { if (!EqualityComparer.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 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) { if (!EqualityComparer.Default.Equals(_item, item)) { return -1; } return 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", "2.0.0")] 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 = "2.0.0"; public const string PluginInformationalVersion = "2.0.0"; private DateTimeOffset BuildTimestamp { get; } = new DateTimeOffset(639245732094217313L, 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() { } } 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) { if ((object)this != other) { if (((ProcessorPrefabInfo)this).Equals((ProcessorPrefabInfo)(object)other) && EqualityComparer.Default.Equals(Smelter, other.Smelter) && EqualityComparer.Default.Equals(ShieldGenerator, other.ShieldGenerator)) { return EqualityComparer.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>? _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_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_0d37: Unknown result type (might be due to invalid IL or missing references) //IL_0857: Unknown result type (might be due to invalid IL or missing references) //IL_085c: Unknown result type (might be due to invalid IL or missing references) //IL_08c3: Unknown result type (might be due to invalid IL or missing references) //IL_08d4: Unknown result type (might be due to invalid IL or missing references) //IL_08de: Unknown result type (might be due to invalid IL or missing references) //IL_08e3: 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_08ec: 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_0cfc: Unknown result type (might be due to invalid IL or missing references) //IL_0948: Unknown result type (might be due to invalid IL or missing references) //IL_094d: 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_0464: Unknown result type (might be due to invalid IL or missing references) //IL_07ea: Unknown result type (might be due to invalid IL or missing references) //IL_09a1: Unknown result type (might be due to invalid IL or missing references) //IL_09ad: Unknown result type (might be due to invalid IL or missing references) //IL_04b8: Unknown result type (might be due to invalid IL or missing references) //IL_04c4: Unknown result type (might be due to invalid IL or missing references) //IL_0b06: Unknown result type (might be due to invalid IL or missing references) //IL_0b11: Unknown result type (might be due to invalid IL or missing references) //IL_0b17: Unknown result type (might be due to invalid IL or missing references) //IL_0b28: Unknown result type (might be due to invalid IL or missing references) //IL_0b2d: Unknown result type (might be due to invalid IL or missing references) //IL_0b2e: Unknown result type (might be due to invalid IL or missing references) //IL_061d: Unknown result type (might be due to invalid IL or missing references) //IL_0628: Unknown result type (might be due to invalid IL or missing references) //IL_062e: Unknown result type (might be due to invalid IL or missing references) //IL_063f: Unknown result type (might be due to invalid IL or missing references) //IL_0644: 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_06ed: Unknown result type (might be due to invalid IL or missing references) //IL_06f2: Unknown result type (might be due to invalid IL or missing references) //IL_0bd3: Unknown result type (might be due to invalid IL or missing references) //IL_0bd8: Unknown result type (might be due to invalid IL or missing references) //IL_0c15: Unknown result type (might be due to invalid IL or missing references) //IL_0c1a: 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", 46).Reset((Func>>)(() => (Smelter x) => x.m_maxOre), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 47); } else { zdo.Fields().Reset((Func>>)(() => (ShieldGenerator x) => x.m_maxFuel), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 50); } } 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", 56)) { 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", 61)) { 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", 63)) { 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", 71); } 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", 72)) { val = (ProcessResult)8; } } if (_smelters == null || _containersByItemName == null) { return (ProcessResult)(val | 2); } if (!Processor.CheckMinDistance(peers, zdo, ConfigBase.Instance.FeedFromContainersMinPlayerDistance.Value)) { return (ProcessResult)(val | ((Processor)this).ScheduleReprocessing(0f)); } 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", 88) : zdo.Fields().GetInt((Func>>)(() => (ShieldGenerator x) => x.m_maxFuel), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 89)); 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) { val |= ((Processor)this).ScheduleReprocessing(Processor.Instance().RequestOwnership(item, default(PlayerID), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 149)); 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", 171); 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", 206); 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) { val |= ((Processor)this).ScheduleReprocessing(Processor.Instance().RequestOwnership(item6, default(PlayerID), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 267)); 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", 289); } num11 += num15; vars = zdo.Vars; ((ZDOVars)(ref vars)).SetQueued(num11, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AutoProcess\\SmelterProcessor.cs", 291); 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_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) if (_smelters == null) { throw new Exception("bug"); } 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, 0f); } } } } finally { ((IDisposable)enumerator/*cast due to .constrained prefix*/).Dispose(); } } } }