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 BronzeBattleaxe v1.1.0
plugins/Ixillia.BronzeBattleaxe/BronzeBattleaxe.dll
Decompiled 20 hours agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; 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.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("0.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 BronzeBattleaxe { internal static class BronzeAppearance { private static readonly Color BronzeTone = new Color(1.35f, 0.95f, 0.5f); private static readonly Quaternion IconRotation = Quaternion.LookRotation(new Vector3(-1f, 1f, 0f), Vector3.forward); public static void TryApply(CustomItem item) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 if ((int)SystemInfo.graphicsDeviceType == 4) { return; } SharedData shared = item.ItemDrop.m_itemData.m_shared; bool flag = false; try { BronzeModel.Apply(item.ItemPrefab); flag = true; } catch (Exception arg) { BronzeBattleaxePlugin.Log.LogWarning((object)$"Could not load the bronze model, using the recoloured iron one: {arg}"); } try { if (!flag) { TintModel(item.ItemPrefab); } TintIcons(shared); } catch (Exception arg2) { BronzeBattleaxePlugin.Log.LogWarning((object)$"Could not re-colour the Bronze Battleaxe, keeping the iron look: {arg2}"); } if (flag) { RenderIcon(item.ItemPrefab, shared); } } private static void RenderIcon(GameObject prefab, SharedData shared) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_003a: 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_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected O, but got Unknown GameObject val = new GameObject("BronzeBattleaxeIcon"); try { Object.Instantiate<GameObject>(((Component)prefab.GetComponentInChildren<MeshFilter>(true)).gameObject, val.transform, false); Sprite val2 = RenderManager.Instance.Render(new RenderRequest(val) { Width = 128, Height = 128, Rotation = IconRotation }); if ((Object)(object)val2 != (Object)null) { shared.m_icons = (Sprite[])(object)new Sprite[1] { val2 }; } else { BronzeBattleaxePlugin.Log.LogWarning((object)"Icon render returned nothing, keeping the placeholder icon"); } } catch (Exception arg) { BronzeBattleaxePlugin.Log.LogWarning((object)$"Could not render the Bronze Battleaxe icon, keeping the placeholder: {arg}"); } finally { Object.DestroyImmediate((Object)(object)val); } } private static void TintModel(GameObject prefab) { Dictionary<Material, Material> dictionary = new Dictionary<Material, Material>(); Dictionary<Texture, Texture> cache = new Dictionary<Texture, Texture>(); MeshRenderer[] componentsInChildren = prefab.GetComponentsInChildren<MeshRenderer>(true); foreach (MeshRenderer val in componentsInChildren) { Material[] sharedMaterials = ((Renderer)val).sharedMaterials; for (int j = 0; j < sharedMaterials.Length; j++) { Material val2 = sharedMaterials[j]; if (!((Object)(object)val2 == (Object)null) && val2.HasProperty("_MainTex")) { if (!dictionary.TryGetValue(val2, out var value)) { value = (dictionary[val2] = BronzeMaterial(val2, cache)); } sharedMaterials[j] = value; } } ((Renderer)val).sharedMaterials = sharedMaterials; } } private static Material BronzeMaterial(Material original, Dictionary<Texture, Texture> cache) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown Material val = new Material(original) { name = ((Object)original).name + "_bronze" }; Texture texture = original.GetTexture("_MainTex"); if ((Object)(object)texture == (Object)null) { return val; } if (!cache.TryGetValue(texture, out var value)) { Texture mask = (original.HasProperty("_MetallicGlossMap") ? original.GetTexture("_MetallicGlossMap") : null); value = (cache[texture] = TintByMask(texture, mask)); } val.SetTexture("_MainTex", value); return val; } private static Texture TintByMask(Texture diffuse, Texture mask) { //IL_00a4: 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_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Expected O, but got Unknown //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0088: 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) int width = diffuse.width; int height = diffuse.height; Color32[] array = ReadPixels(diffuse, width, height, srgb: true); Color32[] array2 = (((Object)(object)mask != (Object)null) ? ReadPixels(mask, width, height, srgb: false) : null); for (int i = 0; i < array.Length; i++) { float strength = ((array2 != null) ? ((float)(int)array2[i].r / 255f) : 1f); array[i] = Recolour(array[i], strength); } Texture2D val = new Texture2D(width, height, (TextureFormat)4, true, false) { name = ((Object)diffuse).name + "_bronze", filterMode = diffuse.filterMode, wrapMode = diffuse.wrapMode, anisoLevel = diffuse.anisoLevel }; val.SetPixels32(array); val.Apply(true, true); return (Texture)val; } private static void TintIcons(SharedData shared) { Sprite[] icons = shared.m_icons; if (icons != null) { Sprite[] array = (Sprite[])(object)new Sprite[icons.Length]; for (int i = 0; i < icons.Length; i++) { array[i] = TintSprite(icons[i]); } shared.m_icons = array; } } private static Sprite TintSprite(Sprite sprite) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: 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_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0099: 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_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Expected O, but got Unknown //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_0165: 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_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)sprite == (Object)null) { return null; } Rect textureRect = sprite.textureRect; Color32[] array = ReadPixels((Texture)(object)sprite.texture, (int)((Rect)(ref textureRect)).width, (int)((Rect)(ref textureRect)).height, srgb: true, (Vector2?)new Vector2(((Rect)(ref textureRect)).width / (float)((Texture)sprite.texture).width, ((Rect)(ref textureRect)).height / (float)((Texture)sprite.texture).height), (Vector2?)new Vector2(((Rect)(ref textureRect)).x / (float)((Texture)sprite.texture).width, ((Rect)(ref textureRect)).y / (float)((Texture)sprite.texture).height)); float num = default(float); float num2 = default(float); float num3 = default(float); for (int i = 0; i < array.Length; i++) { Color32 val = array[i]; if (val.a != 0) { Color.RGBToHSV(Color32.op_Implicit(val), ref num, ref num2, ref num3); float strength = 1f - Mathf.SmoothStep(0.12f, 0.35f, num2); array[i] = Recolour(val, strength); } } Texture2D val2 = new Texture2D((int)((Rect)(ref textureRect)).width, (int)((Rect)(ref textureRect)).height, (TextureFormat)4, false, false) { name = ((Object)sprite).name + "_bronze", filterMode = ((Texture)sprite.texture).filterMode }; val2.SetPixels32(array); val2.Apply(false, true); Sprite obj = Sprite.Create(val2, new Rect(0f, 0f, (float)((Texture)val2).width, (float)((Texture)val2).height), new Vector2(0.5f, 0.5f), sprite.pixelsPerUnit); ((Object)obj).name = ((Object)sprite).name + "_bronze"; return obj; } private static Color32 Recolour(Color32 pixel, float strength) { //IL_0005: 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_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0030: 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_0083: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) float num = (0.299f * (float)(int)pixel.r + 0.587f * (float)(int)pixel.g + 0.114f * (float)(int)pixel.b) / 255f; float num2 = Mathf.Lerp((float)(int)pixel.r / 255f, Mathf.Min(1f, num * BronzeTone.r), strength); float num3 = Mathf.Lerp((float)(int)pixel.g / 255f, Mathf.Min(1f, num * BronzeTone.g), strength); float num4 = Mathf.Lerp((float)(int)pixel.b / 255f, Mathf.Min(1f, num * BronzeTone.b), strength); return Color32.op_Implicit(new Color(num2, num3, num4, (float)(int)pixel.a / 255f)); } private static Color32[] ReadPixels(Texture source, int width, int height, bool srgb, Vector2? scale = null, Vector2? offset = null) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: 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_007f: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) RenderTexture temporary = RenderTexture.GetTemporary(width, height, 0, (RenderTextureFormat)0, (RenderTextureReadWrite)((!srgb) ? 1 : 2)); RenderTexture active = RenderTexture.active; try { if (scale.HasValue) { Graphics.Blit(source, temporary, scale.Value, (Vector2)(((??)offset) ?? Vector2.zero)); } else { Graphics.Blit(source, temporary); } RenderTexture.active = temporary; Texture2D val = new Texture2D(width, height, (TextureFormat)4, false, !srgb); val.ReadPixels(new Rect(0f, 0f, (float)width, (float)height), 0, 0); Color32[] pixels = val.GetPixels32(); Object.Destroy((Object)val); return pixels; } finally { RenderTexture.active = active; RenderTexture.ReleaseTemporary(temporary); } } } [BepInPlugin("com.ixillia.bronzebattleaxe", "Bronze Battleaxe", "1.1.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class BronzeBattleaxePlugin : BaseUnityPlugin { public const string PluginGuid = "com.ixillia.bronzebattleaxe"; public const string PluginName = "Bronze Battleaxe"; public const string PluginVersion = "1.1.0"; private const string BasePrefab = "Battleaxe"; private const string PrefabName = "BronzeBattleaxe"; internal const string NameToken = "item_bronzebattleaxe"; private const string DescriptionToken = "item_bronzebattleaxe_description"; internal static ManualLogSource Log; internal static ConfigEntry<float> MaxSwingSpeedBonus; private void Awake() { //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_0049: Expected O, but got Unknown //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected O, but got Unknown //IL_005d: Unknown result type (might be due to invalid IL or missing references) Log = ((BaseUnityPlugin)this).Logger; MaxSwingSpeedBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Combat", "MaxSwingSpeedBonus", 0.25f, new ConfigDescription("Swing speed bonus at Axes skill 100, scaled linearly from 0 at skill 0 (0.25 = 25% faster).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[1] { (object)new ConfigurationManagerAttributes { IsAdminOnly = true } })); new Harmony("com.ixillia.bronzebattleaxe").PatchAll(Assembly.GetExecutingAssembly()); CustomLocalization localization = LocalizationManager.Instance.GetLocalization(); string text = "English"; localization.AddTranslation(ref text, new Dictionary<string, string> { { "item_bronzebattleaxe", "Bronze Battleaxe" }, { "item_bronzebattleaxe_description", "A heavy two-handed axe cast from bronze. Duller than iron, but swings faster as your Axes skill grows." } }); PrefabManager.OnVanillaPrefabsAvailable += AddBronzeBattleaxe; } private void AddBronzeBattleaxe() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown PrefabManager.OnVanillaPrefabsAvailable -= AddBronzeBattleaxe; ItemConfig val = new ItemConfig { Name = "$item_bronzebattleaxe", Description = "$item_bronzebattleaxe_description", CraftingStation = CraftingStations.Forge, MinStationLevel = 2, Requirements = BronzeBattleaxeStats.Requirements }; CustomItem val2 = new CustomItem("BronzeBattleaxe", "Battleaxe", val); if ((Object)(object)val2.ItemPrefab == (Object)null || (Object)(object)val2.ItemDrop == (Object)null) { Log.LogError((object)"Could not clone 'Battleaxe', Bronze Battleaxe was not added"); return; } BronzeBattleaxeStats.Apply(val2.ItemDrop.m_itemData.m_shared); CustomRecipe recipe = val2.Recipe; BronzeBattleaxeStats.FlagUpgraderResource((recipe != null) ? recipe.Recipe : null); BronzeAppearance.TryApply(val2); ItemManager.Instance.AddItem(val2); Log.LogInfo((object)"Added Bronze Battleaxe"); } } internal static class BronzeBattleaxeStats { public const float Slash = 50f; public const float Chop = 30f; public const float MaxDurability = 150f; public const float BlockPower = 16f; public const float AttackForce = 60f; public const float MovementModifier = -0.05f; public const float StaminaMultiplier = 0.8f; public const int ToolTier = 2; public const int StationLevel = 2; public static readonly RequirementConfig[] Requirements = (RequirementConfig[])(object)new RequirementConfig[4] { new RequirementConfig("FineWood", 20, 3, false), new RequirementConfig("Bronze", 14, 7, false), new RequirementConfig("LeatherScraps", 4, 0, false), new RequirementConfig("Upgrader1Weapon", 1, 0, false) }; private const string UpgraderItem = "Upgrader1Weapon"; public static void Apply(SharedData shared) { shared.m_damages.m_slash = 50f; shared.m_damages.m_chop = 30f; shared.m_maxDurability = 150f; shared.m_blockPower = 16f; shared.m_attackForce = 60f; shared.m_movementModifier = -0.05f; shared.m_toolTier = 2; Attack attack = shared.m_attack; attack.m_attackStamina *= 0.8f; Attack secondaryAttack = shared.m_secondaryAttack; secondaryAttack.m_attackStamina *= 0.8f; } public static void FlagUpgraderResource(Recipe recipe) { if ((Object)(object)recipe == (Object)null) { return; } Requirement[] resources = recipe.m_resources; foreach (Requirement val in resources) { if ((Object)(object)val.m_resItem != (Object)null && ((Object)val.m_resItem).name.EndsWith("Upgrader1Weapon")) { val.m_upgraderResource = true; } } } } internal static class BronzeModel { private const string ResourcePrefix = "BronzeBattleaxe.assets."; private static readonly MethodInfo LoadImage = typeof(ImageConversion).GetMethod("LoadImage", new Type[3] { typeof(Texture2D), typeof(byte[]), typeof(bool) }); public static void Apply(GameObject prefab) { //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Expected O, but got Unknown MeshFilter val = FindAxeMeshFilter(prefab); MeshRenderer component = ((Component)val).GetComponent<MeshRenderer>(); Mesh sharedMesh; using (Stream stream = Open("bronze_battleaxe.obj")) { sharedMesh = ObjMesh.Load(stream, "bronze_battleaxe"); } Texture2D val2 = LoadTexture("bronze_battleaxe_albedo.png", linear: false); Texture2D val3 = LoadTexture("bronze_battleaxe_normal.png", linear: true); Texture2D val4 = LoadTexture("bronze_battleaxe_metallic.png", linear: true); Dictionary<string, Vector3> points = ReadTrail(); Material val5 = new Material(((Renderer)component).sharedMaterials[0]) { name = "bronze_battleaxe" }; val5.SetTexture("_MainTex", (Texture)(object)val2); val5.SetTexture("_BumpMap", (Texture)(object)val3); val5.SetTexture("_MetallicGlossMap", (Texture)(object)val4); val.sharedMesh = sharedMesh; ((Renderer)component).sharedMaterials = (Material[])(object)new Material[1] { val5 }; MoveTrail(prefab, points); } private static MeshFilter FindAxeMeshFilter(GameObject prefab) { MeshFilter[] componentsInChildren = prefab.GetComponentsInChildren<MeshFilter>(true); foreach (MeshFilter val in componentsInChildren) { if ((Object)(object)((Component)val).GetComponent<MeshRenderer>() != (Object)null) { return val; } } throw new InvalidOperationException("no mesh found on " + ((Object)prefab).name); } private static void MoveTrail(GameObject prefab, Dictionary<string, Vector3> points) { //IL_004b: Unknown result type (might be due to invalid IL or missing references) string[] array = new string[2] { "base", "tip" }; foreach (string text in array) { Transform val = prefab.transform.Find("attach/equiped/trail/" + text); if ((Object)(object)val != (Object)null && points.TryGetValue(text, out var value)) { val.localPosition = value; } } } private static Dictionary<string, Vector3> ReadTrail() { //IL_004c: Unknown result type (might be due to invalid IL or missing references) Dictionary<string, Vector3> dictionary = new Dictionary<string, Vector3>(); using StreamReader streamReader = new StreamReader(Open("bronze_battleaxe.trail")); string text; while ((text = streamReader.ReadLine()) != null) { string[] array = text.Split(new char[1] { ' ' }); if (array.Length == 4) { dictionary[array[0]] = new Vector3(Float(array[1]), Float(array[2]), Float(array[3])); } } return dictionary; } private static Texture2D LoadTexture(string file, bool linear) { //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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown byte[] array; using (Stream stream = Open(file)) { using MemoryStream memoryStream = new MemoryStream(); stream.CopyTo(memoryStream); array = memoryStream.ToArray(); } Texture2D val = new Texture2D(2, 2, (TextureFormat)4, true, linear) { name = Path.GetFileNameWithoutExtension(file), wrapMode = (TextureWrapMode)0, filterMode = (FilterMode)2, anisoLevel = 4 }; if (!(bool)LoadImage.Invoke(null, new object[3] { val, array, false })) { throw new InvalidOperationException("could not decode " + file); } return val; } private static Stream Open(string file) { return Assembly.GetExecutingAssembly().GetManifestResourceStream("BronzeBattleaxe.assets." + file) ?? throw new FileNotFoundException("embedded resource missing: " + file); } private static float Float(string s) { return float.Parse(s, CultureInfo.InvariantCulture); } } internal static class ObjMesh { public static Mesh Load(Stream stream, string name) { //IL_025c: Unknown result type (might be due to invalid IL or missing references) //IL_0261: Unknown result type (might be due to invalid IL or missing references) //IL_0268: Unknown result type (might be due to invalid IL or missing references) //IL_026f: Unknown result type (might be due to invalid IL or missing references) //IL_0278: Unknown result type (might be due to invalid IL or missing references) //IL_0280: Unknown result type (might be due to invalid IL or missing references) //IL_0289: Unknown result type (might be due to invalid IL or missing references) //IL_028f: Unknown result type (might be due to invalid IL or missing references) //IL_0296: Expected O, but got Unknown //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) List<Vector3> list = new List<Vector3>(); List<Vector2> list2 = new List<Vector2>(); List<Vector3> list3 = new List<Vector3>(); List<Vector3> list4 = new List<Vector3>(); List<Vector2> list5 = new List<Vector2>(); List<Vector3> list6 = new List<Vector3>(); List<int> list7 = new List<int>(); Dictionary<string, int> dictionary = new Dictionary<string, int>(); using (StreamReader streamReader = new StreamReader(stream)) { string text; while ((text = streamReader.ReadLine()) != null) { string[] array = text.Split(new char[1] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (array.Length == 0) { continue; } switch (array[0]) { case "v": list.Add(new Vector3(0f - Float(array[1]), Float(array[2]), Float(array[3]))); break; case "vt": list2.Add(new Vector2(Float(array[1]), Float(array[2]))); break; case "vn": list3.Add(new Vector3(0f - Float(array[1]), Float(array[2]), Float(array[3]))); break; case "f": { int[] array2 = new int[array.Length - 1]; for (int i = 1; i < array.Length; i++) { if (!dictionary.TryGetValue(array[i], out var value)) { string[] array3 = array[i].Split(new char[1] { '/' }); value = list4.Count; list4.Add(list[int.Parse(array3[0]) - 1]); list5.Add((array3.Length > 1 && array3[1].Length > 0) ? list2[int.Parse(array3[1]) - 1] : Vector2.zero); list6.Add((array3.Length > 2 && array3[2].Length > 0) ? list3[int.Parse(array3[2]) - 1] : Vector3.up); dictionary[array[i]] = value; } array2[i - 1] = value; } for (int j = 1; j < array2.Length - 1; j++) { list7.Add(array2[0]); list7.Add(array2[j + 1]); list7.Add(array2[j]); } break; } } } } Mesh val = new Mesh { name = name }; val.SetVertices(list4); val.SetUVs(0, list5); val.SetNormals(list6); val.SetTriangles(list7, 0); val.RecalculateBounds(); val.RecalculateTangents(); return val; } private static float Float(string s) { return float.Parse(s, CultureInfo.InvariantCulture); } } internal static class SwingSpeed { public static float Multiplier(Character character) { Humanoid val = (Humanoid)(object)((character is Humanoid) ? character : null); if (val == null || !((Character)val).IsOwner() || !((Character)val).InAttack()) { return 1f; } return MultiplierForWeapon(val, val.GetCurrentWeapon()); } public static float MultiplierForWeapon(Humanoid humanoid, ItemData weapon) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) if (weapon == null || weapon.m_shared.m_name != "$item_bronzebattleaxe") { return 1f; } return 1f + BronzeBattleaxePlugin.MaxSwingSpeedBonus.Value * ((Character)humanoid).GetSkillFactor(weapon.m_shared.m_skillType); } } [HarmonyPatch(typeof(CharacterAnimEvent), "Speed")] internal static class CharacterAnimEvent_Speed_Patch { private static void Prefix(ref float speedScale, Character ___m_character) { speedScale *= SwingSpeed.Multiplier(___m_character); } } [HarmonyPatch(typeof(Attack), "Start")] internal static class Attack_Start_Patch { private static void Postfix(bool __result, Humanoid character, ZSyncAnimation zanim, ItemData weapon) { if (__result && ((Character)character).IsOwner()) { float num = SwingSpeed.MultiplierForWeapon(character, weapon); if (num != 1f) { zanim.SetSpeed(num); } } } } }