using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text; using 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("Ballista don't target players or tames and reload from nearby containers.")] [assembly: AssemblyFileVersion("2.0.0.0")] [assembly: AssemblyInformationalVersion("2.0.0+cdafe98fecdc9c33d99ba13f064e37dcaca41712")] [assembly: AssemblyProduct("ServersideQoL.SmartDefense")] [assembly: AssemblyTitle("ServersideQoL.SmartDefense")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/ArgusMagnus/ValheimServersideQoL")] [assembly: AssemblyVersion("2.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ServersideQoL.SmartDefense { public sealed class Config : ConfigBase { public sealed class TurretsConfig { public ConfigEntry DontTargetPlayers { get; } = ConfigBase.BindEx(cfg, section, true, "True to stop ballistas from targeting players", (AcceptableValueBase)null, (Deprecated)null, "DontTargetPlayers"); public ConfigEntry DontTargetTames { get; } = ConfigBase.BindEx(cfg, section, true, "True to stop ballistas from targeting tames", (AcceptableValueBase)null, (Deprecated)null, "DontTargetTames"); public ConfigEntry LoadFromContainers { get; } = ConfigBase.BindEx(cfg, section, true, "True to automatically load ballistas from containers", (AcceptableValueBase)null, (Deprecated)null, "LoadFromContainers"); public ConfigEntry LoadFromContainersRange { get; } = ConfigBase.BindEx(cfg, section, 4f, "Required proximity of a container to a ballista to be used as ammo source", (AcceptableValueBase)null, (Deprecated)null, "LoadFromContainersRange"); public int? FeedFromContainersMaxRange => Shared.FeedFromContainersMaxRange?.Value; public ConfigEntry LoadFromContainersMinPlayerDistance { get; } = ConfigBase.BindEx(cfg, section, 4f, "Min distance all players must have to a ballista", (AcceptableValueBase)null, (Deprecated)null, "LoadFromContainersMinPlayerDistance"); public ConfigEntry AmmoAddedMessageType { get; } = ConfigBase.BindEx(cfg, section, (MessageTypes)0, "Type of message to show when ammo is added to a turret", (AcceptableValueBase)(object)AcceptableEnum.Default, (Deprecated)null, "AmmoAddedMessageType"); public ConfigEntry NoAmmoMessageType { get; } = ConfigBase.BindEx(cfg, section, (MessageTypes)0, "Type of message to show when there is no ammo to add to a turret", (AcceptableValueBase)(object)AcceptableEnum.Default, (Deprecated)null, "NoAmmoMessageType"); public TurretsConfig(ConfigFile cfg, [CallerMemberName] string section = null) { } } public sealed class TrapsConfig { public ConfigEntry DisableTriggeredByPlayers { get; } = ConfigBase.BindEx(cfg, section, true, "True to stop traps from being triggered by players", (AcceptableValueBase)null, (Deprecated)null, "DisableTriggeredByPlayers"); public ConfigEntry DisableFriendlyFire { get; } = ConfigBase.BindEx(cfg, section, true, "True to stop traps from damaging players and tames. Does not work reliably (yet).", (AcceptableValueBase)null, (Deprecated)null, "DisableFriendlyFire"); public ConfigEntry SelfDamageMultiplier { get; } = ConfigBase.BindEx(cfg, section, 1f, "Multiply the damage the trap takes when it is triggered by this factor. 0 to make the trap take no damage", (AcceptableValueBase)(object)new AcceptableValueRange(0f, float.PositiveInfinity), (Deprecated)null, "SelfDamageMultiplier"); public ConfigEntry AutoRearm { get; } = ConfigBase.BindEx(cfg, section, true, "True to automatically rearm traps when they are triggered", (AcceptableValueBase)null, (Deprecated)null, "AutoRearm"); public TrapsConfig(ConfigFile cfg, [CallerMemberName] string section = null) { } } public sealed class LocalizationConfig { public sealed class TurretsConfig { private string AmmoAdded { get; init; } = "{0}: $msg_added {1} {2}x"; public string NoAmmoFound { get; init; } = "$msg_noturretammo"; public string FormatAmmoAdded(string turretName, string itemName, int count) { return string.Format(AmmoAdded, turretName, itemName, count); } } public TurretsConfig Turrets { get; init; } = new TurretsConfig(); } public override ConfigEntry Enabled { get; } = ConfigBase.BindEx(cfg, "SmartDefense", true, "Enables/disables the entire mod", (AcceptableValueBase)null, (Deprecated)null, "Enabled"); public TurretsConfig Turrets { get; } = new TurretsConfig(cfg, "Turrets"); public TrapsConfig Traps { get; } = new TrapsConfig(cfg, "Traps"); public YamlConfigEntry Localization { get; } = ConfigBase.BindYaml(cfg, "Localization"); public Config(ConfigFile cfg, Logger logger) : base(cfg, logger) { } } [BepInPlugin("ArgusMagnus.ServersideQoL.SmartDefense", "ServersideQoL.SmartDefense", "2.0.0")] public sealed class SmartDefensePlugin : ServersideQoLPluginBase { public const string Author = "ArgusMagnus"; public const string PluginName = "ServersideQoL.SmartDefense"; public const string PluginGuid = "ArgusMagnus.ServersideQoL.SmartDefense"; public const string PluginVersion = "2.0.0"; public const string PluginInformationalVersion = "2.0.0"; private DateTimeOffset BuildTimestamp { get; } = new DateTimeOffset(639245732011738877L, default(TimeSpan)); protected override Config CreateConfigSingleton(ConfigFile configFile, Logger logger) { return new Config(configFile, logger); } protected override void RegisterProcessors(IProcessorCollection processors) { processors.Add().Add(); } private void Awake() { } } [Processor("983b37e4-1777-42b0-be4a-90b72e2f96d8")] public sealed class TrapsProcessor : Processor { public sealed record PrefabInfo(Aoe Aoe, Piece Piece, PieceTable PieceTable, Trap? Trap) : 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("Aoe = "); builder.Append(Aoe); builder.Append(", Piece = "); builder.Append(Piece); builder.Append(", PieceTable = "); builder.Append(PieceTable); builder.Append(", Trap = "); builder.Append(Trap); return true; } [CompilerGenerated] public override int GetHashCode() { return (((((ProcessorPrefabInfo)this).GetHashCode() * -1521134295 + EqualityComparer.Default.GetHashCode(Aoe)) * -1521134295 + EqualityComparer.Default.GetHashCode(Piece)) * -1521134295 + EqualityComparer.Default.GetHashCode(PieceTable)) * -1521134295 + EqualityComparer.Default.GetHashCode(Trap); } [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(Aoe, other.Aoe) && EqualityComparer.Default.Equals(Piece, other.Piece) && EqualityComparer.Default.Equals(PieceTable, other.PieceTable)) { return EqualityComparer.Default.Equals(Trap, other.Trap); } return false; } return true; } [CompilerGenerated] private PrefabInfo(PrefabInfo original) : base((ProcessorPrefabInfo)(object)original) { Aoe = original.Aoe; Piece = original.Piece; PieceTable = original.PieceTable; Trap = original.Trap; } } public const string Id = "983b37e4-1777-42b0-be4a-90b72e2f96d8"; private readonly Dictionary _rearmAfter = new Dictionary(); protected override void Initialize() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) _rearmAfter.Clear(); Intercept.UpdateInterception(Trap.OnStateChanged, (Delegate)new Action(RPC_OnStateChanged), ConfigBase.Instance.Traps.AutoRearm.Value); } protected override ProcessResult Process(ServersideQoLZDO zdo, IReadOnlyList peers, PrefabInfo prefabInfo) { //IL_006a: 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_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007b: 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_0082: 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_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_011a: 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_011d: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: 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_0205: Unknown result type (might be due to invalid IL or missing references) //IL_0207: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) if (ConfigBase.Instance.Traps.AutoRearm.Value && _rearmAfter.Remove(zdo, out var value)) { Timestamp now = Timestamp.Now; if (now < value) { _rearmAfter.Add(zdo, value); return ((Processor)this).ScheduleReprocessing(((Timestamp)(ref value)).Seconds - ((Timestamp)(ref now)).Seconds); } if (prefabInfo.Trap != null) { RPC.RequestStateChange(zdo, 1); } return (ProcessResult)0; } ZDOVars vars = zdo.Vars; PlayerID val = default(PlayerID); val = ((ZDOVars)(ref vars)).GetCreator(val); if (((PlayerID)(ref val)).Value == 0L) { return (ProcessResult)2; } ProcessResult val2 = (ProcessResult)0; if (prefabInfo.Trap != null) { if (!ConfigBase.Instance.Traps.DisableTriggeredByPlayers.Value) { zdo.Fields().Reset((Func>>)(() => (Trap x) => x.m_triggeredByPlayers), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.SmartDefense\\TrapsProcessor.cs", 45); } else if (zdo.Fields().UpdateValue((Func>>)(() => (Trap x) => x.m_triggeredByPlayers), false, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.SmartDefense\\TrapsProcessor.cs", 46)) { val2 = (ProcessResult)(val2 | 8); } } ComponentFieldAccessor val3 = zdo.Fields(); if (!ConfigBase.Instance.Traps.DisableFriendlyFire.Value) { val3.Reset((Func>>)(() => (Aoe x) => x.m_hitFriendly), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.SmartDefense\\TrapsProcessor.cs", 52); } else if (val3.UpdateValue((Func>>)(() => (Aoe x) => x.m_hitFriendly), false, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.SmartDefense\\TrapsProcessor.cs", 53)) { val2 = (ProcessResult)(val2 | 8); } if (val3.UpdateValue((Func>>)(() => (Aoe x) => x.m_damageSelf), prefabInfo.Aoe.m_damageSelf * ConfigBase.Instance.Traps.SelfDamageMultiplier.Value, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.SmartDefense\\TrapsProcessor.cs", 56)) { val2 = (ProcessResult)(val2 | 8); } if (!ConfigBase.Instance.Traps.AutoRearm.Value) { val2 = (ProcessResult)(val2 | 2); } return val2; } private void RPC_OnStateChanged(ServersideQoLZDO zdo, int state, long idOfClientModifyingState) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) if (state == 0) { Trap val = Processor.GetProcessorPrefabInfo(zdo)?.Trap; if (val != null) { Dictionary rearmAfter = _rearmAfter; Timestamp now = Timestamp.Now; rearmAfter[zdo] = ((Timestamp)(ref now)).AddSeconds((float)val.m_rearmCooldown); } } } } [Processor("bd1d9b45-ebcc-4217-a4a8-129c4a8be605")] [DependsOn] public sealed class TurretProcessor : Processor { public sealed record PrefabInfo(Turret Turret, Piece Piece, PieceTable PieceTable) : 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("Turret = "); builder.Append(Turret); builder.Append(", Piece = "); builder.Append(Piece); builder.Append(", PieceTable = "); builder.Append(PieceTable); return true; } [CompilerGenerated] public override int GetHashCode() { return ((((ProcessorPrefabInfo)this).GetHashCode() * -1521134295 + EqualityComparer.Default.GetHashCode(Turret)) * -1521134295 + EqualityComparer.Default.GetHashCode(Piece)) * -1521134295 + EqualityComparer.Default.GetHashCode(PieceTable); } [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(Turret, other.Turret) && EqualityComparer.Default.Equals(Piece, other.Piece)) { return EqualityComparer.Default.Equals(PieceTable, other.PieceTable); } return false; } return true; } [CompilerGenerated] private PrefabInfo(PrefabInfo original) : base((ProcessorPrefabInfo)(object)original) { Turret = original.Turret; Piece = original.Piece; PieceTable = original.PieceTable; } } public const string Id = "bd1d9b45-ebcc-4217-a4a8-129c4a8be605"; private SectorDictionary>? _turrets; private SectorDictionary>? _containersByItemName; protected override void Initialize() { Processor.Instance().ContainerChanged -= OnContainerChanged; if (ConfigBase.Instance.Turrets.LoadFromContainers.Value) { _turrets = new SectorDictionary>(Mathf.Max(ConfigBase.Instance.Turrets.LoadFromContainersRange.Value, (float)ConfigBase.Instance.Turrets.FeedFromContainersMaxRange.GetValueOrDefault())); _containersByItemName = Processor.Instance().GetContainersByItemName(_turrets.SectorWidth); Processor.Instance().ContainerChanged += OnContainerChanged; } else { _turrets = 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_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: 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_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: 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_011b: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: 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_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01e2: Unknown result type (might be due to invalid IL or missing references) //IL_01e9: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Unknown result type (might be due to invalid IL or missing references) //IL_0223: Unknown result type (might be due to invalid IL or missing references) //IL_023a: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_0249: Unknown result type (might be due to invalid IL or missing references) //IL_02e2: Unknown result type (might be due to invalid IL or missing references) //IL_02f8: Unknown result type (might be due to invalid IL or missing references) //IL_0302: Unknown result type (might be due to invalid IL or missing references) //IL_0307: Unknown result type (might be due to invalid IL or missing references) //IL_030b: Unknown result type (might be due to invalid IL or missing references) //IL_0310: Unknown result type (might be due to invalid IL or missing references) //IL_071f: Unknown result type (might be due to invalid IL or missing references) //IL_0772: Unknown result type (might be due to invalid IL or missing references) //IL_0759: Unknown result type (might be due to invalid IL or missing references) //IL_03b8: Unknown result type (might be due to invalid IL or missing references) //IL_03c4: Unknown result type (might be due to invalid IL or missing references) //IL_03d7: Unknown result type (might be due to invalid IL or missing references) //IL_03dc: Unknown result type (might be due to invalid IL or missing references) //IL_0529: Unknown result type (might be due to invalid IL or missing references) //IL_0534: Unknown result type (might be due to invalid IL or missing references) //IL_053a: Unknown result type (might be due to invalid IL or missing references) //IL_054b: Unknown result type (might be due to invalid IL or missing references) //IL_0550: Unknown result type (might be due to invalid IL or missing references) //IL_0551: Unknown result type (might be due to invalid IL or missing references) //IL_05f7: Unknown result type (might be due to invalid IL or missing references) //IL_05fc: Unknown result type (might be due to invalid IL or missing references) //IL_0611: Unknown result type (might be due to invalid IL or missing references) //IL_0616: 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; } ProcessResult val2 = (ProcessResult)0; ComponentFieldAccessor val3 = zdo.Fields(); if (!ConfigBase.Instance.Turrets.DontTargetPlayers.Value) { val3.Reset((Func>>)(() => (Turret x) => x.m_targetPlayers), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.SmartDefense\\TurretProcessor.cs", 44); } else if (val3.UpdateValue((Func>>)(() => (Turret x) => x.m_targetPlayers), false, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.SmartDefense\\TurretProcessor.cs", 45)) { val2 = (ProcessResult)(val2 | 8); } if (!ConfigBase.Instance.Turrets.DontTargetTames.Value) { val3.Reset((Func>>)(() => (Turret x) => x.m_targetTamed), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.SmartDefense\\TurretProcessor.cs", 49); } else if (val3.UpdateValue((Func>>)(() => (Turret x) => x.m_targetTamed), false, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.SmartDefense\\TurretProcessor.cs", 50)) { val2 = (ProcessResult)(val2 | 8); } if (!ConfigBase.Instance.Turrets.DontTargetTames.Value) { val3.Reset((Func>>)(() => (Turret x) => x.m_targetTamedConfig), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.SmartDefense\\TurretProcessor.cs", 54); } else if (val3.UpdateValue((Func>>)(() => (Turret x) => x.m_targetTamedConfig), false, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.SmartDefense\\TurretProcessor.cs", 55)) { val2 = (ProcessResult)(val2 | 8); } if (!ConfigBase.Instance.Turrets.LoadFromContainers.Value) { return (ProcessResult)(val2 | 2); } if (_turrets == null || _containersByItemName == null) { return (ProcessResult)(val2 | 2); } if (!Processor.CheckMinDistance(peers, zdo, ConfigBase.Instance.Turrets.LoadFromContainersMinPlayerDistance.Value)) { return (ProcessResult)(val2 | ((Processor)this).ScheduleReprocessing(0f)); } int num = val3.GetInt((Func>>)(() => (Turret x) => x.m_maxAmmo), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.SmartDefense\\TurretProcessor.cs", 70); vars = zdo.Vars; int num2 = ((ZDOVars)(ref vars)).GetAmmo(0); int num3 = num - num2; if (num3 < num / 2) { return val2; } object obj; if (num2 <= 0) { obj = null; } else { vars = zdo.Vars; obj = ((ZDOVars)(ref vars)).GetAmmoType(""); } string text = (string)obj; ItemData val4 = null; int num4 = 0; List list = null; List list2 = null; foreach (ItemDrop ammoItem in prefabInfo.Turret.m_allowedAmmo.Select((AmmoType x) => x.m_ammo)) { if (!string.IsNullOrEmpty(text) && ((Object)ammoItem).name != text) { continue; } AdjacentEnumerator> enumerator2 = _containersByItemName.EnumerateAdjacent((zdo.ZDO.GetPosition(), SharedItemDataKey.op_Implicit(ammoItem.m_itemData.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; } float num5 = state.FeedRange ?? ConfigBase.Instance.Turrets.LoadFromContainersRange.Value; num5 *= num5; if (num5 == 0f || Utils.DistanceSqr(zdo.ZDO.GetPosition(), item.ZDO.GetPosition()) > num5) { continue; } vars = item.Vars; if (((ZDOVars)(ref vars)).GetInUse(false)) { continue; } IInventory inventory = state.GetInventory(); list2?.Clear(); int num6 = 0; bool flag = false; bool flag2 = false; foreach (ItemData item2 in from x in inventory.Items where new ItemDataKey(x) == ItemDataKey.op_Implicit(ammoItem.m_itemData) orderby x.m_stack select x) { flag = flag || (item2 != null && item2.m_stack > 0); int num7 = Math.Min(num3, item2.m_stack); if (num7 != 0) { if (!item.IsOwnerOrUnassigned()) { flag2 = true; break; } text = ((Object)ammoItem).name; val4 = ammoItem.m_itemData; num6 += num7; item2.m_stack -= num7; if (item2.m_stack == 0) { (list2 ?? (list2 = new List())).Add(item2); } num3 -= num7; if (num3 == 0) { break; } } } if (flag2) { ProcessResult val5 = val2; ContainerRegistryProcessor obj2 = Processor.Instance(); val = default(PlayerID); val2 = (ProcessResult)(val5 | ((Processor)this).ScheduleReprocessing(obj2.RequestOwnership(item, val, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.SmartDefense\\TurretProcessor.cs", 139))); 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); } } num2 += num6; vars = zdo.Vars; ((ZDOVars)(ref vars)).SetAmmo(num2, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.SmartDefense\\TurretProcessor.cs", 160); vars = zdo.Vars; ((ZDOVars)(ref vars)).SetAmmoType(text, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.SmartDefense\\TurretProcessor.cs", 161); 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 (num3 == 0) { break; } } if (num4 != 0) { Processor.ShowMessage((IEnumerable)peers, zdo, ConfigBase.Instance.Localization.Value.Turrets.FormatAmmoAdded(prefabInfo.Piece.m_name, val4.m_shared.m_name, num4), ConfigBase.Instance.Turrets.AmmoAddedMessageType.Value, (TextType)0); } else if (num2 == 0) { Processor.ShowMessage((IEnumerable)peers, zdo, ConfigBase.Instance.Localization.Value.Turrets.NoAmmoFound, ConfigBase.Instance.Turrets.NoAmmoMessageType.Value, (TextType)7); } SectorDictionary.TryAdd(_turrets, zdo, true); return val2; } private void OnContainerChanged(ServersideQoLZDO containerZdo, ContainerState state) { //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_0082: 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_008b: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) if (_turrets == null) { throw new Exception("bug"); } float num = state.FeedRange ?? ConfigBase.Instance.Turrets.LoadFromContainersRange.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 = _turrets.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(); } } } }