using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using EntityStates;
using EntityStates.FORCED_REASSEMBLY.Commando;
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: AssemblyTitle("SweepingBarrage")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SweepingBarrage")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("e5a8b1e1-b02a-432c-b8a9-670c39c45614")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace SweepBarrage
{
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.Forced_Reassembly.SweepingBarrage", "Sweeping Barrage", "1.0.0")]
public class SweepBarragePlugin : BaseUnityPlugin
{
public static SkillDef SweepBarrageSkill;
public static AssetBundle mainAssetBundle;
[Obsolete]
private void Awake()
{
//IL_0040: 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_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: 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_015c: Unknown result type (might be due to invalid IL or missing references)
//IL_0180: Unknown result type (might be due to invalid IL or missing references)
//IL_018a: Expected O, but got Unknown
//IL_018b: Unknown result type (might be due to invalid IL or missing references)
//IL_018d: Unknown result type (might be due to invalid IL or missing references)
//IL_0194: Unknown result type (might be due to invalid IL or missing references)
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("SweepingBarrage.sweepingbarragebundle"))
{
mainAssetBundle = AssetBundle.LoadFromStream(stream);
}
SkillDef val = ScriptableObject.CreateInstance<SkillDef>();
val.activationState = new SerializableEntityStateType(typeof(FireSweepBarrage));
val.activationStateMachineName = "Weapon";
val.baseMaxStock = 1;
val.baseRechargeInterval = 7f;
val.beginSkillCooldownOnSkillEnd = true;
val.canceledFromSprinting = false;
val.cancelSprintingOnActivation = true;
val.fullRestockOnAssign = true;
val.interruptPriority = (InterruptPriority)1;
val.isCombatSkill = true;
val.mustKeyPress = false;
val.rechargeStock = 1;
val.requiredStock = 1;
val.stockToConsume = 1;
val.icon = mainAssetBundle.LoadAsset<Sprite>("SweepBarrageIconGoodVersion");
val.skillDescriptionToken = "Automatically fire at all enemies in front of you for <style=cIsDamage>380% damage</style> damage per shot.";
val.skillName = "COMMANDO_SPECIAL_SWEEPBARRAGE_NAME";
val.skillNameToken = "Sweeping Barrage";
((Object)val).name = val.skillName;
SweepBarrageSkill = val;
LanguageAPI.Add("COMMANDO_SPECIAL_SWEEPBARRAGE_NAME", "Sweep Barrage");
ContentAddition.AddSkillDef(val);
GameObject val2 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Commando/CommandoBody.prefab").WaitForCompletion();
SkillLocator component = val2.GetComponent<SkillLocator>();
SkillFamily skillFamily = component.special.skillFamily;
Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
Variant[] variants = skillFamily.variants;
int num = skillFamily.variants.Length - 1;
Variant val3 = new Variant
{
skillDef = val,
unlockableName = ""
};
((Variant)(ref val3)).viewableNode = new Node(val.skillNameToken, false, (Node)null);
variants[num] = val3;
bool flag = default(bool);
ContentAddition.AddEntityState<FireSweepBarrage>(ref flag);
}
public static void DumpEntityStateConfig(EntityStateConfiguration esc)
{
for (int i = 0; i < esc.serializedFieldsCollection.serializedFields.Length; i++)
{
if (Object.op_Implicit(esc.serializedFieldsCollection.serializedFields[i].fieldValue.objectValue))
{
Debug.Log((object)(esc.serializedFieldsCollection.serializedFields[i].fieldName + " - " + (object)esc.serializedFieldsCollection.serializedFields[i].fieldValue.objectValue));
}
else
{
Debug.Log((object)(esc.serializedFieldsCollection.serializedFields[i].fieldName + " - " + esc.serializedFieldsCollection.serializedFields[i].fieldValue.stringValue));
}
}
}
}
}
namespace EntityStates.FORCED_REASSEMBLY.Commando
{
public class FireSweepBarrage : BaseState
{
public static string enterSound;
public static string muzzle = "MuzzleRight";
public static string fireSoundString = "Play_commando_M1";
public static GameObject muzzleEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/MuzzleflashBarrage.prefab").WaitForCompletion();
public static GameObject tracerEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Toolbot/TracerToolbotRebar.prefab").WaitForCompletion();
public static float baseTotalDuration = 1f;
public static float baseFiringDuration = 0.6f;
public static float fieldOfView = 120f;
public static float maxDistance = 120f;
public static float damageCoefficient = 3.8f;
public static float procCoefficient = 0.7f;
public static float force = 300f;
public static int minimumFireCount = 3;
public static GameObject impactEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/OmniImpactVFX.prefab").WaitForCompletion();
private float totalDuration;
private float firingDuration;
private int totalBulletsToFire;
private int totalBulletsFired;
private int targetHurtboxIndex;
private float timeBetweenBullets;
private List<HurtBox> targetHurtboxes = new List<HurtBox>();
private float fireTimer;
private ChildLocator childLocator;
private int muzzleIndex;
private Transform muzzleTransform;
public override void OnEnter()
{
//IL_0091: 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_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_009d: Expected O, but got Unknown
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
//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_00ce: 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_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_00e7: Unknown result type (might be due to invalid IL or missing references)
//IL_0114: 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)
((BaseState)this).OnEnter();
totalDuration = baseTotalDuration / base.attackSpeedStat;
firingDuration = baseFiringDuration / base.attackSpeedStat;
((EntityState)this).characterBody.SetAimTimer(3f);
((EntityState)this).PlayAnimation("Gesture, Additive", "FireBarrage", "FireBarrage.playbackRate", totalDuration, 0f);
((EntityState)this).PlayAnimation("Gesture, Override", "FireBarrage", "FireBarrage.playbackRate", totalDuration, 0f);
Util.PlaySound(enterSound, ((EntityState)this).gameObject);
Ray aimRay = ((BaseState)this).GetAimRay();
BullseyeSearch val = new BullseyeSearch();
val.teamMaskFilter = TeamMask.GetEnemyTeams(((BaseState)this).GetTeam());
val.maxAngleFilter = fieldOfView * 0.5f;
val.maxDistanceFilter = maxDistance;
val.searchOrigin = ((Ray)(ref aimRay)).origin;
val.searchDirection = ((Ray)(ref aimRay)).direction;
val.sortMode = (SortMode)3;
val.filterByLoS = true;
val.RefreshCandidates();
targetHurtboxes = val.GetResults().Where((Func<HurtBox, bool>)Util.IsValid).Distinct((IEqualityComparer<HurtBox>?)(object)default(EntityEqualityComparer))
.ToList();
totalBulletsToFire = Mathf.Max(targetHurtboxes.Count, minimumFireCount);
timeBetweenBullets = firingDuration / (float)totalBulletsToFire;
childLocator = ((Component)((EntityState)this).GetModelTransform()).GetComponent<ChildLocator>();
muzzleIndex = childLocator.FindChildIndex(muzzle);
muzzleTransform = childLocator.FindChild(muzzleIndex);
}
private void Fire()
{
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Expected O, but got Unknown
//IL_0146: Unknown result type (might be due to invalid IL or missing references)
//IL_0151: Unknown result type (might be due to invalid IL or missing references)
//IL_0156: 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_015f: Unknown result type (might be due to invalid IL or missing references)
//IL_0164: Unknown result type (might be due to invalid IL or missing references)
//IL_016c: Unknown result type (might be due to invalid IL or missing references)
//IL_016e: Unknown result type (might be due to invalid IL or missing references)
//IL_0173: Unknown result type (might be due to invalid IL or missing references)
//IL_0180: Unknown result type (might be due to invalid IL or missing references)
//IL_0185: Unknown result type (might be due to invalid IL or missing references)
//IL_0196: Unknown result type (might be due to invalid IL or missing references)
//IL_019b: Unknown result type (might be due to invalid IL or missing references)
//IL_0202: Unknown result type (might be due to invalid IL or missing references)
//IL_0207: Unknown result type (might be due to invalid IL or missing references)
//IL_020f: Unknown result type (might be due to invalid IL or missing references)
//IL_021a: Unknown result type (might be due to invalid IL or missing references)
//IL_0221: Unknown result type (might be due to invalid IL or missing references)
//IL_0226: Unknown result type (might be due to invalid IL or missing references)
//IL_022d: Expected O, but got Unknown
if (totalBulletsFired >= totalBulletsToFire)
{
return;
}
if (!string.IsNullOrEmpty(muzzle))
{
EffectManager.SimpleMuzzleFlash(muzzleEffectPrefab, ((EntityState)this).gameObject, muzzle, false);
}
Util.PlaySound(fireSoundString, ((EntityState)this).gameObject);
((EntityState)this).PlayAnimation("Gesture Additive, Right", "FirePistol, Right");
if (NetworkServer.active && targetHurtboxes.Count > 0)
{
DamageInfo val = new DamageInfo();
val.damage = base.damageStat * damageCoefficient;
val.attacker = ((EntityState)this).gameObject;
val.procCoefficient = procCoefficient;
val.crit = Util.CheckRoll(base.critStat, ((EntityState)this).characterBody.master);
if (targetHurtboxIndex >= targetHurtboxes.Count)
{
targetHurtboxIndex = 0;
}
HurtBox val2 = targetHurtboxes[targetHurtboxIndex];
if (Object.op_Implicit((Object)(object)val2))
{
HealthComponent healthComponent = val2.healthComponent;
if (Object.op_Implicit((Object)(object)healthComponent))
{
targetHurtboxIndex++;
Vector3 val3 = ((Component)val2).transform.position - ((EntityState)this).characterBody.corePosition;
Vector3 normalized = ((Vector3)(ref val3)).normalized;
val.force = force * normalized;
val.position = ((Component)val2).transform.position;
EffectManager.SimpleImpactEffect(impactEffectPrefab, ((Component)val2).transform.position, normalized, true);
healthComponent.TakeDamage(val);
GlobalEventManager.instance.OnHitEnemy(val, ((Component)healthComponent).gameObject);
}
if (Object.op_Implicit((Object)(object)tracerEffectPrefab) && Object.op_Implicit((Object)(object)childLocator))
{
int num = childLocator.FindChildIndex(muzzle);
childLocator.FindChild(num);
EffectData val4 = new EffectData
{
origin = ((Component)val2).transform.position,
start = muzzleTransform.position
};
val4.SetChildLocatorTransformReference(((EntityState)this).gameObject, num);
EffectManager.SpawnEffect(tracerEffectPrefab, val4, true);
}
}
}
totalBulletsFired++;
}
public override void FixedUpdate()
{
((EntityState)this).FixedUpdate();
fireTimer -= Time.fixedDeltaTime;
if (fireTimer <= 0f)
{
Fire();
fireTimer += timeBetweenBullets;
}
if (((EntityState)this).isAuthority && ((EntityState)this).fixedAge >= totalDuration)
{
((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 override void OnExit()
{
int num = totalBulletsToFire - totalBulletsFired;
for (int i = 0; i < num; i++)
{
Fire();
}
((EntityState)this).OnExit();
}
}
}