playersoundeventhandler.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. enum EPlayerSoundEventID
  2. {
  3. HOLD_BREATH = 1,
  4. EXHAUSTED_BREATH,
  5. RELEASE_BREATH,
  6. STAMINA_DOWN_LIGHT,
  7. STAMINA_DOWN_HEAVY,
  8. STAMINA_UP_LIGHT,
  9. STAMINA_UP_HEAVY,
  10. STAMINA_UP_END,
  11. STAMINA_NORMAL_DUMMY,
  12. TAKING_DMG_LIGHT,
  13. TAKING_DMG_HEAVY,
  14. SYMPTOM_COUGH,
  15. SYMPTOM_LAUGHTER,
  16. SYMPTOM_SNEEZE,
  17. SYMPTOM_GASP,
  18. JUMP,
  19. MELEE_ATTACK_LIGHT,
  20. MELEE_ATTACK_HEAVY
  21. INJURED_LIGHT,
  22. INJURED_MEDIUM,
  23. INJURED_HIGH,
  24. FREEZING,
  25. HOT,
  26. SYMPTOM_FATIGUE,
  27. STAMINA_LOW_FILTER_UPPER,
  28. STAMINA_LOW_FILTER_MID,
  29. STAMINA_LOW_FILTER_LOWER,
  30. DROWNING_BREATH,
  31. DROWNING_PAIN,
  32. PICKUP_HEAVY,
  33. THIRST,
  34. FORCE_FEED,
  35. FORCE_DRINK,
  36. //--------------
  37. // Count bellow, put enums above
  38. //--------------
  39. ENUM_COUNT,
  40. }
  41. class PlayerSoundEventHandler extends SoundEventHandler
  42. {
  43. PlayerBase m_Player;
  44. const int SOUND_EVENTS_MAX = EPlayerSoundEventID.ENUM_COUNT;
  45. static ref PlayerSoundEventBase m_AvailableStates[SOUND_EVENTS_MAX];
  46. static ref map<int,int> m_ConfigIDToScriptIDmapping = new ref map<int,int> ;
  47. ref PlayerSoundEventBase m_CurrentState;
  48. ref Timer m_UpdateTimer;
  49. void PlayerSoundEventHandler(PlayerBase player)
  50. {
  51. m_Player = player;
  52. if(!m_UpdateTimer && !m_Player.IsControlledPlayer())
  53. {
  54. m_UpdateTimer = new Timer();
  55. m_UpdateTimer.Run(1, this, "OnTick", null, true);//ticking for remotes, the controlled player is ticking on command handler at higher intervals
  56. }
  57. RegisterState(new HoldBreathSoundEvent());
  58. RegisterState(new ExhaustedBreathSoundEvent());
  59. RegisterState(new FatigueSoundEvent());
  60. RegisterState(new ReleaseBreathSoundEvent());
  61. RegisterState(new StaminaDownLight());
  62. RegisterState(new StaminaDownHeavy());
  63. RegisterState(new StaminaUpLight());
  64. RegisterState(new StaminaUpHeavy());
  65. RegisterState(new StaminaUpEnd());
  66. RegisterState(new DamageLightSoundEvent());
  67. RegisterState(new DamageHeavySoundEvent());
  68. RegisterState(new SneezeSoundEvent());
  69. RegisterState(new LaugherSoundEvent());
  70. RegisterState(new CoughSoundEvent());
  71. RegisterState(new GaspSoundEvent());
  72. RegisterState(new JumpSoundEvent());
  73. RegisterState(new MeleeAttackLightEvent());
  74. RegisterState(new MeleeAttackHeavyEvent());
  75. RegisterState(new StaminaNormalDummy());
  76. RegisterState(new InjuryLightSoundEvent());
  77. RegisterState(new InjuryMediumSoundEvent());
  78. RegisterState(new InjuryHeavySoundEvent());
  79. RegisterState(new FreezingSoundEvent());
  80. RegisterState(new HotSoundEvent());
  81. RegisterState(new StaminaLowFilterUpper());
  82. RegisterState(new StaminaLowFilterMid());
  83. RegisterState(new StaminaLowFilterLower());
  84. RegisterState(new DrowningEvent1());
  85. RegisterState(new DrowningEvent2());
  86. RegisterState(new PickupHeavySoundEvent());
  87. RegisterState(new ThirstSoundEvent());
  88. RegisterState(new ForceFeedSoundEvent());
  89. RegisterState(new ForceDrinkSoundEvent());
  90. }
  91. void RegisterState(PlayerSoundEventBase state)
  92. {
  93. int index = state.GetSoundEventID();
  94. m_AvailableStates[index] = state;
  95. m_ConfigIDToScriptIDmapping.Insert(state.GetSoundVoiceAnimEventClassID(),index);
  96. }
  97. void OnTick(float delta_time)
  98. {
  99. if (m_CurrentState)
  100. {
  101. if( m_CurrentState.IsFinished())
  102. m_CurrentState = null;
  103. else
  104. m_CurrentState.OnTick(delta_time);
  105. }
  106. }
  107. int ConvertAnimIDtoEventID(int anim_id)
  108. {
  109. return m_ConfigIDToScriptIDmapping.Get(anim_id);
  110. }
  111. override static EPlayerSoundEventType GetSoundEventType(int id)
  112. {
  113. return m_AvailableStates[id].GetSoundEventType();
  114. }
  115. override int GetCurrentStateEventID()
  116. {
  117. if(m_CurrentState)
  118. {
  119. return m_CurrentState.GetSoundEventID();
  120. }
  121. return -1;
  122. }
  123. override int GetCurrentStateEventType()
  124. {
  125. if(m_CurrentState)
  126. {
  127. return m_CurrentState.GetSoundEventType();
  128. }
  129. return -1;
  130. }
  131. override bool PlayRequestEx(EPlayerSoundEventID id, bool sent_from_server = false, int param = 0)
  132. {
  133. if (id < 0 || id > (SOUND_EVENTS_MAX - 1))
  134. {
  135. Error("EPlayerSoundEventID out of bounds");
  136. }
  137. PlayerSoundEventBase requested_state = m_AvailableStates[id];
  138. if ( sent_from_server && (param & EPlayerSoundEventParam.SKIP_CONTROLLED_PLAYER) && m_Player.GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT )
  139. {
  140. return false;
  141. }
  142. if ( !requested_state.CanPlay(m_Player) )
  143. {
  144. return false;
  145. }
  146. if (m_CurrentState)
  147. {
  148. if (param & EPlayerSoundEventParam.HIGHEST_PRIORITY)
  149. {
  150. m_CurrentState.Stop();
  151. }
  152. else
  153. {
  154. int current_type = m_CurrentState.GetSoundEventType();
  155. //int requested_type = requested_state.GetSoundEventType();
  156. if ( (requested_state.GetPriorityOverTypes() & current_type) == 0 )
  157. {
  158. return false;
  159. }
  160. if (!requested_state.HasPriorityOverCurrent(m_Player, id, current_type) )
  161. {
  162. return false;
  163. }
  164. m_CurrentState.Stop();
  165. }
  166. }
  167. m_CurrentState = PlayerSoundEventBase.Cast(requested_state.ClassName().ToType().Spawn());
  168. m_CurrentState.InitEx(m_Player, param);
  169. if (m_CurrentState.Play())
  170. {
  171. m_CurrentState.OnPlay(m_Player);
  172. }
  173. return true;
  174. }
  175. override bool PlayRequest(EPlayerSoundEventID id, bool sent_from_server = false)
  176. {
  177. return PlayRequestEx(id, sent_from_server);
  178. }
  179. }