Advertisement
Guest User

Untitled

a guest
Mar 3rd, 2012
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.45 KB | None | 0 0
  1. #include <a_samp>
  2.  
  3. ///////////////////////////////////////////////
  4. /////////SETUP
  5. #define SRVR_MAX_SLOT 50 // current max player setting, we could use MAX_PLAYERS but its fix at 200...
  6. // YOU MUST SET THAT TO YOUR SERVER MAX PLAYER
  7. ///////////////////////////////////////////////
  8.  
  9. #define COLOR_TXT 0xC4996DFF
  10. #define OFFSET 1.12 // default distance forward of the surf
  11. #define TIMER_SPEED 75 // Normal timer speed...
  12. #define TIMER_IDLE 750 // Idle timer speed...
  13. #define CHECK_RATE 40 // script will look for offline surefer every XX timer frame
  14. forward public surfing();
  15. forward public killstatustxt();
  16. new surf[SRVR_MAX_SLOT], surfer[SRVR_MAX_SLOT], surftimer, Float:surfoffset[SRVR_MAX_SLOT];
  17. new Float:hashpos[SRVR_MAX_SLOT], isidle[SRVR_MAX_SLOT], systemidle, checker;
  18. /*
  19. =============================================================================
  20. * Magic Surf by www.snoob.net
  21.  
  22. * this script put a surf under a player and update the position of the surf *
  23. * every timer frame. all the surfers use the same timer. if a surfer is *
  24. * idle, the surf will center on the position, if the surfer is moving the *
  25. * surf position will be offset forward. if all the surfer are idle the *
  26. * timer will switch to idle speed. if the ping of a player is higher then *
  27. * 200 he should walk to avoid steping ahead of the surf *
  28.  
  29. * you can find more cool script on my wiki.snoob.net
  30.  
  31. * snoob@studio2015.ca *
  32. =============================================================================
  33. */
  34. public OnFilterScriptInit()
  35. {
  36. print("\n--------------------------------------");
  37. print(" Magic Surf by www.snoob.net ");
  38. print("--------------------------------------\n");
  39. return 1;
  40. }
  41. public OnFilterScriptExit()
  42. {
  43. for(new b = 0; b < SRVR_MAX_SLOT; b++)
  44. {
  45. if(surfer[b]) {
  46. DestroyObject(surf[b]);
  47. surfer[b] = 0;
  48. }
  49. }
  50. return 1;
  51. }
  52. chkdeadsurf()
  53. {
  54. checker = 0;
  55. for(new b = 0; b < SRVR_MAX_SLOT; b++)
  56. {
  57. if(surfer[b] && !IsPlayerConnected(b)) {
  58. DestroyObject(surf[b]);
  59. surfer[b] = 0;
  60. }
  61. }
  62. return 1;
  63. }
  64. public surfing()
  65. {
  66. new a, idle, allidle;
  67. checker++;
  68. if(checker == CHECK_RATE) chkdeadsurf();
  69. for(new i = 0; i < SRVR_MAX_SLOT; i++)
  70. {
  71. if(IsPlayerConnected(i) && surfer[i]) {
  72. a++;
  73. new Float:playerpos[4], Float:newhashpos;
  74. GetPlayerPos(i,playerpos[0],playerpos[1],playerpos[2]);
  75. GetPlayerFacingAngle(i,playerpos[3]);
  76. newhashpos = (playerpos[0] * playerpos[1]) + (playerpos[2] * playerpos[3]);
  77. if(newhashpos == hashpos[i]) { // the player is idle
  78. idle++, isidle[i]++;
  79. if(isidle[i] == 2) { // the second time the player is idle
  80. SetObjectPos(surf[i],playerpos[0],playerpos[1],playerpos[2]-1.0855);
  81. SetObjectRot(surf[i],-90.0,0.0,playerpos[3]);
  82. }
  83. }
  84. else { // the player is not idle
  85. SetObjectPos(surf[i],playerpos[0]+surfoffset[i]*floatsin(-playerpos[3],degrees),
  86. playerpos[1]+surfoffset[i]*floatcos(-playerpos[3],degrees),playerpos[2]-1.0855);
  87. SetObjectRot(surf[i],-90.0,0.0,playerpos[3]);
  88. isidle[i] = 0;
  89. }
  90. hashpos[i] = newhashpos;
  91. }
  92. }
  93. if(a && (a == idle)) { // ALL player are idle
  94. allidle = 1;
  95. if(systemidle < 20) { // 20 first time it hapen
  96. systemidle++;
  97. }
  98. if(systemidle == 20) { // we switch the timer to idle speed
  99. KillTimer(surftimer);
  100. surftimer = SetTimer("surfing",TIMER_IDLE,true);
  101. systemidle = 21;
  102. }
  103. }
  104. else if((systemidle == 21) && !allidle) {
  105. //system is idle but a player move, we switch the timer back to normal speed
  106. KillTimer(surftimer);
  107. surftimer = SetTimer("surfing",TIMER_SPEED,true);
  108. systemidle = 0;
  109. }
  110. if(!a) { // no player is curently surfing we kill the timer.
  111. KillTimer(surftimer);
  112. surftimer = 0;
  113. for(new b = 0; b < SRVR_MAX_SLOT; b++) // and destroy any left over surf
  114. {
  115. if(surfer[b]) {
  116. DestroyObject(surf[b]);
  117. surfer[b] = 0;
  118. }
  119. }
  120. }
  121. return 1;
  122. }
  123. public OnPlayerCommandText(playerid, cmdtext[])
  124. {
  125. new cmd[256], idx;
  126. cmd = strtok(cmdtext, idx);
  127. if (strcmp("/surf", cmdtext, true, 6) == 0)
  128. {
  129. if(surfer[playerid]) return SendClientMessage(playerid,COLOR_TXT,"You are already on a surf");
  130. SendClientMessage(playerid,COLOR_TXT,"Have fun!");
  131. surfoffset[playerid] = OFFSET;
  132. surf[playerid] = CreateObject(2405,0.0,0.0,0.0,-90.0,0.0,0.0);
  133. surfer[playerid] = 1;
  134. if(!surftimer) {
  135. surftimer = SetTimer("surfing",TIMER_SPEED,true);
  136. }
  137. return 1;
  138. }
  139. if (strcmp("/unsurf", cmdtext, true, 8) == 0)
  140. {
  141. DestroyObject(surf[playerid]);
  142. surfer[playerid] = 0;
  143. return 1;
  144. }
  145. if(strcmp(cmd, "/offset", true) == 0) {
  146. new tmp[256];
  147. tmp = strtok(cmdtext, idx);
  148. if(!surfer[playerid]) return SendClientMessage(playerid,COLOR_TXT,"You must be surfing to use /offset");
  149. if(!strlen(tmp)) return SendClientMessage(playerid,COLOR_TXT,"Usage: /offset [-0.9 to 0.9]");
  150. surfoffset[playerid] = floatstr(tmp);
  151. format(tmp,sizeof(tmp),"Offset set to %f",surfoffset[playerid]);
  152. SendClientMessage(playerid,COLOR_TXT,tmp);
  153. return 1;
  154. }
  155. return 0;
  156. }
  157. strtok(const string[], &index)
  158. {
  159. // more info on strtok are available on the official sa-mp wiki
  160. new length = strlen(string);
  161. while ((index < length) && (string[index] <= ' '))
  162. {
  163. index++;
  164. }
  165. new offset = index;
  166. new result[20];
  167. while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
  168. {
  169. result[index - offset] = string[index];
  170. index++;
  171. }
  172. result[index - offset] = EOS;
  173. return result;
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement