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

248 lines
8.6 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();
2024-03-29 00:58:24 +08:00
private readonly List<Renderer> tpvOverrideRenderers = new();
2024-03-18 18:20:23 +08:00
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;
2024-02-21 01:40:53 +08:00
private readonly ValidHandle allowFPVOverride = new();
2024-03-29 00:58:24 +08:00
private readonly IntervalUpdate _freezeInterval=new (0.01f);
private bool _isDirty;
private bool _lock;
2023-11-30 00:23:23 +08:00
2024-03-29 00:58:24 +08:00
private void OnCosmeticsChange()
2024-03-18 18:20:23 +08:00
{
2024-03-29 00:58:24 +08:00
_lock = true;
2024-03-18 18:20:23 +08:00
}
2024-03-29 00:58:24 +08:00
public override void OnAwake()
2023-06-08 14:09:50 +08:00
{
2024-03-29 00:58:24 +08:00
if (cosmeticService is not null)
{
cosmeticService.OnCosmeticsChange += OnCosmeticsChange;
cosmeticService.OnCosmeticsChanged += OnCosmeticsChanged;
}
2023-11-30 00:23:23 +08:00
if (_health is not null)
{
2024-03-29 00:58:24 +08:00
_health.OnSetAlive += SetDirty;
2023-12-15 23:44:39 +08:00
_health.OnDamageRelease += OnDamageRelease;
2023-11-30 00:23:23 +08:00
}
if (_cameraService is not null)
2024-03-29 00:58:24 +08:00
_cameraService.OnCameraActivated += SetDirty;
2023-11-30 00:23:23 +08:00
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
};
2024-03-29 00:58:24 +08:00
2024-02-21 01:40:53 +08:00
if (_equipment is not null)
{
2024-04-19 00:40:34 +08:00
_equipment.OnEquipAddressable += OnEquipmentOnOnEquipAddressable;
_equipment.OnUnEquipAddressable += OnEquipmentOnOnUnEquipAddressable;
void OnEquipmentOnOnUnEquipAddressable(string _)
{
allowFPVOverride.AddElement(_equipment);
allowFPVOverride.RemoveDisableElements(_equipment);
}
void OnEquipmentOnOnEquipAddressable(string _)
{
allowFPVOverride.RemoveElement(_equipment);
allowFPVOverride.AddDisableElements(_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)
{
2024-04-19 00:40:34 +08:00
var allow = newState switch
2024-03-17 02:24:55 +08:00
{
2024-04-19 00:40:34 +08:00
IPlayerEdgeClimbState => true,
IPlayerClimbState => true,
IPlayerVaultState => true,
IPlayerKnockdownState => true,
IPlayerSlideState => true,
IPlayerFixedState => true,
IPlayerLinkState => true,
IPlayerCrawlState=>true,
_ => false,
};
allowFPVOverride.SetElements(_movement,allow);
allowFPVOverride.SetDisableElements(_movement,!allow);
2024-03-17 02:24:55 +08:00
}
}
2024-03-19 20:16:48 +08:00
2024-02-21 01:40:53 +08:00
allowFPVOverride.AddListener(value =>
{
foreach (var x in fpvOverrideRenderers)
{
2024-03-29 00:58:24 +08:00
try
{
x.enabled = value;
}
catch (Exception e)
{
BIT4Log.LogException(e);
}
2024-02-21 01:40:53 +08:00
}
});
2023-11-30 00:23:23 +08:00
}
2024-03-19 20:16:48 +08:00
2024-03-29 00:58:24 +08:00
public override void OnDestroyComponent()
2023-06-08 14:09:50 +08:00
{
2024-03-29 00:58:24 +08:00
base.OnDestroyComponent();
if (cosmeticService is null) return;
cosmeticService.OnCosmeticsChange -= OnCosmeticsChange;
cosmeticService.OnCosmeticsChanged -= OnCosmeticsChanged;
2023-06-08 14:09:50 +08:00
}
2024-03-29 00:58:24 +08:00
public override void OnUpdate(float deltaTime)
2023-06-08 14:09:50 +08:00
{
2024-03-29 00:58:24 +08:00
if (!_isDirty || _lock || !_freezeInterval.AllowUpdateWithoutReset) return;
_isDirty = false;
UpdateMeshState();
2023-06-08 14:09:50 +08:00
}
2024-03-29 00:58:24 +08:00
2023-12-15 23:44:39 +08:00
private void OnDamageRelease(DamageMessage damageMessage)
2023-06-08 14:09:50 +08:00
{
2024-03-29 00:58:24 +08:00
if (getDamage is not null)
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;
}
2024-03-29 00:58:24 +08:00
foreach (var x in tpvOverrideRenderers)
2023-11-30 00:23:23 +08:00
{
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-29 00:58:24 +08:00
private void OnCosmeticsChanged()
2024-03-18 18:20:23 +08:00
{
2024-03-29 00:58:24 +08:00
_lock = true;
2024-03-22 20:16:32 +08:00
BITAppForUnity.ThrowIfNotPlaying();
2024-03-18 18:20:23 +08:00
fpvRenderer.Clear();
tpvRenderer.Clear();
fpvOverrideRenderers.Clear();
2024-03-29 00:58:24 +08:00
tpvOverrideRenderers.Clear();
var _tpvOverrideRenderers = new List<Transform>();
2024-03-18 18:20:23 +08:00
foreach (var _tag in GetComponentsInChildren<Tag>(true))
{
var tags = _tag.GetTags();
2024-03-29 00:58:24 +08:00
if (tags.Contains(Player_Mesh_Type_TPV_Group))
_tpvOverrideRenderers.Add(_tag.transform);
if (_tag.TryGetComponent<Renderer>(out var _renderer) is false) continue;
2024-03-18 18:20:23 +08:00
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);
}
2024-03-29 00:58:24 +08:00
var tpvRenderers = _tpvOverrideRenderers.SelectMany(x => x.GetComponentsInChildren<Renderer>(true));
tpvOverrideRenderers.Clear();
tpvOverrideRenderers.AddRange(tpvRenderers);
2024-03-18 18:20:23 +08:00
UpdateMeshState();
allowFPVOverride.Invoke();
2024-03-29 00:58:24 +08:00
_lock = false;
_isDirty = false;
}
private void SetDirty(bool any) => SetDirty();
private void SetDirty()
{
_freezeInterval.Reset();
_isDirty = true;
2024-03-18 18:20:23 +08:00
}
2023-06-08 14:09:50 +08:00
}
}