surfing-ngrp.pwn 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854
  1. /*
  2. /$$ /$$ /$$$$$$ /$$$$$$$ /$$$$$$$
  3. | $$$ | $$ /$$__ $$ | $$__ $$| $$__ $$
  4. | $$$$| $$| $$ \__/ | $$ \ $$| $$ \ $$
  5. | $$ $$ $$| $$ /$$$$ /$$$$$$| $$$$$$$/| $$$$$$$/
  6. | $$ $$$$| $$|_ $$|______/| $$__ $$| $$____/
  7. | $$\ $$$| $$ \ $$ | $$ \ $$| $$
  8. | $$ \ $$| $$$$$$/ | $$ | $$| $$
  9. |__/ \__/ \______/ |__/ |__/|__/
  10. //--------------------------------[SURFING-NGRP.PWN]--------------------------------
  11. Next Generation Gaming, LLC
  12. (created by Next Generation Gaming Development Team)
  13. Combined:
  14. (***) Akatony
  15. Credits to alternate sources (Correlli for the method, Zeex for ZCMD, etc)
  16. *
  17. * Copyright (c) 2013, Next Generation Gaming, LLC
  18. *
  19. * All rights reserved.
  20. *
  21. * Redistribution and use in source and binary forms, with or without modification,
  22. * are not permitted in any case.
  23. *
  24. *
  25. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  26. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  27. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  28. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  29. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  30. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  31. * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  32. * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  33. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  34. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  35. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  36. Note: The Z Coordinate when creating a surfboard is always 0.1 & the rotations should be the following rx = 270.0, ry = 0.0, rz = 180.0
  37. */
  38. // ------------------------- [Includes] ---------------------------
  39. #include <a_samp>
  40. #include <zcmd>
  41. #include <streamer>
  42. #include <YSInew\y_timers>
  43. // ------------------------- [Defines] ----------------------------
  44. #undef MAX_PLAYERS
  45. #define MAX_PLAYERS 500
  46. #define MAX_EVENT_PLAYERS 15
  47. #define MAX_PLAYER_SURFBOARD 100+MAX_EVENT_PLAYERS // Limited for now
  48. #define MAX_SURFBOARD_SPEED 30.0
  49. #define INVALID_SURFBOARD_ID -1
  50. #define COLOR_NAVY 0x0066CCFF
  51. #define COLOR_GREEN 0x4FBF30FF
  52. // ------------------------ [Enumeration] --------------------------
  53. enum pSurfboard
  54. {
  55. ID,
  56. modelID,
  57. objectID,
  58. Float: Speed,
  59. Float: Pos[6],
  60. Float: UpdatePos[3]
  61. }
  62. // ------------------------- [Variables] ---------------------------
  63. new PlayerSurfboardCount;
  64. new PlayerSurfboardInfo[MAX_PLAYERS][MAX_PLAYER_SURFBOARD][pSurfboard];
  65. new beachparty;
  66. new CurrentCheckPoint[MAX_PLAYERS] = 0;
  67. new Winners = 0;
  68. new SurfingRaceStarted = 0;
  69. new PlayersInEvent = 0;
  70. // --------------------------- [Array] -----------------------------
  71. new Float:CheckPoints[16][3] = {
  72. {538.6651,-1967.6935,1.0852},
  73. {512.1157,-2064.6506,1.0852},
  74. {646.3782,-2180.7458,1.0852},
  75. {826.0433,-2299.3477,1.0852},
  76. {804.0825,-2435.4219,1.0852},
  77. {592.2265,-2447.6296,1.0852},
  78. {441.0269,-2362.0586,1.0852},
  79. {223.8521,-2328.8127,1.0852},
  80. {73.9931,-2183.2849,1.0852},
  81. {5.5737,-1988.4398,1.0852},
  82. {80.8997,-1719.5684,1.0852},
  83. {-117.1616,-1694.8350,1.0852},
  84. {-143.4838,-1992.4514,1.0852},
  85. {75.0184,-2094.4722,1.0852},
  86. {371.4926,-2046.6212,1.0852},
  87. {541.0415,-1924.4780,-0.5766}
  88. };
  89. // ---------------------- [SA:MP Callbacks] ------------------------
  90. public OnFilterScriptInit()
  91. {
  92. print("Initiating Surfing-NGRP, please wait...");
  93. LoadScript();
  94. return 1;
  95. }
  96. public OnFilterScriptExit()
  97. {
  98. printf("Shutting Down Surfing-NGRP...");
  99. UnLoadScript();
  100. return 1;
  101. }
  102. public OnPlayerConnect(playerid)
  103. {
  104. for(new sbid = 0; sbid < MAX_PLAYER_SURFBOARD; sbid++)
  105. {
  106. PlayerSurfboardInfo[playerid][sbid][ID] = INVALID_SURFBOARD_ID;
  107. PlayerSurfboardInfo[playerid][sbid][modelID] = 0;
  108. PlayerSurfboardInfo[playerid][sbid][objectID] = 0;
  109. PlayerSurfboardInfo[playerid][sbid][Speed] = 0.0;
  110. PlayerSurfboardInfo[playerid][sbid][Pos][0] = 0.0;
  111. PlayerSurfboardInfo[playerid][sbid][Pos][1] = 0.0;
  112. PlayerSurfboardInfo[playerid][sbid][Pos][2] = 0.0;
  113. PlayerSurfboardInfo[playerid][sbid][Pos][3] = 0.0;
  114. PlayerSurfboardInfo[playerid][sbid][Pos][4] = 0.0;
  115. PlayerSurfboardInfo[playerid][sbid][Pos][5] = 0.0;
  116. PlayerSurfboardInfo[playerid][sbid][UpdatePos][0] = 0.0;
  117. PlayerSurfboardInfo[playerid][sbid][UpdatePos][1] = 0.0;
  118. PlayerSurfboardInfo[playerid][sbid][UpdatePos][2] = 0.0;
  119. CurrentCheckPoint[playerid] = 0;
  120. }
  121. return 1;
  122. }
  123. public OnPlayerDisconnect(playerid, reason)
  124. {
  125. if(GetPVarInt(playerid, "PlayerSurfing") == 1)
  126. {
  127. PlayerSurfboardCount--;
  128. DestroyPlayerSurfboard(playerid);
  129. }
  130. if(GetPVarInt(playerid, "PlayerSurfing") == 2)
  131. {
  132. DestroyEventSurfboard(playerid);
  133. }
  134. return 1;
  135. }
  136. public OnPlayerDeath(playerid, killerid, reason)
  137. {
  138. if(GetPVarInt(playerid, "PlayerSurfing") == 1)
  139. {
  140. PlayerSurfboardCount--;
  141. DestroyPlayerSurfboard(playerid);
  142. }
  143. if(GetPVarInt(playerid, "PlayerSurfing") == 2)
  144. {
  145. DestroyEventSurfboard(playerid);
  146. }
  147. return 1;
  148. }
  149. public OnPlayerEnterDynamicArea(playerid, areaid)
  150. {
  151. if(areaid == beachparty)
  152. {
  153. if(GetPVarInt(playerid, "PlayerSurfing") == 0)
  154. {
  155. if(IsPlayerInAnyVehicle(playerid))
  156. {
  157. new carid = GetPlayerVehicleID(playerid);
  158. if(IsAPlane(carid))
  159. {
  160. SendClientMessage(playerid, 0x1DD1DEFF, "The Santa Marina Beach Area is currently restricted from any air traffic due to the 4th of July Events.");
  161. SendClientMessage(playerid, 0x1DD1DEFF, "We have teleported you over blueberry, make sure to keep enough speed to not stall and fall to the ground.");
  162. SetVehiclePos(carid, 0, 0, 1000.0);
  163. //SetPlayerPos(playerid, 0, 0, 1000.0);
  164. }
  165. }
  166. }
  167. }
  168. return 1;
  169. }
  170. public OnPlayerUpdate(playerid)
  171. {
  172. if(GetPVarInt(playerid, "PlayerSurfing") != 0)
  173. {
  174. new sID = INVALID_SURFBOARD_ID;
  175. for(new i = 0; i < MAX_PLAYER_SURFBOARD; i++)
  176. {
  177. if(PlayerSurfboardInfo[playerid][i][ID] != INVALID_SURFBOARD_ID)
  178. {
  179. sID = PlayerSurfboardInfo[playerid][i][ID];
  180. break;
  181. }
  182. }
  183. if(sID != INVALID_SURFBOARD_ID)
  184. {
  185. if(GetPVarInt(playerid, "WaitingOnEvent") == 0)
  186. {
  187. new keys[3], Float: floatVal[4];
  188. GetPlayerPos(playerid, floatVal[0], floatVal[1], floatVal[2]);
  189. floatVal[3] = PlayerSurfboardInfo[playerid][sID][Speed];
  190. GetPlayerKeys(playerid, keys[0], keys[1], keys[2]);
  191. GetXYInFrontOfPlayerOnSB(playerid, floatVal[0], floatVal[1], 50.0);
  192. PlayerSurfboardInfo[playerid][sID][UpdatePos][0] = floatVal[0];
  193. PlayerSurfboardInfo[playerid][sID][UpdatePos][1] = floatVal[1];
  194. PlayerSurfboardInfo[playerid][sID][UpdatePos][2] = PlayerSurfboardInfo[playerid][sID][Pos][2];
  195. if(keys[1] == KEY_UP)
  196. {
  197. if(floatVal[3] >= 0.0 && floatVal[3] < MAX_SURFBOARD_SPEED) PlayerSurfboardInfo[playerid][sID][Speed] += 0.10;
  198. if(floatVal[3] >= MAX_SURFBOARD_SPEED) PlayerSurfboardInfo[playerid][sID][Speed] = MAX_SURFBOARD_SPEED;
  199. }
  200. else if(keys[1] == KEY_DOWN)
  201. {
  202. if(floatVal[3] >= 0.0 && floatVal[3] < MAX_SURFBOARD_SPEED) PlayerSurfboardInfo[playerid][sID][Speed] -= 0.10;
  203. if(floatVal[3] >= MAX_SURFBOARD_SPEED) PlayerSurfboardInfo[playerid][sID][Speed] = MAX_SURFBOARD_SPEED;
  204. }
  205. if(keys[2] == KEY_LEFT)
  206. {
  207. PlayerSurfboardInfo[playerid][sID][Speed] -= 0.01;
  208. PlayerSurfboardInfo[playerid][sID][Pos][5] += 1.5;
  209. SetObjectRot(PlayerSurfboardInfo[playerid][sID][objectID], PlayerSurfboardInfo[playerid][sID][Pos][3], PlayerSurfboardInfo[playerid][sID][Pos][4], PlayerSurfboardInfo[playerid][sID][Pos][5]);
  210. SetPlayerFacingAngle(playerid, PlayerSurfboardInfo[playerid][sID][Pos][5] + 270.0);
  211. PlayerSurfboardInfo[playerid][sID][UpdatePos][0] = floatVal[0];
  212. PlayerSurfboardInfo[playerid][sID][UpdatePos][1] = floatVal[1];
  213. PlayerSurfboardInfo[playerid][sID][UpdatePos][2] = PlayerSurfboardInfo[playerid][sID][Pos][2];
  214. }
  215. else if(keys[2] == KEY_RIGHT)
  216. {
  217. PlayerSurfboardInfo[playerid][sID][Speed] -= 0.01;
  218. PlayerSurfboardInfo[playerid][sID][Pos][5] -= 1.5;
  219. SetObjectRot(PlayerSurfboardInfo[playerid][sID][objectID], PlayerSurfboardInfo[playerid][sID][Pos][3], PlayerSurfboardInfo[playerid][sID][Pos][4], PlayerSurfboardInfo[playerid][sID][Pos][5]);
  220. SetPlayerFacingAngle(playerid, PlayerSurfboardInfo[playerid][sID][Pos][5] + 270.0);
  221. PlayerSurfboardInfo[playerid][sID][UpdatePos][0] = floatVal[0];
  222. PlayerSurfboardInfo[playerid][sID][UpdatePos][1] = floatVal[1];
  223. PlayerSurfboardInfo[playerid][sID][UpdatePos][2] = PlayerSurfboardInfo[playerid][sID][Pos][2];
  224. }
  225. if(PlayerSurfboardInfo[playerid][sID][Speed] > 0.010)
  226. {
  227. PlayerSurfboardInfo[playerid][sID][Speed] -= 0.010;
  228. MoveObject(PlayerSurfboardInfo[playerid][sID][objectID], PlayerSurfboardInfo[playerid][sID][UpdatePos][0], PlayerSurfboardInfo[playerid][sID][UpdatePos][1], PlayerSurfboardInfo[playerid][sID][UpdatePos][2], PlayerSurfboardInfo[playerid][sID][Speed]);
  229. }
  230. else StopPlayerSurfboard(playerid, sID);
  231. }
  232. }
  233. }
  234. return 1;
  235. }
  236. public OnPlayerEnterRaceCheckpoint(playerid)
  237. {
  238. new string[128];
  239. DisablePlayerRaceCheckpoint(playerid);
  240. CurrentCheckPoint[playerid]++;
  241. if(CurrentCheckPoint[playerid] == 14)
  242. {
  243. GameTextForPlayer(playerid, "Final Checkpoint", 2000, 4);
  244. SendClientMessage(playerid, 0xF73811FF, "Final Checkpoint");
  245. SetPlayerRaceCheckpoint(playerid, 1, CheckPoints[CurrentCheckPoint[playerid]][0], CheckPoints[CurrentCheckPoint[playerid]][1], CheckPoints[CurrentCheckPoint[playerid]][2], CheckPoints[CurrentCheckPoint[playerid]+1][0], CheckPoints[CurrentCheckPoint[playerid]+1][1], CheckPoints[CurrentCheckPoint[playerid]+1][2], 15);
  246. }
  247. else if(CurrentCheckPoint[playerid] == 15)
  248. {
  249. Winners++;
  250. if(Winners == 1)
  251. {
  252. for(new i = 0; i < MAX_PLAYERS; i++)
  253. {
  254. if(GetPVarInt(i, "PlayerSurfing") == 2)
  255. {
  256. format(string, sizeof(string), "[Surfing Event] First Place: %s", GetPlayerNameEx(playerid));
  257. SendClientMessage(i, COLOR_NAVY, string);
  258. }
  259. }
  260. DestroyEventSurfboard(playerid);
  261. }
  262. else if(Winners == 2)
  263. {
  264. for(new i = 0; i < MAX_PLAYERS; i++)
  265. {
  266. if(GetPVarInt(i, "PlayerSurfing") == 2)
  267. {
  268. format(string, sizeof(string), "[Surfing Event] Second Place: %s", GetPlayerNameEx(playerid));
  269. SendClientMessage(i, COLOR_NAVY, string);
  270. }
  271. }
  272. DestroyEventSurfboard(playerid);
  273. }
  274. else if(Winners == 3)
  275. {
  276. for(new i = 0; i < MAX_PLAYERS; i++)
  277. {
  278. if(GetPVarInt(i, "PlayerSurfing") == 2)
  279. {
  280. format(string, sizeof(string), "[Surfing Event] Third Place: %s", GetPlayerNameEx(playerid));
  281. SendClientMessage(i, COLOR_NAVY, string);
  282. }
  283. }
  284. DestroyEventSurfboard(playerid);
  285. }
  286. else
  287. {
  288. SendClientMessage(playerid, COLOR_NAVY, "You've finished the race, unfortunately you didn't finish in 1st, 2nd or 3d Position.");
  289. GameTextForPlayer(playerid, "You've finished the race", 2000, 1);
  290. DestroyEventSurfboard(playerid);
  291. }
  292. }
  293. else if(CurrentCheckPoint[playerid] < 14)
  294. {
  295. format(string, sizeof(string), "Checkpoint %d", CurrentCheckPoint[playerid]);
  296. SendClientMessage(playerid, 0xF73811FF, string);
  297. SetPlayerRaceCheckpoint(playerid, 0, CheckPoints[CurrentCheckPoint[playerid]][0], CheckPoints[CurrentCheckPoint[playerid]][1], CheckPoints[CurrentCheckPoint[playerid]][2], CheckPoints[CurrentCheckPoint[playerid]+1][0], CheckPoints[CurrentCheckPoint[playerid]+1][1], CheckPoints[CurrentCheckPoint[playerid]+1][2], 15);
  298. }
  299. return 1;
  300. }
  301. // ---------------------- [Public Functions] ------------------------
  302. forward LoadScript();
  303. public LoadScript()
  304. {
  305. PlayerSurfboardCount = 0;
  306. SurfingRaceStarted = 0;
  307. Winners = 0;
  308. PlayersInEvent = 0;
  309. for(new i = 0; i < MAX_PLAYERS; i++)
  310. {
  311. for(new sbid = 0; sbid < MAX_PLAYER_SURFBOARD; sbid++)
  312. {
  313. PlayerSurfboardInfo[i][sbid][ID] = INVALID_SURFBOARD_ID;
  314. PlayerSurfboardInfo[i][sbid][modelID] = 0;
  315. PlayerSurfboardInfo[i][sbid][objectID] = 0;
  316. PlayerSurfboardInfo[i][sbid][Speed] = 0.0;
  317. PlayerSurfboardInfo[i][sbid][Pos][0] = 0.0;
  318. PlayerSurfboardInfo[i][sbid][Pos][1] = 0.0;
  319. PlayerSurfboardInfo[i][sbid][Pos][2] = 0.0;
  320. PlayerSurfboardInfo[i][sbid][Pos][3] = 0.0;
  321. PlayerSurfboardInfo[i][sbid][Pos][4] = 0.0;
  322. PlayerSurfboardInfo[i][sbid][Pos][5] = 0.0;
  323. PlayerSurfboardInfo[i][sbid][UpdatePos][0] = 0.0;
  324. PlayerSurfboardInfo[i][sbid][UpdatePos][1] = 0.0;
  325. PlayerSurfboardInfo[i][sbid][UpdatePos][2] = 0.0;
  326. CurrentCheckPoint[i] = 0;
  327. SetPlayerMapIcon(i, 99, 243.6033, -1911.3003, -0.5853, 38, 0, MAPICON_LOCAL);
  328. }
  329. }
  330. beachparty = CreateDynamicSphere(232.2341, -1839.0952, 3.5475, 150.0, 0, 0);
  331. CreateDynamic3DTextLabel("Freeroam Surfing \nType /surf to start freeroam surfing", 0xEDE90CFF,243.6033,-1911.3003,-0.5853+0.6,90.0);
  332. CreateDynamic3DTextLabel("Surfing Event \nType /surf to join the event", 0xEDE90CFF,324.7307,-1912.4688,-0.4616+0.6,20.0);
  333. CreateDynamicObject(10401,330.5000000,-1909.0000000,2.1000000,0.0000000,0.0000000,312.0000000); //object(hc_shed02_sfs) (1)
  334. CreateDynamicObject(3430,333.7000100,-1888.5999800,2.1000000,0.0000000,0.0000000,354.0000000); //object(vegasbooth01) (2)
  335. CreateDynamicObject(3430,317.8999900,-1888.0999800,2.1000000,0.0000000,0.0000000,355.9960000); //object(vegasbooth01) (3)
  336. CreateDynamicObject(970,333.1000100,-1901.4000200,0.4000000,0.0000000,0.0000000,268.0000000); //object(fencesmallb) (12)
  337. CreateDynamicObject(970,333.0012200,-1903.8199500,-1.2000000,0.0000000,270.0000000,268.0000000); //object(fencesmallb) (13)
  338. CreateDynamicObject(970,333.6000100,-1892.0999800,1.2000000,0.0000000,0.0000000,268.0000000); //object(fencesmallb) (14)
  339. CreateDynamicObject(970,333.4599900,-1896.2004400,1.0000000,0.0000000,0.0000000,267.9950000); //object(fencesmallb) (15)
  340. CreateDynamicObject(970,333.3687700,-1898.6999500,-0.5000000,0.0000000,90.0000000,267.9950000); //object(fencesmallb) (16)
  341. CreateDynamicObject(970,317.2000100,-1902.9000200,-1.2000000,0.0000000,270.0000000,267.9950000); //object(fencesmallb) (17)
  342. CreateDynamicObject(970,317.2500000,-1900.5000000,0.3500000,0.0000000,0.0000000,268.0000000); //object(fencesmallb) (18)
  343. CreateDynamicObject(970,317.6000100,-1898.0999800,-0.5000000,0.0000000,90.0000000,267.9950000); //object(fencesmallb) (19)
  344. CreateDynamicObject(970,317.6200000,-1895.5200200,1.0000000,0.0000000,0.0000000,267.9950000); //object(fencesmallb) (20)
  345. CreateDynamicObject(970,317.7500000,-1891.4000200,1.2000000,0.0000000,0.0000000,267.9950000); //object(fencesmallb) (21)
  346. CreateDynamicObject(3406,318.0000000,-1907.8000500,-1.8000000,0.0000000,0.0000000,266.0000000); //object(cxref_woodjetty) (1)
  347. CreateDynamicObject(3406,317.3800000,-1916.5200200,-1.8000000,0.0000000,0.0000000,265.9950000); //object(cxref_woodjetty) (2)
  348. CreateDynamicObject(3406,331.3999900,-1917.3000500,-1.8000000,0.0000000,0.0000000,265.9950000); //object(cxref_woodjetty) (3)
  349. CreateDynamicObject(3406,332.0200200,-1908.5400400,-1.8000000,0.0000000,0.0000000,266.0000000); //object(cxref_woodjetty) (4)
  350. CreateDynamicObject(3406,334.9700000,-1922.4499500,-1.8000000,0.0000000,0.0000000,355.9950000); //object(cxref_woodjetty) (5)
  351. CreateDynamicObject(3406,314.2000100,-1921.0000000,-1.8000000,0.0000000,0.0000000,355.9900000); //object(cxref_woodjetty) (6)
  352. CreateDynamicObject(1461,318.2000100,-1892.9000200,1.5000000,0.0000000,0.0000000,88.0000000); //object(dyn_life_p) (1)
  353. CreateDynamicObject(1461,333.2000100,-1894.0000000,1.5000000,0.0000000,0.0000000,270.0000000); //object(dyn_life_p) (2)
  354. CreateDynamicObject(1295,316.7000100,-1894.0000000,5.9000000,0.0000000,0.0000000,0.0000000); //object(doublestreetlght1) (1)
  355. CreateDynamicObject(1295,334.8999900,-1895.0000000,5.9000000,0.0000000,0.0000000,178.0000000); //object(doublestreetlght1) (2)
  356. CreateDynamicObject(6299,306.0000000,-1880.4000200,3.6000000,0.0000000,0.0000000,40.0000000); //object(pier03c_law2) (1)
  357. CreateDynamicObject(3276,311.7999900,-1878.0000000,2.0000000,0.0000000,0.0000000,308.0000000); //object(cxreffencesld) (1)
  358. CreateDynamicObject(864,316.7000100,-1883.0000000,1.1000000,0.0000000,0.0000000,0.0000000); //object(sand_combush1) (1)
  359. CreateDynamicObject(864,315.1000100,-1881.4000200,1.2000000,0.0000000,0.0000000,0.0000000); //object(sand_combush1) (2)
  360. CreateDynamicObject(864,314.7000100,-1886.1999500,1.2000000,0.0000000,0.0000000,0.0000000); //object(sand_combush1) (3)
  361. CreateDynamicObject(864,309.8999900,-1882.5000000,1.2000000,0.0000000,0.0000000,0.0000000); //object(sand_combush1) (4)
  362. CreateDynamicObject(3276,315.5000000,-1883.0999800,1.8000000,0.0000000,0.0000000,307.9960000); //object(cxreffencesld) (2)
  363. CreateDynamicObject(1535,296.0999500,-1880.1999500,1.2000000,0.0000000,0.0000000,310.0000000); //object(gen_doorext14) (1)
  364. CreateDynamicObject(1295,305.2000100,-1867.8000500,5.9000000,0.0000000,0.0000000,320.0000000); //object(doublestreetlght1) (1)
  365. CreateDynamicObject(1295,280.6000100,-1865.8000500,5.9000000,0.0000000,0.0000000,319.9990000); //object(doublestreetlght1) (1)
  366. CreateDynamicObject(1295,239.8000000,-1864.3000500,5.9000000,0.0000000,0.0000000,319.9990000); //object(doublestreetlght1) (1)
  367. CreateDynamicObject(1295,191.3000000,-1866.4000200,5.9000000,0.0000000,0.0000000,319.9990000); //object(doublestreetlght1) (1)
  368. CreateDynamicObject(1946,320.7999900,-1870.9000200,2.1000000,0.0000000,0.0000000,0.0000000); //object(baskt_ball_hi) (1)
  369. CreateDynamicObject(1598,313.5000000,-1870.3000500,2.1000000,0.0000000,0.0000000,0.0000000); //object(beachball) (1)
  370. CreateDynamicObject(1598,330.0000000,-1868.6999500,2.1000000,0.0000000,0.0000000,0.0000000); //object(beachball) (2)
  371. CreateDynamicObject(1598,324.7000100,-1915.5999800,0.1000000,0.0000000,0.0000000,0.0000000); //object(beachball) (3)
  372. CreateDynamicObject(1295,350.2999900,-1893.0000000,5.9000000,0.0000000,0.0000000,163.9990000); //object(doublestreetlght1) (1)
  373. CreateDynamicObject(997,329.7000100,-1899.0999800,0.4000000,0.0000000,0.0000000,358.0000000); //object(lhouse_barrier3) (1)
  374. CreateDynamicObject(997,324.2000100,-1898.9000200,0.4000000,0.0000000,0.0000000,357.9950000); //object(lhouse_barrier3) (2)
  375. CreateDynamicObject(997,319.2000100,-1898.8000500,0.4000000,0.0000000,0.0000000,357.9950000); //object(lhouse_barrier3) (3)
  376. // Barrells for checkpoints
  377. CreateDynamicObject(1237,538.6651,-1967.6935,1.0852,0.00000000,0.00000000,0.00000000);
  378. CreateDynamicObject(1237,512.1157,-2064.6506,1.0852,0.00000000,0.00000000,0.00000000);
  379. CreateDynamicObject(1237,646.3782,-2180.7458,1.0852,0.00000000,0.00000000,0.00000000);
  380. CreateDynamicObject(1237,826.0433,-2299.3477,1.0852,0.00000000,0.00000000,0.00000000);
  381. CreateDynamicObject(1237,804.0825,-2435.4219,1.0852,0.00000000,0.00000000,0.00000000);
  382. CreateDynamicObject(1237,592.2265,-2447.6296,1.0852,0.00000000,0.00000000,0.00000000);
  383. CreateDynamicObject(1237,441.0269,-2362.0586,1.0852,0.00000000,0.00000000,0.00000000);
  384. CreateDynamicObject(1237,223.8521,-2328.8127,1.0852,0.00000000,0.00000000,0.00000000);
  385. CreateDynamicObject(1237,73.9931,-2183.2849,1.0852,0.00000000,0.00000000,0.00000000);
  386. CreateDynamicObject(1237,5.5737,-1988.4398,1.0852,0.00000000,0.00000000,0.00000000);
  387. CreateDynamicObject(1237,80.8997,-1719.5684,1.0852,0.00000000,0.00000000,0.00000000);
  388. CreateDynamicObject(1237,-117.1616,-1694.8350,1.0852,0.00000000,0.00000000,0.00000000);
  389. CreateDynamicObject(1237,-143.4838,-1992.4514,1.0852,0.00000000,0.00000000,0.00000000);
  390. CreateDynamicObject(1237,75.0184,-2094.4722,1.0852,0.00000000,0.00000000,0.00000000);
  391. CreateDynamicObject(1237,-143.4838,-1992.4514,1.0852,0.00000000,0.00000000,0.00000000);
  392. CreateDynamicObject(1237,371.4926,-2046.6212,1.0852,0.00000000,0.00000000,0.00000000);
  393. // Flares for checkpoints
  394. CreateDynamicObject(354,538.6651,-1967.6935,1.0852,0.00000000,0.00000000,0.00000000);
  395. CreateDynamicObject(354,512.1157,-2064.6506,1.0852,0.00000000,0.00000000,0.00000000);
  396. CreateDynamicObject(354,646.3782,-2180.7458,1.0852,0.00000000,0.00000000,0.00000000);
  397. CreateDynamicObject(354,826.0433,-2299.3477,1.0852,0.00000000,0.00000000,0.00000000);
  398. CreateDynamicObject(354,804.0825,-2435.4219,1.0852,0.00000000,0.00000000,0.00000000);
  399. CreateDynamicObject(354,592.2265,-2447.6296,1.0852,0.00000000,0.00000000,0.00000000);
  400. CreateDynamicObject(354,441.0269,-2362.0586,1.0852,0.00000000,0.00000000,0.00000000);
  401. CreateDynamicObject(354,223.8521,-2328.8127,1.0852,0.00000000,0.00000000,0.00000000);
  402. CreateDynamicObject(354,73.9931,-2183.2849,1.0852,0.00000000,0.00000000,0.00000000);
  403. CreateDynamicObject(354,5.5737,-1988.4398,1.0852,0.00000000,0.00000000,0.00000000);
  404. CreateDynamicObject(354,80.8997,-1719.5684,1.0852,0.00000000,0.00000000,0.00000000);
  405. CreateDynamicObject(354,-117.1616,-1694.8350,1.0852,0.00000000,0.00000000,0.00000000);
  406. CreateDynamicObject(354,-143.4838,-1992.4514,1.0852,0.00000000,0.00000000,0.00000000);
  407. CreateDynamicObject(354,75.0184,-2094.4722,1.0852,0.00000000,0.00000000,0.00000000);
  408. CreateDynamicObject(354,-143.4838,-1992.4514,1.0852,0.00000000,0.00000000,0.00000000);
  409. CreateDynamicObject(354,371.4926,-2046.6212,1.0852,0.00000000,0.00000000,0.00000000);
  410. print("Successfully loaded Surfing-NGRP.");
  411. return 1;
  412. }
  413. forward UnLoadScript();
  414. public UnLoadScript()
  415. {
  416. PlayerSurfboardCount = 0;
  417. SurfingRaceStarted = 0;
  418. Winners = 0;
  419. PlayersInEvent = 0;
  420. for(new i = 0; i < MAX_PLAYERS; i++)
  421. {
  422. if(GetPVarInt(i, "PlayerSurfing") == 1) { DestroyPlayerSurfboard(i); }
  423. if(GetPVarInt(i, "PlayerSurfing") == 2) { DestroyEventSurfboard(i); }
  424. }
  425. print("Successfully unloaded Surfing-NGRP.");
  426. return 1;
  427. }
  428. forward SurfCountdown(playerid);
  429. public SurfCountdown(playerid)
  430. {
  431. if(GetPVarInt(playerid, "countdownevent") == 1)
  432. {
  433. SendClientMessage(playerid, 0xF73811FF, "[Surfing Event] 3");
  434. SetPVarInt(playerid, "countdownevent", 2);
  435. SetTimerEx("SurfCountdown", 1000, false, "i", playerid);
  436. }
  437. else if(GetPVarInt(playerid, "countdownevent") == 2)
  438. {
  439. SendClientMessage(playerid, 0xF73811FF, "[Surfing Event] 2");
  440. SetPVarInt(playerid, "countdownevent", 3);
  441. SetTimerEx("SurfCountdown", 1000, false, "i", playerid);
  442. }
  443. else if(GetPVarInt(playerid, "countdownevent") == 3)
  444. {
  445. SendClientMessage(playerid, 0xF73811FF, "[Surfing Event] 1");
  446. SetPVarInt(playerid, "countdownevent", 4);
  447. SetTimerEx("SurfCountdown", 1000, false, "i", playerid);
  448. }
  449. else if(GetPVarInt(playerid, "countdownevent") == 4)
  450. {
  451. SendClientMessage(playerid, 0xF73811FF, "[Surfing Event] Go Go Go");
  452. CurrentCheckPoint[playerid] = 0;
  453. StartSurfRace(playerid);
  454. }
  455. return 1;
  456. }
  457. forward StartSurfRace(playerid);
  458. public StartSurfRace(playerid)
  459. {
  460. Winners = 0;
  461. SurfingRaceStarted = 1;
  462. SetPVarInt(playerid, "PlayerSurfing", 2);
  463. DeletePVar(playerid, "EventStage");
  464. DeletePVar(playerid, "WaitingOnEvent");
  465. SetPVarInt(playerid, "countdownevent", 0);
  466. SetPlayerRaceCheckpoint(playerid, 0, CheckPoints[CurrentCheckPoint[playerid]][0], CheckPoints[CurrentCheckPoint[playerid]][1], CheckPoints[CurrentCheckPoint[playerid]][2], CheckPoints[CurrentCheckPoint[playerid]+1][0], CheckPoints[CurrentCheckPoint[playerid]+1][1], CheckPoints[CurrentCheckPoint[playerid]+1][2], 15);
  467. return 1;
  468. }
  469. // ---------------------- [Stock Functions] ------------------------
  470. stock CreatePlayerSurfboard(playerid, modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz = 0.0)
  471. {
  472. new nextid = GetFreePlayerSurfboard(), Float: objPos[3];
  473. if(nextid == 100) return SendClientMessage(playerid, COLOR_NAVY, "Sorry, we cannot spawn a surfboard at the moment as we have reached the limit of current player surfboards.");
  474. if(PlayerSurfboardCount == 100) return SendClientMessage(playerid, COLOR_NAVY, "Sorry, we cannot spawn a surfboard at the moment as we have reached the limit of current player surfboards.");
  475. PlayerSurfboardInfo[playerid][nextid][ID] = nextid;
  476. PlayerSurfboardInfo[playerid][nextid][modelID] = 2043 + modelid; // Reminder: Valid model id: 1, 2 & 3
  477. PlayerSurfboardInfo[playerid][nextid][Speed] = 0.0;
  478. PlayerSurfboardInfo[playerid][nextid][Pos][0] = x;
  479. PlayerSurfboardInfo[playerid][nextid][Pos][1] = y;
  480. PlayerSurfboardInfo[playerid][nextid][Pos][2] = z;
  481. PlayerSurfboardInfo[playerid][nextid][Pos][3] = rx;
  482. PlayerSurfboardInfo[playerid][nextid][Pos][4] = ry;
  483. PlayerSurfboardInfo[playerid][nextid][Pos][5] = rz;
  484. PlayerSurfboardInfo[playerid][nextid][objectID] = CreateObject(2403 + modelid, x, y, z, rx, ry, rz);
  485. PlayerSurfboardCount++;
  486. SetPVarInt(playerid, "PlayerSurfing", 1);
  487. GetObjectPos(PlayerSurfboardInfo[playerid][nextid][objectID], objPos[0], objPos[1], objPos[2]);
  488. SetPlayerPos(playerid, objPos[0], objPos[1], objPos[2]+2);
  489. SetPlayerFacingAngle(playerid, PlayerSurfboardInfo[playerid][nextid][Pos][5] + 270.0);
  490. ApplyAnimation(playerid, "BSKTBALL", "BBALL_def_loop", 4.0, 1, 0, 0, 0, 0);
  491. //printf("Successfully created %d surfboard.", playerid);
  492. return nextid;
  493. }
  494. stock CreateEventSurfboard(playerid, modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz = 0.0)
  495. {
  496. new nextid = GetFreePlayerSurfboard(), Float: objPos[3];
  497. if(nextid == MAX_PLAYER_SURFBOARD) return SendClientMessage(playerid, COLOR_NAVY, "Sorry, we cannot spawn a surfboard at the moment as we have reached the limit of current player surfboards.");
  498. if(PlayerSurfboardCount == MAX_PLAYER_SURFBOARD) return SendClientMessage(playerid, COLOR_NAVY, "Sorry, we cannot spawn a surfboard at the moment as we have reached the limit of current player surfboards.");
  499. PlayerSurfboardInfo[playerid][nextid][ID] = nextid;
  500. PlayerSurfboardInfo[playerid][nextid][modelID] = 2043 + modelid; // Reminder: Valid model id: 1, 2 & 3
  501. PlayerSurfboardInfo[playerid][nextid][Speed] = 0.0;
  502. PlayerSurfboardInfo[playerid][nextid][Pos][0] = x;
  503. PlayerSurfboardInfo[playerid][nextid][Pos][1] = y;
  504. PlayerSurfboardInfo[playerid][nextid][Pos][2] = z;
  505. PlayerSurfboardInfo[playerid][nextid][Pos][3] = rx;
  506. PlayerSurfboardInfo[playerid][nextid][Pos][4] = ry;
  507. PlayerSurfboardInfo[playerid][nextid][Pos][5] = rz;
  508. PlayerSurfboardInfo[playerid][nextid][objectID] = CreateObject(2403 + modelid, x, y, z, rx, ry, rz);
  509. SetPVarInt(playerid, "PlayerSurfing", 2);
  510. SetPVarInt(playerid, "WaitingOnEvent", 1);
  511. GetObjectPos(PlayerSurfboardInfo[playerid][nextid][objectID], objPos[0], objPos[1], objPos[2]);
  512. SetPlayerPos(playerid, objPos[0], objPos[1], objPos[2]+2);
  513. SetPlayerFacingAngle(playerid, PlayerSurfboardInfo[playerid][nextid][Pos][5] + 270.0);
  514. ApplyAnimation(playerid, "BSKTBALL", "BBALL_def_loop", 4.0, 1, 0, 0, 0, 0);
  515. PlayersInEvent++;
  516. IsEventReady();
  517. //printf("Successfully created %d event surfboard.", playerid);
  518. return nextid;
  519. }
  520. stock DestroyPlayerSurfboard(playerid)
  521. {
  522. new count = 0;
  523. for(new i = 0; i < MAX_PLAYER_SURFBOARD; i++)
  524. {
  525. if(count == 100) { break; }
  526. if(PlayerSurfboardInfo[playerid][i][ID] != INVALID_SURFBOARD_ID)
  527. {
  528. PlayerSurfboardInfo[playerid][i][ID] = INVALID_SURFBOARD_ID;
  529. PlayerSurfboardInfo[playerid][i][modelID] = 0;
  530. PlayerSurfboardInfo[playerid][i][Speed] = 0.0;
  531. PlayerSurfboardInfo[playerid][i][Pos][0] = 0.0;
  532. PlayerSurfboardInfo[playerid][i][Pos][1] = 0.0;
  533. PlayerSurfboardInfo[playerid][i][Pos][2] = 0.0;
  534. PlayerSurfboardInfo[playerid][i][Pos][3] = 0.0;
  535. PlayerSurfboardInfo[playerid][i][Pos][4] = 0.0;
  536. PlayerSurfboardInfo[playerid][i][Pos][5] = 0.0;
  537. PlayerSurfboardInfo[playerid][i][UpdatePos][0] = 0.0;
  538. PlayerSurfboardInfo[playerid][i][UpdatePos][1] = 0.0;
  539. PlayerSurfboardInfo[playerid][i][UpdatePos][2] = 0.0;
  540. DestroyObject(PlayerSurfboardInfo[playerid][i][objectID]);
  541. PlayerSurfboardInfo[playerid][i][objectID] = 0;
  542. ClearAnimations(playerid);
  543. DeletePVar(playerid, "PlayerSurfing");
  544. SetPlayerPos(playerid, 324.6641,-1892.0195,1.7212);
  545. //printf("Successfully destroyed %d surfboard.", playerid);
  546. }
  547. count++;
  548. }
  549. return 1;
  550. }
  551. stock DestroyEventSurfboard(playerid)
  552. {
  553. for(new i = 0; i < MAX_PLAYER_SURFBOARD; i++)
  554. {
  555. if(PlayerSurfboardInfo[playerid][i][ID] != INVALID_SURFBOARD_ID)
  556. {
  557. PlayerSurfboardInfo[playerid][i][ID] = INVALID_SURFBOARD_ID;
  558. PlayerSurfboardInfo[playerid][i][modelID] = 0;
  559. PlayerSurfboardInfo[playerid][i][Speed] = 0.0;
  560. PlayerSurfboardInfo[playerid][i][Pos][0] = 0.0;
  561. PlayerSurfboardInfo[playerid][i][Pos][1] = 0.0;
  562. PlayerSurfboardInfo[playerid][i][Pos][2] = 0.0;
  563. PlayerSurfboardInfo[playerid][i][Pos][3] = 0.0;
  564. PlayerSurfboardInfo[playerid][i][Pos][4] = 0.0;
  565. PlayerSurfboardInfo[playerid][i][Pos][5] = 0.0;
  566. PlayerSurfboardInfo[playerid][i][UpdatePos][0] = 0.0;
  567. PlayerSurfboardInfo[playerid][i][UpdatePos][1] = 0.0;
  568. PlayerSurfboardInfo[playerid][i][UpdatePos][2] = 0.0;
  569. DestroyObject(PlayerSurfboardInfo[playerid][i][objectID]);
  570. PlayerSurfboardInfo[playerid][i][objectID] = 0;
  571. ClearAnimations(playerid);
  572. CurrentCheckPoint[playerid] = 0;
  573. DisablePlayerRaceCheckpoint(playerid);
  574. SetPVarInt(playerid, "PlayerSurfing", 0);
  575. DeletePVar(playerid, "EventStage");
  576. if(GetPVarInt(playerid, "WaitingOnEvent") == 1) { DeletePVar(playerid, "WaitingOnEvent"); }
  577. PlayersInEvent--;
  578. if(PlayersInEvent == 0) { SurfingRaceStarted = 0; }
  579. SetPlayerPos(playerid, 324.6641,-1892.0195,1.7212);
  580. //printf("Successfully destroyed %d surfboard.", playerid);
  581. }
  582. }
  583. return 1;
  584. }
  585. stock IsPlayerSurfboardCreated(sID)
  586. {
  587. for(new p = 0; p < MAX_PLAYERS; p++)
  588. {
  589. if(PlayerSurfboardInfo[p][sID][modelID]) return true;
  590. }
  591. return false;
  592. }
  593. stock GetFreePlayerSurfboard()
  594. {
  595. new sID = INVALID_SURFBOARD_ID;
  596. for(new i = 0; i < MAX_PLAYER_SURFBOARD; i++)
  597. {
  598. if(!IsPlayerSurfboardCreated(i))
  599. {
  600. sID = i;
  601. break;
  602. }
  603. }
  604. return sID;
  605. }
  606. stock SetPlayerSurfboardSpeed(playerid, sID, Float: surfspeed = MAX_SURFBOARD_SPEED)
  607. {
  608. if(!IsPlayerSurfboardCreated(sID)) return false;
  609. if(surfspeed > MAX_SURFBOARD_SPEED) PlayerSurfboardInfo[playerid][sID][Speed] = MAX_SURFBOARD_SPEED;
  610. else PlayerSurfboardInfo[playerid][sID][Speed] = surfspeed;
  611. return 1;
  612. }
  613. stock StopPlayerSurfboard(playerid, sID)
  614. {
  615. if(!IsPlayerSurfboardCreated(sID)) return false;
  616. PlayerSurfboardInfo[playerid][sID][Speed] = 0.0;
  617. StopObject(PlayerSurfboardInfo[playerid][sID][objectID]);
  618. return true;
  619. }
  620. stock GetXYInFrontOfPlayerOnSB(playerid, &Float:x, &Float:y, Float:distance)
  621. {
  622. new
  623. Float:angle;
  624. GetPlayerPos(playerid, x, y, angle);
  625. GetPlayerFacingAngle(playerid, angle);
  626. x += (distance * floatsin(-angle + 270.0, degrees));
  627. y += (distance * floatcos(-angle + 270.0, degrees));
  628. }
  629. stock IsEventReady()
  630. {
  631. if(PlayersInEvent == MAX_EVENT_PLAYERS)
  632. {
  633. for(new i = 0; i < MAX_PLAYERS; i++)
  634. {
  635. if(GetPVarInt(i, "PlayerSurfing") == 2)
  636. {
  637. SendClientMessage(i, COLOR_GREEN, "Prepare yourselves...");
  638. SetPVarInt(i, "EventStage", 1);
  639. SetPVarInt(i, "countdownevent", 1);
  640. SurfCountdown(i);
  641. }
  642. }
  643. }
  644. else
  645. {
  646. for(new i = 0; i < MAX_PLAYERS; i++)
  647. {
  648. if(GetPVarInt(i, "PlayerSurfing") == 2)
  649. {
  650. SendClientMessage(i, -1, "Waiting for more players...");
  651. }
  652. }
  653. }
  654. return 1;
  655. }
  656. stock IsAPlane(carid)
  657. {
  658. switch(GetVehicleModel(carid)) {
  659. case 592, 577, 511, 512, 593, 520, 553, 476, 519, 460, 513, 548, 425, 417, 487, 488, 497, 563, 447, 469: return 1;
  660. }
  661. return 0;
  662. }
  663. stock GetPlayerNameEx(playerid)
  664. {
  665. new szName[MAX_PLAYER_NAME], iPos;
  666. GetPlayerName(playerid, szName, MAX_PLAYER_NAME);
  667. while ((iPos = strfind(szName, "_", false, iPos)) != -1) szName[iPos] = ' ';
  668. return szName;
  669. }
  670. // ---------------------- [Commands] --------------------------
  671. CMD:surf(playerid, params[])
  672. {
  673. //if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, -1, "Currently unavailable, we're fixing an issue");
  674. new Float: pos[3], string[128];
  675. if(IsPlayerInRangeOfPoint(playerid, 10.0, 324.7307,-1912.4688,-0.4616))
  676. {
  677. if(GetPVarInt(playerid, "PlayerSurfing") != 0) return SendClientMessage(playerid, COLOR_NAVY, "You're already surfing!");
  678. if(PlayerSurfboardCount == MAX_PLAYER_SURFBOARD) return SendClientMessage(playerid, COLOR_NAVY, "Sorry, we cannot spawn a surfboard at the moment as we have reached the limit of current player surfboards.");
  679. if(PlayersInEvent == MAX_EVENT_PLAYERS) return SendClientMessage(playerid, COLOR_NAVY, "The event is full!");
  680. if(SurfingRaceStarted == 1) return SendClientMessage(playerid, COLOR_NAVY, "The event has already started!");
  681. GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
  682. CreateEventSurfboard(playerid, 2, pos[0], pos[1], 0.1000000, 270, 0.0, 180.0);
  683. format(string, sizeof(string), "You joined the {FF2200}surfing event{F2EF27}, the event will start at %d players.", MAX_EVENT_PLAYERS);
  684. SendClientMessage(playerid, 0xF2EF27FF, string);
  685. for(new i = 0; i < MAX_PLAYERS; i++)
  686. {
  687. if(GetPVarInt(i, "PlayerSurfing") == 2)
  688. {
  689. format(string, sizeof(string), "[Surfing Event] %s has joined the race.", GetPlayerNameEx(playerid));
  690. SendClientMessage(i, COLOR_GREEN, string);
  691. }
  692. }
  693. }
  694. else if(IsPlayerInRangeOfPoint(playerid, 50.0, 256.4779,-1930.8368,-0.1967))
  695. {
  696. if(GetPVarInt(playerid, "PlayerSurfing") != 0) return SendClientMessage(playerid, COLOR_NAVY, "You're already surfing!");
  697. if(PlayerSurfboardCount == 100) return SendClientMessage(playerid, COLOR_NAVY, "Sorry, we cannot spawn a surfboard at the moment as we have reached the limit of current player surfboards.");
  698. GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
  699. CreatePlayerSurfboard(playerid, 1, pos[0], pos[1], 0.1000000, 270, 0.0, 180.0);
  700. }
  701. else
  702. {
  703. SendClientMessage(playerid, COLOR_NAVY, "To join the surfing event, head to the quay next of the dancefloor at Santa Maria Beach.");
  704. SendClientMessage(playerid, COLOR_NAVY, "If you want to freeroam surf, head next of the light house.");
  705. }
  706. return 1;
  707. }
  708. CMD:leavesurf(playerid, params[])
  709. {
  710. new string[128];
  711. if(GetPVarInt(playerid, "EventStage") == 1) return SendClientMessage(playerid, COLOR_NAVY, "You cannot leave the surfing event at this stage.");
  712. if(GetPVarInt(playerid, "PlayerSurfing") == 2)
  713. {
  714. for(new i = 0; i < MAX_PLAYERS; i++)
  715. {
  716. if(GetPVarInt(i, "PlayerSurfing") == 2)
  717. {
  718. format(string, sizeof(string), "[Surfing Event] %s has left the race (/leavesurf).", GetPlayerNameEx(playerid));
  719. SendClientMessage(i, COLOR_GREEN, string);
  720. DestroyEventSurfboard(playerid);
  721. }
  722. }
  723. }
  724. else if(GetPVarInt(playerid, "PlayerSurfing") == 1)
  725. {
  726. DestroyPlayerSurfboard(playerid);
  727. PlayerSurfboardCount--;
  728. SendClientMessage(playerid, COLOR_NAVY, "You have stopped surfing.");
  729. }
  730. return 1;
  731. }
  732. CMD:surfers(playerid, params[])
  733. {
  734. if(!IsPlayerAdmin(playerid)) return 0;
  735. new string[128];
  736. format(string, sizeof(string), "Current Surfers %d", PlayerSurfboardCount);
  737. SendClientMessage(playerid, -1, string);
  738. return 1;
  739. }
  740. CMD:surfersevent(playerid, params[])
  741. {
  742. if(!IsPlayerAdmin(playerid)) return 0;
  743. new string[128];
  744. format(string, sizeof(string), "Current Surfers %d", PlayersInEvent);
  745. SendClientMessage(playerid, -1, string);
  746. return 1;
  747. }
  748. CMD:joinsurf(playerid, params[])
  749. {
  750. return SendClientMessage(playerid, -1, "This command has been re-named to /surf");
  751. }
  752. // ---------------------- [Commands] --------------------------
  753. task SurfUpdate[2000]()
  754. {
  755. for(new i = 0; i < MAX_PLAYERS; i++)
  756. {
  757. if(GetPVarInt(i, "PlayerSurfing") != 0)
  758. {
  759. for(new sID = 0; sID < MAX_PLAYER_SURFBOARD; sID++)
  760. {
  761. if(PlayerSurfboardInfo[i][sID][ID] != INVALID_SURFBOARD_ID)
  762. {
  763. new Float: pos[3], Float: objPos[3];
  764. GetObjectPos(PlayerSurfboardInfo[i][sID][objectID], objPos[0], objPos[1], objPos[2]);
  765. GetPlayerPos(i, pos[0], pos[1], pos[2]);
  766. if(pos[2] < objPos[2])
  767. {
  768. if(GetPVarInt(i, "PlayerSurfing") == 1)
  769. {
  770. PlayerSurfboardCount--;
  771. DestroyPlayerSurfboard(i);
  772. SendClientMessage(i, COLOR_NAVY, "You have fell off the surfing board & have been sent back to Santa Maria Beach.");
  773. }
  774. else if(GetPVarInt(i, "PlayerSurfing") == 2)
  775. {
  776. DestroyEventSurfboard(i);
  777. SendClientMessage(i, COLOR_NAVY, "You have fell off the surfing board & have been disqualified from the event.");
  778. }
  779. }
  780. if(pos[0] == 0 || pos[1] == 0 || pos[2] == 0)
  781. {
  782. if(GetPVarInt(i, "PlayerSurfing") == 1)
  783. {
  784. DestroyPlayerSurfboard(i);
  785. SendClientMessage(i, COLOR_NAVY, "You're currently bugged, we've sent you back to Santa Maria Beach");
  786. }
  787. else if(GetPVarInt(i, "PlayerSurfing") == 2)
  788. {
  789. DestroyEventSurfboard(i);
  790. SendClientMessage(i, COLOR_NAVY, "You're currently bugged, we've sent you back to Santa Maria Beach");
  791. }
  792. }
  793. }
  794. }
  795. }
  796. }
  797. return 1;
  798. }