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(); 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(); 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(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 list = new List(); List list2 = new List(); List list3 = new List(); List list4 = new List(); List list5 = new List(); List list6 = new List(); 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 vertices, List normals, List uvs, List boneWeights, List 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 component2 = ((Component)swordMeshRenderer2).GetComponent(); 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(); 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(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(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)swordPrefab.GetComponentsInChildren(true)).FirstOrDefault((Func)((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 component2 = ((Component)targetRenderer).GetComponent(); 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(); if (!((Object)(object)component == (Object)null) && !((Object)(object)component.sharedMesh == (Object)null)) { val3.AddComponent().sharedMesh = component.sharedMesh; MeshRenderer obj = val3.AddComponent(); ((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(); 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(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 { { "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 { { "item_tempered_blades", "Закалённые клинки" }, { "item_tempered_blades_desc", "Парное оружие, выкованное из бронзы и железа. Разное по происхождению, но сбалансированное тщательной закалкой." } }); } } }