BITFALL/Assets/Artists/Scripts/Player/Survival/PlayerSurvivalService.cs

87 lines
2.0 KiB
C#
Raw Normal View History

2023-09-01 14:33:54 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using BITKit;
using BITKit.Entities;
using UnityEngine;
namespace BITFALL.Player.Survival
{
2023-10-20 19:31:12 +08:00
[Serializable]
public struct SurvivalDamage : IDamageType
{
public IPlayerSurvivalElement element;
public string Message;
}
2023-10-02 23:24:56 +08:00
[CustomType(typeof(IPlayerSurvivalService))]
2023-10-30 01:25:53 +08:00
public class PlayerSurvivalService : EntityBehavior, IPlayerSurvivalService
2023-09-01 14:33:54 +08:00
{
2023-10-02 23:24:56 +08:00
public IPlayerSurvivalElement[] Elements { get; set; } = Array.Empty<IPlayerSurvivalElement>();
[SerializeReference, SubclassSelector] private IPlayerSurvivalElement[] initialElements = Array.Empty<IPlayerSurvivalElement>();
2023-10-20 19:31:12 +08:00
[SerializeReference,SubclassSelector,Inject] private IDamageService _damageService;
2023-12-15 00:08:02 +08:00
[SerializeReference,SubclassSelector,Inject] private ITicker ticker;
[SerializeReference,SubclassSelector,Inject] private ITicker damageTicker;
2023-10-20 19:31:12 +08:00
[Inject]
private IHealth _health;
2023-09-01 14:33:54 +08:00
public override void OnAwake()
{
2023-10-02 23:24:56 +08:00
Elements = initialElements;
2023-10-24 23:37:59 +08:00
_health.OnSetAlive += OnSetAlive;
}
2023-12-15 00:08:02 +08:00
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,
});
}
}
2023-12-15 00:08:02 +08:00
}
public override void OnDestroyComponent()
{
base.OnDestroyComponent();
ticker.Remove(Tick);
damageTicker.Remove(OnDamageTick);
2023-12-15 00:08:02 +08:00
}
2023-10-24 23:37:59 +08:00
private void OnSetAlive(bool obj)
{
if (obj)
{
foreach (var VARIABLE in Elements)
{
VARIABLE.Value = 100;
}
}
2023-09-01 14:33:54 +08:00
}
private void Tick(float deltaTime)
2023-09-01 14:33:54 +08:00
{
2023-11-21 18:05:18 +08:00
if (Data.Get<bool>(BITConstant.Environment.cl_survival_lifecycle_enabled) is false) return;
2023-10-24 23:37:59 +08:00
if (_health.IsAlive is false) return;
2023-10-02 23:24:56 +08:00
foreach (var x in Elements)
2023-09-01 14:33:54 +08:00
{
2023-12-16 23:30:08 +08:00
x.Value -= x.Decay * deltaTime;
2023-09-01 14:33:54 +08:00
}
}
}
}