Код:
#include <a_samp>
#include <dini>
#include <zcmd>
#define Azul 0x375FFFFF
#define Rojo 0xFF0000FF
#define Amarillo 0xFFFF00AA
#define Verde 0x00FF00FF
#pragma tabsize 0
#define ForEach(%0,%1) \
for(new %0 = 0; %0 != %1; %0++) if(IsPlayerConnected(%0) && !IsPlayerNPC(%0))
#define Loop(%0,%1) \
for(new %0 = 0; %0 != %1; %0++)
#define IsOdd(%1) \
((%1) & 1)
#define ConvertTime(%0,%1,%2,%3,%4) \
new \
Float: %0 = floatdiv(%1, 60000) \
;\
%2 = floatround(%0, floatround_tozero); \
%3 = floatround(floatmul(%0 - %2, 60), floatround_tozero); \
%4 = floatround(floatmul(floatmul(%0 - %2, 60) - %3, 1000), floatround_tozero)
#define function%0(%1) \
forward%0(%1); public%0(%1)
#define MAX_RACE_CHECKPOINTS_EACH_RACE \
120
#define MAX_RACES \
100
#define COUNT_DOWN_TILL_RACE_START \
40 // seconds
#define MAX_RACE_TIME \
300 // seconds
#define RACE_CHECKPOINT_SIZE \
12.0
#define DEBUG_RACE \
0
//#define green 0x33FF33AA
new string2[256];
new
BuildRace,
BuildRaceType,
BuildVehicle,
BuildCreatedVehicle,
BuildModeVID,
BuildName[30],
bool: BuildTakeVehPos,
BuildVehPosCount,
bool: BuildTakeCheckpoints,
BuildCheckPointCount,
RaceBusy = 0x00,
RaceName[30],
RaceVehicle,
RaceType,
TotalCP,
Float: RaceVehCoords[2][4],
Float: CPCoords[MAX_RACE_CHECKPOINTS_EACH_RACE][4],
CreatedRaceVeh[MAX_PLAYERS],
Index,
PlayersCount[2],
CountTimer,
CountAmount,
bool: Joined[MAX_PLAYERS],
RaceTick,
RaceStarted,
CPProgess[MAX_PLAYERS],
Position,
FinishCount,
JoinCount,
rCounter,
RaceTime,
//Text: RaceInfo[MAX_PLAYERS],
InfoTimer[MAX_PLAYERS],
RacePosition[MAX_PLAYERS],
RaceNames[MAX_RACES][128],
TotalRaces,
bool: AutomaticRace,
TimeProgress,
VehicleNames[212][] = {
"Landstalker","Bravura","Buffalo","Linerunner","Pereniel","Sentinel","Dumper","Firetruck","Trashmaster","Stretch","Manana","Infernus",
"Voodoo","Pony","Mule","Cheetah","Ambulance","Leviathan","Moonbeam","Esperanto","Taxi","Washington","Bobcat","Mr Whoopee","BF Injection",
"Hunter","Premier","Enforcer","Securicar","Banshee","Predator","Bus","Rhino","Barracks","Hotknife","Trailer","Previon","Coach","Cabbie",
"Stallion","Rumpo","RC Bandit","Romero","Packer","Monster","Admiral","Squalo","Seasparrow","Pizzaboy","Tram","Trailer","Turismo","Speeder",
"Reefer","Tropic","Flatbed","Yankee","Caddy","Solair","Berkley's RC Van","Skimmer","PCJ-600","Faggio","Freeway","RC Baron","RC Raider",
"Glendale","Oceanic","Sanchez","Sparrow","Patriot","Quad","Coastguard","Dinghy","Hermes","Sabre","Rustler","ZR3 50","Walton","Regina",
"Comet","BMX","Burrito","Camper","Marquis","Baggage","Dozer","Maverick","News Chopper","Rancher","FBI Rancher","Virgo","Greenwood",
"Jetmax","Hotring","Sandking","Blista Compact","Police Maverick","Boxville","Benson","Mesa","RC Goblin","Hotring Racer A","Hotring Racer B",
"Bloodring Banger","Rancher","Super GT","Elegant","Journey","Bike","Mountain Bike","Beagle","Cropdust","Stunt","Tanker","RoadTrain",
"Nebula","Majestic","Buccaneer","Shamal","Hydra","FCR-900","NRG-500","HPV1000","Cement Truck","Tow Truck","Fortune","Cadrona","FBI Truck",
"Willard","Forklift","Tractor","Combine","Feltzer","Remington","Slamvan","Blade","Freight","Streak","Vortex","Vincent","Bullet","Clover",
"Sadler","Firetruck","Hustler","Intruder","Primo","Cargobob","Tampa","Sunrise","Merit","Utility","Nevada","Yosemite","Windsor","Monster A",
"Monster B","Uranus","Jester","Sultan","Stratum","Elegy","Raindance","RC Tiger","Flash","Tahoma","Savanna","Bandito","Freight","Trailer",
"Kart","Mower","Duneride","Sweeper","Broadway","Tornado","AT-400","DFT-30","Huntley","Stafford","BF-400","Newsvan","Tug","Trailer A","Emperor",
"Wayfarer","Euros","Hotdog","Club","Trailer B","Trailer C","Andromada","Dodo","RC Cam","Launch","Police Car (LSPD)","Police Car (SFPD)",
"Police Car (LVPD)","Police Ranger","Picador","S.W.A.T. Van","Alpha","Phoenix","Glendale","Sadler","Luggage Trailer A","Luggage Trailer B",
"Stair Trailer","Boxville","Farm Plow","Utility Trailer"
};
main()
{
print("\n----------------------------------");
print(" Blank Gamemode by your name here");
print("----------------------------------\n");
}
public OnFilterScriptInit()
{
print("\n----------------------------------");
print(" Blank Gamemode by your name here");
print("----------------------------------\n");
BuildCreatedVehicle = (BuildCreatedVehicle == 0x01) ? (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00) : (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00);
KillTimer(rCounter);
KillTimer(CountTimer);
Loop(i, MAX_PLAYERS)
{
DisablePlayerRaceCheckpoint(i);
//TextDrawDestroy(RaceInfo[i]);
DestroyVehicle(CreatedRaceVeh[i]);
Joined[i] = false;
KillTimer(InfoTimer[i]);
}
JoinCount = 0;
FinishCount = 0;
AutomaticRace = false;
return 1;
}
public OnFilterScriptExit()
{
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
if(Joined[playerid] == true)
{
JoinCount--;
Joined[playerid] = false;
DestroyVehicle(CreatedRaceVeh[playerid]);
DisablePlayerRaceCheckpoint(playerid);
CPProgess[playerid] = 0;
KillTimer(InfoTimer[playerid]);
#if defined RACE_IN_OTHER_WORLD
SetPlayerVirtualWorld(playerid, 0);
#endif
}
if(BuildRace == playerid+1) BuildRace = 0;
return 1;
}
//Comandos rRace
CMD:armarcarrera(playerid, params[])
{
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, Rojo, "<!> You are not an administrator!");
if(BuildRace != 0) return SendClientMessage(playerid, Rojo, "<!> There's already someone building a race!");
if(RaceBusy == 0x01) return SendClientMessage(playerid, Rojo, "<!> Wait first till race ends!");
if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, Rojo, "<!> Please leave your vehicle first!");
BuildRace = playerid+1;
ShowDialog(playerid, 599);
return 1;
}
CMD:abrircarrera(playerid, params[])
{
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, Rojo, "<!> You are not an administrator!");
if(AutomaticRace == true) return SendClientMessage(playerid, Rojo, "<!> Not possible. Automatic race is enabled!");
if(BuildRace != 0) return SendClientMessage(playerid, Rojo, "<!> There's someone building a race!");
if(RaceBusy == 0x01 || RaceStarted == 1) return SendClientMessage(playerid, Rojo, "<!> There's a race currently. Wait first till race ends!");
if(isnull(params)) return SendClientMessage(playerid, Rojo, "<!> /loadrace [nombre]");
LoadRace(playerid, params);
return 1;
}
CMD:pararcarrera(playerid, params[])
{
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, Rojo, "<!> You are not an administrator!");
if(RaceBusy == 0x00 || RaceStarted == 0) return SendClientMessage(playerid, Rojo, "<!> There's no race to stop!");
return StopRace();
}
CMD:join(playerid, params[])
{
if(RaceStarted == 1) return SendClientMessage(playerid, Rojo, "<!> La Carrera ya empeso! Espera que termine!");
if(RaceBusy == 0x00) return SendClientMessage(playerid, Rojo, "<!> No hay carreras para entrar!");
if(Joined[playerid] == true) return SendClientMessage(playerid, Rojo, "<!> Has Entrado a la carrera!");
if(IsPlayerInAnyVehicle(playerid)) return SetTimerEx("SetupRaceForPlayer", 2500, 0, "e", playerid), RemovePlayerFromVehicle(playerid), Joined[playerid] = true;
SetupRaceForPlayer(playerid);
ResetPlayerWeapons(playerid);
Joined[playerid] = true;
return 1;
}
CMD:carrerason(playerid, params[])
{
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, Rojo, "<!> You are not an administrator!");
if(RaceBusy == 0x01 || RaceStarted == 1) return SendClientMessage(playerid, Rojo, "<!> There's a race currently. Wait first till race ends!");
if(AutomaticRace == true) return SendClientMessage(playerid, Rojo, "<!> It's already enabled!");
LoadRaceNames();
LoadAutoRace(RaceNames[random(TotalRaces)]);
AutomaticRace = true;
SendClientMessage(playerid, Verde, ">> You staRojo auto race. The filterscript will start a random race everytime the previous race is over!");
return 1;
}
CMD:carrerasoff(playerid, params[])
{
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, Rojo, "<!> You are not an administrator!");
if(AutomaticRace == false) return SendClientMessage(playerid, Rojo, "<!> It's already disabled!");
AutomaticRace = false;
return 1;
}
CMD:exit(playerid, params[])
{
if(Joined[playerid] == true)
{
JoinCount--;
Joined[playerid] = false;
DestroyVehicle(CreatedRaceVeh[playerid]);
DisablePlayerRaceCheckpoint(playerid);
//TextDrawHideForPlayer(playerid, RaceInfo[playerid]);
CPProgess[playerid] = 0;
KillTimer(InfoTimer[playerid]);
TogglePlayerControllable(playerid, true);
SetCameraBehindPlayer(playerid);
#if defined RACE_IN_OTHER_WORLD
SetPlayerVirtualWorld(playerid, 0);
#endif
SpawnPlayer(playerid);
SetCameraBehindPlayer(playerid);
} else return SendClientMessage(playerid, Rojo, "<!> No estas en una carrera!");
return 1;
}
public OnPlayerEnterRaceCheckpoint(playerid)
{
if(CPProgess[playerid] == TotalCP -1)
{
new
TimeStamp,
TotalRaceTime,
rFile[256],
string[256],
pName[MAX_PLAYER_NAME],
rTime[3],
Prize[2],
TempTotalTime,
TempTime[3]
;
Position++;
GetPlayerName(playerid, pName, sizeof(pName));
TimeStamp = GetTickCount();
TotalRaceTime = TimeStamp - RaceTick;
ConvertTime(var, TotalRaceTime, rTime[0], rTime[1], rTime[2]);
switch(Position)
{
case 1: Prize[0] = (random(random(5000)) + 10000), Prize[1] = 10;
case 2: Prize[0] = (random(random(4500)) + 9000), Prize[1] = 9;
case 3: Prize[0] = (random(random(4000)) + 8000), Prize[1] = 8;
case 4: Prize[0] = (random(random(3500)) + 7000), Prize[1] = 7;
case 5: Prize[0] = (random(random(3000)) + 6000), Prize[1] = 6;
case 6: Prize[0] = (random(random(2500)) + 5000), Prize[1] = 5;
case 7: Prize[0] = (random(random(2000)) + 4000), Prize[1] = 4;
case 8: Prize[0] = (random(random(1500)) + 3000), Prize[1] = 3;
case 9: Prize[0] = (random(random(1000)) + 2000), Prize[1] = 2;
default: Prize[0] = random(random(1000)), Prize[1] = 1;
}
format(string, sizeof(string), "* %s Termino la carrera en la posicion %d de %d jugadores, Tiempo %d:%d.%d.", pName, RacePosition[playerid], JoinCount, rTime[0], rTime[1], rTime[2]);
SendClientMessageToAll(Amarillo, string);
new stringxd[400];
format(stringxd, sizeof(stringxd), "~b~~h~~h~tiempo:~w~ %d:%d.%d ~b~~h~~h~- ganancia:~w~$%d~n~~b~~h~~h~score:~w~+%d", rTime[0], rTime[1], rTime[2], Prize[0],Prize[1]);
GameTextForPlayer(playerid,stringxd,9000,3);
if(FinishCount <= 5)
{
format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", RaceName);
format(string2, sizeof(string2), "BestRacerTime_%d", TimeProgress);
TempTotalTime = dini_Int(rFile, string2);
ConvertTime(var1, TempTotalTime, TempTime[0], TempTime[1], TempTime[2]);
if(TotalRaceTime <= dini_Int(rFile, string2) || TempTotalTime == 0)
{
dini_IntSet(rFile, string2, TotalRaceTime);
format(string2, sizeof(string2), "BestRacer_%d", TimeProgress);
if(TempTotalTime != 0) format(string2, sizeof(string2), "** \"%s\" rompiу el record de \"%s\" con \"%d\" segundos mбs rбpido en la \"%d\"!", pName, dini_Get(rFile, string2), -(rTime[1] - TempTime[1]), TimeProgress+1);
else format(string2, sizeof(string2), "**\"%s\" rompiу un nuevo record en la \"%d\"' posiciуn!", pName, TimeProgress+1);
SendClientMessageToAll(0x0000FFFF, string2);
format(string2, sizeof(string2), "BestRacer_%d", TimeProgress);
dini_Set(rFile, string2, pName);
TimeProgress++;
}
}
SetCameraBehindPlayer(playerid);
FinishCount++;
GivePlayerMoney(playerid, Prize[0]);
SetPlayerScore(playerid, GetPlayerScore(playerid) + Prize[1]);
DisablePlayerRaceCheckpoint(playerid);
CPProgess[playerid]++;
if(FinishCount >= JoinCount) return StopRace();
}
else
{
CPProgess[playerid]++;
CPCoords[CPProgess[playerid]][3]++;
RacePosition[playerid] = floatround(CPCoords[CPProgess[playerid]][3], floatround_floor);
SetCP(playerid, CPProgess[playerid], CPProgess[playerid]+1, TotalCP, RaceType);
new stringxd[400];
format(stringxd, sizeof(stringxd), "~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~b~~h~~h~checkpoint:~w~ %d/%d",CPProgess[playerid]+1, TotalCP);
GameTextForPlayer(playerid,stringxd,2000,3);
PlayerPlaySound(playerid, 1137, 0.0, 0.0, 0.0);
}
return 1;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
new
string[256],
rNameFile[256],
rFile[256],
Float: vPos[4]
;
if(newkeys & KEY_FIRE)
{
if(BuildRace == playerid+1)
{
if(BuildTakeVehPos == true)
{
if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, Rojo, ">> You need to be in a vehicle");
format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", BuildName);
GetVehiclePos(GetPlayerVehicleID(playerid), vPos[0], vPos[1], vPos[2]);
GetVehicleZAngle(GetPlayerVehicleID(playerid), vPos[3]);
dini_Create(rFile);
dini_IntSet(rFile, "vModel", BuildModeVID);
dini_IntSet(rFile, "rType", BuildRaceType);
format(string, sizeof(string), "vPosX_%d", BuildVehPosCount), dini_FloatSet(rFile, string, vPos[0]);
format(string, sizeof(string), "vPosY_%d", BuildVehPosCount), dini_FloatSet(rFile, string, vPos[1]);
format(string, sizeof(string), "vPosZ_%d", BuildVehPosCount), dini_FloatSet(rFile, string, vPos[2]);
format(string, sizeof(string), "vAngle_%d", BuildVehPosCount), dini_FloatSet(rFile, string, vPos[3]);
format(string, sizeof(string), ">> Posicion del Vehiculo N° '%d' Bien Puesta!.", BuildVehPosCount+1);
SendClientMessage(playerid, Amarillo, string);
BuildVehPosCount++;
}
if(BuildVehPosCount >= 2)
{
BuildVehPosCount = 0;
BuildTakeVehPos = false;
ShowDialog(playerid, 605);
}
if(BuildTakeCheckpoints == true)
{
if(BuildCheckPointCount > MAX_RACE_CHECKPOINTS_EACH_RACE) return SendClientMessage(playerid, Rojo, ">> You reached the maximum amount of checkpoints!");
if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, Rojo, ">> You need to be in a vehicle");
format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", BuildName);
GetVehiclePos(GetPlayerVehicleID(playerid), vPos[0], vPos[1], vPos[2]);
format(string, sizeof(string), "CP_%d_PosX", BuildCheckPointCount), dini_FloatSet(rFile, string, vPos[0]);
format(string, sizeof(string), "CP_%d_PosY", BuildCheckPointCount), dini_FloatSet(rFile, string, vPos[1]);
format(string, sizeof(string), "CP_%d_PosZ", BuildCheckPointCount), dini_FloatSet(rFile, string, vPos[2]);
format(string, sizeof(string), ">> Checkpoint '%d' Bien Colocado!", BuildCheckPointCount+1);
SendClientMessage(playerid, Amarillo, string);
BuildCheckPointCount++;
}
}
}
if(newkeys & KEY_SECONDARY_ATTACK)
{
if(BuildTakeCheckpoints == true)
{
ShowDialog(playerid, 606);
format(rNameFile, sizeof(rNameFile), "/rRaceSystem/RaceNames/RaceNames.txt");
TotalRaces = dini_Int(rNameFile, "TotalRaces");
TotalRaces++;
dini_IntSet(rNameFile, "TotalRaces", TotalRaces);
format(string, sizeof(string), "Race_%d", TotalRaces-1);
format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", BuildName);
dini_Set(rNameFile, string, BuildName);
dini_IntSet(rFile, "TotalCP", BuildCheckPointCount);
Loop(x, 5)
{
format(string, sizeof(string), "BestRacerTime_%d", x);
dini_Set(rFile, string, "0");
format(string, sizeof(string), "BestRacer_%d", x);
dini_Set(rFile, string, "noone");
}
}
}
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case 599:
{
if(!response) return BuildRace = 0;
switch(listitem)
{
case 0: BuildRaceType = 0;
case 1: BuildRaceType = 3;
}
ShowDialog(playerid, 600);
}
case 600..601:
{
if(!response) return ShowDialog(playerid, 599);
if(!strlen(inputtext)) return ShowDialog(playerid, 601);
if(strlen(inputtext) < 1 || strlen(inputtext) > 20) return ShowDialog(playerid, 601);
strmid(BuildName, inputtext, 0, strlen(inputtext), sizeof(BuildName));
ShowDialog(playerid, 602);
}
case 602..603:
{
if(!response) return ShowDialog(playerid, 600);
if(!strlen(inputtext)) return ShowDialog(playerid, 603);
if(IsNumeric(inputtext))
{
if(!IsValidVehicle(strval(inputtext))) return ShowDialog(playerid, 603);
new
Float: pPos[4]
;
GetPlayerPos(playerid, pPos[0], pPos[1], pPos[2]);
GetPlayerFacingAngle(playerid, pPos[3]);
BuildModeVID = strval(inputtext);
BuildCreatedVehicle = (BuildCreatedVehicle == 0x01) ? (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00) : (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00);
BuildVehicle = CreateVehicle(strval(inputtext), pPos[0], pPos[1], pPos[2], pPos[3], random(126), random(126), (60 * 60));
PutPlayerInVehicle(playerid, BuildVehicle, 0);
BuildCreatedVehicle = 0x01;
ShowDialog(playerid, 604);
}
else
{
if(!IsValidVehicle(ReturnVehicleID(inputtext))) return ShowDialog(playerid, 603);
new
Float: pPos[4]
;
GetPlayerPos(playerid, pPos[0], pPos[1], pPos[2]);
GetPlayerFacingAngle(playerid, pPos[3]);
BuildModeVID = ReturnVehicleID(inputtext);
BuildCreatedVehicle = (BuildCreatedVehicle == 0x01) ? (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00) : (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00);
BuildVehicle = CreateVehicle(ReturnVehicleID(inputtext), pPos[0], pPos[1], pPos[2], pPos[3], random(126), random(126), (60 * 60));
PutPlayerInVehicle(playerid, BuildVehicle, 0);
BuildCreatedVehicle = 0x01;
ShowDialog(playerid, 604);
}
}
case 604:
{
if(!response) return ShowDialog(playerid, 602);
SendClientMessage(playerid, Verde, ">> Ir a la lнnea de salida en la carretera a la izquierda y pulse 'KEY_FIRE' y hacer lo mismo con la Derecha!.");
SendClientMessage(playerid, Verde, " - When this is done, you will see a dialog to continue.");
BuildVehPosCount = 0;
BuildTakeVehPos = true;
}
case 605:
{
if(!response) return ShowDialog(playerid, 604);
SendClientMessage(playerid, Verde, ">> Comience a tomar los puestos de control ahora haciendo click 'KEY_FIRE'.");
SendClientMessage(playerid, Verde, " - Presione 'ENTER' cuando haya terminado con los puntos de control: IMPORTANTE! Si no reacciona de aprete otra vez.");
BuildCheckPointCount = 0;
BuildTakeCheckpoints = true;
}
case 606:
{
if(!response) return ShowDialog(playerid, 606);
BuildRace = 0;
BuildCheckPointCount = 0;
BuildVehPosCount = 0;
BuildTakeCheckpoints = false;
BuildTakeVehPos = false;
BuildCreatedVehicle = (BuildCreatedVehicle == 0x01) ? (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00) : (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00);
}
}
return 1;
}
stock Float:GetDistanceBetweenPlayers(p1,p2)
{
new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
if (!IsPlayerConnected(p1) || !IsPlayerConnected(p2)){
return -1.00;
}
GetPlayerPos(p1,x1,y1,z1);
GetPlayerPos(p2,x2,y2,z2);
return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
}
stock GetModel(weaponid)
{
for(new i=0; i<sizeof(ForbiddenWeapons); i++)
{
if(weaponid == ForbiddenWeapons[i])
{
return -1;
}
}
switch(weaponid)
{ case 1: return 331;case 2: return 333;case 3: return 334;
case 4: return 335;case 5: return 336;case 6: return 337;
case 7: return 338;case 8: return 339;case 9: return 341;case 10: return 321;
case 11: return 322;case 12: return 323;case 13: return 324;
case 14: return 325; case 15: return 326;case 16: return 342;
case 17: return 343; case 18: return 344;case 22: return 346;
case 23: return 347;case 24: return 348; case 25: return 349;
case 26: return 350;case 27: return 351;case 28: return 352;
case 29: return 353;case 30: return 355;case 31: return 356;case 32:
return 372;case 33: return 357;case 34: return 358;case 35: return 359;
case 36: return 360;case 37: return 361;case 38: return 362;case 39: return 363;
case 40: return 364;case 41: return 365;case 42: return 366;case 43: return 367;
case 44: return 368;case 45: return 369;case 46: return 371;default: return -1;
}
return -1;
}
function LoadRaceNames()
{
new
rNameFile[64],
string[64]
;
format(rNameFile, sizeof(rNameFile), "/rRaceSystem/RaceNames/RaceNames.txt");
TotalRaces = dini_Int(rNameFile, "TotalRaces");
Loop(x, TotalRaces)
{
format(string, sizeof(string), "Race_%d", x), strmid(RaceNames[x], dini_Get(rNameFile, string), 0, 20, sizeof(RaceNames));
printf(">> Loaded Races: %s", RaceNames[x]);
}
TimeProgress = 0;
return 1;
}
function LoadAutoRace(rName[])
{
new
rFile[256],
string[256]
;
format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", rName);
if(!dini_Exists(rFile)) return printf("Race \"%s\" doesn't exist!", rName);
strmid(RaceName, rName, 0, strlen(rName), sizeof(RaceName));
RaceVehicle = dini_Int(rFile, "vModel");
RaceType = dini_Int(rFile, "rType");
TotalCP = dini_Int(rFile, "TotalCP");
#if DEBUG_RACE == 1
printf("VehicleModel: %d", RaceVehicle);
printf("RaceType: %d", RaceType);
printf("TotalCheckpoints: %d", TotalCP);
#endif
Loop(x, 2)
{
format(string, sizeof(string), "vPosX_%d", x), RaceVehCoords[x][0] = dini_Float(rFile, string);
format(string, sizeof(string), "vPosY_%d", x), RaceVehCoords[x][1] = dini_Float(rFile, string);
format(string, sizeof(string), "vPosZ_%d", x), RaceVehCoords[x][2] = dini_Float(rFile, string);
format(string, sizeof(string), "vAngle_%d", x), RaceVehCoords[x][3] = dini_Float(rFile, string);
#if DEBUG_RACE == 1
//printf("VehiclePos %d: %f, %f, %f, %f", x, RaceVehCoords[x][0], RaceVehCoords[x][1], RaceVehCoords[x][2], RaceVehCoords[x][3]);
#endif
}
Loop(x, TotalCP)
{
format(string, sizeof(string), "CP_%d_PosX", x), CPCoords[x][0] = dini_Float(rFile, string);
format(string, sizeof(string), "CP_%d_PosY", x), CPCoords[x][1] = dini_Float(rFile, string);
format(string, sizeof(string), "CP_%d_PosZ", x), CPCoords[x][2] = dini_Float(rFile, string);
#if DEBUG_RACE == 1
//printf("RaceCheckPoint %d: %f, %f, %f", x, CPCoords[x][0], CPCoords[x][1], CPCoords[x][2]);
#endif
}
Position = 0;
FinishCount = 0;
JoinCount = 0;
Loop(x, 2) PlayersCount[x] = 0;
CountAmount = COUNT_DOWN_TILL_RACE_START;
RaceTime = MAX_RACE_TIME;
RaceBusy = 0x01;
CountTimer = SetTimer("CountTillRace", 999, 1);
TimeProgress = 0;
return 1;
}
function LoadRace(playerid, rName[])
{
new
rFile[256],
string[256]
;
format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", rName);
if(!dini_Exists(rFile)) return SendClientMessage(playerid, Rojo, "<!> Race doesn't exist!"), printf("Race \"%s\" doesn't exist!", rName);
strmid(RaceName, rName, 0, strlen(rName), sizeof(RaceName));
RaceVehicle = dini_Int(rFile, "vModel");
RaceType = dini_Int(rFile, "rType");
TotalCP = dini_Int(rFile, "TotalCP");
#if DEBUG_RACE == 1
printf("VehicleModel: %d", RaceVehicle);
printf("RaceType: %d", RaceType);
printf("TotalCheckpoints: %d", TotalCP);
#endif
Loop(x, 2)
{
format(string, sizeof(string), "vPosX_%d", x), RaceVehCoords[x][0] = dini_Float(rFile, string);
format(string, sizeof(string), "vPosY_%d", x), RaceVehCoords[x][1] = dini_Float(rFile, string);
format(string, sizeof(string), "vPosZ_%d", x), RaceVehCoords[x][2] = dini_Float(rFile, string);
format(string, sizeof(string), "vAngle_%d", x), RaceVehCoords[x][3] = dini_Float(rFile, string);
#if DEBUG_RACE == 1
//printf("VehiclePos %d: %f, %f, %f, %f", x, RaceVehCoords[x][0], RaceVehCoords[x][1], RaceVehCoords[x][2], RaceVehCoords[x][3]);
#endif
}
Loop(x, TotalCP)
{
format(string, sizeof(string), "CP_%d_PosX", x), CPCoords[x][0] = dini_Float(rFile, string);
format(string, sizeof(string), "CP_%d_PosY", x), CPCoords[x][1] = dini_Float(rFile, string);
format(string, sizeof(string), "CP_%d_PosZ", x), CPCoords[x][2] = dini_Float(rFile, string);
#if DEBUG_RACE == 1
//printf("RaceCheckPoint %d: %f, %f, %f", x, CPCoords[x][0], CPCoords[x][1], CPCoords[x][2]);
#endif
}
Position = 0;
FinishCount = 0;
JoinCount = 0;
Loop(x, 2) PlayersCount[x] = 0;
Joined[playerid] = true;
CountAmount = COUNT_DOWN_TILL_RACE_START;
RaceTime = MAX_RACE_TIME;
RaceBusy = 0x01;
// TimeProgress = 0;
SetupRaceForPlayer(playerid);
CountTimer = SetTimer("CountTillRace", 999, 1);
return 1;
}
function SetCP(playerid, PrevCP, NextCP, MaxCP, Type)
{
if(Type == 0)
{
if(NextCP == MaxCP) SetPlayerRaceCheckpoint(playerid, 1, CPCoords[PrevCP][0], CPCoords[PrevCP][1], CPCoords[PrevCP][2], CPCoords[NextCP][0], CPCoords[NextCP][1], CPCoords[NextCP][2], RACE_CHECKPOINT_SIZE);
else SetPlayerRaceCheckpoint(playerid, 0, CPCoords[PrevCP][0], CPCoords[PrevCP][1], CPCoords[PrevCP][2], CPCoords[NextCP][0], CPCoords[NextCP][1], CPCoords[NextCP][2], RACE_CHECKPOINT_SIZE);
}
else if(Type == 3)
{
if(NextCP == MaxCP) SetPlayerRaceCheckpoint(playerid, 4, CPCoords[PrevCP][0], CPCoords[PrevCP][1], CPCoords[PrevCP][2], CPCoords[NextCP][0], CPCoords[NextCP][1], CPCoords[NextCP][2], RACE_CHECKPOINT_SIZE);
else SetPlayerRaceCheckpoint(playerid, 3, CPCoords[PrevCP][0], CPCoords[PrevCP][1], CPCoords[PrevCP][2], CPCoords[NextCP][0], CPCoords[NextCP][1], CPCoords[NextCP][2], RACE_CHECKPOINT_SIZE);
}
return 1;
}
function SetupRaceForPlayer(playerid)
{
CPProgess[playerid] = 0;
TogglePlayerControllable(playerid, false);
CPCoords[playerid][3] = 0;
SetCP(playerid, CPProgess[playerid], CPProgess[playerid]+1, TotalCP, RaceType);
if(IsOdd(playerid)) Index = 1;
else Index = 0;
switch(Index)
{
case 0:
{
if(PlayersCount[0] == 1)
{
RaceVehCoords[0][0] -= (6 * floatsin(-RaceVehCoords[0][3], degrees));
RaceVehCoords[0][1] -= (6 * floatcos(-RaceVehCoords[0][3], degrees));
CreatedRaceVeh[playerid] = CreateVehicle(RaceVehicle, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2]+2, RaceVehCoords[0][3], random(126), random(126), (60 * 60));
SetPlayerPos(playerid, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2]+2);
SetPlayerFacingAngle(playerid, RaceVehCoords[0][3]);
PutPlayerInVehicle(playerid, CreatedRaceVeh[playerid], 0);
SendClientMessage(playerid, 0xFFFF00AA, " ");
SendClientMessage(playerid, 0xFFFF00AA, "* Estas congelado, cuando termine la cuenta regresiva podrбs comenzar");
SendClientMessage(playerid, 0xFFFF00AA, "A correr contra los competidores por el primer puesto, Dinero y Score!");
SendClientMessage(playerid, 0xFFFF00AA, "AutoFix Activado (Vehiculo indestructible) y Turbo Desactivado");
Camera(playerid, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2], RaceVehCoords[0][3], 20);
}
}
case 1:
{
if(PlayersCount[1] == 1)
{
RaceVehCoords[1][0] -= (6 * floatsin(-RaceVehCoords[1][3], degrees));
RaceVehCoords[1][1] -= (6 * floatcos(-RaceVehCoords[1][3], degrees));
CreatedRaceVeh[playerid] = CreateVehicle(RaceVehicle, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2]+2, RaceVehCoords[1][3], random(126), random(126), (60 * 60));
SetPlayerPos(playerid, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2]+2);
SetPlayerFacingAngle(playerid, RaceVehCoords[1][3]);
PutPlayerInVehicle(playerid, CreatedRaceVeh[playerid], 0);
SendClientMessage(playerid, 0xFFFF00AA, " ");
SendClientMessage(playerid, 0xFFFF00AA, "* Estas congelado, cuando termine la cuenta regresiva podrбs comenzar");
SendClientMessage(playerid, 0xFFFF00AA, "A correr contra los competidores por el primer puesto, Dinero y Score!");
SendClientMessage(playerid, 0xFFFF00AA, "AutoFix Activado (Vehiculo indestructible) y Turbo Desactivado");
Camera(playerid, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2], RaceVehCoords[1][3], 20);
}
}
}
switch(Index)
{
case 0:
{
if(PlayersCount[0] != 1)
{
CreatedRaceVeh[playerid] = CreateVehicle(RaceVehicle, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2]+2, RaceVehCoords[0][3], random(126), random(126), (60 * 60));
SetPlayerPos(playerid, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2]+2);
SetPlayerFacingAngle(playerid, RaceVehCoords[0][3]);
PutPlayerInVehicle(playerid, CreatedRaceVeh[playerid], 0);
SendClientMessage(playerid, 0xFFFF00AA, " ");
SendClientMessage(playerid, 0xFFFF00AA, "* Estas congelado, cuando termine la cuenta regresiva podrбs comenzar");
SendClientMessage(playerid, 0xFFFF00AA, "A correr contra los competidores por el primer puesto, Dinero y Score!");
SendClientMessage(playerid, 0xFFFF00AA, "AutoFix Activado (Vehiculo indestructible) y Turbo Desactivado");
Camera(playerid, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2], RaceVehCoords[0][3], 20);
PlayersCount[0] = 1;
}
}
case 1:
{
if(PlayersCount[1] != 1)
{
CreatedRaceVeh[playerid] = CreateVehicle(RaceVehicle, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2]+2, RaceVehCoords[1][3], random(126), random(126), (60 * 60));
SetPlayerPos(playerid, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2]+2);
SetPlayerFacingAngle(playerid, RaceVehCoords[1][3]);
PutPlayerInVehicle(playerid, CreatedRaceVeh[playerid], 0);
SendClientMessage(playerid, 0xFFFF00AA, " ");
SendClientMessage(playerid, 0xFFFF00AA, "* Estas congelado, cuando termine la cuenta regresiva podrбs comenzar");
SendClientMessage(playerid, 0xFFFF00AA, "A correr contra los competidores por el primer puesto, Dinero y Score!");
SendClientMessage(playerid, 0xFFFF00AA, "AutoFix Activado (Vehiculo indestructible) y Turbo Desactivado");
Camera(playerid, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2], RaceVehCoords[1][3], 20);
PlayersCount[1] = 1;
}
}
}
#if defined RACE_IN_OTHER_WORLD
SetPlayerVirtualWorld(playerid, 10);
#endif
JoinCount++;
return 1;
}
function Camera(playerid, Float:X, Float:Y, Float:Z, Float:A, Mul)
{
SetPlayerCameraLookAt(playerid, X, Y, Z);
SetPlayerCameraPos(playerid, X + (Mul * floatsin(-A, degrees)), Y + (Mul * floatcos(-A, degrees)), Z+6);
}
function CountTillRace()
{
switch(CountAmount)
{
case 0:
{
ForEach(i, MAX_PLAYERS)
{
if(Joined[i] == false)
{
}
}
StartRace();
}
case 1..5:
{
new
string[100]
;
ForEach(i, MAX_PLAYERS)
{
if(Joined[i] == true)
{
SetCameraBehindPlayer(i);
format(string, sizeof(string), "~G~~h~~h~%d!", CountAmount);
}
if(Joined[i] == true)
{
GameTextForPlayer(i, string, 999, 5);
PlayerPlaySound(i, 1039, 0.0, 0.0, 0.0);
}
}
}
case 6..39:
{
new
string[100]
;
format(string, sizeof(string), "~n~~r~~h~~h~%d!", CountAmount);
ForEach(i, MAX_PLAYERS)
{
if(Joined[i] == true)
{
GameTextForPlayer(i, string, 999, 5);
PlayerPlaySound(i, 1056, 0.0, 0.0, 0.0);
}
}
}
case 40:
{
new
string[128]
;
SendClientMessageToAll(Verde, " ");
format(string, sizeof(string), "{E1FF00}* Carrera {FFFFFF}\"%s\" {E1FF00}comienza en \"%d\" segundos!.", RaceName, CountAmount);
SendClientMessageToAll(Verde, string);
SendClientMessageToAll(Verde, "{E1FF00}Escribe {FFFFFF}/join {E1FF00}para participar en la carrera, Debes estar dentro de un vehнculo");
SendClientMessageToAll(Verde, "{E1FF00}Escribe {FFFFFF}/exit {E1FF00}para salir de la carrera, Spawnearas en tu Equipo-Spawn");
ForEach(i, MAX_PLAYERS)
{
}
}
}
return CountAmount--;
}
function StartRace()
{
ForEach(i, MAX_PLAYERS)
{
if(Joined[i] == true)
{
TogglePlayerControllable(i, true);
PlayerPlaySound(i, 1141, 0.0, 0.0, 0.0);
GameTextForPlayer(i, "~b~~h~~h~ya ya ya!!!!", 2000, 5);
//SetCameraBehindPlayer(i);
}
}
rCounter = SetTimer("RaceCounter", 900, 1);
RaceTick = GetTickCount();
RaceStarted = 1;
KillTimer(CountTimer);
return 1;
}
function StopRace()
{
KillTimer(rCounter);
RaceStarted = 0;
RaceTick = 0;
RaceBusy = 0x00;
JoinCount = 0;
FinishCount = 0;
TimeProgress = 0;
ForEach(i, MAX_PLAYERS)
{
if(Joined[i] == true)
{
DisablePlayerRaceCheckpoint(i);
DestroyVehicle(CreatedRaceVeh[i]);
Joined[i] = false;
CPProgess[i] = 0;
KillTimer(InfoTimer[i]);
}
}
//TextDrawDestroy(TextoAnuncioCarrera);
if(AutomaticRace == true) LoadRaceNames(), LoadAutoRace(RaceNames[random(TotalRaces)]);
return 1;
}
function RaceCounter()
{
if(RaceStarted == 1)
{
RaceTime--;
if(JoinCount <= 0)
{
StopRace();
SendClientMessageToAll(Rojo, ">> Carrera terminу .. No queda nadie en la carrera!");
}
}
if(RaceTime <= 0)
{
StopRace();
}
return 1;
}
function IsPlayerInRace(playerid)
{
if(Joined[playerid] == true) return true;
else return false;
}
function ShowDialog(playerid, dialogid)
{
switch(dialogid)
{
case 599: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_LIST, CreateCaption("Creando una nueva carrera"), "\
Carrera Normal (en vehiculo)\n\
Carrera de aviones", "Siguiente", "Salir");
case 600: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, CreateCaption("Creando nueva carrera (Paso 1/4)"), "\
Paso 1:\n\
********\n\
Bienvenido a 'Construccion de carreras'.\n\
Antes de comenzar debes ingresar el nombre que le quieres poner a la nueva carrera (EJ: SFRace)\n\n\
>> Luego de haberle puesto el nombre a tu carrera presiona 'Siguiente' para continuar.", "Siguiente", "Volver");
case 601: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, CreateCaption("Creando nueva carrera (Paso 1/4)"), "\
ERROR: el nombre que le pusiste a la carrera es muy corto o muy largo! (min. 1 - max. 20 letras)\n\n\n\
Paso 1:\n\
********\n\
Bienvenido a 'Construccion de carreras'.\n\
Antes de comenzar debes ingresar el nombre que le quieres poner a la nueva carrera (EJ: SFRace)\n\n\
>> Luego de haberle puesto el nombre a tu carrera presiona 'Siguiente' para continuar.", "Siguiente", "Volver");
case 602: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, CreateCaption("Creando nueva carrera (Paso 2/4)"), "\
Paso 2:\n\
********\n\
Ingresa la 'ID' o 'Nombre' del vehiculo que quieres que se utiliza en esta carrera.\n\n\
>> Luego de haber ingresado la 'ID' o el 'Nombre' presiona 'Siguiente' para continuar. 'Volver' para cambiar algo anterior.", "Siguiente", "Volver");
case 603: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, CreateCaption("Build New Race (Step 2/4)"), "\
ERROR: El nombre del vehiculo o la id que ingresaste no existe.\n\n\n\
Step 2:\n\
********\n\
Ingresa la 'ID' o 'Nombre' del vehiculo que quieres que se utiliza en esta carrera.\n\n\
>> Luego de haber ingresado la 'ID' o el 'Nombre' presiona 'Siguiente' para continuar. 'Volver' para cambiar algo anterior.", "Siguiente", "Volver");
case 604: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_MSGBOX, CreateCaption("Build New Race (Step 3/4)"),
"\
Step 3:\n\
********\n\
We are almost done! Now go to the start line where the first and second car should stand.\n\
Note: When you click 'OK' you will be free. Use 'KEY_FIRE' to set the first position and second position.\n\
Note: After you got these positions you will automaticly see a dialog to continue the wizard.\n\n\
>> Press 'OK' to do the things above. 'Back' to change something.", "OK", "Back");
case 605: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_MSGBOX, CreateCaption("Build New Race (Step 4/4)"),
"\
Step 4:\n\
********\n\
Welcome to the last stap. In this stap you have to set the checkpoints; so if you click 'OK' you can set the checkpoints.\n\
You can set the checkpoints with 'KEY_FIRE'. Each checkpoint you set will save.\n\
You have to press 'ENTER' button when you're done with everything. You race is aviable then!\n\n\
>> Press 'OK' to do the things above. 'Back' to change something.", "OK", "Back");
case 606: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_MSGBOX, CreateCaption("Build New Race (Done)"),
"\
You have created your race and it's ready to use now.\n\n\
>> Press 'Finish' to finish. 'Exit' - Has no effect.", "Finish", "Exit");
}
return 1;
}
CreateCaption(arguments[])
{
new
string[128 char]
;
format(string, sizeof(string), "RyDeR's Race System - %s", arguments);
return string;
}
stock IsValidVehicle(vehicleid)
{
if(vehicleid < 400 || vehicleid > 611) return false;
else return true;
}
ReturnVehicleID(vName[])
{
Loop(x, 211)
{
if(strfind(VehicleNames[x], vName, true) != -1)
return x + 400;
}
return -1;
}
stock IsNumeric(string[])
{
for (new i = 0, j = strlen(string); i < j; i++)
{
if (string[i] > '9' || string[i] < '0') return 0;
}
return 1;
}
stock VehiculosInvalidos(modelo)
{
switch(GetVehicleModel(modelo))
{
case 520, 432,476,593,553,513,
512,577,592,511,539,464,460,519,
548,425,417,487,497,563,501,465,
447,469,488,472,473,493,595,484,
430,453,452,446,454: return 1;
}
return 0;
}
stock ResetPlayerVarDisconnect(playerid)
{
if(Joined[playerid] == true)
{
JoinCount--;
Joined[playerid] = false;
DestroyVehicle(CreatedRaceVeh[playerid]);
DisablePlayerRaceCheckpoint(playerid);
//TextDrawHideForPlayer(playerid, RaceInfo[playerid]);
CPProgess[playerid] = 0;
KillTimer(InfoTimer[playerid]);
#if defined RACE_IN_OTHER_WORLD
SetPlayerVirtualWorld(playerid, 0);
#endif
}
if(BuildRace == playerid+1) BuildRace = 0;
return 1;
}