115 lines
2.4 KiB
C#
115 lines
2.4 KiB
C#
|
using System.Collections.Generic;
|
||
|
using RoR2.Orbs;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace RoR2.Items;
|
||
|
|
||
|
public class ShockNearbyBodyBehavior : BaseItemBodyBehavior
|
||
|
{
|
||
|
private float teslaBuffRollTimer;
|
||
|
|
||
|
private const float teslaRollInterval = 10f;
|
||
|
|
||
|
private float teslaFireTimer;
|
||
|
|
||
|
private float teslaResetListTimer;
|
||
|
|
||
|
private float teslaResetListInterval = 0.5f;
|
||
|
|
||
|
private const float teslaFireInterval = 1f / 12f;
|
||
|
|
||
|
private bool teslaCrit;
|
||
|
|
||
|
private bool teslaIsOn;
|
||
|
|
||
|
private List<HealthComponent> previousTeslaTargetList = new List<HealthComponent>();
|
||
|
|
||
|
private bool _grantingBuff;
|
||
|
|
||
|
private BuffDef grantedBuff => RoR2Content.Buffs.TeslaField;
|
||
|
|
||
|
private bool grantingBuff
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return _grantingBuff;
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
if (_grantingBuff != value)
|
||
|
{
|
||
|
_grantingBuff = value;
|
||
|
if (_grantingBuff)
|
||
|
{
|
||
|
base.body.AddBuff(grantedBuff);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
base.body.RemoveBuff(grantedBuff);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[ItemDefAssociation(useOnServer = true, useOnClient = false)]
|
||
|
private static ItemDef GetItemDef()
|
||
|
{
|
||
|
return RoR2Content.Items.ShockNearby;
|
||
|
}
|
||
|
|
||
|
private void FixedUpdate()
|
||
|
{
|
||
|
teslaBuffRollTimer += Time.fixedDeltaTime;
|
||
|
if (teslaBuffRollTimer >= 10f)
|
||
|
{
|
||
|
teslaBuffRollTimer = 0f;
|
||
|
teslaCrit = base.body.RollCrit();
|
||
|
grantingBuff = !grantingBuff;
|
||
|
}
|
||
|
if (!grantingBuff)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
teslaFireTimer += Time.fixedDeltaTime;
|
||
|
teslaResetListTimer += Time.fixedDeltaTime;
|
||
|
if (teslaFireTimer >= 1f / 12f)
|
||
|
{
|
||
|
teslaFireTimer = 0f;
|
||
|
LightningOrb lightningOrb = new LightningOrb
|
||
|
{
|
||
|
origin = base.body.corePosition,
|
||
|
damageValue = base.body.damage * 2f,
|
||
|
isCrit = teslaCrit,
|
||
|
bouncesRemaining = 2 * stack,
|
||
|
teamIndex = base.body.teamComponent.teamIndex,
|
||
|
attacker = base.gameObject,
|
||
|
procCoefficient = 0.3f,
|
||
|
bouncedObjects = previousTeslaTargetList,
|
||
|
lightningType = LightningOrb.LightningType.Tesla,
|
||
|
damageColorIndex = DamageColorIndex.Item,
|
||
|
range = 35f
|
||
|
};
|
||
|
HurtBox hurtBox = lightningOrb.PickNextTarget(base.transform.position);
|
||
|
if ((bool)hurtBox)
|
||
|
{
|
||
|
previousTeslaTargetList.Add(hurtBox.healthComponent);
|
||
|
lightningOrb.target = hurtBox;
|
||
|
OrbManager.instance.AddOrb(lightningOrb);
|
||
|
}
|
||
|
}
|
||
|
if (teslaResetListTimer >= teslaResetListInterval)
|
||
|
{
|
||
|
teslaResetListTimer -= teslaResetListInterval;
|
||
|
previousTeslaTargetList.Clear();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void OnDisable()
|
||
|
{
|
||
|
if ((bool)base.body && base.body.HasBuff(grantedBuff))
|
||
|
{
|
||
|
base.body.RemoveBuff(grantedBuff);
|
||
|
}
|
||
|
}
|
||
|
}
|