Decompiled source of ConfigurableWeapons v1.0.0

ConfigurableWeapons.dll

Decompiled 2 weeks ago
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("ConfigurableWeapons")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ConfigurableWeapons")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("ccc8d4ac-533d-4a1b-ba99-81a3bd3a54b7")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace ConfigurableWeapons;

[BepInPlugin("GitMCP.ConfigurableWeapons", "Configurable Weapons", "0.0.1")]
public class ConfigurableWeapons : BaseUnityPlugin
{
	[HarmonyPatch(typeof(ObjectDB), "CopyOtherDB")]
	public static class ObjectDB_CopyOtherDB_Patch
	{
		public static void Postfix()
		{
			if (modEnabled.Value)
			{
				ApplyOneHandedWeaponConfigs();
				ApplyTwoHandedWeaponConfigs();
				ApplyBowWeaponConfigs();
				ApplyOtherWeaponConfigs();
			}
		}
	}

	public static ConfigurableWeapons context;

	public static ConfigEntry<bool> modEnabled;

	public static ConfigEntry<float> oneHandedDamageMultiplier;

	public static ConfigEntry<float> oneHandedBackstabBonusMultiplier;

	public static ConfigEntry<float> oneHandedAttackStaminaUseMultiplier;

	public static ConfigEntry<float> twoHandedDamageMultiplier;

	public static ConfigEntry<float> twoHandedBackstabBonusMultiplier;

	public static ConfigEntry<float> twoHandedAttackStaminaUseMultiplier;

	public static ConfigEntry<float> bowDamageMultiplier;

	public static ConfigEntry<float> bowBackstabBonusMultiplier;

	public static ConfigEntry<float> bowAttackStaminaUseMultiplier;

	public static ConfigEntry<float> otherDamageMultiplier;

	public static ConfigEntry<float> otherBackstabBonusMultiplier;

	public static ConfigEntry<float> otherAttackStaminaUseMultiplier;

	public static List<WeaponData> weaponDatas;

	public static string assetPath;

