using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.Rendering; [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("RadiusRings")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.1.0")] [assembly: AssemblyInformationalVersion("1.0.0+5e0b1528c9e446637b0266467670c5b0124135a3")] [assembly: AssemblyProduct("RadiusRings")] [assembly: AssemblyTitle("RadiusRings")] [assembly: AssemblyVersion("1.0.1.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [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 RadiusRings { [BepInPlugin("EleventhTower.valheim.radiusrings", "Radius Rings", "1.0.1")] public class Plugin : BaseUnityPlugin { private const string Guid = "EleventhTower.valheim.radiusrings"; private const string Version = "1.0.1"; private static readonly Color RingColor = new Color(0.25f, 0.9f, 1f, 0.85f); private static readonly Color HighlightColor = new Color(1f, 0.78f, 0.15f, 0.95f); private const float RingWidth = 0.06f; private const float HighlightWidth = 0.11f; private const float GroundOffset = 0.05f; private const float LabelHeight = 0.55f; private ConfigEntry _toggleKey; private ConfigEntry _maxRadius; private ConfigEntry _ringSpacing; private ConfigEntry _segments; private ConfigEntry _updateInterval; private ConfigEntry _highlightEvery; private bool _visible; private GameObject _root; private readonly List _rings = new List(); private readonly List _labels = new List(); private float _nextRefresh; private void Awake() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Expected O, but got Unknown //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Expected O, but got Unknown //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Expected O, but got Unknown //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Expected O, but got Unknown _toggleKey = ((BaseUnityPlugin)this).Config.Bind("General", "Toggle Key", new KeyboardShortcut((KeyCode)114, (KeyCode[])(object)new KeyCode[1] { (KeyCode)307 }), "Shows or hides the distance rings around your character."); _maxRadius = ((BaseUnityPlugin)this).Config.Bind("General", "Max Radius", 50f, new ConfigDescription("Rings are drawn out to this distance, in metres.", (AcceptableValueBase)(object)new AcceptableValueRange(5f, 500f), Array.Empty())); _ringSpacing = ((BaseUnityPlugin)this).Config.Bind("General", "Ring Spacing", 5f, new ConfigDescription("Distance between rings, in metres.", (AcceptableValueBase)(object)new AcceptableValueRange(1f, 50f), Array.Empty())); _segments = ((BaseUnityPlugin)this).Config.Bind("General", "Ring Segments", 64, new ConfigDescription("Points per ring. Higher is smoother but costs more per refresh.", (AcceptableValueBase)(object)new AcceptableValueRange(12, 128), Array.Empty())); _updateInterval = ((BaseUnityPlugin)this).Config.Bind("General", "Update Interval", 0.15f, new ConfigDescription("Seconds between ring refreshes while visible. Lower is smoother but costs more.", (AcceptableValueBase)(object)new AcceptableValueRange(0.02f, 1f), Array.Empty())); _highlightEvery = ((BaseUnityPlugin)this).Config.Bind("General", "Highlight Every", 2, "Every Nth ring (counting from the innermost) is drawn brighter and thicker, e.g. 2 highlights 10m/20m/30m... when spacing is 5m. 0 disables highlighting."); _maxRadius.SettingChanged += delegate { RebuildIfVisible(); }; _ringSpacing.SettingChanged += delegate { RebuildIfVisible(); }; _segments.SettingChanged += delegate { RebuildIfVisible(); }; _highlightEvery.SettingChanged += delegate { RebuildIfVisible(); }; } private void Update() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) KeyboardShortcut value = _toggleKey.Value; if (((KeyboardShortcut)(ref value)).IsDown()) { _visible = !_visible; if (_visible) { RebuildRings(); } else if ((Object)(object)_root != (Object)null) { _root.SetActive(false); } } if (_visible && !((Object)(object)Player.m_localPlayer == (Object)null)) { if ((Object)(object)_root == (Object)null) { RebuildRings(); } if (!(Time.time < _nextRefresh)) { _nextRefresh = Time.time + _updateInterval.Value; RefreshRings(); } } } private void RebuildIfVisible() { if (_visible) { RebuildRings(); } } private void RebuildRings() { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected O, but got Unknown //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_0130: 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_0135: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_root != (Object)null) { Object.Destroy((Object)(object)_root); } _rings.Clear(); _labels.Clear(); _root = new GameObject("RadiusRings"); _root.SetActive(true); Material material = new Material(Shader.Find("Sprites/Default")); int value = _segments.Value; float value2 = _ringSpacing.Value; int num = Mathf.Max(1, Mathf.RoundToInt(_maxRadius.Value / value2)); for (int i = 1; i <= num; i++) { bool flag = _highlightEvery.Value > 0 && i % _highlightEvery.Value == 0; GameObject val = new GameObject($"Ring_{i}"); val.transform.SetParent(_root.transform, false); LineRenderer val2 = val.AddComponent(); val2.useWorldSpace = true; val2.loop = false; val2.positionCount = value + 1; ((Renderer)val2).material = material; val2.widthMultiplier = (flag ? 0.11f : 0.06f); Color color = (val2.endColor = (val2.startColor = (flag ? HighlightColor : RingColor))); ((Renderer)val2).shadowCastingMode = (ShadowCastingMode)0; ((Renderer)val2).receiveShadows = false; _rings.Add(val2); GameObject val5 = new GameObject($"Label_{i}"); val5.transform.SetParent(_root.transform, false); TextMesh val6 = val5.AddComponent(); val6.text = $"{(float)i * value2:0}m"; val6.characterSize = 0.15f; val6.fontSize = 48; val6.anchor = (TextAnchor)4; val6.alignment = (TextAlignment)1; val6.color = color; _labels.Add(val6); } RefreshRings(); } private void RefreshRings() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0055: 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_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: 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_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: 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_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_013f: 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_01ac: 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_01cb: Unknown result type (might be due to invalid IL or missing references) Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null || (Object)(object)_root == (Object)null) { return; } Vector3 position = ((Component)localPlayer).transform.position; position.y = 0f; float value = _ringSpacing.Value; int value2 = _segments.Value; Camera main = Camera.main; Vector3 val = Vector3.forward; if ((Object)(object)main != (Object)null) { Vector3 forward = ((Component)main).transform.forward; forward.y = 0f; if (((Vector3)(ref forward)).sqrMagnitude > 0.0001f) { val = ((Vector3)(ref forward)).normalized; } } Vector3 val3 = default(Vector3); float y = default(float); float y2 = default(float); for (int i = 0; i < _rings.Count; i++) { float num = (float)(i + 1) * value; LineRenderer val2 = _rings[i]; for (int j = 0; j <= value2; j++) { float num2 = (float)j / (float)value2 * MathF.PI * 2f; float num3 = position.x + Mathf.Sin(num2) * num; float num4 = position.z + Mathf.Cos(num2) * num; ((Vector3)(ref val3))..ctor(num3, position.y, num4); if (!ZoneSystem.instance.GetGroundHeight(val3, ref y)) { y = ((Component)localPlayer).transform.position.y; } val3.y = y + 0.05f; val2.SetPosition(j, val3); } TextMesh val4 = _labels[i]; Vector3 val5 = position + val * num; if (!ZoneSystem.instance.GetGroundHeight(val5, ref y2)) { y2 = ((Component)localPlayer).transform.position.y; } val5.y = y2 + 0.55f; ((Component)val4).transform.position = val5; if ((Object)(object)main != (Object)null) { ((Component)val4).transform.forward = ((Component)main).transform.forward; } } } } }