Decompiled source of DualSwords v0.1.2

plugins\DualSwords\DualSwords.dll

Decompiled 6 hours ago
using 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 Jotunn.Configs;
using Jotunn.Entities;
using Jotunn.Managers;
using Jotunn.Utils;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("DualSwords")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("DualSwords")]
[assembly: AssemblyTitle("DualSwords")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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;
		}
	}
}
namespace DualSwords
{
	[BepInPlugin("sunray.valheim.dualswords", "Dual Swords", "0.1.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	internal class Plugin : BaseUnityPlugin
	{
		public const string PluginGUID = "sunray.valheim.dualswords";

		public const string PluginName = "Dual Swords";

		public const string PluginVersion = "0.1.0";

		private const string NewPrefabName = "TemperedBlades";

		private const string BasePrefabName = "AxeEarly";

		private const string RightSwordPrefabName = "SwordIron";

		private const string LeftSwordPrefabName = "SwordBronze";

		private void Awake()
		{
			AddLocalizations();
			PrefabManager.OnVanillaPrefabsAvailable += AddDualSwords;
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Dual Swords loaded.");
		}

		private void AddDualSwords()
		{
			//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_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: 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_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Expected O, but got Unknown
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Expected O, but got Unknown
			try
			{
				ItemConfig val = new ItemConfig
				{
					Name = "$item_tempered_blades",
					Description = "$item_tempered_blades_desc",
					CraftingStation = CraftingStations.Forge,
					MinStationLevel = 2,
					Amount = 1
				};
				val.AddRequirement("SwordIron", 1, 0);
				val.AddRequirement("SwordBronze", 1, 0);
				val.AddRequirement("SurtlingCore", 2, 1);
				val.AddRequirement("Chain", 1, 0);
				val.AddRequirement("Iron", 0, 4);
				val.AddRequirement("Bronze", 0, 2);
				CustomItem val2 = new CustomItem("TemperedBlades", "AxeEarly", val);
				SharedData shared = val2.ItemDrop.m_itemData.m_shared;
				ConfigureStats(shared);
				CopyAttackEffectsFromSource(shared, "SwordIron");
				ConfigureIcon(shared);
				DumpRenderers(val2.ItemPrefab, "Dual Swords cloned from AxeEarly");
				GameObject prefab = PrefabManager.Instance.GetPrefab("SwordIron");
				GameObject prefab2 = PrefabManager.Instance.GetPrefab("SwordBronze");
				if ((Object)(object)prefab != (Object)null)
				{
					DumpRenderers(prefab, "SwordIron source");
				}
				else
				{
					((BaseUnityPlugin)this).Logger.LogWarning((object)"SwordIron prefab not found during renderer dump.");
				}
				if ((Object)(object)prefab2 != (Object)null)
				{
					DumpRenderers(prefab2, "SwordBronze source");
				}
				else
				{
					((BaseUnityPlugin)this).Logger.LogWarning((object)"SwordBronze prefab not found during renderer dump.");
				}
				ReplaceDefaultAxeMeshesWithSwordMeshes(val2.ItemPrefab);
				ReplaceEquippedSkinnedMeshWithDualSwordMesh(val2.ItemPrefab);
				ItemManager.Instance.AddItem(val2);
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Dual Swords registered successfully.");
			}
			catch (Exception arg)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)$"Failed to register Dual Swords: {arg}");
			}
			finally
			{
				PrefabManager.OnVanillaPrefabsAvailable -= AddDualSwords;
			}
		}

