playersoundmanager.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. const float SOUNDS_HEARING_DISTANCE = 50;
  2. enum eSoundHandlers
  3. {
  4. STAMINA,
  5. HUNGER,
  6. INJURY,
  7. THIRST,
  8. //FREEZING,
  9. //------
  10. // add stuff above !
  11. //------
  12. COUNT
  13. }
  14. class PlayerSoundManagerBase
  15. {
  16. PlayerBase m_Player;
  17. const int MAX_HANDLERS_COUNT = eSoundHandlers.COUNT;
  18. ref SoundHandlerBase m_Handlers[MAX_HANDLERS_COUNT];
  19. void PlayerSoundManagerBase(PlayerBase player)
  20. {
  21. m_Player = player;
  22. Init();
  23. }
  24. void RegisterHandler(SoundHandlerBase handler)
  25. {
  26. int index = handler.GetID();
  27. m_Handlers[index] = handler;
  28. }
  29. SoundHandlerBase GetHandler(eSoundHandlers id)
  30. {
  31. return m_Handlers[id];
  32. }
  33. void Init()
  34. {
  35. }
  36. void Update()
  37. {
  38. }
  39. }
  40. class PlayerSoundManagerServer extends PlayerSoundManagerBase
  41. {
  42. //------------------------
  43. // REGISTER HANDLER HERE
  44. //------------------------
  45. override void Init()
  46. {
  47. RegisterHandler(new StaminaSoundHandlerServer(m_Player));
  48. RegisterHandler(new HungerSoundHandlerServer(m_Player));
  49. RegisterHandler(new ThirstSoundHandlerServer(m_Player));
  50. RegisterHandler(new InjurySoundHandlerServer(m_Player));
  51. }
  52. override void Update()
  53. {
  54. if( m_Player.IsUnconscious() )
  55. {
  56. return;
  57. }
  58. for(int i = 0; i < (MAX_HANDLERS_COUNT - 1); i++)
  59. {
  60. m_Handlers[i].Update();
  61. }
  62. }
  63. }
  64. class PlayerSoundManagerClient extends PlayerSoundManagerBase
  65. {
  66. ref Timer m_ClientCharacterTick = new Timer;
  67. ref Timer m_ClientCharacterDistanceCheck = new Timer;
  68. bool m_UpdateTimerRunning;
  69. //------------------------
  70. // REGISTER HANDLER HERE
  71. //------------------------
  72. override void Init()
  73. {
  74. RegisterHandler(new StaminaSoundHandlerClient(m_Player));
  75. RegisterHandler(new HungerSoundHandlerClient(m_Player));
  76. RegisterHandler(new ThirstSoundHandlerClient(m_Player));
  77. RegisterHandler(new InjurySoundHandlerClient(m_Player));
  78. //RegisterHandler(new FreezingSoundHandlerClient(m_Player));
  79. }
  80. void PlayerSoundManagerClient(PlayerBase player)
  81. {
  82. if( !GetGame().IsDedicatedServer() )
  83. {
  84. m_ClientCharacterDistanceCheck.Run(2, this, "CheckAllowUpdate", null, true);
  85. }
  86. }
  87. void SetAllowUpdate(bool enable)
  88. {
  89. if( enable )
  90. {
  91. m_UpdateTimerRunning = true;
  92. m_ClientCharacterTick.Run(0.03, this, "Update", null, true);
  93. }
  94. else
  95. {
  96. m_UpdateTimerRunning = false;
  97. m_ClientCharacterTick.Stop();
  98. }
  99. }
  100. override void Update()
  101. {
  102. if( !m_Player.IsAlive() )
  103. {
  104. SetAllowUpdate(false);
  105. return;
  106. }
  107. #ifndef NO_GUI
  108. for(int i = 0; i < MAX_HANDLERS_COUNT; i++)
  109. {
  110. m_Handlers[i].Update();
  111. }
  112. #endif
  113. }
  114. void CheckAllowUpdate()
  115. {
  116. if( GetGame().GetPlayer() )
  117. {
  118. bool is_at_hearing_distance = vector.Distance(GetGame().GetPlayer().GetPosition(), m_Player.GetPosition()) < SOUNDS_HEARING_DISTANCE;
  119. if( m_UpdateTimerRunning && !is_at_hearing_distance )
  120. {
  121. SetAllowUpdate(false);
  122. }
  123. else if( !m_UpdateTimerRunning && is_at_hearing_distance )
  124. {
  125. SetAllowUpdate(true);
  126. }
  127. //PrintString("distance:" + vector.Distance(GetGame().GetPlayer().GetPosition(), m_Player.GetPosition()).ToString());
  128. }
  129. }
  130. }