using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text.Json;
using BoneLib;
using BoneLib.BoneMenu;
using BoneLib.Notifications;
using HarmonyLib;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSLZ.Bonelab;
using Il2CppSLZ.Marrow.Data;
using Il2CppSLZ.Marrow.Pool;
using Il2CppSLZ.Marrow.Warehouse;
using LabFusion.Network;
using LabFusion.Patching;
using LabFusion.RPC;
using MelonLoader;
using MelonLoader.Utils;
using MoreItemsInDevTools;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyCompany("More Items in Dev Tools")]
[assembly: AssemblyProduct("More Items in Dev Tools")]
[assembly: AssemblyTitle("More Items in Dev Tools")]
[assembly: AssemblyDescription("Adds more items to list of items spawned by dev tools cheat")]
[assembly: AssemblyFileVersion("3.0.4")]
[assembly: AssemblyInformationalVersion("3.0.4")]
[assembly: AssemblyCopyright("Developed by doge15567")]
[assembly: AssemblyTrademark("")]
[assembly: MelonInfo(typeof(Main), "More Items in Dev Tools", "3.0.4", "doge15567", "https://thunderstore.io/c/bonelab/p/doge15567/MoreItemsInDevTools/")]
[assembly: MelonColor(255, 255, 255, 255)]
[assembly: MelonOptionalDependencies(new string[] { "LabFusion", "BoneLib" })]
[assembly: MelonGame("Stress Level Zero", "BONELAB")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyVersion("3.0.4.0")]
namespace MoreItemsInDevTools
{
internal class Bonemenu
{
private static Page _mainCategory;
private static Page _presetCategory;
private static FunctionElement _presetCategoryLink;
public static PresetManager _presetManager = new PresetManager();
public static void BonemenuSetup()
{
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
_presetManager.OnStart();
_mainCategory = Page.Root.CreatePage("MoreItemsInDevTools", Color.white, 0, true);
_mainCategory.CreateFunction("Reload Presets from File", Color.yellow, (Action)delegate
{
_presetManager.LoadPresets();
RebuildBonemenu();
});
}
public static void BoneMenuNotif(NotificationType type, string content)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0005: 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)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Expected O, but got Unknown
Notifier.Send(new Notification
{
Title = NotificationText.op_Implicit("MoreItemsInDevTools"),
Message = NotificationText.op_Implicit(content),
Type = type,
PopupLength = 3f,
ShowTitleOnPopup = true
});
}
public static void RebuildBonemenu()
{
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
if (_presetCategory != null)
{
Menu.DestroyPage(_presetCategory);
_mainCategory.Remove((Element)(object)_presetCategoryLink);
}
CheckForDefaultPreset();
_presetCategory = _mainCategory.CreatePage("Presets", Color.white, 0, false);
_presetCategoryLink = (FunctionElement)(object)_mainCategory.CreatePageLink(_presetCategory);
_presetCategory.CreateFunction("Create New Preset", Color.green, (Action)delegate
{
string presetName = "Preset " + _presetManager.GetNumberOfPresets();
_presetManager.LoadPresets();
if (_presetManager.CreateNewPreset(presetName))
{
CreatePresetCatagory(_presetCategory, presetName);
}
});
foreach (KeyValuePair<string, PresetData> preset in _presetManager.presets)
{
CreatePresetCatagory(_presetCategory, preset.Key);
}
}
public static void CreatePresetCatagory(Page category, string presetName)
{
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_0108: 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_00be: 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_015e: Unknown result type (might be due to invalid IL or missing references)
Page _category = category.CreatePage(presetName, Color.white, 0, false);
PageLinkElement _categoryLink = category.CreatePageLink(_category);
PresetData presetData = _presetManager.GetPresetData(presetName);
_category.CreateFunction(presetName, Color.white, (Action)delegate
{
});
string newnamestring = presetName;
if (presetName != "DEFAULT")
{
_category.CreateString("Rename Preset", Color.white, presetName, (Action<string>)delegate(string s)
{
newnamestring = s;
});
_category.CreateFunction("Apply New Name", Color.white, (Action)delegate
{
string text = newnamestring;
if (!_presetManager.presets.ContainsKey(text))
{
_presetManager.RemovePreset(presetName);
_presetManager.presets.Add(text, presetData);
_presetManager.SavePresets();
RebuildBonemenu();
Menu.OpenPage(_presetCategory);
}
else
{
BoneMenuNotif((NotificationType)2, $"Error renaming preset {presetName} to {text}, as a preset of name {text} already exists!");
}
});
}
_category.CreateFunction("Apply Preset", Color.cyan, (Action)delegate
{
_presetManager.LoadPresets();
Main.SetCheatMenuItems(_presetManager.GetPresetData(presetName).Barcodes.ToArray());
});
_category.CreateFunction("Add Item", Color.green, (Action)delegate
{
string content = "";
try
{
if ((Object)(object)Player.GetObjectInHand(Player.LeftHand) == (Object)null)
{
content = "Error: Nothing in left hand.";
throw new Exception();
}
if ((Object)(object)Player.GetComponentInHand<Poolee>(Player.LeftHand).SpawnableCrate == (Object)null)
{
content = "Error: Object is not a spawnable, or is a prefab.";
throw new Exception();
}
string iD = ((Scannable)Player.GetComponentInHand<Poolee>(Player.LeftHand).SpawnableCrate).Barcode.ID;
_presetManager.AddBarcodeToPreset(presetName, iD);
CreatePBarcodeCatagory(_category, iD);
_presetManager.SavePresets();
}
catch (Exception)
{
BoneMenuNotif((NotificationType)2, content);
}
});
if (presetName != "DEFAULT")
{
_category.CreateFunction("Remove Preset", Color.red, (Action)delegate
{
Menu.DisplayDialog("Remove Preset", "Are you sure you want to delete this preset?", (Texture2D)null, (Action)delegate
{
_presetManager.RemovePreset(presetName);
Menu.DestroyPage(_category);
category.Remove((Element)(object)_categoryLink);
_presetManager.SavePresets();
Menu.OpenPage(category);
}, (Action)null);
});
}
foreach (string barcode in _presetManager.GetPresetData(presetName).Barcodes)
{
CreatePBarcodeCatagory(_category, barcode);
}
}
public static void CreatePBarcodeCatagory(Page category, string Barcode)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Expected O, but got Unknown
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00db: Unknown result type (might be due to invalid IL or missing references)
Crate val = default(Crate);
AssetWarehouse.Instance.TryGetCrate(new Barcode
{
ID = Barcode
}, ref val);
string title = ((Scannable)val).Title;
Page _category = category.CreatePage(title, Color.white, 0, false);
PageLinkElement _categoryLink = category.CreatePageLink(_category);
_category.CreateFunction(title, Color.white, (Action)delegate
{
});
_category.CreateFunction(Barcode, Color.white, (Action)delegate
{
});
_category.CreateFunction("Remove Item", Color.red, (Action)delegate
{
_presetManager.RemoveBarcodeFromPreset(category.Name, Barcode);
Menu.DestroyPage(_category);
category.Remove((Element)(object)_categoryLink);
Menu.OpenPage(category);
});
}
public static void CheckForDefaultPreset()
{
if (!_presetManager.presets.ContainsKey("DEFAULT"))
{
BoneMenuNotif((NotificationType)2, "Error: No DEFAULT preset detected! Attempting to create a new one \n Organization of the JSON file might be mangled!");
_presetManager.CreateNewPreset("DEFAULT");
}
}
}
internal class Main : MelonMod
{
internal const string Name = "More Items in Dev Tools";
internal const string Description = "Adds more items to list of items spawned by dev tools cheat";
internal const string Author = "doge15567";
internal const string Company = "";
internal const string Version = "3.0.4";
internal const string DownloadLink = "https://thunderstore.io/c/bonelab/p/doge15567/MoreItemsInDevTools/";
internal static Instance MelonLog;
internal static Harmony Harmoney;
internal static CheatTool playerCheatMenu;
public static PresetManager _presetManager = new PresetManager();
public static string[] currentPresetArray;
public static CheatTool currentInstance;
public static bool oldAssemblyDetected = false;
public const string oadString = "An older version of the mod is installed alongside the current version, please delete MoreItemsInDevToolsML6.dll and related files!";
public override void OnEarlyInitializeMelon()
{
}
public override void OnInitializeMelon()
{
MelonLog = ((MelonBase)this).LoggerInstance;
Harmoney = ((MelonBase)this).HarmonyInstance;
MelonLog.Msg("Initalised Mod");
_presetManager.OnStart();
if (CheckIfAssemblyLoaded("MoreItemsInDevToolsML6"))
{
oldAssemblyDetected = true;
}
if (oldAssemblyDetected)
{
MelonLog.Warning("An older version of the mod is installed alongside the current version, please delete MoreItemsInDevToolsML6.dll and related files!");
}
if (CheckIfAssemblyLoaded("BoneLib"))
{
BonelibSetup();
}
}
private static void BonelibSetup()
{
if (oldAssemblyDetected)
{
Bonemenu.BoneMenuNotif((NotificationType)1, "An older version of the mod is installed alongside the current version, please delete MoreItemsInDevToolsML6.dll and related files!");
}
Bonemenu.BonemenuSetup();
Hooking.OnMarrowGameStarted += Bonemenu.RebuildBonemenu;
}
public static void SetCheatMenuItems(string[] BarcodeStrArray)
{
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: 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_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
//IL_003d: Expected O, but got Unknown
currentPresetArray = BarcodeStrArray;
playerCheatMenu = currentInstance;
List<SpawnableCrateReference> list = new List<SpawnableCrateReference>();
foreach (string iD in BarcodeStrArray)
{
list.Add(new SpawnableCrateReference
{
_barcode = new Barcode
{
ID = iD
}
});
}
playerCheatMenu.crates = Il2CppReferenceArray<SpawnableCrateReference>.op_Implicit(list.ToArray());
}
public static string[] RemoveDuplicateBarcodes(string[] s)
{
HashSet<string> hashSet = new HashSet<string>(s);
string[] array = new string[hashSet.Count];
hashSet.CopyTo(array);
return array;
}
public static bool CheckIfAssemblyLoaded(string name)
{
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
for (int i = 0; i < assemblies.Length; i++)
{
if (assemblies[i].GetName().Name.ToLower() == name.ToLower())
{
return true;
}
}
return false;
}
}
public class PresetData
{
public List<string> Barcodes { get; set; }
}
public class PresetManager
{
public Dictionary<string, PresetData> presets;
private string filePath = MelonEnvironment.UserDataDirectory + "/MoreItemsInDevTools.json";
public readonly Dictionary<string, PresetData> DefaultJsonDict = new Dictionary<string, PresetData> {
{
"DEFAULT",
new PresetData
{
Barcodes = new List<string> { "c1534c5a-5747-42a2-bd08-ab3b47616467", "c1534c5a-6b38-438a-a324-d7e147616467", "c1534c5a-3813-49d6-a98c-f595436f6e73", "c1534c5a-c6a8-45d0-aaa2-2c954465764d" }
}
} };
private JsonSerializerOptions prettyPrint = new JsonSerializerOptions
{
WriteIndented = true
};
public void OnStart()
{
LoadPresets();
SavePresets();
}
public void LoadPresets()
{
if (File.Exists(filePath))
{
string json = File.ReadAllText(filePath);
presets = JsonSerializer.Deserialize<Dictionary<string, PresetData>>(json);
}
else
{
presets = DefaultJsonDict;
SavePresets();
}
}
public void SavePresets()
{
string contents = JsonSerializer.Serialize(presets, prettyPrint);
File.WriteAllText(filePath, contents);
}
public void CheckForDefaultPreset()
{
if (!presets.ContainsKey("DEFAULT"))
{
CreateNewPreset("DEFAULT");
}
}
public void AddBarcodeToPreset(string presetName, string barcode)
{
if (presets.ContainsKey(presetName))
{
presets[presetName].Barcodes.Add(barcode);
SavePresets();
}
else
{
Main.MelonLog.Error("Function AddBarcodeToPreset: Attempted to add a barcode to a preset that doesnt exist. (?????????)");
}
}
public void RemoveBarcodeFromPreset(string presetName, string barcode)
{
if (presets.ContainsKey(presetName))
{
presets[presetName].Barcodes.Remove(barcode);
SavePresets();
}
else
{
Main.MelonLog.Error("Function RemoveBarcodeToPreset: Attempted to remove a barcode to a preset that doesnt exist. (???).");
}
}
public bool CreateNewPreset(string presetName)
{
if (!presets.ContainsKey(presetName))
{
presets.Add(presetName, new PresetData
{
Barcodes = new List<string> { "c1534c5a-5747-42a2-bd08-ab3b47616467", "c1534c5a-6b38-438a-a324-d7e147616467", "c1534c5a-3813-49d6-a98c-f595436f6e73", "c1534c5a-c6a8-45d0-aaa2-2c954465764d" }
});
SavePresets();
return true;
}
Main.MelonLog.Msg("Function CreateNewPreset: Attempted to create a new preset with a pre-existing name.");
return false;
}
public void RemovePreset(string presetName)
{
if (presets.ContainsKey(presetName))
{
presets.Remove(presetName);
SavePresets();
}
else
{
Main.MelonLog.Msg("RemovePreset: Preset not found.");
}
}
public PresetData GetPresetData(string presetName)
{
if (presets.ContainsKey(presetName))
{
return presets[presetName];
}
Main.MelonLog.Msg("GetPresetData: Preset not found.");
return null;
}
public int GetNumberOfPresets()
{
return presets.Count;
}
}
}
namespace MoreItemsInDevTools.Patches
{
[HarmonyPatch(typeof(CheatTool))]
[HarmonyPatch("Start")]
public class CheatToolPatch
{
private static bool Prefix(CheatTool __instance)
{
Main.currentInstance = __instance;
Main._presetManager.CheckForDefaultPreset();
Main._presetManager.LoadPresets();
Main.SetCheatMenuItems(Main._presetManager.presets["DEFAULT"].Barcodes.ToArray());
return true;
}
}
[HarmonyPatch(typeof(AddDevMenuPatch), "OnSpawnDelegate")]
public static class PreventFusionPatch
{
[HarmonyPrefix]
public static bool Prefix(PopUpMenuView menu, Action originalDelegate)
{
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Expected O, but got Unknown
//IL_004d: Expected O, but got Unknown
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
if (!NetworkInfo.HasServer)
{
return true;
}
_ = Main.currentInstance;
Transform transform = ((Component)menu.radialPageView).transform;
string[] array = Main.RemoveDuplicateBarcodes(Main.currentPresetArray);
Array.Resize(ref array, 5);
string[] array2 = array;
foreach (string text in array2)
{
Spawnable spawnable = new Spawnable
{
crateRef = new SpawnableCrateReference(text)
};
SpawnRequestInfo val = default(SpawnRequestInfo);
val.spawnable = spawnable;
val.position = transform.position;
val.rotation = transform.rotation;
NetworkAssetSpawner.Spawn(val);
}
return false;
}
}
}