Please disclose if your mod was created primarily 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 RealisticSpears v0.1.0
plugins/RealisticSpears.dll
Decompiled 7 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using HarmonyLib; using JetBrains.Annotations; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: AssemblyCompany("RealisticSpears")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("RealisticSpears")] [assembly: AssemblyTitle("RealisticSpears")] [assembly: AssemblyVersion("1.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace RealisticSpears { [HarmonyPatch(typeof(Humanoid), "EquipItem")] public static class Patch_Humanoid_EquipItem { private static void Prefix(Humanoid __instance, ItemData item) { if (item != null) { SharedData shared = item.m_shared; if (SpearUtils.IsSpearWithPokeAttack_Shared(shared)) { shared.m_attack.m_attackAnimation = "sword_secondary"; shared.m_attack.m_attackRange = 3f; shared.m_attack.m_attackHeight = 1f; shared.m_attack.m_attackAngle = 30f; shared.m_attack.m_attackRayWidth = 0.4f; } } } } [HarmonyPatch(typeof(VisEquipment), "CustomUpdate")] public static class Patch_VisEquipment_CustomUpdate { private static readonly FieldInfo RightItemField = AccessTools.Field(typeof(VisEquipment), "m_rightItemInstance"); public static void Postfix(VisEquipment __instance, float deltaTime, float time) { //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance == (Object)null || RightItemField == null) { return; } Humanoid component = ((Component)__instance).GetComponent<Humanoid>(); SharedData val = ((component != null) ? component.GetCurrentWeapon() : null)?.m_shared; if (val == null || !SpearUtils.IsSpearWithSwordAttack_Shared(val)) { return; } object? value = RightItemField.GetValue(__instance); GameObject val2 = (GameObject)((value is GameObject) ? value : null); if (!Object.op_Implicit((Object)(object)val2)) { return; } Transform val3 = FindBestTargetTransform(val2); if ((Object)(object)val3 == (Object)null) { return; } bool isFangSpear = SpearUtils.IsFangSpear_Shared(val); bool flag = false; Player val4 = (Player)(object)((component is Player) ? component : null); if ((Object)(object)val4 != (Object)null && ((Character)val4).InAttack()) { object? value2 = AccessTools.Field(typeof(Humanoid), "m_currentAttack").GetValue(component); Attack val5 = (Attack)((value2 is Attack) ? value2 : null); if (val5 != null && string.Equals(val5.m_attackAnimation, "spear_throw", StringComparison.OrdinalIgnoreCase)) { flag = true; } } SpearRotatedMarker spearRotatedMarker = ((Component)val3).GetComponent<SpearRotatedMarker>(); if ((Object)(object)spearRotatedMarker == (Object)null) { spearRotatedMarker = ((Component)val3).gameObject.AddComponent<SpearRotatedMarker>(); spearRotatedMarker.origLocalPos = val3.localPosition; spearRotatedMarker.origLocalRot = val3.localRotation; spearRotatedMarker.rotationApplied = false; spearRotatedMarker.initialized = true; } SpearPositioner.ApplyState(((Component)val3).gameObject, spearRotatedMarker, !flag, isFangSpear); } private static Transform FindBestTargetTransform(GameObject inst) { Transform val = FindDeepChild_Internal(inst.transform, "attach", exact: true); if (Object.op_Implicit((Object)(object)val)) { return val; } Transform val2 = FindDeepChild_Internal(inst.transform, "attach", exact: false); if (Object.op_Implicit((Object)(object)val2)) { return val2; } MeshRenderer componentInChildren = inst.GetComponentInChildren<MeshRenderer>(true); if (Object.op_Implicit((Object)(object)componentInChildren)) { return ((Component)componentInChildren).transform; } return inst.transform; } private static Transform FindDeepChild_Internal(Transform root, string name, bool exact) { Transform[] componentsInChildren = ((Component)root).GetComponentsInChildren<Transform>(true); foreach (Transform val in componentsInChildren) { if (exact) { if (string.Equals(((Object)val).name, name, StringComparison.OrdinalIgnoreCase)) { return val; } } else if (((Object)val).name.IndexOf(name, StringComparison.OrdinalIgnoreCase) >= 0) { return val; } } return null; } } [BepInPlugin("com.havocmods.realisticspears", "Realistic Spears", "0.1.0")] public class Plugin : BaseUnityPlugin { internal static Harmony HarmonyInstance; private void Awake() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Expected O, but got Unknown HarmonyInstance = new Harmony("com.havocmods.realisticspears"); HarmonyInstance.PatchAll(); AnimationSpeedManager.Add(delegate(Character character, double speed) { Player val = (Player)(object)((character is Player) ? character : null); if ((Object)(object)val == (Object)null || !((Character)val).InAttack()) { return speed; } object? value = AccessTools.Field(typeof(Humanoid), "m_currentAttack").GetValue(val); Attack val2 = (Attack)((value is Attack) ? value : null); SharedData val3 = ((Humanoid)val).GetCurrentWeapon()?.m_shared; if (val2 == null || val3 == null) { return speed; } return (SpearUtils.IsSpearWithSwordAttack_Shared(val3) && string.Equals(val2.m_attackAnimation, "sword_secondary", StringComparison.OrdinalIgnoreCase)) ? (speed * 2.200000047683716) : speed; }); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[RealisticSpears] Loaded."); } private void OnDestroy() { Harmony harmonyInstance = HarmonyInstance; if (harmonyInstance != null) { harmonyInstance.UnpatchSelf(); } } } internal sealed class SpearRotatedMarker : MonoBehaviour { public Vector3 origLocalPos; public Quaternion origLocalRot; public bool rotationApplied; public bool initialized; public bool throwFlipped; } internal static class SpearPositioner { internal static void FixSpearRotationAndPosition(GameObject go, bool isRevert, bool isFangSpear) { if (Object.op_Implicit((Object)(object)go)) { if (!isRevert) { FixSpearRotation(go); FixSpearPositionOffset(go, isRevert, isFangSpear); } else { FixSpearPositionOffset(go, isRevert, isFangSpear); FixSpearRotation(go); } } } internal static void FixSpearRotation(GameObject go) { go.transform.Rotate(180f, 25f, 0f, (Space)1); } internal static void FixSpearPositionOffset(GameObject go, bool isRevert, bool isFangSpear) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000f: 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_0028: Unknown result type (might be due to invalid IL or missing references) Vector3 val = (isRevert ? Vector3.back : Vector3.forward); float num = (isFangSpear ? (-0.72f) : (-0.5f)); go.transform.Translate(val * num, (Space)1); } internal static void ApplyState(GameObject go, SpearRotatedMarker marker, bool applyRotation, bool isFangSpear, bool extraFlip = false) { //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_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: 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_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_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0078: 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_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0091: 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_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)go == (Object)null) && !((Object)(object)marker == (Object)null) && marker.initialized) { float num = (isFangSpear ? (-0.72f) : (-0.5f)); Quaternion val = ((!applyRotation) ? marker.origLocalRot : (marker.origLocalRot * Quaternion.Euler(180f, 25f, 0f))); Quaternion val2 = (extraFlip ? (val * Quaternion.Euler(180f, 0f, 0f)) : val); go.transform.localRotation = val2; go.transform.localPosition = marker.origLocalPos + val2 * Vector3.forward * num; marker.rotationApplied = applyRotation; marker.throwFlipped = extraFlip; } } } internal static class SpearUtils { internal static bool IsSpearWithPokeAttack_Shared(SharedData shared) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 if (shared != null && (int)shared.m_skillType == 5 && shared.m_attack != null) { return shared.m_attack.m_attackAnimation == "spear_poke"; } return false; } internal static bool IsSpearWithSwordAttack_Shared(SharedData shared) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 if (shared != null && (int)shared.m_skillType == 5 && shared.m_attack != null) { return shared.m_attack.m_attackAnimation == "sword_secondary"; } return false; } internal static bool IsFangSpear_Shared(SharedData shared) { if (shared != null && !string.IsNullOrEmpty(shared.m_name)) { return shared.m_name == "$item_spear_wolffang"; } return false; } } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.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; } } } internal static class AnimationSpeedManager { public delegate double Handler(Character character, double speed); private static readonly Harmony harmony = new Harmony("AnimationSpeedManager"); private static bool hasMarkerPatch = false; private static readonly MethodInfo method = AccessTools.DeclaredMethod(typeof(CharacterAnimEvent), "CustomFixedUpdate", (Type[])null, (Type[])null); private static int index = 0; private static bool changed = false; private static Handler[][] handlers = Array.Empty<Handler[]>(); private static readonly Dictionary<int, List<Handler>> handlersPriorities = new Dictionary<int, List<Handler>>(); [PublicAPI] public static void Add(Handler handler, int priority = 400) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected O, but got Unknown //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Expected O, but got Unknown if (!hasMarkerPatch) { harmony.Patch((MethodBase)method, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(AnimationSpeedManager), "markerPatch", (Type[])null, (Type[])null)), (HarmonyMethod)null); hasMarkerPatch = true; } if (!handlersPriorities.TryGetValue(priority, out List<Handler> value)) { handlersPriorities.Add(priority, value = new List<Handler>()); harmony.Patch((MethodBase)method, (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(AnimationSpeedManager), "wrapper", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } value.Add(handler); handlers = (from kv in handlersPriorities orderby kv.Key select kv.Value.ToArray()).ToArray(); } private static void wrapper(Character ___m_character, Animator ___m_animator) { Character ___m_character2 = ___m_character; double num = (double)___m_animator.speed * 10000000.0 % 100.0; if ((!(num > 10.0) || !(num < 30.0)) && !(___m_animator.speed <= 0.001f)) { double num2 = ___m_animator.speed; double num3 = handlers[index++].Aggregate(num2, (double current, Handler handler) => handler(___m_character2, current)); if (num3 != num2) { ___m_animator.speed = (float)(num3 - num3 % 1E-05); changed = true; } } } private static void markerPatch(Animator ___m_animator) { if (changed) { double num = (double)___m_animator.speed * 10000000.0 % 100.0; if ((num < 10.0 || num > 30.0) ? true : false) { ___m_animator.speed += 1.9E-06f; } changed = false; } index = 0; } }