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 Player v2.4.3
ServersideQoL.Player.dll
Decompiled a week agousing System; using System.Collections; 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.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("Configure some apsects around the player (e.g. infinite stamina for various activities, methods to permanently unlock item effects such as increased carry weight)")] [assembly: AssemblyFileVersion("2.4.3.0")] [assembly: AssemblyInformationalVersion("2.4.3+f0835f4ca84c6b51687177e6c1c8a8ebc98bae7c")] [assembly: AssemblyProduct("ServersideQoL.Player")] [assembly: AssemblyTitle("ServersideQoL.Player")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/ArgusMagnus/ValheimServersideQoL")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.4.3.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(); } } 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.Player { public sealed class Config : ConfigBase<Config> { public sealed class LocalizationConfig { public string SacrificedMegingjord { get; init; } = "You were permanently granted increased carrying weight"; public string SacrificedCryptKey { get; init; } = "You were permanently granted the ability to open sunken crypt doors"; public string SacrificedWishbone { get; init; } = "You were permanently granted the ability to sense hidden objects"; public string SacrificedTornSpirit { get; init; } = "You were permanently granted a wisp companion"; } 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> InfiniteBuildingStamina { get; } = ConfigBase<Config>.BindEx<bool>(cfg, false, GetInfiniteXDescription("building"), (IAcceptableValueBase<bool>)null, (Deprecated<Config>)null, "InfiniteBuildingStamina"); public ConfigEntry<bool> InfiniteFarmingStamina { get; } = ConfigBase<Config>.BindEx<bool>(cfg, false, GetInfiniteXDescription("farming"), (IAcceptableValueBase<bool>)null, (Deprecated<Config>)null, "InfiniteFarmingStamina"); public ConfigEntry<bool> InfiniteMiningStamina { get; } = ConfigBase<Config>.BindEx<bool>(cfg, false, GetInfiniteXDescription("mining"), (IAcceptableValueBase<bool>)null, (Deprecated<Config>)null, "InfiniteMiningStamina"); public ConfigEntry<bool> InfiniteWoodCuttingStamina { get; } = ConfigBase<Config>.BindEx<bool>(cfg, false, GetInfiniteXDescription("cutting wood"), (IAcceptableValueBase<bool>)null, (Deprecated<Config>)null, "InfiniteWoodCuttingStamina"); public ConfigEntry<bool> InfiniteEncumberedStamina { get; } = ConfigBase<Config>.BindEx<bool>(cfg, false, GetInfiniteXDescription("encumbered"), (IAcceptableValueBase<bool>)null, (Deprecated<Config>)null, "InfiniteEncumberedStamina"); public ConfigEntry<bool> InfiniteSneakingStamina { get; } = ConfigBase<Config>.BindEx<bool>(cfg, false, GetInfiniteXDescription("sneaking"), (IAcceptableValueBase<bool>)null, (Deprecated<Config>)null, "InfiniteSneakingStamina"); public ConfigEntry<bool> InfiniteSwimmingStamina { get; } = ConfigBase<Config>.BindEx<bool>(cfg, false, GetInfiniteXDescription("swimming"), (IAcceptableValueBase<bool>)null, (Deprecated<Config>)null, "InfiniteSwimmingStamina"); public ConfigEntry<Emotes> OpenCartEmote { get; } public ConfigEntry<bool> CanSacrificeMegingjord { get; } public ConfigEntry<bool> CanSacrificeCryptKey { get; } public ConfigEntry<bool> CanSacrificeWishbone { get; } public ConfigEntry<bool> CanSacrificeTornSpirit { get; } public YamlConfigEntry<LocalizationConfig> Localization { get; } public Config(ConfigFile cfg, Logger logger) { string text = $"Emote to open the inventory of an attached cart.\r\n{(object)(Emotes)(-1)} to disable this feature, {(object)(Emotes)(-2)} to use any emote as trigger.\r\nYou can bind emotes to buttons with chat commands.\r\nFor example, on xbox you can bind the Y-Button to the wave-emote by entering \"/bind JoystickButton3 {(object)(Emotes)0}\" in the in-game chat.\r\nIf you use emotes exclusively for this feature, it is recommended to set the value to {(object)(Emotes)(-2)} as it is more reliably detected than specific emotes, especially on bad connection/with crossplay."; List<Emotes> list = new List<Emotes>(); list.Add((Emotes)(-1)); list.Add((Emotes)(-2)); list.AddRange(Enum.GetValues(typeof(Emotes)).Cast<Emotes>()); OpenCartEmote = ConfigBase<Config>.BindEx<Emotes>(cfg, (Emotes)(-1), text, (IAcceptableValueBase<Emotes>)(object)new AcceptableEnum<Emotes>((IEnumerable<Emotes>)new <>z__ReadOnlyList<Emotes>(list)), (Deprecated<Config>)null, "OpenCartEmote"); CanSacrificeMegingjord = ConfigBase<Config>.BindEx<bool>(cfg, false, "If true, players can permanently unlock increased carrying weight by sacrificing a megingjord in an obliterator", (IAcceptableValueBase<bool>)null, (Deprecated<Config>)null, "CanSacrificeMegingjord"); CanSacrificeCryptKey = ConfigBase<Config>.BindEx<bool>(cfg, false, "If true, players can permanently unlock the ability to open sunken crypt doors by sacrificing a crypt key in an obliterator", (IAcceptableValueBase<bool>)null, (Deprecated<Config>)null, "CanSacrificeCryptKey"); CanSacrificeWishbone = ConfigBase<Config>.BindEx<bool>(cfg, false, "If true, players can permanently unlock the ability to sense hidden objects by sacrificing a wishbone in an obliterator", (IAcceptableValueBase<bool>)null, (Deprecated<Config>)null, "CanSacrificeWishbone"); CanSacrificeTornSpirit = ConfigBase<Config>.BindEx<bool>(cfg, false, "If true, players can permanently unlock a wisp companion by sacrificing a torn spirit in an obliterator.\r\nWARNING: Wisp companion cannot be unsummoned and will stay as long as this setting is enabled.", (IAcceptableValueBase<bool>)null, (Deprecated<Config>)null, "CanSacrificeTornSpirit"); Localization = ConfigBase<Config>.BindYaml<LocalizationConfig>(cfg, "Localization"); base..ctor(cfg, logger); } private static string GetInfiniteXDescription(string action) { return FormattableString.Invariant(FormattableStringFactory.Create("True to give players infinite stamina when {0}.\r\nPlayer stamina will still be drained, but when nearly depleted, just enough stamina will be restored to continue indefinitely.\r\nIf you want infinite stamina in general, set the global key '{1}' to 0.", action, "StaminaRate")); } } [Processor("28b93edf-6ede-4dbe-92ed-99275be3915f")] public sealed class CryptDoorProcessor : Processor<CryptDoorProcessor.PrefabInfo> { public sealed record PrefabInfo(Door Door) : 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("Door = "); builder.Append(Door); return true; } [CompilerGenerated] public override int GetHashCode() { return ((ProcessorPrefabInfo)this).GetHashCode() * -1521134295 + EqualityComparer<Door>.Default.GetHashCode(Door); } [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<Door>.Default.Equals(Door, other.Door); } return false; } return true; } [CompilerGenerated] private PrefabInfo(PrefabInfo original) : base((ProcessorPrefabInfo)(object)original) { Door = original.Door; } } private readonly List<ServersideQoLZDO> _allowedPlayers = new List<ServersideQoLZDO>(); private readonly Dictionary<int, int> _keyItemWeightByHash = new Dictionary<int, int>(); protected override void Initialize() { _allowedPlayers.Clear(); _keyItemWeightByHash.Clear(); } protected override ProcessResult Process(ServersideQoLZDO zdo, IReadOnlyList<Peer> peers, PrefabInfo prefabInfo) { //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_029a: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) ItemDrop keyItem = prefabInfo.Door.m_keyItem; if (keyItem != null && ((Object)keyItem).name == "CryptKey") { ZDOVars vars = zdo.Vars; if (((ZDOVars)(ref vars)).GetState(0) == 0) { ComponentFieldAccessor<Door> val = zdo.Fields<Door>(); if (!ConfigBase<Config>.Instance.CanSacrificeCryptKey.Value) { val.Reset((Func<Expression<Func<Door, ItemDrop>>>)(() => (Door x) => x.m_keyItem), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.Player\\CryptDoorProcessor.cs", 30); return (ProcessResult)2; } _allowedPlayers.Clear(); if (ZoneSystem.instance.GetGlobalKey((GlobalKeys)45)) { foreach (Peer peer in peers) { if (!(Vector3.Distance(peer.RefPos, zdo.ZDO.GetPosition()) > 16f)) { PlayerState playerState = peer.PlayerState; if (playerState != null && PlayerProcessor.GetSacrifiedCryptKey(playerState.PlayerID)) { _allowedPlayers.Add(playerState.ZDO); } } } } if (_allowedPlayers.Count == 0) { if (val.UpdateResetValue((Func<Expression<Func<Door, ItemDrop>>>)(() => (Door x) => x.m_keyItem), "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.Player\\CryptDoorProcessor.cs", 48)) { return (ProcessResult)8; } } else { int num = 0; int num2 = 0; _keyItemWeightByHash.Clear(); foreach (EquipmemtSlots value2 in SQoLEnumUtils<EquipmemtSlots>.Values) { foreach (ServersideQoLZDO allowedPlayer in _allowedPlayers) { vars = allowedPlayer.Vars; int equippedItemHash = ((ZDOVars)(ref vars)).GetEquippedItemHash(value2, 0); if (equippedItemHash != 0) { int value = ((!_keyItemWeightByHash.TryGetValue(equippedItemHash, out value)) ? 1 : (value + 1)); _keyItemWeightByHash[equippedItemHash] = value; if (value > num) { num = value; num2 = equippedItemHash; } } } } _keyItemWeightByHash.Clear(); _allowedPlayers.Clear(); if (num2 != 0) { GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(num2); ItemDrop val2 = ((itemPrefab != null) ? itemPrefab.GetComponent<ItemDrop>() : null); if (val2 != null) { if (val.UpdateValue((Func<Expression<Func<Door, ItemDrop>>>)(() => (Door x) => x.m_keyItem), val2, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.Player\\CryptDoorProcessor.cs", 80)) { return (ProcessResult)8; } goto IL_0294; } } ((Processor)this).Logger.LogWarning((object)$"Item {num2} was chosen as key, but it's not a valid ItemDrop"); } goto IL_0294; } } return (ProcessResult)2; IL_0294: return ((Processor)this).ScheduleReprocessing(0.1f); } } [Processor("30cb1ca8-ae2d-4982-af60-f47e0207d603")] [RunAfter<ContainerRegistryProcessor>] [DependsOn<PlayerRegistryProcessor>] public sealed class IncineratorProcessor : Processor<IncineratorProcessor.PrefabInfo> { public sealed record PrefabInfo(Incinerator Incinerator, Container Container, 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("Incinerator = "); builder.Append(Incinerator); builder.Append(", Container = "); builder.Append(Container); 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<Incinerator>.Default.GetHashCode(Incinerator)) * -1521134295 + EqualityComparer<Container>.Default.GetHashCode(Container)) * -1521134295 + EqualityComparer<Piece>.Default.GetHashCode(Piece)) * -1521134295 + EqualityComparer<PieceTable>.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<Incinerator>.Default.Equals(Incinerator, other.Incinerator) && EqualityComparer<Container>.Default.Equals(Container, other.Container) && EqualityComparer<Piece>.Default.Equals(Piece, other.Piece)) { return EqualityComparer<PieceTable>.Default.Equals(PieceTable, other.PieceTable); } return false; } return true; } [CompilerGenerated] private PrefabInfo(PrefabInfo original) : base((ProcessorPrefabInfo)(object)original) { Incinerator = original.Incinerator; Container = original.Container; Piece = original.Piece; PieceTable = original.PieceTable; } } private sealed record SacrificeInfo(Action<PlayerID> SetSacrificed, int? StatusEffect, string Message) { public string? ItemName { get; set; } } private sealed class State { public PlayerState? RequestingPlayer { get; set; } public required uint Revision { get; set; } public HashSet<SacrificeInfo> Sacrifices { get; } = new HashSet<SacrificeInfo>(); public bool LeverPulled { get; set; } public bool LeverReturned { get; set; } public ServersideQoLZDO? Sign { get; set; } } public const string Id = "30cb1ca8-ae2d-4982-af60-f47e0207d603"; private readonly Dictionary<string, SacrificeInfo> _sacrifices = new Dictionary<string, SacrificeInfo>(); private readonly Dictionary<ServersideQoLZDO, State> _states = new Dictionary<ServersideQoLZDO, State>(); private bool _enabled; protected override void Initialize() { //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0067: 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) _enabled = ConfigBase<Config>.Instance.CanSacrificeMegingjord.Value || ConfigBase<Config>.Instance.CanSacrificeCryptKey.Value || ConfigBase<Config>.Instance.CanSacrificeWishbone.Value || ConfigBase<Config>.Instance.CanSacrificeTornSpirit.Value; Intercept.UpdateInterception(Incinerator.RequestIncinerate, (Delegate)new Action<ServersideQoLZDO, RoutedRPCData, PlayerID>(RPC_RequestIncinerate), _enabled); Intercept.UpdateInterception(Incinerator.AnimateLever, (Delegate)new Action<ServersideQoLZDO>(RPC_AnimateLever), _enabled); Intercept.UpdateInterception(Incinerator.AnimateLeverReturn, (Delegate)new Action<ServersideQoLZDO>(RPC_AnimateLeverReturn), _enabled); _sacrifices.Clear(); if (ConfigBase<Config>.Instance.CanSacrificeMegingjord.Value) { _sacrifices.Add("BeltStrength", new SacrificeInfo(delegate(PlayerID x) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) PlayerProcessor.SetSacrifiedMegingjord(x, value: true); }, StatusEffects.Megingjord, ConfigBase<Config>.Instance.Localization.Value.SacrificedMegingjord)); } if (ConfigBase<Config>.Instance.CanSacrificeCryptKey.Value) { _sacrifices.Add("CryptKey", new SacrificeInfo(delegate(PlayerID x) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) PlayerProcessor.SetSacrifiedCryptKey(x, value: true); }, null, ConfigBase<Config>.Instance.Localization.Value.SacrificedCryptKey)); } if (ConfigBase<Config>.Instance.CanSacrificeWishbone.Value) { _sacrifices.Add("Wishbone", new SacrificeInfo(delegate(PlayerID x) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) PlayerProcessor.SetSacrifiedWishbone(x, value: true); }, StatusEffects.Wishbone, ConfigBase<Config>.Instance.Localization.Value.SacrificedWishbone)); } if (ConfigBase<Config>.Instance.CanSacrificeTornSpirit.Value) { _sacrifices.Add("YagluthDrop", new SacrificeInfo(delegate(PlayerID x) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) PlayerProcessor.SetSacrifiedTornSpirit(x, value: true); }, StatusEffects.Demister, ConfigBase<Config>.Instance.Localization.Value.SacrificedTornSpirit)); } } protected override ProcessResult Process(ServersideQoLZDO zdo, IReadOnlyList<Peer> peers, PrefabInfo prefabInfo) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: 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_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Unknown result type (might be due to invalid IL or missing references) //IL_023e: Unknown result type (might be due to invalid IL or missing references) //IL_036d: Unknown result type (might be due to invalid IL or missing references) //IL_02a5: Unknown result type (might be due to invalid IL or missing references) //IL_02d5: Unknown result type (might be due to invalid IL or missing references) //IL_02da: Unknown result type (might be due to invalid IL or missing references) //IL_02de: Unknown result type (might be due to invalid IL or missing references) //IL_02e3: Unknown result type (might be due to invalid IL or missing references) if (!_enabled) { return (ProcessResult)2; } ZDOVars vars; if (_states.TryGetValue(zdo, out State value) && !value.LeverReturned) { if (value.LeverPulled) { vars = zdo.Vars; if (!((ZDOVars)(ref vars)).GetInUse(false)) { goto IL_0047; } } value.Sacrifices.Clear(); } goto IL_0047; IL_0047: ContainerState state = Processor.Instance<ContainerRegistryProcessor>().GetState(zdo, prefabInfo.Container); IInventory inventory = state.GetInventory(); bool flag = false; foreach (ItemData item in inventory.Items) { GameObject dropPrefab = item.m_dropPrefab; string text = ((dropPrefab != null) ? ((Object)dropPrefab).name : null); if (text == null || !_sacrifices.TryGetValue(text, out SacrificeInfo value2)) { continue; } if (value == null) { Dictionary<ServersideQoLZDO, State> states = _states; State obj = new State { Revision = zdo.ZDO.DataRevision }; value = obj; states.Add(zdo, obj); zdo.Destroyed += RemoveState; } else if (value.Revision != zdo.ZDO.DataRevision) { value.Revision = zdo.ZDO.DataRevision; value.Sacrifices.Clear(); } State state2 = value; if (state2.RequestingPlayer == null) { PlayerState val = (state2.RequestingPlayer = Processor.Instance<PlayerRegistryProcessor>().GetStateForPeerID(zdo.ZDO.GetOwner())); } if (value.RequestingPlayer != null) { SacrificeInfo sacrificeInfo = value2; if (sacrificeInfo.ItemName == null) { string text2 = (sacrificeInfo.ItemName = Localization.instance.Localize(item.m_shared.m_name)); } value.Sacrifices.Add(value2); flag = true; } } ProcessResult result = (ProcessResult)0; if (flag) { State state2 = value; if (state2.Sign == null) { ServersideQoLZDO val2 = (state2.Sign = ((Processor)this).PlacePiece(zdo.ZDO.GetPosition(), Prefabs.Sign, zdo.ZDO.GetRotation())); } string text4 = string.Join("<br>", value.Sacrifices.Select((SacrificeInfo x) => x.ItemName).Prepend<string>(value.RequestingPlayer.PlayerName + ":")); vars = value.Sign.Vars; ((ZDOVars)(ref vars)).SetText("<mark=#000000><color=white>" + text4 + "<size=45><br><br>", "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.Player\\IncineratorProcessor.cs", 85); } else if (value != null && value.LeverReturned && value.RequestingPlayer != null) { foreach (SacrificeInfo sacrifice in value.Sacrifices) { sacrifice.SetSacrificed(value.RequestingPlayer.PlayerID); int? statusEffect = sacrifice.StatusEffect; if (statusEffect.HasValue) { int valueOrDefault = statusEffect.GetValueOrDefault(); ZDORpc rPC = value.RequestingPlayer.ZDO.RPC; CharacterRpc character = ((ZDORpc)(ref rPC)).Character; ((CharacterRpc)(ref character)).AddStatusEffect(valueOrDefault, false, 0, 0f, -1); } RPC.ShowMessage(value.RequestingPlayer.Owner, (MessageType)2, sacrifice.Message); } RemoveState(zdo); } else { int? statusEffect = value?.Sacrifices.Count; if (statusEffect.HasValue && statusEffect.GetValueOrDefault() == 0) { RemoveState(zdo); } } return result; } private void RemoveState(ServersideQoLZDO zdo) { zdo.Destroyed -= RemoveState; if (_states.Remove(zdo, out State value) && value.Sign != null) { ((Processor)this).DestroyObject(value.Sign); } } private void RPC_RequestIncinerate(ServersideQoLZDO zdo, RoutedRPCData data, PlayerID playerID) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) PlayerState val = Processor.Instance<PlayerRegistryProcessor>().GetStateForPeerID(data.m_senderPeerID) ?? Processor.Instance<PlayerRegistryProcessor>().GetStateForPlayerID(playerID); State value; if (val == null) { ((Processor)this).Logger.LogWarning((object)$"Player state for peerID={data.m_senderPeerID} or playerID={((PlayerID)(ref playerID)).Value} not found"); RemoveState(zdo); } else if (_states.TryGetValue(zdo, out value)) { value.RequestingPlayer = val; } else { _states.Add(zdo, new State { RequestingPlayer = val, Revision = 0u }); } } private void RPC_AnimateLever(ServersideQoLZDO zdo) { if (_states.TryGetValue(zdo, out State value)) { value.LeverPulled = true; } } private void RPC_AnimateLeverReturn(ServersideQoLZDO zdo) { if (_states.TryGetValue(zdo, out State value)) { value.LeverReturned = true; } } } [BepInPlugin("ArgusMagnus.ServersideQoL.Player", "ServersideQoL.Player", "2.4.3")] public sealed class PlayerPlugin : ServersideQoLPluginBase<PlayerPlugin, Config> { public const string Author = "ArgusMagnus"; public const string PluginName = "ServersideQoL.Player"; public const string PluginGuid = "ArgusMagnus.ServersideQoL.Player"; public const string PluginVersion = "2.4.3"; public const string PluginInformationalVersion = "2.4.3"; private DateTimeOffset BuildTimestamp { get; } = new DateTimeOffset(639284296389299142L, default(TimeSpan)); protected override Config CreateConfigSingleton(ConfigFile configFile, Logger logger) { return new Config(configFile, logger); } protected override void RegisterProcessors(IProcessorCollection processors) { processors.Add<PlayerProcessor>().Add<CryptDoorProcessor>().Add<VagonProcessor>() .Add<IncineratorProcessor>(); } private void Awake() { } } [Processor("7b156eea-3364-40ca-83ad-417a55fa6e4b")] [DependsOn<PlayerRegistryProcessor>] public sealed class PlayerProcessor : Processor<ProcessorPrefabInfo<Player>> { public const string Id = "7b156eea-3364-40ca-83ad-417a55fa6e4b"; private readonly Dictionary<ServersideQoLZDO, ServersideQoLZDO> _attachedCartsByPlayer = new Dictionary<ServersideQoLZDO, ServersideQoLZDO>(); public bool HasMegingjordEffect(PlayerID playerID) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) if (ConfigBase<Config>.Instance.CanSacrificeMegingjord.Value) { return GetSacrifiedMegingjord(playerID); } return false; } protected override void Initialize() { //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Expected O, but got Unknown //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Invalid comparison between Unknown and I4 //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Expected O, but got Unknown Processor.Instance<PlayerRegistryProcessor>().StaminaUpdated -= OnPlayerStaminaUpdated; if (ConfigBase<Config>.Instance.InfiniteEncumberedStamina.Value || ConfigBase<Config>.Instance.InfiniteSneakingStamina.Value || ConfigBase<Config>.Instance.InfiniteSwimmingStamina.Value) { Processor.Instance<PlayerRegistryProcessor>().StaminaUpdated += OnPlayerStaminaUpdated; } bool flag = false; if (Game.m_staminaRate > 0f) { flag = ConfigBase<Config>.Instance.InfiniteBuildingStamina.Value || ConfigBase<Config>.Instance.InfiniteFarmingStamina.Value || ConfigBase<Config>.Instance.InfiniteMiningStamina.Value || ConfigBase<Config>.Instance.InfiniteWoodCuttingStamina.Value; } Processor.Instance<PlayerRegistryProcessor>().ItemUsed -= new ItemUsedHandler(OnPlayerItemUsed); if (flag) { Processor.Instance<PlayerRegistryProcessor>().ItemUsed += new ItemUsedHandler(OnPlayerItemUsed); } Processor.Instance<PlayerRegistryProcessor>().EmoteDetected -= OnEmoteDetected; if ((int)ConfigBase<Config>.Instance.OpenCartEmote.Value != -1) { Processor.Instance<PlayerRegistryProcessor>().EmoteDetected += OnEmoteDetected; } _attachedCartsByPlayer.Clear(); } protected override ProcessResult Process(ServersideQoLZDO zdo, IReadOnlyList<Peer> peers, ProcessorPrefabInfo<Player> prefabInfo) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0065: 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) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: 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_0080: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: 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) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) PlayerState state = Processor.Instance<PlayerRegistryProcessor>().GetState(zdo); if (state != null) { CharacterRpc character; if (ConfigBase<Config>.Instance.CanSacrificeMegingjord.Value && GetSacrifiedMegingjord(state.PlayerID)) { ZDORpc rPC = zdo.RPC; character = ((ZDORpc)(ref rPC)).Character; ((CharacterRpc)(ref character)).AddStatusEffect(StatusEffects.Megingjord, false, 0, 0f, -1); } if (ConfigBase<Config>.Instance.CanSacrificeWishbone.Value && GetSacrifiedWishbone(state.PlayerID)) { ZDORpc rPC2 = zdo.RPC; character = ((ZDORpc)(ref rPC2)).Character; ((CharacterRpc)(ref character)).AddStatusEffect(StatusEffects.Wishbone, false, 0, 0f, -1); } if (ConfigBase<Config>.Instance.CanSacrificeTornSpirit.Value && GetSacrifiedTornSpirit(state.PlayerID)) { ZDORpc rPC3 = zdo.RPC; character = ((ZDORpc)(ref rPC3)).Character; ((CharacterRpc)(ref character)).AddStatusEffect(StatusEffects.Demister, false, 0, 0f, -1); } return (ProcessResult)2; } return (ProcessResult)2; } private void OnPlayerStaminaUpdated(PlayerState state) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: 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_0046: 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_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_010f: 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_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) ZDOVars vars; PlayerRpc player; if ((float)state.Stamina < state.PrefabInfo.Component.m_encumberedStaminaDrain && ConfigBase<Config>.Instance.InfiniteEncumberedStamina.Value) { vars = state.ZDO.Vars; if (((ZDOVars)(ref vars)).GetAnimationIsEncumbered(false)) { ZDORpc rPC = state.ZDO.RPC; player = ((ZDORpc)(ref rPC)).Player; ((PlayerRpc)(ref player)).UseStamina(0f - state.PrefabInfo.Component.m_encumberedStaminaDrain); return; } } if ((float)state.Stamina < state.PrefabInfo.Component.m_sneakStaminaDrain && ConfigBase<Config>.Instance.InfiniteSneakingStamina.Value) { vars = state.ZDO.Vars; if (((ZDOVars)(ref vars)).GetAnimationIsCrouching(false)) { ZDORpc rPC2 = state.ZDO.RPC; player = ((ZDORpc)(ref rPC2)).Player; ((PlayerRpc)(ref player)).UseStamina(0f - state.PrefabInfo.Component.m_sneakStaminaDrain); return; } } if ((float)state.Stamina < state.PrefabInfo.Component.m_swimStaminaDrainMinSkill && ConfigBase<Config>.Instance.InfiniteSwimmingStamina.Value) { vars = state.ZDO.Vars; if (((ZDOVars)(ref vars)).GetAnimationInWater(false)) { ZDORpc rPC3 = state.ZDO.RPC; player = ((ZDORpc)(ref rPC3)).Player; ((PlayerRpc)(ref player)).UseStamina(0f - state.PrefabInfo.Component.m_swimStaminaDrainMinSkill); } } } private void OnPlayerItemUsed(PlayerState state, string animationTriggerName) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0036: 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_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) if (state.LastUsedItem != null && CheckStamina(animationTriggerName)) { float attackStamina = state.LastUsedItem.m_itemData.m_shared.m_attack.m_attackStamina; ZDOVars vars = state.ZDO.Vars; if (((ZDOVars)(ref vars)).GetStamina(0f) < 2f * attackStamina) { ZDORpc rPC = state.ZDO.RPC; PlayerRpc player = ((ZDORpc)(ref rPC)).Player; ((PlayerRpc)(ref player)).UseStamina(0f - attackStamina); } } static bool CheckStamina(string triggerName) { switch (triggerName) { case "swing_pickaxe": return ConfigBase<Config>.Instance.InfiniteMiningStamina.Value; case "swing_hammer": return ConfigBase<Config>.Instance.InfiniteBuildingStamina.Value; case "swing_hoe": case "scything": return ConfigBase<Config>.Instance.InfiniteFarmingStamina.Value; case "dualaxes0": case "swing_axe0": case "battleaxe_attack0": return ConfigBase<Config>.Instance.InfiniteWoodCuttingStamina.Value; default: return false; } } } private void OnEmoteDetected(PlayerState state, Emotes emote) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Invalid comparison between Unknown and I4 //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) if (((int)ConfigBase<Config>.Instance.OpenCartEmote.Value == -2 || ConfigBase<Config>.Instance.OpenCartEmote.Value == emote) && _attachedCartsByPlayer.TryGetValue(state.ZDO, out ServersideQoLZDO value) && value.ZDO.GetOwner() == state.Owner) { ZDOVars vars = value.Vars; if (((ZDOVars)(ref vars)).GetAttachJoint(false)) { ZDORpc rPC = value.RPC; ContainerRpc container = ((ZDORpc)(ref rPC)).Container; ((ContainerRpc)(ref container)).OpenResponse(true); } } } internal void UpdateAttachedCart(ServersideQoLZDO cart) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) PlayerState stateForPeerID = Processor.Instance<PlayerRegistryProcessor>().GetStateForPeerID(cart.ZDO.GetOwner()); if (stateForPeerID != null) { ZDOVars vars = cart.Vars; if (!((ZDOVars)(ref vars)).GetAttachJoint(false)) { _attachedCartsByPlayer.Remove(stateForPeerID.ZDO); return; } if (!_attachedCartsByPlayer.TryAdd(stateForPeerID.ZDO, cart)) { _attachedCartsByPlayer[stateForPeerID.ZDO] = cart; return; } stateForPeerID.ZDO.Destroyed += OnPlayerDestroyed; cart.Destroyed += OnCartDestroyed; } } private void OnPlayerDestroyed(ServersideQoLZDO zdo) { if (_attachedCartsByPlayer.Remove(zdo, out ServersideQoLZDO value)) { value.Destroyed -= OnCartDestroyed; } } private void OnCartDestroyed(ServersideQoLZDO zdo) { List<ServersideQoLZDO> list = null; foreach (var (item, val3) in _attachedCartsByPlayer) { if (val3 == zdo) { (list ?? (list = new List<ServersideQoLZDO>())).Add(item); } } if (list == null) { return; } foreach (ServersideQoLZDO item2 in list) { if (_attachedCartsByPlayer.Remove(item2, out ServersideQoLZDO _)) { item2.Destroyed -= OnPlayerDestroyed; } } } private static bool GetSacrifiedMegingjord(PlayerID playerID, bool defaultValue = false) { return Processor.DataZDO.ZDO.GetBool($"player{((PlayerID)(ref playerID)).Value}_SacrifiedMegingjord", defaultValue); } internal static void SetSacrifiedMegingjord(PlayerID playerID, bool value) { Processor.DataZDO.ZDO.Set($"player{((PlayerID)(ref playerID)).Value}_SacrifiedMegingjord", value); } internal static bool GetSacrifiedCryptKey(PlayerID playerID, bool defaultValue = false) { return Processor.DataZDO.ZDO.GetBool($"player{((PlayerID)(ref playerID)).Value}_SacrifiedCryptKey", defaultValue); } internal static void SetSacrifiedCryptKey(PlayerID playerID, bool value) { Processor.DataZDO.ZDO.Set($"player{((PlayerID)(ref playerID)).Value}_SacrifiedCryptKey", value); } private static bool GetSacrifiedWishbone(PlayerID playerID, bool defaultValue = false) { return Processor.DataZDO.ZDO.GetBool($"player{((PlayerID)(ref playerID)).Value}_SacrifiedWishbone", defaultValue); } internal static void SetSacrifiedWishbone(PlayerID playerID, bool value) { Processor.DataZDO.ZDO.Set($"player{((PlayerID)(ref playerID)).Value}_SacrifiedWishbone", value); } private static bool GetSacrifiedTornSpirit(PlayerID playerID, bool defaultValue = false) { return Processor.DataZDO.ZDO.GetBool($"player{((PlayerID)(ref playerID)).Value}_SacrifiedTornSpirit", defaultValue); } internal static void SetSacrifiedTornSpirit(PlayerID playerID, bool value) { Processor.DataZDO.ZDO.Set($"player{((PlayerID)(ref playerID)).Value}_SacrifiedTornSpirit", value); } } [Processor("8a10c73e-67db-4dc2-8b0c-3242aac82e3b")] public sealed class VagonProcessor : Processor<VagonProcessor.PrefabInfo> { public sealed record PrefabInfo(Vagon Vagon, Piece Piece, Container Container) : 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("Vagon = "); builder.Append(Vagon); builder.Append(", Piece = "); builder.Append(Piece); builder.Append(", Container = "); builder.Append(Container); return true; } [CompilerGenerated] public override int GetHashCode() { return ((((ProcessorPrefabInfo)this).GetHashCode() * -1521134295 + EqualityComparer<Vagon>.Default.GetHashCode(Vagon)) * -1521134295 + EqualityComparer<Piece>.Default.GetHashCode(Piece)) * -1521134295 + EqualityComparer<Container>.Default.GetHashCode(Container); } [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<Vagon>.Default.Equals(Vagon, other.Vagon) && EqualityComparer<Piece>.Default.Equals(Piece, other.Piece)) { return EqualityComparer<Container>.Default.Equals(Container, other.Container); } return false; } return true; } [CompilerGenerated] private PrefabInfo(PrefabInfo original) : base((ProcessorPrefabInfo)(object)original) { Vagon = original.Vagon; Piece = original.Piece; Container = original.Container; } } protected override ProcessResult Process(ServersideQoLZDO zdo, IReadOnlyList<Peer> peers, PrefabInfo prefabInfo) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Invalid comparison between Unknown and I4 if ((int)ConfigBase<Config>.Instance.OpenCartEmote.Value != -1) { Processor.Instance<PlayerProcessor>().UpdateAttachedCart(zdo); return (ProcessResult)0; } return (ProcessResult)2; } } }