1
0

a_pause.inc 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. #if defined _OnPlayerPause_included
  2. #endinput
  3. #endif
  4. #define _OnPlayerPause_included
  5. #include <a_samp>
  6. #define MinTimeWithoutUpdates 6 // Time in seconds after which a player will be considered as paused.
  7. //#define PRINTPAUSE // Define this if you want this script to print messages on your server console. This
  8. // is useful for example for admin filterscripts.
  9. new stock TimeOfLastUpdate[MAX_PLAYERS];
  10. new stock bool:Paused[MAX_PLAYERS];
  11. new stock bool:InClassSelection[MAX_PLAYERS];
  12. stock IsPlayerPaused(playerid)
  13. {
  14. if(Paused[playerid] == true)
  15. {
  16. return 1;
  17. }
  18. return 0;
  19. }
  20. stock IsPlayerInClassSelection(playerid)
  21. {
  22. if(InClassSelection[playerid] == true)
  23. {
  24. return 1;
  25. }
  26. return 0;
  27. }
  28. #define MinTimeWithoutUpdates2 (MinTimeWithoutUpdates * 1000)
  29. forward SearchForNewlyPausedPlayers();
  30. public SearchForNewlyPausedPlayers()
  31. {
  32. new CurrentTime, PlayerState;
  33. CurrentTime = GetTickCount();
  34. for(new i = 0; i < MAX_PLAYERS; i ++)
  35. {
  36. if(Paused[i] == false)
  37. // If the player is already paused, there's no point in calling OnPlayerPause again.
  38. {
  39. if(InClassSelection[i] == false)
  40. // When a player enters the class selection screen, he stops sending updates just
  41. // like when he pauses, so we need to know if he's selecting class.
  42. {
  43. if(IsPlayerConnected(i))
  44. {
  45. if( (CurrentTime - TimeOfLastUpdate[i]) >= MinTimeWithoutUpdates2 )
  46. {
  47. PlayerState = GetPlayerState(i);
  48. if( (PlayerState == PLAYER_STATE_ONFOOT) || (PlayerState == PLAYER_STATE_DRIVER) || (PlayerState == PLAYER_STATE_PASSENGER) )
  49. {
  50. OnPlayerPause(i);
  51. }
  52. }
  53. }
  54. }
  55. }
  56. }
  57. return 1;
  58. }
  59. forward OnPlayerPause(playerid);
  60. forward OnPlayerUnpause(playerid);
  61. static gOnPlPa_HasCB[7];
  62. public OnGameModeInit()
  63. {
  64. SetTimer("SearchForNewlyPausedPlayers", 500, true);
  65. gOnPlPa_HasCB[0] = funcidx("OnPlPa_OnPlayerConnect") != -1;
  66. gOnPlPa_HasCB[1] = funcidx("OnPlPa_OnPlayerDisconnect") != -1;
  67. gOnPlPa_HasCB[2] = funcidx("OnPlPa_OnPlayerRequestClass") != -1;
  68. gOnPlPa_HasCB[3] = funcidx("OnPlPa_OnPlayerSpawn") != -1;
  69. gOnPlPa_HasCB[4] = funcidx("OnPlPa_OnPlayerUpdate") != -1;
  70. gOnPlPa_HasCB[5] = funcidx("OnPlPa_OnPlayerPause") != -1;
  71. gOnPlPa_HasCB[6] = funcidx("OnPlPa_OnPlayerUnpause") != -1;
  72. if (funcidx("OnPlPa_OnGameModeInit") != -1)
  73. {
  74. return CallLocalFunction("OnPlPa_OnGameModeInit", "");
  75. }
  76. return 1;
  77. }
  78. #if defined _ALS_OnGameModeInit
  79. #undef OnGameModeInit
  80. #else
  81. #define _ALS_OnGameModeInit
  82. #endif
  83. #define OnGameModeInit OnPlPa_OnGameModeInit
  84. forward OnPlPa_OnGameModeInit();
  85. public OnPlayerConnect(playerid)
  86. {
  87. Paused[playerid] = false;
  88. InClassSelection[playerid] = false;
  89. if (gOnPlPa_HasCB[0])
  90. {
  91. return CallLocalFunction("OnPlPa_OnPlayerConnect", "i",playerid);
  92. }
  93. return 1;
  94. }
  95. #if defined _ALS_OnPlayerConnect
  96. #undef OnPlayerConnect
  97. #else
  98. #define _ALS_OnPlayerConnect
  99. #endif
  100. #define OnPlayerConnect OnPlPa_OnPlayerConnect
  101. forward OnPlPa_OnPlayerConnect(playerid);
  102. public OnPlayerDisconnect(playerid, reason)
  103. {
  104. Paused[playerid] = false;
  105. InClassSelection[playerid] = false;
  106. if (gOnPlPa_HasCB[1])
  107. {
  108. return CallLocalFunction("OnPlPa_OnPlayerDisconnect", "ii",playerid, reason);
  109. }
  110. return 1;
  111. }
  112. #if defined _ALS_OnPlayerDisconnect
  113. #undef OnPlayerDisconnect
  114. #else
  115. #define _ALS_OnPlayerDisconnect
  116. #endif
  117. #define OnPlayerDisconnect OnPlPa_OnPlayerDisconnect
  118. forward OnPlPa_OnPlayerDisconnect(playerid, reason);
  119. public OnPlayerRequestClass(playerid, classid)
  120. {
  121. #if defined PRINTPAUSE
  122. if(InClassSelection[playerid] == false)
  123. {
  124. new NickName[MAX_PLAYER_NAME + 1];
  125. GetPlayerName( playerid, NickName, sizeof(NickName) );
  126. printf("[class] %s (id: %i) has entered class selection screen", NickName, playerid);
  127. }
  128. #endif
  129. InClassSelection[playerid] = true;
  130. if (gOnPlPa_HasCB[2])
  131. {
  132. return CallLocalFunction("OnPlPa_OnPlayerRequestClass", "ii",playerid, classid);
  133. }
  134. return 1;
  135. }
  136. #if defined _ALS_OnPlayerRequestClass
  137. #undef OnPlayerRequestClass
  138. #else
  139. #define _ALS_OnPlayerRequestClass
  140. #endif
  141. #define OnPlayerRequestClass OnPlPa_OnPlayerRequestClass
  142. forward OnPlPa_OnPlayerRequestClass(playerid, classid);
  143. public OnPlayerSpawn(playerid)
  144. {
  145. InClassSelection[playerid] = false;
  146. #if defined PRINTPAUSE
  147. new NickName[MAX_PLAYER_NAME + 1];
  148. GetPlayerName( playerid, NickName, sizeof(NickName) );
  149. printf("[spawn] %s (id: %i) has spawned", NickName, playerid);
  150. #endif
  151. if (gOnPlPa_HasCB[3])
  152. {
  153. return CallLocalFunction("OnPlPa_OnPlayerSpawn", "i",playerid);
  154. }
  155. return 1;
  156. }
  157. #if defined _ALS_OnPlayerSpawn
  158. #undef OnPlayerSpawn
  159. #else
  160. #define _ALS_OnPlayerSpawn
  161. #endif
  162. #define OnPlayerSpawn OnPlPa_OnPlayerSpawn
  163. forward OnPlPa_OnPlayerSpawn(playerid);
  164. public OnPlayerUpdate(playerid)
  165. {
  166. TimeOfLastUpdate[playerid] = GetTickCount();
  167. if(Paused[playerid] == true)
  168. // If the player was paused and now he sends an update, it's because he has just resumed his game.
  169. {
  170. OnPlayerUnpause(playerid);
  171. }
  172. if (gOnPlPa_HasCB[4])
  173. {
  174. return CallLocalFunction("OnPlPa_OnPlayerUpdate", "i",playerid);
  175. }
  176. return 1;
  177. }
  178. #if defined _ALS_OnPlayerUpdate
  179. #undef OnPlayerUpdate
  180. #else
  181. #define _ALS_OnPlayerUpdate
  182. #endif
  183. #define OnPlayerUpdate OnPlPa_OnPlayerUpdate
  184. forward OnPlPa_OnPlayerUpdate(playerid);
  185. public OnPlayerPause(playerid)
  186. {
  187. Paused[playerid] = true;
  188. #if defined PRINTPAUSE
  189. new NickName[MAX_PLAYER_NAME + 1];
  190. GetPlayerName( playerid, NickName, sizeof(NickName) );
  191. printf("[pause] %s (id: %i) has paused", NickName, playerid);
  192. #endif
  193. if (gOnPlPa_HasCB[5])
  194. {
  195. return CallLocalFunction("OnPlPa_OnPlayerPause", "i",playerid);
  196. }
  197. return 1;
  198. }
  199. #if defined _ALS_OnPlayerPause
  200. #undef OnPlayerPause
  201. #else
  202. #define _ALS_OnPlayerPause
  203. #endif
  204. #define OnPlayerPause OnPlPa_OnPlayerPause
  205. forward OnPlPa_OnPlayerPause(playerid);
  206. public OnPlayerUnpause(playerid)
  207. {
  208. Paused[playerid] = false;
  209. #if defined PRINTPAUSE
  210. new NickName[MAX_PLAYER_NAME + 1];
  211. GetPlayerName( playerid, NickName, sizeof(NickName) );
  212. printf("[resume] %s (id: %i) has returned from pausing", NickName, playerid);
  213. #endif
  214. if (gOnPlPa_HasCB[6])
  215. {
  216. return CallLocalFunction("OnPlPa_OnPlayerUnpause", "i",playerid);
  217. }
  218. return 1;
  219. }
  220. #if defined _ALS_OnPlayerUnpause
  221. #undef OnPlayerUnpause
  222. #else
  223. #define _ALS_OnPlayerUnpause
  224. #endif
  225. #define OnPlayerUnpause OnPlPa_OnPlayerUnpause
  226. forward OnPlPa_OnPlayerUnpause(playerid);