r2mods/ilspy_dump/ror2_csproj/EntityStates.ChildMonster/Frolic.cs

127 lines
3.3 KiB
C#

using System.Collections.Generic;
using System.Linq;
using RoR2;
using RoR2.CharacterAI;
using RoR2.Navigation;
using UnityEngine;
namespace EntityStates.ChildMonster;
public class Frolic : BaseState
{
public static GameObject projectilePrefab;
public static GameObject effectPrefab;
public static GameObject tpEffectPrefab;
public static float baseDuration = 2f;
public static float damageCoefficient = 1.2f;
public static float force = 20f;
public static string attackString;
public static float tpDuration = 0.5f;
public static float fireFrolicDuration = 0.3f;
public static float frolicCooldownDuration = 18f;
private float duration;
private bool frolicFireFired;
private bool tpFired;
private bool cantFrolic;
public override void OnEnter()
{
base.OnEnter();
ChildMonsterController component = base.characterBody.GetComponent<ChildMonsterController>();
cantFrolic = !component.CheckTeleportAvailable();
if (!cantFrolic)
{
component.RegisterTeleport();
fireFrolicDuration += tpDuration;
duration = baseDuration / attackSpeedStat;
PlayAnimation("Gesture, Override", "FrolicEnter", "FrolicEnter.playbackRate", 1f);
Util.PlaySound(attackString, base.gameObject);
}
}
public override void FixedUpdate()
{
base.FixedUpdate();
if (cantFrolic)
{
outer.SetNextStateToMain();
return;
}
if (base.fixedAge > tpDuration && !tpFired)
{
FireTPEffect();
tpFired = true;
TeleportAroundPlayer();
}
if (base.fixedAge > fireFrolicDuration && !frolicFireFired)
{
frolicFireFired = true;
FireTPEffect();
Transform transform = base.characterBody.master.GetComponent<BaseAI>().currentEnemy.characterBody.transform;
base.characterBody.transform.LookAt(transform.position);
}
if (base.fixedAge >= duration && base.isAuthority)
{
outer.SetNextStateToMain();
}
}
public override InterruptPriority GetMinimumInterruptPriority()
{
return InterruptPriority.PrioritySkill;
}
public void TeleportAroundPlayer()
{
GetComponent<ModelLocator>().modelTransform.GetComponent<CharacterModel>();
_ = base.characterBody.corePosition;
NodeGraph nodeGraph = SceneInfo.instance.GetNodeGraph(MapNodeGroup.GraphType.Ground);
Vector3 position = base.characterBody.master.GetComponent<BaseAI>().currentEnemy.characterBody.coreTransform.position;
List<NodeGraph.NodeIndex> list = nodeGraph.FindNodesInRange(position, 25f, 37f, HullMask.Human);
Vector3 position2 = default(Vector3);
bool flag = false;
int num = 35;
while (!flag)
{
NodeGraph.NodeIndex nodeIndex = list.ElementAt(Random.Range(1, list.Count));
nodeGraph.GetNodePosition(nodeIndex, out position2);
float num2 = Vector3.Distance(base.characterBody.coreTransform.position, position2);
num--;
if (num2 > 35f || num < 0)
{
flag = true;
}
}
if (num < 0)
{
Debug.LogWarning("Child.Frolic state entered a loop where it ran more than 35 times without getting out - check what it's doing");
}
position2 += Vector3.up * 1.5f;
TeleportHelper.TeleportBody(base.characterBody, position2);
}
public void FireTPEffect()
{
Vector3 position = FindModelChild("Chest").transform.position;
EffectManager.SpawnEffect(tpEffectPrefab, new EffectData
{
origin = position,
scale = 1f
}, transmit: true);
Util.PlaySound("Play_child_attack2_reappear", base.gameObject);
}
}