r2mods/ilspy_dump/ror2_csproj/RoR2/FalseSonBossController.cs

145 lines
3.6 KiB
C#

using UnityEngine;
using UnityEngine.Networking;
namespace RoR2;
[RequireComponent(typeof(CharacterBody))]
public class FalseSonBossController : MonoBehaviour
{
public CharacterBody characterBody;
public Animator characterAnimator;
public ModelLocator modelLocator;
public GameObject lunarSpikePrefab;
public ChildLocator childLocator;
public HealthComponent healthComponent;
public GameObject masterFSPrefab;
public Transform lunarSpike;
public Transform lunarSpikeLocation;
private float maxHealth;
private float currentHealth;
private bool health75;
public bool health50;
public bool lunarSpikeActive;
private float testTimeGate = 2f;
private float spikeTimer;
public int swingCounter;
public bool firedLunarSpike;
private void OnEnable()
{
lunarSpikeLocation = childLocator.FindChild("LunarSpike");
}
private void Start()
{
maxHealth = healthComponent.health;
}
private void FixedUpdate()
{
if (healthComponent.health <= maxHealth * 0.5f && !health50)
{
PlayAnimation("FullBody, Override", "OverloadErruption", "OverloadErruption.playbackRate", 6f);
spikeTimer += Time.deltaTime;
if (spikeTimer > 2.8f)
{
SpawnLunarSpike();
}
health50 = true;
}
if (!lunarSpikeActive)
{
return;
}
if (characterBody.GetBuffCount(RoR2Content.Buffs.HiddenInvincibility) < 1)
{
characterBody.AddBuff(RoR2Content.Buffs.HiddenInvincibility);
}
if (!lunarSpike)
{
characterBody.RemoveBuff(RoR2Content.Buffs.HiddenInvincibility);
characterBody.RemoveBuff(DLC2Content.Buffs.CorruptionFesters);
if (health50)
{
characterBody.AddTimedBuff(DLC2Content.Buffs.WeakenedBeating, 60f);
}
lunarSpikeActive = false;
}
}
protected void PlayAnimation(string layerName, string animationStateName, string playbackRateParam, float duration)
{
if (duration <= 0f)
{
Debug.LogWarningFormat("EntityState.PlayAnimation: Zero duration is not allowed. type={0}", GetType().Name);
return;
}
Animator modelAnimator = GetModelAnimator();
if ((bool)modelAnimator)
{
PlayAnimationOnAnimator(modelAnimator, layerName, animationStateName, playbackRateParam, duration);
}
}
protected static void PlayAnimationOnAnimator(Animator modelAnimator, string layerName, string animationStateName, string playbackRateParam, float duration)
{
modelAnimator.speed = 1f;
modelAnimator.Update(0f);
int layerIndex = modelAnimator.GetLayerIndex(layerName);
if (layerIndex >= 0)
{
modelAnimator.SetFloat(playbackRateParam, 1f);
modelAnimator.PlayInFixedTime(animationStateName, layerIndex, 0f);
modelAnimator.Update(0f);
float length = modelAnimator.GetCurrentAnimatorStateInfo(layerIndex).length;
modelAnimator.SetFloat(playbackRateParam, length / duration);
}
}
protected Animator GetModelAnimator()
{
if ((bool)modelLocator && (bool)modelLocator.modelTransform)
{
return modelLocator.modelTransform.GetComponent<Animator>();
}
return null;
}
public void SpawnLunarSpike()
{
MasterSpawnSlotController component = GetComponent<MasterSpawnSlotController>();
if (NetworkServer.active && (bool)component)
{
component.SpawnRandomOpen(1, Run.instance.stageRng, base.gameObject);
}
lunarSpike = lunarSpikeLocation.transform.GetChild(0);
lunarSpike.transform.rotation = lunarSpikeLocation.rotation;
lunarSpike.GetComponent<CharacterBody>().baseMaxHealth = maxHealth * 0.2f;
DamageInfo damageInfo = new DamageInfo
{
damage = healthComponent.health * 0.1f
};
healthComponent.TakeDamage(damageInfo);
characterBody.AddBuff(DLC2Content.Buffs.CorruptionFesters);
lunarSpikeActive = true;
firedLunarSpike = true;
}
}