surfboard.inc 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. /* surfboard.inc
  2. *
  3. * (c) Copyright 2010, Emilijo "Correlli" Lovrich
  4. *
  5. * Credits: - Y_Less for foreach & GetXYInFrontOfPlayer functions & ZeeX for zcmd command processor.
  6. */
  7. #if defined _surfboard_included
  8. #endinput
  9. #endif
  10. #define _surfboard_included
  11. #if !defined _samp_included
  12. #error "You'll need to include the a_samp.inc include file before the surfboard.inc file!"
  13. #endif
  14. /* ----- */
  15. #undef MAX_PLAYERS
  16. #define MAX_PLAYERS (500)
  17. #if !defined MAX_SURFBOARDS
  18. #define MAX_SURFBOARDS (50)
  19. #endif
  20. #if !defined MAX_SURFBOARD_SPEED
  21. #define MAX_SURFBOARD_SPEED (400.0)
  22. #endif
  23. #if !defined INVALID_SURFBOARD_ID
  24. #define INVALID_SURFBOARD_ID (-1)
  25. #endif
  26. /* ----- */
  27. static
  28. bool:gOPF[3] = false;
  29. /* ----- */
  30. enum dataSurfboard
  31. {
  32. modelID,
  33. objectID,
  34. Float:speed,
  35. Float:position[7]
  36. }
  37. new
  38. surfboardID = INVALID_SURFBOARD_ID, surfboardData[MAX_SURFBOARDS][dataSurfboard],
  39. Float:surfboardGoTo[MAX_SURFBOARDS][3], bool:firstSurfboard = false, sbTimer;
  40. /* ----- */
  41. stock CreateSurfboard(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz = 0.0)
  42. {
  43. surfboardID++;
  44. if(surfboardID == MAX_SURFBOARDS)
  45. {
  46. printf("Limit of surfboards exceeded. Open the surfboard.inc and change the \"MAX_SURFBOARDS\" define to bigger value if you want to have more surfboards.\
  47. \nDon't forget that object limit in the current SA:MP version (0.3b) is 400, so it's a good thing to use an object-streamer if you're having many surfboards on server.");
  48. surfboardID--;
  49. return INVALID_SURFBOARD_ID;
  50. }
  51. new
  52. toSurfboardID = GetFreeSurfboardID();
  53. if(toSurfboardID == INVALID_SURFBOARD_ID)
  54. {
  55. print("Error: There are no surfboard IDs free.");
  56. surfboardID--;
  57. return INVALID_SURFBOARD_ID;
  58. }
  59. if(modelid < 1 || modelid > 3)
  60. {
  61. printf("Invalid model-ID at function \"CreateSurfboard\". Valid model-IDs are 1, 2 and 3.");
  62. surfboardID--;
  63. return INVALID_SURFBOARD_ID;
  64. }
  65. surfboardData[toSurfboardID][modelID] = modelid;
  66. surfboardData[toSurfboardID][position][0] = x;
  67. surfboardData[toSurfboardID][position][1] = y;
  68. surfboardData[toSurfboardID][position][2] = z;
  69. surfboardData[toSurfboardID][position][3] = rx;
  70. surfboardData[toSurfboardID][position][4] = ry;
  71. surfboardData[toSurfboardID][position][5] = rz;
  72. surfboardData[toSurfboardID][position][6] = rz;
  73. surfboardData[toSurfboardID][speed] = 0.0;
  74. surfboardData[toSurfboardID][objectID] = CreateObject(2403 + modelid, x, y, z, rx, ry, rz);
  75. if(!firstSurfboard)
  76. {
  77. firstSurfboard = true;
  78. //sbTimer = SetTimer("surfboard_Timer", 1000, true);
  79. }
  80. return toSurfboardID;
  81. }
  82. stock DestroySurfboard(sbid)
  83. {
  84. if(IsSurfboardCreated(sbid))
  85. {
  86. surfboardID--;
  87. surfboardData[sbid][modelID] = 0;
  88. surfboardData[sbid][position][0] = 0.0;
  89. surfboardData[sbid][position][1] = 0.0;
  90. surfboardData[sbid][position][2] = 0.0;
  91. surfboardData[sbid][position][3] = 0.0;
  92. surfboardData[sbid][position][4] = 0.0;
  93. surfboardData[sbid][position][5] = 0.0;
  94. surfboardData[sbid][position][6] = 0.0;
  95. surfboardData[sbid][speed] = 0.0;
  96. DestroyObject(surfboardData[sbid][objectID]);
  97. if(surfboardID == INVALID_SURFBOARD_ID)
  98. {
  99. firstSurfboard = false;
  100. KillTimer(sbTimer);
  101. }
  102. for(new u = 0; u < MAX_PLAYERS; u++)
  103. {
  104. if((GetPVarInt(u, "surfboardID") - 1) == sbid)
  105. {
  106. SetPVarInt(u, "surfboardID", 0);
  107. ClearAnimations(u);
  108. SendClientMessage(u, 0xFFFFFFFF, "The surfboard has been deleted by an administrator!");
  109. break;
  110. }
  111. }
  112. return true;
  113. }
  114. return false;
  115. }
  116. stock IsSurfboardCreated(sbid)
  117. {
  118. if(surfboardData[sbid][modelID]) return true;
  119. return false;
  120. }
  121. stock GetNumberOfSurfboards() return surfboardID;
  122. stock GetFreeSurfboardID()
  123. {
  124. new
  125. sbid = INVALID_SURFBOARD_ID;
  126. for(new a = 0; a < MAX_SURFBOARDS; a++)
  127. {
  128. if(!IsSurfboardCreated(a))
  129. {
  130. sbid = a;
  131. break;
  132. }
  133. }
  134. return sbid;
  135. }
  136. stock StopSurfboard(sbid)
  137. {
  138. if(!IsSurfboardCreated(sbid)) return false;
  139. surfboardData[sbid][speed] = 0.0;
  140. StopObject(surfboardData[sbid][objectID]);
  141. return true;
  142. }
  143. stock RespawnSurfboard(sbid)
  144. {
  145. if(!IsSurfboardCreated(sbid)) return false;
  146. DestroyObject(surfboardData[sbid][objectID]);
  147. surfboardData[sbid][position][5] = surfboardData[sbid][position][6];
  148. surfboardData[sbid][objectID] = CreateObject(2403 + surfboardData[sbid][modelID], surfboardData[sbid][position][0], surfboardData[sbid][position][1], surfboardData[sbid][position][2], surfboardData[sbid][position][3], surfboardData[sbid][position][4], surfboardData[sbid][position][5]);
  149. return true;
  150. }
  151. stock SetSurfboardSpeed(sbid, Float:surfspeed = MAX_SURFBOARD_SPEED)
  152. {
  153. if(!IsSurfboardCreated(sbid)) return false;
  154. if(surfspeed > MAX_SURFBOARD_SPEED) surfboardData[sbid][speed] = MAX_SURFBOARD_SPEED;
  155. else surfboardData[sbid][speed] = surfspeed;
  156. return true;
  157. }
  158. stock IsPlayerAtSurfboard(playerid, sbid)
  159. {
  160. new
  161. Float:pos[3];
  162. GetObjectPos(surfboardData[sbid][objectID], pos[0], pos[1], pos[2]);
  163. if(IsPlayerInRangeOfPoint(playerid, 1.5, pos[0], pos[1], pos[2])) return true;
  164. return false;
  165. }
  166. stock IsPlayerAtAnySurfboard(playerid)
  167. {
  168. new
  169. a = 0;
  170. for(a = 0; a < MAX_SURFBOARDS; a++)
  171. {
  172. if(IsPlayerAtSurfboard(playerid, a)) return a;
  173. }
  174. return INVALID_SURFBOARD_ID;
  175. }
  176. stock IsSurfboardOccupied(sbid)
  177. {
  178. if(!IsSurfboardCreated(sbid)) return INVALID_PLAYER_ID;
  179. for(new u = 0; u < MAX_PLAYERS; u++)
  180. {
  181. if((GetPVarInt(u, "surfboardID") - 1) == sbid) return u;
  182. }
  183. return INVALID_PLAYER_ID;
  184. }
  185. /* ----- */
  186. stock GetXYInFrontOfPlayerOnSB(playerid, &Float:x, &Float:y, Float:distance)
  187. {
  188. new
  189. Float:angle;
  190. GetPlayerPos(playerid, x, y, angle);
  191. GetPlayerFacingAngle(playerid, angle);
  192. x += (distance * floatsin(-angle + 270.0, degrees));
  193. y += (distance * floatcos(-angle + 270.0, degrees));
  194. }
  195. /* ----- */
  196. task SurfUpdate[5000]()
  197. {
  198. for(new u = 0; u < MAX_PLAYERS; u++)
  199. {
  200. new
  201. sbid = GetPVarInt(u, "surfboardID") - 1;
  202. if(sbid != INVALID_SURFBOARD_ID)
  203. {
  204. if(GetPVarInt(u, "isSurfing") != 0 || GetPVarInt(u, "surfing") != 0) {
  205. new Float: pos[3], Float: objPos[3];
  206. GetObjectPos(surfboardData[sbid][objectID], objPos[0], objPos[1], objPos[2]);
  207. GetPlayerPos(u, pos[0], pos[1], pos[2]);
  208. if(pos[2] < objPos[2])
  209. {
  210. StopSurfboard(sbid);
  211. RespawnSurfboard(sbid);
  212. SetPVarInt(u, "surfboardID", 0);
  213. SetPVarInt(u, "isSurfing", 0);
  214. SetPVarInt(u, "pendingsurfevent", 0);
  215. SetPVarInt(u, "currentlyissurf", 0);
  216. ClearAnimations(u);
  217. TogglePlayerControllable(u, 1);
  218. DisablePlayerRaceCheckpoint(u);
  219. SetPlayerPos(u, 324.6641,-1892.0195,1.7212);
  220. SendClientMessage(u, 0x0F9AF7FF, "You have fell off your surfboard & has been disqualified from the race.");
  221. } else {
  222. new rdm = random(6);
  223. if(rdm == 3) {
  224. ApplyAnimation(u, "OTB", "wtchrace_win", 4.0, 1, 0, 0, 0, 0);
  225. SendClientMessage(u, 0x0F9AF7FF, "Incoming wave!");
  226. SetTimerEx("ResetAnim", 3000, false, "i", u);
  227. } else return 1;
  228. }
  229. }
  230. }
  231. }
  232. return 1;
  233. }
  234. forward ResetAnim(playerid);
  235. public ResetAnim(playerid)
  236. {
  237. ApplyAnimation(playerid, "BSKTBALL", "BBALL_def_loop", 4.0, 1, 0, 0, 0, 0);
  238. return 1;
  239. }
  240. forward surfboard_Timer();
  241. public surfboard_Timer()
  242. {
  243. for(new u = 0; u < MAX_PLAYERS; u++)
  244. {
  245. new
  246. sbid = GetPVarInt(u, "surfboardID") - 1;
  247. if(sbid != INVALID_SURFBOARD_ID)
  248. {
  249. if(!IsPlayerAtSurfboard(u, sbid))
  250. {
  251. StopSurfboard(sbid);
  252. RespawnSurfboard(sbid);
  253. SetPVarInt(u, "surfboardID", 0);
  254. ClearAnimations(u);
  255. SendClientMessage(u, 0xFFFFFFFF, "Surfing stopped - surfboard is re-spawned.");
  256. }
  257. }
  258. }
  259. return true;
  260. }
  261. /* ----- */
  262. /*
  263. command(surf, playerid, params[])
  264. {
  265. new
  266. Float:objPos[3];
  267. if(!GetPVarInt(playerid, "surfboardID"))
  268. {
  269. if(GetPVarInt(playerid, "surfingAccess") == 1)
  270. {
  271. if(GetPVarInt(playerid, "isSurfing") == 1)
  272. return SendClientMessage(playerid, -1, "You're already in the surfing event!");
  273. new
  274. sbid = IsPlayerAtAnySurfboard(playerid);
  275. if(sbid != INVALID_SURFBOARD_ID)
  276. {
  277. new
  278. isOccupied = IsSurfboardOccupied(sbid);
  279. if(isOccupied != INVALID_PLAYER_ID) return SendClientMessage(playerid, 0xFFFFFFFF, "This surfboard is currently occupied!");
  280. SetPVarInt(playerid, "surfboardID", sbid + 1);
  281. SetPVarInt(playerid, "isSurfing", 1);
  282. GetObjectPos(surfboardData[sbid][objectID], objPos[0], objPos[1], objPos[2]);
  283. SetPlayerPos(playerid, objPos[0], objPos[1], objPos[2] + 1.0);
  284. SetPlayerFacingAngle(playerid, surfboardData[sbid][position][5] + 270.0);
  285. ApplyAnimation(playerid, "BSKTBALL", "BBALL_def_loop", 4.0, 1, 0, 0, 0, 0);
  286. TogglePlayerControllable(playerid, 0);
  287. SetPVarInt(playerid, "pendingsurfevent", 1);
  288. SendClientMessage(playerid, 0xF2EF27FF, "You joined the {FF2200}surfing event{F2EF27}, please wait until an admin starts the race.");
  289. }
  290. else SendClientMessage(playerid, 0xFFFFFFFF, "You're not ontop of surfboard");
  291. }
  292. else SendClientMessage(playerid, -1, "You do not have access to this command, sorry.");
  293. } else SendClientMessage(playerid, -1, "You cannot quit the event at this point.");
  294. else
  295. {
  296. StopSurfboard(GetPVarInt(playerid, "surfboardID") - 1);
  297. SetPVarInt(playerid, "surfboardID", 0);
  298. SetPVarInt(playerid, "isSurfing", 0);
  299. ClearAnimations(playerid);
  300. SendClientMessage(playerid, 0xFFFFFFFF, "Surfing stopped. Use \"/surf\" command to start with the surfing again.");
  301. }
  302. return true;
  303. } */
  304. /* ----- */
  305. public OnPlayerConnect(playerid)
  306. {
  307. ApplyAnimation(playerid, "BSKTBALL", "null", 0.0, 0, 0, 0, 0, 0);
  308. if(gOPF[0]) CallLocalFunction("surfboard_OnPlayerConnect", "i", playerid);
  309. return true;
  310. }
  311. #if defined _ALS_OnPlayerConnect
  312. #undef OnPlayerConnect
  313. #else
  314. #define _ALS_OnPlayerConnect
  315. #endif
  316. #define OnPlayerConnect surfboard_OnPlayerConnect
  317. forward surfboard_OnPlayerConnect(playerid);
  318. public OnPlayerDisconnect(playerid, reason)
  319. {
  320. new
  321. sbid = GetPVarInt(playerid, "surfboardID") - 1;
  322. if(sbid != INVALID_SURFBOARD_ID)
  323. {
  324. StopSurfboard(sbid);
  325. RespawnSurfboard(sbid);
  326. }
  327. if(gOPF[1]) CallLocalFunction("surfboard_OnPlayerDisconnect", "ii", playerid, reason);
  328. return true;
  329. }
  330. #if defined _ALS_OnPlayerDisconnect
  331. #undef OnPlayerDisconnect
  332. #else
  333. #define _ALS_OnPlayerDisconnect
  334. #endif
  335. #define OnPlayerDisconnect surfboard_OnPlayerDisconnect
  336. forward surfboard_OnPlayerDisconnect(playerid, reason);
  337. public OnPlayerUpdate(playerid)
  338. {
  339. new
  340. sbid = GetPVarInt(playerid, "surfboardID") - 1;
  341. if(sbid != INVALID_SURFBOARD_ID)
  342. {
  343. if(GetPVarInt(playerid, "fsurfing") != 1) return 1;
  344. new
  345. keys[3], Float:floatVal[4];
  346. GetPlayerPos(playerid, floatVal[0], floatVal[1], floatVal[2]);
  347. floatVal[3] = surfboardData[sbid][speed];
  348. GetPlayerKeys(playerid, keys[0], keys[1], keys[2]);
  349. GetXYInFrontOfPlayerOnSB(playerid, floatVal[0], floatVal[1], 50.0);
  350. surfboardGoTo[sbid][0] = floatVal[0];
  351. surfboardGoTo[sbid][1] = floatVal[1];
  352. surfboardGoTo[sbid][2] = surfboardData[sbid][position][2];
  353. if(keys[1] == KEY_UP)
  354. {
  355. if(GetPVarInt(playerid, "pendingsurfevent") == 1)
  356. return 1;
  357. if(floatVal[3] >= 0.0 && floatVal[3] < MAX_SURFBOARD_SPEED) surfboardData[sbid][speed] += 0.10;
  358. if(floatVal[3] >= MAX_SURFBOARD_SPEED) surfboardData[sbid][speed] = MAX_SURFBOARD_SPEED;
  359. }
  360. else if(keys[1] == KEY_DOWN)
  361. {
  362. if(GetPVarInt(playerid, "pendingsurfevent") == 1)
  363. return 1;
  364. if(floatVal[3] >= 0.0 && floatVal[3] < MAX_SURFBOARD_SPEED) surfboardData[sbid][speed] -= 0.10;
  365. if(floatVal[3] >= MAX_SURFBOARD_SPEED) surfboardData[sbid][speed] = MAX_SURFBOARD_SPEED;
  366. }
  367. if(keys[2] == KEY_LEFT)
  368. {
  369. if(GetPVarInt(playerid, "pendingsurfevent") == 1)
  370. return 1;
  371. surfboardData[sbid][speed] -= 0.01;
  372. surfboardData[sbid][position][5] += 1.5;
  373. SetObjectRot(surfboardData[sbid][objectID], surfboardData[sbid][position][3], surfboardData[sbid][position][4], surfboardData[sbid][position][5]);
  374. SetPlayerFacingAngle(playerid, surfboardData[sbid][position][5] + 270.0);
  375. surfboardGoTo[sbid][0] = floatVal[0];
  376. surfboardGoTo[sbid][1] = floatVal[1];
  377. surfboardGoTo[sbid][2] = surfboardData[sbid][position][2];
  378. }
  379. else if(keys[2] == KEY_RIGHT)
  380. {
  381. if(GetPVarInt(playerid, "pendingsurfevent") == 1)
  382. return 1;
  383. surfboardData[sbid][speed] -= 0.01;
  384. surfboardData[sbid][position][5] -= 1.5;
  385. SetObjectRot(surfboardData[sbid][objectID], surfboardData[sbid][position][3], surfboardData[sbid][position][4], surfboardData[sbid][position][5]);
  386. SetPlayerFacingAngle(playerid, surfboardData[sbid][position][5] + 270.0);
  387. surfboardGoTo[sbid][0] = floatVal[0];
  388. surfboardGoTo[sbid][1] = floatVal[1];
  389. surfboardGoTo[sbid][2] = surfboardData[sbid][position][2];
  390. }
  391. if(surfboardData[sbid][speed] > 0.010)
  392. {
  393. if(GetPVarInt(playerid, "pendingsurfevent") == 1)
  394. return 1;
  395. surfboardData[sbid][speed] -= 0.010;
  396. MoveObject(surfboardData[sbid][objectID], surfboardGoTo[sbid][0], surfboardGoTo[sbid][1], surfboardGoTo[sbid][2], surfboardData[sbid][speed]);
  397. }
  398. else StopSurfboard(sbid);
  399. }
  400. if(gOPF[2]) CallLocalFunction("surfboard_OnPlayerUpdate", "i", playerid);
  401. return true;
  402. }
  403. #if defined _ALS_OnPlayerUpdate
  404. #undef OnPlayerUpdate
  405. #else
  406. #define _ALS_OnPlayerUpdate
  407. #endif
  408. #define OnPlayerUpdate surfboard_OnPlayerUpdate
  409. forward surfboard_OnPlayerUpdate(playerid);
  410. public OnGameModeInit()
  411. {
  412. gOPF[0] = (funcidx("surfboard_OnPlayerConnect") != -1);
  413. gOPF[1] = (funcidx("surfboard_OnPlayerDisconnect") != -1);
  414. gOPF[2] = (funcidx("surfboard_OnPlayerUpdate") != -1);
  415. CallLocalFunction("surfboard_OnGameModeInit", "");
  416. }
  417. #if defined _ALS_OnGameModeInit
  418. #undef OnGameModeInit
  419. #else
  420. #define _ALS_OnGameModeInit
  421. #endif
  422. #define OnGameModeInit surfboard_OnGameModeInit
  423. forward surfboard_OnGameModeInit();