148 lines
3.5 KiB
C#
148 lines
3.5 KiB
C#
using Kryz.CharacterStats;
|
|
using Kryz.CharacterStats.Examples;
|
|
using Photon.Pun;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
|
|
public class AbsorbEffectInstance : StatusEffectInstance
|
|
{
|
|
public float startingAmount;
|
|
|
|
public float currentAmount;
|
|
|
|
public UnityEvent OnAbsorbDamage = new UnityEvent();
|
|
|
|
float income;
|
|
|
|
private void Awake()
|
|
{
|
|
owner = GetComponent<PhotonView>();
|
|
|
|
if(owner.IsMine)
|
|
{
|
|
OnEffectStackAddedEvent.AddListener(() => owner.RPC(nameof(RPC_AbsorbStarted), RpcTarget.Others));
|
|
OnEffectEnded.AddListener(() => owner.RPC(nameof(RPC_AbsorbEnded), RpcTarget.Others));
|
|
OnAbsorbDamage.AddListener(() => owner.RPC(nameof(RPC_AbsorbHit), RpcTarget.Others));
|
|
}
|
|
}
|
|
|
|
public float AbsorbDamage(float income)
|
|
{
|
|
this.income = income;
|
|
this.income += currentAmount;
|
|
if (this.income >= 0)
|
|
{
|
|
currentAmount = this.income;
|
|
}
|
|
else
|
|
{
|
|
StopCoroutine(effectStateCoroutine);
|
|
|
|
EffectStateEnded();
|
|
}
|
|
|
|
OnAbsorbDamage.Invoke();
|
|
|
|
return this.income;
|
|
}
|
|
|
|
public float GetHighestAmount()
|
|
{
|
|
float highestAmount = 0;
|
|
for (int i = activeStacks.Count - 1; i >= 0; i--)
|
|
{
|
|
if (((AbsorbEffect)activeStacks[i]).amount > highestAmount)
|
|
highestAmount = ((AbsorbEffect)activeStacks[i]).amount;
|
|
}
|
|
|
|
return highestAmount;
|
|
}
|
|
|
|
[PunRPC]
|
|
public void RPC_ApplyAbsorbEffect(int effectIndex)
|
|
{
|
|
ApplyEffect(StatusEffectIndexer.Instance.StatusEffects[effectIndex]);
|
|
}
|
|
|
|
[PunRPC]
|
|
public void RPC_AbsorbStarted()
|
|
{
|
|
OnEffectStackAddedEvent.Invoke();
|
|
}
|
|
[PunRPC]
|
|
public void RPC_AbsorbEnded()
|
|
{
|
|
OnEffectEnded.Invoke();
|
|
}
|
|
[PunRPC]
|
|
public void RPC_AbsorbHit()
|
|
{
|
|
OnAbsorbDamage.Invoke();
|
|
}
|
|
|
|
public override void ApplyEffect(StatusEffect effect)
|
|
{
|
|
base.ApplyEffect(effect);
|
|
}
|
|
|
|
protected override void AddStack(StatusEffect addedEffect)
|
|
{
|
|
startingAmount = ((AbsorbEffect)addedEffect).amount;
|
|
currentAmount = startingAmount;
|
|
|
|
base.AddStack(addedEffect);
|
|
}
|
|
|
|
protected override void RefreshEffect(StatusEffect effect)
|
|
{
|
|
base.RefreshEffect(effect);
|
|
|
|
startingAmount = GetHighestAmount();
|
|
currentAmount = startingAmount;
|
|
|
|
OnEffectStackAdded();
|
|
}
|
|
|
|
protected override IEnumerator EffectStateCoroutine()
|
|
{
|
|
return base.EffectStateCoroutine();
|
|
}
|
|
|
|
protected override void EffectStateStarted()
|
|
{
|
|
base.EffectStateStarted();
|
|
}
|
|
|
|
protected override void EffectStateEnded()
|
|
{
|
|
startingAmount = 0;
|
|
currentAmount = startingAmount;
|
|
|
|
base.EffectStateEnded();
|
|
}
|
|
|
|
/*
|
|
private CharacterStat GetCorrectStat(CharacterStats stats) //TODO: make it use multiple stats correctly
|
|
{
|
|
for (int i = 0; i < influencingStats.Count; i++)
|
|
{
|
|
if (stats.statsDictionary.ContainsKey(influencingStats[i].name.ToLower()))
|
|
{
|
|
Debug.Log($"Influencing effect using: {influencingStats[i].name.ToLower()}");
|
|
return stats.statsDictionary[influencingStats[i].name.ToLower()];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private void GetFinalValue(CharacterStat stat)
|
|
{
|
|
if (stat == null)
|
|
finalValue = baseValue;
|
|
else
|
|
finalValue = baseValue + stat.Value * percentStatInfluence;
|
|
}*/
|
|
}
|