Advertisement
Guest User

DerbyZone

a guest
Jan 18th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 7.98 KB | None | 0 0
  1. #include <a_samp>
  2. #include <zcmd>
  3. #include <sscanf2>
  4. /********************************* Defines*************************************/
  5. #define NUMBER_OF_AREAS_STRING "10" // How many areas
  6. #define NUMBER_OF_AREAS 10 // ^^
  7. #define NUMBER_OF_PLAYERS 12 // How many players in each area
  8. #define DERBY_TIMER_SECONDS 3 // How many X seconds to call the public
  9. #define LOSE_HEIGHT 10.00 // The height that will detect loss
  10. /********************************** Variables *********************************/
  11. new Derby[MAX_PLAYERS char];
  12. new DerbyPlayers[NUMBER_OF_AREAS char];
  13. new DerbyVehicles[NUMBER_OF_AREAS][NUMBER_OF_PLAYERS];
  14. /*********************************** Publics **********************************/
  15. public OnGameModeInit()
  16. {
  17.     CreateObject(3458, -1332.51660, -3250.40161, 47.35142,   0.00000, 0.00000, 349.73163);
  18.     CreateObject(3458, -1411.95593, -3236.07446, 47.35142,   0.00000, 0.00000, 349.67163);
  19.     CreateObject(3458, -1312.85852, -3214.02563, 47.35142,   0.00000, 0.00000, 291.19977);
  20.     CreateObject(3458, -1401.27673, -3200.47266, 47.35142,   0.00000, 0.00000, 258.90121);
  21.     CreateObject(3458, -1317.15796, -3215.83569, 47.35142,   0.00000, 0.00000, 258.88016);
  22.     CreateObject(3458, -1336.01917, -3194.43604, 47.35142,   0.00000, 0.00000, 349.73163);
  23.     CreateObject(3458, -1375.66663, -3187.25488, 47.35142,   0.00000, 0.00000, 349.67163);
  24.     CreateObject(3458, -1377.96191, -3224.88159, 47.35142,   0.00000, 0.00000, 349.67163);
  25.     CreateObject(3458, -1387.74133, -3223.09375, 47.35142,   0.00000, 0.00000, 349.67163);
  26.     CreateObject(3458, -1338.28711, -3232.09448, 47.35142,   0.00000, 0.00000, 349.73163);
  27.     CreateObject(3458, -1391.93616, -3203.35449, 47.35142,   0.00000, 0.00000, 231.28847);
  28.     CreateObject(3458, -1294.35400, -3201.85864, 47.35142,   0.00000, 0.00000, 171.16153);
  29.     CreateObject(3458, -1307.18176, -3236.98730, 47.35142,   0.00000, 0.00000, 259.91318);
  30.     CreateObject(3458, -1290.89050, -3215.84790, 47.35142,   0.00000, 0.00000, 214.89233);
  31.     CreateObject(3458, -1423.73547, -3220.03101, 47.35142,   0.00000, 0.00000, 259.91318);
  32.     CreateObject(3458, -1408.29407, -3197.23364, 47.35142,   0.00000, 0.00000, 223.42667);
  33.     CreateObject(3458, -1419.28589, -3179.83057, 47.35142,   0.00000, 0.00000, 171.16153);
  34.     CreateObject(3458, -1429.86121, -3194.19946, 47.35142,   0.00000, 0.00000, 291.19977);
  35.     CreateObject(3458, -1372.26282, -3243.22949, 47.35142,   0.00000, 0.00000, 349.67163);
  36.     CreateObject(3458, -1422.42224, -3258.93140, 47.35142,   0.00000, 0.00000, 283.13895);
  37.     CreateObject(3458, -1404.86401, -3261.47485, 47.35142,   0.00000, 0.00000, 230.01147);
  38.     CreateObject(3458, -1314.10046, -3276.75220, 47.35142,   0.00000, 0.00000, 260.38809);
  39.     CreateObject(3458, -1323.69727, -3277.25000, 47.35142,   0.00000, 0.00000, 286.48401);
  40.     CreateObject(3458, -1340.04993, -3273.14087, 47.35142,   0.00000, 0.00000, 235.00346);
  41.     CreateObject(3458, -1356.46802, -3271.88770, 47.35142,   0.00000, 0.00000, 283.13895);
  42.     CreateObject(3458, -1372.46948, -3268.20972, 47.35142,   0.00000, 0.00000, 230.01147);
  43.     CreateObject(3458, -1336.86035, -3211.19189, 47.35142,   0.00000, 0.00000, 279.89078);
  44.     CreateObject(8397, -1412.70825, -3252.65015, -1.77578,   0.00000, 0.00000, 351.15201);
  45.     CreateObject(8397, -1319.16760, -3268.00439, -1.77578,   0.00000, 0.00000, 351.15201);
  46.     CreateObject(8397, -1378.87158, -3257.27075, -1.77578,   0.00000, 0.00000, 351.15201);
  47.     CreateObject(8397, -1344.98401, -3263.25952, -1.77578,   0.00000, 0.00000, 349.65726);
  48.     CreateObject(3458, -1389.03857, -3265.17212, 47.35142,   0.00000, 0.00000, 283.13895);
  49.     CreateObject(3458, -1398.14563, -3221.22974, 47.35142,   0.00000, 0.00000, 279.89078);
  50.     CreateObject(3458, -1333.53198, -3231.83179, 47.35142,   0.00000, 0.00000, 279.89078);
  51.     CreateObject(3458, -1364.95142, -3227.18555, 47.35142,   0.00000, 0.00000, 279.89078);
  52.     CreateObject(3458, -1368.47913, -3206.39136, 47.35142,   0.00000, 0.00000, 279.89078);
  53.     InitiallizeDerbyVehicles();
  54.     DerbyTimer();
  55.     return 1;
  56. }
  57.  
  58. public OnPlayerDisconnect(playerid, reason)
  59. {
  60.     if(Derby{playerid})
  61.     {
  62.         DerbyPlayers{Derby{playerid} - 1}--;
  63.         SetVehicleToRespawn(GetPlayerVehicleID(playerid));
  64.         Derby{playerid} = 0;
  65.     }
  66.     return 1;
  67. }
  68.  
  69. public OnPlayerDeath(playerid, killerid, reason)
  70. {
  71.     if(Derby{playerid}) cmd_qderby(playerid);
  72.     return 1;
  73. }
  74.  
  75. public OnVehicleDamageStatusUpdate(vehicleid, playerid)
  76. {
  77.     if(Derby{playerid}) RepairVehicle(vehicleid);
  78.     return 1;
  79. }
  80.  
  81. public OnPlayerExitVehicle(playerid, vehicleid)
  82. {
  83.     if(Derby{playerid})
  84.     {
  85.         SendClientMessage(playerid, -1, "You can't exit your vehicle while in a derby zone.");
  86.         cmd_qderby(playerid);
  87.     }
  88. }
  89.  
  90. forward DerbyTimer();
  91. public DerbyTimer()
  92. {
  93.     new Float:x, Float:y, Float:z, playerid;
  94.     for(new i = 0; i < NUMBER_OF_AREAS; i++)
  95.     {
  96.         if(!DerbyPlayers{i}) continue;
  97.         for(new j = 0; j < NUMBER_OF_PLAYERS; j++)
  98.         {
  99.             if(!IsVehicleEmpty(DerbyVehicles[i][j]))
  100.             {
  101.                 GetVehiclePos(DerbyVehicles[i][j], x, y, z);
  102.                 if(z < LOSE_HEIGHT)
  103.                 {
  104.                     playerid = GetVehicleDriver(DerbyVehicles[i][j]);
  105.                     SetVehicleToRespawn(DerbyVehicles[i][j]);
  106.                     PutPlayerInVehicle(playerid, DerbyVehicles[i][j], 0);
  107.                 }
  108.             }
  109.         }
  110.     }
  111.     SetTimer("DerbyTimer", DERBY_TIMER_SECONDS * 1000, 0);
  112.     return 1;
  113. }
  114. /*********************************** CMDs *************************************/
  115. CMD:derby(playerid, params[])
  116. {
  117.     if(Derby{playerid}) return SendClientMessage(playerid, -1, "You are already in a derby zone.");
  118.     new area;
  119.     if(sscanf(params, "i", area)) return SendClientMessage(playerid, -1, "USAGE: /derby [1-"#NUMBER_OF_AREAS_STRING"]");
  120.     if(area < 1 || area > NUMBER_OF_AREAS) return SendClientMessage(playerid, -1, "Invalid Area Number.");
  121.     area--;
  122.     if(!IsValidVehicle(DerbyVehicles[area][0])) return SendClientMessage(playerid, -1, "This area is currently disabled.");
  123.     if(DerbyPlayers{area} >= NUMBER_OF_PLAYERS) return SendClientMessage(playerid, -1, "The area is full.");
  124.     Derby{playerid} = area + 1;
  125.     DerbyPlayers{area}++;
  126.     SendClientMessage(playerid, -1, "You have entered the derby zone.");
  127.     SpawnDerbyPlayer(playerid);
  128.     return 1;
  129. }
  130.  
  131. CMD:qderby(playerid)
  132. {
  133.     if(!Derby{playerid}) return SendClientMessage(playerid, -1, "You are not in a derby zone.");
  134.     DerbyPlayers{Derby{playerid} - 1}--;
  135.     Derby{playerid} = 0;
  136.     SetVehicleToRespawn(GetPlayerVehicleID(playerid));
  137.     SpawnPlayer(playerid);
  138.     SendClientMessage(playerid, -1, "You have left the derby zone.");
  139.     return 1;
  140. }
  141. /******************************* Functions ************************************/
  142. SpawnDerbyPlayer(playerid)
  143. {
  144.     if(!Derby{playerid}) return 1;
  145.     new index, area = Derby{playerid} - 1;
  146.     SetPlayerVirtualWorld(playerid, MAX_PLAYERS + area);
  147.     for(index = 0; index < NUMBER_OF_PLAYERS; index++)
  148.     {
  149.         if(!IsVehicleEmpty(DerbyVehicles[area][index])) continue;
  150.         else
  151.         {
  152.             SetVehicleToRespawn(DerbyVehicles[area][index]);
  153.             PutPlayerInVehicle(playerid, DerbyVehicles[area][index], 0);
  154.             return 1;
  155.         }
  156.     }
  157.     return 1;
  158. }
  159.  
  160. InitiallizeDerbyVehicles()
  161. {
  162.     // Positions & Models loading
  163.     new File:handle, buffer[128], fileName[40], model, Float:x, Float:y, Float:z, Float:a;
  164.     for(new i = 0; i < NUMBER_OF_AREAS; i++)
  165.     {
  166.         format(fileName, sizeof(fileName), "area%d.txt", i);
  167.         handle = fopen(fileName, io_read);
  168.         if(handle)
  169.         {
  170.             new j = 0;
  171.             while(fread(handle, buffer) && j < NUMBER_OF_PLAYERS)
  172.             {
  173.                 sscanf(buffer, "p<,>iffff", model, x, y, z, a);
  174.                 DerbyVehicles[i][j] = CreateVehicle(model, x, y, z, a, random(255), random(255), -1);
  175.                 SetVehicleVirtualWorld(DerbyVehicles[i][j], MAX_PLAYERS + i);
  176.                 j++;
  177.             }
  178.             fclose(handle);
  179.         }
  180.     }
  181.     return 1;
  182. }
  183.  
  184. IsVehicleEmpty(vehicleid)
  185. {
  186.     for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++)
  187.     {
  188.         if(!IsPlayerConnected(i)) continue;
  189.         if(GetPlayerVehicleID(i) == vehicleid) return 0;
  190.     }
  191.     return 1;
  192. }
  193.  
  194. GetVehicleDriver(vehicleid)
  195. {
  196.     for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++)
  197.     {
  198.         if(!IsPlayerConnected(i)) continue;
  199.         if(GetPlayerVehicleID(i) == vehicleid && GetPlayerVehicleSeat(i) == 0) return i;
  200.     }
  201.     return -1;
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement