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 MasterCrafting v1.0.0
MasterCrafting.dll
Decompiled 10 hours agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Jotunn.Configs; using Jotunn.Managers; using Jotunn.Utils; using MasterCrafting; using Microsoft.CodeAnalysis; 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(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("MasterCrafting")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("A mod that adds an Artisanship skill granting permanent stat bonuses to crafted items")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("MasterCrafting")] [assembly: AssemblyTitle("MasterCrafting")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } [HarmonyPatch] internal class MasterCraftingPatches { private const string MasterCraftingPowerKey = "MasterCrafting_Power"; private static readonly Dictionary<string, int> CraftingStationXP = new Dictionary<string, int> { { "piece_workbench", 22 }, { "forge", 45 }, { "piece_artisanstation", 55 }, { "blackforge", 65 }, { "galdr_table", 65 } }; [HarmonyPatch(typeof(InventoryGui), "DoCrafting")] [HarmonyPostfix] private static void DoCraftingPostfix(InventoryGui __instance, Player player) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: 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_01ad: 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) if ((Object)(object)__instance.m_craftRecipe == (Object)null || (Object)(object)player == (Object)null) { return; } CraftingStation currentCraftingStation = player.GetCurrentCraftingStation(); if ((Object)(object)currentCraftingStation == (Object)null) { return; } int craftingStationXP = GetCraftingStationXP(currentCraftingStation); if (craftingStationXP > 0) { ((Character)player).RaiseSkill(MasterCraftingPlugin.ArtisanshipSkillType, (float)craftingStationXP); } ItemData itemData = __instance.m_craftRecipe.m_item.m_itemData; if (itemData == null) { return; } float skillLevel = ((Character)player).GetSkillLevel(MasterCraftingPlugin.ArtisanshipSkillType); float num = Mathf.Min(skillLevel / 100f, 1f); ItemData val = FindCraftedItem(player, itemData, __instance.m_craftUpgradeItem); if (val == null) { return; } if (val.m_customData.TryGetValue("MasterCrafting_Power", out var value)) { float num2 = float.Parse(value); if (num > num2) { val.m_customData["MasterCrafting_Power"] = num.ToString("F4"); } } else { val.m_customData["MasterCrafting_Power"] = num.ToString("F4"); } float num3 = MasterCraftingPlugin.MasterworkBaseChance.Value + MasterCraftingPlugin.MasterworkChancePerLevel.Value * skillLevel; if (Random.value < num3) { int maxQuality = val.m_shared.m_maxQuality; if (maxQuality > 1 && val.m_quality < maxQuality) { val.m_quality = Mathf.Min(val.m_quality + 1, maxQuality); Vector3 val2 = ((Component)currentCraftingStation).transform.position + Vector3.up; DamageText.instance.ShowText((TextType)7, val2, "Masterwork!", true); } } } private static ItemData FindCraftedItem(Player player, ItemData template, ItemData upgradeItem) { //IL_003c: 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) List<ItemData> list = new List<ItemData>(); ((Humanoid)player).GetInventory().GetAllItems(template.m_shared.m_name, list); if (upgradeItem != null) { foreach (ItemData item in list) { if (item.m_gridPos == upgradeItem.m_gridPos) { return item; } } } else if (list.Count > 0) { return list[list.Count - 1]; } return null; } private static int GetCraftingStationXP(CraftingStation station) { if ((Object)(object)station == (Object)null) { return 0; } string text = ((Object)station).name.ToLower(); foreach (KeyValuePair<string, int> item in CraftingStationXP) { if (text.Contains(item.Key)) { return item.Value; } } return 0; } [HarmonyPatch(typeof(ItemData), "GetDamage", new Type[] { typeof(int), typeof(float) })] [HarmonyPostfix] private static void GetDamagePostfix(ItemData __instance, ref DamageTypes __result) { if (__instance.m_customData.TryGetValue("MasterCrafting_Power", out var value) && float.TryParse(value, out var result)) { float num = 1f + result * MasterCraftingPlugin.DamageBonusPerLevel.Value * 100f; ((DamageTypes)(ref __result)).Modify(num); } } [HarmonyPatch(typeof(ItemData), "GetArmor", new Type[] { typeof(int), typeof(float) })] [HarmonyPostfix] private static void GetArmorPostfix(ItemData __instance, ref float __result) { if (__instance.m_customData.TryGetValue("MasterCrafting_Power", out var value) && float.TryParse(value, out var result)) { float num = 1f + result * MasterCraftingPlugin.ArmorBonusPerLevel.Value * 100f; __result *= num; } } [HarmonyPatch(typeof(ItemData), "GetMaxDurability", new Type[] { typeof(int) })] [HarmonyPostfix] private static void GetMaxDurabilityPostfix(ItemData __instance, ref float __result) { if (__instance.m_customData.TryGetValue("MasterCrafting_Power", out var value) && float.TryParse(value, out var result)) { float num = 1f + result * MasterCraftingPlugin.DurabilityBonusPerLevel.Value * 100f; __result *= num; } } [HarmonyPatch(typeof(ItemData), "GetBlockPower", new Type[] { typeof(int), typeof(float) })] [HarmonyPostfix] private static void GetBlockPowerPostfix(ItemData __instance, ref float __result) { if (__instance.m_customData.TryGetValue("MasterCrafting_Power", out var value) && float.TryParse(value, out var result)) { float num = 1f + result * MasterCraftingPlugin.ArmorBonusPerLevel.Value * 100f; __result *= num; } } [HarmonyPatch(typeof(Attack), "GetAttackStamina")] [HarmonyPostfix] private static void GetAttackStaminaPostfix(Attack __instance, ref float __result) { if (__instance.m_weapon != null && __instance.m_weapon.m_customData.TryGetValue("MasterCrafting_Power", out var value) && float.TryParse(value, out var result)) { float num = result * MasterCraftingPlugin.EfficiencyBonusPerLevel.Value * 100f; __result *= 1f - num; } } [HarmonyPatch(typeof(Attack), "GetAttackEitr")] [HarmonyPostfix] private static void GetAttackEitrPostfix(Attack __instance, ref float __result) { if (__instance.m_weapon != null && __instance.m_weapon.m_customData.TryGetValue("MasterCrafting_Power", out var value) && float.TryParse(value, out var result)) { float num = result * MasterCraftingPlugin.EfficiencyBonusPerLevel.Value * 100f; __result *= 1f - num; } } [HarmonyPatch(typeof(ItemData), "GetTooltip", new Type[] { typeof(ItemData), typeof(int), typeof(bool), typeof(float), typeof(int) })] [HarmonyPostfix] private static void GetTooltipPostfix(ItemData item, int qualityLevel, bool crafting, float worldLevel, int stackOverride, ref string __result) { if (item != null && item.m_customData.TryGetValue("MasterCrafting_Power", out var _)) { __result += "\n<color=orange>MasterCrafted</color>"; } } } namespace MasterCrafting { [BepInPlugin("com.ruijven.mastercrafting", "MasterCrafting", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] internal class MasterCraftingPlugin : BaseUnityPlugin { public const string PluginGUID = "com.ruijven.mastercrafting"; public const string PluginName = "MasterCrafting"; public const string PluginVersion = "1.0.0"; internal static ManualLogSource Logger; public static SkillType ArtisanshipSkillType; public static ConfigEntry<float> DamageBonusPerLevel; public static ConfigEntry<float> ArmorBonusPerLevel; public static ConfigEntry<float> DurabilityBonusPerLevel; public static ConfigEntry<float> EfficiencyBonusPerLevel; public static ConfigEntry<float> MasterworkBaseChance; public static ConfigEntry<float> MasterworkChancePerLevel; internal static MasterCraftingPlugin Instance { get; private set; } private void Awake() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown Instance = this; Logger = ((BaseUnityPlugin)this).Logger; InitializeConfig(); RegisterArtisanshipSkill(); Harmony val = new Harmony("com.ruijven.mastercrafting"); val.PatchAll(Assembly.GetExecutingAssembly()); Logger.LogInfo((object)"MasterCrafting v1.0.0 loaded successfully!"); } private void InitializeConfig() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Expected O, but got Unknown //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Expected O, but got Unknown //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Expected O, but got Unknown //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Expected O, but got Unknown //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Expected O, but got Unknown DamageBonusPerLevel = ((BaseUnityPlugin)this).Config.Bind<float>("Stat Bonuses", "DamageBonusPerLevel", 0.002f, new ConfigDescription("Damage bonus per Artisanship level (e.g., 0.002 = 0.2% per level)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); ArmorBonusPerLevel = ((BaseUnityPlugin)this).Config.Bind<float>("Stat Bonuses", "ArmorBonusPerLevel", 0.0015f, new ConfigDescription("Armor bonus per Artisanship level (e.g., 0.0015 = 0.15% per level)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); DurabilityBonusPerLevel = ((BaseUnityPlugin)this).Config.Bind<float>("Stat Bonuses", "DurabilityBonusPerLevel", 0.003f, new ConfigDescription("Durability bonus per Artisanship level (e.g., 0.003 = 0.3% per level)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); EfficiencyBonusPerLevel = ((BaseUnityPlugin)this).Config.Bind<float>("Stat Bonuses", "EfficiencyBonusPerLevel", 0.002f, new ConfigDescription("Stamina/Eitr usage reduction per Artisanship level (e.g., 0.002 = 0.2% per level)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); MasterworkBaseChance = ((BaseUnityPlugin)this).Config.Bind<float>("Masterwork Proc", "MasterworkBaseChance", 0.02f, new ConfigDescription("Base chance for masterwork proc (e.g., 0.02 = 2%)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); MasterworkChancePerLevel = ((BaseUnityPlugin)this).Config.Bind<float>("Masterwork Proc", "MasterworkChancePerLevel", 0.001f, new ConfigDescription("Additional masterwork chance per Artisanship level (e.g., 0.001 = 0.1% per level)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); } private void RegisterArtisanshipSkill() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0013: 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_002b: 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_0040: Expected O, but got Unknown //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) try { SkillConfig val = new SkillConfig { Identifier = "com.ruijven.mastercrafting.artisanship", Name = "Artisanship", Description = "Your skill in crafting grants permanent bonuses to items you create.", Icon = null, IncreaseStep = 1f }; ArtisanshipSkillType = SkillManager.Instance.AddSkill(val); Logger.LogInfo((object)$"Artisanship skill registered successfully. SkillType: {ArtisanshipSkillType}"); } catch (Exception ex) { Logger.LogError((object)("Failed to register Artisanship skill: " + ex.Message + "\n" + ex.StackTrace)); } } } }