mask.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. class MaskMdfr: ModifierBase
  2. {
  3. const float IN_AREA_CONSUME_FILTER_QUANTITY_PER_SEC = 0.3;
  4. const float OUT_AREA_CONSUME_FILTER_QUANTITY_PER_SEC = 0.03;
  5. const float STAMINA_RECOVERY_MODIFIER = 0.5;
  6. const float STAMINA_DEPLETION_MODIFIER = 1.25;
  7. const float LOW_FILTER_SOUND_EVENT_MIN = 3;
  8. const float LOW_FILTER_SOUND_EVENT_MAX = 9;
  9. const float LOW_FILTER_SOUND_THRESHOLD = 0.2;//[0..1] , what's the filter quantity between 0 and 1 at which low filter sounds begin playing ?
  10. float m_SoundTimeAccu1;
  11. float m_NextSoundEventTime;
  12. override void Init()
  13. {
  14. m_TrackActivatedTime = false;
  15. m_AnalyticsStatsEnabled = true;
  16. m_ID = eModifiers.MDF_MASK;
  17. m_TickIntervalInactive = DEFAULT_TICK_TIME_INACTIVE;
  18. m_TickIntervalActive = DEFAULT_TICK_TIME_ACTIVE_SHORT;
  19. }
  20. override bool ActivateCondition(PlayerBase player)
  21. {
  22. return MaskBase.Cast(player.GetInventory().FindAttachment(InventorySlots.MASK)) != null;
  23. }
  24. override bool DeactivateCondition(PlayerBase player)
  25. {
  26. return !ActivateCondition( player);
  27. }
  28. override void OnTick(PlayerBase player, float deltaT)
  29. {
  30. MaskBase mask = MaskBase.Cast(player.GetInventory().FindAttachment(InventorySlots.MASK));
  31. float consume_quantity = OUT_AREA_CONSUME_FILTER_QUANTITY_PER_SEC;
  32. bool inside_area = m_Manager.IsModifierActive(eModifiers.MDF_AREAEXPOSURE);
  33. if(inside_area)
  34. {
  35. consume_quantity = IN_AREA_CONSUME_FILTER_QUANTITY_PER_SEC;
  36. }
  37. if ( mask && !mask.IsDamageDestroyed())
  38. {
  39. bool consuming_filter = mask.ConsumeQuantity(consume_quantity * deltaT, player);
  40. StaminaSoundHandlerServer.Cast(player.GetPlayerSoundManagerServer().GetHandler(eSoundHandlers.STAMINA)).SetStaminaZoneOffset(1);
  41. if (mask.HasValidFilter())
  42. {
  43. player.GetStaminaHandler().ActivateRecoveryModifier(EStaminaMultiplierTypes.MASK);
  44. player.GetStaminaHandler().ActivateDepletionModifier(EStaminaMultiplierTypes.MASK);
  45. }
  46. else
  47. {
  48. player.GetStaminaHandler().DeactivateRecoveryModifier(EStaminaMultiplierTypes.MASK);
  49. player.GetStaminaHandler().DeactivateDepletionModifier(EStaminaMultiplierTypes.MASK);
  50. }
  51. HandleSounds(player, deltaT, mask);
  52. }
  53. }
  54. void HandleSounds(PlayerBase player, float deltaT, MaskBase mask)
  55. {
  56. float filter_quantity_01 = mask.GetFilterQuantity01();
  57. if(mask.CanHaveExternalFilter() && !mask.IsExternalFilterAttached())
  58. return;
  59. if(filter_quantity_01 > LOW_FILTER_SOUND_THRESHOLD)
  60. return;
  61. float low_quantity_norm = Math.InverseLerp(0, LOW_FILTER_SOUND_THRESHOLD, filter_quantity_01);//should give us 0..1 based on normalized quantity between 0 and LOW_FILTER_SOUND_THRESHOLD
  62. m_SoundTimeAccu1 += deltaT;
  63. if( m_SoundTimeAccu1 >= m_NextSoundEventTime)
  64. {
  65. m_NextSoundEventTime = Math.Lerp(LOW_FILTER_SOUND_EVENT_MIN, LOW_FILTER_SOUND_EVENT_MAX,low_quantity_norm);
  66. EPlayerSoundEventID event_type = EPlayerSoundEventID.STAMINA_LOW_FILTER_UPPER;
  67. //under 50% of low filter quantity (not overall filter quantity!!)
  68. if (low_quantity_norm < 0.5)
  69. {
  70. event_type = EPlayerSoundEventID.STAMINA_LOW_FILTER_MID;
  71. }
  72. if (low_quantity_norm < 0.25)
  73. {
  74. event_type = EPlayerSoundEventID.STAMINA_LOW_FILTER_LOWER;
  75. }
  76. player.RequestSoundEventEx(event_type, false, EPlayerSoundEventParam.HIGHEST_PRIORITY);
  77. m_SoundTimeAccu1 = 0;
  78. }
  79. }
  80. override void OnReconnect(PlayerBase player)
  81. {
  82. OnActivate(player);
  83. }
  84. override void OnActivate(PlayerBase player)
  85. {
  86. //m_NextSoundEventTime = Math.RandomFloat(LOW_FILTER_SOUND_EVENT_MIN, LOW_FILTER_SOUND_EVENT_MAX);
  87. }
  88. override void OnDeactivate(PlayerBase player)
  89. {
  90. StaminaSoundHandlerServer.Cast(player.GetPlayerSoundManagerServer().GetHandler(eSoundHandlers.STAMINA)).SetStaminaZoneOffset(0);
  91. player.GetStaminaHandler().DeactivateRecoveryModifier(EStaminaMultiplierTypes.MASK);
  92. player.GetStaminaHandler().DeactivateDepletionModifier(EStaminaMultiplierTypes.MASK);
  93. }
  94. };