/////////////////////////////////////////////////////////////////////////////// // Adrenaline (Racing) - 1.06 - by switch // /////////////////////////////////////////////////////////////////////////////// // Credits // // // // Coding: // // // // Kynen: Highscore() code he made for me // // Y_Less: Used GetXYInFrontOfPlayer() as base of Grid function // // Simon: Used ConvertToSafeInput() as base for CheckSafeInput() // // Dabombber: TimeConvert() // // Yagu: Referenced his race filterscript early on // // http://forum.sa-mp.com/index.php?topic=20637.0 // // // // // // Testing: // // // // aerodynamics // // [RSD]Potti // // any other person who crashed while on my TestServer :) // // // // // /////////////////////////////////////////////////////////////////////////////// #include #define TIME_GIVE_CAR 3000 #define TIME_MOVE_PLAYER 4000 #define TIME_PUT_PLAYER 3000 #define TIME_SHOW_VOTE 4000 #define SPARE_CARS 2 //number of spare cars per race #define RACES_TILL_MODECHANGE 0 //for use if you just want a few races to play then change to another mode #define SHOW_JOINS_PARTS //comment out if you don't want hide/parts shown #define CHECK_SIZE 12.0 //checkpoint size #define COLOR_TEMP 0xFFFFFFAA #define COLOR_GREY 0xAFAFAFAA #define COLOR_GREEN 0x33AA33AA #define COLOR_RED 0xFF0000AA #define COLOR_YELLOW 0xFFFF00AA #define COLOR_WHITE 0xFFFFFFAA #define COLOR_BLUE 0x0000BBAA #define COLOR_LIGHTBLUE 0x33CCFFAA #define COLOR_ORANGE 0xFF9900AA #define COLOR_PEACH 0xFF7F50AA #define COLOR_LBLUE2 0x6495EDAA #define COLOR_DARKBROWN 0x6B4F40AA #define COLOR_BROWN 0x763128AA #define COLOR_MAROON 0xAA160EAA #define COLOR_PINK 0xFF66FFAA #define MAX_RACES 200 #define MAX_RACECHECKPOINTS 300 #define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1 //CREDIT: DracoBlue new gMaxCheckpoints; new Float:RaceCheckpoints[MAX_RACECHECKPOINTS][4]; new Float:xRaceCheckpoints[MAX_PLAYERS][MAX_RACECHECKPOINTS][4]; new xWorldTime[MAX_PLAYERS]; new xTrackTime[MAX_PLAYERS]; new xWeatherID[MAX_PLAYERS]; new xRaceType[MAX_PLAYERS]; new xRaceName[MAX_PLAYERS][256]; new Float:xFacing[MAX_PLAYERS]; new xCreatorName[MAX_PLAYERS][MAX_PLAYER_NAME]; new xRaceBuilding[MAX_PLAYERS]; new xCarIds[MAX_PLAYERS][5]; new gPlayerProgress[MAX_PLAYERS]; new xPlayerProgress[MAX_PLAYERS]; new gFinishOrder; new gRaceNames[MAX_RACES][128]; new gRaceStart; new gCountdown; new gRaceStarted; new gWorldTime; new gWeather; new gCountdowntimer; new gEndRacetimer; new gTrackTime; new Float:gGrid[8]; new Float:gGrid2[8]; new vehicles[MAX_PLAYERS]; new gRaces; new Menu:voteMenu; new Menu:buildMenu[MAX_PLAYERS]; new gVoteItems[4][256]; new gVotes[4]; new gRacePosition[MAX_PLAYERS]; new gTotalRacers; new gTrackName[256]; new gGridIndex; new gGridCount; new gGrid2Index; new gGrid2Count; new gCarModelID; new gRaceType; new gRaceMaker[256]; new gFinished; new spawned[MAX_PLAYERS]; new newcar[MAX_PLAYERS]; new gWorldID; new showVoteTimer[MAX_PLAYERS]; new gNextTrack[256]; new gVehDestroyTracker[700]; new gGiveCarTimer[MAX_PLAYERS]; new gScores[MAX_PLAYERS][2]; new gScores2[MAX_PLAYERS][2]; new gGrided[MAX_PLAYERS]; new racecount; new Text:Ttime; new Text:Ttotalracers; new Text:Tposition[MAX_PLAYERS]; new Text:Tappend[MAX_PLAYERS]; new gMinutes, gSeconds; new gindex; #define HIGH_SCORE_SIZE 5 //Max number of ppl on the highscore list enum rStats { //Highscore enum rName[128], rTime, rRacer[MAX_PLAYER_NAME], }; new gBestTime[256]; forward Countdowntimer(); forward nextRaceCountdown(); forward countVotes(); forward changetrack(); forward showVote(playerid); forward RemovePlayersFromVehicles(); forward DestroyAllVehicles(); forward destroyCarSafe(veh); forward giveCar(playerid, modelid, world); forward GridSetup(playerid); forward GridSetupPlayer(playerid); forward PutPlayerInVehicleTimed(playerid, veh, slot); forward respawnCar(veh); forward updateTime(); forward AddRacers(num); ////////////////////////////////////////////////// //// x.x SA-MP FUNCTIONS (START) ///////////////// ////////////////////////////////////////////////// public OnPlayerSelectedMenuRow(playerid, row) { /* if (row==0) { SetTimerEx("showVotes",800,0,"d",playerid); return 0; }*/ new Menu:Current = GetPlayerMenu(playerid); if (Current == voteMenu) { new vmsg[256],pname[MAX_PLAYER_NAME]; GetPlayerName(playerid, pname, MAX_PLAYER_NAME); format(vmsg,256,"* %s voted for %s",pname,gVoteItems[row]); SendClientMessageToAll(COLOR_TEMP,vmsg); gVotes[row]++; TogglePlayerControllable(playerid,1); return 1; } else if (Current == buildMenu[xRaceBuilding[playerid]-1]) { print("Doing something in buildmenu"); switch (xRaceBuilding[playerid]) { case 1: { switch (row) { case 0: xWorldTime[playerid] = 0; case 1: xWorldTime[playerid] = 3; case 2: xWorldTime[playerid] = 6; case 3: xWorldTime[playerid] = 9; case 4: xWorldTime[playerid] = 12; case 5: xWorldTime[playerid] = 15; case 6: xWorldTime[playerid] = 18; case 7: xWorldTime[playerid] = 21; } } case 2: { switch (row) { case 0: xWeatherID[playerid] = 0; case 1: xWeatherID[playerid] = 10; case 2: xWeatherID[playerid] = 12; case 3: xWeatherID[playerid] = 16; case 4: xWeatherID[playerid] = 16; case 5: xWeatherID[playerid] = 19; } } case 3: { switch (row) { case 0: xTrackTime[playerid] = 60; case 1: xTrackTime[playerid] = 120; case 2: xTrackTime[playerid] = 180; case 3: xTrackTime[playerid] = 240; case 4: xTrackTime[playerid] = 300; case 5: xTrackTime[playerid] = 360; case 6: xTrackTime[playerid] = 480; case 7: xTrackTime[playerid] = 600; case 8: xTrackTime[playerid] = 900; } } case 4: { switch (row) { case 0: xRaceType[playerid] = 1; case 1: xRaceType[playerid] = 2; } } case 5: { switch (row) { case 0: xCarIds[playerid][0] = 451; case 1: xCarIds[playerid][0] = 565; case 2: xCarIds[playerid][0] = 429; case 3: xCarIds[playerid][0] = 415; case 4: xCarIds[playerid][0] = 558; case 5: xCarIds[playerid][0] = 522; case 6: xCarIds[playerid][0] = 468; case 7: xCarIds[playerid][0] = 513; case 8: xCarIds[playerid][0] = 452; case 9: xCarIds[playerid][0] = 0, print("More.."); } if (xCarIds[playerid][0] > 0) { SetPlayerVirtualWorld(playerid, playerid+100); printf("playerVirtual: %d world:%d",playerid, playerid+100); newCar(playerid); } } case 6: { switch (row) { case 0: xCarIds[playerid][0] = 560; case 1: xCarIds[playerid][0] = 506; case 2: xCarIds[playerid][0] = 567; case 3: xCarIds[playerid][0] = 424; case 4: xCarIds[playerid][0] = 556; case 5: xCarIds[playerid][0] = 541; case 6: xCarIds[playerid][0] = 494; case 7: xCarIds[playerid][0] = 571; case 8: xCarIds[playerid][0] = 520; case 9: xCarIds[playerid][0] = 0, print("More.."); } if (xCarIds[playerid][0] > 0) { SetPlayerVirtualWorld(playerid, playerid+100); printf("playerVirtual: %d world:%d",playerid, playerid+100); newCar(playerid); } } } printf("DEBUG: xCarIds=%d xracebuilding=%d",xCarIds[playerid][0],xRaceBuilding[playerid]); //HideMenuForPlayer(buildMenu[xRaceBuilding[playerid]-1],playerid); xRaceBuilding[playerid]++; printf("xRaceBuilding=%d",xRaceBuilding[playerid]); if (xCarIds[playerid][0]==0) { switch (xRaceBuilding[playerid]) { case 7: { xRaceBuilding[playerid]=xRaceBuilding[playerid]-2; ShowMenuForPlayer(buildMenu[xRaceBuilding[playerid]-1],playerid); } default: { ShowMenuForPlayer(buildMenu[xRaceBuilding[playerid]-1],playerid); } } print("Got here"); } else { SendClientMessage(playerid, COLOR_TEMP, "Please Set the Race Name! Eg /set RaceDemon"); printf("SER RACE NAME; racebuilding %d; pworld:%d",xRaceBuilding[playerid], playerid+100); } return 1; } return 1; } public OnGameModeInit() { SetGameModeText("SF Racing (Adrenaline)"); AddPlayerClass(170,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(299,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(157,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(202,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(154,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(144,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(108,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(107,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(217,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(201,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(281,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(83,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(80,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(193,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(192,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(206,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(124,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(93,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(85,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(115,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(292,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(250,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(186,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(67,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(294,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(223,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(233,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(284,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(240,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(100,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(101,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(195,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(141,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(123,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(296,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(298,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(176,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(0,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(190,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(188,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(293,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(47,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(2,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(249,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(241,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(142,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(184,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(73,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(103,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(101,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(98,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(60,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(59,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(55,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // AddPlayerClass(285,1522.2528,-887.0850,61.1224,248.4600,0,0,0,0,0,0); // LoadRaceList(); //Opens up racenames.txt and reads off the racenames to be used LoadRace(gRaceNames[random(gRaces)]); //The first race is picked at random and loaded createTextDraws(); //Creates all the TextDraws for time, position createBuildMenus(); //Creates the menus for building races SetTimer("updateTime",1000,1); //Sets a timer going to update the TextDraw for the displayed racetime for (new i=0;i=1)//Has the player just pressed mouse1 when they are in buildmode? { if(xPlayerProgress[playerid]==MAX_RACECHECKPOINTS) { SendClientMessage(playerid,COLOR_TEMP,"Max Checkpoints Set!!"); return; } GetPlayerPos(playerid, xRaceCheckpoints[playerid][xPlayerProgress[playerid]][0],xRaceCheckpoints[playerid][xPlayerProgress[playerid]][1],xRaceCheckpoints[playerid][xPlayerProgress[playerid]][2]); SetPlayerRaceCheckpoint(playerid, 2, xRaceCheckpoints[playerid][xPlayerProgress[playerid]][0],xRaceCheckpoints[playerid][xPlayerProgress[playerid]][1],xRaceCheckpoints[playerid][xPlayerProgress[playerid]][2], xRaceCheckpoints[playerid][xPlayerProgress[playerid]][0],xRaceCheckpoints[playerid][xPlayerProgress[playerid]][1],xRaceCheckpoints[playerid][xPlayerProgress[playerid]][2],CHECK_SIZE); switch (xPlayerProgress[playerid]) { case 0: { SendClientMessage(playerid,COLOR_TEMP,"[INFO] Starting point 1 Set! Now use FIRE to set Starting point for player2 (2nd Grid position)"); new veh = GetPlayerVehicleID(playerid); GetVehicleZAngle(veh, xFacing[playerid]); } case 1: { SendClientMessage(playerid,COLOR_TEMP,"[INFO] Starting point 2 Set! Now use FIRE to set the race checkpoints. Type /saverace when complete!"); } default: { new msg[256]; format(msg,256,"[INFO] Checkpoint %d set! Type /saverace when finished",xPlayerProgress[playerid]-2); SendClientMessage(playerid,COLOR_TEMP,msg); } } xPlayerProgress[playerid]++; PlaySoundForPlayer(playerid, 1137); return; } } public OnGameModeExit() { return 1; } public OnPlayerRequestClass(playerid, classid) { SetPlayerInterior(playerid,0); SetPlayerPos(playerid,2682.7673,-1680.1404,9.4193); SetPlayerFacingAngle(playerid, 352.2312); SetPlayerCameraPos(playerid,2683.1050,-1674.7749,9.4287); SetPlayerCameraLookAt(playerid,2682.0964,-1691.6710,9.4207); PlaySoundForPlayer(playerid, 1097); return 1; } public OnPlayerSpawn(playerid) { if (gTrackTime>10) { GridSetupPlayer(playerid); SetTimerEx("GridSetup", TIME_GIVE_CAR,0,"d", playerid); } else SendClientMessage(playerid,COLOR_TEMP,"The track is changing, please wait.."); PlaySoundForPlayer(playerid, 1186); spawned[playerid]=1; //SetPlayerVirtualWorld(playerid,0); return 1; } public OnPlayerEnterRaceCheckpoint(playerid) { if (xRaceBuilding[playerid]>=1) return 1; new State = GetPlayerState(playerid); if(State != PLAYER_STATE_DRIVER) //Players need to be in a car and be the driver to progress to the next cp { return 1; } if (gPlayerProgress[playerid]==gMaxCheckpoints-1) //If the player has finished... { gFinished++; if (gFinished == gTotalRacers && gTrackTime>35) gTrackTime=35; new finishmsg[256],pname[MAX_PLAYER_NAME],append[3]; GetPlayerName(playerid,pname,MAX_PLAYER_NAME); new Time, timestamp; timestamp = GetTickCount(); Time = timestamp - gRaceStart; new Minutes, Seconds, MSeconds, sMSeconds[5],sSeconds[5]; timeconvert(Time, Minutes, Seconds, MSeconds); if (Seconds < 10)format(sSeconds, sizeof(sSeconds), "0%d", Seconds); else format(sSeconds, sizeof(sSeconds), "%d", Seconds); if (MSeconds < 100)format(sMSeconds, sizeof(sMSeconds), "0%d", MSeconds); else format(sMSeconds, sizeof(sMSeconds), "%d", MSeconds); gFinishOrder++; if (gFinishOrder == 1) GivePlayerMoney(playerid,1);//Credit $1 for every win - AndrsOG switch (gFinishOrder) { case 1,21,31,41,51,61,71,81,91: format(append, sizeof(append), "st"); case 2,22,32,42,52,62,72,82,92: format(append, sizeof(append), "nd"); case 3,23,33,43,53,63,73,83,93: format(append, sizeof(append), "rd"); default: format(append, sizeof(append), "th"); } new prize; switch (gFinishOrder) { case 1: prize=10; case 2: prize=8; case 3: prize=6; case 4: prize=4; case 5: prize=3; case 6: prize=2; default: prize=1; } SetPlayerScore(playerid, GetPlayerScore(playerid)+prize); gScores[playerid][1]+=prize; format(finishmsg, sizeof(finishmsg),"-> %s finished %d%s in %d:%s.%s", pname,gFinishOrder, append, Minutes, sSeconds, sMSeconds); SendClientMessageToAll(COLOR_TEMP,finishmsg); DisablePlayerRaceCheckpoint(playerid); PlaySoundForPlayer(playerid, 1183); if (GetPlayerMenu(playerid) != buildMenu[playerid]) if (gTrackTime>3)showVoteTimer[playerid] = SetTimerEx("showVote", TIME_SHOW_VOTE, 0, "d",playerid); CheckAgainstHighScore(playerid, Time); } else { //If they havent finished, set next checkpoint+more gPlayerProgress[playerid]++; //Increase the players progress in the race RaceCheckpoints[gPlayerProgress[playerid]][3]++; gRacePosition[playerid]=floatround(RaceCheckpoints[gPlayerProgress[playerid]][3],floatround_floor); SetRaceText(playerid, gRacePosition[playerid]); //Set the race textdraws SetCheckpoint(playerid,gPlayerProgress[playerid],gMaxCheckpoints); //Sets the next checkpoint in the race PlaySoundForPlayer(playerid, 1137); } return 1; } public OnVehicleSpawn(vehicleid) { //Tried many ways to get rid of cars, found this was the least crashy (but still might be causing crashes) //If they car is spawning for the first time, nothing happends, if the car spawns for a second time (a respawn) it is destroyed. gVehDestroyTracker[vehicleid]++; if (gVehDestroyTracker[vehicleid]==1) { DestroyVehicle(vehicleid); gVehDestroyTracker[vehicleid]=0; } } ////////////////////////////////////////////////// //// x.x SA-MP FUNCTIONS (END) /////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// //// x.x TEXTDRAW FUNCTIONS (START) ////////////// ////////////////////////////////////////////////// public updateTime() { new Time, timestamp; timestamp = GetTickCount(); if (gRaceStart != 0) Time = timestamp - gRaceStart; else Time=0; new MSeconds; timeconvert(Time, gMinutes, gSeconds, MSeconds); gindex=0; while (gSeconds > 9) { gSeconds-=10; gindex++; } new tmp[10]; format(tmp,10,"%d:%d%d",gMinutes,gindex,gSeconds); TextDrawSetString(Ttime, tmp); } createTextDraws() { Ttime = TextDrawCreate(563.0, 376.0, "0"); TextDrawLetterSize(Ttime, 0.6, 3); Ttotalracers = TextDrawCreate(590.0, 355.0, "/0"); TextDrawLetterSize(Ttotalracers, 0.5, 2.5); } ////////////////////////////////////////////////// //// x.x TEXTDRAW FUNCTIONS (END) //////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// //// x.x COMMANDS (START) //////////////////////// ////////////////////////////////////////////////// public OnPlayerCommandText(playerid, cmdtext[]) { //dcmd(saverace,8,cmdtext); //dcmd(set,3,cmdtext); //dcmd(buildmode,9,cmdtext); dcmd(kill,4,cmdtext); dcmd(newcar,6,cmdtext); dcmd(nc,2,cmdtext); dcmd(rescueme,8,cmdtext); dcmd(stopsound,9,cmdtext); dcmd(moretime,8,cmdtext); dcmd(ss,2,cmdtext); dcmd(record,7,cmdtext); dcmd(top5,4,cmdtext); dcmd(track,5,cmdtext); dcmd(pause,5,cmdtext); dcmd(unpause,7,cmdtext); dcmd(addtorotation,13,cmdtext); dcmd(help,4,cmdtext); dcmd(buildhelp,9,cmdtext); dcmd(sfrally,7,cmdtext); dcmd(rules,5,cmdtext); dcmd(teams,5,cmdtext); dcmd(legs,4,cmdtext); dcmd(rescue,6,cmdtext); return 0; } dcmd_rescue(playerid, const params[]) { #pragma unused params SendClientMessage(playerid,COLOR_ORANGE,"Rescue Commands"); SendClientMessage(playerid,COLOR_RED,"Use these commands wisely, each command has a negative effect"); SendClientMessage(playerid,COLOR_YELLOW,"Type /rescueme to be sent to the start of Leg 1"); SendClientMessage(playerid,COLOR_YELLOW,"Type /leg2 to be sent to the start of Leg 2"); SendClientMessage(playerid,COLOR_YELLOW,"Type /leg3 to be sent to the start of Leg 3"); SendClientMessage(playerid,COLOR_YELLOW,"Type /leg4 to be sent to the start of Leg 4"); SendClientMessage(playerid,COLOR_YELLOW,"Type /flipme to flip your car if it is upside down or stuck (15 Second Freeze Penalty)"); SendClientMessage(playerid,COLOR_YELLOW,"Type /repair to repair your car if it is about to explode (30 Second Freeze Penalty"); return 1; } dcmd_sfrally(playerid, const params[]) { #pragma unused params SendClientMessage(playerid,COLOR_ORANGE,"Skull Fuckers Rally"); SendClientMessage(playerid,COLOR_GREEN,"Date: Sunday, 6th of April"); SendClientMessage(playerid,COLOR_RED,"Make sure you read the rules by typing /rules"); SendClientMessage(playerid,COLOR_YELLOW,"Type /rescue for a list teleport and vehicle repair commands"); SendClientMessage(playerid,COLOR_YELLOW,"Type /teams for a list of the Teams and their Colour"); SendClientMessage(playerid,COLOR_YELLOW,"Type /legs for a list of the Rally Legs and their Vehicle"); SendClientMessage(playerid,COLOR_YELLOW,"Visit www.sfclan-au.com/forum for more information"); return 1; } dcmd_rules(playerid, const params[]) { #pragma unused params SendClientMessage(playerid,COLOR_ORANGE,"Rally Rules"); SendClientMessage(playerid,COLOR_RED,"Follow the rules or your team will be disqualified and or kicked"); SendClientMessage(playerid,COLOR_YELLOW,"No deliberately sabotaging other teams"); SendClientMessage(playerid,COLOR_YELLOW,"No game modifications of any type"); SendClientMessage(playerid,COLOR_YELLOW,"Only take the vehicle that corresponds with your team colour"); SendClientMessage(playerid,COLOR_YELLOW,"Each team member must either drive Legs 1 & 3 or Legs 2 & 4"); SendClientMessage(playerid,COLOR_YELLOW,"One team member may not drive two legs in a row, you must only drive a maximum and minimum of two legs"); SendClientMessage(playerid,COLOR_YELLOW,"After each leg you must swap vehicles and the driver becomes the passenger and vice versa"); SendClientMessage(playerid,COLOR_YELLOW,"Immediately after you finish the rally, take a screenshot of your team's time"); return 1; } dcmd_teams(playerid, const params[]) { #pragma unused params SendClientMessage(playerid,COLOR_WHITE,"Rally Teams"); SendClientMessage(playerid,COLOR_RED,"Project Lunatic: GuessWho & EehsnaB - (Red)"); SendClientMessage(playerid,COLOR_PINK,"[RYAN]: darkwatch & RyziLLa - (Pink)"); SendClientMessage(playerid,COLOR_GREY,"R Rated Superstars: Kira & Holden - (Black)"); SendClientMessage(playerid,COLOR_BLUE,"SlickFrenzy Racing: Slick & KillFrenzy - (Blue)"); SendClientMessage(playerid,COLOR_GREEN,"Filthybastards: Nemesis & RacerX"); SendClientMessage(playerid,COLOR_YELLOW,"J & N Racing Evolution: Nrg & JWM - (Yellow)"); SendClientMessage(playerid,COLOR_BROWN,"No Name: Grievous & LSD - (Brown)"); return 1; } dcmd_legs(playerid, const params[]) { #pragma unused params SendClientMessage(playerid,COLOR_ORANGE,"Rally Legs"); SendClientMessage(playerid,COLOR_RED,"The course goes for around 30+ minutes. Travelling from LV to SF to LS to LV, which consist of 4 Legs"); SendClientMessage(playerid,COLOR_YELLOW,"Leg 1 - Vehicle: NRG 500 + Location: The Strip, Las Venturas"); SendClientMessage(playerid,COLOR_YELLOW,"Leg 2 - Vehicle: Dune + Location: Gant Bridge, Las Venturas"); SendClientMessage(playerid,COLOR_YELLOW,"Leg 3 - Vehicle: Sandking + Location: Whetstone, San Fierro"); SendClientMessage(playerid,COLOR_YELLOW,"Leg 4 - Vehicle: Hotring Racer + Location: Market, Los Santos"); SendClientMessage(playerid,COLOR_YELLOW,"When the race begins, one team member will have to hop off their NRG 500 and jump on their partner's bike"); SendClientMessage(playerid,COLOR_YELLOW,"As a passenger in the vehicle, be ready to use the /rescue commands to save time and or death"); return 1; } dcmd_track(playerid, params[]) //Admin command to force a change to the specified track Usage: /track TRACKNAME { if(!IsPlayerAdmin(playerid)) { SendClientMessage(playerid,COLOR_TEMP,"[ERROR] Sorry, only admins can change the current track"); return 1; } if (gTrackTime<=10) { SendClientMessage(playerid,COLOR_TEMP,"Sorry too late, the track change is in motion"); return 1; } new trackname[256]; if (!sscanf(params, "s", trackname)) SendClientMessage(playerid, COLOR_TEMP, "Usage: /track [trackname]"); new tmp[256],msg[256]; format(tmp,256,"%s.race",trackname); if(!fexist(tmp)) { SendClientMessage(playerid, COLOR_TEMP,"404: Track does not exist"); return 1; } format(msg,256,"An Admin is changing the track to: %s",trackname); printf("Changing track to %s",trackname); SendClientMessageToAll(COLOR_TEMP,msg); gTrackTime=7; gNextTrack = trackname; #pragma unused playerid return 1; } dcmd_addtorotation(playerid, params[]) //Admin command to add a user-made track to the rotation list Usage: /addtorotation TRACKNAME { if(!IsPlayerAdmin(playerid)) { SendClientMessage(playerid,COLOR_TEMP,"[ERROR] Sorry, only admins can save races to the tracklist"); return 1; } new trackname[128]; if (!sscanf(params, "s", trackname)) SendClientMessage(playerid, COLOR_TEMP, "[ERROR] Usage: /track [trackname]"); new tmp[256]; format(tmp,256,"%s.race",trackname); if(!fexist(tmp)) { SendClientMessage(playerid, COLOR_TEMP,"[ERROR] 404: Track does not exist"); return 1; } new File:f; if(fexist("racenames.txt")) { new msg[256]; f = fopen("racenames.txt", io_append); format(tmp,256,"\n%s",trackname); fwrite(f,tmp); fclose(f); format(msg,256,"[SUCCESS] Added %s into rotation",trackname); SendClientMessage(playerid,COLOR_TEMP,msg); } return 1; } dcmd_stopsound(playerid, const params[]) //Stops the annoying music { PlaySoundForPlayer(playerid, 1186); #pragma unused params return 1; } dcmd_ss(playerid, const params[]) //Shortcut for stopping the annoying music { PlaySoundForPlayer(playerid, 1186); #pragma unused params return 1; } dcmd_moretime(playerid, const params[])//Admin command to add 35 seconds onto the current track time { if(!IsPlayerAdmin(playerid)) { SendClientMessage(playerid,COLOR_TEMP,"[ERROR] Sorry, only admins add more time to the race"); return 1; } #pragma unused params #pragma unused playerid gTrackTime+=35; return 1; } dcmd_top5(playerid, const params[]) //Shows the top5 times for the current track { #pragma unused params ReadHighScoreList(gTrackName, 1, playerid, 0); return 1; } dcmd_record(playerid, const params[]) { #pragma unused params if (strlen(gBestTime) > 0) SendClientMessage(playerid, COLOR_TEMP, gBestTime); return 1; } dcmd_rescueme(playerid, const params[]) //Returns you to the start of the race { #pragma unused params new State = GetPlayerState(playerid); SendClientMessage(playerid, COLOR_TEMP, "Sending you to the start."); if (State!=1) { RemovePlayerFromVehicle(playerid); SetTimerEx("GridSetup",TIME_GIVE_CAR*2,0,"d",playerid); SetTimerEx("GridSetupPlayer", TIME_MOVE_PLAYER,0,"d", playerid); } else if (State==1) { GridSetupPlayer(playerid); SetTimerEx("GridSetup", TIME_GIVE_CAR,0,"d", playerid); } /*while (gPlayerProgress[playerid]>=0) { RaceCheckpoints[gPlayerProgress[playerid]][3]--; gPlayerProgress[playerid]--; }*/ return 1; } dcmd_pause(playerid, const params[]) //Admin command to pause the countdown to the next track (note: does not stop players, simply use if you need to extend the time for the track) { if(!IsPlayerAdmin(playerid)) { SendClientMessage(playerid,COLOR_TEMP,"[ERROR] Sorry, only admins can pause/unpause races"); return 1; } #pragma unused params KillTimer(gEndRacetimer); SendClientMessageToAll(COLOR_TEMP,"[INFO] An admin has paused the current track!"); SendClientMessage(playerid,COLOR_TEMP,"[INFO] The track has been paused, to resume type /unpause"); return 1; } dcmd_unpause(playerid, const params[]) { if(!IsPlayerAdmin(playerid)) { SendClientMessage(playerid,COLOR_TEMP,"[ERROR] Sorry, only admins can pause/unpause races"); return 1; } #pragma unused params KillTimer(gEndRacetimer); gEndRacetimer = SetTimer("nextRaceCountdown",1000,1); SendClientMessageToAll(COLOR_TEMP,"[INFO] An admin has unpaused the current track!"); SendClientMessage(playerid,COLOR_TEMP,"[INFO] The track has been unpaused"); return 1; } dcmd_newcar(playerid, const params[]) //Gives the player a replacement car { #pragma unused params if (xRaceBuilding[playerid]==0 && newcar[playerid]==SPARE_CARS) { SendClientMessage(playerid, COLOR_TEMP, "[ERROR] You have already used up your space vehicles for this race"); return 1; } newCar(playerid); if (xRaceBuilding[playerid]==0) { new msg[256]; format(msg,256,"[INFO] Giving you your spare car. You are only allowed %d spare vehicle(s) per race.",SPARE_CARS); SendClientMessage(playerid, COLOR_TEMP, msg); newcar[playerid]++; } return 1; } dcmd_nc(playerid, const params[]) //Gives the player a replacement car { #pragma unused params if (xRaceBuilding[playerid]==0 && newcar[playerid]==SPARE_CARS) { SendClientMessage(playerid, COLOR_TEMP, "[ERROR] You have already used up your space vehicles for this race"); return 1; } newCar(playerid); if (xRaceBuilding[playerid]==0) { new msg[256]; format(msg,256,"[INFO] Giving you your spare car. You are only allowed %d spare vehicle(s) per race.",SPARE_CARS); SendClientMessage(playerid, COLOR_TEMP, msg); newcar[playerid]++; } return 1; } dcmd_kill(playerid, const params[]) //Use to kill yourself { #pragma unused params SetPlayerHealth(playerid,0.0); return 1; } dcmd_help(playerid, const params[]) { #pragma unused params SendClientMessage(playerid,COLOR_TEMP,"Availible Commands: '/newcar' '/rescueme' '/buildmode on' '/buildmode off'"); if(IsPlayerAdmin(playerid))SendClientMessage(playerid,COLOR_TEMP,"Availible Admin Commands: '/pause' '/resume' '/track [racename]' '/addmodetorotation [racename]'"); return 1; } dcmd_buildhelp(playerid, const params[]) { #pragma unused params SendClientMessage(playerid,COLOR_TEMP,"Availible Commands: '/buildmode on' '/buildmode off' '/set [racename]' '/newcar'"); return 1; } dcmd_buildmode(playerid, params[]) { new var1[256]; if (!sscanf(params, "s", var1)) { SendClientMessage(playerid, COLOR_TEMP, "Usage: /buildmode [on/off]"); return 1; } if (strcmp(var1, "on", true)==0) { xRaceBuilding[playerid]=1; RemovePlayerFromVehicle(playerid); xPlayerProgress[playerid]=0; AllowPlayerTeleport(playerid,true); //SetPlayerVirtualWorld(playerid,playerid+1); xWorldTime[playerid]=0; xTrackTime[playerid]=0; xWeatherID[playerid]=0; xRaceType[playerid]=0; xCarIds[playerid][0]=0; SendClientMessage(playerid,COLOR_TEMP,"Entered Build Mode!"); gPlayerProgress[playerid]=0; DisablePlayerRaceCheckpoint(playerid); TogglePlayerControllable(playerid, 0); xCarIds[playerid][0]=0; ShowMenuForPlayer(buildMenu[0],playerid); GetPlayerName(playerid, xCreatorName[playerid],MAX_PLAYER_NAME); for (new i;i< MAX_RACECHECKPOINTS;i++) { xRaceCheckpoints[playerid][i][0]=0; xRaceCheckpoints[playerid][i][1]=0; xRaceCheckpoints[playerid][i][2]=0; xRaceCheckpoints[playerid][i][3]=0; } } if (strcmp(var1, "off", true)==0) { xRaceBuilding[playerid]=0; SendClientMessage(playerid,COLOR_TEMP,"Exited Build Mode!"); TogglePlayerControllable(playerid,1); AllowPlayerTeleport(playerid,false); RemovePlayerFromVehicle(playerid); SetPlayerVirtualWorld(playerid,gWorldID); SetTimerEx("GridSetup",TIME_GIVE_CAR*2,0,"d",playerid); SetTimerEx("GridSetupPlayer", TIME_MOVE_PLAYER,0,"d", playerid); DisablePlayerRaceCheckpoint(playerid); SetCheckpoint(playerid,gPlayerProgress[playerid],gMaxCheckpoints); xCarIds[playerid][0]=0; } return 1; } dcmd_set(playerid, params[]) { if (xRaceBuilding[playerid]>0) { if (!sscanf(params, "s", xRaceName[playerid])) SendClientMessage(playerid, COLOR_TEMP, "[ERROR] Usage: /set [value]"); //modename new trackname[256]; format(trackname,256,"%s.race",xRaceName[playerid]); if (fexist(trackname)) { SendClientMessage(playerid,COLOR_TEMP,"[ERROR] This track already exists! please pick another."); return 1; } else if (CheckSafeInput(xRaceName[playerid])==0) { SendClientMessage(playerid,COLOR_TEMP,"[ERROR] Error: Allowed characters a-z,A-Z,-,_,0-9"); return 1; } xRaceBuilding[playerid]++; new msg[256]; format(msg,256,"Modename set to: %s",xRaceName[playerid]); SendClientMessage(playerid,COLOR_TEMP,msg); TogglePlayerControllable(playerid,1); SendClientMessage(playerid,COLOR_TEMP,"[INFO] Use FIRE to set a starting point for player 1 (1st Grid position)"); } return 1; } dcmd_saverace(playerid, const params[]) { #pragma unused params if(xRaceBuilding[playerid]>0 && xPlayerProgress[playerid]>3) { if (xCarIds[playerid][0]<300)xCarIds[playerid][0]=565; SaveRace(playerid); xRaceBuilding[playerid]=0; SetVehicleToRespawn(GetPlayerVehicleID(playerid)); SendClientMessage(playerid,COLOR_TEMP,"Exited Build Mode!"); new State = GetPlayerState(playerid); if (State>1) RemovePlayerFromVehicle(playerid); SetPlayerVirtualWorld(playerid,gWorldID); DisablePlayerRaceCheckpoint(playerid); SetTimerEx("GridSetup",TIME_GIVE_CAR*2,0,"d",playerid); SetTimerEx("GridSetupPlayer", TIME_MOVE_PLAYER,0,"d", playerid); TogglePlayerControllable(playerid,1); new msg[256],pname[MAX_PLAYER_NAME]; GetPlayerName(playerid,pname,MAX_PLAYER_NAME); format (msg,256,"%s has created race: %s",pname,xRaceName[playerid]); SendClientMessageToAll(COLOR_TEMP,msg); xCarIds[playerid][0]=0; } else { SendClientMessage(playerid,COLOR_TEMP,"[ERROR] Not enough information set!"); } return 1; } ////////////////////////////////////////////////// //// x.x COMMANDS (END) ////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// //// x.x CUSTOM FUNCTIONS (START) //////////////// ////////////////////////////////////////////////// IsKeyJustDown(key, newkeys, oldkeys) { if((newkeys & key) && !(oldkeys & key)) return 1; return 0; } newCar(playerid) { new State = GetPlayerState(playerid); if (State>1) RemovePlayerFromVehicle(playerid); if (xRaceBuilding[playerid]<5 && State>1 )SetTimerEx("giveCar",6000,0,"ddd",playerid, gCarModelID,0); else if (xRaceBuilding[playerid]<5 && State==1)giveCar(playerid, gCarModelID, 0); else if (xCarIds[playerid][0]>300 && State>1)SetTimerEx("giveCar",6000,0,"ddd",playerid, xCarIds[playerid][0],playerid+1); else if (xCarIds[playerid][0]>300 && State==1)giveCar(playerid, xCarIds[playerid][0], playerid+1); return 1; } public respawnCar(veh) { SetVehicleToRespawn(veh); } public giveCar(playerid, modelid, world) { new Float:pos[4]; GetPlayerPos(playerid, pos[0],pos[1],pos[2]); GetPlayerFacingAngle(playerid,pos[3]); new State = GetPlayerState(playerid); if (State>1) { RemovePlayerFromVehicle(playerid); gGiveCarTimer[playerid] = SetTimerEx("giveCar",TIME_GIVE_CAR,0,"dd",playerid, modelid); } else { //vehicles[playerid] = new temp = CreateVehicle(modelid,pos[0],pos[1],pos[2],pos[3],-1,-1,10); printf("racebuilding %d; pworld:%d",xRaceBuilding[playerid], playerid+100); if (xRaceBuilding[playerid]<5) { SetVehicleVirtualWorld(temp, gWorldID); } else { SetVehicleVirtualWorld(temp, playerid+100); printf("VehicleVirtual: %d world:%d",temp, playerid+100); } SetTimerEx("PutPlayerInVehicleTimed",TIME_PUT_PLAYER,0,"ddd",playerid, temp,0); SetCameraBehindPlayer(playerid); } return; } public DestroyAllVehicles() { for(new i=0;i<5;i++) { destroyCarSafe(i); } } public destroyCarSafe(veh) { if(veh == -1) return 1; for(new i;i= 48 && input[idx] <= 57) || (input[idx] >= 65 && input[idx] <= 90) || (input[idx] >= 97 && input[idx] <= 122)|| input[idx] == 45 || input[idx] == 95|| input[idx] == 91 || input[idx] == 93)) { return 0; } else idx++; } return 1; } createVote() { for (new i;i<4;i++) gVoteItems[i] = "RESET"; DestroyMenu(voteMenu); voteMenu = CreateMenu("Vote",1, 50.0, 200.0, 120.0, 250.0); print("Creating Votemenu"); for (new i=0;i<4;i++) { randomRaceName(i,gRaces); AddMenuItem(voteMenu,0,gVoteItems[i]); printf("VoteOption%d: %s",i,gVoteItems[i]); } for (new i=0;i<4;i++)gVotes[i]=0; } randomRaceName(index,num) { new length = sizeof(gRaceNames); length--; new rand = random(num); for(new i;i<4;i++) { if (strcmp(gRaceNames[rand], gVoteItems[i], true)==0) { randomRaceName(index,num); return 1; } } gVoteItems[index] = gRaceNames[rand]; return 1; } /* randomRaceName(array[],num) { new length = strlen(array); new rand = random(num); for(new i;ivotes) { votes=gVotes[i]; index=i; equal=0; equalvotes[equal]=i; } else if (gVotes[i]==votes && votes!=0) { equal++; equalvotes[equal]=i; } } if (votes>0) { new rand = random(equal+1); gNextTrack = gVoteItems[equalvotes[rand]]; gTrackTime=7; format(vmsg,156,"Voting over! %s wins with %d votes. Changing in 10 seconds...",gVoteItems[equalvotes[rand]],gVotes[index]); SendClientMessageToAll(COLOR_TEMP, vmsg); } else { new rand; rand=random(4); gNextTrack = gVoteItems[rand]; format(vmsg,156,"Voting over! No votes were made, randomly selected %s. Changing in 10 seconds...",gVoteItems[rand]); SendClientMessageToAll(COLOR_TEMP, vmsg); } } public RemovePlayersFromVehicles() { for(new i=0;i1) { RemovePlayerFromVehicle(i); new veh = GetPlayerVehicleID(i); for(new j=0;j-1;i--) { new j = gScores2[i][0]; if(IsPlayerConnected(j) && gGrided[j]==0 && xRaceBuilding[j]==0 && spawned[j]==1) { if (gGrid2Count>1) { distance=10.0; switch (gGrid2Index) { case 0: { gGrid2[0] -= (distance * floatsin(-gGrid2[3], degrees)); gGrid2[1] -= (distance * floatcos(-gGrid2[3], degrees)); SetPlayerVirtualWorld(j, gWorldID); SetPlayerPos(j,gGrid2[0]+2.0,gGrid2[1],gGrid2[2]+2.0); gGrid2Index=1; } case 1: { gGrid2[4] -= (distance * floatsin(-gGrid2[7], degrees)); gGrid2[5] -= (distance * floatcos(-gGrid2[7], degrees)); SetPlayerVirtualWorld(j, gWorldID); SetPlayerPos(j,gGrid2[4]+2.0,gGrid2[5],gGrid2[6]+2.0); gGrid2Index=0; } } } else { distance=10.0; switch (gGrid2Index) { case 0: { SetPlayerVirtualWorld(j, gWorldID); SetPlayerPos(j,gGrid2[0]+2.0,gGrid2[1],gGrid2[2]+2.0); gGrid2Index=1; } case 1: { SetPlayerVirtualWorld(j, gWorldID); SetPlayerPos(j,gGrid2[4]+2.0,gGrid2[5],gGrid2[6]+2.0); gGrid2Index=0; } } } gGrid2Count++; pos++; //TogglePlayerControllable(j,0); } } } public AddRacers(num) { new pos; new Float:distance; gGridCount=0; for(new i=num-1;i>-1;i--) { new j = gScores2[i][0]; if(IsPlayerConnected(j) && gGrided[j]==0 && xRaceBuilding[j]==0 && spawned[j]==1) { if (gGridCount>1) { distance=10.0; switch (gGridIndex) { case 0: { gGrid[0] -= (distance * floatsin(-gGrid[3], degrees)); gGrid[1] -= (distance * floatcos(-gGrid[3], degrees)); vehicles[gGridCount] = CreateVehicle(gCarModelID,gGrid[0],gGrid[1],gGrid[2],gGrid[3],-1,-1,10); SetVehicleVirtualWorld(vehicles[gGridCount],gWorldID); printf("Created car, Count:%d",gGridCount); //SetPlayerPos(j,gGrid[0],gGrid[1],gGrid[2]+5.0); gGridIndex=1; } case 1: { gGrid[4] -= (distance * floatsin(-gGrid[7], degrees)); gGrid[5] -= (distance * floatcos(-gGrid[7], degrees)); vehicles[gGridCount] = CreateVehicle(gCarModelID,gGrid[4],gGrid[5],gGrid[6],gGrid[7],-1,-1,10); SetVehicleVirtualWorld(vehicles[gGridCount],gWorldID); printf("Created car, Count:%d",gGridCount); //SetPlayerPos(j,gGrid[4],gGrid[5],gGrid[6]+5.0); gGridIndex=0; } } } else { distance=10.0; switch (gGridIndex) { case 0: { vehicles[gGridCount] = CreateVehicle(gCarModelID,gGrid[0],gGrid[1],gGrid[2],gGrid[3],-1,-1,10); SetVehicleVirtualWorld(vehicles[gGridCount],gWorldID); printf("Created car, Count:%d",gGridCount); //SetPlayerPos(j,gGrid[0],gGrid[1],gGrid[2]+5.0); gGridIndex=1; } case 1: { vehicles[gGridCount] = CreateVehicle(gCarModelID,gGrid[4],gGrid[5],gGrid[6],gGrid[7],-1,-1,10); SetVehicleVirtualWorld(vehicles[gGridCount],gWorldID); printf("Created car, Count:%d",gGridCount); //SetPlayerPos(j,gGrid[4],gGrid[5],gGrid[6]+5.0); gGridIndex=0; } } } gGridCount++; SetRaceText(j,pos+1); SetTimerEx("PutPlayerInVehicleTimed",TIME_PUT_PLAYER,0,"ddd",j, vehicles[pos],0); printf("Putting player %d into carid %d in 3 secs..",j,pos); SetCheckpoint(j,gPlayerProgress[j],gMaxCheckpoints); gGrided[j]=1; pos++; } } } SetRaceText(playerid, pos) { //HideAllRaceText(playerid); new append[5]; switch (pos) { case 1,21,31,41,51,61,71,81,91: format(append, sizeof(append), "ST"); case 2,22,32,42,52,62,72,82,92: format(append, sizeof(append), "ND"); case 3,23,33,43,53,63,73,83,93: format(append, sizeof(append), "RD"); default: format(append, sizeof(append), "TH"); } new tmp[5]; format(tmp,5,"%d", pos); TextDrawSetString(Tposition[playerid],tmp); TextDrawSetString(Tappend[playerid],append); return 1; } public GridSetupPlayer(playerid) { //Staggered Grid Modified from Y_Less's GetXYInFrontOfPlayer() function new State = GetPlayerState(playerid); if (State>1) { printf("Aborting Grid setup for player:%d Reason: Was in vehicle/alt tabbed/dead",playerid); SendClientMessage(playerid,COLOR_TEMP,"[ERROR] Anti-crash stopped you from being gridded. Type /rescueme to rejoin the race"); //Kick(playerid); return 1; } new Float:distance; if (gGrid2Count>1) { distance=10.0; switch (gGrid2Index) { case 0: { gGrid2[0] -= (distance * floatsin(-gGrid2[3], degrees)); gGrid2[1] -= (distance * floatcos(-gGrid2[3], degrees)); } case 1: { gGrid2[4] -= (distance * floatsin(-gGrid2[7], degrees)); gGrid2[5] -= (distance * floatcos(-gGrid2[7], degrees)); } } } switch (gGrid2Index) { case 0: { SetPlayerVirtualWorld(playerid, gWorldID); SetPlayerPos(playerid,gGrid2[0],gGrid2[1],gGrid2[2]+1.0); //vehicles[gGridCount] = CreateVehicle(gCarModelID,gGrid[0],gGrid[1],gGrid[2],gGrid[3],-1,-1,10); //SetVehiclePos(vehicles[playerid],gGrid[0],gGrid[1],gGrid[2]); //SetVehicleZAngle(vehicles[playerid],gGrid[3]); gGridIndex=1; } case 1: { SetPlayerVirtualWorld(playerid, gWorldID); SetPlayerPos(playerid,gGrid2[4],gGrid2[5],gGrid2[6]+1.0); //vehicles[gGridCount] = CreateVehicle(gCarModelID,gGrid[4],gGrid[5],gGrid[6],gGrid[7],-1,-1,10); //SetVehiclePos(vehicles[playerid],gGrid[4],gGrid[5],gGrid[6]); //SetVehicleZAngle(vehicles[playerid],gGrid[7]); gGridIndex=0; } } //SetRaceText(playerid,gGridCount+1); //PutPlayerInVehicle(playerid,vehicles[gGridCount],0); //SetTimerEx("PutPlayerInVehicleTimed",3000,0,"ddd",playerid, vehicles[gGridCount],0); //SetCameraBehindPlayer(playerid); // if(gRaceStarted==0)TogglePlayerControllable(playerid,false); gGrid2Count++; //SetCheckpoint(playerid,gPlayerProgress[playerid],gMaxCheckpoints); //printf("GridSetupDebug- time:%d gridpos:%d playerid:%d vehicle:%d",GetTickCount(),gGridCount,playerid,vehicles[gGridCount]); return 1; } public GridSetup(playerid) { //Staggered Grid Modified from Y_Less's GetXYInFrontOfPlayer() function new State = GetPlayerState(playerid); if (State>1) { printf("Aborting Grid setup for player:%d Reason: Was in vehicle/alt tabbed/dead",playerid); SendClientMessage(playerid,COLOR_TEMP,"[ERROR] Anti-crash stopped you from being gridded. Type /rescueme to rejoin the race"); //Kick(playerid); return 1; } //vehicles[playerid]=-1; new Float:distance; if (gGridCount>1) { distance=10.0; switch (gGridIndex) { case 0: { gGrid[0] -= (distance * floatsin(-gGrid[3], degrees)); gGrid[1] -= (distance * floatcos(-gGrid[3], degrees)); } case 1: { gGrid[4] -= (distance * floatsin(-gGrid[7], degrees)); gGrid[5] -= (distance * floatcos(-gGrid[7], degrees)); } } } switch (gGridIndex) { case 0: { //SetPlayerPos(playerid,gGrid[0],gGrid[1],gGrid[2]+5.0); vehicles[gGridCount] = CreateVehicle(gCarModelID,gGrid[0],gGrid[1],gGrid[2],gGrid[3],-1,-1,10); SetVehicleVirtualWorld(vehicles[gGridCount],gWorldID); //SetVehiclePos(vehicles[playerid],gGrid[0],gGrid[1],gGrid[2]); //SetVehicleZAngle(vehicles[playerid],gGrid[3]); gGridIndex=1; } case 1: { //SetPlayerPos(playerid,gGrid[4],gGrid[5],gGrid[6]+5.0); vehicles[gGridCount] = CreateVehicle(gCarModelID,gGrid[4],gGrid[5],gGrid[6],gGrid[7],-1,-1,10); SetVehicleVirtualWorld(vehicles[gGridCount],gWorldID); //SetVehiclePos(vehicles[playerid],gGrid[4],gGrid[5],gGrid[6]); //SetVehicleZAngle(vehicles[playerid],gGrid[7]); gGridIndex=0; } } SetRaceText(playerid,gGridCount+1); //PutPlayerInVehicle(playerid,vehicles[gGridCount],0); SetTimerEx("PutPlayerInVehicleTimed",TIME_PUT_PLAYER,0,"ddd",playerid, vehicles[gGridCount],0); SetCameraBehindPlayer(playerid); if(gRaceStarted==0)TogglePlayerControllable(playerid,false); gGridCount++; SetCheckpoint(playerid,gPlayerProgress[playerid],gMaxCheckpoints); printf("GridSetupDebug- time:%d gridpos:%d playerid:%d vehicle:%d",GetTickCount(),gGridCount,playerid,vehicles[gGridCount]); return 1; } LoadRaceList() { new File:f; new line[256]; if(fexist("racenames.txt")) { f = fopen("racenames.txt", io_read); while(fread(f,line,sizeof(line),false)) { new iidx; gRaceNames[gRaces] = strtok(line,iidx); new msg[256]; format(msg,256,"%s.race",gRaceNames[gRaces]); if(fexist(msg)) { } else { printf("Line%d - 404 %s",gRaces,gRaceNames[gRaces]); } gRaces++; } fclose(f); } } SaveRace(playerid) { new msg[256]; new trackname2[256]; format(trackname2,256,"%s.txt",xRaceName[playerid]); new File:f2; f2 = fopen(trackname2, io_write); fclose(f2); new File:f3; f3 = fopen("buildlog.txt", io_append); new hour,mins,year,month,day; gettime(hour,mins); getdate(year,month,day); format(msg,256, "%d/%d/%d %d:%d - %s by %s\n",day,month,year,hour,mins,xRaceName[playerid],xCreatorName[playerid]); fwrite(f3,msg); fclose(f3); new trackname[256]; format(trackname,256,"%s.race",xRaceName[playerid]); new File:f; f = fopen(trackname, io_write); format(msg,256, "15 %d %d %d %d %s\n",xTrackTime[playerid],xWorldTime[playerid],xWeatherID[playerid],xRaceType[playerid],xCreatorName[playerid]); fwrite(f,msg); if (xCarIds[playerid][0]<300)xCarIds[playerid][0]=565; format(msg,256, "%d\n",xCarIds[playerid][0]); fwrite(f,msg); format(msg,256, "%f %f %f %f\n",xRaceCheckpoints[playerid][0][0],xRaceCheckpoints[playerid][0][1],xRaceCheckpoints[playerid][0][2], xFacing[playerid]); fwrite(f,msg); format(msg,256, "%f %f %f %f\n",xRaceCheckpoints[playerid][1][0],xRaceCheckpoints[playerid][1][1],xRaceCheckpoints[playerid][1][2], xFacing[playerid]); fwrite(f,msg); new i=2; while (xRaceCheckpoints[playerid][i][2]>0) { new msg2[256]; format(msg2,256, "%f %f %f\n",xRaceCheckpoints[playerid][i][0],xRaceCheckpoints[playerid][i][1],xRaceCheckpoints[playerid][i][2]); fwrite(f,msg2); i++; } fclose(f); new msgx[256]; format(msgx,256,"Sucess! %s Created. Type /track %s to change",xRaceName[playerid], xRaceName[playerid]); SendClientMessage(playerid,COLOR_TEMP,msgx); printf("SAVED %s",xRaceName[playerid]); return 1; } LoadRace(racename[]) { printf("Loading Race:%s",racename); new trackname[256]; format (trackname,256,"%s.race",racename); if(!fexist(trackname)) { printf("404:race file not found: %s",trackname); LoadRace(gRaceNames[random(gRaces)]); return 0; } format (gTrackName,256,"%s",racename); for(new i;i %s by %s | %s <>\n",gTrackName,gRaceMaker, tempTime); SendClientMessageToAll(COLOR_TEMP,gBestTime); print("Race Loaded"); return 1; } SetCheckpoint(playerid, progress, totalchecks) { new checktype; if(gRaceType==1)checktype=0; else if(gRaceType==2) checktype=4; if (progress==totalchecks-1)SetPlayerRaceCheckpoint(playerid,1,RaceCheckpoints[progress][0],RaceCheckpoints[progress][1],RaceCheckpoints[progress][2],RaceCheckpoints[progress][0],RaceCheckpoints[progress][1],RaceCheckpoints[progress][2],CHECK_SIZE); else SetPlayerRaceCheckpoint(playerid,checktype,RaceCheckpoints[progress][0],RaceCheckpoints[progress][1],RaceCheckpoints[progress][2],RaceCheckpoints[progress+1][0],RaceCheckpoints[progress+1][1],RaceCheckpoints[progress+1][2],CHECK_SIZE); } StartRace() { GameTextForAll("~W~GO", 2000, 5); for(new i;i ' ') && ((index - offset) < (sizeof(result) - 1))) { result[index - offset] = string[index]; index++; } result[index - offset] = EOS; return result; } // timeconvert code mainly from Dabombber timeconvert(Time, &Minutes, &Seconds, &MSeconds) { new Float:fTime = floatdiv(Time, 60000); Minutes = floatround(fTime, floatround_tozero); Seconds = floatround(floatmul(fTime - Minutes, 60), floatround_tozero); MSeconds = floatround(floatmul(floatmul(fTime - Minutes, 60) - Seconds, 1000), floatround_tozero); } PlaySoundForPlayer(playerid, soundid) { new Float:pX, Float:pY, Float:pZ; GetPlayerPos(playerid, pX, pY, pZ); PlayerPlaySound(playerid, soundid,pX, pY, pZ); } public PutPlayerInVehicleTimed(playerid, veh, slot) { new State = GetPlayerState(playerid); if (State!=1) { printf("Aborting Grid setup for player:%d Reason: Was in vehicle/alt tabbed/dead",playerid); SendClientMessage(playerid,COLOR_TEMP,"[ERROR] Anti-crash stopped you from being gridded. Type /rescueme to rejoin the race"); return 1; } PutPlayerInVehicle(playerid,veh,slot); SetCameraBehindPlayer(playerid); if(gRaceStarted==0)TogglePlayerControllable(playerid,false); return 1; } public OnPlayerExitedMenu(playerid) { TogglePlayerControllable(playerid,1); return 1; } public OnPlayerConnect(playerid) { #if defined SHOW_JOINS_PARTS new pname[MAX_PLAYER_NAME],pmsg[256]; GetPlayerName(playerid, pname, MAX_PLAYER_NAME); format(pmsg,256,"*** %s has joined the server",pname); SendClientMessageToAll(COLOR_TEMP,pmsg); #endif if (gTotalRacers==0)LoadRace(gTrackName); SendClientMessage(playerid,COLOR_RED,"Welcome to Adrenaline 1.06 by switch"); SendClientMessage(playerid,COLOR_RED,"Modified by [SF]GuessWho & [SF]darkwatch to suit the Skull Fuckers Rally"); SendClientMessage(playerid,COLOR_ORANGE,"Type /sfrally for all the details and commands needed"); SendClientMessage(playerid,COLOR_YELLOW,"Skull Fuckers Rally - Date: Sunday, 6th of April"); SendClientMessage(playerid,COLOR_YELLOW,"For more details visit www.sfclan-au.com/forums"); gTotalRacers++; new tmp[5]; format(tmp,5,"/%d",gTotalRacers); Tposition[playerid] = TextDrawCreate(560.0, 330.0, " "); TextDrawLetterSize(Tposition[playerid], 1.2, 6.2); Tappend[playerid] = TextDrawCreate(590.0, 335.0, " "); TextDrawLetterSize(Tappend[playerid], 0.5, 2.5); TextDrawSetString(Ttotalracers,tmp); TextDrawShowForPlayer(playerid, Ttime); TextDrawShowForPlayer(playerid, Tappend[playerid]); TextDrawShowForPlayer(playerid, Tposition[playerid]); TextDrawShowForPlayer(playerid, Ttotalracers); return 1; } public OnPlayerDisconnect(playerid, reason) { spawned[playerid]=0; #if defined SHOW_JOINS_PARTS new pname[MAX_PLAYER_NAME],pmsg[256]; GetPlayerName(playerid, pname, MAX_PLAYER_NAME); format(pmsg,256,"*** %s has left the server",pname); SendClientMessageToAll(COLOR_TEMP,pmsg); #endif //for(new i;i0) { RaceCheckpoints[gPlayerProgress[playerid]+1][3] = RaceCheckpoints[gPlayerProgress[playerid]+1][3] - 1.0; gPlayerProgress[playerid]--; } */ return 1; } public OnVehicleDeath(vehicleid, killerid) { return 1; } public OnPlayerExitVehicle(playerid, vehicleid) { return 1; } //redesigned high score handling code done by kynen ReadHighScoreList(track[256], display, playerid, all) { //READ and DISPLAY Highscorelist new HSList[HIGH_SCORE_SIZE][rStats]; //Takes params trackname, if it is to be displayed on screen new FiPo[255]; //the player requesting the displaying and if it is to be new himsg[255]; //displayed to all clients if(strcmp(track, "", true ) ) { //if a parameter isn't passed track = gTrackName; //use current track } format(FiPo, sizeof(FiPo), "%s.txt", track); if(fexist(FiPo)) { new File: hsfile = fopen(FiPo, io_read); new line[256]; new temp[256]; new idx; if (display) { format(himsg, sizeof(himsg),"Current Highscorelist for %s\n", track); if(playerid==-1 || IsPlayerAdmin(playerid) && all) { SendClientMessageToAll(COLOR_TEMP, himsg); //Sweet khaki color... :D } else { SendClientMessage(playerid, COLOR_TEMP, himsg); } } for(new i = 0; i <= sizeof(HSList)-1; i++) { fread(hsfile, line, sizeof(line)); temp = strtok(line, idx); strmid(HSList[i][rName], temp, 0, strlen(temp), 255); //read racename (to be compatible temp = strtok(line, idx); // HSList[i][rTime] = strval(temp); //convert record to int temp = strtok(line, idx); strmid(HSList[i][rRacer], temp, 0, strlen(temp), 255); idx = 0; //reset idx to read more highscores if (HSList[i][rTime] == 0) { //check if record is not set (0) previously if(!display) { //No need to return if it is being displayed fclose(hsfile); return (HSList); //if list ends, return what there was } } if (display) { new Minutes, Seconds, MSeconds, sSeconds[5], sMSeconds[5]; timeconvert(HSList[i][rTime], Minutes, Seconds, MSeconds); if (Seconds < 10)format(sSeconds, sizeof(sSeconds), "0%d", Seconds); else format(sSeconds, sizeof(sSeconds), "%d", Seconds); if (MSeconds < 100)format(sMSeconds, sizeof(sMSeconds), "0%d", MSeconds); else format(sMSeconds, sizeof(sMSeconds), "%d", MSeconds); if (Minutes != 50) format(himsg, sizeof(himsg),"%d - %d:%s.%s by %s\n", i+1, Minutes, sSeconds, sMSeconds, HSList[i][rRacer]); else format(himsg, sizeof(himsg),"\n"); if(playerid==-1 || IsPlayerAdmin(playerid) && all) { SendClientMessageToAll(COLOR_TEMP, himsg); //Sweet khaki color... :D } else { SendClientMessage(playerid, COLOR_TEMP, himsg); } } } fclose(hsfile); } else { //if client passed as param a race that doesn't exist format(himsg, sizeof(himsg),"The track '%s' doesn't exist.\n", track); SendClientMessage(playerid, COLOR_TEMP, himsg); //Send errormsg privately even if admin } if(!display) { //No need to return if it is being displayed return (HSList); //so warning 209 can be ignored. } return (HSList); } //redesigned high score handling code done by kynen CheckAgainstHighScore(playerid, time) { new RaceInfo[HIGH_SCORE_SIZE][rStats]; RaceInfo = ReadHighScoreList(gTrackName, 0, 0, 0); //Get current track highscorelist new playername2[MAX_PLAYER_NAME]; GetPlayerName(playerid, playername2, MAX_PLAYER_NAME); new recordflag=-1; //Init to -1 or it will be 0 and fail to work new pflag=-1; for(new i = 0; i < sizeof(RaceInfo); i++) { //run through highscorelist to see if new highscore if (RaceInfo[i][rTime] == 0) { //check if record is not set (0) previously RaceInfo[i][rTime] = 3000000; //if no previous record, set dummy record } if (strcmp(RaceInfo[i][rRacer], playername2) == 0 && pflag ==-1) { //check for personal best score pflag = i; //mark where best personal record is } if (time < RaceInfo[i][rTime] && recordflag ==-1 && (pflag == -1 || pflag == i) ) { //new record //personal flag must always be equal or nonexistant (-1) for a valid (personal) record new newrecordmessage[256]; if (i+1 == 1) printf("NEW FIRST RECORD - %s", playername2); format(newrecordmessage, sizeof(newrecordmessage),"New Highscore (%d) on %s by %s\n" , i+1, gTrackName, playername2); SendClientMessageToAll(COLOR_TEMP, newrecordmessage); recordflag = i; //Record number } } if (recordflag>-1) { //new highscore new tmp1[255]; format(tmp1,sizeof(tmp1),"%s.txt", gTrackName); //time to update list (file) if(fexist(tmp1)) { new File: file2 = fopen(tmp1, io_write); new recordmessage[256]; new recmsg2[256]; format(recordmessage, sizeof(recordmessage),"%s %d %s\n" , gTrackName, time, playername2); for(new i = 0; i < sizeof(RaceInfo); i++) { if(i == recordflag) { //record goes to correct place in list fwrite(file2,recordmessage); } if(strcmp(RaceInfo[i][rRacer], playername2)==0) { //skip all records that matches racername continue; } if(RaceInfo[i][rTime] == 3000000) { //ignore dummy records break; } format(recmsg2, sizeof(recmsg2), "%s %d %s\n", gTrackName, RaceInfo[i][rTime], RaceInfo[i][rRacer]); fwrite(file2,recmsg2); //write from old record list } fclose(file2); } else { SendClientMessageToAll(COLOR_TEMP, "Error: Track file does not exist"); } } } HighScore(Track) { #pragma unused Track new recordtimestr[20], recordtime; new racer[256]; new HighScoreString[256]; new tmp1[255]; format(tmp1,sizeof(tmp1),"%s.txt", gTrackName); if (!fexist(tmp1)) { new File: file1 = fopen(tmp1, io_write); fclose(file1); } new File: file = fopen(tmp1, io_read); new line[256]; new track[256]; new idx; fread(file, line, sizeof (line)); track = strtok(line, idx); recordtimestr = strtok(line, idx); racer = strtok(line, idx); fclose (file); recordtime = strval(recordtimestr); new Minutes, Seconds, MSeconds, sSeconds[5], sMSeconds[5]; if (recordtime > 0) { timeconvert(recordtime, Minutes, Seconds, MSeconds); if (Seconds < 10)format(sSeconds, sizeof(sSeconds), "0%d", Seconds); else format(sSeconds, sizeof(sSeconds), "%d", Seconds); if (MSeconds < 100)format(sMSeconds, sizeof(sMSeconds), "0%d", MSeconds); else format(sMSeconds, sizeof(sMSeconds), "%d", MSeconds); format(HighScoreString,sizeof(HighScoreString),"Record: %d:%s.%s by %s \n", Minutes, sSeconds, sMSeconds, racer); } else { format(HighScoreString,sizeof(HighScoreString),"There is currently no track record. \n"); } return HighScoreString; } /* findHighest() { new t = gScores2[0][1]; new index; for(new i = 0; i < 13;i++) { if (gScores2[i][1]>t) { index=i; t = gScores2[i][1]; } } gScores2[index][1]=0; return index; } */ sscanf(string[], format[], {Float,_}:...)//sscanf by Y_Less { new formatPos, stringPos, paramPos = 2, paramCount = numargs(); while (paramPos < paramCount && string[stringPos]) { switch (format[formatPos]) { case '\0': break; case 'i', 'd': setarg(paramPos, 0, strval(string[stringPos])); case 'c': setarg(paramPos, 0, string[stringPos]); case 'f': setarg(paramPos, 0, _:floatstr(string[stringPos])); case 's': { new end = format[formatPos + 1] == '\0' ? '\0' : ' ', i; while (string[stringPos] != end) setarg(paramPos, i++, string[stringPos++]); setarg(paramPos, i, '\0'); } default: goto skip; } while (string[stringPos] && string[stringPos] != ' ') stringPos++; while (string[stringPos] == ' ') stringPos++; paramPos++; skip: formatPos++; } return format[formatPos] ? 0 : 1; } quickSort(array_size) { print("quickSort()"); q_sort(0, array_size - 1); } q_sort(left, right) { new pivot, l_hold, r_hold; l_hold = left; r_hold = right; pivot = gScores2[left][1]; new what = gScores2[left][0]; while (left < right) { while ((gScores2[right][1] >= pivot) && (left < right)) right--; if (left != right) { gScores2[left][1] = gScores2[right][1]; gScores2[left][0] = gScores2[right][0]; left++; } while ((gScores2[left][1] <= pivot) && (left < right)) left++; if (left != right) { gScores2[right][1] = gScores2[left][1]; gScores2[right][0] = gScores2[left][0]; right--; } } gScores2[left][1] = pivot; gScores2[left][0] = what; pivot = left; left = l_hold; right = r_hold; if (left < pivot) q_sort(left, pivot-1); if (right > pivot) q_sort(pivot+1, right); } ////////////////////////////////////////////////// //// x.x CUSTOM FUNCTIONS (END) //////////////// //////////////////////////////////////////////////