126 lines
3.0 KiB
C#
126 lines
3.0 KiB
C#
using RoR2;
|
|
using RoR2.Orbs;
|
|
using UnityEngine;
|
|
|
|
namespace EntityStates.DroneWeaponsChainGun;
|
|
|
|
public class FireChainGun : BaseDroneWeaponChainGunState
|
|
{
|
|
[SerializeField]
|
|
public float baseDuration;
|
|
|
|
[SerializeField]
|
|
public GameObject orbEffectObject;
|
|
|
|
[SerializeField]
|
|
public float damageCoefficient;
|
|
|
|
[SerializeField]
|
|
public float orbSpeed;
|
|
|
|
[SerializeField]
|
|
public int shotCount;
|
|
|
|
[SerializeField]
|
|
public float procCoefficient;
|
|
|
|
[SerializeField]
|
|
public int additionalBounces;
|
|
|
|
[SerializeField]
|
|
public float bounceRange;
|
|
|
|
[SerializeField]
|
|
public float damageCoefficientPerBounce;
|
|
|
|
[SerializeField]
|
|
public int targetsToFindPerBounce;
|
|
|
|
[SerializeField]
|
|
public bool canBounceOnSameTarget;
|
|
|
|
[SerializeField]
|
|
public string muzzleName;
|
|
|
|
[SerializeField]
|
|
public GameObject muzzleFlashPrefab;
|
|
|
|
[SerializeField]
|
|
public string fireSoundString;
|
|
|
|
private HurtBox targetHurtBox;
|
|
|
|
private float duration;
|
|
|
|
private int stepIndex;
|
|
|
|
public FireChainGun()
|
|
{
|
|
}
|
|
|
|
public FireChainGun(HurtBox targetHurtBox)
|
|
{
|
|
this.targetHurtBox = targetHurtBox;
|
|
}
|
|
|
|
public override void OnEnter()
|
|
{
|
|
base.OnEnter();
|
|
Transform transform = FindChild(muzzleName);
|
|
if (!transform)
|
|
{
|
|
transform = body.coreTransform;
|
|
}
|
|
if (base.isAuthority)
|
|
{
|
|
duration = baseDuration / body.attackSpeed;
|
|
ChainGunOrb chainGunOrb = new ChainGunOrb(orbEffectObject);
|
|
chainGunOrb.damageValue = body.damage * damageCoefficient;
|
|
chainGunOrb.isCrit = Util.CheckRoll(body.crit, body.master);
|
|
chainGunOrb.teamIndex = TeamComponent.GetObjectTeam(body.gameObject);
|
|
chainGunOrb.attacker = body.gameObject;
|
|
chainGunOrb.procCoefficient = procCoefficient;
|
|
chainGunOrb.procChainMask = default(ProcChainMask);
|
|
chainGunOrb.origin = transform.position;
|
|
chainGunOrb.target = targetHurtBox;
|
|
chainGunOrb.speed = orbSpeed;
|
|
chainGunOrb.bouncesRemaining = additionalBounces;
|
|
chainGunOrb.bounceRange = bounceRange;
|
|
chainGunOrb.damageCoefficientPerBounce = damageCoefficientPerBounce;
|
|
chainGunOrb.targetsToFindPerBounce = targetsToFindPerBounce;
|
|
chainGunOrb.canBounceOnSameTarget = canBounceOnSameTarget;
|
|
chainGunOrb.damageColorIndex = DamageColorIndex.Item;
|
|
OrbManager.instance.AddOrb(chainGunOrb);
|
|
}
|
|
if ((bool)transform)
|
|
{
|
|
EffectData effectData = new EffectData
|
|
{
|
|
origin = transform.position
|
|
};
|
|
EffectManager.SpawnEffect(muzzleFlashPrefab, effectData, transmit: true);
|
|
}
|
|
Util.PlaySound(fireSoundString, base.gameObject);
|
|
}
|
|
|
|
public override void FixedUpdate()
|
|
{
|
|
base.FixedUpdate();
|
|
if (base.isAuthority && base.fixedAge > duration)
|
|
{
|
|
BaseDroneWeaponChainGunState baseDroneWeaponChainGunState;
|
|
if (stepIndex < shotCount)
|
|
{
|
|
baseDroneWeaponChainGunState = new FireChainGun(targetHurtBox);
|
|
(baseDroneWeaponChainGunState as FireChainGun).stepIndex = stepIndex + 1;
|
|
}
|
|
else
|
|
{
|
|
baseDroneWeaponChainGunState = new AimChainGun();
|
|
}
|
|
baseDroneWeaponChainGunState.PassDisplayLinks(gunChildLocators, gunAnimators);
|
|
outer.SetNextState(baseDroneWeaponChainGunState);
|
|
}
|
|
}
|
|
}
|