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 BepInEx.Logging; using HarmonyLib; using UnityEngine; [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = "")] [assembly: AssemblyVersion("0.0.0.0")] namespace DigDug; [BepInPlugin("com.antigravity.valheim.digdug", "DigDug", "1.0.3")] public class DigDugPlugin : BaseUnityPlugin { public const string PluginGUID = "com.antigravity.valheim.digdug"; public const string PluginName = "DigDug"; public const string PluginVersion = "1.0.3"; public static ManualLogSource Log; private Harmony harmony; private GameObject uiObject; private void Awake() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; DigDugConfig.Init(((BaseUnityPlugin)this).Config); DigDugReflection.Init(); harmony = new Harmony("com.antigravity.valheim.digdug"); harmony.PatchAll(); uiObject = new GameObject("DigDugUI"); uiObject.AddComponent(); Object.DontDestroyOnLoad((Object)(object)uiObject); ((BaseUnityPlugin)this).Logger.LogInfo((object)"DigDug mod initialized successfully!"); } private void OnDestroy() { if ((Object)(object)uiObject != (Object)null) { Object.Destroy((Object)(object)uiObject); } if (harmony != null) { harmony.UnpatchSelf(); } } } public static class DigDugConfig { public static ConfigEntry EnableStaminaDrain; public static ConfigEntry IgnoreDurabilityLoss; public static ConfigEntry IgnoreStoneRequirement; public static ConfigEntry StoneCostMultiplier; public static ConfigEntry MaxTerrainOffset; public static ConfigEntry RotateLeftKey; public static ConfigEntry RotateRightKey; public static ConfigEntry MenuHotkey; public static void Init(ConfigFile config) { //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: 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) EnableStaminaDrain = config.Bind("General", "EnableStaminaDrain", true, "If true, performing a batch dig/build will consume player stamina."); IgnoreDurabilityLoss = config.Bind("General", "IgnoreDurabilityLoss", false, "If true, pickaxes will not lose durability when batch digging."); IgnoreStoneRequirement = config.Bind("General", "IgnoreStoneRequirement", false, "If true, raising terrain will not consume stones from your inventory."); StoneCostMultiplier = config.Bind("General", "StoneCostMultiplier", 1f, "Multiplier for the amount of stones required to raise terrain."); MaxTerrainOffset = config.Bind("General", "MaxTerrainOffset", 8f, "The maximum height/depth change limit in meters from the original base height. Vanilla Valheim is 8.0m. Increase this if you use mods that extend terrain height limits."); RotateLeftKey = config.Bind("Keybinds", "RotateLeftKey", new KeyboardShortcut((KeyCode)276, (KeyCode[])(object)new KeyCode[0]), "Key to rotate player/preview counter-clockwise."); RotateRightKey = config.Bind("Keybinds", "RotateRightKey", new KeyboardShortcut((KeyCode)275, (KeyCode[])(object)new KeyCode[0]), "Key to rotate player/preview clockwise."); MenuHotkey = config.Bind("Keybinds", "MenuHotkey", new KeyboardShortcut((KeyCode)0, (KeyCode[])(object)new KeyCode[0]), "Optional hotkey to toggle the DigDug menu while holding a pickaxe (in addition to right-click)."); } } public static class DigDugPreview { private static List previewObjs = new List(); private static Material previewMat; private static GameObject GetOrCreatePreviewObject(int index) { //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown //IL_0079: Unknown result type (might be due to invalid IL or missing references) while (previewObjs.Count <= index) { GameObject val = GameObject.CreatePrimitive((PrimitiveType)3); BoxCollider component = val.GetComponent(); if ((Object)(object)component != (Object)null) { Object.Destroy((Object)(object)component); } Renderer component2 = val.GetComponent(); if ((Object)(object)previewMat == (Object)null) { Shader val2 = Shader.Find("Sprites/Default"); if ((Object)(object)val2 == (Object)null) { val2 = Shader.Find("Standard"); } previewMat = new Material(val2); previewMat.color = new Color(0f, 0.45f, 1f, 0.35f); } component2.material = previewMat; val.SetActive(false); previewObjs.Add(val); } return previewObjs[index]; } public static void UpdatePreview(Vector3 playerPos, Vector3 forward, Vector3 right, float depth, float length, float width, int mode, int direction) { //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: 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_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01fe: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_021f: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: 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_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00da: 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_00eb: 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_0109: Unknown result type (might be due to invalid IL or missing references) //IL_02c7: Unknown result type (might be due to invalid IL or missing references) //IL_02c8: Unknown result type (might be due to invalid IL or missing references) //IL_02cd: Unknown result type (might be due to invalid IL or missing references) //IL_02d2: Unknown result type (might be due to invalid IL or missing references) //IL_02dc: Unknown result type (might be due to invalid IL or missing references) //IL_02dd: Unknown result type (might be due to invalid IL or missing references) //IL_02f2: Unknown result type (might be due to invalid IL or missing references) //IL_02f7: Unknown result type (might be due to invalid IL or missing references) //IL_02fc: Unknown result type (might be due to invalid IL or missing references) //IL_0315: Unknown result type (might be due to invalid IL or missing references) //IL_0326: Unknown result type (might be due to invalid IL or missing references) //IL_033e: Unknown result type (might be due to invalid IL or missing references) //IL_0350: Unknown result type (might be due to invalid IL or missing references) //IL_0351: Unknown result type (might be due to invalid IL or missing references) //IL_0366: Unknown result type (might be due to invalid IL or missing references) //IL_036b: Unknown result type (might be due to invalid IL or missing references) //IL_0370: Unknown result type (might be due to invalid IL or missing references) //IL_0389: Unknown result type (might be due to invalid IL or missing references) //IL_039a: Unknown result type (might be due to invalid IL or missing references) //IL_03b2: Unknown result type (might be due to invalid IL or missing references) //IL_03c4: Unknown result type (might be due to invalid IL or missing references) //IL_03c5: Unknown result type (might be due to invalid IL or missing references) //IL_03c8: Unknown result type (might be due to invalid IL or missing references) //IL_03cd: Unknown result type (might be due to invalid IL or missing references) //IL_03d2: Unknown result type (might be due to invalid IL or missing references) //IL_03e4: Unknown result type (might be due to invalid IL or missing references) //IL_03e9: Unknown result type (might be due to invalid IL or missing references) //IL_03ee: Unknown result type (might be due to invalid IL or missing references) //IL_0407: Unknown result type (might be due to invalid IL or missing references) //IL_0418: Unknown result type (might be due to invalid IL or missing references) //IL_0439: Unknown result type (might be due to invalid IL or missing references) //IL_044b: Unknown result type (might be due to invalid IL or missing references) //IL_044c: Unknown result type (might be due to invalid IL or missing references) //IL_044f: Unknown result type (might be due to invalid IL or missing references) //IL_0454: Unknown result type (might be due to invalid IL or missing references) //IL_0459: Unknown result type (might be due to invalid IL or missing references) //IL_046b: Unknown result type (might be due to invalid IL or missing references) //IL_0470: Unknown result type (might be due to invalid IL or missing references) //IL_0475: Unknown result type (might be due to invalid IL or missing references) //IL_048e: Unknown result type (might be due to invalid IL or missing references) //IL_049f: Unknown result type (might be due to invalid IL or missing references) //IL_04c0: Unknown result type (might be due to invalid IL or missing references) float num = depth; if (mode != 2) { GameObject orCreatePreviewObject = GetOrCreatePreviewObject(0); orCreatePreviewObject.SetActive(true); for (int i = 1; i < previewObjs.Count; i++) { if ((Object)(object)previewObjs[i] != (Object)null) { previewObjs[i].SetActive(false); } } float num2 = width; switch (mode) { case 0: num2 = 1f; break; case 3: if (num > 0f) { num = 0f - num; } break; } float num3 = 0f; Vector3 val = playerPos + forward * direction switch { 0 => length / 2f, 1 => (0f - length) / 2f, _ => 0f, }; float num4 = playerPos.y - num / 2f; orCreatePreviewObject.transform.position = new Vector3(val.x, num4, val.z); orCreatePreviewObject.transform.rotation = Quaternion.LookRotation(forward, Vector3.up); orCreatePreviewObject.transform.localScale = new Vector3(num2, Mathf.Abs(num), length); return; } float num5 = 2f; if (length <= 2f * num5 || width <= 2f * num5) { GameObject orCreatePreviewObject2 = GetOrCreatePreviewObject(0); orCreatePreviewObject2.SetActive(true); for (int j = 1; j < previewObjs.Count; j++) { if ((Object)(object)previewObjs[j] != (Object)null) { previewObjs[j].SetActive(false); } } float num6 = 0f; Vector3 val2 = playerPos + forward * direction switch { 0 => length / 2f, 1 => (0f - length) / 2f, _ => 0f, }; float num7 = playerPos.y - num / 2f; orCreatePreviewObject2.transform.position = new Vector3(val2.x, num7, val2.z); orCreatePreviewObject2.transform.rotation = Quaternion.LookRotation(forward, Vector3.up); orCreatePreviewObject2.transform.localScale = new Vector3(width, Mathf.Abs(num), length); return; } for (int k = 0; k < 4; k++) { GetOrCreatePreviewObject(k).SetActive(true); } for (int l = 4; l < previewObjs.Count; l++) { if ((Object)(object)previewObjs[l] != (Object)null) { previewObjs[l].SetActive(false); } } float num8 = 0f; num8 = direction switch { 0 => length / 2f, 1 => (0f - length) / 2f, _ => 0f, }; float num9 = playerPos.y - num / 2f; Quaternion rotation = Quaternion.LookRotation(forward, Vector3.up); GameObject orCreatePreviewObject3 = GetOrCreatePreviewObject(0); Vector3 val3 = playerPos + forward * (num8 + length / 2f - num5 / 2f); orCreatePreviewObject3.transform.position = new Vector3(val3.x, num9, val3.z); orCreatePreviewObject3.transform.rotation = rotation; orCreatePreviewObject3.transform.localScale = new Vector3(width, Mathf.Abs(num), num5); GameObject orCreatePreviewObject4 = GetOrCreatePreviewObject(1); Vector3 val4 = playerPos + forward * (num8 - length / 2f + num5 / 2f); orCreatePreviewObject4.transform.position = new Vector3(val4.x, num9, val4.z); orCreatePreviewObject4.transform.rotation = rotation; orCreatePreviewObject4.transform.localScale = new Vector3(width, Mathf.Abs(num), num5); GameObject orCreatePreviewObject5 = GetOrCreatePreviewObject(2); Vector3 val5 = playerPos + forward * num8 - right * (width / 2f - num5 / 2f); orCreatePreviewObject5.transform.position = new Vector3(val5.x, num9, val5.z); orCreatePreviewObject5.transform.rotation = rotation; orCreatePreviewObject5.transform.localScale = new Vector3(num5, Mathf.Abs(num), length - 2f * num5); GameObject orCreatePreviewObject6 = GetOrCreatePreviewObject(3); Vector3 val6 = playerPos + forward * num8 + right * (width / 2f - num5 / 2f); orCreatePreviewObject6.transform.position = new Vector3(val6.x, num9, val6.z); orCreatePreviewObject6.transform.rotation = rotation; orCreatePreviewObject6.transform.localScale = new Vector3(num5, Mathf.Abs(num), length - 2f * num5); } public static void Hide() { foreach (GameObject previewObj in previewObjs) { if ((Object)(object)previewObj != (Object)null) { previewObj.SetActive(false); } } } public static void Destroy() { foreach (GameObject previewObj in previewObjs) { if ((Object)(object)previewObj != (Object)null) { Object.Destroy((Object)(object)previewObj); } } previewObjs.Clear(); if ((Object)(object)previewMat != (Object)null) { Object.Destroy((Object)(object)previewMat); previewMat = null; } } } public class DigDugUI : MonoBehaviour { private static Rect windowRect = new Rect(100f, 100f, 750f, 680f); private static GUIStyle windowStyle; private static GUIStyle buttonStyle; private static GUIStyle textFieldStyle; private static GUIStyle labelStyle; private static GUIStyle headerStyle; private static GUIStyle costLabelStyle; private string depthStr = "4.0"; private string lengthStr = "4.0"; private string widthStr = "4.0"; private int selectedMode = 1; private readonly string[] modeLabels = new string[4] { "Line", "Rectangle", "Trench", "Wall" }; private int selectedDirection; private readonly string[] directionLabels = new string[3] { "Forward", "Backward", "Center" }; private int selectedPaint; private readonly string[] paintLabels = new string[4] { "Dirt", "Paved", "Grass", "No Change" }; private static Font nativeFont; private float leftArrowDownTime; private float rightArrowDownTime; public static DigDugUI Instance { get; private set; } public static bool IsVisible { get; private set; } private void Awake() { Instance = this; IsVisible = false; } private void OnDestroy() { DigDugPreview.Destroy(); } public static void Show() { if (!((Object)(object)Player.m_localPlayer == (Object)null)) { IsVisible = true; ToggleCursor(visible: true); } } public static void Hide() { IsVisible = false; ToggleCursor(visible: false); DigDugPreview.Hide(); } private static void ToggleCursor(bool visible) { if (visible) { Cursor.lockState = (CursorLockMode)0; Cursor.visible = true; } else { Cursor.lockState = (CursorLockMode)1; Cursor.visible = false; } } private void HandleArrowKeyRotation(Player player) { //IL_000b: 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_0034: 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_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: 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_00d8: 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_00e5: 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_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) float num = 0f; KeyboardShortcut value = DigDugConfig.RotateLeftKey.Value; if (((KeyboardShortcut)(ref value)).IsDown()) { num -= 1f; leftArrowDownTime = Time.time; } else { KeyboardShortcut value2 = DigDugConfig.RotateLeftKey.Value; if (((KeyboardShortcut)(ref value2)).IsPressed() && Time.time - leftArrowDownTime > 0.3f) { num -= 30f * Time.deltaTime; } } KeyboardShortcut value3 = DigDugConfig.RotateRightKey.Value; if (((KeyboardShortcut)(ref value3)).IsDown()) { num += 1f; rightArrowDownTime = Time.time; } else { KeyboardShortcut value4 = DigDugConfig.RotateRightKey.Value; if (((KeyboardShortcut)(ref value4)).IsPressed() && Time.time - rightArrowDownTime > 0.3f) { num += 30f * Time.deltaTime; } } if (Mathf.Abs(num) > 0.0001f) { Quaternion lookYaw = ((Character)player).GetLookYaw(); Quaternion val = lookYaw * Quaternion.Euler(0f, num, 0f); ((Character)player).SetLookDir(val * Vector3.forward, 0f); player.FaceLookDirection(); } } private void Update() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Invalid comparison between Unknown and I4 //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer != (Object)null) { ItemData currentWeapon = ((Humanoid)localPlayer).GetCurrentWeapon(); if (currentWeapon != null && (int)currentWeapon.m_shared.m_skillType == 12) { HandleArrowKeyRotation(localPlayer); KeyboardShortcut value = DigDugConfig.MenuHotkey.Value; if ((int)((KeyboardShortcut)(ref value)).MainKey != 0) { KeyboardShortcut value2 = DigDugConfig.MenuHotkey.Value; if (((KeyboardShortcut)(ref value2)).IsDown()) { if (IsVisible) { Hide(); return; } if (!InventoryGui.IsVisible() && !Minimap.IsOpen() && !Menu.IsVisible() && !Console.IsVisible() && !StoreGui.IsVisible() && !TextInput.IsVisible() && !Hud.InRadial() && !Hud.IsPieceSelectionVisible()) { DigDugPlugin.Log.LogInfo((object)"DigDug: Menu hotkey detected! Triggering UI."); Show(); } } } } } if (IsVisible) { if (Input.GetKeyDown((KeyCode)27)) { Hide(); return; } Cursor.lockState = (CursorLockMode)0; Cursor.visible = true; UpdatePreviewObject(); } } private void LateUpdate() { if (IsVisible) { Cursor.lockState = (CursorLockMode)0; Cursor.visible = true; } } private void UpdatePreviewObject() { //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_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0062: 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_0069: Unknown result type (might be due to invalid IL or missing references) Player localPlayer = Player.m_localPlayer; if (!((Object)(object)localPlayer == (Object)null)) { ParseInputs(out var depth, out var length, out var width); Vector3 forward = ((Component)localPlayer).transform.forward; forward.y = 0f; ((Vector3)(ref forward)).Normalize(); Vector3 right = ((Component)localPlayer).transform.right; right.y = 0f; ((Vector3)(ref right)).Normalize(); DigDugPreview.UpdatePreview(((Component)localPlayer).transform.position, forward, right, depth, length, width, selectedMode, selectedDirection); } } private void ParseInputs(out float depth, out float length, out float width) { if (!float.TryParse(depthStr, out depth)) { depth = 4f; } if (!float.TryParse(lengthStr, out length)) { length = 4f; } if (!float.TryParse(widthStr, out width)) { width = 4f; } float value = DigDugConfig.MaxTerrainOffset.Value; depth = Mathf.Clamp(depth, 0f - value, value); length = Mathf.Clamp(length, 0.1f, 100f); width = Mathf.Clamp(width, 0.1f, 100f); } private void OnGUI() { //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Expected O, but got Unknown //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Invalid comparison between Unknown and I4 //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //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_0045: 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_0057: Unknown result type (might be due to invalid IL or missing references) DrawHUDOverlay(); if (!IsVisible) { return; } if (Event.current != null && (int)Event.current.type == 4) { KeyCode keyCode = Event.current.keyCode; KeyboardShortcut value = DigDugConfig.RotateLeftKey.Value; if (keyCode != ((KeyboardShortcut)(ref value)).MainKey) { KeyCode keyCode2 = Event.current.keyCode; KeyboardShortcut value2 = DigDugConfig.RotateRightKey.Value; if (keyCode2 != ((KeyboardShortcut)(ref value2)).MainKey) { goto IL_0064; } } GUI.FocusControl((string)null); } goto IL_0064; IL_0064: Cursor.lockState = (CursorLockMode)0; Cursor.visible = true; VerifyStyles(); ((Rect)(ref windowRect)).x = ((float)Screen.width - ((Rect)(ref windowRect)).width) / 2f; ((Rect)(ref windowRect)).y = ((float)Screen.height - ((Rect)(ref windowRect)).height) / 2f; windowRect = GUI.Window(9923, windowRect, new WindowFunction(DrawWindow), "DIGDUG EXCAVATION", windowStyle); } private void DrawWindow(int windowID) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_05e3: Unknown result type (might be due to invalid IL or missing references) //IL_05ea: Expected O, but got Unknown //IL_05f1: Unknown result type (might be due to invalid IL or missing references) //IL_0619: Unknown result type (might be due to invalid IL or missing references) //IL_061e: Unknown result type (might be due to invalid IL or missing references) //IL_0634: Unknown result type (might be due to invalid IL or missing references) //IL_0639: Unknown result type (might be due to invalid IL or missing references) GUILayout.BeginVertical((GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Space(25f); GUIStyle val = new GUIStyle(labelStyle); val.normal.textColor = new Color(0.92f, 0.73f, 0.16f, 1f); val.alignment = (TextAnchor)4; val.fontSize = 24; GUILayout.Label(GetFacingString(), val, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(35f) }); GUILayout.Space(5f); GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Label("Mode:", labelStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(130f), GUILayout.Height(36f) }); int num = selectedMode; selectedMode = GUILayout.SelectionGrid(selectedMode, modeLabels, 4, buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(36f) }); GUILayout.EndHorizontal(); if (selectedMode != num) { if (selectedMode == 0) { depthStr = "2.0"; lengthStr = "10.0"; widthStr = "1.0"; } else if (selectedMode == 1) { depthStr = "4.0"; lengthStr = "4.0"; widthStr = "4.0"; } else if (selectedMode == 2) { depthStr = "4.0"; lengthStr = "4.0"; widthStr = "4.0"; } else if (selectedMode == 3) { depthStr = "2.0"; lengthStr = "4.0"; widthStr = "4.0"; } } GUILayout.Space(6f); ParseInputs(out var depth, out var length, out var width); GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); string text = ((selectedMode == 3) ? "Height:" : "Depth:"); GUILayout.Label(text, labelStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(130f), GUILayout.Height(36f) }); depthStr = GUILayout.TextField(depthStr, textFieldStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(36f) }); GUILayout.EndHorizontal(); GUILayout.Space(6f); GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Label("Length:", labelStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(130f), GUILayout.Height(36f) }); lengthStr = GUILayout.TextField(lengthStr, textFieldStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(36f) }); GUILayout.EndHorizontal(); GUILayout.Space(6f); if (selectedMode != 0) { GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Label("Width:", labelStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(130f), GUILayout.Height(36f) }); widthStr = GUILayout.TextField(widthStr, textFieldStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(36f) }); GUILayout.EndHorizontal(); GUILayout.Space(6f); } if (selectedMode != 2) { GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Label("Direction:", labelStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(130f), GUILayout.Height(36f) }); selectedDirection = GUILayout.SelectionGrid(selectedDirection, directionLabels, 3, buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(36f) }); GUILayout.EndHorizontal(); GUILayout.Space(6f); } GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Label("Paint:", labelStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(130f), GUILayout.Height(36f) }); selectedPaint = GUILayout.SelectionGrid(selectedPaint, paintLabels, 4, buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(36f) }); GUILayout.EndHorizontal(); GUILayout.Space(6f); GUILayout.Space(10f); CalculateCosts(depth, length, width, out var area, out var swingCount, out var staminaCost, out var durabilityCost, out var stoneCost); GUILayout.BeginVertical(GUI.skin.box, (GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Label($"Area: {area:F1} m² | Swings: {swingCount}", costLabelStyle, (GUILayoutOption[])(object)new GUILayoutOption[0]); if (selectedMode == 3 || depth < 0f) { int stoneCount = GetStoneCount(); bool flag = DigDugConfig.IgnoreStoneRequirement.Value || ((Object)(object)Player.m_localPlayer != (Object)null && Player.m_localPlayer.NoCostCheat()); string arg = ((stoneCount >= stoneCost || flag) ? "lime" : "red"); GUILayout.Label($"Stone Cost: {stoneCost} / {stoneCount} available", costLabelStyle, (GUILayoutOption[])(object)new GUILayoutOption[0]); } string arg2 = "lime"; float totalPickaxeDurability = GetTotalPickaxeDurability(); if (totalPickaxeDurability < durabilityCost && !DigDugConfig.IgnoreDurabilityLoss.Value) { arg2 = "red"; } GUILayout.Label($"Durability Cost: {durabilityCost:F0} / {totalPickaxeDurability:F0} available", costLabelStyle, (GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Label($"Stamina Cost: {staminaCost:F0}", costLabelStyle, (GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.EndVertical(); GUILayout.Space(10f); GUIStyle val2 = new GUIStyle(labelStyle); val2.normal.textColor = Color.white; val2.alignment = (TextAnchor)4; val2.fontSize = 28; val2.wordWrap = true; string text2 = ((object)DigDugConfig.RotateLeftKey.Value/*cast due to .constrained prefix*/).ToString(); string text3 = ((object)DigDugConfig.RotateRightKey.Value/*cast due to .constrained prefix*/).ToString(); string text4 = "Tip: Use " + text2 + "/" + text3 + " to rotate 1° (hold to rotate continuously)"; GUILayout.Label(text4, val2, (GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Space(10f); GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.FlexibleSpace(); if (GUILayout.Button("Cancel", buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(140f), GUILayout.Height(38f) })) { Hide(); } GUILayout.Space(15f); string text5 = ((selectedMode == 3 || depth < 0f) ? "Build!" : "Dig!"); if (GUILayout.Button(text5, buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(140f), GUILayout.Height(38f) })) { ExecuteDig(depth, length, width, area, swingCount, staminaCost, durabilityCost, stoneCost); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); } private void CalculateCosts(float depth, float length, float width, out float area, out int swingCount, out float staminaCost, out float durabilityCost, out int stoneCost) { //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Invalid comparison between Unknown and I4 float num = width; float num2 = Mathf.Abs(depth); if (selectedMode == 0) { num = 1f; } area = length * num; if (selectedMode == 2) { float num3 = 2f; if (length > 2f * num3 && num > 2f * num3) { float num4 = (length - 2f * num3) * (num - 2f * num3); area -= num4; } } swingCount = Mathf.Max(1, Mathf.RoundToInt(area / 12.5f * Mathf.Max(1f, num2))); staminaCost = 0f; durabilityCost = 0f; stoneCost = 0; Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer != (Object)null) { ItemData currentWeapon = ((Humanoid)localPlayer).GetCurrentWeapon(); if (currentWeapon != null && (int)currentWeapon.m_shared.m_skillType == 12) { staminaCost = currentWeapon.m_shared.m_attack.m_attackStamina * (float)swingCount; durabilityCost = currentWeapon.m_shared.m_useDurabilityDrain * (float)swingCount; } } if (selectedMode == 3 || depth < 0f) { stoneCost = Mathf.Max(1, Mathf.RoundToInt(area / 12.5f * Mathf.Max(1f, num2) * 2f * DigDugConfig.StoneCostMultiplier.Value)); } } private int GetStoneCount() { Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null) { return 0; } return ((Humanoid)localPlayer).GetInventory().CountItems("$item_stone", -1, false); } private float GetTotalPickaxeDurability() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Invalid comparison between Unknown and I4 Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null) { return 0f; } float num = 0f; foreach (ItemData allItem in ((Humanoid)localPlayer).GetInventory().GetAllItems()) { if ((int)allItem.m_shared.m_skillType == 12) { num += allItem.m_durability; } } return num; } private TerrainComp GetOrCreateCompiler(Vector3 point) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) TerrainComp val = TerrainComp.FindTerrainCompiler(point); if ((Object)(object)val != (Object)null) { return val; } Heightmap val2 = Heightmap.FindHeightmap(point); if ((Object)(object)val2 != (Object)null) { return val2.GetAndCreateTerrainCompiler(); } return null; } public static bool CheckAccessAtPoint(Vector3 point, out string blockMessage) { //IL_0022: 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_004a: 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) //IL_0088: Unknown result type (might be due to invalid IL or missing references) blockMessage = null; Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null) { return true; } if (point.y > 2000f || (Object)(object)Heightmap.FindHeightmap(point) == (Object)null) { blockMessage = "$msg_nobuildzone"; return false; } if (Location.IsInsideNoBuildLocation(point)) { blockMessage = "$msg_nobuildzone"; return false; } if (!PrivateArea.CheckAccess(point, 0f, false, true)) { blockMessage = "$msg_nobuildzone"; foreach (PrivateArea allArea in DigDugReflection.GetAllAreas()) { if (DigDugReflection.IsAreaEnabled(allArea) && Vector3.Distance(((Component)allArea).transform.position, point) < allArea.m_radius && allArea.m_name == "$piece_guardstone") { blockMessage = "$msg_privatezone"; break; } } return false; } return true; } private void ExecuteDig(float depth, float length, float width, float area, int swingCount, float staminaCost, float durabilityCost, int stoneCost) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Invalid comparison between Unknown and I4 //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_005f: 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_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: 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_0132: 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_0144: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0151: 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_015b: Unknown result type (might be due to invalid IL or missing references) //IL_015f: 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_0169: Unknown result type (might be due to invalid IL or missing references) //IL_016b: 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_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_017f: 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_0189: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_019f: 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_01a9: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01ea: 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_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_0217: 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) //IL_0226: Unknown result type (might be due to invalid IL or missing references) //IL_0228: Unknown result type (might be due to invalid IL or missing references) //IL_0243: Unknown result type (might be due to invalid IL or missing references) //IL_0248: Unknown result type (might be due to invalid IL or missing references) //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: 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_02a9: Unknown result type (might be due to invalid IL or missing references) //IL_02ae: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Unknown result type (might be due to invalid IL or missing references) //IL_02b7: Unknown result type (might be due to invalid IL or missing references) //IL_02bc: Unknown result type (might be due to invalid IL or missing references) //IL_02c1: Unknown result type (might be due to invalid IL or missing references) //IL_02c4: Unknown result type (might be due to invalid IL or missing references) //IL_035a: Unknown result type (might be due to invalid IL or missing references) //IL_035f: Unknown result type (might be due to invalid IL or missing references) //IL_03af: Unknown result type (might be due to invalid IL or missing references) //IL_03b1: Unknown result type (might be due to invalid IL or missing references) //IL_03b3: Unknown result type (might be due to invalid IL or missing references) //IL_03b8: Unknown result type (might be due to invalid IL or missing references) //IL_03ba: Unknown result type (might be due to invalid IL or missing references) //IL_03bc: Unknown result type (might be due to invalid IL or missing references) //IL_03c5: Unknown result type (might be due to invalid IL or missing references) //IL_03c7: Unknown result type (might be due to invalid IL or missing references) //IL_05f9: Unknown result type (might be due to invalid IL or missing references) //IL_0600: Expected O, but got Unknown //IL_0803: Unknown result type (might be due to invalid IL or missing references) //IL_0808: Unknown result type (might be due to invalid IL or missing references) //IL_0810: Unknown result type (might be due to invalid IL or missing references) //IL_0815: Unknown result type (might be due to invalid IL or missing references) //IL_0830: Unknown result type (might be due to invalid IL or missing references) //IL_0835: Unknown result type (might be due to invalid IL or missing references) //IL_064d: Unknown result type (might be due to invalid IL or missing references) //IL_0653: Expected O, but got Unknown //IL_052a: Unknown result type (might be due to invalid IL or missing references) //IL_0907: Unknown result type (might be due to invalid IL or missing references) //IL_0909: Unknown result type (might be due to invalid IL or missing references) //IL_090d: Unknown result type (might be due to invalid IL or missing references) //IL_0912: Unknown result type (might be due to invalid IL or missing references) //IL_0917: Unknown result type (might be due to invalid IL or missing references) //IL_091b: Unknown result type (might be due to invalid IL or missing references) //IL_0920: Unknown result type (might be due to invalid IL or missing references) //IL_0925: Unknown result type (might be due to invalid IL or missing references) //IL_0928: Unknown result type (might be due to invalid IL or missing references) //IL_0733: Unknown result type (might be due to invalid IL or missing references) //IL_0a51: Unknown result type (might be due to invalid IL or missing references) //IL_0a56: Unknown result type (might be due to invalid IL or missing references) //IL_0ad3: Unknown result type (might be due to invalid IL or missing references) //IL_0ad5: Unknown result type (might be due to invalid IL or missing references) //IL_0ad7: Unknown result type (might be due to invalid IL or missing references) //IL_0adc: Unknown result type (might be due to invalid IL or missing references) //IL_0ade: Unknown result type (might be due to invalid IL or missing references) //IL_0ae0: Unknown result type (might be due to invalid IL or missing references) //IL_0ae9: Unknown result type (might be due to invalid IL or missing references) //IL_0aeb: Unknown result type (might be due to invalid IL or missing references) //IL_0e47: Unknown result type (might be due to invalid IL or missing references) //IL_0fbe: Unknown result type (might be due to invalid IL or missing references) //IL_0f9f: Unknown result type (might be due to invalid IL or missing references) //IL_0fa1: Unknown result type (might be due to invalid IL or missing references) //IL_0fd2: Unknown result type (might be due to invalid IL or missing references) //IL_0ff1: Unknown result type (might be due to invalid IL or missing references) //IL_0ff6: Unknown result type (might be due to invalid IL or missing references) //IL_1002: Unknown result type (might be due to invalid IL or missing references) //IL_100a: Unknown result type (might be due to invalid IL or missing references) //IL_0f30: Unknown result type (might be due to invalid IL or missing references) //IL_0f37: Invalid comparison between Unknown and I4 //IL_0c97: Unknown result type (might be due to invalid IL or missing references) //IL_0c9c: Unknown result type (might be due to invalid IL or missing references) //IL_0cb3: Unknown result type (might be due to invalid IL or missing references) //IL_0cb5: Unknown result type (might be due to invalid IL or missing references) //IL_0ccb: Unknown result type (might be due to invalid IL or missing references) //IL_0cd0: Unknown result type (might be due to invalid IL or missing references) //IL_0ce7: Unknown result type (might be due to invalid IL or missing references) //IL_0ce9: Unknown result type (might be due to invalid IL or missing references) //IL_0cff: Unknown result type (might be due to invalid IL or missing references) //IL_0d04: Unknown result type (might be due to invalid IL or missing references) //IL_0d1b: Unknown result type (might be due to invalid IL or missing references) //IL_0d1d: Unknown result type (might be due to invalid IL or missing references) Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null) { return; } ItemData currentWeapon = ((Humanoid)localPlayer).GetCurrentWeapon(); if (currentWeapon == null || (int)currentWeapon.m_shared.m_skillType != 12) { ((Character)localPlayer).Message((MessageType)1, "You must equip a pickaxe to execute this operation!", 0, (Sprite)null); return; } float value = DigDugConfig.MaxTerrainOffset.Value; float num = 0f; int num2 = 0; Vector3 position = ((Component)localPlayer).transform.position; Vector3 forward = ((Component)localPlayer).transform.forward; forward.y = 0f; ((Vector3)(ref forward)).Normalize(); Vector3 right = ((Component)localPlayer).transform.right; right.y = 0f; ((Vector3)(ref right)).Normalize(); float num3 = width; float num4 = depth; if (selectedMode == 0) { num3 = 1f; } else if (selectedMode == 3) { num4 = 0f - depth; } float num5 = 0f; float num6 = 0f; float num7 = (0f - num3) / 2f; float num8 = num3 / 2f; if (selectedDirection == 0) { num5 = 0.5f; num6 = length + 0.5f; } else if (selectedDirection == 1) { num5 = 0f - length - 0.5f; num6 = -0.5f; } else { num5 = (0f - length) / 2f; num6 = length / 2f; } Vector3 val = position + forward * ((num5 + num6) / 2f); Vector3 val2 = position + forward * num5 + right * num7; Vector3 val3 = position + forward * num5 + right * num8; Vector3 val4 = position + forward * num6 + right * num7; Vector3 val5 = position + forward * num6 + right * num8; Vector3[] array = (Vector3[])(object)new Vector3[6] { position, val, val2, val3, val4, val5 }; Vector3[] array2 = array; foreach (Vector3 point in array2) { if (!CheckAccessAtPoint(point, out var blockMessage)) { Hide(); ((Character)localPlayer).Message((MessageType)2, blockMessage, 0, (Sprite)null); return; } } float num9 = position.y - num4; HashSet hashSet = new HashSet(); for (float num10 = num5 - 4f; num10 <= num6 + 4f; num10 += 8f) { for (float num11 = num7 - 4f; num11 <= num8 + 4f; num11 += 8f) { Vector3 point2 = position + forward * num10 + right * num11; TerrainComp orCreateCompiler = GetOrCreateCompiler(point2); if ((Object)(object)orCreateCompiler != (Object)null) { hashSet.Add(orCreateCompiler); } } } HashSet hashSet2 = new HashSet(); Vector3 val6 = default(Vector3); foreach (TerrainComp item3 in hashSet) { Heightmap hmap = DigDugReflection.GetHmap(item3); if ((Object)(object)hmap == (Object)null) { continue; } int width2 = hmap.m_width; float scale = hmap.m_scale; Vector3 position2 = ((Component)hmap).transform.position; int num12 = width2 / 2; for (int j = 0; j <= width2; j++) { for (int k = 0; k <= width2; k++) { float num13 = position2.x + (float)(k - num12) * scale; float num14 = position2.z + (float)(j - num12) * scale; ((Vector3)(ref val6))..ctor(num13, position.y, num14); Vector3 val7 = val6 - position; float num15 = Vector3.Dot(val7, forward); float num16 = Vector3.Dot(val7, right); float num17 = num5 - scale / 2f; float num18 = num6 + scale / 2f; float num19 = num7 - scale / 2f; float num20 = num8 + scale / 2f; if (!(num15 >= num17 - 0.1f) || !(num15 <= num18 + 0.1f) || !(num16 >= num19 - 0.1f) || !(num16 <= num20 + 0.1f)) { continue; } if (selectedMode == 2) { float num21 = 2f; if (length > 2f * num21 && num3 > 2f * num21 && num15 >= num17 + num21 - 0.01f && num15 <= num18 - num21 + 0.01f && num16 >= num19 + num21 - 0.01f && num16 <= num20 - num21 + 0.01f) { continue; } } string item = ((Object)((Component)item3).gameObject).name + "_" + k + "_" + j; if (!hashSet2.Contains(item)) { hashSet2.Add(item); num2++; float height = hmap.GetHeight(k, j); DigDugReflection.GetWorldBaseHeight(hmap, new Vector3(num13, position.y, num14), out var baseHeight); float num22 = Mathf.Clamp(num9, baseHeight - value, baseHeight + value); num += Mathf.Abs(num22 - height); } } } } if (num2 > 0 && num < 0.01f && (!(Mathf.Abs(depth) < 0.001f) || selectedPaint == 3)) { ((Character)localPlayer).Message((MessageType)1, "Cannot execute! The target height is already reached or exceeds the maximum terrain modification limit (" + value + "m from original base ground).", 0, (Sprite)null); return; } bool flag = selectedMode == 3 || depth < 0f; GameObject val8 = null; Piece val9 = null; if (flag) { val8 = new GameObject("DigDug_DummyPiece"); val8.SetActive(false); val9 = val8.AddComponent(); GameObject itemPrefab = ObjectDB.instance.GetItemPrefab("Stone"); ItemDrop resItem = (((Object)(object)itemPrefab != (Object)null) ? itemPrefab.GetComponent() : null); val9.m_resources = (Requirement[])(object)new Requirement[1]; val9.m_resources[0] = new Requirement(); val9.m_resources[0].m_resItem = resItem; val9.m_resources[0].m_amount = stoneCost; val9.m_resources[0].m_amountPerLevel = 0; val9.m_resources[0].m_recover = true; if (selectedMode == 3) { GameObject prefab = ZNetScene.instance.GetPrefab("piece_stonecutter"); val9.m_craftingStation = (((Object)(object)prefab != (Object)null) ? prefab.GetComponent() : null); } else { GameObject prefab2 = ZNetScene.instance.GetPrefab("piece_workbench"); val9.m_craftingStation = (((Object)(object)prefab2 != (Object)null) ? prefab2.GetComponent() : null); } if (!localPlayer.NoCostCheat() && !DigDugConfig.IgnoreStoneRequirement.Value) { if ((Object)(object)val9.m_craftingStation != (Object)null) { string name = val9.m_craftingStation.m_name; if (!Object.op_Implicit((Object)(object)CraftingStation.HaveBuildStationInRange(name, ((Component)localPlayer).transform.position))) { string text = Localization.instance.Localize(name); ((Character)localPlayer).Message((MessageType)1, "Missing station: " + text + " in range!", 0, (Sprite)null); Object.Destroy((Object)(object)val8); return; } } if (!localPlayer.HaveRequirements(val9, (RequirementMode)0)) { int stoneCount = GetStoneCount(); ((Character)localPlayer).Message((MessageType)1, $"Not enough stone! Required: {stoneCost}, you have: {stoneCount}", 0, (Sprite)null); Object.Destroy((Object)(object)val8); return; } } } if (!DigDugConfig.IgnoreDurabilityLoss.Value) { float totalPickaxeDurability = GetTotalPickaxeDurability(); if (totalPickaxeDurability < durabilityCost) { ((Character)localPlayer).Message((MessageType)1, $"Your pickaxes are too damaged! Required durability: {durabilityCost:F0}, you have: {totalPickaxeDurability:F0}", 0, (Sprite)null); if ((Object)(object)val8 != (Object)null) { Object.Destroy((Object)(object)val8); } return; } } Vector3 position3 = ((Component)localPlayer).transform.position; Vector3 forward2 = ((Component)localPlayer).transform.forward; forward2.y = 0f; ((Vector3)(ref forward2)).Normalize(); Vector3 right2 = ((Component)localPlayer).transform.right; right2.y = 0f; ((Vector3)(ref right2)).Normalize(); float num23 = width; float num24 = depth; if (selectedMode == 0) { num23 = 1f; } else if (selectedMode == 3) { num24 = 0f - depth; } float num25 = 0f; float num26 = 0f; float num27 = (0f - num23) / 2f; float num28 = num23 / 2f; if (selectedDirection == 0) { num25 = 0f; num26 = length; } else if (selectedDirection == 1) { num25 = 0f - length; num26 = 0f; } else { num25 = (0f - length) / 2f; num26 = length / 2f; } float num29 = position3.y - num24; HashSet hashSet3 = new HashSet(); float num30 = 8f; for (float num31 = num25 - 4f; num31 <= num26 + 4f; num31 += num30) { for (float num32 = num27 - 4f; num32 <= num28 + 4f; num32 += num30) { Vector3 point3 = position3 + forward2 * num31 + right2 * num32; TerrainComp orCreateCompiler2 = GetOrCreateCompiler(point3); if ((Object)(object)orCreateCompiler2 != (Object)null) { hashSet3.Add(orCreateCompiler2); } } } HashSet hashSet4 = new HashSet(); HashSet hashSet5 = new HashSet(); Vector3 val10 = default(Vector3); foreach (TerrainComp item4 in hashSet3) { ZNetView nView = DigDugReflection.GetNView(item4); if ((Object)(object)nView != (Object)null && nView.IsValid()) { long owner = nView.GetZDO().GetOwner(); long uID = ZNet.GetUID(); DigDugPlugin.Log.LogInfo((object)("DigDug: Modifying TerrainComp. ZDO Owner: " + owner + ", Local UID: " + uID + ", IsOwner: " + nView.IsOwner())); nView.ClaimOwnership(); } Heightmap hmap2 = DigDugReflection.GetHmap(item4); if ((Object)(object)hmap2 == (Object)null) { continue; } int width3 = hmap2.m_width; float scale2 = hmap2.m_scale; Vector3 position4 = ((Component)hmap2).transform.position; int num33 = width3 / 2; float[] levelDelta = DigDugReflection.GetLevelDelta(item4); float[] smoothDelta = DigDugReflection.GetSmoothDelta(item4); bool[] modifiedHeight = DigDugReflection.GetModifiedHeight(item4); Color[] paintMask = DigDugReflection.GetPaintMask(item4); bool[] modifiedPaint = DigDugReflection.GetModifiedPaint(item4); for (int l = 0; l <= width3; l++) { for (int m = 0; m <= width3; m++) { float num34 = position4.x + (float)(m - num33) * scale2; float num35 = position4.z + (float)(l - num33) * scale2; ((Vector3)(ref val10))..ctor(num34, position3.y, num35); Vector3 val11 = val10 - position3; float num36 = Vector3.Dot(val11, forward2); float num37 = Vector3.Dot(val11, right2); float num38 = num25 - scale2 / 2f; float num39 = num26 + scale2 / 2f; float num40 = num27 - scale2 / 2f; float num41 = num28 + scale2 / 2f; if (!(num36 >= num38 - 0.1f) || !(num36 <= num39 + 0.1f) || !(num37 >= num40 - 0.1f) || !(num37 <= num41 + 0.1f)) { continue; } if (selectedMode == 2) { float num42 = 2f; if (length > 2f * num42 && num23 > 2f * num42 && num36 >= num38 + num42 - 0.01f && num36 <= num39 - num42 + 0.01f && num37 >= num40 + num42 - 0.01f && num37 <= num41 - num42 + 0.01f) { continue; } } string item2 = ((Object)((Component)item4).gameObject).name + "_" + m + "_" + l; if (!hashSet4.Contains(item2)) { hashSet4.Add(item2); int num43 = l * (width3 + 1) + m; float height2 = hmap2.GetHeight(m, l); float num44 = num29 - height2; num44 += smoothDelta[num43]; smoothDelta[num43] = 0f; levelDelta[num43] += num44; levelDelta[num43] = Mathf.Clamp(levelDelta[num43], 0f - value, value); modifiedHeight[num43] = true; if (selectedPaint == 0) { Color paintMaskDirt = Heightmap.m_paintMaskDirt; paintMaskDirt.a = 0f; paintMask[num43] = paintMaskDirt; modifiedPaint[num43] = true; } else if (selectedPaint == 1) { Color paintMaskPaved = Heightmap.m_paintMaskPaved; paintMaskPaved.a = 0f; paintMask[num43] = paintMaskPaved; modifiedPaint[num43] = true; } else if (selectedPaint == 2) { Color paintMaskNothing = Heightmap.m_paintMaskNothing; paintMaskNothing.a = 1f; paintMask[num43] = paintMaskNothing; modifiedPaint[num43] = true; } hashSet5.Add(item4); } } } } foreach (TerrainComp item5 in hashSet5) { ZNetView nView2 = DigDugReflection.GetNView(item5); if ((Object)(object)nView2 != (Object)null && nView2.IsValid()) { long owner2 = nView2.GetZDO().GetOwner(); long uID2 = ZNet.GetUID(); DigDugPlugin.Log.LogInfo((object)("DigDug: Saving TerrainComp. ZDO Owner: " + owner2 + ", Local UID: " + uID2 + ", IsOwner: " + nView2.IsOwner())); nView2.ClaimOwnership(); } DigDugReflection.Save(item5); DigDugReflection.GetHmap(item5).Poke(false); if ((Object)(object)ClutterSystem.instance != (Object)null) { ClutterSystem.instance.ResetGrass(((Component)item5).transform.position, DigDugReflection.GetSize(item5)); } } if (DigDugConfig.EnableStaminaDrain.Value) { ((Character)localPlayer).UseStamina(staminaCost); } if (flag) { if (!localPlayer.NoCostCheat() && !DigDugConfig.IgnoreStoneRequirement.Value && (Object)(object)val9 != (Object)null) { localPlayer.ConsumeResources(val9.m_resources, 0, 1, 1); } if ((Object)(object)val8 != (Object)null) { Object.Destroy((Object)(object)val8); } } if (!DigDugConfig.IgnoreDurabilityLoss.Value) { float num45 = durabilityCost; float num46 = Mathf.Min(currentWeapon.m_durability, num45); currentWeapon.m_durability -= num46; num45 -= num46; if (num45 > 0f) { foreach (ItemData allItem in ((Humanoid)localPlayer).GetInventory().GetAllItems()) { if ((int)allItem.m_shared.m_skillType == 12 && allItem != currentWeapon) { float num47 = Mathf.Min(allItem.m_durability, num45); allItem.m_durability -= num47; num45 -= num47; if (num45 <= 0f) { break; } } } } } if (currentWeapon.m_shared.m_hitTerrainEffect != null) { currentWeapon.m_shared.m_hitTerrainEffect.Create(position3, Quaternion.identity, (Transform)null, 1f, -1); } float num48 = default(float); if (ZoneSystem.instance.GetGroundHeight(((Component)localPlayer).transform.position, ref num48) && Mathf.Abs(((Component)localPlayer).transform.position.y - num48) > 0.05f) { Vector3 position5 = ((Component)localPlayer).transform.position; position5.y = num48; ((Character)localPlayer).TeleportTo(position5, ((Component)localPlayer).transform.rotation, false); } Hide(); } private string GetFacingString() { //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) Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null) { return "Facing: Unknown"; } Vector3 forward = ((Component)localPlayer).transform.forward; forward.y = 0f; ((Vector3)(ref forward)).Normalize(); float num = Mathf.Atan2(forward.x, forward.z) * 57.29578f; if (num < 0f) { num += 360f; } string text = ""; text = ((num >= 337.5f || num < 22.5f) ? "North (N)" : ((num >= 22.5f && num < 67.5f) ? "North-East (NE)" : ((num >= 67.5f && num < 112.5f) ? "East (E)" : ((num >= 112.5f && num < 157.5f) ? "South-East (SE)" : ((num >= 157.5f && num < 202.5f) ? "South (S)" : ((num >= 202.5f && num < 247.5f) ? "South-West (SW)" : ((!(num >= 247.5f) || !(num < 292.5f)) ? "North-West (NW)" : "West (W)"))))))); return $"Facing: {text} ({num:F0}°)"; } private void DrawHUDOverlay() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Invalid comparison between Unknown and I4 //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Expected O, but got Unknown //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null) { return; } ItemData currentWeapon = ((Humanoid)localPlayer).GetCurrentWeapon(); if (currentWeapon != null && (int)currentWeapon.m_shared.m_skillType == 12) { string facingString = GetFacingString(); GUIStyle val = new GUIStyle(); val.fontSize = 36; val.fontStyle = (FontStyle)1; val.normal.textColor = new Color(0.92f, 0.73f, 0.16f, 1f); val.alignment = (TextAnchor)4; Font val2 = GetNativeFont(); if ((Object)(object)val2 != (Object)null) { val.font = val2; } GUIStyle val3 = new GUIStyle(val); val3.normal.textColor = Color.black; float num = 800f; float num2 = 60f; float num3 = ((float)Screen.width - num) / 2f; float num4 = 90f; GUI.Label(new Rect(num3 + 2f, num4 + 2f, num, num2), facingString, val3); GUI.Label(new Rect(num3, num4, num, num2), facingString, val); } } private static Font GetNativeFont() { if ((Object)(object)nativeFont == (Object)null) { Font[] array = Resources.FindObjectsOfTypeAll(); foreach (Font val in array) { if (((Object)val).name == "AveriaSansLibre-Bold" || ((Object)val).name == "AveriaSerifLibre-Regular" || ((Object)val).name.Contains("Averia")) { nativeFont = val; break; } } } return nativeFont; } private static void VerifyStyles() { if (windowStyle == null || !((Object)(object)windowStyle.normal.background != (Object)null)) { InitStyles(); } } private static void InitStyles() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Expected O, but got Unknown //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Expected O, but got Unknown //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Expected O, but got Unknown //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Expected O, but got Unknown //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Expected O, but got Unknown //IL_0181: 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_0196: Expected O, but got Unknown //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Expected O, but got Unknown //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_0206: Expected O, but got Unknown //IL_0228: Unknown result type (might be due to invalid IL or missing references) //IL_0241: Unknown result type (might be due to invalid IL or missing references) //IL_0272: Unknown result type (might be due to invalid IL or missing references) //IL_0277: Unknown result type (might be due to invalid IL or missing references) //IL_02a4: Unknown result type (might be due to invalid IL or missing references) //IL_02a9: Unknown result type (might be due to invalid IL or missing references) //IL_02be: Unknown result type (might be due to invalid IL or missing references) //IL_02ce: Unknown result type (might be due to invalid IL or missing references) //IL_02e2: Unknown result type (might be due to invalid IL or missing references) //IL_030a: Unknown result type (might be due to invalid IL or missing references) //IL_030f: Unknown result type (might be due to invalid IL or missing references) //IL_033c: Unknown result type (might be due to invalid IL or missing references) //IL_0341: Unknown result type (might be due to invalid IL or missing references) //IL_036e: Unknown result type (might be due to invalid IL or missing references) //IL_0373: Unknown result type (might be due to invalid IL or missing references) //IL_0388: Unknown result type (might be due to invalid IL or missing references) //IL_039c: Unknown result type (might be due to invalid IL or missing references) //IL_03b0: Unknown result type (might be due to invalid IL or missing references) //IL_03e5: Unknown result type (might be due to invalid IL or missing references) //IL_03ef: Expected O, but got Unknown //IL_03fa: Unknown result type (might be due to invalid IL or missing references) //IL_0404: Expected O, but got Unknown //IL_040d: Unknown result type (might be due to invalid IL or missing references) //IL_0417: Expected O, but got Unknown //IL_042b: Unknown result type (might be due to invalid IL or missing references) //IL_0435: Expected O, but got Unknown //IL_0457: Unknown result type (might be due to invalid IL or missing references) //IL_0470: Unknown result type (might be due to invalid IL or missing references) //IL_04a1: Unknown result type (might be due to invalid IL or missing references) //IL_04a6: Unknown result type (might be due to invalid IL or missing references) //IL_04bb: Unknown result type (might be due to invalid IL or missing references) //IL_04cf: Unknown result type (might be due to invalid IL or missing references) //IL_04e4: Unknown result type (might be due to invalid IL or missing references) //IL_04ee: Expected O, but got Unknown //IL_04f7: Unknown result type (might be due to invalid IL or missing references) //IL_0501: Expected O, but got Unknown //IL_0516: Unknown result type (might be due to invalid IL or missing references) //IL_0520: Expected O, but got Unknown Color textColor = default(Color); ((Color)(ref textColor))..ctor(0.92f, 0.73f, 0.16f, 1f); new Color(0.85f, 0.7f, 0.2f, 1f); Color val = default(Color); ((Color)(ref val))..ctor(0.88f, 0.63f, 0.28f, 1f); Font val2 = GetNativeFont(); windowStyle = new GUIStyle(); windowStyle.normal.background = CreateWoodPanelTexture(128, 128); windowStyle.normal.textColor = textColor; windowStyle.padding = new RectOffset(20, 20, 60, 20); windowStyle.alignment = (TextAnchor)1; windowStyle.fontSize = 26; windowStyle.fontStyle = (FontStyle)1; windowStyle.border = new RectOffset(6, 6, 6, 6); if ((Object)(object)val2 != (Object)null) { windowStyle.font = val2; } labelStyle = new GUIStyle(); labelStyle.normal.textColor = val; labelStyle.fontSize = 18; labelStyle.fontStyle = (FontStyle)1; labelStyle.alignment = (TextAnchor)3; labelStyle.margin = new RectOffset(0, 5, 5, 5); if ((Object)(object)val2 != (Object)null) { labelStyle.font = val2; } headerStyle = new GUIStyle(labelStyle); headerStyle.fontSize = 24; headerStyle.alignment = (TextAnchor)4; headerStyle.normal.textColor = textColor; costLabelStyle = new GUIStyle(labelStyle); costLabelStyle.fontSize = 16; costLabelStyle.normal.textColor = new Color(0.7f, 0.7f, 0.7f, 1f); costLabelStyle.richText = true; costLabelStyle.margin = new RectOffset(5, 5, 2, 2); if ((Object)(object)val2 != (Object)null) { costLabelStyle.font = val2; } buttonStyle = new GUIStyle(); buttonStyle.normal.background = CreateButtonTexture(64, 24, new Color(0.08f, 0.08f, 0.08f, 0.9f), new Color(0.27f, 0.23f, 0.2f, 1f)); buttonStyle.hover.background = CreateButtonTexture(64, 24, new Color(0.12f, 0.12f, 0.12f, 0.9f), val); buttonStyle.active.background = CreateButtonTexture(64, 24, new Color(0.05f, 0.05f, 0.05f, 0.9f), val); buttonStyle.normal.textColor = val; buttonStyle.hover.textColor = Color.white; buttonStyle.active.textColor = val; buttonStyle.onNormal.background = CreateButtonTexture(64, 24, new Color(0.22f, 0.18f, 0.15f, 0.95f), val); buttonStyle.onHover.background = CreateButtonTexture(64, 24, new Color(0.26f, 0.22f, 0.19f, 0.95f), val); buttonStyle.onActive.background = CreateButtonTexture(64, 24, new Color(0.18f, 0.15f, 0.12f, 0.95f), val); buttonStyle.onNormal.textColor = Color.white; buttonStyle.onHover.textColor = Color.white; buttonStyle.onActive.textColor = Color.white; buttonStyle.alignment = (TextAnchor)4; buttonStyle.fontSize = 18; buttonStyle.fontStyle = (FontStyle)1; buttonStyle.margin = new RectOffset(4, 4, 4, 4); buttonStyle.padding = new RectOffset(12, 12, 8, 8); buttonStyle.border = new RectOffset(2, 2, 2, 2); if ((Object)(object)val2 != (Object)null) { buttonStyle.font = val2; } textFieldStyle = new GUIStyle(); textFieldStyle.normal.background = CreateButtonTexture(64, 24, new Color(0.05f, 0.05f, 0.05f, 0.95f), new Color(0.2f, 0.18f, 0.15f, 1f)); textFieldStyle.focused.background = CreateButtonTexture(64, 24, new Color(0.05f, 0.05f, 0.05f, 0.95f), val); textFieldStyle.normal.textColor = Color.white; textFieldStyle.focused.textColor = Color.white; textFieldStyle.padding = new RectOffset(12, 12, 8, 8); textFieldStyle.margin = new RectOffset(0, 0, 4, 4); textFieldStyle.fontSize = 18; textFieldStyle.border = new RectOffset(2, 2, 2, 2); if ((Object)(object)val2 != (Object)null) { textFieldStyle.font = val2; } } private static Texture2D CreateWoodPanelTexture(int width, int height) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_00d8: 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_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: 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_00f6: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(width, height); Color val2 = default(Color); ((Color)(ref val2))..ctor(0.12f, 0.08f, 0.06f, 1f); Color val3 = default(Color); ((Color)(ref val3))..ctor(0.38f, 0.25f, 0.18f, 0.98f); Color val4 = default(Color); ((Color)(ref val4))..ctor(0.22f, 0.15f, 0.11f, 1f); Color[] array = (Color[])(object)new Color[width * height]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { bool flag = j == 0 || j == width - 1 || i == 0 || i == height - 1; bool flag2 = (j > 0 && j < 4) || (j >= width - 4 && j < width - 1) || (i > 0 && i < 4) || (i >= height - 4 && i < height - 1); if (flag) { array[i * width + j] = val2; continue; } if (flag2) { array[i * width + j] = val4; continue; } float num = Mathf.PerlinNoise((float)j * 0.15f, (float)i * 0.03f) * 0.06f - 0.03f; float num2 = Mathf.Sin((float)i * 1.5f + Mathf.PerlinNoise((float)j * 0.05f, (float)i * 0.05f) * 6f) * 0.02f; float num3 = Mathf.Clamp01(val3.r + num + num2); float num4 = Mathf.Clamp01(val3.g + num + num2); float num5 = Mathf.Clamp01(val3.b + num + num2); ref Color reference = ref array[i * width + j]; reference = new Color(num3, num4, num5, val3.a); } } val.SetPixels(array); val.Apply(); return val; } private static Texture2D CreateButtonTexture(int width, int height, Color bgColor, Color borderColor) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(width, height); Color[] array = (Color[])(object)new Color[width * height]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { bool flag = j == 0 || j == width - 1 || i == 0 || i == height - 1; array[i * width + j] = (flag ? borderColor : bgColor); } } val.SetPixels(array); val.Apply(); return val; } } [HarmonyPatch] public static class DigDugPatches { private static float lastLogTime; [HarmonyPrefix] [HarmonyPatch(typeof(Player), "SetControls")] public static void Player_SetControls_Prefix(Player __instance, ref bool block, ref bool blockHold) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Invalid comparison between Unknown and I4 //IL_0077: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer || InventoryGui.IsVisible() || Minimap.IsOpen() || Menu.IsVisible() || Console.IsVisible() || StoreGui.IsVisible() || TextInput.IsVisible() || Hud.InRadial() || Hud.IsPieceSelectionVisible()) { return; } ItemData currentWeapon = ((Humanoid)__instance).GetCurrentWeapon(); if (currentWeapon == null || (int)currentWeapon.m_shared.m_skillType != 12 || !block) { return; } block = false; blockHold = false; if (!DigDugUI.IsVisible) { if (!DigDugUI.CheckAccessAtPoint(((Component)__instance).transform.position, out var blockMessage)) { ((Character)__instance).Message((MessageType)2, blockMessage, 0, (Sprite)null); return; } DigDugPlugin.Log.LogInfo((object)"DigDug: Pickaxe block (Right-click) detected! Triggering UI."); DigDugUI.Show(); } } [HarmonyPrefix] [HarmonyPatch(typeof(Player), "TakeInput")] public static bool Player_TakeInput_Prefix(ref bool __result) { if (DigDugUI.IsVisible) { __result = false; return false; } return true; } [HarmonyPrefix] [HarmonyPatch(typeof(PlayerController), "TakeInput")] public static bool PlayerController_TakeInput_Prefix(ref bool __result, bool look) { if (DigDugUI.IsVisible) { __result = false; return false; } return true; } [HarmonyPrefix] [HarmonyPatch(typeof(GameCamera), "UpdateMouseCapture")] public static bool GameCamera_UpdateMouseCapture_Prefix() { if (DigDugUI.IsVisible) { if (Time.time - lastLogTime > 2f) { DigDugPlugin.Log.LogInfo((object)"DigDug: Bypassing UpdateMouseCapture and forcing cursor unlock."); lastLogTime = Time.time; } Cursor.lockState = (CursorLockMode)0; Cursor.visible = true; return false; } return true; } } public static class DigDugReflection { public delegate void LevelTerrainDelegate(TerrainComp instance, Vector3 worldPos, float radius, bool square); public delegate void SaveDelegate(TerrainComp instance); public delegate bool GetWorldBaseHeightDelegate(Heightmap instance, Vector3 worldPos, out float baseHeight); public static LevelTerrainDelegate LevelTerrain; public static SaveDelegate Save; public static GetWorldBaseHeightDelegate GetWorldBaseHeight; private static FieldInfo f_hmap; private static FieldInfo f_size; private static FieldInfo f_levelDelta; private static FieldInfo f_smoothDelta; private static FieldInfo f_modifiedHeight; private static FieldInfo f_paintMask; private static FieldInfo f_modifiedPaint; private static FieldInfo f_nview; private static FieldInfo f_raiseSkillAmount; private static FieldInfo f_allAreas; private static FieldInfo f_enabled; public static void Init() { MethodInfo method = AccessTools.Method(typeof(TerrainComp), "LevelTerrain", new Type[3] { typeof(Vector3), typeof(float), typeof(bool) }, (Type[])null); LevelTerrain = (LevelTerrainDelegate)Delegate.CreateDelegate(typeof(LevelTerrainDelegate), method); MethodInfo method2 = AccessTools.Method(typeof(TerrainComp), "Save", (Type[])null, (Type[])null); Save = (SaveDelegate)Delegate.CreateDelegate(typeof(SaveDelegate), method2); MethodInfo method3 = AccessTools.Method(typeof(Heightmap), "GetWorldBaseHeight", new Type[2] { typeof(Vector3), typeof(float).MakeByRefType() }, (Type[])null); GetWorldBaseHeight = (GetWorldBaseHeightDelegate)Delegate.CreateDelegate(typeof(GetWorldBaseHeightDelegate), method3); f_hmap = AccessTools.Field(typeof(TerrainComp), "m_hmap"); f_size = AccessTools.Field(typeof(TerrainComp), "m_size"); f_levelDelta = AccessTools.Field(typeof(TerrainComp), "m_levelDelta"); f_smoothDelta = AccessTools.Field(typeof(TerrainComp), "m_smoothDelta"); f_modifiedHeight = AccessTools.Field(typeof(TerrainComp), "m_modifiedHeight"); f_paintMask = AccessTools.Field(typeof(TerrainComp), "m_paintMask"); f_modifiedPaint = AccessTools.Field(typeof(TerrainComp), "m_modifiedPaint"); f_nview = AccessTools.Field(typeof(TerrainComp), "m_nview"); f_raiseSkillAmount = AccessTools.Field(typeof(Attack), "m_raiseSkillAmount"); f_allAreas = AccessTools.Field(typeof(PrivateArea), "m_allAreas"); f_enabled = AccessTools.Field(typeof(PrivateArea), "m_enabled"); } public static Heightmap GetHmap(TerrainComp instance) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown return (Heightmap)f_hmap.GetValue(instance); } public static float GetSize(TerrainComp instance) { return (float)f_size.GetValue(instance); } public static float[] GetLevelDelta(TerrainComp instance) { return (float[])f_levelDelta.GetValue(instance); } public static float[] GetSmoothDelta(TerrainComp instance) { return (float[])f_smoothDelta.GetValue(instance); } public static bool[] GetModifiedHeight(TerrainComp instance) { return (bool[])f_modifiedHeight.GetValue(instance); } public static Color[] GetPaintMask(TerrainComp instance) { return (Color[])f_paintMask.GetValue(instance); } public static bool[] GetModifiedPaint(TerrainComp instance) { return (bool[])f_modifiedPaint.GetValue(instance); } public static float GetRaiseSkillAmount(Attack attack) { return (float)f_raiseSkillAmount.GetValue(attack); } public static ZNetView GetNView(TerrainComp instance) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown return (ZNetView)f_nview.GetValue(instance); } public static List GetAllAreas() { return (List)f_allAreas.GetValue(null); } public static bool IsAreaEnabled(PrivateArea instance) { return (bool)f_enabled.GetValue(instance); } }