r2mods/ilspy_dump/ror2_csproj/RoR2.CharacterAI/EmergencyDroneCustomTarget.cs

87 lines
1.9 KiB
C#

using System.Linq;
using UnityEngine;
using UnityEngine.Networking;
namespace RoR2.CharacterAI;
[RequireComponent(typeof(BaseAI))]
public class EmergencyDroneCustomTarget : MonoBehaviour
{
private BaseAI ai;
private BullseyeSearch search;
public float searchInterval;
private float timer;
private void Awake()
{
ai = GetComponent<BaseAI>();
if (NetworkServer.active)
{
search = new BullseyeSearch();
}
}
private void FixedUpdate()
{
if (NetworkServer.active)
{
FixedUpdateServer();
}
}
private void FixedUpdateServer()
{
timer -= Time.fixedDeltaTime;
if (timer <= 0f)
{
timer = searchInterval;
DoSearch();
}
}
private void DoSearch()
{
if ((bool)ai.body)
{
Ray aimRay = ai.bodyInputBank.GetAimRay();
search.viewer = ai.body;
search.filterByDistinctEntity = true;
search.filterByLoS = false;
search.maxDistanceFilter = float.PositiveInfinity;
search.minDistanceFilter = 0f;
search.maxAngleFilter = 360f;
search.searchDirection = aimRay.direction;
search.searchOrigin = aimRay.origin;
search.sortMode = BullseyeSearch.SortMode.Distance;
search.queryTriggerInteraction = QueryTriggerInteraction.UseGlobal;
TeamMask none = TeamMask.none;
none.AddTeam(ai.master.teamIndex);
search.teamMaskFilter = none;
search.RefreshCandidates();
search.FilterOutGameObject(ai.body.gameObject);
ai.customTarget.gameObject = search.GetResults().Where(TargetPassesFilters).FirstOrDefault()?.healthComponent.gameObject;
}
}
private bool TargetPassesFilters(HurtBox hurtBox)
{
if (IsHurt(hurtBox))
{
return !HealBeamController.HealBeamAlreadyExists(ai.body.gameObject, hurtBox.healthComponent);
}
return false;
}
private static bool IsHurt(HurtBox hurtBox)
{
if (hurtBox.healthComponent.alive)
{
return hurtBox.healthComponent.health < hurtBox.healthComponent.fullHealth;
}
return false;
}
}