using UnityEngine; [RequireComponent(typeof(vp_FPPlayerEventHandler))] public class vp_FPPlayerDamageHandler : vp_PlayerDamageHandler { public float CameraShakeFactor = 0.02f; protected float m_DamageAngle; protected float m_DamageAngleFactor = 1f; protected vp_FPPlayerEventHandler m_FPPlayer; protected vp_FPCamera m_FPCamera; protected CharacterController m_CharacterController; protected vp_FPPlayerEventHandler FPPlayer { get { if (m_FPPlayer == null) { m_FPPlayer = base.transform.GetComponent(); } return m_FPPlayer; } } protected vp_FPCamera FPCamera { get { if (m_FPCamera == null) { m_FPCamera = base.transform.GetComponentInChildren(); } return m_FPCamera; } } protected CharacterController CharacterController { get { if (m_CharacterController == null) { m_CharacterController = base.transform.root.GetComponentInChildren(); } return m_CharacterController; } } protected override void OnEnable() { if (FPPlayer != null) { FPPlayer.Register(this); } RefreshColliders(); } protected override void OnDisable() { if (FPPlayer != null) { FPPlayer.Unregister(this); } } protected virtual void Update() { if (FPPlayer.Dead.Active && Time.timeScale < 1f) { vp_TimeUtility.FadeTimeScale(1f, 0.05f); } } public override void Damage(float damage) { if (base.enabled && vp_Utility.IsActive(base.gameObject)) { base.Damage(damage); FPPlayer.HUDDamageFlash.Send(new vp_DamageInfo(damage, null)); FPPlayer.HeadImpact.Send((!(Random.value < 0.5f)) ? (0f - damage * CameraShakeFactor) : (damage * CameraShakeFactor)); } } public override void Damage(vp_DamageInfo damageInfo) { if (base.enabled && vp_Utility.IsActive(base.gameObject)) { base.Damage(damageInfo); FPPlayer.HUDDamageFlash.Send(damageInfo); if (damageInfo.Source != null) { m_DamageAngle = vp_3DUtility.LookAtAngleHorizontal(FPCamera.Transform.position, FPCamera.Transform.forward, damageInfo.Source.position); m_DamageAngleFactor = ((!(Mathf.Abs(m_DamageAngle) > 30f)) ? Mathf.Lerp(0f, 1f, Mathf.Abs(m_DamageAngle) * 0.033f) : 1f); FPPlayer.HeadImpact.Send(damageInfo.Damage * CameraShakeFactor * m_DamageAngleFactor * (float)((m_DamageAngle < 0f) ? 1 : (-1))); } } } public override void Die() { base.Die(); if (base.enabled && vp_Utility.IsActive(base.gameObject)) { FPPlayer.InputAllowGameplay.Set(false); } } public virtual void RefreshColliders() { if (!(CharacterController != null) || !CharacterController.enabled) { return; } foreach (Collider collider in base.Colliders) { if (collider.enabled) { Physics.IgnoreCollision(CharacterController, collider, true); } } } protected override void Reset() { base.Reset(); if (Application.isPlaying) { FPPlayer.InputAllowGameplay.Set(true); FPPlayer.HUDDamageFlash.Send(null); RefreshColliders(); } } private void OnStart_Crouch() { RefreshColliders(); } private void OnStop_Crouch() { RefreshColliders(); } }