BITFALL/Assets/Artists/Scripts/Entities/Character/EntityCharacter.cs

211 lines
7.3 KiB
C#
Raw Normal View History

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-03-18 18:20:23 +08:00
using BITFALL.Cosmetic;
2024-02-21 01:40:53 +08:00
using BITFALL.Entities.Equipment;
2024-03-17 02:24:55 +08:00
using BITFALL.Player.Movement;
2023-11-30 00:23:23 +08:00
using BITKit.PlayerCamera;
2024-03-19 20:16:48 +08:00
using Cysharp.Threading.Tasks;
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
{
2024-03-18 18:20:23 +08:00
[DictionaryReferenceConfig(nameof(Player_Mesh_Type_FPV))]
public const string Player_Mesh_Type_FPV = nameof(Player_Mesh_Type_FPV);
[DictionaryReferenceConfig(nameof(Player_Mesh_Type_TPV))]
public const string Player_Mesh_Type_TPV = nameof(Player_Mesh_Type_TPV);
[DictionaryReferenceConfig(nameof(Player_Mesh_Type_FPVOverride))]
public const string Player_Mesh_Type_FPVOverride = nameof(Player_Mesh_Type_FPVOverride);
[DictionaryReferenceConfig(nameof(Player_Mesh_Type_TPV_Group))]
public const string Player_Mesh_Type_TPV_Group = nameof(Player_Mesh_Type_TPV_Group);
private readonly List<Renderer> fpvRenderer = new();
private readonly List<Renderer> tpvRenderer = new();
private readonly List<Renderer> fpvOverrideRenderers = new();
private readonly List<Renderer> tpvRendererGroup = new();
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;
2024-03-18 18:20:23 +08:00
[Inject(true)] private ICosmeticService cosmeticService;
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
2024-03-17 02:24:55 +08:00
[Inject(true)] private IEntityMovement _movement;
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
2024-03-18 18:20:23 +08:00
public override void OnAwake()
{
base.OnAwake();
if(cosmeticService is not null)
cosmeticService.OnCosmeticsChanged += Rebuild;
}
2024-03-19 20:16:48 +08:00
2024-03-18 18:20: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();
2024-03-19 20:16:48 +08:00
allowFPVOverride.SetElements(_entityOverride, _);
2024-02-21 01:40:53 +08:00
};
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)
{
2024-03-19 20:16:48 +08:00
_equipment.OnEquipAddressable += _ => { allowFPVOverride.RemoveElement(_equipment); };
_equipment.OnUnEquipAddressable += _ => { allowFPVOverride.AddElement(_equipment); };
2024-02-21 01:40:53 +08:00
}
2024-03-17 02:24:55 +08:00
if (_movement is not null)
{
_movement.OnStateChanged += OnNewState;
2024-03-19 20:16:48 +08:00
OnNewState(null, _movement.CurrentState);
2024-03-17 02:24:55 +08:00
void OnNewState(IEntityMovementState oldState, IEntityMovementState newState)
{
allowFPVOverride.SetDisableElements(_movement, newState switch
{
IPlayerEdgeClimbState => false,
IPlayerClimbState => false,
IPlayerVaultState => false,
IPlayerKnockdownState => false,
IPlayerSlideState => false,
IPlayerFixedState => false,
IPlayerLinkState => false,
_ => true,
});
}
}
2024-03-19 20:16:48 +08:00
2024-02-21 01:40:53 +08:00
allowFPVOverride.AddListener(value =>
{
foreach (var x in fpvOverrideRenderers)
{
x.enabled = value;
}
});
2024-03-19 20:16:48 +08:00
// if (_equipment is not null)
// allowFPVOverride.AddElement(_equipment);
2024-03-18 18:20:23 +08:00
Rebuild();
2023-11-30 00:23:23 +08:00
}
2024-03-19 20:16:48 +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()
{
2024-03-19 20:16:48 +08:00
allowFPVOverride.Invoke();
2023-11-30 00:23:23 +08:00
switch (_health, _cameraService)
{
case (null, null):
2024-03-19 20:16:48 +08:00
SetFPV(false);
allowFPVOverride.Invoke(false);
2023-11-30 00:23:23 +08:00
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-03-19 20:16:48 +08:00
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
}
2024-03-18 18:20:23 +08:00
[BIT]
2024-03-19 20:16:48 +08:00
private async void Rebuild()
2024-03-18 18:20:23 +08:00
{
2024-03-22 20:16:32 +08:00
BITAppForUnity.ThrowIfNotPlaying();
2024-03-19 20:16:48 +08:00
await UniTask.Delay(100);
await UniTask.SwitchToMainThread();
if (destroyCancellationToken.IsCancellationRequested) return;
2024-03-18 18:20:23 +08:00
fpvRenderer.Clear();
tpvRenderer.Clear();
fpvOverrideRenderers.Clear();
tpvRendererGroup.Clear();
foreach (var _tag in GetComponentsInChildren<Tag>(true))
{
if (_tag.TryGetComponent<Renderer>(out var _renderer) is false) continue;
var tags = _tag.GetTags();
if (tags.Contains(Player_Mesh_Type_FPV))
fpvRenderer.Add(_renderer);
if (tags.Contains(Player_Mesh_Type_TPV))
tpvRenderer.Add(_renderer);
if (tags.Contains(Player_Mesh_Type_FPVOverride))
fpvOverrideRenderers.Add(_renderer);
if (tags.Contains(Player_Mesh_Type_TPV_Group))
tpvRendererGroup.Add(_renderer);
}
UpdateMeshState();
allowFPVOverride.Invoke();
2024-03-19 20:16:48 +08:00
2024-03-18 18:20:23 +08:00
}
2023-06-08 14:09:50 +08:00
}
}