	public void Awake()
	{
		context = this;
		modEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("1. General", "Enabled", true, "Enable this mod");
		oneHandedDamageMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("2. One Handed", "OneHandedDamageMultiplier", 1f, "One Handed damage multiplier for all weapons");
		oneHandedBackstabBonusMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("2. One Handed", "OneHandedBackstabBonusMultiplier", 1f, "One Handed backstab bonus multiplier for all weapons");
		oneHandedAttackStaminaUseMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("2. One Handed", "OneHandedAttackStaminaUseMultiplier", 1f, "One Handed attack stamina use multiplier for all weapons");
		twoHandedDamageMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("3. Two Handed", "TwoHandedDamageMultiplier", 1f, "Two Handed damage multiplier for all weapons");
		twoHandedBackstabBonusMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("3. Two Handed", "TwoHandedBackstabBonusMultiplier", 1f, "Two Handed backstab bonus multiplier for all weapons");
		twoHandedAttackStaminaUseMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("3. Two Handed", "TwoHandedAttackStaminaUseMultiplier", 1f, "Two Handed attack stamina use multiplier for all weapons");
		bowDamageMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("4. Bow", "BowDamageMultiplier", 1f, "Bow damage multiplier for all weapons");
		bowBackstabBonusMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("4. Bow", "BowBackstabBonusMultiplier", 1f, "Bow backstab bonus multiplier for all weapons");
		bowAttackStaminaUseMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("4. Bow", "BowAttackStaminaUseMultiplier", 1f, "Bow attack stamina use multiplier for all weapons");
		otherDamageMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("5. Other Weapons", "OtherWeaponsDamageMultiplier", 1f, "Other Weapons damage multiplier for all weapons");
		otherBackstabBonusMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("5. Other Weapons", "OtherWeaponsBackstabBonusMultiplier", 1f, "Other Weapons backstab bonus multiplier for all weapons");
		otherAttackStaminaUseMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("5. Other Weapons", "OtherWeaponsAttackStaminaUseMultiplier", 1f, "Other Weapons attack stamina use multiplier for all weapons");
		assetPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "CustomWeaponStats");
		Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null);
	}

	public static List<ItemDrop> GetOneHandeds()
	{
		//IL_0035: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Invalid comparison between Unknown and I4
		List<ItemDrop> list = new List<ItemDrop>();
		foreach (GameObject item in ObjectDB.instance.m_items)
		{
			ItemDrop component = item.GetComponent<ItemDrop>();
			if ((int)component.m_itemData.m_shared.m_itemType == 3 && component.m_itemData.IsWeapon())
			{
				list.Add(component);
			}
		}
		return list;
	}

	public static List<ItemDrop> GetTwoHandeds()
	{
		//IL_0035: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Invalid comparison between Unknown and I4
		List<ItemDrop> list = new List<ItemDrop>();
		foreach (GameObject item in ObjectDB.instance.m_items)
		{
			ItemDrop component = item.GetComponent<ItemDrop>();
			if ((int)component.m_itemData.m_shared.m_itemType == 14 && component.m_itemData.IsWeapon())
			{
				list.Add(component);
			}
		}
		return list;
	}

	public static List<ItemDrop> GetBows()
	{
		//IL_0035: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Invalid comparison between Unknown and I4
		List<ItemDrop> list = new List<ItemDrop>();
		foreach (GameObject item in ObjectDB.instance.m_items)
		{
			ItemDrop component = item.GetComponent<ItemDrop>();
			if ((int)component.m_itemData.m_shared.m_itemType == 4 && component.m_itemData.IsWeapon())
			{
				list.Add(component);
			}
		}
		return list;
	}

	public static List<ItemDrop> GetOthers()
	{
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		List<ItemDrop> list = new List<ItemDrop>();
		List<ItemType> list2 = new List<ItemType>
		{
			(ItemType)3,
			(ItemType)14,
			(ItemType)4
		};
		foreach (GameObject item in ObjectDB.instance.m_items)
		{
			ItemDrop component = item.GetComponent<ItemDrop>();
			if (!list2.Contains(component.m_itemData.m_shared.m_itemType) && component.m_itemData.IsWeapon())
			{
				list.Add(component);
			}
		}
		return list;
	}

	public static void ApplyOneHandedWeaponConfigs()
	{
		if ((Object)(object)ObjectDB.instance == (Object)null || ObjectDB.instance.m_items.Count == 0)
		{
			return;
		}
		List<ItemDrop> oneHandeds = GetOneHandeds();
		foreach (ItemDrop item in oneHandeds)
		{
			((DamageTypes)(ref item.m_itemData.m_shared.m_damages)).Modify(oneHandedDamageMultiplier.Value);
			SharedData shared = item.m_itemData.m_shared;
			shared.m_backstabBonus *= oneHandedBackstabBonusMultiplier.Value;
			Attack attack = item.m_itemData.m_shared.m_attack;
			attack.m_attackStamina *= oneHandedAttackStaminaUseMultiplier.Value;
		}
	}

	public static void ApplyTwoHandedWeaponConfigs()
	{
		if ((Object)(object)ObjectDB.instance == (Object)null || ObjectDB.instance.m_items.Count == 0)
		{
			return;
		}
		List<ItemDrop> twoHandeds = GetTwoHandeds();
		foreach (ItemDrop item in twoHandeds)
		{
			((DamageTypes)(ref item.m_itemData.m_shared.m_damages)).Modify(twoHandedDamageMultiplier.Value);
			SharedData shared = item.m_itemData.m_shared;
			shared.m_backstabBonus *= twoHandedBackstabBonusMultiplier.Value;
			Attack attack = item.m_itemData.m_shared.m_attack;
			attack.m_attackStamina *= twoHandedAttackStaminaUseMultiplier.Value;
		}
	}

	public static void ApplyBowWeaponConfigs()
	{
		if ((Object)(object)ObjectDB.instance == (Object)null || ObjectDB.instance.m_items.Count == 0)
		{
			return;
		}
		List<ItemDrop> bows = GetBows();
		foreach (ItemDrop item in bows)
		{
			((DamageTypes)(ref item.m_itemData.m_shared.m_damages)).Modify(bowDamageMultiplier.Value);
			SharedData shared = item.m_itemData.m_shared;
			shared.m_backstabBonus *= bowBackstabBonusMultiplier.Value;
			Attack attack = item.m_itemData.m_shared.m_attack;
			attack.m_attackStamina *= bowAttackStaminaUseMultiplier.Value;
		}
	}

	public static void ApplyOtherWeaponConfigs()
	{
		if ((Object)(object)ObjectDB.instance == (Object)null || ObjectDB.instance.m_items.Count == 0)
		{
			return;
		}
		List<ItemDrop> others = GetOthers();
		foreach (ItemDrop item in others)
		{
			((DamageTypes)(ref item.m_itemData.m_shared.m_damages)).Modify(otherDamageMultiplier.Value);
			SharedData shared = item.m_itemData.m_shared;
			shared.m_backstabBonus *= otherBackstabBonusMultiplier.Value;
			Attack attack = item.m_itemData.m_shared.m_attack;
			attack.m_attackStamina *= otherAttackStaminaUseMultiplier.Value;
		}
	}
}
public class WeaponData
{
	public string name;

