Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of TwelveShooter v1.0.3
plugins/TwelveShooter/TwelveShooter.dll
Decompiled 2 years agousing System; using System.Collections; 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 System.Security; using System.Security.Permissions; using BepInEx; using EntityStates; using On.RoR2; using R2API; using R2API.Utils; using RoR2; using RoR2.Skills; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("TwelveShooter")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("TwelveShooter")] [assembly: AssemblyTitle("TwelveShooter")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace TwelveShooter; public static class Assets { public static AssetBundle mainBundle; public const string bundleName = "twelveshooter"; public static string AssetBundlePath => Path.Combine(Path.GetDirectoryName(Main.PInfo.Location), "twelveshooter"); public static void Init() { mainBundle = AssetBundle.LoadFromFile(AssetBundlePath); } } public class mandrEnterReload : BaseState { public static string enterSoundString = "Play_bandit2_R_load"; public static float baseDuration = 0f; private float duration => baseDuration / base.attackSpeedStat; public override void OnEnter() { ((BaseState)this).OnEnter(); } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); if (((EntityState)this).isAuthority && ((EntityState)this).fixedAge > duration) { ((Component)((Component)((EntityState)this).modelLocator.modelTransform.GetChild(0).GetChild(0).GetChild(0) .GetChild(3) .GetChild(0) .GetChild(1) .GetChild(0) .GetChild(0) .GetChild(8) .GetChild(3)).transform).gameObject.SetActive(true); ((Component)((Component)((EntityState)this).modelLocator.modelTransform.GetChild(0).GetChild(0).GetChild(0) .GetChild(3) .GetChild(0) .GetChild(2) .GetChild(0) .GetChild(0) .GetChild(8) .GetChild(3)).transform).gameObject.SetActive(true); ((Component)((Component)((EntityState)this).modelLocator.modelTransform.GetChild(0).GetChild(0).GetChild(0) .GetChild(3) .GetChild(0) .GetChild(1) .GetChild(0) .GetChild(0) .GetChild(8) .GetChild(4)).transform).gameObject.SetActive(false); ((Component)((Component)((EntityState)this).modelLocator.modelTransform.GetChild(0).GetChild(0).GetChild(0) .GetChild(3) .GetChild(0) .GetChild(2) .GetChild(0) .GetChild(0) .GetChild(8) .GetChild(4)).transform).gameObject.SetActive(false); int num = (int)Util.PlaySound(enterSoundString, ((EntityState)this).gameObject); if (((EntityState)this).skillLocator.primary.stock < 12) { mandrReload.realDuration = mandrReload.totalDuration / base.attackSpeedStat / (float)(12 - ((EntityState)this).skillLocator.primary.stock); } else { mandrReload.realDuration = 0.01f; } ((EntityState)this).outer.SetNextState((EntityState)(object)new mandrReload()); } } public override InterruptPriority GetMinimumInterruptPriority() { return (InterruptPriority)1; } } [BepInDependency("com.bepis.r2api", "5.0.8")] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] [BepInPlugin("TeamCreature.TwelveShooter", "TwelveShooter", "1.0.3")] [R2APISubmoduleDependency(new string[] { "PrefabAPI" })] public class Main : BaseUnityPlugin { private Sprite twelveShooterIcon; private GameObject mandr = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Commando/CommandoBody.prefab").WaitForCompletion(); public static ReloadSkillDef twelveShooterSkillDef = ScriptableObject.CreateInstance<ReloadSkillDef>(); private static BodyIndex mandrBodyIndex; public static PluginInfo PInfo { get; private set; } public void Awake() { //IL_0051: 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_0061: 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_0078: Expected O, but got Unknown PInfo = ((BaseUnityPlugin)this).Info; Assets.Init(); twelveShooterIcon = Assets.mainBundle.LoadAsset<Sprite>("Assets/Textures/Icons/Skills/TwelveShooter.png"); initializeSkill(); RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(OnLoad)); bool flag = default(bool); ContentAddition.AddEntityState<TwelveShooter>(ref flag); ContentAddition.AddEntityState<mandrReload>(ref flag); ContentAddition.AddEntityState<mandrEnterReload>(ref flag); CharacterModel.Start += new hook_Start(Revolvers.CharacterModel_Start); } private void OnLoad() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) mandrBodyIndex = BodyCatalog.FindBodyIndex("CommandoBody"); } public void initializeSkill() { //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0143: 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_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Expected O, but got Unknown //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Unknown result type (might be due to invalid IL or missing references) ((SkillDef)twelveShooterSkillDef).skillName = "TwelveShooter"; ((Object)twelveShooterSkillDef).name = "TwelveShooter"; ((SkillDef)twelveShooterSkillDef).skillNameToken = "Twelve Shooter"; ((SkillDef)twelveShooterSkillDef).skillDescriptionToken = "Repeatedly shoot an enemy for <style=cIsDamage>200% damage</style>. Has a ammo maximum of <style=cIsDamage>12 bullets</style>"; ((SkillDef)twelveShooterSkillDef).icon = twelveShooterIcon; ((SkillDef)twelveShooterSkillDef).activationState = new SerializableEntityStateType(typeof(TwelveShooter)); ((SkillDef)twelveShooterSkillDef).activationStateMachineName = "Weapon"; ((SkillDef)twelveShooterSkillDef).interruptPriority = (InterruptPriority)0; ((SkillDef)twelveShooterSkillDef).baseMaxStock = 12; ((SkillDef)twelveShooterSkillDef).baseRechargeInterval = 0f; ((SkillDef)twelveShooterSkillDef).rechargeStock = 0; ((SkillDef)twelveShooterSkillDef).requiredStock = 1; ((SkillDef)twelveShooterSkillDef).stockToConsume = 1; ((SkillDef)twelveShooterSkillDef).dontAllowPastMaxStocks = true; ((SkillDef)twelveShooterSkillDef).beginSkillCooldownOnSkillEnd = false; ((SkillDef)twelveShooterSkillDef).canceledFromSprinting = false; ((SkillDef)twelveShooterSkillDef).forceSprintDuringState = false; ((SkillDef)twelveShooterSkillDef).fullRestockOnAssign = true; ((SkillDef)twelveShooterSkillDef).resetCooldownTimerOnUse = false; ((SkillDef)twelveShooterSkillDef).isCombatSkill = true; ((SkillDef)twelveShooterSkillDef).mustKeyPress = false; ((SkillDef)twelveShooterSkillDef).cancelSprintingOnActivation = true; twelveShooterSkillDef.graceDuration = 1f; twelveShooterSkillDef.reloadState = new SerializableEntityStateType(typeof(mandrEnterReload)); twelveShooterSkillDef.reloadInterruptPriority = (InterruptPriority)0; ContentAddition.AddSkillDef((SkillDef)(object)twelveShooterSkillDef); SkillFamily skillFamily = mandr.GetComponent<SkillLocator>().primary.skillFamily; Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1); Variant[] variants = skillFamily.variants; int num = skillFamily.variants.Length - 1; Variant val = new Variant { skillDef = (SkillDef)(object)twelveShooterSkillDef }; ((Variant)(ref val)).viewableNode = new Node(((SkillDef)twelveShooterSkillDef).skillNameToken, false, (Node)null); variants[num] = val; } } public class mandrReload : BaseState { public static float enterSoundPitch; public static float exitSoundPitch; public static string enterSoundString; public static string exitSoundString; public static GameObject mandrReloadEffectPrefab; public static string mandrReloadEffectMuzzleString; public static float realDuration; public static float totalDuration = 0.7f; private static EntityState reloadState; private bool hasGivenStock; public override void OnEnter() { ((BaseState)this).OnEnter(); ((Component)((Component)((EntityState)this).modelLocator.modelTransform.GetChild(0).GetChild(0).GetChild(0) .GetChild(3) .GetChild(0) .GetChild(1) .GetChild(0) .GetChild(0) .GetChild(8) .GetChild(3)).transform).gameObject.SetActive(true); ((Component)((Component)((EntityState)this).modelLocator.modelTransform.GetChild(0).GetChild(0).GetChild(0) .GetChild(3) .GetChild(0) .GetChild(2) .GetChild(0) .GetChild(0) .GetChild(8) .GetChild(3)).transform).gameObject.SetActive(true); ((Component)((Component)((EntityState)this).modelLocator.modelTransform.GetChild(0).GetChild(0).GetChild(0) .GetChild(3) .GetChild(0) .GetChild(1) .GetChild(0) .GetChild(0) .GetChild(8) .GetChild(4)).transform).gameObject.SetActive(false); ((Component)((Component)((EntityState)this).modelLocator.modelTransform.GetChild(0).GetChild(0).GetChild(0) .GetChild(3) .GetChild(0) .GetChild(2) .GetChild(0) .GetChild(0) .GetChild(8) .GetChild(4)).transform).gameObject.SetActive(false); } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); if ((double)((EntityState)this).fixedAge >= (double)realDuration / 2.0 && ((EntityState)this).skillLocator.primary.stock < ((EntityState)this).skillLocator.primary.maxStock) { GiveStock(); } if (((EntityState)this).isAuthority && !((double)((EntityState)this).fixedAge < (double)realDuration)) { if (((EntityState)this).skillLocator.primary.stock < ((EntityState)this).skillLocator.primary.maxStock) { reloadState = (EntityState)(object)new mandrReload(); ((EntityState)this).outer.SetNextState(reloadState); return; } ((Component)((Component)((EntityState)this).modelLocator.modelTransform.GetChild(0).GetChild(0).GetChild(0) .GetChild(3) .GetChild(0) .GetChild(1) .GetChild(0) .GetChild(0) .GetChild(8) .GetChild(3)).transform).gameObject.SetActive(false); ((Component)((Component)((EntityState)this).modelLocator.modelTransform.GetChild(0).GetChild(0).GetChild(0) .GetChild(3) .GetChild(0) .GetChild(2) .GetChild(0) .GetChild(0) .GetChild(8) .GetChild(3)).transform).gameObject.SetActive(false); ((Component)((Component)((EntityState)this).modelLocator.modelTransform.GetChild(0).GetChild(0).GetChild(0) .GetChild(3) .GetChild(0) .GetChild(1) .GetChild(0) .GetChild(0) .GetChild(8) .GetChild(4)).transform).gameObject.SetActive(true); ((Component)((Component)((EntityState)this).modelLocator.modelTransform.GetChild(0).GetChild(0).GetChild(0) .GetChild(3) .GetChild(0) .GetChild(2) .GetChild(0) .GetChild(0) .GetChild(8) .GetChild(4)).transform).gameObject.SetActive(true); ((EntityState)this).outer.SetNextStateToMain(); } } public override void OnExit() { ((EntityState)this).OnExit(); } private void GiveStock() { if (!hasGivenStock) { ((EntityState)this).skillLocator.primary.AddOneStock(); hasGivenStock = true; } } public override InterruptPriority GetMinimumInterruptPriority() { return (InterruptPriority)3; } } public class Revolvers { private static Material hatMat = Addressables.LoadAssetAsync<Material>((object)"RoR2/Base/Bandit2/matBandit2Revolver.mat").WaitForCompletion(); private static GameObject revolver = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Bandit2/mdlBanditRevolver.fbx").WaitForCompletion().gameObject; public GameObject gun1; public GameObject gun2; public static void CharacterModel_Start(orig_Start orig, CharacterModel self) { orig.Invoke(self); ((MonoBehaviour)self).StartCoroutine(Gun(self)); } private static IEnumerator Gun(CharacterModel model) { yield return (object)new WaitForFixedUpdate(); if (Object.op_Implicit((Object)(object)model.body) && ((Object)model.body).name == "CommandoBody(Clone)" && model.body.skillLocator.GetSkill((SkillSlot)0).skillNameToken == "Twelve Shooter") { ((Component)((Component)((Component)model).transform.GetChild(0).GetChild(0).GetChild(0) .GetChild(3) .GetChild(0) .GetChild(1) .GetChild(0) .GetChild(0) .GetChild(8) .GetChild(1)).transform).gameObject.SetActive(false); ((Component)((Component)((Component)model).transform.GetChild(0).GetChild(0).GetChild(0) .GetChild(3) .GetChild(0) .GetChild(2) .GetChild(0) .GetChild(0) .GetChild(8) .GetChild(1)).transform).gameObject.SetActive(false); GameObject gun1 = Object.Instantiate<GameObject>(revolver, ((Component)model).transform.GetChild(0).GetChild(0).GetChild(0) .GetChild(3) .GetChild(0) .GetChild(1) .GetChild(0) .GetChild(0) .GetChild(8)); gun1.AddComponent<NetworkIdentity>(); gun1.transform.localScale = new Vector3(1f, 1f, 1f); gun1.transform.localPosition = new Vector3(0.012f, 0.21f, 0f); gun1.transform.localEulerAngles = new Vector3(90f, 90f, 0f); ((Renderer)gun1.GetComponent<MeshRenderer>()).material = hatMat; List<RendererInfo> rendererInfos = model.baseRendererInfos.ToList(); Renderer[] componentsInChildren = gun1.GetComponentsInChildren<Renderer>(); foreach (Renderer renderer in componentsInChildren) { rendererInfos.Add(new RendererInfo { renderer = renderer, defaultMaterial = renderer.sharedMaterial, defaultShadowCastingMode = renderer.shadowCastingMode, hideOnDeath = false, ignoreOverlays = false }); } GameObject gun2 = Object.Instantiate<GameObject>(revolver, ((Component)model).transform.GetChild(0).GetChild(0).GetChild(0) .GetChild(3) .GetChild(0) .GetChild(2) .GetChild(0) .GetChild(0) .GetChild(8)); gun2.AddComponent<NetworkIdentity>(); gun2.transform.localScale = new Vector3(1f, 1f, 1f); gun2.transform.localPosition = new Vector3(-0.022f, 0.21f, 0f); gun2.transform.Rotate(new Vector3(180f, 0f, 90f)); ((Renderer)gun2.GetComponent<MeshRenderer>()).material = hatMat; Renderer[] componentsInChildren2 = gun2.GetComponentsInChildren<Renderer>(); foreach (Renderer renderer2 in componentsInChildren2) { rendererInfos.Add(new RendererInfo { renderer = renderer2, defaultMaterial = renderer2.sharedMaterial, defaultShadowCastingMode = renderer2.shadowCastingMode, hideOnDeath = false, ignoreOverlays = false }); } model.baseRendererInfos = rendererInfos.ToArray(); } } } internal class TwelveShooter : BaseSkillState { public static GameObject muzzleEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Bandit2/MuzzleflashBandit2.prefab").WaitForCompletion(); public static GameObject hitEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Commando/HitsparkCommando.prefab").WaitForCompletion(); public static GameObject tracerEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Commando/TracerCommandoDefault.prefab").WaitForCompletion(); public static float damageCoefficient = 2f; public static float force = 1f; public static float baseDuration = 0.25f; public static string firePistolSoundString = "Play_engi_R_turret_shot"; public static string fireLastShotsSoundString = "Play_bandit2_m1_shotgun"; public static float recoilAmplitude = 3f; public static float spreadBloomValue = 0.6f; private Ray aimRay; private float duration; public override void OnEnter() { //IL_001c: 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_0028: Unknown result type (might be due to invalid IL or missing references) ((BaseState)this).OnEnter(); duration = baseDuration / ((BaseState)this).attackSpeedStat; aimRay = ((BaseState)this).GetAimRay(); ((BaseState)this).StartAimMode(aimRay, duration + 2f, false); if (((BaseSkillState)this).activatorSkillSlot.stock % 2 == 0) { ((EntityState)this).PlayAnimation("Gesture Additive, Left", "FirePistol, Left"); FireBullet("MuzzleLeft"); } else { ((EntityState)this).PlayAnimation("Gesture Additive, Right", "FirePistol, Right"); FireBullet("MuzzleRight"); } } public override void OnExit() { ((EntityState)this).OnExit(); } private void FireBullet(string targetMuzzle) { //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_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: 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_0117: 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_0129: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_016d: 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_0174: Unknown result type (might be due to invalid IL or missing references) if (((BaseSkillState)this).activatorSkillSlot.stock > 1) { int num = (int)Util.PlaySound(firePistolSoundString, ((EntityState)this).gameObject); } else { int num2 = (int)Util.PlaySound(fireLastShotsSoundString, ((EntityState)this).gameObject); } if (Object.op_Implicit((Object)(object)muzzleEffectPrefab)) { EffectManager.SimpleMuzzleFlash(muzzleEffectPrefab, ((EntityState)this).gameObject, targetMuzzle, false); } ((BaseState)this).AddRecoil(-0.4f * recoilAmplitude, -0.8f * recoilAmplitude, -0.3f * recoilAmplitude, 0.3f * recoilAmplitude); if (((EntityState)this).isAuthority) { new BulletAttack { owner = ((EntityState)this).gameObject, weapon = ((EntityState)this).gameObject, origin = ((Ray)(ref aimRay)).origin, aimVector = ((Ray)(ref aimRay)).direction, minSpread = 0f, maxSpread = ((EntityState)this).characterBody.spreadBloomAngle, damage = damageCoefficient * ((BaseState)this).damageStat, force = force, tracerEffectPrefab = tracerEffectPrefab, muzzleName = targetMuzzle, hitEffectPrefab = hitEffectPrefab, isCrit = Util.CheckRoll(((BaseState)this).critStat, ((EntityState)this).characterBody.master), radius = 0.25f, smartCollision = true, procCoefficient = 1.1f, falloffModel = (FalloffModel)0, _maxDistance = 150f }.Fire(); } ((EntityState)this).characterBody.AddSpreadBloom(spreadBloomValue); } 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() { //IL_0002: 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) return (InterruptPriority)1; } }