using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text; using BepInEx; using BepInEx.Configuration; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("ArgusMagnus")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("ArgusMagnus")] [assembly: AssemblyDescription("Gives admins the ability to change various build/landscaping options for themselves")] [assembly: AssemblyFileVersion("1.99.8.0")] [assembly: AssemblyInformationalVersion("1.99.8-beta+328851184cc278c858ffbc70e717af9f9d7b6973")] [assembly: AssemblyProduct("ServersideQoL.AdminBuildOptions")] [assembly: AssemblyTitle("ServersideQoL.AdminBuildOptions")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/ArgusMagnus/ValheimServersideQoL")] [assembly: AssemblyVersion("1.99.8.0")] [module: RefSafetyRules(11)] [CompilerGenerated] internal sealed class <>z__ReadOnlyList : IEnumerable, ICollection, IList, IEnumerable, IReadOnlyCollection, IReadOnlyList, ICollection, IList { 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.Count => _items.Count; T IReadOnlyList.this[int index] => _items[index]; int ICollection.Count => _items.Count; bool ICollection.IsReadOnly => true; T IList.this[int index] { get { return _items[index]; } set { throw new NotSupportedException(); } } public <>z__ReadOnlyList(List 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 IEnumerable.GetEnumerator() { return ((IEnumerable)_items).GetEnumerator(); } void ICollection.Add(T item) { throw new NotSupportedException(); } void ICollection.Clear() { throw new NotSupportedException(); } bool ICollection.Contains(T item) { return _items.Contains(item); } void ICollection.CopyTo(T[] array, int arrayIndex) { _items.CopyTo(array, arrayIndex); } bool ICollection.Remove(T item) { throw new NotSupportedException(); } int IList.IndexOf(T item) { return _items.IndexOf(item); } 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.AdminBuildOptions { [BepInPlugin("ArgusMagnus.ServersideQoL.AdminBuildOptions", "ServersideQoL.AdminBuildOptions", "1.99.8")] public sealed class AdminBuildOptionsPlugin : ServersideQoLPluginBase { public const string Author = "ArgusMagnus"; public const string PluginName = "ServersideQoL.AdminBuildOptions"; public const string PluginGuid = "ArgusMagnus.ServersideQoL.AdminBuildOptions"; public const string PluginVersion = "1.99.8"; public const string PluginInformationalVersion = "1.99.8-beta"; private DateTimeOffset BuildTimestamp { get; } = new DateTimeOffset(639215507745126410L, 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() { ServersideQoLPluginBase.Logger.LogWarning((object)string.Format("You are running a pre-release version: {0} ({1})", "1.99.8-beta", BuildTimestamp.LocalDateTime)); } } public sealed class Config : ConfigBase { public sealed class LocalizationConfig { } public sealed class AdvancedConfig { public float ResetTerrainRadius { get; init; } = 3f; } private const string Section = "AdminBuildOptions"; public override ConfigEntry Enabled { get; } = ConfigBase.BindEx(cfg, "AdminBuildOptions", true, "Enables/disables the entire mod", (AcceptableValueBase)null, (Deprecated)null, "Enabled"); public ConfigEntry ToggleDisableRainDamageEmote { get; } public ConfigEntry ToggleDisableSupportRequirements { get; } public ConfigEntry ToggleMakeIndestructible { get; } public ConfigEntry ToggleNoWorkbench { get; } public ConfigEntry ToggleDungeonBuild { get; } public ConfigEntry ToggleNoBuildCost { get; } public ConfigEntry ToggleAllPiecesUnlocked { get; } public ConfigEntry CycleLevelGroundMode { get; } public YamlConfigEntry Localization { get; } public YamlConfigEntry Advanced { get; } public Config(ConfigFile cfg, Logger logger) { string text = $"Emote admins can use to toggle disabling rain damage for newly built pieces.\r\n{(object)(Emotes)(-1)} to disable this feature, {(object)(Emotes)(-2)} to use any emote as trigger.\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 list = new List(); list.Add((Emotes)(-1)); list.Add((Emotes)(-2)); list.AddRange(Enum.GetValues(typeof(Emotes)).Cast()); ToggleDisableRainDamageEmote = ConfigBase.BindEx(cfg, "AdminBuildOptions", (Emotes)(-1), text, (AcceptableValueBase)(object)new AcceptableEnum((IEnumerable)new <>z__ReadOnlyList(list)), (Deprecated)null, "ToggleDisableRainDamageEmote"); string text2 = $"Emote admins can use to toggle disabling support requirements for newly built pieces.\r\n{(object)(Emotes)(-1)} to disable this feature, {(object)(Emotes)(-2)} to use any emote as trigger.\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 = new List(); list.Add((Emotes)(-1)); list.Add((Emotes)(-2)); list.AddRange(Enum.GetValues(typeof(Emotes)).Cast()); ToggleDisableSupportRequirements = ConfigBase.BindEx(cfg, "AdminBuildOptions", (Emotes)(-1), text2, (AcceptableValueBase)(object)new AcceptableEnum((IEnumerable)new <>z__ReadOnlyList(list)), (Deprecated)null, "ToggleDisableSupportRequirements"); string text3 = $"Emote admins can use to toggle making newly built pieces indestructible.\r\n{(object)(Emotes)(-1)} to disable this feature, {(object)(Emotes)(-2)} to use any emote as trigger.\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 = new List(); list.Add((Emotes)(-1)); list.Add((Emotes)(-2)); list.AddRange(Enum.GetValues(typeof(Emotes)).Cast()); ToggleMakeIndestructible = ConfigBase.BindEx(cfg, "AdminBuildOptions", (Emotes)(-1), text3, (AcceptableValueBase)(object)new AcceptableEnum((IEnumerable)new <>z__ReadOnlyList(list)), (Deprecated)null, "ToggleMakeIndestructible"); string text4 = $"Emote admins can use to toggle the workbench requirement for building.\r\n{(object)(Emotes)(-1)} to disable this feature, {(object)(Emotes)(-2)} to use any emote as trigger.\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 = new List(); list.Add((Emotes)(-1)); list.Add((Emotes)(-2)); list.AddRange(Enum.GetValues(typeof(Emotes)).Cast()); ToggleNoWorkbench = ConfigBase.BindEx(cfg, "AdminBuildOptions", (Emotes)(-1), text4, (AcceptableValueBase)(object)new AcceptableEnum((IEnumerable)new <>z__ReadOnlyList(list)), (Deprecated)null, "ToggleNoWorkbench"); string text5 = $"Emote admins can use to toggle building in dungeons.\r\n{(object)(Emotes)(-1)} to disable this feature, {(object)(Emotes)(-2)} to use any emote as trigger.\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 = new List(); list.Add((Emotes)(-1)); list.Add((Emotes)(-2)); list.AddRange(Enum.GetValues(typeof(Emotes)).Cast()); ToggleDungeonBuild = ConfigBase.BindEx(cfg, "AdminBuildOptions", (Emotes)(-1), text5, (AcceptableValueBase)(object)new AcceptableEnum((IEnumerable)new <>z__ReadOnlyList(list)), (Deprecated)null, "ToggleDungeonBuild"); string text6 = $"Emote admins can use to toggle no build cost.\r\n{(object)(Emotes)(-1)} to disable this feature, {(object)(Emotes)(-2)} to use any emote as trigger.\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 = new List(); list.Add((Emotes)(-1)); list.Add((Emotes)(-2)); list.AddRange(Enum.GetValues(typeof(Emotes)).Cast()); ToggleNoBuildCost = ConfigBase.BindEx(cfg, "AdminBuildOptions", (Emotes)(-1), text6, (AcceptableValueBase)(object)new AcceptableEnum((IEnumerable)new <>z__ReadOnlyList(list)), (Deprecated)null, "ToggleNoBuildCost"); string text7 = $"Emote admins can use to toggle unlocking all building pieces.\r\n{(object)(Emotes)(-1)} to disable this feature, {(object)(Emotes)(-2)} to use any emote as trigger.\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 = new List(); list.Add((Emotes)(-1)); list.Add((Emotes)(-2)); list.AddRange(Enum.GetValues(typeof(Emotes)).Cast()); ToggleAllPiecesUnlocked = ConfigBase.BindEx(cfg, "AdminBuildOptions", (Emotes)(-1), text7, (AcceptableValueBase)(object)new AcceptableEnum((IEnumerable)new <>z__ReadOnlyList(list)), (Deprecated)null, "ToggleAllPiecesUnlocked"); string text8 = $"Emote admins can use to cycle between different modes when using the Hoe's \"Level Ground\" option.\r\n{(object)(Emotes)(-1)} to disable this feature, {(object)(Emotes)(-2)} to use any emote as trigger.\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 = new List(); list.Add((Emotes)(-1)); list.Add((Emotes)(-2)); list.AddRange(Enum.GetValues(typeof(Emotes)).Cast()); CycleLevelGroundMode = ConfigBase.BindEx(cfg, "AdminBuildOptions", (Emotes)(-1), text8, (AcceptableValueBase)(object)new AcceptableEnum((IEnumerable)new <>z__ReadOnlyList(list)), (Deprecated)null, "CycleLevelGroundMode"); Localization = ConfigBase.BindYaml(cfg, "Localization"); Advanced = ConfigBase.BindYaml(cfg, "Advanced"); base..ctor(cfg, logger); } } [Processor("fff17191-3ccc-4b56-9aa0-03e1c38b4175")] [RunAfter] public sealed class PlayerProcessor : Processor { public sealed record PrefabInfo(Player? Player, CamShaker? CamShaker) : ProcessorPrefabInfo() { public override bool IsValid { get { if (Player == null) { return ((ProcessorPrefabInfo)this).PrefabInfo.PrefabHash == __mudRoadPrefab; } return true; } } private static readonly int __mudRoadPrefab = StringExtensionMethods.GetStableHashCode("vfx_Place_mud_road", true); [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("Player = "); builder.Append(Player); builder.Append(", CamShaker = "); builder.Append(CamShaker); return true; } [CompilerGenerated] public override int GetHashCode() { return (((ProcessorPrefabInfo)this).GetHashCode() * -1521134295 + EqualityComparer.Default.GetHashCode(Player)) * -1521134295 + EqualityComparer.Default.GetHashCode(CamShaker); } [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(Player, other.Player)) { return EqualityComparer.Default.Equals(CamShaker, other.CamShaker); } return false; } return true; } [CompilerGenerated] private PrefabInfo(PrefabInfo original) : base((ProcessorPrefabInfo)(object)original) { Player = original.Player; CamShaker = original.CamShaker; } } [Flags] public enum BuildModifiers : uint { None = 0u, DisableRainDamage = 1u, DisableSupportRequirements = 2u, MakeIndestructible = 4u, NoWorkbench = 8u, DungeonBuild = 0x10u, NoBuildCost = 0x20u, AllPiecesUnlocked = 0x40u } public enum LevelGroundModes { Default, FlattenMedium, FlattenLarge, Reset } private sealed class State(PlayerState playerState) { public PlayerState PlayerState { get; } = playerState; public BuildModifiers BuildModifiers { get; set; } public LevelGroundModes LevelGroundMode { get; set; } public Timestamp NextBuildModifierMessage { get; set; } public Timestamp NextLevelGroundModeMessage { get; set; } } private sealed class TerrainCompData { private const int TerrainCompVersion = 1; private readonly ServersideQoLZDO _zdo; private readonly Heightmap _hmap; private bool[]? _modifiedHeight; private float[] _levelDelta; private float[] _smoothDelta; private bool[] _modifiedPaint; private Color[] _paintMask; private int _operations; private Vector3 _lastOpPoint; private float _lastOpRadius; public bool? HasModifications { get; private set; } public static TerrainCompData? Load(ServersideQoLZDO zdo) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) Heightmap heightmap = Processor.GetHeightmap(zdo.ZDO.GetPosition()); if (heightmap == null) { ServersideQoLPluginBase.Logger.LogWarning((object)$"Heightmap not found at {zdo.ZDO.GetPosition()}"); return null; } return new TerrainCompData(zdo, heightmap); } private TerrainCompData(ServersideQoLZDO zdo, Heightmap hmap) { _zdo = zdo; _hmap = hmap; } [MemberNotNullWhen(true, "_modifiedHeight")] private bool Load() { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_01e7: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_02e4: Unknown result type (might be due to invalid IL or missing references) //IL_02e9: Unknown result type (might be due to invalid IL or missing references) if (_modifiedHeight != null) { return true; } byte[] byteArray = _zdo.ZDO.GetByteArray(ZDOVars.s_TCData, (byte[])null); if (byteArray == null) { return false; } int num = _hmap.m_width + 1; num *= num; ZPackage val = new ZPackage(Utils.Decompress(byteArray)); if (val.ReadInt() != 1) { ServersideQoLPluginBase.Logger.LogWarning((object)"Terrain data load error, version missmatch"); return false; } _operations = val.ReadInt(); _lastOpPoint = val.ReadVector3(); _lastOpRadius = val.ReadSingle(); int num2 = val.ReadInt(); if (num2 != num) { ServersideQoLPluginBase.Logger.LogWarning((object)"Terrain data load error, height array missmatch"); return false; } _modifiedHeight = new bool[num]; _levelDelta = new float[num]; _smoothDelta = new float[num]; _modifiedPaint = new bool[num]; _paintMask = (Color[])(object)new Color[num]; HasModifications = false; for (int i = 0; i < num2; i++) { _modifiedHeight[i] = val.ReadBool(); if (_modifiedHeight[i]) { _levelDelta[i] = val.ReadSingle(); _smoothDelta[i] = val.ReadSingle(); HasModifications = true; } else { _levelDelta[i] = 0f; _smoothDelta[i] = 0f; } } int num3 = val.ReadInt(); for (int j = 0; j < num3; j++) { _modifiedPaint[j] = val.ReadBool(); if (_modifiedPaint[j]) { Color val2 = new Color { r = val.ReadSingle(), g = val.ReadSingle(), b = val.ReadSingle(), a = val.ReadSingle() }; _paintMask[j] = val2; HasModifications = true; } else { _paintMask[j] = Color.black; } } if (num3 == _hmap.m_width * _hmap.m_width) { Color[] array = (Color[])(object)new Color[_paintMask.Length]; _paintMask.CopyTo(array, 0); bool[] array2 = new bool[_modifiedPaint.Length]; _modifiedPaint.CopyTo(array2, 0); int num4 = _hmap.m_width + 1; for (int k = 0; k < _paintMask.Length; k++) { int num5 = k / num4; int num6 = (k + 1) / num4; int num7 = k - num5; if (num5 == _hmap.m_width) { num7 -= _hmap.m_width; } if (k > 0 && (k - num5) % _hmap.m_width == 0 && (k + 1 - num6) % _hmap.m_width == 0) { num7--; } _paintMask[k] = array[num7]; _modifiedPaint[k] = array2[num7]; } } return true; } private void Save() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_0030: Unknown result type (might be due to invalid IL or missing references) if (_modifiedHeight == null) { return; } HasModifications = false; ZPackage val = new ZPackage(); val.Write(1); val.Write(_operations); val.Write(_lastOpPoint); val.Write(_lastOpRadius); val.Write(_modifiedHeight.Length); for (int i = 0; i < _modifiedHeight.Length; i++) { val.Write(_modifiedHeight[i]); if (_modifiedHeight[i]) { val.Write(_levelDelta[i]); val.Write(_smoothDelta[i]); HasModifications = true; } } val.Write(_modifiedPaint.Length); for (int j = 0; j < _modifiedPaint.Length; j++) { val.Write(_modifiedPaint[j]); if (_modifiedPaint[j]) { val.Write(_paintMask[j].r); val.Write(_paintMask[j].g); val.Write(_paintMask[j].b); val.Write(_paintMask[j].a); HasModifications = true; } } byte[] array = Utils.Compress(val.GetArray()); _zdo.ZDO.Set(ZDOVars.s_TCData, array); } public void ResetTerrain(Vector3 pos, float radius) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) int num = default(int); int num2 = default(int); _hmap.WorldToVertex(pos, ref num, ref num2); float num3 = pos.y - _zdo.ZDO.GetPosition().y; float num4 = radius / _hmap.m_scale; int num5 = Mathf.CeilToInt(num4); Vector2 val = default(Vector2); ((Vector2)(ref val))..ctor((float)num, (float)num2); int num6 = _hmap.m_width + 1; bool flag = false; for (int i = num2 - num5; i <= num2 + num5; i++) { for (int j = num - num5; j <= num + num5; j++) { float num7 = Vector2.Distance(val, new Vector2((float)j, (float)i)); if (!(num7 > num4) && j >= 0 && i >= 0 && j < num6 && i < num6) { if (!Load()) { return; } int num8 = i * num6 + j; _modifiedHeight[num8] = false; _smoothDelta[num8] = 0f; _levelDelta[num8] = 0f; _modifiedPaint[num8] = false; _paintMask[num8] = Color.black; flag = true; } } } if (flag) { Save(); } } } private readonly Dictionary _states = new Dictionary(); private readonly int _numberOfLevelGroundModes = Enum.GetValues(typeof(LevelGroundModes)).Length; [CompilerGenerated] private ZoneLocation k__BackingField; [CompilerGenerated] private ZoneLocation k__BackingField; public BuildModifiers PossibleBuildModifiers { get; private set; } private ZoneLocation DevGround1 => k__BackingField ?? (k__BackingField = GetZoneLocation("DevGround1")); private ZoneLocation DevGround2 => k__BackingField ?? (k__BackingField = GetZoneLocation("DevGround2")); private static ZoneLocation GetZoneLocation([CallerMemberName] string name = null) { return PrivateAccessor.GetLocationsByHash(ZoneSystem.instance)[StringExtensionMethods.GetStableHashCode(name, true)]; } public BuildModifiers GetBuildModifiers(long playerId) { PlayerState stateForPlayerID = Processor.Instance().GetStateForPlayerID(playerId); if (stateForPlayerID == null || !_states.TryGetValue(stateForPlayerID.ZDO, out State value)) { return BuildModifiers.None; } return value.BuildModifiers; } protected override void Initialize() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Invalid comparison between Unknown and I4 //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Invalid comparison between Unknown and I4 //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Invalid comparison between Unknown and I4 //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Invalid comparison between Unknown and I4 //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Invalid comparison between Unknown and I4 //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Invalid comparison between Unknown and I4 //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Invalid comparison between Unknown and I4 PossibleBuildModifiers = BuildModifiers.None; if ((int)ConfigBase.Instance.ToggleDisableRainDamageEmote.Value != -1) { PossibleBuildModifiers |= BuildModifiers.DisableRainDamage; } if ((int)ConfigBase.Instance.ToggleDisableSupportRequirements.Value != -1) { PossibleBuildModifiers |= BuildModifiers.DisableSupportRequirements; } if ((int)ConfigBase.Instance.ToggleMakeIndestructible.Value != -1) { PossibleBuildModifiers |= BuildModifiers.MakeIndestructible; } if ((int)ConfigBase.Instance.ToggleNoWorkbench.Value != -1) { PossibleBuildModifiers |= BuildModifiers.NoWorkbench; } if ((int)ConfigBase.Instance.ToggleDungeonBuild.Value != -1) { PossibleBuildModifiers |= BuildModifiers.DungeonBuild; } if ((int)ConfigBase.Instance.ToggleNoBuildCost.Value != -1) { PossibleBuildModifiers |= BuildModifiers.NoBuildCost; } if ((int)ConfigBase.Instance.ToggleAllPiecesUnlocked.Value != -1) { PossibleBuildModifiers |= BuildModifiers.AllPiecesUnlocked; } Processor.Instance().EmoteDetected += OnEmoteDetected; } protected override ProcessResult Process(ServersideQoLZDO zdo, IReadOnlyList peers, PrefabInfo prefabInfo) { //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Invalid comparison between Unknown and I4 //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_018c: 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_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_005b: 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_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_0300: 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_032a: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Unknown result type (might be due to invalid IL or missing references) //IL_020e: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Unknown result type (might be due to invalid IL or missing references) //IL_025e: Unknown result type (might be due to invalid IL or missing references) //IL_039d: Unknown result type (might be due to invalid IL or missing references) State value; Timestamp now; ZDOVars vars; if (prefabInfo.Player != null) { if (!_states.TryGetValue(zdo, out value)) { PlayerState state = Processor.Instance().GetState(zdo); if (state != null && state.IsAdmin) { return (ProcessResult)0; } return (ProcessResult)2; } now = Timestamp.Now; if (value.NextBuildModifierMessage == default(Timestamp)) { goto IL_007f; } if (value.BuildModifiers != BuildModifiers.None && value.NextBuildModifierMessage < now) { vars = zdo.Vars; if (((ZDOVars)(ref vars)).GetRightItem(0) == Prefabs.Hammer) { goto IL_007f; } } goto IL_00b7; } if ((int)ConfigBase.Instance.CycleLevelGroundMode.Value == -1) { return (ProcessResult)2; } State state2 = GetState(zdo.ZDO.GetOwner()); if (state2 == null) { return (ProcessResult)2; } if (state2.LevelGroundMode == LevelGroundModes.Reset) { List list = new List(); ZDOMan.instance.FindSectorObjects(zdo.ZDO.GetSector(), Extensions[ZoneSystem.instance], 0, list, (List)null); foreach (ServersideQoLZDO item in list.Select((ZDO x) => x.ServersideQoLZDO)) { PrefabInfo prefabInfo2 = Processor.GetPrefabInfo(item); if (prefabInfo2.HasComponent()) { vars = item.Vars; int location = ((ZDOVars)(ref vars)).GetLocation(0); if (Remove(item, location, zdo.ZDO.GetPosition(), DevGround1)) { _ = 1; } else Remove(item, location, zdo.ZDO.GetPosition(), DevGround2); } else { if (!prefabInfo2.HasComponent()) { continue; } TerrainCompData terrainCompData = TerrainCompData.Load(item); if (terrainCompData != null) { terrainCompData.ResetTerrain(zdo.ZDO.GetPosition(), ConfigBase.Instance.Advanced.Value.ResetTerrainRadius); if ((!terrainCompData.HasModifications) ?? false) { item.Destroy(); } } } } } else { ZoneLocation val = (ZoneLocation)(state2.LevelGroundMode switch { LevelGroundModes.FlattenMedium => DevGround1, LevelGroundModes.FlattenLarge => DevGround2, _ => null, }); if (val != null) { PrivateAccessor.SpawnLocation(ZoneSystem.instance, val, 0, zdo.ZDO.GetPosition(), zdo.ZDO.GetRotation(), (SpawnMode)0, (List)null); List list2 = new List(); ZDOMan.instance.FindSectorObjects(zdo.ZDO.GetSector(), Extensions[ZoneSystem.instance], 0, list2, (List)null); foreach (ServersideQoLZDO item2 in list2.Select((ZDO x) => x.ServersideQoLZDO)) { if (!Processor.GetPrefabInfo(item2).HasComponent()) { continue; } TerrainCompData terrainCompData2 = TerrainCompData.Load(item2); if (terrainCompData2 != null) { terrainCompData2.ResetTerrain(zdo.ZDO.GetPosition(), val.m_exteriorRadius); if ((!terrainCompData2.HasModifications) ?? false) { item2.Destroy(); } } } } } goto IL_03e7; IL_03e7: return (ProcessResult)0; IL_007f: value.NextBuildModifierMessage = ((Timestamp)(ref now)).AddSeconds(4f); RPC.ShowMessage(value.PlayerState.Owner, (MessageType)1, $"Build modifiers: {value.BuildModifiers}"); goto IL_00b7; IL_0103: value.NextLevelGroundModeMessage = ((Timestamp)(ref now)).AddSeconds(4f); RPC.ShowMessage(value.PlayerState.Owner, (MessageType)1, $"Level ground mode: {value.LevelGroundMode}"); goto IL_03e7; IL_00b7: if (value.NextLevelGroundModeMessage == default(Timestamp)) { goto IL_0103; } if (value.LevelGroundMode != LevelGroundModes.Default && value.NextLevelGroundModeMessage < now) { vars = zdo.Vars; if (((ZDOVars)(ref vars)).GetRightItem(0) == Prefabs.Hoe) { goto IL_0103; } } goto IL_03e7; static bool Remove(ServersideQoLZDO val3, int hash, Vector3 pos, ZoneLocation val2) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) if (hash != val2.Hash || Utils.DistanceXZ(pos, val3.ZDO.GetPosition()) > val2.m_exteriorRadius) { return false; } val3.Destroy(); return true; } } private void OnEmoteDetected(PlayerState playerState, Emotes emote) { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0059: 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_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: 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_0195: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Unknown result type (might be due to invalid IL or missing references) //IL_0219: Unknown result type (might be due to invalid IL or missing references) if (!playerState.IsAdmin) { return; } if (!_states.TryGetValue(playerState.ZDO, out State value)) { _states.Add(playerState.ZDO, value = new State(playerState)); playerState.ZDO.Destroyed += delegate(ServersideQoLZDO x) { _states.Remove(x); }; } if (CheckEmote(emote, ConfigBase.Instance.ToggleDisableRainDamageEmote.Value)) { value.BuildModifiers ^= BuildModifiers.DisableRainDamage; value.NextBuildModifierMessage = default(Timestamp); } if (CheckEmote(emote, ConfigBase.Instance.ToggleDisableSupportRequirements.Value)) { value.BuildModifiers ^= BuildModifiers.DisableSupportRequirements; value.NextBuildModifierMessage = default(Timestamp); } if (CheckEmote(emote, ConfigBase.Instance.ToggleMakeIndestructible.Value)) { value.BuildModifiers ^= BuildModifiers.MakeIndestructible; value.NextBuildModifierMessage = default(Timestamp); } if (CheckEmote(emote, ConfigBase.Instance.ToggleNoWorkbench.Value)) { value.BuildModifiers ^= BuildModifiers.NoWorkbench; value.NextBuildModifierMessage = default(Timestamp); UpdateGlobalKeyModification(value, BuildModifiers.NoWorkbench, (GlobalKeys)22); } if (CheckEmote(emote, ConfigBase.Instance.ToggleDungeonBuild.Value)) { value.BuildModifiers ^= BuildModifiers.DungeonBuild; value.NextBuildModifierMessage = default(Timestamp); UpdateGlobalKeyModification(value, BuildModifiers.DungeonBuild, (GlobalKeys)29); } if (CheckEmote(emote, ConfigBase.Instance.ToggleNoBuildCost.Value)) { value.BuildModifiers ^= BuildModifiers.NoBuildCost; value.NextBuildModifierMessage = default(Timestamp); UpdateGlobalKeyModification(value, BuildModifiers.NoBuildCost, (GlobalKeys)19); } if (CheckEmote(emote, ConfigBase.Instance.ToggleAllPiecesUnlocked.Value)) { value.BuildModifiers ^= BuildModifiers.AllPiecesUnlocked; value.NextBuildModifierMessage = default(Timestamp); UpdateGlobalKeyModification(value, BuildModifiers.AllPiecesUnlocked, (GlobalKeys)21); } if (CheckEmote(emote, ConfigBase.Instance.CycleLevelGroundMode.Value)) { value.LevelGroundMode = (LevelGroundModes)((int)(value.LevelGroundMode + 1) % _numberOfLevelGroundModes); value.NextLevelGroundModeMessage = default(Timestamp); } static bool CheckEmote(Emotes val, Emotes cfg) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 //IL_0005: 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) if ((int)cfg != -2) { return cfg == val; } return true; } static void UpdateGlobalKeyModification(State state, BuildModifiers modifier, GlobalKeys key) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) if ((state.BuildModifiers & modifier) == 0) { state.PlayerState.RemoveGlobalKeyModification(new GlobalKey(key)); } else { state.PlayerState.AddGlobalKeyModification(new GlobalKey(key), true); } } } private State? GetState(long peerID) { PlayerState stateForPeerID = Processor.Instance().GetStateForPeerID(peerID); if (stateForPeerID == null || !_states.TryGetValue(stateForPeerID.ZDO, out State value)) { return null; } return value; } } [Processor("256a8351-08e2-4b0f-9c71-f011c7cf846f")] [DependsOn] public sealed class WearNTearProcessor : Processor { public sealed record PrefabInfo(WearNTear WearNTear, 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("WearNTear = "); builder.Append(WearNTear); 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(WearNTear)) * -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(WearNTear, other.WearNTear) && 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) { WearNTear = original.WearNTear; Piece = original.Piece; PieceTable = original.PieceTable; } } private static readonly int __adminBuildModifiers = ServersideQoLPluginBase.RegisterServerVar("AdminBuildModifiers"); protected override ProcessResult Process(ServersideQoLZDO zdo, IReadOnlyList peers, PrefabInfo prefabInfo) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: 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_0106: 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_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: 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_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) PlayerProcessor.BuildModifiers adminBuildModifiers = GetAdminBuildModifiers(zdo, (PlayerProcessor.BuildModifiers)4294967295u); ZDOVars vars = zdo.Vars; long creator = ((ZDOVars)(ref vars)).GetCreator(0L); if (adminBuildModifiers != (PlayerProcessor.BuildModifiers)4294967295u) { return (ProcessResult)2; } adminBuildModifiers = Processor.Instance().GetBuildModifiers(creator); if (adminBuildModifiers != PlayerProcessor.BuildModifiers.None) { SetAdminBuildModifiers(zdo, adminBuildModifiers); } ComponentFieldAccessor val = zdo.Fields(); ProcessResult val2 = (ProcessResult)2; if ((adminBuildModifiers & PlayerProcessor.BuildModifiers.DisableRainDamage) != PlayerProcessor.BuildModifiers.None && val.UpdateValue((Func>>)(() => (WearNTear x) => x.m_noRoofWear), false, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AdminBuildOptions\\WearNTearProcessor.cs", 24)) { val2 = (ProcessResult)(val2 | 8); } if ((adminBuildModifiers & PlayerProcessor.BuildModifiers.DisableSupportRequirements) != PlayerProcessor.BuildModifiers.None && val.UpdateValue((Func>>)(() => (WearNTear x) => x.m_noSupportWear), false, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AdminBuildOptions\\WearNTearProcessor.cs", 27)) { val2 = (ProcessResult)(val2 | 8); } if ((adminBuildModifiers & PlayerProcessor.BuildModifiers.MakeIndestructible) != PlayerProcessor.BuildModifiers.None && val.UpdateValue((Func>>)(() => (WearNTear x) => x.m_health), -1f, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AdminBuildOptions\\WearNTearProcessor.cs", 30)) { vars = zdo.Vars; ((ZDOVars)(ref vars)).SetHealth(-1f, "C:\\repos\\Valheim.ServersideQoL\\ServersideQoL.AdminBuildOptions\\WearNTearProcessor.cs", 32); val2 = (ProcessResult)(val2 | 8); } return val2; } private static PlayerProcessor.BuildModifiers GetAdminBuildModifiers(ServersideQoLZDO zdo, PlayerProcessor.BuildModifiers defaultValue = PlayerProcessor.BuildModifiers.None) { return (PlayerProcessor.BuildModifiers)zdo.ZDO.GetInt(__adminBuildModifiers, (int)defaultValue); } private static void SetAdminBuildModifiers(ServersideQoLZDO zdo, PlayerProcessor.BuildModifiers value) { zdo.ZDO.Set(__adminBuildModifiers, (int)value, false); } } }