124 lines
3.8 KiB
C#
124 lines
3.8 KiB
C#
|
using RoR2;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace EntityStates.VoidRaidCrab.Leg;
|
||
|
|
||
|
public class Stomp : BaseStompState
|
||
|
{
|
||
|
public static float blastDamageCoefficient;
|
||
|
|
||
|
public static float blastRadius;
|
||
|
|
||
|
public static float blastForce;
|
||
|
|
||
|
public static GameObject blastEffectPrefab;
|
||
|
|
||
|
private Vector3? previousToePosition;
|
||
|
|
||
|
private bool hasDoneBlast;
|
||
|
|
||
|
protected override void OnLifetimeExpiredAuthority()
|
||
|
{
|
||
|
outer.SetNextState(new PostStompReturnToBase
|
||
|
{
|
||
|
target = target
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public override void FixedUpdate()
|
||
|
{
|
||
|
base.FixedUpdate();
|
||
|
if (!hasDoneBlast && (bool)base.legController.mainBody && base.legController.mainBody.hasEffectiveAuthority)
|
||
|
{
|
||
|
TryStompCollisionAuthority();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void TryStompCollisionAuthority()
|
||
|
{
|
||
|
Vector3 currentToePosition = base.legController.toeTipTransform.position;
|
||
|
TryAttack();
|
||
|
previousToePosition = currentToePosition;
|
||
|
void TryAttack()
|
||
|
{
|
||
|
if (previousToePosition.HasValue)
|
||
|
{
|
||
|
Vector3 value = previousToePosition.Value;
|
||
|
if (!((currentToePosition - value).sqrMagnitude < 0.0025000002f) && Physics.Linecast(previousToePosition.Value, currentToePosition, out var hitInfo, LayerIndex.world.mask, QueryTriggerInteraction.Ignore))
|
||
|
{
|
||
|
DoBlastAuthority(hitInfo.point);
|
||
|
base.legController.DoToeConcussionBlastAuthority(hitInfo.point, useEffect: false);
|
||
|
hasDoneBlast = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void DoBlastAuthority(Vector3 blastOrigin)
|
||
|
{
|
||
|
CharacterBody mainBody = base.legController.mainBody;
|
||
|
EffectData effectData = new EffectData();
|
||
|
effectData.origin = blastOrigin;
|
||
|
effectData.scale = blastRadius;
|
||
|
effectData.rotation = Quaternion.LookRotation(Vector3.up);
|
||
|
EffectManager.SpawnEffect(blastEffectPrefab, effectData, transmit: true);
|
||
|
BlastAttack obj = new BlastAttack
|
||
|
{
|
||
|
attacker = mainBody.gameObject
|
||
|
};
|
||
|
obj.inflictor = obj.attacker;
|
||
|
obj.baseDamage = blastDamageCoefficient * mainBody.damage;
|
||
|
obj.baseForce = blastForce;
|
||
|
obj.position = blastOrigin;
|
||
|
obj.radius = blastRadius;
|
||
|
obj.falloffModel = BlastAttack.FalloffModel.SweetSpot;
|
||
|
obj.teamIndex = mainBody.teamComponent.teamIndex;
|
||
|
obj.attackerFiltering = AttackerFiltering.NeverHitSelf;
|
||
|
obj.damageType = DamageType.Generic;
|
||
|
obj.crit = mainBody.RollCrit();
|
||
|
obj.damageColorIndex = DamageColorIndex.Default;
|
||
|
obj.impactEffect = EffectIndex.Invalid;
|
||
|
obj.losType = BlastAttack.LoSType.None;
|
||
|
obj.procChainMask = default(ProcChainMask);
|
||
|
obj.procCoefficient = 1f;
|
||
|
obj.Fire();
|
||
|
}
|
||
|
|
||
|
private void DoStompAttackAuthority(Vector3 hitPosition)
|
||
|
{
|
||
|
CharacterBody mainBody = base.legController.mainBody;
|
||
|
if ((bool)mainBody)
|
||
|
{
|
||
|
Vector3 position = base.legController.footTranform.position;
|
||
|
Vector3 position2 = base.legController.toeTipTransform.position;
|
||
|
RaycastHit hitInfo;
|
||
|
Vector3 vector = (Physics.Linecast(position, position2, out hitInfo, LayerIndex.world.mask, QueryTriggerInteraction.Ignore) ? hitInfo.point : position2);
|
||
|
EffectData effectData = new EffectData();
|
||
|
effectData.origin = vector;
|
||
|
effectData.scale = blastRadius;
|
||
|
effectData.rotation = Quaternion.LookRotation(-hitInfo.normal);
|
||
|
EffectManager.SpawnEffect(blastEffectPrefab, effectData, transmit: true);
|
||
|
BlastAttack obj = new BlastAttack
|
||
|
{
|
||
|
attacker = mainBody.gameObject
|
||
|
};
|
||
|
obj.inflictor = obj.attacker;
|
||
|
obj.baseDamage = blastDamageCoefficient * mainBody.damage;
|
||
|
obj.baseForce = blastForce;
|
||
|
obj.position = vector;
|
||
|
obj.radius = blastRadius;
|
||
|
obj.falloffModel = BlastAttack.FalloffModel.Linear;
|
||
|
obj.teamIndex = mainBody.teamComponent.teamIndex;
|
||
|
obj.attackerFiltering = AttackerFiltering.NeverHitSelf;
|
||
|
obj.damageType = DamageType.Generic;
|
||
|
obj.crit = mainBody.RollCrit();
|
||
|
obj.damageColorIndex = DamageColorIndex.Default;
|
||
|
obj.impactEffect = EffectIndex.Invalid;
|
||
|
obj.losType = BlastAttack.LoSType.None;
|
||
|
obj.procChainMask = default(ProcChainMask);
|
||
|
obj.procCoefficient = 1f;
|
||
|
obj.Fire();
|
||
|
}
|
||
|
}
|
||
|
}
|