r2mods/ilspy_dump/ror2_csproj/RoR2.VoidRaidCrab/VoidRaidCrabAISkillDriverCo...

190 lines
4.3 KiB
C#

using EntityStates;
using RoR2.CharacterAI;
using UnityEngine;
namespace RoR2.VoidRaidCrab;
public class VoidRaidCrabAISkillDriverController : MonoBehaviour
{
[SerializeField]
private AISkillDriver[] weaponSkillDrivers;
[SerializeField]
private AISkillDriver[] bodySkillDrivers;
[SerializeField]
private AISkillDriver[] gauntletSkillDrivers;
[SerializeField]
private AISkillDriver finalStandSkillDriver;
[SerializeField]
private CharacterMaster master;
[SerializeField]
private string bodyStateMachineName = "Body";
[SerializeField]
private AISkillDriver debugForceSkillDriver;
private EntityStateMachine bodyStateMachine;
private HealthComponent healthComponent;
private bool isGauntletSkillAvailable;
public bool CanUseWeaponSkills()
{
if (bodyStateMachine.state is GenericCharacterMain && !isGauntletSkillAvailable)
{
return !ShouldUseFinalStandSkill();
}
return false;
}
public bool CanUseBodySkills()
{
if (bodyStateMachine.IsInMainState() && !isGauntletSkillAvailable)
{
return !ShouldUseFinalStandSkill();
}
return false;
}
public bool ShouldUseGauntletSkills()
{
if (isGauntletSkillAvailable && bodyStateMachine.IsInMainState())
{
return !ShouldUseFinalStandSkill();
}
return false;
}
public bool ShouldUseFinalStandSkill()
{
return CanUsePhaseSkillDriver(finalStandSkillDriver);
}
private void FixedUpdate()
{
if ((bool)master && (!bodyStateMachine || !healthComponent))
{
GameObject bodyObject = master.GetBodyObject();
if ((bool)bodyObject)
{
if (!bodyStateMachine)
{
bodyStateMachine = EntityStateMachine.FindByCustomName(bodyObject, bodyStateMachineName);
}
if (!healthComponent)
{
healthComponent = bodyObject.GetComponent<HealthComponent>();
}
}
}
if (!bodyStateMachine)
{
return;
}
isGauntletSkillAvailable = false;
AISkillDriver[] array = gauntletSkillDrivers;
foreach (AISkillDriver driver in array)
{
isGauntletSkillAvailable = isGauntletSkillAvailable || CanUsePhaseSkillDriver(driver);
}
if ((bool)debugForceSkillDriver)
{
SetSkillDriversEnabled(weaponSkillDrivers, driverEnabled: false);
SetSkillDriversEnabled(bodySkillDrivers, driverEnabled: false);
SetSkillDriversEnabled(gauntletSkillDrivers, driverEnabled: false);
if ((bool)finalStandSkillDriver)
{
finalStandSkillDriver.enabled = false;
}
bool flag = false;
array = weaponSkillDrivers;
foreach (AISkillDriver aISkillDriver in array)
{
if ((object)aISkillDriver == debugForceSkillDriver)
{
aISkillDriver.enabled = CanUseWeaponSkills();
flag = true;
}
}
if (!flag)
{
array = bodySkillDrivers;
foreach (AISkillDriver aISkillDriver2 in array)
{
if ((object)aISkillDriver2 == debugForceSkillDriver)
{
aISkillDriver2.enabled = CanUseBodySkills();
flag = true;
}
}
}
if (!flag)
{
array = gauntletSkillDrivers;
foreach (AISkillDriver aISkillDriver3 in array)
{
if ((object)aISkillDriver3 == debugForceSkillDriver)
{
aISkillDriver3.enabled = ShouldUseGauntletSkills();
flag = true;
}
}
}
if (!flag && (object)debugForceSkillDriver == finalStandSkillDriver)
{
debugForceSkillDriver.enabled = ShouldUseFinalStandSkill();
flag = true;
}
if (!flag)
{
debugForceSkillDriver.enabled = true;
}
}
else
{
SetSkillDriversEnabled(weaponSkillDrivers, CanUseWeaponSkills());
SetSkillDriversEnabled(bodySkillDrivers, CanUseBodySkills());
SetSkillDriversEnabled(gauntletSkillDrivers, ShouldUseGauntletSkills());
if ((bool)finalStandSkillDriver)
{
finalStandSkillDriver.enabled = ShouldUseFinalStandSkill();
}
}
}
private void SetSkillDriversEnabled(AISkillDriver[] skillDrivers, bool driverEnabled)
{
for (int i = 0; i < skillDrivers.Length; i++)
{
skillDrivers[i].enabled = driverEnabled;
}
}
private bool CanUsePhaseSkillDriver(AISkillDriver driver)
{
if ((bool)driver)
{
float num = 1f;
if ((bool)healthComponent)
{
num = healthComponent.combinedHealthFraction;
}
if (num < driver.maxUserHealthFraction)
{
if (driver.timesSelected >= driver.maxTimesSelected)
{
return driver.maxTimesSelected < 0;
}
return true;
}
return false;
}
return false;
}
}