pluginpresencenotifier.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. enum EPresenceNotifierNoiseEventType
  2. {
  3. LAND_LIGHT,
  4. LAND_HEAVY,
  5. }
  6. class PresenceNotifierNoiseEvent
  7. {
  8. protected float m_TimerLength;
  9. protected int m_Value;
  10. void PresenceNotifierNoiseEvent(float pValue, float pLength)
  11. {
  12. m_Value = pValue;
  13. m_TimerLength = pLength;
  14. }
  15. float GetTimerLength()
  16. {
  17. return m_TimerLength;
  18. }
  19. int GetValue()
  20. {
  21. return m_Value;
  22. }
  23. }
  24. class PresenceNotifierNoiseEvents
  25. {
  26. protected int m_Value;
  27. protected static ref map<EPresenceNotifierNoiseEventType, ref PresenceNotifierNoiseEvent> m_PresenceNotifierNotifierEvents;
  28. protected ref Timer m_CooldownTimer;
  29. void PresenceNotifierNoiseEvents()
  30. {
  31. m_Value = 0;
  32. m_CooldownTimer = new Timer(CALL_CATEGORY_SYSTEM);
  33. m_PresenceNotifierNotifierEvents = new ref map<EPresenceNotifierNoiseEventType, ref PresenceNotifierNoiseEvent>();
  34. }
  35. void RegisterEvent(EPresenceNotifierNoiseEventType pEventType, int pValue, float pLength)
  36. {
  37. PresenceNotifierNoiseEvent pnne = new PresenceNotifierNoiseEvent(pValue, pLength);
  38. m_PresenceNotifierNotifierEvents.Insert(pEventType, pnne);
  39. }
  40. void ProcessEvent(EPresenceNotifierNoiseEventType pEventType)
  41. {
  42. PresenceNotifierNoiseEvent pnne = m_PresenceNotifierNotifierEvents.Get(pEventType);
  43. if (m_CooldownTimer.IsRunning())
  44. m_CooldownTimer.Stop();
  45. m_Value = pnne.GetValue();
  46. m_CooldownTimer.Run(pnne.GetTimerLength(), this, "ResetEvent", null);
  47. }
  48. int GetValue()
  49. {
  50. return m_Value;
  51. }
  52. protected void ResetEvent()
  53. {
  54. m_Value = 0;
  55. }
  56. }
  57. class PluginPresenceNotifier : PluginBase
  58. {
  59. //! dbgUI settings
  60. const int windowPosX = 0;
  61. const int windowPosY = 10;
  62. const int mainPanelSizeX = 200;
  63. const int mainPanelSizeY = 1;
  64. const int margin = 10;
  65. //! noise limits
  66. const int NOISE_LEVEL_MIN = 0;
  67. const int NOISE_LEVEL_MAX = 5;
  68. //! noise component from surfaces
  69. const int SURFACE_NOISE_LVL0 = 0;
  70. const int SURFACE_NOISE_LVL1 = 1;
  71. const int SURFACE_NOISE_LVL2 = 2;
  72. const float SURFACE_LVL2_THRESHOLD = 1.0;
  73. const float SURFACE_LVL1_THRESHOLD = 0.5;
  74. //! land noise
  75. const int LAND_NOISE_LVL1 = 2;
  76. const int LAND_NOISE_LVL2 = 3;
  77. //! --------------------------------------
  78. protected PlayerBase m_pPlayer;
  79. protected Weather m_Weather;
  80. protected ref PresenceNotifierNoiseEvents m_PresenceNotifierNoiseEvents;
  81. void PluginPresenceNotifier()
  82. {
  83. m_PresenceNotifierNoiseEvents = new PresenceNotifierNoiseEvents();
  84. m_PresenceNotifierNoiseEvents.RegisterEvent(EPresenceNotifierNoiseEventType.LAND_LIGHT, LAND_NOISE_LVL1, 0.25);
  85. m_PresenceNotifierNoiseEvents.RegisterEvent(EPresenceNotifierNoiseEventType.LAND_HEAVY, LAND_NOISE_LVL2, 0.25);
  86. }
  87. void Init(PlayerBase player)
  88. {
  89. m_pPlayer = player;
  90. m_Weather = GetGame().GetWeather();
  91. }
  92. void EnableDebug(bool pEnabled)
  93. {
  94. ShowCoefsDbg(pEnabled);
  95. }
  96. protected void ShowCoefsDbg(bool pEnabled)
  97. {
  98. DbgUI.BeginCleanupScope();
  99. if (pEnabled && m_pPlayer)
  100. {
  101. HumanMovementState hms = new HumanMovementState();
  102. m_pPlayer.GetMovementState(hms);
  103. string visualAlertLevel;
  104. string noiseAlertLevel;
  105. DbgUI.Begin("Presence Notifier", windowPosX + 10, windowPosY);
  106. DbgUI.Panel("MinimumSize", mainPanelSizeX, mainPanelSizeY);
  107. DbgUI.Text("Visual: ");
  108. DbgUI.Text("Visibility: " + m_pPlayer.GetVisibilityCoef());
  109. DbgUI.Text("Speed: " + GetMovementSpeedVisualCoef());
  110. DbgUI.Text("Stance: " + GetMovementStanceVisualCoef());
  111. DbgUI.Spacer(10);
  112. DbgUI.Panel("-- Noises", mainPanelSizeX, 2);
  113. DbgUI.Text("Noises: ");
  114. DbgUI.Text("Speed: " + NoiseAIEvaluate.GetNoiseMultiplierByPlayerSpeed(m_pPlayer));
  115. DbgUI.Text("Boots: " + NoiseAIEvaluate.GetNoiseMultiplierByShoes(m_pPlayer));
  116. DbgUI.Text("Surface: " + NoiseAIEvaluate.GetNoiseMultiplierBySurface(m_pPlayer) + " [ cfg: " + m_pPlayer.GetSurfaceNoise() + "]");
  117. DbgUI.Spacer(10);
  118. DbgUI.Panel("-- Noise reductions", mainPanelSizeX, 2);
  119. DbgUI.Text("Noise reductions: ");
  120. DbgUI.Text("Weather: " + NoiseAIEvaluate.GetNoiseReduction(m_Weather));
  121. DbgUI.Spacer(10);
  122. DbgUI.Panel("-- Result", mainPanelSizeX, 2);
  123. DbgUI.Text("Result: ");
  124. visualAlertLevel = "";
  125. for (int iv = 0; iv < GetVisualPresence(); iv++)
  126. {
  127. visualAlertLevel += "!";
  128. }
  129. DbgUI.Text("Visual level: " + GetVisualPresence() + " [" + visualAlertLevel + "]");
  130. noiseAlertLevel = "";
  131. for (int ia = 0; ia < GetNoisePresence(); ia++)
  132. {
  133. noiseAlertLevel += "!";
  134. }
  135. DbgUI.Text("Noise level: " + GetNoisePresence() + " [" + noiseAlertLevel + "]");
  136. DbgUI.End();
  137. //! HumanMovementState content
  138. DbgUI.Begin("HumanMovementState", windowPosX + 250, windowPosY);
  139. DbgUI.Panel("MinimumSize", mainPanelSizeX, mainPanelSizeY);
  140. DbgUI.Text("Command ID: " + hms.m_CommandTypeId);
  141. DbgUI.Text("Stance: " + hms.m_iStanceIdx);
  142. DbgUI.Text("Movement: " + hms.m_iMovement);
  143. DbgUI.End();
  144. }
  145. DbgUI.EndCleanupScope();
  146. }
  147. //! returns actual noise presence of player
  148. int GetNoisePresence()
  149. {
  150. return ProcessNoiseComponents();
  151. }
  152. //! returns actual visibility presence of player
  153. int GetVisualPresence()
  154. {
  155. return ProcessVisualComponents();
  156. }
  157. //! processing of external one-time events (land, fire, etc.)
  158. void ProcessEvent(EPresenceNotifierNoiseEventType pEventType)
  159. {
  160. m_PresenceNotifierNoiseEvents.ProcessEvent(pEventType);
  161. }
  162. protected int ProcessVisualComponents()
  163. {
  164. float visualMean = 0;
  165. if (m_pPlayer)
  166. {
  167. visualMean = (m_pPlayer.GetVisibilityCoef() + GetMovementSpeedVisualCoef() + GetMovementStanceVisualCoef()) / 3;
  168. }
  169. return visualMean;
  170. }
  171. protected int ProcessNoiseComponents()
  172. {
  173. float noise = 0;
  174. float reduction = 0;
  175. if (m_pPlayer)
  176. {
  177. noise = NoiseAIEvaluate.GetNoiseMultiplier(m_pPlayer) * NoiseAIEvaluate.GetNoiseReduction(GetGame().GetWeather());
  178. noise = Math.Round(noise * NOISE_LEVEL_MAX);
  179. }
  180. return Math.Clamp(noise, NOISE_LEVEL_MIN, NOISE_LEVEL_MAX);
  181. }
  182. //! Visibility
  183. protected float GetMovementSpeedVisualCoef()
  184. {
  185. HumanMovementState hms = new HumanMovementState();
  186. float speedCoef = 1.0;
  187. m_pPlayer.GetMovementState(hms);
  188. switch (AITargetCallbacksPlayer.StanceToMovementIdxTranslation(hms))
  189. {
  190. case DayZPlayerConstants.MOVEMENTIDX_RUN:
  191. speedCoef = 0.66;
  192. break;
  193. case DayZPlayerConstants.MOVEMENTIDX_WALK:
  194. speedCoef = 0.33;
  195. break;
  196. case DayZPlayerConstants.MOVEMENTIDX_IDLE:
  197. speedCoef = 0;
  198. break;
  199. }
  200. return speedCoef;
  201. }
  202. protected float GetMovementStanceVisualCoef()
  203. {
  204. HumanMovementState hms = new HumanMovementState();
  205. float stanceCoef = 1.0;
  206. m_pPlayer.GetMovementState(hms);
  207. switch (hms.m_iStanceIdx)
  208. {
  209. case DayZPlayerConstants.STANCEIDX_CROUCH:
  210. case DayZPlayerConstants.STANCEIDX_RAISEDCROUCH:
  211. stanceCoef = 0.33;
  212. break;
  213. case DayZPlayerConstants.STANCEIDX_PRONE:
  214. case DayZPlayerConstants.STANCEIDX_RAISEDPRONE:
  215. stanceCoef = 0.11;
  216. break;
  217. }
  218. return stanceCoef;
  219. }
  220. //! --------------------------------------------------------
  221. //!
  222. //! Noise related
  223. // Not used since 1.12
  224. //! noise component of presence based on player's speed
  225. //! DEPRECATED
  226. protected int GetMovementSpeedNoiseComponent();
  227. //! noise component of presence based on player's shoes
  228. //! DEPRECATED
  229. protected int GetBootsNoiseComponent();
  230. //! DEPRECATED
  231. protected int GetSurfaceNoiseComponent();
  232. //! DEPRECATED
  233. protected int GetExternalNoiseEventsComponent();
  234. }