Decompiled source of CommandoFMJ v1.1.1

CommandoFMJ.dll

Decompiled 7 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using EntityStates;
using Microsoft.CodeAnalysis;
using On.RoR2;
using RoR2;
using RoR2.ContentManagement;
using RoR2.Skills;
using UnityEngine;
using UnityEngine.AddressableAssets;

[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("CommandoFMJ")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("CommandoFMJ")]
[assembly: AssemblyTitle("CommandoFMJ")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: UnverifiableCode]
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 CommandoFMJ
{
	[BepInPlugin("pseudopulse.CommandoFMJ", "CommandoFMJ", "1.0.0")]
	public class CommandoFMJ : BaseUnityPlugin
	{
		public const string PluginGUID = "pseudopulse.CommandoFMJ";

		public const string PluginAuthor = "pseudopulse";

		public const string PluginName = "CommandoFMJ";

		public const string PluginVersion = "1.0.0";

		public static ManualLogSource ModLogger;

		public static float DAMAGE_COEFFICIENT;

		public static float COOLDOWN;

		public static float DURATION;

		public static float KNOCKBACK;

		public static GameObject Tracer;

		public static GameObject HitImpact;

		private static GameObject TracerHolder;

		public static GameObject MuzzleFlash;

		private static string FMJNAME;

		private static string FMJDESC;

		private static FMJContentPack pack;

		public void Awake()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_00db: 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_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: 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)
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_0242: Expected O, but got Unknown
			ModLogger = ((BaseUnityPlugin)this).Logger;
			TracerHolder = new GameObject("FMJ Tracer Holder");
			TracerHolder.SetActive(false);
			Object.DontDestroyOnLoad((Object)(object)TracerHolder);
			DAMAGE_COEFFICIENT = ((BaseUnityPlugin)this).Config.Bind<float>("FMJ :: Stats", "Damage Coefficient", 7f, "The base damage dealt by this skill.").Value;
			COOLDOWN = ((BaseUnityPlugin)this).Config.Bind<float>("FMJ :: Stats", "Cooldown", 4f, "The base cooldown (in seconds) of this skill.").Value;
			DURATION = ((BaseUnityPlugin)this).Config.Bind<float>("FMJ :: Stats", "Duration", 0.2f, "The base duration of the FMJ state.").Value;
			KNOCKBACK = ((BaseUnityPlugin)this).Config.Bind<float>("FMJ :: Stats", "Knockback Force", 4200f, "The base knockback dealt by this skill.").Value;
			GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Railgunner/TracerRailgunLight.prefab").WaitForCompletion();
			Tracer = Object.Instantiate<GameObject>(val, TracerHolder.transform);
			((Object)Tracer).name = "CommandoFMJTracer";
			Transform transform = Tracer.transform;
			transform.localScale *= 2f;
			Tracer.GetComponent<EffectComponent>().applyScale = false;
			HitImpact = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Junk/Commando/FMJImpact.prefab").WaitForCompletion();
			MuzzleFlash = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Commando/MuzzleflashFMJ.prefab").WaitForCompletion();
			Material material = Addressables.LoadAssetAsync<Material>((object)"RoR2/Base/Commando/matCommandoFMJBullet.mat").WaitForCompletion();
			ParticleSystemRenderer[] components = Tracer.GetComponents<ParticleSystemRenderer>();
			foreach (ParticleSystemRenderer val2 in components)
			{
				((Renderer)val2).material = material;
			}
			FMJContentPack fMJContentPack = new FMJContentPack("FMJCONTENTPACK");
			fMJContentPack.RegisterEntityState<FMJState>();
			fMJContentPack.RegisterGameObject(Tracer);
			SkillDef val3 = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Commando/CommandoBodyFireFMJ.asset").WaitForCompletion();
			val3.activationState = new SerializableEntityStateType(typeof(FMJState));
			val3.baseRechargeInterval = COOLDOWN;
			FMJNAME = "COMMANDOSKILLFMJ_NAME";
			FMJDESC = "COMMANDOSKILLFMJ_DESC";
			val3.skillNameToken = FMJNAME;
			val3.skillDescriptionToken = FMJDESC;
			Language.LoadStrings += new hook_LoadStrings(AddNewText);
		}

		public float d(float f)
		{
			return f * 100f;
		}

		public void AddNewText(orig_LoadStrings orig, Language self)
		{
			orig.Invoke(self);
			if (!self.TokenIsRegistered(FMJNAME))
			{
				self.stringsByToken.Add(FMJNAME, "Full Metal Jacket");
			}
			if (!self.TokenIsRegistered(FMJDESC))
			{
				self.stringsByToken.Add(FMJDESC, $"Fire a <style=cIsUtility>piercing round</style> for <style=cIsDamage>{d(DAMAGE_COEFFICIENT)}% damage</style>, knocking targets back.");
			}
		}
	}
	public class FMJState : BaseSkillState
	{
		public float duration;

		public override void OnEnter()
		{
			((BaseState)this).OnEnter();
			duration = CommandoFMJ.DURATION / ((BaseState)this).attackSpeedStat;
			FireRound();
		}

		public void FireRound()
		{
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Expected O, but got Unknown
			//IL_0097: 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_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: 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_010b: 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_011c: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).PlayAnimation("Gesture, Additive", "FireFMJ", "FireFMJ.playbackRate", duration * 2f);
			((EntityState)this).PlayAnimation("Gesture, Override", "FireFMJ", "FireFMJ.playbackRate", duration * 2f);
			AkSoundEngine.PostEvent(1069717260u, ((EntityState)this).gameObject);
			EffectManager.SimpleMuzzleFlash(CommandoFMJ.MuzzleFlash, ((EntityState)this).gameObject, "MuzzleLeft", false);
			BulletAttack val = new BulletAttack();
			val.damage = ((BaseState)this).damageStat * CommandoFMJ.DAMAGE_COEFFICIENT;
			val.force = CommandoFMJ.KNOCKBACK;
			Ray aimRay = ((EntityState)this).inputBank.GetAimRay();
			val.aimVector = ((Ray)(ref aimRay)).direction;
			val.muzzleName = "MuzzleLeft";
			val.falloffModel = (FalloffModel)0;
			val.tracerEffectPrefab = CommandoFMJ.Tracer;
			val.hitEffectPrefab = CommandoFMJ.HitImpact;
			val.isCrit = ((BaseState)this).RollCrit();
			val.owner = ((EntityState)this).gameObject;
			val.procCoefficient = 1f;
			val.radius = 0.4f;
			val.stopperMask = ((LayerIndex)(ref LayerIndex.world)).mask;
			val.origin = ((EntityState)this).inputBank.aimOrigin;
			val.smartCollision = false;
			val.maxSpread = 0f;
			val.minSpread = 0f;
			val.weapon = ((EntityState)this).gameObject;
			if (((EntityState)this).isAuthority)
			{
				val.Fire();
			}
		}

		public override void FixedUpdate()
		{
			((EntityState)this).FixedUpdate();
			if (((EntityState)this).fixedAge >= duration)
			{
				((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)2;
		}
	}
	public class FMJContentPack : IContentPackProvider
	{
		private string _identifier;

		private ContentPack pack = new ContentPack();

		private Assembly assembly;

		public List<Type> entityStates = new List<Type>();

		public List<EffectDef> effectDefs = new List<EffectDef>();

		public string identifier
		{
			get
			{
				return _identifier;
			}
			set
			{
				_identifier = value;
			}
		}

		public FMJContentPack(string identifier)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Expected O, but got Unknown
			this.identifier = identifier;
			ContentManager.collectContentPackProviders += (CollectContentPackProvidersDelegate)delegate(AddContentPackProviderDelegate addContentPackProvider)
			{
				addContentPackProvider.Invoke((IContentPackProvider)(object)this);
			};
		}

		public void RegisterGameObject(GameObject asset)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			if (Object.op_Implicit((Object)(object)asset.GetComponent<EffectComponent>()))
			{
				EffectDef val = new EffectDef();
				val._prefab = asset;
				val.prefabName = ((Object)asset).name;
				val.prefabEffectComponent = asset.GetComponent<EffectComponent>();
				effectDefs.Add(val);
			}
		}

		public void RegisterEntityState<T>() where T : EntityState
		{
			entityStates.Add(typeof(T));
		}

		public void RegisterEntityState(Type stateType)
		{
			if (!stateType.IsAssignableFrom(typeof(EntityState)))
			{
				throw new Exception("Attempted to register state that wasn't assignable from type EntityState. This isn't allowed");
			}
			entityStates.Add(stateType);
		}

		public IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args)
		{
			pack.entityStateTypes.Add(entityStates.ToArray());
			pack.effectDefs.Add(effectDefs.ToArray());
			args.ReportProgress(1f);
			yield break;
		}

		public IEnumerator GenerateContentPackAsync(GetContentPackAsyncArgs args)
		{
			pack.identifier = identifier;
			ContentPack.Copy(pack, args.output);
			args.ReportProgress(1f);
			yield break;
		}

		public IEnumerator FinalizeAsync(FinalizeAsyncArgs args)
		{
			args.ReportProgress(1f);
			yield break;
		}
	}
}