using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using BepInEx; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: AssemblyVersion("0.0.0.0")] namespace WobblyLifePlus.CriminalCareer; [BepInPlugin("com.wobblylife.plus.criminal.finder", "Criminal Coordinate Finder", "1.0.0")] public class CriminalCoordinateFinder : BaseUnityPlugin { [Serializable] public class CriminalCoordinate { public string comment; public string category; public float posX; public float posY; public float posZ; } [Serializable] public class CoordinateList { public List coordinates = new List(); } private bool showUI = true; private Vector3 currentPosition = Vector3.zero; private string currentComment = ""; private string currentCategory = "note_spawn"; private int selectedCategoryIndex = 0; private string[] categories = new string[12] { "note_spawn", "pickup", "delivery", "cache", "exchanger", "police_spawn", "limo_spawn", "chop_shop", "mayor_door", "mayor_desk", "mayor_spawn", "mayor_office_inside" }; private string[] categoryNames = new string[12] { "Note Spawn", "Pickup", "Delivery", "Cache", "Exchanger", "Police Spawn", "Limo Spawn", "Chop Shop", "Mayor Door", "Mayor Desk", "Mayor Spawn", "Mayor Office Inside" }; private List savedCoordinates = new List(); private string saveFilePath; private Vector2 scrollPosition; private void Awake() { saveFilePath = Path.Combine(Paths.PluginPath, "WobblyLifePlus_Criminal_Coordinates.json"); LoadCoordinates(); Debug.Log((object)"[CriminalFinder] Initialized! Press F8 to toggle UI"); } private void Update() { if (Input.GetKeyDown((KeyCode)289)) { showUI = !showUI; } if (showUI) { UpdatePlayerPosition(); } } private void UpdatePlayerPosition() { //IL_0252: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Unknown result type (might be due to invalid IL or missing references) //IL_01d7: 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) //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) MonoBehaviour[] array = Object.FindObjectsOfType(true); foreach (MonoBehaviour val in array) { if (!((Object)(object)val != (Object)null) || !(((object)val).GetType().Name == "GameInstance")) { continue; } MethodInfo method = ((object)val).GetType().GetMethod("GetPlayerCharacters", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (!(method != null) || !(method.Invoke(val, null) is IList { Count: >0 } list)) { continue; } foreach (object item in list) { Component val2 = (Component)((item is Component) ? item : null); if (!((Object)(object)val2 != (Object)null) || !((Object)(object)val2.gameObject != (Object)null)) { continue; } MethodInfo method2 = ((object)val2).GetType().GetMethod("GetPlayerController", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (!(method2 != null)) { continue; } object? obj = method2.Invoke(val2, null); Component val3 = (Component)((obj is Component) ? obj : null); if (!((Object)(object)val3 != (Object)null)) { continue; } MethodInfo method3 = ((object)val3).GetType().GetMethod("IsLocal", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (!(method3 != null) || !(bool)method3.Invoke(val3, null)) { continue; } MethodInfo method4 = ((object)val2).GetType().GetMethod("GetPlayerBody", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (method4 != null) { object? obj2 = method4.Invoke(val2, null); Component val4 = (Component)((obj2 is Component) ? obj2 : null); if ((Object)(object)val4 != (Object)null) { currentPosition = val4.transform.position; return; } } currentPosition = val2.transform.position; return; } } if ((Object)(object)Camera.main != (Object)null) { currentPosition = ((Component)Camera.main).transform.position; } } private void OnGUI() { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_005c: 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_012a: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_0221: Unknown result type (might be due to invalid IL or missing references) //IL_024c: Unknown result type (might be due to invalid IL or missing references) //IL_026c: Unknown result type (might be due to invalid IL or missing references) //IL_0297: 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_0319: Unknown result type (might be due to invalid IL or missing references) //IL_031f: Unknown result type (might be due to invalid IL or missing references) //IL_0344: Unknown result type (might be due to invalid IL or missing references) //IL_0349: Unknown result type (might be due to invalid IL or missing references) //IL_034e: Unknown result type (might be due to invalid IL or missing references) //IL_0391: 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_03fb: Unknown result type (might be due to invalid IL or missing references) //IL_0488: Unknown result type (might be due to invalid IL or missing references) //IL_053b: Unknown result type (might be due to invalid IL or missing references) //IL_04c4: Unknown result type (might be due to invalid IL or missing references) if (!showUI) { return; } float num = 450f; float num2 = 680f; float num3 = 10f; float num4 = 10f; GUI.Box(new Rect(num3, num4, num, num2), "CRIMINAL COORDINATE FINDER [F8]"); float num5 = num4 + 30f; GUI.Label(new Rect(num3 + 10f, num5, num - 20f, 20f), "CURRENT POSITION:"); num5 += 20f; GUI.Label(new Rect(num3 + 10f, num5, num - 20f, 20f), "X: " + currentPosition.x.ToString("F2") + " Y: " + currentPosition.y.ToString("F2") + " Z: " + currentPosition.z.ToString("F2")); num5 += 25f; GUI.Label(new Rect(num3 + 10f, num5, num - 20f, 20f), "Category:"); num5 += 20f; selectedCategoryIndex = GUI.SelectionGrid(new Rect(num3 + 10f, num5, num - 20f, 100f), selectedCategoryIndex, categoryNames, 4); currentCategory = categories[selectedCategoryIndex]; num5 += 105f; GUI.Label(new Rect(num3 + 10f, num5, num - 20f, 20f), "Comment:"); num5 += 20f; currentComment = GUI.TextField(new Rect(num3 + 10f, num5, num - 20f, 40f), currentComment); num5 += 45f; num5 += 10f; GUI.backgroundColor = Color.green; if (GUI.Button(new Rect(num3 + 10f, num5, num - 20f, 35f), "SAVE POSITION")) { SaveCurrentPosition(); } num5 += 40f; GUI.backgroundColor = Color.yellow; if (GUI.Button(new Rect(num3 + 10f, num5, num - 20f, 35f), "EXPORT TO FILE + CLIPBOARD")) { ExportCoordinates(); } num5 += 40f; GUI.backgroundColor = Color.white; GUI.Label(new Rect(num3 + 10f, num5, num - 20f, 20f), "SAVED (" + savedCoordinates.Count + "):"); num5 += 20f; float num6 = Mathf.Min(savedCoordinates.Count * 60, 180); scrollPosition = GUI.BeginScrollView(new Rect(num3 + 10f, num5, num - 20f, num6), scrollPosition, new Rect(0f, 0f, num - 40f, (float)(savedCoordinates.Count * 60))); float num7 = 0f; for (int num8 = savedCoordinates.Count - 1; num8 >= 0; num8--) { CriminalCoordinate criminalCoordinate = savedCoordinates[num8]; GUI.Box(new Rect(0f, num7, num - 40f, 55f), ""); GUI.Label(new Rect(5f, num7 + 2f, num - 50f, 18f), "[" + criminalCoordinate.category + "] " + criminalCoordinate.comment); GUI.Label(new Rect(5f, num7 + 22f, num - 50f, 16f), "X:" + criminalCoordinate.posX.ToString("F2") + " Y:" + criminalCoordinate.posY.ToString("F2") + " Z:" + criminalCoordinate.posZ.ToString("F2")); if (GUI.Button(new Rect(num - 120f, num7 + 5f, 55f, 20f), "LOAD")) { LoadPosition(criminalCoordinate); } if (GUI.Button(new Rect(num - 60f, num7 + 5f, 50f, 20f), "DEL")) { savedCoordinates.RemoveAt(num8); SaveCoordinates(); } num7 += 60f; } GUI.EndScrollView(); num5 = num4 + num2 - 40f; GUI.Label(new Rect(num3 + 10f, num5, num - 20f, 30f), "F8 = Toggle | Walk to spot | Add comment | Save"); } private void SaveCurrentPosition() { CriminalCoordinate criminalCoordinate = new CriminalCoordinate(); criminalCoordinate.comment = currentComment; criminalCoordinate.category = currentCategory; criminalCoordinate.posX = currentPosition.x; criminalCoordinate.posY = currentPosition.y; criminalCoordinate.posZ = currentPosition.z; CriminalCoordinate item = criminalCoordinate; savedCoordinates.Add(item); SaveCoordinates(); Debug.Log((object)string.Format("[CriminalFinder] Saved: [{0}] {1} at X:{2} Y:{3} Z:{4}", currentCategory, currentComment, currentPosition.x.ToString("F2"), currentPosition.y.ToString("F2"), currentPosition.z.ToString("F2"))); } private void LoadPosition(CriminalCoordinate coord) { currentCategory = coord.category; currentComment = coord.comment; selectedCategoryIndex = Array.IndexOf(categories, coord.category); if (selectedCategoryIndex < 0) { selectedCategoryIndex = 0; } } private void ExportCoordinates() { string text = "=== WOBBLYLIFE+ CRIMINAL COORDINATES ===\n\n"; string[] array = categories; foreach (string text2 in array) { text = text + "--- " + text2.ToUpper() + " ---\n"; bool flag = false; foreach (CriminalCoordinate savedCoordinate in savedCoordinates) { if (savedCoordinate.category == text2) { text += $"// {savedCoordinate.comment}\nnew Vector3({savedCoordinate.posX:F2}f, {savedCoordinate.posY:F2}f, {savedCoordinate.posZ:F2}f),\n"; flag = true; } } if (!flag) { text += "// (none)\n"; } text += "\n"; } string text3 = Path.Combine(Paths.PluginPath, "WobblyLifePlus_Criminal_Coordinates_Export.txt"); try { File.WriteAllText(text3, text); Debug.Log((object)("[CriminalFinder] Exported to: " + text3)); } catch { } GUIUtility.systemCopyBuffer = text; Debug.Log((object)"[CriminalFinder] Copied to clipboard!"); } private void SaveCoordinates() { CoordinateList coordinateList = new CoordinateList(); coordinateList.coordinates = savedCoordinates; CoordinateList coordinateList2 = coordinateList; try { File.WriteAllText(saveFilePath, JsonUtility.ToJson((object)coordinateList2, true)); } catch (Exception ex) { Debug.LogError((object)("[CriminalFinder] Save error: " + ex.Message)); } } private void LoadCoordinates() { if (!File.Exists(saveFilePath)) { return; } try { string text = File.ReadAllText(saveFilePath); CoordinateList coordinateList = JsonUtility.FromJson(text); if (coordinateList != null && coordinateList.coordinates != null) { savedCoordinates = coordinateList.coordinates; Debug.Log((object)$"[CriminalFinder] Loaded {savedCoordinates.Count} coordinates"); } } catch (Exception ex) { Debug.LogError((object)("[CriminalFinder] Load error: " + ex.Message)); } } }