87 lines
2.0 KiB
C#
87 lines
2.0 KiB
C#
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<IPlayerSurvivalElement>();
|
|
[SerializeReference, SubclassSelector] private IPlayerSurvivalElement[] initialElements = Array.Empty<IPlayerSurvivalElement>();
|
|
[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<bool>(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;
|
|
}
|
|
}
|
|
}
|
|
}
|