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;
}
}