	public bool useDurability;

	public bool blockable;

	public bool dodgeable;

	public SkillType skillType;

	public float useDurabilityDrain;

	public float durabilityPerLevel;

	public float holdDurationMin;

	public float holdStaminaDrain;

	public int toolTier;

	public string ammoType;

	public string attackStatusEffect;

	public string equipStatusEffect;

	public string statusEffect;

	public float backStabBonus;

	public float blockPower;

	public float deflectionForce;

	public float attackForce;

	public float blunt;

	public float damage;

	public float pierce;

	public float slash;

	public float chop;

	public float pickaxe;

	public float fire;

	public float frost;

	public float lightning;

	public float poison;

	public float spirit;

	public float blockPowerPerLevel;

	public float deflectionForcePerLevel;

	public float bluntPerLevel;

	public float damagePerLevel;

	public float piercePerLevel;

	public float slashPerLevel;

	public float chopPerLevel;

	public float pickaxePerLevel;

	public float firePerLevel;

	public float frostPerLevel;

	public float lightningPerLevel;

	public float poisonPerLevel;

	public float spiritPerLevel;

	public bool hitTerrain;

	public bool hitTerrainSecondary;
}
public class WeaponState : SharedData
{
	public float useDurabilityDrain;

	public float holdDurationMin;

	public float holdStaminaDrain;

	public float attackForce;

	public float backstabBonus;

	public float damage;

	public float blunt;

	public float slash;

	public float pierce;

	public float chop;

	public float pickaxe;

	public float fire;

	public float frost;

	public float lightning;

	public float poison;

	public float spirit;

	public bool hitTerrain;

	public bool hitTerrainSecondary;

	public WeaponState(ItemData weapon)
	{
		useDurabilityDrain = weapon.m_shared.m_useDurabilityDrain;
		attackForce = weapon.m_shared.m_attackForce;
		backstabBonus = weapon.m_shared.m_backstabBonus;
		damage = weapon.m_shared.m_damages.m_damage;
		blunt = weapon.m_shared.m_damages.m_blunt;
		slash = weapon.m_shared.m_damages.m_slash;
		pierce = weapon.m_shared.m_damages.m_pierce;
		chop = weapon.m_shared.m_damages.m_chop;
		pickaxe = weapon.m_shared.m_damages.m_pickaxe;
		fire = weapon.m_shared.m_damages.m_fire;
		frost = weapon.m_shared.m_damages.m_frost;
		lightning = weapon.m_shared.m_damages.m_lightning;
		poison = weapon.m_shared.m_damages.m_poison;
		spirit = weapon.m_shared.m_damages.m_spirit;
		hitTerrain = weapon.m_shared.m_attack?.m_hitTerrain ?? false;
		hitTerrainSecondary = weapon.m_shared.m_secondaryAttack?.m_hitTerrain ?? false;
	}
}