r2mods/ilspy_dump/ror2_csproj/EntityStates.Engi.EngiWeapon/EngiSelfShield.cs

100 lines
2.8 KiB
C#

using System.Linq;
using RoR2;
using UnityEngine;
using UnityEngine.Networking;
namespace EntityStates.Engi.EngiWeapon;
public class EngiSelfShield : BaseState
{
public static float transferDelay = 0.1f;
private HurtBox transferTarget;
private BullseyeSearch friendLocator;
private Indicator indicator;
public override void OnEnter()
{
base.OnEnter();
if (NetworkServer.active && (bool)base.characterBody)
{
base.characterBody.AddBuff(RoR2Content.Buffs.EngiShield);
base.characterBody.RecalculateStats();
if ((bool)base.healthComponent)
{
base.healthComponent.RechargeShieldFull();
}
}
friendLocator = new BullseyeSearch();
friendLocator.teamMaskFilter = TeamMask.none;
if ((bool)base.teamComponent)
{
friendLocator.teamMaskFilter.AddTeam(base.teamComponent.teamIndex);
}
friendLocator.maxDistanceFilter = 80f;
friendLocator.maxAngleFilter = 20f;
friendLocator.sortMode = BullseyeSearch.SortMode.Angle;
friendLocator.filterByLoS = false;
indicator = new Indicator(base.gameObject, LegacyResourcesAPI.Load<GameObject>("Prefabs/ShieldTransferIndicator"));
}
public override void OnExit()
{
base.skillLocator.utility = base.skillLocator.FindSkill("RetractShield");
if (NetworkServer.active)
{
base.characterBody.RemoveBuff(RoR2Content.Buffs.EngiShield);
}
if (base.isAuthority)
{
base.skillLocator.utility.RemoveAllStocks();
}
indicator.active = false;
base.OnExit();
}
public override void FixedUpdate()
{
base.FixedUpdate();
if (!base.isAuthority || !(base.fixedAge >= transferDelay) || !base.skillLocator.utility.IsReady())
{
return;
}
if ((bool)base.characterBody)
{
float extraRaycastDistance = 0f;
Ray ray = CameraRigController.ModifyAimRayIfApplicable(GetAimRay(), base.gameObject, out extraRaycastDistance);
friendLocator.searchOrigin = ray.origin;
friendLocator.searchDirection = ray.direction;
friendLocator.maxDistanceFilter += extraRaycastDistance;
friendLocator.RefreshCandidates();
friendLocator.FilterOutGameObject(base.gameObject);
transferTarget = friendLocator.GetResults().FirstOrDefault();
}
HealthComponent healthComponent = (transferTarget ? transferTarget.healthComponent : null);
if ((bool)healthComponent)
{
indicator.targetTransform = Util.GetCoreTransform(healthComponent.gameObject);
if ((bool)base.inputBank && base.inputBank.skill3.justPressed)
{
EngiOtherShield engiOtherShield = new EngiOtherShield();
engiOtherShield.target = healthComponent.gameObject.GetComponent<CharacterBody>();
outer.SetNextState(engiOtherShield);
return;
}
}
else
{
indicator.targetTransform = null;
}
indicator.active = indicator.targetTransform;
}
public override InterruptPriority GetMinimumInterruptPriority()
{
return InterruptPriority.PrioritySkill;
}
}