Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <a_samp>
- #include <zcmd>
- #include <sscanf2>
- /********************************* Defines*************************************/
- #define NUMBER_OF_AREAS_STRING "10" // How many areas
- #define NUMBER_OF_AREAS 10 // ^^
- #define NUMBER_OF_PLAYERS 12 // How many players in each area
- #define DERBY_TIMER_SECONDS 3 // How many X seconds to call the public
- #define LOSE_HEIGHT 10.00 // The height that will detect loss
- /********************************** Variables *********************************/
- new Derby[MAX_PLAYERS char];
- new DerbyPlayers[NUMBER_OF_AREAS char];
- new DerbyVehicles[NUMBER_OF_AREAS][NUMBER_OF_PLAYERS];
- /*********************************** Publics **********************************/
- public OnGameModeInit()
- {
- CreateObject(3458, -1332.51660, -3250.40161, 47.35142, 0.00000, 0.00000, 349.73163);
- CreateObject(3458, -1411.95593, -3236.07446, 47.35142, 0.00000, 0.00000, 349.67163);
- CreateObject(3458, -1312.85852, -3214.02563, 47.35142, 0.00000, 0.00000, 291.19977);
- CreateObject(3458, -1401.27673, -3200.47266, 47.35142, 0.00000, 0.00000, 258.90121);
- CreateObject(3458, -1317.15796, -3215.83569, 47.35142, 0.00000, 0.00000, 258.88016);
- CreateObject(3458, -1336.01917, -3194.43604, 47.35142, 0.00000, 0.00000, 349.73163);
- CreateObject(3458, -1375.66663, -3187.25488, 47.35142, 0.00000, 0.00000, 349.67163);
- CreateObject(3458, -1377.96191, -3224.88159, 47.35142, 0.00000, 0.00000, 349.67163);
- CreateObject(3458, -1387.74133, -3223.09375, 47.35142, 0.00000, 0.00000, 349.67163);
- CreateObject(3458, -1338.28711, -3232.09448, 47.35142, 0.00000, 0.00000, 349.73163);
- CreateObject(3458, -1391.93616, -3203.35449, 47.35142, 0.00000, 0.00000, 231.28847);
- CreateObject(3458, -1294.35400, -3201.85864, 47.35142, 0.00000, 0.00000, 171.16153);
- CreateObject(3458, -1307.18176, -3236.98730, 47.35142, 0.00000, 0.00000, 259.91318);
- CreateObject(3458, -1290.89050, -3215.84790, 47.35142, 0.00000, 0.00000, 214.89233);
- CreateObject(3458, -1423.73547, -3220.03101, 47.35142, 0.00000, 0.00000, 259.91318);
- CreateObject(3458, -1408.29407, -3197.23364, 47.35142, 0.00000, 0.00000, 223.42667);
- CreateObject(3458, -1419.28589, -3179.83057, 47.35142, 0.00000, 0.00000, 171.16153);
- CreateObject(3458, -1429.86121, -3194.19946, 47.35142, 0.00000, 0.00000, 291.19977);
- CreateObject(3458, -1372.26282, -3243.22949, 47.35142, 0.00000, 0.00000, 349.67163);
- CreateObject(3458, -1422.42224, -3258.93140, 47.35142, 0.00000, 0.00000, 283.13895);
- CreateObject(3458, -1404.86401, -3261.47485, 47.35142, 0.00000, 0.00000, 230.01147);
- CreateObject(3458, -1314.10046, -3276.75220, 47.35142, 0.00000, 0.00000, 260.38809);
- CreateObject(3458, -1323.69727, -3277.25000, 47.35142, 0.00000, 0.00000, 286.48401);
- CreateObject(3458, -1340.04993, -3273.14087, 47.35142, 0.00000, 0.00000, 235.00346);
- CreateObject(3458, -1356.46802, -3271.88770, 47.35142, 0.00000, 0.00000, 283.13895);
- CreateObject(3458, -1372.46948, -3268.20972, 47.35142, 0.00000, 0.00000, 230.01147);
- CreateObject(3458, -1336.86035, -3211.19189, 47.35142, 0.00000, 0.00000, 279.89078);
- CreateObject(8397, -1412.70825, -3252.65015, -1.77578, 0.00000, 0.00000, 351.15201);
- CreateObject(8397, -1319.16760, -3268.00439, -1.77578, 0.00000, 0.00000, 351.15201);
- CreateObject(8397, -1378.87158, -3257.27075, -1.77578, 0.00000, 0.00000, 351.15201);
- CreateObject(8397, -1344.98401, -3263.25952, -1.77578, 0.00000, 0.00000, 349.65726);
- CreateObject(3458, -1389.03857, -3265.17212, 47.35142, 0.00000, 0.00000, 283.13895);
- CreateObject(3458, -1398.14563, -3221.22974, 47.35142, 0.00000, 0.00000, 279.89078);
- CreateObject(3458, -1333.53198, -3231.83179, 47.35142, 0.00000, 0.00000, 279.89078);
- CreateObject(3458, -1364.95142, -3227.18555, 47.35142, 0.00000, 0.00000, 279.89078);
- CreateObject(3458, -1368.47913, -3206.39136, 47.35142, 0.00000, 0.00000, 279.89078);
- InitiallizeDerbyVehicles();
- DerbyTimer();
- return 1;
- }
- public OnPlayerDisconnect(playerid, reason)
- {
- if(Derby{playerid})
- {
- DerbyPlayers{Derby{playerid} - 1}--;
- SetVehicleToRespawn(GetPlayerVehicleID(playerid));
- Derby{playerid} = 0;
- }
- return 1;
- }
- public OnPlayerDeath(playerid, killerid, reason)
- {
- if(Derby{playerid}) cmd_qderby(playerid);
- return 1;
- }
- public OnVehicleDamageStatusUpdate(vehicleid, playerid)
- {
- if(Derby{playerid}) RepairVehicle(vehicleid);
- return 1;
- }
- public OnPlayerExitVehicle(playerid, vehicleid)
- {
- if(Derby{playerid})
- {
- SendClientMessage(playerid, -1, "You can't exit your vehicle while in a derby zone.");
- cmd_qderby(playerid);
- }
- }
- forward DerbyTimer();
- public DerbyTimer()
- {
- new Float:x, Float:y, Float:z, playerid;
- for(new i = 0; i < NUMBER_OF_AREAS; i++)
- {
- if(!DerbyPlayers{i}) continue;
- for(new j = 0; j < NUMBER_OF_PLAYERS; j++)
- {
- if(!IsVehicleEmpty(DerbyVehicles[i][j]))
- {
- GetVehiclePos(DerbyVehicles[i][j], x, y, z);
- if(z < LOSE_HEIGHT)
- {
- playerid = GetVehicleDriver(DerbyVehicles[i][j]);
- SetVehicleToRespawn(DerbyVehicles[i][j]);
- PutPlayerInVehicle(playerid, DerbyVehicles[i][j], 0);
- }
- }
- }
- }
- SetTimer("DerbyTimer", DERBY_TIMER_SECONDS * 1000, 0);
- return 1;
- }
- /*********************************** CMDs *************************************/
- CMD:derby(playerid, params[])
- {
- if(Derby{playerid}) return SendClientMessage(playerid, -1, "You are already in a derby zone.");
- new area;
- if(sscanf(params, "i", area)) return SendClientMessage(playerid, -1, "USAGE: /derby [1-"#NUMBER_OF_AREAS_STRING"]");
- if(area < 1 || area > NUMBER_OF_AREAS) return SendClientMessage(playerid, -1, "Invalid Area Number.");
- area--;
- if(!IsValidVehicle(DerbyVehicles[area][0])) return SendClientMessage(playerid, -1, "This area is currently disabled.");
- if(DerbyPlayers{area} >= NUMBER_OF_PLAYERS) return SendClientMessage(playerid, -1, "The area is full.");
- Derby{playerid} = area + 1;
- DerbyPlayers{area}++;
- SendClientMessage(playerid, -1, "You have entered the derby zone.");
- SpawnDerbyPlayer(playerid);
- return 1;
- }
- CMD:qderby(playerid)
- {
- if(!Derby{playerid}) return SendClientMessage(playerid, -1, "You are not in a derby zone.");
- DerbyPlayers{Derby{playerid} - 1}--;
- Derby{playerid} = 0;
- SetVehicleToRespawn(GetPlayerVehicleID(playerid));
- SpawnPlayer(playerid);
- SendClientMessage(playerid, -1, "You have left the derby zone.");
- return 1;
- }
- /******************************* Functions ************************************/
- SpawnDerbyPlayer(playerid)
- {
- if(!Derby{playerid}) return 1;
- new index, area = Derby{playerid} - 1;
- SetPlayerVirtualWorld(playerid, MAX_PLAYERS + area);
- for(index = 0; index < NUMBER_OF_PLAYERS; index++)
- {
- if(!IsVehicleEmpty(DerbyVehicles[area][index])) continue;
- else
- {
- SetVehicleToRespawn(DerbyVehicles[area][index]);
- PutPlayerInVehicle(playerid, DerbyVehicles[area][index], 0);
- return 1;
- }
- }
- return 1;
- }
- InitiallizeDerbyVehicles()
- {
- // Positions & Models loading
- new File:handle, buffer[128], fileName[40], model, Float:x, Float:y, Float:z, Float:a;
- for(new i = 0; i < NUMBER_OF_AREAS; i++)
- {
- format(fileName, sizeof(fileName), "area%d.txt", i);
- handle = fopen(fileName, io_read);
- if(handle)
- {
- new j = 0;
- while(fread(handle, buffer) && j < NUMBER_OF_PLAYERS)
- {
- sscanf(buffer, "p<,>iffff", model, x, y, z, a);
- DerbyVehicles[i][j] = CreateVehicle(model, x, y, z, a, random(255), random(255), -1);
- SetVehicleVirtualWorld(DerbyVehicles[i][j], MAX_PLAYERS + i);
- j++;
- }
- fclose(handle);
- }
- }
- return 1;
- }
- IsVehicleEmpty(vehicleid)
- {
- for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++)
- {
- if(!IsPlayerConnected(i)) continue;
- if(GetPlayerVehicleID(i) == vehicleid) return 0;
- }
- return 1;
- }
- GetVehicleDriver(vehicleid)
- {
- for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++)
- {
- if(!IsPlayerConnected(i)) continue;
- if(GetPlayerVehicleID(i) == vehicleid && GetPlayerVehicleSeat(i) == 0) return i;
- }
- return -1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement