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 DualSwords v0.1.2
plugins\DualSwords\DualSwords.dll
Decompiled 6 hours agousing 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", "Парное оружие, выкованное из бронзы и железа. Разное по происхождению, но сбалансированное тщательной закалкой." } }); } } }