using Photon.Pun; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class Resource : MonoBehaviour, IPunObservable { [SerializeField] protected float currentValue; [SerializeField] protected float maxValue; [SerializeField] protected float baseMaxValue; [SerializeField] protected float flatRegen; [SerializeField] protected float percentRegen; [SerializeField] protected float timeBetweenRegens; protected bool canRegen = true; public UnityEvent onResourceChanged = new UnityEvent(); protected float baseFlatRegen; // Start is called before the first frame update protected virtual void Start() { currentValue = maxValue; onResourceChanged.Invoke(currentValue); StartCoroutine(RegenResource()); } public virtual void ChangeValue(float value) { currentValue += value; currentValue = Mathf.Clamp(currentValue, 0, maxValue); onResourceChanged.Invoke(currentValue); } public float GetCurrentValue() { return currentValue; } public virtual float GetMaxValue() { return maxValue; } public virtual float GetBaseMaxValue() { return baseMaxValue; } public virtual void SetCurrentValue(float value) { currentValue = value; currentValue = Mathf.Clamp(currentValue, 0, maxValue); onResourceChanged.Invoke(currentValue); } public virtual void SetMaxValue(float value) { maxValue = value; } protected IEnumerator RegenResource() { while (canRegen) { yield return new WaitForSeconds(timeBetweenRegens); ChangeValue(flatRegen + (maxValue * percentRegen/100f)); } StartCoroutine(RestartRegen()); } protected IEnumerator RestartRegen() { while (!canRegen) { yield return new WaitForSeconds(timeBetweenRegens); } StartCoroutine(RegenResource()); } public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { if (stream.IsWriting) { stream.SendNext(currentValue); stream.SendNext(maxValue); } else if (stream.IsReading) { SetCurrentValue((float)stream.ReceiveNext()); SetMaxValue((float)stream.ReceiveNext()); } } }