using System; using System.Collections; using System.Collections.Generic; using System.Threading; using BITKit; using BITKit.Entities; using UnityEngine; namespace BITFALL.Player.Survival { [Serializable] public struct SurvivalDamage : IDamageType { public IPlayerSurvivalElement element; public string Message; } [CustomType(typeof(IPlayerSurvivalService))] public class PlayerSurvivalService : EntityBehavior, IPlayerSurvivalService { public IPlayerSurvivalElement[] Elements { get; set; } = Array.Empty(); [SerializeReference, SubclassSelector] private IPlayerSurvivalElement[] initialElements = Array.Empty(); [SerializeReference,SubclassSelector,Inject] private IDamageService _damageService; [SerializeReference,SubclassSelector,Inject] private ITicker ticker; [SerializeReference,SubclassSelector,Inject] private ITicker damageTicker; [Inject] private IHealth _health; public override void OnAwake() { Elements = initialElements; _health.OnSetAlive += OnSetAlive; } public override void OnStart() { base.OnStart(); ticker.Add(Tick); damageTicker.Add(OnDamageTick); } private void OnDamageTick(float obj) { foreach (var x in Elements) { if (x.Value <= 0) { _damageService.Execute(new DamageMessage() { DamageType = new SurvivalDamage() { element = x, }, Target = UnityEntity, Damage = 1, }); } } } public override void OnDestroyComponent() { base.OnDestroyComponent(); ticker.Remove(Tick); damageTicker.Remove(OnDamageTick); } private void OnSetAlive(bool obj) { if (obj) { foreach (var VARIABLE in Elements) { VARIABLE.Value = 100; } } } private void Tick(float deltaTime) { if (Data.Get(BITConstant.Environment.cl_survival_lifecycle_enabled) is false) return; if (_health.IsAlive is false) return; foreach (var x in Elements) { x.Value -= x.Decay * deltaTime; } } } }