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 ManualArrows v1.0.1
ManualArrows.dll
Decompiled 2 years agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using EntityStates; using EntityStates.Huntress.HuntressWeapon; using ManualArrows.EntityStates; using Microsoft.CodeAnalysis; using R2API; using RoR2; using RoR2.Projectile; using RoR2.Skills; using UnityEngine; using UnityEngine.AddressableAssets; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("ManualArrows")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("ManualArrows")] [assembly: AssemblyTitle("ManualArrows")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } 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; } } } namespace ManualArrows { [BepInPlugin("com.Nuxlar.ManualArrows", "ManualArrows", "1.0.1")] public class ManualArrows : BaseUnityPlugin { private GameObject huntress = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Huntress/HuntressBody.prefab").WaitForCompletion(); private HuntressTrackingSkillDef strafe = Addressables.LoadAssetAsync<HuntressTrackingSkillDef>((object)"RoR2/Base/Huntress/HuntressBodyFireSeekingArrow.asset").WaitForCompletion(); private HuntressTrackingSkillDef flurry = Addressables.LoadAssetAsync<HuntressTrackingSkillDef>((object)"RoR2/Base/Huntress/FireFlurrySeekingArrow.asset").WaitForCompletion(); public void Awake() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000a: 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_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected O, but got Unknown //IL_007d: 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_0096: 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) //IL_00b8: Expected O, but got Unknown //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) bool flag = default(bool); ContentAddition.AddEntityState<FireStrafe>(ref flag); ContentAddition.AddEntityState<FireFlurry>(ref flag); SkillDef val = CreateStrafeDef(); SkillDef val2 = CreateFlurryDef(); SkillFamily skillFamily = huntress.GetComponent<SkillLocator>().primary.skillFamily; Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 2); Variant[] variants = skillFamily.variants; int num = skillFamily.variants.Length - 2; Variant val3 = new Variant { skillDef = val }; ((Variant)(ref val3)).viewableNode = new Node(val.skillNameToken, false, (Node)null); variants[num] = val3; Variant[] variants2 = skillFamily.variants; int num2 = skillFamily.variants.Length - 1; val3 = new Variant { skillDef = val2 }; ((Variant)(ref val3)).viewableNode = new Node(val2.skillNameToken, false, (Node)null); variants2[num2] = val3; } public SkillDef CreateStrafeDef() { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: 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_0074: Unknown result type (might be due to invalid IL or missing references) SkillDef obj = ScriptableObject.CreateInstance<SkillDef>(); obj.skillName = "Manual Strafe"; ((Object)obj).name = "Manual Strafe"; obj.skillNameToken = "Manual Strafe"; obj.skillDescriptionToken = "<style=cIsUtility>Agile</style>. Quickly fire an arrow for <style=cIsDamage>150% damage</style>."; obj.icon = ((SkillDef)strafe).icon; obj.activationState = new SerializableEntityStateType(typeof(FireStrafe)); obj.activationStateMachineName = ((SkillDef)strafe).activationStateMachineName; obj.interruptPriority = ((SkillDef)strafe).interruptPriority; obj.baseMaxStock = ((SkillDef)strafe).baseMaxStock; obj.baseRechargeInterval = ((SkillDef)strafe).baseRechargeInterval; obj.rechargeStock = ((SkillDef)strafe).rechargeStock; obj.requiredStock = ((SkillDef)strafe).requiredStock; obj.stockToConsume = ((SkillDef)strafe).stockToConsume; obj.dontAllowPastMaxStocks = ((SkillDef)strafe).dontAllowPastMaxStocks; obj.beginSkillCooldownOnSkillEnd = ((SkillDef)strafe).beginSkillCooldownOnSkillEnd; obj.canceledFromSprinting = ((SkillDef)strafe).canceledFromSprinting; obj.forceSprintDuringState = ((SkillDef)strafe).forceSprintDuringState; obj.fullRestockOnAssign = ((SkillDef)strafe).fullRestockOnAssign; obj.resetCooldownTimerOnUse = ((SkillDef)strafe).resetCooldownTimerOnUse; obj.isCombatSkill = ((SkillDef)strafe).isCombatSkill; obj.mustKeyPress = ((SkillDef)strafe).mustKeyPress; obj.cancelSprintingOnActivation = ((SkillDef)strafe).cancelSprintingOnActivation; obj.keywordTokens = ((SkillDef)strafe).keywordTokens; ContentAddition.AddSkillDef(obj); return obj; } public SkillDef CreateFlurryDef() { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: 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_0074: Unknown result type (might be due to invalid IL or missing references) SkillDef obj = ScriptableObject.CreateInstance<SkillDef>(); obj.skillName = "Manual Flurry"; ((Object)obj).name = "Manual Flurry"; obj.skillNameToken = "Manual Flurry"; obj.skillDescriptionToken = "<style=cIsUtility>Agile</style>. Draw back a volley of <style=cIsDamage>3</style> arrows that deal <style=cIsDamage>3x100%</style> damage each. Critical Strikes fire <style=cIsDamage>6</style> arrows."; obj.icon = ((SkillDef)flurry).icon; obj.activationState = new SerializableEntityStateType(typeof(FireFlurry)); obj.activationStateMachineName = ((SkillDef)flurry).activationStateMachineName; obj.interruptPriority = ((SkillDef)flurry).interruptPriority; obj.baseMaxStock = ((SkillDef)flurry).baseMaxStock; obj.baseRechargeInterval = ((SkillDef)flurry).baseRechargeInterval; obj.rechargeStock = ((SkillDef)flurry).rechargeStock; obj.requiredStock = ((SkillDef)flurry).requiredStock; obj.stockToConsume = ((SkillDef)flurry).stockToConsume; obj.dontAllowPastMaxStocks = ((SkillDef)flurry).dontAllowPastMaxStocks; obj.beginSkillCooldownOnSkillEnd = ((SkillDef)flurry).beginSkillCooldownOnSkillEnd; obj.canceledFromSprinting = ((SkillDef)flurry).canceledFromSprinting; obj.forceSprintDuringState = ((SkillDef)flurry).forceSprintDuringState; obj.fullRestockOnAssign = ((SkillDef)flurry).fullRestockOnAssign; obj.resetCooldownTimerOnUse = ((SkillDef)flurry).resetCooldownTimerOnUse; obj.isCombatSkill = ((SkillDef)flurry).isCombatSkill; obj.mustKeyPress = ((SkillDef)flurry).mustKeyPress; obj.cancelSprintingOnActivation = ((SkillDef)flurry).cancelSprintingOnActivation; obj.keywordTokens = ((SkillDef)flurry).keywordTokens; ContentAddition.AddSkillDef(obj); return obj; } } } namespace ManualArrows.EntityStates { public class FireFlurry : BaseState { public static GameObject effectPrefab = FireArrow.effectPrefab; public static GameObject hitEffectPrefab = FireArrow.hitEffectPrefab; public static GameObject projectilePrefab = FireArrow.projectilePrefab; public int arrowCountMax = 3; public float damageCoefficient = 1f; public static float fireDuration = 0.5f; public static float baseDuration = 1.5f; public static float arcAngle = 0f; public static float recoilAmplitude = 0.1f; public static string attackSoundString; public static float spreadBloomValue = 0.3f; public static float smallHopStrength = FireArrow.smallHopStrength; private Ray aimRay; private Transform modelTransform; private float duration; private float fireTimer; private int grenadeCount; private bool isCrit; private void FireGrenade(string targetMuzzle) { //IL_0019: 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_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0128: 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_013d: 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) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01a9: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01b7: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_01ea: 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) Util.PlayAttackSpeedSound("Play_huntress_m1_shoot", ((EntityState)this).gameObject, base.attackSpeedStat); aimRay = ((BaseState)this).GetAimRay(); if (Object.op_Implicit((Object)(object)modelTransform)) { ChildLocator component = ((Component)modelTransform).GetComponent<ChildLocator>(); if (Object.op_Implicit((Object)(object)component)) { Transform val = component.FindChild(targetMuzzle); if (Object.op_Implicit((Object)(object)val)) { ((Ray)(ref aimRay)).origin = val.position; } } } ((BaseState)this).AddRecoil(-1f * recoilAmplitude, -2f * recoilAmplitude, -1f * recoilAmplitude, 1f * recoilAmplitude); if (Object.op_Implicit((Object)(object)effectPrefab)) { if (isCrit) { EffectManager.SimpleMuzzleFlash(FireFlurrySeekingArrow.critMuzzleflashEffectPrefab, ((EntityState)this).gameObject, targetMuzzle, false); } else { EffectManager.SimpleMuzzleFlash(effectPrefab, ((EntityState)this).gameObject, targetMuzzle, false); } } if (((EntityState)this).isAuthority) { float num = Random.Range(0f, ((EntityState)this).characterBody.spreadBloomAngle); float num2 = Random.Range(0f, 360f); Vector3 up = Vector3.up; Vector3 val2 = Vector3.Cross(up, ((Ray)(ref aimRay)).direction); Vector3 val3 = Quaternion.Euler(0f, 0f, num2) * (Quaternion.Euler(num, 0f, 0f) * Vector3.forward); float y = val3.y; val3.y = 0f; double num3 = (double)Mathf.Atan2(val3.z, val3.x) * 57.295780181884766 - 90.0; float num4 = Mathf.Atan2(y, ((Vector3)(ref val3)).magnitude) * 57.29578f + arcAngle; Vector3 val4 = up; Vector3 val5 = Quaternion.AngleAxis((float)num3, val4) * (Quaternion.AngleAxis(num4, val2) * ((Ray)(ref aimRay)).direction); ProjectileManager.instance.FireProjectile(projectilePrefab, ((Ray)(ref aimRay)).origin, Util.QuaternionSafeLookRotation(val5), ((EntityState)this).gameObject, base.damageStat * damageCoefficient, 0f, Util.CheckRoll(base.critStat, ((EntityState)this).characterBody.master), (DamageColorIndex)0, (GameObject)null, -1f); } ((EntityState)this).characterBody.AddSpreadBloom(spreadBloomValue); } public override void OnEnter() { ((BaseState)this).OnEnter(); duration = baseDuration / base.attackSpeedStat; modelTransform = ((EntityState)this).GetModelTransform(); if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && (double)smallHopStrength != 0.0) { ((EntityState)this).characterMotor.velocity.y = smallHopStrength; } if (Object.op_Implicit((Object)(object)((EntityState)this).characterBody)) { ((EntityState)this).characterBody.SetAimTimer(1.5f); isCrit = Util.CheckRoll(((EntityState)this).characterBody.crit, ((EntityState)this).characterBody.master); if (isCrit) { arrowCountMax = 6; } } } public override void OnExit() { ((EntityState)this).OnExit(); } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); if (((EntityState)this).isAuthority) { fireTimer -= Time.fixedDeltaTime; float num = fireDuration / base.attackSpeedStat / (float)arrowCountMax; if ((double)fireTimer <= 0.0 && grenadeCount < arrowCountMax) { ((EntityState)this).PlayCrossfade("Gesture, Override", "FireSeekingShot", "FireSeekingShot.playbackRate", 0.1f, 0.1f / base.attackSpeedStat); ((EntityState)this).PlayCrossfade("Gesture, Additive", "FireSeekingShot", "FireSeekingShot.playbackRate", 0.1f, 0.1f / base.attackSpeedStat); FireGrenade("Muzzle"); fireTimer += num; grenadeCount++; } if (!((double)((EntityState)this).fixedAge < (double)duration)) { ((EntityState)this).outer.SetNextStateToMain(); } } } public override InterruptPriority GetMinimumInterruptPriority() { return (InterruptPriority)1; } } public class FireStrafe : BaseState { public static GameObject projectilePrefab = FireArrow.projectilePrefab; public static GameObject effectPrefab = FireArrow.effectPrefab; public static float baseDuration = 0.5f; public static float damageCoefficient = 1.5f; public static float force = 20f; private float duration; public override void OnEnter() { //IL_0019: 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_0020: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: 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) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) ((BaseState)this).OnEnter(); duration = baseDuration / base.attackSpeedStat; Ray aimRay = ((BaseState)this).GetAimRay(); ((BaseState)this).StartAimMode(aimRay, 2f, false); string text = "Muzzle"; if (Object.op_Implicit((Object)(object)effectPrefab)) { EffectManager.SimpleMuzzleFlash(effectPrefab, ((EntityState)this).gameObject, text, false); } ((EntityState)this).PlayCrossfade("Gesture, Override", "FireSeekingShot", "FireSeekingShot.playbackRate", duration, duration * 0.2f / base.attackSpeedStat); ((EntityState)this).PlayCrossfade("Gesture, Additive", "FireSeekingShot", "FireSeekingShot.playbackRate", duration, duration * 0.2f / base.attackSpeedStat); if (((EntityState)this).isAuthority) { Util.PlayAttackSpeedSound("Play_huntress_m1_shoot", ((EntityState)this).gameObject, base.attackSpeedStat); ProjectileManager.instance.FireProjectile(projectilePrefab, ((Ray)(ref aimRay)).origin, Util.QuaternionSafeLookRotation(((Ray)(ref aimRay)).direction), ((EntityState)this).gameObject, base.damageStat * damageCoefficient, force, Util.CheckRoll(base.critStat, ((EntityState)this).characterBody.master), (DamageColorIndex)0, (GameObject)null, -1f); } } public override void OnExit() { ((EntityState)this).OnExit(); } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); if (!((double)((EntityState)this).fixedAge < (double)duration) && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } public override InterruptPriority GetMinimumInterruptPriority() { return (InterruptPriority)1; } } }