Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of WLTGKitPlugin v1.0.0
BepInEx/plugins/WLTGKitPlugin.dll
Decompiled 2 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("WLTGKitPlugin")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("WLTGKitPlugin")] [assembly: AssemblyTitle("WLTGKitPlugin")] [assembly: AssemblyVersion("1.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace WLTGKitPlugin { public static class KitCommand { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static ConsoleEvent <>9__0_0; internal void <Register>b__0_0(ConsoleEventArgs args) { string[] array = args.FullLine.Trim().Split(new char[1] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (array.Length < 2) { Print("Usage: kit [list|info|spawn|create|add|remove|delete|save|reload]"); return; } switch (array[1].ToLower()) { case "list": CmdList(); break; case "info": CmdInfo(array); break; case "spawn": CmdSpawn(array); break; case "create": CmdCreate(array); break; case "add": CmdAdd(array); break; case "remove": CmdRemove(array); break; case "delete": CmdDelete(array); break; case "save": CmdSave(); break; case "reload": CmdReload(); break; default: Print("Unknown subcommand: " + array[1]); break; } } } public static void Register() { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown object obj = <>c.<>9__0_0; if (obj == null) { ConsoleEvent val = delegate(ConsoleEventArgs args) { string[] array = args.FullLine.Trim().Split(new char[1] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (array.Length < 2) { Print("Usage: kit [list|info|spawn|create|add|remove|delete|save|reload]"); } else { switch (array[1].ToLower()) { case "list": CmdList(); break; case "info": CmdInfo(array); break; case "spawn": CmdSpawn(array); break; case "create": CmdCreate(array); break; case "add": CmdAdd(array); break; case "remove": CmdRemove(array); break; case "delete": CmdDelete(array); break; case "save": CmdSave(); break; case "reload": CmdReload(); break; default: Print("Unknown subcommand: " + array[1]); break; } } }; <>c.<>9__0_0 = val; obj = (object)val; } new ConsoleCommand("kit", "[list|info <kit>|spawn <kit>|create <kit> [desc]|add <kit> <prefab> [amount] [quality]|remove <kit> <prefab>|delete <kit>|save|reload]", (ConsoleEvent)obj, true, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false); } private static void CmdList() { List<KeyValuePair<string, KitDefinition>> list = KitManager.Instance.GetAllKits().ToList(); if (list.Count == 0) { Print("No kits defined."); return; } Print($"Available kits ({list.Count}):"); foreach (KeyValuePair<string, KitDefinition> item in list) { Print($" {item.Key} -- {item.Value.Name} ({item.Value.Items.Count} items)"); } if (KitManager.Instance.HasUnsaved) { Print(" [!] Unsaved changes. Type: kit save"); } } private static void CmdInfo(string[] parts) { if (parts.Length < 3) { Print("Usage: kit info <kitname>"); return; } if (!KitManager.Instance.TryGetKit(parts[2], out KitDefinition kit)) { Print("Kit not found: " + parts[2]); return; } Print("Kit: " + kit.Name + " (" + parts[2] + ") -- " + kit.Description); if (kit.Items.Count == 0) { Print(" (no items)"); return; } foreach (KitItem item in kit.Items) { Print($" {item.Prefab} x{item.Amount} quality:{item.Quality}"); } } private static void CmdSpawn(string[] parts) { //IL_013a: 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_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_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01b7: Unknown result type (might be due to invalid IL or missing references) if (parts.Length < 3) { Print("Usage: kit spawn <kitname>"); return; } if (!IsAdmin()) { Print("Admin only."); return; } if (!KitManager.Instance.TryGetKit(parts[2], out KitDefinition kit)) { Print("Kit not found: " + parts[2]); return; } Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null) { Print("No local player."); return; } int num = 0; int num2 = 0; foreach (KitItem item in kit.Items) { ZNetScene instance = ZNetScene.instance; GameObject val = ((instance != null) ? instance.GetPrefab(item.Prefab) : null); if ((Object)(object)val == (Object)null) { Print(" Unknown prefab: " + item.Prefab); num2++; continue; } ItemDrop component = val.GetComponent<ItemDrop>(); if ((Object)(object)component == (Object)null) { Print(" Not an item: " + item.Prefab); num2++; continue; } Vector3 position = ((Component)localPlayer).transform.position; ItemData val2 = component.m_itemData.Clone(); val2.m_quality = Mathf.Clamp(item.Quality, 1, val2.m_shared.m_maxQuality); val2.m_durability = val2.m_shared.m_maxDurability; val2.m_stack = Mathf.Clamp(item.Amount, 1, val2.m_shared.m_maxStackSize); ItemDrop.DropItem(val2, item.Amount, position + Vector3.up, Quaternion.identity); num++; } Print($"Kit spawned: {num} items at your feet" + ((num2 > 0) ? $", {num2} failed." : ".")); } private static void CmdCreate(string[] parts) { if (parts.Length < 3) { Print("Usage: kit create <kitname> [description]"); return; } if (!IsAdmin()) { Print("Admin only."); return; } KitDefinition orCreateUnsaved = KitManager.Instance.GetOrCreateUnsaved(parts[2]); orCreateUnsaved.Name = ((parts.Length >= 4) ? string.Join(" ", parts, 3, parts.Length - 3) : parts[2]); Print("Kit created. Add items: kit add " + parts[2] + " <prefab> <amount> <quality>"); Print("Type 'kit save' when done."); } private static void CmdAdd(string[] parts) { if (parts.Length < 4) { Print("Usage: kit add <kitname> <prefab> [amount] [quality]"); return; } if (!IsAdmin()) { Print("Admin only."); return; } string text = parts[2]; string prefab = parts[3]; int result; int num = ((parts.Length < 5 || !int.TryParse(parts[4], out result)) ? 1 : result); int result2; int num2 = ((parts.Length < 6 || !int.TryParse(parts[5], out result2)) ? 1 : result2); if ((Object)(object)ZNetScene.instance != (Object)null && (Object)(object)ZNetScene.instance.GetPrefab(prefab) == (Object)null) { Print(" Warning: prefab not found -- double-check the name."); } KitDefinition orCreateUnsaved = KitManager.Instance.GetOrCreateUnsaved(text); orCreateUnsaved.Items.RemoveAll((KitItem i) => string.Equals(i.Prefab, prefab, StringComparison.OrdinalIgnoreCase)); orCreateUnsaved.Items.Add(new KitItem { Prefab = prefab, Amount = num, Quality = num2 }); Print($"Added {prefab} x{num} quality:{num2} to '{text}'. Type 'kit save' to save."); } private static void CmdRemove(string[] parts) { string[] parts2 = parts; if (parts2.Length < 4) { Print("Usage: kit remove <kitname> <prefab>"); return; } if (!IsAdmin()) { Print("Admin only."); return; } KitDefinition orCreateUnsaved = KitManager.Instance.GetOrCreateUnsaved(parts2[2]); int num = orCreateUnsaved.Items.RemoveAll((KitItem i) => string.Equals(i.Prefab, parts2[3], StringComparison.OrdinalIgnoreCase)); Print((num > 0) ? ("Removed " + parts2[3] + " from '" + parts2[2] + "'. Type 'kit save'.") : "Item not found in kit."); } private static void CmdDelete(string[] parts) { if (parts.Length < 3) { Print("Usage: kit delete <kitname>"); } else if (!IsAdmin()) { Print("Admin only."); } else { Print(KitManager.Instance.DeleteKit(parts[2]) ? "Kit deleted." : ("Kit not found: " + parts[2])); } } private static void CmdSave() { if (!IsAdmin()) { Print("Admin only."); return; } KitManager.Instance.Save(); Print($"Kits saved. {KitManager.Instance.KitCount} kit(s) total."); } private static void CmdReload() { if (!IsAdmin()) { Print("Admin only."); return; } KitManager.Instance.Reload(); Print($"Kits reloaded. {KitManager.Instance.KitCount} kit(s)."); } private static bool IsAdmin() { if ((Object)(object)ZNet.instance == (Object)null) { return false; } return ZNet.instance.LocalPlayerIsAdminOrHost(); } private static void Print(string msg) { Terminal.Log((object)msg); Plugin.Log.LogInfo((object)msg); } } public class KitItem { public string Prefab { get; set; } = ""; public int Amount { get; set; } = 1; public int Quality { get; set; } = 1; } public class KitDefinition { public string Name { get; set; } = ""; public string Description { get; set; } = ""; public List<KitItem> Items { get; set; } = new List<KitItem>(); } public class KitFile { public Dictionary<string, KitDefinition> Kits { get; set; } = new Dictionary<string, KitDefinition>(); } public class KitManager { public static readonly KitManager Instance = new KitManager(); private Dictionary<string, KitDefinition> _kits = new Dictionary<string, KitDefinition>(StringComparer.OrdinalIgnoreCase); private Dictionary<string, KitDefinition> _pending = new Dictionary<string, KitDefinition>(StringComparer.OrdinalIgnoreCase); private static string ConfigDir => Path.Combine(Paths.ConfigPath, "WLTGKitPlugin"); private static string KitsFile => Path.Combine(ConfigDir, "kits.json"); public int KitCount => _kits.Count; public bool HasUnsaved => _pending.Count > 0; public void Load() { Directory.CreateDirectory(ConfigDir); if (!File.Exists(KitsFile)) { WriteDefaultKits(); } Reload(); } public void Reload() { try { string text = File.ReadAllText(KitsFile); KitFile kitFile = JsonConvert.DeserializeObject<KitFile>(text); if (kitFile?.Kits != null) { _kits = new Dictionary<string, KitDefinition>(kitFile.Kits, StringComparer.OrdinalIgnoreCase); _pending.Clear(); Plugin.Log.LogInfo((object)$"Loaded {_kits.Count} kit(s)."); } } catch (Exception ex) { Plugin.Log.LogError((object)("Failed to load kits.json: " + ex.Message)); } } public void Save() { foreach (KeyValuePair<string, KitDefinition> item in _pending) { _kits[item.Key] = item.Value; } _pending.Clear(); KitFile kitFile = new KitFile { Kits = _kits }; File.WriteAllText(KitsFile, JsonConvert.SerializeObject((object)kitFile, (Formatting)1)); Plugin.Log.LogInfo((object)$"Saved {_kits.Count} kit(s)."); } public bool TryGetKit(string name, out KitDefinition kit) { if (_pending.TryGetValue(name, out kit)) { return true; } return _kits.TryGetValue(name, out kit); } public IEnumerable<KeyValuePair<string, KitDefinition>> GetAllKits() { Dictionary<string, KitDefinition> dictionary = new Dictionary<string, KitDefinition>(_kits, StringComparer.OrdinalIgnoreCase); foreach (KeyValuePair<string, KitDefinition> item in _pending) { dictionary[item.Key] = item.Value; } return dictionary; } public KitDefinition GetOrCreateUnsaved(string name) { if (_pending.TryGetValue(name, out KitDefinition value)) { return value; } if (_kits.TryGetValue(name, out KitDefinition value2)) { KitDefinition kitDefinition = JsonConvert.DeserializeObject<KitDefinition>(JsonConvert.SerializeObject((object)value2)); _pending[name] = kitDefinition; return kitDefinition; } KitDefinition kitDefinition2 = new KitDefinition { Name = name, Description = "" }; _pending[name] = kitDefinition2; return kitDefinition2; } public bool DeleteKit(string name) { bool flag = _pending.Remove(name); bool flag2 = _kits.Remove(name); if (flag || flag2) { Save(); return true; } return false; } private void WriteDefaultKits() { KitFile kitFile = new KitFile { Kits = new Dictionary<string, KitDefinition> { ["stam"] = new KitDefinition { Name = "Admin Stam Kit", Description = "Tools and stamina food", Items = new List<KitItem> { new KitItem { Prefab = "AtgeirIron", Amount = 1, Quality = 1 }, new KitItem { Prefab = "Hoe", Amount = 2, Quality = 1 }, new KitItem { Prefab = "PickaxeAntler", Amount = 2, Quality = 1 }, new KitItem { Prefab = "Hammer", Amount = 1, Quality = 1 }, new KitItem { Prefab = "FishingRod", Amount = 1, Quality = 1 }, new KitItem { Prefab = "Bread", Amount = 5, Quality = 1 }, new KitItem { Prefab = "FishWraps", Amount = 5, Quality = 1 }, new KitItem { Prefab = "OnionSoup", Amount = 5, Quality = 1 } } }, ["starter"] = new KitDefinition { Name = "New Player Starter Kit", Description = "Basic bronze gear", Items = new List<KitItem> { new KitItem { Prefab = "SwordBronze", Amount = 1, Quality = 2 }, new KitItem { Prefab = "ArmorBronzeHelmet", Amount = 1, Quality = 2 }, new KitItem { Prefab = "ArmorBronzeChest", Amount = 1, Quality = 2 }, new KitItem { Prefab = "ArmorBronzeLegs", Amount = 1, Quality = 2 }, new KitItem { Prefab = "CookedMeat", Amount = 10, Quality = 1 }, new KitItem { Prefab = "MeadHealthMinor", Amount = 5, Quality = 1 } } } } }; File.WriteAllText(KitsFile, JsonConvert.SerializeObject((object)kitFile, (Formatting)1)); Plugin.Log.LogInfo((object)("Created default kits.json at " + KitsFile)); } } [BepInPlugin("com.welovetogame.kitplugin", "WLTGKitPlugin", "2.0.0")] public class Plugin : BaseUnityPlugin { public const string PluginGuid = "com.welovetogame.kitplugin"; public const string PluginName = "WLTGKitPlugin"; public const string PluginVersion = "2.0.0"; internal static ManualLogSource Log; private void Awake() { Log = ((BaseUnityPlugin)this).Logger; Log.LogInfo((object)"WLTGKitPlugin v2.0.0 loading..."); KitManager.Instance.Load(); KitCommand.Register(); Log.LogInfo((object)string.Format("{0} loaded. {1} kit(s) ready.", "WLTGKitPlugin", KitManager.Instance.KitCount)); } } }