		private static void ConfigureStats(SharedData shared)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			shared.m_name = "$item_tempered_blades";
			shared.m_description = "$item_tempered_blades_desc";
			shared.m_skillType = (SkillType)1;
			shared.m_damages = new DamageTypes
			{
				m_slash = 55f,
				m_chop = 0f,
				m_blunt = 0f,
				m_pierce = 0f,
				m_fire = 0f,
				m_frost = 0f,
				m_lightning = 0f,
				m_poison = 0f,
				m_spirit = 0f
			};
			shared.m_damagesPerLevel = new DamageTypes
			{
				m_slash = 6f
			};
			shared.m_maxQuality = 4;
			shared.m_maxDurability = 200f;
			shared.m_durabilityPerLevel = 50f;
			shared.m_attackForce = 35f;
			shared.m_backstabBonus = 3f;
		}

		private void CopyAttackEffectsFromSource(SharedData targetShared, string sourcePrefabName)
		{
			GameObject prefab = PrefabManager.Instance.GetPrefab(sourcePrefabName);
			if ((Object)(object)prefab == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)("Could not find source item prefab for effects: " + sourcePrefabName));
				return;
			}
			ItemDrop component = prefab.GetComponent<ItemDrop>();
			if ((Object)(object)component == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)("Source prefab " + sourcePrefabName + " has no ItemDrop."));
				return;
			}
			SharedData shared = component.m_itemData.m_shared;
			CopyAttackEffects(shared.m_attack, targetShared.m_attack);
			CopyAttackEffects(shared.m_secondaryAttack, targetShared.m_secondaryAttack);
			((BaseUnityPlugin)this).Logger.LogInfo((object)("Copied attack SFX/VFX from " + sourcePrefabName + "."));
		}

		private void CopyAttackEffects(Attack sourceAttack, Attack targetAttack)
		{
			if (sourceAttack != null && targetAttack != null)
			{
				targetAttack.m_startEffect = CloneEffectList(sourceAttack.m_startEffect);
				targetAttack.m_triggerEffect = CloneEffectList(sourceAttack.m_triggerEffect);
				targetAttack.m_hitEffect = CloneEffectList(sourceAttack.m_hitEffect);
				targetAttack.m_hitTerrainEffect = CloneEffectList(sourceAttack.m_hitTerrainEffect);
				targetAttack.m_attackStartNoise = sourceAttack.m_attackStartNoise;
				targetAttack.m_attackHitNoise = sourceAttack.m_attackHitNoise;
			}
		}

		private EffectList CloneEffectList(EffectList source)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Expected O, but got Unknown
			EffectList val = new EffectList();
			if (source == null || source.m_effectPrefabs == null)
			{
				val.m_effectPrefabs = Array.Empty<EffectData>();
				return val;
			}
			val.m_effectPrefabs = source.m_effectPrefabs.ToArray();
			return val;
		}

		private void ConfigureIcon(SharedData shared)
		{
			string text = Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "Assets", "tempered_duals_icon.png");
			((BaseUnityPlugin)this).Logger.LogInfo((object)("Trying to load Dual Swords icon from: " + text));
			Sprite val = AssetUtils.LoadSpriteFromFile(text);
			if ((Object)(object)val != (Object)null)
			{
				shared.m_icons = (Sprite[])(object)new Sprite[1] { val };
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Custom Dual Swords icon loaded successfully.");
			}
			else
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)("Custom Dual Swords icon failed to load from: " + text));
			}
		}

		private Mesh CreateTransformedMesh(Mesh sourceMesh, float scale, Vector3 positionOffset, Quaternion rotationOffset)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: 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_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_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			Mesh val = Object.Instantiate<Mesh>(sourceMesh);
			Vector3[] vertices = val.vertices;
			for (int i = 0; i < vertices.Length; i++)
			{
				vertices[i] = rotationOffset * (vertices[i] * scale) + positionOffset;
			}
			val.vertices = vertices;
			val.RecalculateBounds();
			val.RecalculateNormals();
			return val;
		}

		private Mesh CreateDualSwordMeshWeightedToHands(Mesh rightSourceMesh, Mesh leftSourceMesh, SkinnedMeshRenderer targetRenderer, int rightHandBoneIndex, int leftHandBoneIndex)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Expected O, but got Unknown
			//IL_003c: 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_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_00a5: 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_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			Mesh val = new Mesh();
			((Object)val).name = "DualSwords_IronRight_BronzeLeft";
			float scale = 0.003f;
			Vector3 localOffsetFromBone = default(Vector3);
			((Vector3)(ref localOffsetFromBone))..ctor(0f, 0.0012f, 0.0001f);
			Quaternion localRotationFromBone = Quaternion.Euler(0f, 10f, 93f);
			float scale2 = 0.003f;
			Vector3 localOffsetFromBone2 = default(Vector3);
			((Vector3)(ref localOffsetFromBone2))..ctor(0f, 0.0012f, 0.0001f);
			Quaternion localRotationFromBone2 = Quaternion.Euler(0f, -10f, -93f);
			List<Vector3> list = new List<Vector3>();
			List<Vector3> list2 = new List<Vector3>();
			List<Vector2> list3 = new List<Vector2>();
			List<BoneWeight> list4 = new List<BoneWeight>();
			List<int> list5 = new List<int>();
			List<int> list6 = new List<int>();
			AddSwordMeshPart(rightSourceMesh, targetRenderer, rightHandBoneIndex, scale, localOffsetFromBone, localRotationFromBone, list, list2, list3, list4, list5);
			AddSwordMeshPart(leftSourceMesh, targetRenderer, leftHandBoneIndex, scale2, localOffsetFromBone2, localRotationFromBone2, list, list2, list3, list4, list6);
			val.SetVertices(list);
			if (list2.Count == list.Count)
			{
				val.SetNormals(list2);
			}
			if (list3.Count == list.Count)
			{
				val.SetUVs(0, list3);
			}
			val.boneWeights = list4.ToArray();
			Matrix4x4[] array = (Matrix4x4[])(object)new Matrix4x4[targetRenderer.bones.Length];
			for (int i = 0; i < targetRenderer.bones.Length; i++)
			{
				array[i] = targetRenderer.bones[i].worldToLocalMatrix * ((Component)targetRenderer).transform.localToWorldMatrix;
			}
			val.bindposes = array;
			val.subMeshCount = 2;
			val.SetTriangles(list5, 0);
			val.SetTriangles(list6, 1);
			val.RecalculateBounds();
			if (list2.Count != list.Count)
			{
				val.RecalculateNormals();
			}
			return val;
		}

		private void AddSwordMeshPart(Mesh sourceMesh, SkinnedMeshRenderer targetRenderer, int boneIndex, float scale, Vector3 localOffsetFromBone, Quaternion localRotationFromBone, List<Vector3> vertices, List<Vector3> normals, List<Vector2> uvs, List<BoneWeight> boneWeights, List<int> triangles)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: 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)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			Transform val = targetRenderer.bones[boneIndex];
			int count = vertices.Count;
			Vector3[] vertices2 = sourceMesh.vertices;
			Vector3[] normals2 = sourceMesh.normals;
			Vector2[] uv = sourceMesh.uv;
			for (int i = 0; i < vertices2.Length; i++)
			{
				Vector3 val2 = localRotationFromBone * (vertices2[i] * scale) + localOffsetFromBone;
				Vector3 val3 = val.TransformPoint(val2);
				Vector3 item = ((Component)targetRenderer).transform.InverseTransformPoint(val3);
				vertices.Add(item);
				if (normals2 != null && normals2.Length == vertices2.Length)
				{
					Vector3 val4 = localRotationFromBone * normals2[i];
					Vector3 val5 = val.TransformDirection(val4);
					Vector3 val6 = ((Component)targetRenderer).transform.InverseTransformDirection(val5);
					normals.Add(((Vector3)(ref val6)).normalized);
				}
				if (uv != null && uv.Length == vertices2.Length)
				{
					uvs.Add(uv[i]);
				}
				else
				{
					uvs.Add(Vector2.zero);
				}
				BoneWeight item2 = default(BoneWeight);
				((BoneWeight)(ref item2)).boneIndex0 = boneIndex;
				((BoneWeight)(ref item2)).weight0 = 1f;
				((BoneWeight)(ref item2)).boneIndex1 = 0;
				((BoneWeight)(ref item2)).weight1 = 0f;
				((BoneWeight)(ref item2)).boneIndex2 = 0;
				((BoneWeight)(ref item2)).weight2 = 0f;
				((BoneWeight)(ref item2)).boneIndex3 = 0;
				((BoneWeight)(ref item2)).weight3 = 0f;
				boneWeights.Add(item2);
			}
			int[] triangles2 = sourceMesh.GetTriangles(0);
			for (int j = 0; j < triangles2.Length; j++)
			{
				triangles.Add(count + triangles2[j]);
			}
		}

		private void ReplaceEquippedSkinnedMeshWithDualSwordMesh(GameObject dualSwordsPrefab)
		{
			//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			GameObject prefab = PrefabManager.Instance.GetPrefab("SwordIron");
			GameObject prefab2 = PrefabManager.Instance.GetPrefab("SwordBronze");
			if ((Object)(object)prefab == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"Could not find prefab SwordIron.");
				return;
			}
			if ((Object)(object)prefab2 == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"Could not find prefab SwordBronze.");
				return;
			}
			MeshRenderer swordMeshRenderer = GetSwordMeshRenderer(prefab);
			MeshRenderer swordMeshRenderer2 = GetSwordMeshRenderer(prefab2);
			if ((Object)(object)swordMeshRenderer == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"Could not find Iron Sword MeshRenderer.");
				return;
			}
			if ((Object)(object)swordMeshRenderer2 == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"Could not find Bronze Sword MeshRenderer.");
				return;
			}
			MeshFilter component = ((Component)swordMeshRenderer).GetComponent<MeshFilter>();
			MeshFilter component2 = ((Component)swordMeshRenderer2).GetComponent<MeshFilter>();
			if ((Object)(object)component == (Object)null || (Object)(object)component.sharedMesh == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"Iron Sword renderer has no MeshFilter/sharedMesh.");
				return;
			}
			if ((Object)(object)component2 == (Object)null || (Object)(object)component2.sharedMesh == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"Bronze Sword renderer has no MeshFilter/sharedMesh.");
				return;
			}
			Transform val = dualSwordsPrefab.transform.Find("attach_skin/berzerkr/Berzerkr");
			if ((Object)(object)val == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"Could not find attach_skin/berzerkr/Berzerkr.");
				return;
			}
			SkinnedMeshRenderer component3 = ((Component)val).GetComponent<SkinnedMeshRenderer>();
			if ((Object)(object)component3 == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"Berzerkr object has no SkinnedMeshRenderer.");
				return;
			}
			int num = FindBoneIndex(component3, "RightHand");
			int num2 = FindBoneIndex(component3, "LeftHand");
			if (num < 0 || num2 < 0)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"Cannot create dual swords because RightHand or LeftHand bone was not found.");
				return;
			}
			Mesh sharedMesh = CreateDualSwordMeshWeightedToHands(component.sharedMesh, component2.sharedMesh, component3, num, num2);
			component3.sharedMesh = sharedMesh;
			((Renderer)component3).sharedMaterials = (Material[])(object)new Material[2]
			{
				((Renderer)swordMeshRenderer).sharedMaterials[0],
				((Renderer)swordMeshRenderer2).sharedMaterials[0]
			};
			((Renderer)component3).localBounds = new Bounds(Vector3.zero, Vector3.one * 100f);
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Replaced equipped Berzerkr mesh with Iron Sword in right hand and Bronze Sword in left hand.");
		}

		private int FindBoneIndex(SkinnedMeshRenderer renderer, string boneName)
		{
			for (int i = 0; i < renderer.bones.Length; i++)
			{
				if ((Object)(object)renderer.bones[i] != (Object)null && ((Object)renderer.bones[i]).name == boneName)
				{
					((BaseUnityPlugin)this).Logger.LogInfo((object)$"Found bone {boneName} at index {i}: {GetPath(renderer.bones[i])}");
					return i;
				}
			}
			((BaseUnityPlugin)this).Logger.LogWarning((object)("Bone " + boneName + " not found. Available bones:"));
			for (int j = 0; j < renderer.bones.Length; j++)
			{
				if ((Object)(object)renderer.bones[j] != (Object)null)
				{
					((BaseUnityPlugin)this).Logger.LogWarning((object)$"Bone[{j}]: {((Object)renderer.bones[j]).name} | {GetPath(renderer.bones[j])}");
				}
			}
			return -1;
		}

		private Mesh CreateMeshWeightedToBone(Mesh sourceMesh, SkinnedMeshRenderer targetRenderer, int boneIndex, float scale, Vector3 localOffsetFromBone, Quaternion localRotationFromBone)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: 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)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: 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)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			Mesh val = Object.Instantiate<Mesh>(sourceMesh);
			Transform val2 = targetRenderer.bones[boneIndex];
			Vector3[] vertices = sourceMesh.vertices;
			Vector3[] array = (Vector3[])(object)new Vector3[vertices.Length];
			for (int i = 0; i < vertices.Length; i++)
			{
				Vector3 val3 = localRotationFromBone * (vertices[i] * scale) + localOffsetFromBone;
				Vector3 val4 = val2.TransformPoint(val3);
				array[i] = ((Component)targetRenderer).transform.InverseTransformPoint(val4);
			}
			val.vertices = array;
			BoneWeight[] array2 = (BoneWeight[])(object)new BoneWeight[array.Length];
			for (int j = 0; j < array2.Length; j++)
			{
				int num = j;
				BoneWeight val5 = default(BoneWeight);
				((BoneWeight)(ref val5)).boneIndex0 = boneIndex;
				((BoneWeight)(ref val5)).weight0 = 1f;
				((BoneWeight)(ref val5)).boneIndex1 = 0;
				((BoneWeight)(ref val5)).weight1 = 0f;
				((BoneWeight)(ref val5)).boneIndex2 = 0;
				((BoneWeight)(ref val5)).weight2 = 0f;
				((BoneWeight)(ref val5)).boneIndex3 = 0;
				((BoneWeight)(ref val5)).weight3 = 0f;
				array2[num] = val5;
			}
			val.boneWeights = array2;
			Matrix4x4[] array3 = (Matrix4x4[])(object)new Matrix4x4[targetRenderer.bones.Length];
			for (int k = 0; k < targetRenderer.bones.Length; k++)
			{
				array3[k] = targetRenderer.bones[k].worldToLocalMatrix * ((Component)targetRenderer).transform.localToWorldMatrix;
			}
			val.bindposes = array3;
			val.RecalculateBounds();
			val.RecalculateNormals();
			return val;
		}

		private void ReplaceDefaultAxeMeshesWithSwordMeshes(GameObject dualSwordsPrefab)
		{
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			GameObject prefab = PrefabManager.Instance.GetPrefab("SwordIron");
			GameObject prefab2 = PrefabManager.Instance.GetPrefab("SwordBronze");
			if ((Object)(object)prefab == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"Could not find prefab SwordIron.");
				return;
			}
			if ((Object)(object)prefab2 == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"Could not find prefab SwordBronze.");
				return;
			}
			MeshRenderer swordMeshRenderer = GetSwordMeshRenderer(prefab);
			MeshRenderer swordMeshRenderer2 = GetSwordMeshRenderer(prefab2);
			if ((Object)(object)swordMeshRenderer == (Object)null || (Object)(object)swordMeshRenderer2 == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"Could not find source sword renderers.");
				return;
			}
			Transform val = dualSwordsPrefab.transform.Find("attach");
			if ((Object)(object)val == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"Could not find DualSwords/attach.");
				return;
			}
			MeshRenderer[] componentsInChildren = ((Component)val).GetComponentsInChildren<MeshRenderer>(true);
			if (componentsInChildren.Length < 2)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)$"Expected 2 target renderers under attach, found {componentsInChildren.Length}.");
				return;
			}
			ApplyStaticMeshToRenderer(componentsInChildren[0], swordMeshRenderer);
			ApplyStaticMeshToRenderer(componentsInChildren[1], swordMeshRenderer2);
			ConfigureDroppedSwordTransform(componentsInChildren[0], new Vector3(-0.25f, -0.03f, 0.45f), new Vector3(75f, 180f, 30f), 0.28f);
			ConfigureDroppedSwordTransform(componentsInChildren[1], new Vector3(0.2f, 0.06f, 0.35f), new Vector3(90f, 180f, -30f), 0.28f);
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Default axe meshes replaced with Iron Sword + Bronze Sword meshes.");
		}

		private MeshRenderer GetSwordMeshRenderer(GameObject swordPrefab)
		{
			return ((IEnumerable<MeshRenderer>)swordPrefab.GetComponentsInChildren<MeshRenderer>(true)).FirstOrDefault((Func<MeshRenderer, bool>)((MeshRenderer r) => ((Object)((Component)r).gameObject).name.Contains("Sword") || ((Object)((Component)r).gameObject).name.Contains("sword") || ((Object)((Component)r).gameObject).name.Contains("Viking_Sword")));
		}

		private void ConfigureDroppedSwordTransform(MeshRenderer renderer, Vector3 localPosition, Vector3 localRotationEuler, float localScale)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: 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_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: 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)
			((Component)renderer).transform.localPosition = localPosition;
			((Component)renderer).transform.localRotation = Quaternion.Euler(localRotationEuler);
			((Component)renderer).transform.localScale = Vector3.one * localScale;
			((BaseUnityPlugin)this).Logger.LogInfo((object)("Configured dropped sword transform: " + GetPath(((Component)renderer).transform) + " | " + $"Pos: {localPosition} | Rot: {localRotationEuler} | Scale: {localScale}"));
		}

		private void ApplyStaticMeshToRenderer(MeshRenderer targetRenderer, MeshRenderer sourceRenderer)
		{
			MeshFilter component = ((Component)sourceRenderer).GetComponent<MeshFilter>();
			MeshFilter component2 = ((Component)targetRenderer).GetComponent<MeshFilter>();
			if ((Object)(object)component == (Object)null || (Object)(object)component.sharedMesh == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)("Source renderer " + GetPath(((Component)sourceRenderer).transform) + " has no MeshFilter/sharedMesh."));
				return;
			}
			if ((Object)(object)component2 == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)("Target renderer " + GetPath(((Component)targetRenderer).transform) + " has no MeshFilter."));
				return;
			}
			component2.sharedMesh = component.sharedMesh;
			((Renderer)targetRenderer).sharedMaterials = ((Renderer)sourceRenderer).sharedMaterials;
			((BaseUnityPlugin)this).Logger.LogInfo((object)("Applied " + ((Object)sourceRenderer).name + " mesh to " + GetPath(((Component)targetRenderer).transform) + "."));
		}

		private GameObject CreateVisualCopyFromRenderers(string name, Renderer[] sourceRenderers)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Expected O, but got Unknown
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			foreach (Renderer val2 in sourceRenderers)
			{
				GameObject val3 = new GameObject(((Object)((Component)val2).gameObject).name + "_copy");
				val3.transform.SetParent(val.transform, false);
				val3.transform.localPosition = Vector3.zero;
				val3.transform.localRotation = Quaternion.identity;
				val3.transform.localScale = Vector3.one;
				MeshRenderer val4 = (MeshRenderer)(object)((val2 is MeshRenderer) ? val2 : null);
				if (val4 != null)
				{
					MeshFilter component = ((Component)val2).GetComponent<MeshFilter>();
					if (!((Object)(object)component == (Object)null) && !((Object)(object)component.sharedMesh == (Object)null))
					{
						val3.AddComponent<MeshFilter>().sharedMesh = component.sharedMesh;
						MeshRenderer obj = val3.AddComponent<MeshRenderer>();
						((Renderer)obj).sharedMaterials = ((Renderer)val4).sharedMaterials;
						((Renderer)obj).enabled = true;
					}
				}
				else
				{
					SkinnedMeshRenderer val5 = (SkinnedMeshRenderer)(object)((val2 is SkinnedMeshRenderer) ? val2 : null);
					if (val5 != null)
					{
						SkinnedMeshRenderer obj2 = val3.AddComponent<SkinnedMeshRenderer>();
						obj2.sharedMesh = val5.sharedMesh;
						((Renderer)obj2).sharedMaterials = ((Renderer)val5).sharedMaterials;
						((Renderer)obj2).enabled = true;
					}
				}
			}
			return val;
		}

		private Transform FindDeepChild(Transform parent, string name)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			foreach (Transform item in parent)
			{
				Transform val = item;
				if (((Object)val).name == name)
				{
					return val;
				}
				Transform val2 = FindDeepChild(val, name);
				if ((Object)(object)val2 != (Object)null)
				{
					return val2;
				}
			}
			return null;
		}

		private void DumpRenderers(GameObject prefab, string label)
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)("--- Renderer dump for " + label + ": " + ((Object)prefab).name + " ---"));
			Renderer[] componentsInChildren = prefab.GetComponentsInChildren<Renderer>(true);
			foreach (Renderer val in componentsInChildren)
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)(GetPath(((Component)val).transform) + " | Type: " + ((object)val).GetType().Name + " | " + $"Enabled: {val.enabled} | " + $"ActiveSelf: {((Component)val).gameObject.activeSelf} | " + $"ActiveInHierarchy: {((Component)val).gameObject.activeInHierarchy}"));
			}
		}

		private static string GetPath(Transform transform)
		{
			if ((Object)(object)transform.parent == (Object)null)
			{
				return ((Object)transform).name;
			}
			return GetPath(transform.parent) + "/" + ((Object)transform).name;
		}

		private void AddLocalizations()
		{
			CustomLocalization localization = LocalizationManager.Instance.GetLocalization();
			string text = "English";
			localization.AddTranslation(ref text, new Dictionary<string, string>
			{
				{ "item_tempered_blades", "Tempered Blades" },
				{ "item_tempered_blades_desc", "A paired weapon forged from bronze and iron. Uneven in origin, but balanced by careful tempering." }
			});
			text = "Russian";
			localization.AddTranslation(ref text, new Dictionary<string, string>
			{
				{ "item_tempered_blades", "Закалённые клинки" },
				{ "item_tempered_blades_desc", "Парное оружие, выкованное из бронзы и железа. Разное по происхождению, но сбалансированное тщательной закалкой." }
			});
		}
	}
}