2023-08-27 02:58:19 +08:00
|
|
|
using System;
|
2023-06-08 14:09:50 +08:00
|
|
|
using System.Collections.Generic;
|
2023-11-30 00:23:23 +08:00
|
|
|
using System.Linq;
|
2024-02-21 01:40:53 +08:00
|
|
|
using BITFALL.Entities.Equipment;
|
2023-11-30 00:23:23 +08:00
|
|
|
using BITKit.PlayerCamera;
|
2023-06-08 14:09:50 +08:00
|
|
|
using UnityEngine;
|
|
|
|
using UnityEngine.Rendering;
|
2023-08-27 02:58:19 +08:00
|
|
|
namespace BITKit.Entities.Player.Character
|
2023-06-08 14:09:50 +08:00
|
|
|
{
|
2023-10-30 01:25:53 +08:00
|
|
|
public class EntityCharacter : EntityPlayerBehavior
|
2023-06-08 14:09:50 +08:00
|
|
|
{
|
|
|
|
[Header(Constant.Header.Components)]
|
2023-08-27 02:58:19 +08:00
|
|
|
[SerializeField] private Renderer[] fpvRenderer = Array.Empty<Renderer>();
|
|
|
|
[SerializeField] private Renderer[] tpvRenderer = Array.Empty<Renderer>();
|
2023-11-30 00:23:23 +08:00
|
|
|
[SerializeField] private Renderer[] fpvOverrideRenderers = Array.Empty<Renderer>();
|
|
|
|
[SerializeField] private Transform[] tpvRendererGroup = Array.Empty<Transform>();
|
2023-06-08 14:09:50 +08:00
|
|
|
[Header(Constant.Header.Reference)]
|
2023-11-15 23:54:54 +08:00
|
|
|
[SerializeReference, SubclassSelector] public IReference getDamage;
|
2023-11-30 00:23:23 +08:00
|
|
|
|
|
|
|
[Inject(true)] private IHealth _health;
|
|
|
|
|
|
|
|
[Inject(true)] private IPlayerCameraService _cameraService;
|
|
|
|
|
|
|
|
[Inject(true)] private IEntityOverride _entityOverride;
|
2024-02-21 01:40:53 +08:00
|
|
|
|
|
|
|
[Inject(true)] private IEntityEquipment _equipment;
|
2023-11-30 00:23:23 +08:00
|
|
|
|
|
|
|
private Renderer[] _tpvRendererGroup;
|
2024-02-21 01:40:53 +08:00
|
|
|
|
|
|
|
private readonly ValidHandle allowFPVOverride = new();
|
2023-11-30 00:23:23 +08:00
|
|
|
|
2023-06-08 14:09:50 +08:00
|
|
|
public override void OnStart()
|
|
|
|
{
|
2023-11-30 00:23:23 +08:00
|
|
|
if (_health is not null)
|
|
|
|
{
|
|
|
|
_health.OnSetAlive += _ => UpdateMeshState();
|
2023-12-15 23:44:39 +08:00
|
|
|
_health.OnDamageRelease += OnDamageRelease;
|
2023-11-30 00:23:23 +08:00
|
|
|
}
|
2023-08-23 01:59:40 +08:00
|
|
|
|
2023-11-30 00:23:23 +08:00
|
|
|
if (_cameraService is not null)
|
|
|
|
_cameraService.OnCameraActivated += _ => UpdateMeshState();
|
|
|
|
|
2024-02-21 01:40:53 +08:00
|
|
|
if (_entityOverride is not null)
|
|
|
|
_entityOverride.OnOverride += _ =>
|
|
|
|
{
|
|
|
|
UpdateMeshState();
|
|
|
|
allowFPVOverride.SetElements(_entityOverride,_);
|
|
|
|
};
|
2023-11-30 00:23:23 +08:00
|
|
|
_tpvRendererGroup = tpvRendererGroup.SelectMany(x => x.GetComponentsInChildren<Renderer>(true)).ToArray();
|
2024-02-21 01:40:53 +08:00
|
|
|
|
|
|
|
if (_equipment is not null)
|
|
|
|
{
|
|
|
|
_equipment.OnEquipAddressable += _ =>
|
|
|
|
{
|
|
|
|
allowFPVOverride.RemoveElement(_equipment);
|
|
|
|
};
|
|
|
|
_equipment.OnUnEquipAddressable += _ =>
|
|
|
|
{
|
|
|
|
allowFPVOverride.AddElement(_equipment);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
allowFPVOverride.AddListener(value =>
|
|
|
|
{
|
|
|
|
foreach (var x in fpvOverrideRenderers)
|
|
|
|
{
|
|
|
|
x.enabled = value;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2024-02-22 16:26:51 +08:00
|
|
|
allowFPVOverride.AddElement(_equipment);
|
2024-02-21 01:40:53 +08:00
|
|
|
allowFPVOverride.Invoke();
|
2023-11-30 00:23:23 +08:00
|
|
|
}
|
2023-08-12 01:43:24 +08:00
|
|
|
public override void OnPlayerInitialized()
|
2023-06-08 14:09:50 +08:00
|
|
|
{
|
2023-11-30 00:23:23 +08:00
|
|
|
UpdateMeshState();
|
2023-06-08 14:09:50 +08:00
|
|
|
}
|
2023-08-12 01:43:24 +08:00
|
|
|
public override void OnPlayerDispose()
|
2023-06-08 14:09:50 +08:00
|
|
|
{
|
|
|
|
SetFPV(false);
|
|
|
|
}
|
2023-12-15 23:44:39 +08:00
|
|
|
// private void OnSetHP(int hp)
|
|
|
|
// {
|
|
|
|
// UnityEntity.Invoke<string>(Constant.Animation.Play, getDamage.Value);
|
|
|
|
// }
|
|
|
|
private void OnDamageRelease(DamageMessage damageMessage)
|
2023-06-08 14:09:50 +08:00
|
|
|
{
|
2023-11-15 23:54:54 +08:00
|
|
|
UnityEntity.Invoke<string>(Constant.Animation.Play, getDamage.Value);
|
2023-06-08 14:09:50 +08:00
|
|
|
}
|
2023-11-30 00:23:23 +08:00
|
|
|
|
|
|
|
private void UpdateMeshState()
|
|
|
|
{
|
|
|
|
switch (_health, _cameraService)
|
|
|
|
{
|
|
|
|
case (null, null):
|
|
|
|
SetFPV(true);
|
|
|
|
break;
|
|
|
|
case (null, not null):
|
|
|
|
SetFPV(_cameraService.IsCameraActivated);
|
|
|
|
break;
|
|
|
|
case (not null, null):
|
|
|
|
SetFPV(_health.IsAlive);
|
|
|
|
break;
|
|
|
|
case (not null, not null):
|
|
|
|
SetFPV(_health.IsAlive && _cameraService.IsCameraActivated);
|
|
|
|
break;
|
|
|
|
}
|
2024-02-22 16:26:51 +08:00
|
|
|
allowFPVOverride.Invoke();
|
2023-11-30 00:23:23 +08:00
|
|
|
}
|
|
|
|
|
2023-08-23 01:59:40 +08:00
|
|
|
private void SetFPV(bool isFpv)
|
2023-06-08 14:09:50 +08:00
|
|
|
{
|
|
|
|
var shadowMode = isFpv ?
|
|
|
|
ShadowCastingMode.ShadowsOnly :
|
|
|
|
ShadowCastingMode.On;
|
|
|
|
foreach (var x in fpvRenderer)
|
|
|
|
{
|
|
|
|
x.enabled = isFpv;
|
|
|
|
}
|
|
|
|
foreach (var x in tpvRenderer)
|
|
|
|
{
|
|
|
|
x.shadowCastingMode = shadowMode;
|
|
|
|
}
|
2023-11-30 00:23:23 +08:00
|
|
|
foreach (var x in _tpvRendererGroup)
|
|
|
|
{
|
|
|
|
x.shadowCastingMode =
|
|
|
|
_entityOverride is not null
|
|
|
|
? _entityOverride.IsOvering ? ShadowCastingMode.On : shadowMode
|
|
|
|
: shadowMode;
|
|
|
|
}
|
2023-06-08 14:09:50 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|