/* Drift/Race/Tune/Stunt GM By: Splitx Thx To: Kevin433 For Login/Register System Thx To: Yagu's Race Filterscript v0.4a Thx To: Every 1 That Helped Me out ------------------------------------- !!DO NOT!! Take Credits For This Script And Dont Say YOU Made It ------------------------------------- YOU Can Edit The Script And Use It On Ur Server xD But Leave My Credits And The Other Credits */ //Includes //Defines #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 #include #include #include #define MAX_RACECHECKPOINTS 64 #define MAX_BUILDERS 4 #define RACEFILE_VERSION 2 #define MENUSYSTEM //colors #define COLOR_GREY 0xBEBEBEAA #define COLOR_WHITE 0xFFFFFFAA #define COLOR_GREEN 0x33AA33AA #define COLOR_GRAD5 0xE3E3E3FF #define COLOR_GRAD1 0xB4B5B7FF #define COLOR_DRIFT 0xE3E3E3FF #define COLOR_RACE 0xDC143CFF #define COLOR_TUNE 0x000000AA #define COLOR_RED 0xAA3333AA #define COLOR_YELLOW 0xFFFF00AA #define COLOR_GREEN 0x33AA33AA #define COLOR_WHITE 0xFFFFFFAA #define COLOR_STUNT 0x00FFFFAA //pragmas #pragma tabsize 0 //new //The Mission´s new Float:VehCP[3][3] = //[3] = amount of coords [3] = size of string { {-2989.536, 1413.023, 15.00}, {-2989.536, -116.7788, 15.00}, {-2989.536, 1506.446, 15.00} }; //Other new MajorityDelay = 120; new RRotation = 0; new RRotationDelay = 600000; new BuildAdmin = 1; new RaceAdmin = 1; new PrizeMode=0; new Prize=30000; new DynaMP=1; new JoinFee=1000; new currentveh; new gPlayerLogged[MAX_PLAYERS]; new gPlayerAccount[MAX_PLAYERS]; new Pot=0; new Ranking; new PrizeMP; new Countdown; new cd; new MajStart=0; new MajStartTimer; new mscd; new RaceActive; new RaceStart; new Float:RaceCheckpoints[MAX_RACECHECKPOINTS][3]; new LCurrentCheckpoint; new CurrentCheckpoint[MAX_PLAYERS]; new CurrentLap[MAX_PLAYERS]; new RaceParticipant[MAX_PLAYERS]; new Participants; new PlayerVehicles[MAX_PLAYERS]; new ORacelaps, ORacemode; new OAirrace, Float:OCPsize; new Racelaps, Racemode; new ScoreChange; new RaceTick; new LastLapTick[MAX_PLAYERS]; new TopRacers[6][MAX_PLAYER_NAME]; new TopRacerTimes[6]; new TopLappers[6][MAX_PLAYER_NAME]; new TopLapTimes[6]; new Float:CPsize; new Airrace; new Float:RLenght, Float:LLenght; new BCurrentCheckpoints[MAX_BUILDERS]; new RaceBuilders[MAX_PLAYERS]; new BuilderSlots[MAX_BUILDERS]; new Float:BRaceCheckpoints[MAX_BUILDERS][MAX_RACECHECKPOINTS][3]; new Bracemode[MAX_BUILDERS]; new Blaps[MAX_BUILDERS]; new Float:BCPsize[MAX_BUILDERS]; new BAirrace[MAX_BUILDERS]; //The Count new Count = 5; new CountText[5][5] ={ "~g~1", "~y~2", "~r~3", "~r~4", "~r~5" }; #if defined MENUSYSTEM forward RefreshMenuHeader(playerid,Menu:menu,text[]); new Menu:MAdmin, Menu:MPMode, Menu:MPrize, Menu:MDyna, Menu:MBuild, Menu:MLaps; new Menu:MRace, Menu:MRacemode, Menu:MFee, Menu:MCPsize, Menu:MDelay; #endif //Forward forward CountDown(); forward ShowStats(playerid,targetid); forward OnPlayerUpdate(playerid); forward Encrypt(string[]); forward OnPlayerLogin(playerid,const string[]); forward PayDay (playerid); forward RaceRotation(); forward LockRacers(); forward UnlockRacers(); forward SaveScores(); forward GetRaceTick(playerid); forward GetLapTick(playerid); forward ReadyRefresh(); forward RaceSound(playerid,sound); forward BActiveCP(playerid,sele); forward endrace(); forward countdown(); forward mscountdown(); forward SetNextCheckpoint(playerid); forward CheckBestLap(playerid, laptime); forward CheckBestRace(playerid,racetime); forward ChangeLap(playerid); forward SetRaceCheckpoint(playerid,target,next); forward SetBRaceCheckpoint(playerid,target,next); forward LoadTimes(playerid,timemode,tmp[]); forward IsNotAdmin(playerid); forward GetBuilderSlot(playerid); forward b(playerid); forward Float:Distance(Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2); forward clearrace(playerid); forward startrace(); forward LoadRace(tmp[]); forward CreateRaceMenus(); new ystring[128]; new CBuilder[MAX_PLAYER_NAME], CFile[64], CRaceName[128]; new RotationTimer; enum pInfo { pPassword[128], pKills, pDeaths, pCash, }; new PlayerInfo[MAX_PLAYERS][pInfo]; //------------------------------------------------------------------------------ main() { print("\n----------------------------------"); print(" Drift/Race/Tune/Stunt GM"); print(" By: Splitx"); print("Thx To: Kevin433 For Login/Register System"); print("----------------------------------\n"); } //------------------------------------------------------------------------------ public OnGameModeInit() { SetGameModeText("Drift/Race/Tune/Stunt"); // The Game mode name AllowAdminTeleport(1); // Allow! The Rcon ADMIN To Tp via The Map ShowNameTags(1); ShowPlayerMarkers(1); SetWorldTime(12); // The Time UsePlayerPedAnims(); //This Is For CJ´s Run Style RaceActive=0; Ranking=1; LCurrentCheckpoint=0; Participants=0; for(new i;i= i && a < i+strlen("fuck")) text[a]='*'; } } } for(new i=0; i<256; i++) { if (strfind(text[i], "bitch", true) == 0) { for(new a=0; a<256; a++) { if (a >= i && a < i+strlen("bitch")) text[a]='*'; } } } for(new i=0; i<256; i++) { if (strfind(text[i], "wtf", true) == 0) { for(new a=0; a<256; a++) { if (a >= i && a < i+strlen("wtf")) text[a]='*'; } } } for(new i=0; i<256; i++) { if (strfind(text[i], "ffs", true) == 0) { for(new a=0; a<256; a++) { if (a >= i && a < i+strlen("ffs")) text[a]='*'; } } } for(new i=0; i<256; i++) { if (strfind(text[i], "omfg", true) == 0) { for(new a=0; a<256; a++) { if (a >= i && a < i+strlen("omfg")) text[a]='*'; } } } return 1; } public OnPlayerConnect(playerid) { new pName[MAX_PLAYER_NAME]; new string[48]; GetPlayerName(playerid, pName, sizeof(pName)); format(string, sizeof(string), "(( Server: %s has joined the server. ))", pName); SendClientMessageToAll(COLOR_YELLOW, string); GameTextForPlayer(playerid,"~r~W~g~e~r~l~g~c~y~o~b~m~y~e",2500,3); SendClientMessage(playerid, COLOR_GREEN, "Welcome"); SendClientMessage(playerid, COLOR_GREEN, "Do"); SendClientMessage(playerid, COLOR_GREEN, "/help For help /Commands For Commands!"); SendClientMessage(playerid, COLOR_GREEN, "/credits For credits"); SendClientMessage(playerid, COLOR_RED, "DM Not Allowd DM = BAN"); SendClientMessage(playerid, COLOR_RED, "Dont Use Kill This Server is BAD word protected"); SendClientMessage(playerid, COLOR_GREEN, "Dont have a Account Do /register (only if u want to save ur data)"); SendClientMessage(playerid, COLOR_GREEN, "Have a Account Do /login (only if u want to save ur data)"); GivePlayerMoney(playerid, 20000); SetPlayerColor(playerid, COLOR_RED); return 1; } public OnPlayerDisconnect(playerid, reason) { if(RaceParticipant[playerid]>=1) { if(Participants==1) //Last participant leaving, ending race. { endrace(); } if(RaceParticipant[playerid] < 3 && RaceStart == 0 && !(RaceParticipant[playerid]==3 && RaceStart == 1)) { //Doing readycheck since someone left, but not if they disconnected during countdown. ReadyRefresh(); } Participants--; RaceParticipant[playerid]=0; DisablePlayerRaceCheckpoint(playerid); } if(RaceBuilders[playerid] != 0) { DisablePlayerRaceCheckpoint(playerid); for(new i;i ' ') && ((index - offset) < (sizeof(result) - 1))) { result[index - offset] = string[index]; index++; } result[index - offset] = EOS; return result; } public LockRacers() { for(new i;i0) { TogglePlayerControllable(i,1); if(PlayerVehicles[i] != 0) { PutPlayerInVehicle(i,PlayerVehicles[i],0); PlayerVehicles[i]=0; } } } } public countdown() { if(RaceStart == 0) // Locking players, setting the reward and { RaceStart=1; LockRacers(); new tmpprize, OPot; OPot=Pot; if(PrizeMode == 1 || PrizeMode == 4) { if(Racemode == 0 || Racemode == 3) tmpprize = floatround(RLenght); else if(Racemode == 1) tmpprize = floatround(LLenght * Racelaps); else if(Racemode == 2) tmpprize = floatround(RLenght * 2 * Racelaps); } tmpprize *= DynaMP; if(PrizeMode == 0 || PrizeMode == 3) Pot += Prize; else if(PrizeMode == 1 || PrizeMode == 4) Pot += tmpprize; if(Participants == 1) Pot=OPot; // Only 1 racer, force reward to entrance fees. } if(cd>0) { format(ystring, sizeof(ystring), "%d...",cd); for(new i=0;i1) { RaceSound(i,1056); GameTextForPlayer(i,ystring,1000,3); } } } else if(cd == 0) { format(ystring, sizeof(ystring), "~g~GO!",cd); KillTimer(Countdown); for(new i=0;i1) { RaceSound(i,1057); GameTextForPlayer(i,ystring,3000,3); RaceParticipant[i]=4; CurrentLap[i]=1; if(Racemode == 3) SetRaceCheckpoint(i,LCurrentCheckpoint,LCurrentCheckpoint-1); else SetRaceCheckpoint(i,0,1); } } UnlockRacers(); RaceTick=tickcount(); } cd--; } public SetNextCheckpoint(playerid) { if(Racemode == 0) // Default Mode { CurrentCheckpoint[playerid]++; if(CurrentCheckpoint[playerid] == LCurrentCheckpoint) { SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],-1); RaceParticipant[playerid]=6; } else SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],CurrentCheckpoint[playerid]+1); } else if(Racemode == 1) // Ring Mode { CurrentCheckpoint[playerid]++; if(CurrentCheckpoint[playerid] == LCurrentCheckpoint+1 && CurrentLap[playerid] == Racelaps) { SetRaceCheckpoint(playerid,0,-1); RaceParticipant[playerid]=6; } else if (CurrentCheckpoint[playerid] == LCurrentCheckpoint+1 && CurrentLap[playerid] != Racelaps) { CurrentCheckpoint[playerid]=0; SetRaceCheckpoint(playerid,0,1); RaceParticipant[playerid]=5; } else if(CurrentCheckpoint[playerid] == 1 && RaceParticipant[playerid]==5) { ChangeLap(playerid); if(LCurrentCheckpoint==1) { SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],0); } else { SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],2); } RaceParticipant[playerid]=4; } else { if(LCurrentCheckpoint==1 || CurrentCheckpoint[playerid] == LCurrentCheckpoint) SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],0); else SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],CurrentCheckpoint[playerid]+1); } } else if(Racemode == 2) // Yoyo-mode { if(RaceParticipant[playerid]==4) { if(CurrentCheckpoint[playerid] == LCurrentCheckpoint) // @ Last CP, trigger last-1 { RaceParticipant[playerid]=5; CurrentCheckpoint[playerid]=LCurrentCheckpoint-1; SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],CurrentCheckpoint[playerid]-1); } else if(CurrentCheckpoint[playerid] == LCurrentCheckpoint-1) // Second last CP, set next accordingly { CurrentCheckpoint[playerid]++; SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],CurrentCheckpoint[playerid]-1); } else { CurrentCheckpoint[playerid]++; SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],CurrentCheckpoint[playerid]+1); } } else if(RaceParticipant[playerid]==5) { if(CurrentCheckpoint[playerid] == 1 && CurrentLap[playerid] == Racelaps) //Set the finish line { SetRaceCheckpoint(playerid,0,-1); RaceParticipant[playerid]=6; } else if(CurrentCheckpoint[playerid] == 0) //At finish line, change lap. { ChangeLap(playerid); if(LCurrentCheckpoint==1) { SetRaceCheckpoint(playerid,1,0); } else { SetRaceCheckpoint(playerid,1,2); } RaceParticipant[playerid]=4; } else if(CurrentCheckpoint[playerid] == 1) { CurrentCheckpoint[playerid]--; SetRaceCheckpoint(playerid,0,1); } else { CurrentCheckpoint[playerid]--; SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],CurrentCheckpoint[playerid]-1); } } } else if(Racemode == 3) // Mirror Mode { CurrentCheckpoint[playerid]--; if(CurrentCheckpoint[playerid] == 0) { SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],-1); RaceParticipant[playerid]=6; } else { SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],CurrentCheckpoint[playerid]-1); } } } public SetRaceCheckpoint(playerid,target,next) { if(next == -1 && Airrace == 0) SetPlayerRaceCheckpoint(playerid,1,RaceCheckpoints[target][0],RaceCheckpoints[target][1],RaceCheckpoints[target][2],0.0,0.0,0.0,CPsize); else if(next == -1 && Airrace == 1) SetPlayerRaceCheckpoint(playerid,4,RaceCheckpoints[target][0],RaceCheckpoints[target][1],RaceCheckpoints[target][2],0.0,0.0,0.0,CPsize); else if(Airrace == 1) SetPlayerRaceCheckpoint(playerid,3,RaceCheckpoints[target][0],RaceCheckpoints[target][1],RaceCheckpoints[target][2],RaceCheckpoints[next][0], RaceCheckpoints[next][1],RaceCheckpoints[next][2],CPsize); else SetPlayerRaceCheckpoint(playerid,0,RaceCheckpoints[target][0],RaceCheckpoints[target][1],RaceCheckpoints[target][2],RaceCheckpoints[next][0],RaceCheckpoints[next][1], RaceCheckpoints[next][2],CPsize); } public SetBRaceCheckpoint(playerid,target,next) { new ar = BAirrace[b(playerid)]; if(next == -1 && ar == 0) SetPlayerRaceCheckpoint(playerid,1,BRaceCheckpoints[b(playerid)][target][0],BRaceCheckpoints[b(playerid)][target][1], BRaceCheckpoints[b(playerid)][target][2],0.0,0.0,0.0,BCPsize[b(playerid)]); else if(next == -1 && ar == 1) SetPlayerRaceCheckpoint(playerid,4,BRaceCheckpoints[b(playerid)][target][0], BRaceCheckpoints[b(playerid)][target][1],BRaceCheckpoints[b(playerid)][target][2],0.0,0.0,0.0, BCPsize[b(playerid)]); else if(ar == 1) SetPlayerRaceCheckpoint(playerid,3,BRaceCheckpoints[b(playerid)][target][0],BRaceCheckpoints[b(playerid)][target][1],BRaceCheckpoints[b(playerid)][target][2], BRaceCheckpoints[b(playerid)][next][0],BRaceCheckpoints[b(playerid)][next][1],BRaceCheckpoints[b(playerid)][next][2],BCPsize[b(playerid)]); else SetPlayerRaceCheckpoint(playerid,0,BRaceCheckpoints[b(playerid)][target][0],BRaceCheckpoints[b(playerid)][target][1],BRaceCheckpoints[b(playerid)][target][2], BRaceCheckpoints[b(playerid)][next][0],BRaceCheckpoints[b(playerid)][next][1],BRaceCheckpoints[b(playerid)][next][2],BCPsize[b(playerid)]); } public GetLapTick(playerid) { new tick, lap; tick=tickcount(); if(CurrentLap[playerid]==1) { lap=tick-RaceTick; LastLapTick[playerid]=tick; } else { lap=tick-LastLapTick[playerid]; LastLapTick[playerid]=tick; } return lap; } public GetRaceTick(playerid) { new tick, race; tick=tickcount(); race=tick-RaceTick; return race; } public OnPlayerEnterRaceCheckpoint(playerid) { if(RaceParticipant[playerid]>=1) // See if the player is participating in a race, allows race builders to do their stuff in peace. { if(RaceParticipant[playerid] == 6) // Player reaches the checkered flag. { new name[MAX_PLAYER_NAME], LapTime, RaceTime; LapTime=GetLapTick(playerid); RaceTime=GetRaceTick(playerid); GetPlayerName(playerid, name, MAX_PLAYER_NAME); RaceParticipant[playerid]=0; RaceSound(playerid,1139); format(ystring,sizeof(ystring),"%s has finished the race, position: %d",name,Ranking); if (Ranking < 4) SendClientMessageToAll(COLOR_GREEN,ystring); else SendClientMessage(playerid,COLOR_GREEN,ystring); if(Racemode == ORacemode && ORacelaps == Racelaps) { new LapString[10],RaceString[10], laprank, racerank; LapString=BeHuman(LapTime); RaceString=BeHuman(RaceTime); format(ystring,sizeof(ystring),"~w~Racetime: %s",RaceString); if(ORacemode!=0) format(ystring,sizeof(ystring),"%s~n~Laptime: %s",ystring,LapString); laprank=CheckBestLap(playerid,LapTime); if(laprank == 1) { format(ystring,sizeof(ystring),"%s~n~~y~LAP RECORD!",ystring); } racerank=CheckBestRace(playerid,RaceTime); if(racerank == 1) { format(ystring,sizeof(ystring),"%s~n~~y~TRACK RECORD!",ystring); } GameTextForPlayer(playerid,ystring,13000,3); } if(Ranking<4) { new winrar; if(Ranking == 1 && Participants == 1) winrar=Pot; // If the player was only participant, give the whole pot. else if(Ranking == 1 && Participants == 2) winrar=Pot/6*4; // If only 2 participants, give 4/6ths of the pot. else winrar=Pot/6*PrizeMP; // Otherwise 3/6ths, 2/6ths and 1/6th. GivePlayerMoney(playerid,winrar); format(ystring,sizeof(ystring),"You have earned $%d from the race!",winrar); PrizeMP--; SendClientMessage(playerid,COLOR_GREEN,ystring); } Ranking++; Participants--; DisablePlayerRaceCheckpoint(playerid); if(Participants == 0) { endrace(); } } else if (RaceStart == 0 && RaceParticipant[playerid]==1) // Player arrives to the start CP for 1st time { SendClientMessage(playerid,COLOR_YELLOW,"Type /ready when you are ready to start."); SendClientMessage(playerid,COLOR_YELLOW,"NOTE: Your controls will be locked once the countdown starts."); RaceParticipant[playerid]=2; } else if (RaceStart==1) // Otherwise switch to the next race CP. { RaceSound(playerid,1138); SetNextCheckpoint(playerid); } } return 1; } public endrace() { SaveScores(); //If the race had already started, and mode & laps are as originally, save the lapscores and racescores. for(new i=0;i= Waiting && MajorityDelay > 0 && MajStart == 0) { MajStart=1; format(ystring,sizeof(ystring),"Half of the racers are ready, race starts in %d seconds!", MajorityDelay); SendClientMessageToAll(COLOR_GREEN,ystring); MajStartTimer = SetTimer("mscountdown",10000,1); mscd= MajorityDelay; } } } public mscountdown() { if(RaceStart == 1 || MajStart == 0) { MajStart=0; KillTimer(MajStartTimer); } else { mscd-=10; if(mscd <= 0) { for(new i;i 0) GameTextForPlayer(i,ystring,6000,3); } } } } public CheckBestLap(playerid,laptime) { if(TopLapTimes[4] laptime) { for(new j=4;j>=i;j--) { TopLapTimes[j+1]=TopLapTimes[j]; TopLappers[j+1]=TopLappers[j]; } new playername[MAX_PLAYER_NAME]; GetPlayerName(playerid,playername,MAX_PLAYER_NAME); TopLapTimes[i]=laptime; TopLappers[i]=playername; ScoreChange=1; return i+1; } } return -1; //Shouldn't get here. } public CheckBestRace(playerid,racetime) { if(TopRacerTimes[4] racetime) { for(new j=4;j>=i;j--) { TopRacerTimes[j+1]=TopRacerTimes[j]; TopRacers[j+1]=TopRacers[j]; } new playername[MAX_PLAYER_NAME]; GetPlayerName(playerid,playername,MAX_PLAYER_NAME); TopRacerTimes[i]=racetime; TopRacers[i]=playername; ScoreChange=1; return i+1; } } return -1; //Shouldn't get here. } public SaveScores() { if(ScoreChange == 1) { fremove(CFile); new File:f,Float:x,Float:y,Float:z, templine[512]; f = fopen(CFile,io_write); format(templine,sizeof(templine),"YRACE %d %s %d %d %d %f\n", RACEFILE_VERSION, CBuilder, ORacemode, ORacelaps, OAirrace, OCPsize); fwrite(f,templine); format(templine,sizeof(templine),"%s %d %s %d %s %d %s %d %s %d\n", TopRacers[0],TopRacerTimes[0],TopRacers[1], TopRacerTimes[1], TopRacers[2],TopRacerTimes[2], TopRacers[3],TopRacerTimes[3],TopRacers[4], TopRacerTimes[4]); fwrite(f,templine); format(templine,sizeof(templine),"%s %d %s %d %s %d %s %d %s %d\n", TopLappers[0],TopLapTimes[0],TopLappers[1], TopLapTimes[1], TopLappers[2],TopLapTimes[2], TopLappers[3],TopLapTimes[3],TopLappers[4], TopLapTimes[4]); fwrite(f,templine); for(new i = 0; i < LCurrentCheckpoint+1;i++) { x=RaceCheckpoints[i][0]; y=RaceCheckpoints[i][1]; z=RaceCheckpoints[i][2]; format(templine,sizeof(templine),"%f %f %f\n",x,y,z); fwrite(f,templine); } fclose(f); } ScoreChange=0; } public ChangeLap(playerid) { new LapTime, TimeString[10], checklap; LapTime=GetLapTick(playerid); TimeString=BeHuman(LapTime); format(ystring,sizeof(ystring),"~w~Lap %d/%d - time: %s", CurrentLap[playerid], Racelaps, TimeString); if(Racemode == ORacemode && ORacelaps == Racelaps) { checklap=CheckBestLap(playerid,LapTime); if(checklap==1) format(ystring,sizeof(ystring),"%s~n~~y~LAP RECORD!",ystring); } CurrentLap[playerid]++; if(CurrentLap[playerid] == Racelaps) format(ystring,sizeof(ystring),"%s~n~~g~Final lap!",ystring); GameTextForPlayer(playerid,ystring,6000,3); } BeHuman(ticks) { new HumanTime[10], minutes, seconds, secstring[2], msecstring[3]; minutes=ticks/60000; ticks=ticks-(minutes*60000); seconds=ticks/1000; ticks=ticks-(seconds*1000); if(seconds <10) format(secstring,sizeof(secstring),"0%d",seconds); else format(secstring,sizeof(secstring),"%d",seconds); format(HumanTime,sizeof(HumanTime),"%d:%s",minutes,secstring); if(ticks < 10) format(msecstring,sizeof(msecstring),"00%d", ticks); else if(ticks < 100) format(msecstring,sizeof(msecstring),"0%d",ticks); else format(msecstring,sizeof(msecstring),"%d",ticks); format(HumanTime,sizeof(HumanTime),"%s.%s",HumanTime,msecstring); return HumanTime; } public LoadTimes(playerid,timemode,tmp[]) { new temprace[67], idx; format(temprace,sizeof(temprace),"%s.yr",tmp); if(strlen(tmp)) { if(!fexist(temprace)) { format(ystring,sizeof(ystring),"Race \'%s\' doesn't exist!",tmp); SendClientMessage(playerid,COLOR_YELLOW,ystring); return 1; } else { new File:f, templine[256], TBuilder[MAX_PLAYER_NAME], TempLapper[MAX_PLAYER_NAME], TempLap; idx=0; f = fopen(temprace, io_read); fread(f,templine,sizeof(templine)); // Read header-line if(templine[0] == 'Y') //Checking if the racefile is v0.2+ { new fileversion; strtok(templine,idx); // read off YRACE fileversion = strval(strtok(templine,idx)); // read off the file version if(fileversion > RACEFILE_VERSION) // Check if the race is made with a newer version of the racefile format { format(ystring,sizeof(ystring),"Race \'%s\' is created with a newer version of YRACE, unable to load.",tmp); SendClientMessage(playerid,COLOR_RED,ystring); return 1; } TBuilder=strtok(templine,idx); // read off RACEBUILDER fread(f,templine,sizeof(templine)); // read off best race times if(timemode ==1) fread(f,templine,sizeof(templine)); // read off best lap times idx=0; if(timemode == 0) format(ystring,sizeof(ystring),"%s by %s - Best race times:",tmp,TBuilder); else if(timemode == 1) format(ystring,sizeof(ystring),"%s by %s - Best laps:",tmp,TBuilder); else return 1; SendClientMessage(playerid,COLOR_GREEN,ystring); for(new i=0;i<5;i++) { TempLapper=strtok(templine,idx); TempLap=strval(strtok(templine,idx)); if(TempLap == 0) { format(ystring,sizeof(ystring),"%d. None yet",i+1); i=6; } else format(ystring,sizeof(ystring),"%d. %s - %s",i+1,BeHuman(TempLap),TempLapper); SendClientMessage(playerid,COLOR_GREEN,ystring); } return 1; } else { format(ystring,sizeof(ystring),"Race \'%s\' doesn't contain any time data.",tmp); SendClientMessage(playerid,COLOR_GREEN,ystring); return 1; } } } return 0; } public IsNotAdmin(playerid) { if (!IsPlayerAdmin(playerid)) { SendClientMessage(playerid, COLOR_RED, "You need to be an admin to use this command!"); return 1; } return 0; } public GetBuilderSlot(playerid) { for(new i;i < MAX_BUILDERS; i++) { if(!(BuilderSlots[i] < MAX_PLAYERS+1)) { BuilderSlots[i] = playerid; RaceBuilders[playerid] = i+1; return i+1; } } return 0; } public b(playerid) return RaceBuilders[playerid]-1; public Float:Distance(Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2) { new Float:temp=floatsqroot((x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) + (z1-z2) * (z1-z2)); if(temp < 0) temp=temp*(-1); return temp; } public clearrace(playerid) { for(new i=0;i= 2) format(ystring,sizeof(ystring),"%s Join fee: %d",ystring,JoinFee); if(Airrace == 1) format(ystring,sizeof(ystring),"%s AIR RACE",ystring); if(Racemode == 0 || Racemode == 3) format(ystring,sizeof(ystring),"%s Track lenght: %0.2fkm", ystring, RLenght/1000); else if(Racemode == 1) format(ystring,sizeof(ystring),"%s Lap lenght: %.2fkm, Total: %.2fkm", ystring, LLenght/1000, LLenght * Racelaps / 1000); SendClientMessageToAll(COLOR_GREEN,ystring); RaceStart=0; RaceActive=1; ScoreChange=0; Ranking=1; PrizeMP=3; } ReturnModeName(mode) { new modename[8]; if(mode == 0) modename="Default"; else if(mode == 1) modename="Ring"; else if(mode == 2) modename="Yoyo"; else if(mode == 3) modename="Mirror"; return modename; } public LoadRace(tmp[]) { new race_name[32],templine[512]; format(CRaceName,sizeof(CRaceName), "%s",tmp); format(race_name,sizeof(race_name), "%s.yr",tmp); if(!fexist(race_name)) return -1; // File doesn't exist CFile=race_name; LCurrentCheckpoint=-1; RLenght=0; RLenght=0; new File:f, i; f = fopen(race_name, io_read); fread(f,templine,sizeof(templine)); if(templine[0] == 'Y') //Checking if the racefile is v0.2+ { new fileversion; strtok(templine,i); // read off YRACE fileversion = strval(strtok(templine,i)); // read off the file version if(fileversion > RACEFILE_VERSION) return -2; // Check if the race is made with a newer version of the racefile format CBuilder=strtok(templine,i); // read off RACEBUILDER ORacemode = strval(strtok(templine,i)); // read off racemode ORacelaps = strval(strtok(templine,i)); // read off amount of laps if(fileversion > 1) { Airrace = strval(strtok(templine,i)); // read off airrace CPsize = floatstr(strtok(templine,i)); // read off CP size } else // v1 file format, set to default { Airrace = 0; CPsize = 8.0; } OAirrace = Airrace; OCPsize = CPsize; Racemode=ORacemode; Racelaps=ORacelaps; //Allows changing the modes, but disables highscores if they've been changed. fread(f,templine,sizeof(templine)); // read off best race times i=0; for(new j=0;j<5;j++) { TopRacers[j]=strtok(templine,i); TopRacerTimes[j]=strval(strtok(templine,i)); } fread(f,templine,sizeof(templine)); // read off best lap times i=0; for(new j=0;j<5;j++) { TopLappers[j]=strtok(templine,i); TopLapTimes[j]=strval(strtok(templine,i)); } } else //Otherwise add the lines as checkpoints, the file is made with v0.1 (or older) version of the script. { LCurrentCheckpoint++; RaceCheckpoints[LCurrentCheckpoint][0] = floatstr(strtok(templine,i)); RaceCheckpoints[LCurrentCheckpoint][1] = floatstr(strtok(templine,i)); RaceCheckpoints[LCurrentCheckpoint][2] = floatstr(strtok(templine,i)); Racemode=0; ORacemode=0; Racelaps=0; ORacelaps=0; //Enables converting old files to new versions CPsize = 8.0; Airrace = 0; // v2 additions OCPsize = CPsize; OAirrace = Airrace; // v2 additions CBuilder="UNKNOWN"; for(new j;j<5;j++) { TopLappers[j]="A"; TopLapTimes[j]=0; TopRacers[j]="A"; TopRacerTimes[j]=0; } } while(fread(f,templine,sizeof(templine),false)) { LCurrentCheckpoint++; i=0; RaceCheckpoints[LCurrentCheckpoint][0] = floatstr(strtok(templine,i)); RaceCheckpoints[LCurrentCheckpoint][1] = floatstr(strtok(templine,i)); RaceCheckpoints[LCurrentCheckpoint][2] = floatstr(strtok(templine,i)); if(LCurrentCheckpoint >= 1) { RLenght+=Distance(RaceCheckpoints[LCurrentCheckpoint][0],RaceCheckpoints[LCurrentCheckpoint][1], RaceCheckpoints[LCurrentCheckpoint][2],RaceCheckpoints[LCurrentCheckpoint-1][0], RaceCheckpoints[LCurrentCheckpoint-1][1],RaceCheckpoints[LCurrentCheckpoint-1][2]); } } LLenght = RLenght + Distance(RaceCheckpoints[LCurrentCheckpoint][0],RaceCheckpoints[LCurrentCheckpoint][1], RaceCheckpoints[LCurrentCheckpoint][2],RaceCheckpoints[0][0],RaceCheckpoints[0][1], RaceCheckpoints[0][2]); fclose(f); return 1; } public RaceRotation() { if(!fexist("yrace.rr")) { printf("ERROR in YRACE's Race Rotation (yrace.rr): yrace.rr doesn't exist!"); return -1; } if(RRotation == -1) { KillTimer(RotationTimer); return -1; // RRotation has been disabled } if(Participants > 0) return 1; // A race is still active. new File:f, templine[32], rotfile[]="yrace.rr", rraces=-1, rracenames[32][32], idx, fback; f = fopen(rotfile, io_read); while(fread(f,templine,sizeof(templine),false)) { idx = 0; rraces++; rracenames[rraces]=strtok(templine,idx); } fclose(f); RRotation++; if(RRotation > rraces) RRotation = 0; fback = LoadRace(rracenames[RRotation]); if(fback == -1) printf("ERROR in YRACE's Race Rotation (yrace.rr): Race \'%s\' doesn't exist!",rracenames[RRotation]); else if (fback == -2) printf("ERROR in YRACE's Race Rotation (yrace.rr): Race \'%s\' is created with a newer version of YRACE",rracenames[RRotation]); else startrace(); return 1; } #if defined MENUSYSTEM public OnPlayerExitedMenu(playerid) { if(!IsValidMenu(GetPlayerMenu(playerid))) return 1; ShowMenuForPlayer(GetPlayerMenu(playerid), playerid); return 1; } public OnPlayerSelectedMenuRow(playerid, row) { new Menu:Current = GetPlayerMenu(playerid); if(Current == MAdmin) { if(row <=4 && RaceActive == 1) { SendClientMessage(playerid,COLOR_RED,"Race active, cannot change this setting!"); ShowMenuForPlayer(MAdmin,playerid); return 1; } if(row == 0) ShowMenuForPlayer(MPMode,playerid); else if (row == 1) ShowMenuForPlayer(MPrize,playerid); else if (row == 2) ShowMenuForPlayer(MDyna,playerid); else if (row == 3) ShowMenuForPlayer(MFee,playerid); else if (row == 4) ShowMenuForPlayer(MDelay,playerid); else if (row == 5) { if(RaceActive == 1) endrace(); else SendClientMessage(playerid,COLOR_YELLOW,"No race active!"); ShowMenuForPlayer(MAdmin,playerid); } else if (row == 9) { TogglePlayerControllable(playerid,1); HideMenuForPlayer(MAdmin,playerid); } else { if(row == 6 && RaceAdmin == 1) RaceAdmin=0; else if(row == 6 && RaceAdmin == 0) RaceAdmin=1; else if(row == 7 && BuildAdmin == 1) BuildAdmin=0; else if(row == 7 && BuildAdmin == 0) BuildAdmin=1; else if(row == 8 && RRotation >= 0) RRotation = -1; else RRotation = 0; if(RaceAdmin == 1) format(ystring,sizeof(ystring),"RA: ON"); else format(ystring,sizeof(ystring),"RA: off"); if(BuildAdmin == 1) format(ystring,sizeof(ystring),"%s BA: ON",ystring); else format(ystring,sizeof(ystring),"%s BA: off",ystring); if(RRotation >= 0) format(ystring,sizeof(ystring),"%s RR: ON",ystring); else format(ystring,sizeof(ystring),"%s RR: off",ystring); if(RRotation >= 0 && row == 8) RotationTimer = SetTimer("RaceRotation",RRotationDelay,1); else if(RRotation -1 && row == 8) KillTimer(RotationTimer); RefreshMenuHeader(playerid,MAdmin,ystring); } } else if(Current == MPMode) { if(row == 5) { ShowMenuForPlayer(MAdmin,playerid); return 1; } PrizeMode = row; if (PrizeMode == 0) ystring = "Fixed"; else if(PrizeMode == 1) ystring = "Dynamic"; else if(PrizeMode == 2) ystring = "Join Fee"; else if(PrizeMode == 3) ystring = "Join Fee + Fixed"; else if(PrizeMode == 4) ystring = "Join Fee + Dynamic"; format(ystring,sizeof(ystring),"Mode: %s",ystring); RefreshMenuHeader(playerid,MPMode,ystring); } else if(Current == MPrize) { if(row == 6) { ShowMenuForPlayer(MAdmin,playerid); return 1; } if (row == 0) Prize += 100; else if(row == 1) Prize += 1000; else if(row == 2) Prize += 10000; else if(row == 3) Prize -= 100; else if(row == 4) Prize -= 1000; else if(row == 5) Prize -= 10000; if(Prize < 0) Prize = 0; format(ystring,sizeof(ystring),"Amount: %d",Prize); RefreshMenuHeader(playerid,MPrize,ystring); } else if(Current == MDyna) { if(row == 4) { ShowMenuForPlayer(MAdmin,playerid); return 1; } if (row == 0) DynaMP++; else if(row == 1) DynaMP+=5; else if(row == 2) DynaMP--; else if(row == 3) DynaMP-=5; else if(DynaMP < 1) DynaMP = 1; format(ystring,sizeof(ystring),"Multiplier: %dx",DynaMP); RefreshMenuHeader(playerid,MDyna,ystring); } else if(Current == MBuild) { if (row == 0) { format(ystring,sizeof(ystring),"Laps: %d",Blaps[b(playerid)]); SetMenuColumnHeader(MLaps,0,ystring); ShowMenuForPlayer(MLaps,playerid); } else if (row == 1) { format(ystring,sizeof(ystring),"Mode: %s",ReturnModeName(Bracemode[b(playerid)])); SetMenuColumnHeader(MRacemode,0,ystring); ShowMenuForPlayer(MRacemode,playerid); } else if (row == 2) { format(ystring,sizeof(ystring),"Size: %0.2f",BCPsize[b(playerid)]); SetMenuColumnHeader(MCPsize,0,ystring); ShowMenuForPlayer(MCPsize,playerid); } else if (row == 3) { if(BAirrace[b(playerid)] == 0) { BAirrace[b(playerid)] = 1; format(ystring,sizeof(ystring),"Air race: ON"); } else if(BAirrace[b(playerid)] == 1) { BAirrace[b(playerid)] = 0; format(ystring,sizeof(ystring),"Air race: off"); } RefreshMenuHeader(playerid,MBuild,ystring); } else if(row == 4) { clearrace(playerid); HideMenuForPlayer(MBuild,playerid); TogglePlayerControllable(playerid,1); return 1; } else if(row == 5) { HideMenuForPlayer(MBuild,playerid); TogglePlayerControllable(playerid,1); } } else if(Current == MLaps) { if(row == 6) { if(RaceBuilders[playerid] != 0) ShowMenuForPlayer(MBuild,playerid); else ShowMenuForPlayer(MRace,playerid); return 1; } new change=0; if (row == 0) change++; else if(row == 1) change+=5; else if(row == 2) change+=10; else if(row == 3) change--; else if(row == 4) change-=5; else if(row == 5) change-=10; if(RaceBuilders[playerid] != 0) { Blaps[b(playerid)] += change; if(Blaps[b(playerid)] < 1) Blaps[b(playerid)] = 1; format(ystring,sizeof(ystring),"Laps: %d",Blaps[b(playerid)]); RefreshMenuHeader(playerid,MLaps,ystring); } else { Racelaps += change; if(Racelaps < 1) Racelaps = 1; format(ystring,sizeof(ystring),"Laps: %d",Racelaps); RefreshMenuHeader(playerid,MLaps,ystring); } } else if(Current == MRacemode) { if(row == 4) { if(RaceBuilders[playerid] != 0) ShowMenuForPlayer(MBuild,playerid); else ShowMenuForPlayer(MRace,playerid); return 1; } if(RaceBuilders[playerid] != 0) { Bracemode[b(playerid)]=row; if(Bracemode[b(playerid)] == 2 && BCurrentCheckpoints[b(playerid)] < 3) { SendClientMessage(playerid,COLOR_YELLOW,"Cannot set racemode 2 with only 2 CPs!"); Bracemode[b(playerid)] = 1; } format(ystring,sizeof(ystring),"Mode: %s",ReturnModeName(Bracemode[b(playerid)])); RefreshMenuHeader(playerid,MRacemode,ystring); return 1; } else { Racemode = row; if(Racemode == 2 && LCurrentCheckpoint < 2) { SendClientMessage(playerid,COLOR_YELLOW,"Cannot set racemode 2 with only 2 CPs!"); Racemode = 1; } format(ystring,sizeof(ystring),"Mode: %s",ReturnModeName(Racemode)); RefreshMenuHeader(playerid,MRacemode,ystring); return 1; } } else if(Current == MRace) { if(row == 0) { format(ystring,sizeof(ystring),"Laps: %d",Racelaps); SetMenuColumnHeader(MLaps,0,ystring); ShowMenuForPlayer(MLaps,playerid); } else if(row == 1) { format(ystring,sizeof(ystring),"Mode: %s",ReturnModeName(Racemode)); SetMenuColumnHeader(MRacemode,0,ystring); ShowMenuForPlayer(MRacemode,playerid); } else if(row == 2) { format(ystring,sizeof(ystring),"Size: %0.2f",CPsize); SetMenuColumnHeader(MCPsize,0,ystring); ShowMenuForPlayer(MCPsize,playerid); } else if(row == 3) { if(Airrace == 0) { Airrace = 1; format(ystring,sizeof(ystring),"Air race: ON"); } else if(Airrace == 1) { Airrace = 0; format(ystring,sizeof(ystring),"Air race: off"); } RefreshMenuHeader(playerid,MRace,ystring); } else if(row == 4) { if(RaceActive == 0) { startrace(); HideMenuForPlayer(MRace,playerid); TogglePlayerControllable(playerid,1); } else { SendClientMessage(playerid,COLOR_YELLOW,"Race is already active!"); } } else if(row == 5) { HideMenuForPlayer(MRace,playerid); TogglePlayerControllable(playerid,1); } } else if(Current == MFee) { if(row == 6) { ShowMenuForPlayer(MAdmin,playerid); return 1; } if(row == 0) JoinFee +=100; if(row == 1) JoinFee +=1000; if(row == 2) JoinFee +=10000; if(row == 3) JoinFee -=100; if(row == 4) JoinFee -=1000; if(row == 5) JoinFee -=10000; if(JoinFee < 0) JoinFee = 0; format(ystring,sizeof(ystring),"Fee: %d$",JoinFee); RefreshMenuHeader(playerid,MFee,ystring); } else if(Current == MCPsize) { if(row == 6) { if(RaceBuilders[playerid] != 0) ShowMenuForPlayer(MBuild,playerid); else ShowMenuForPlayer(MRace,playerid); return 1; } new Float:change; if(row == 0) change +=0.1; if(row == 1) change +=1.0; if(row == 2) change +=10.0; if(row == 3) change -=0.1; if(row == 4) change -=1.0; if(row == 5) change -=10.0; if(RaceBuilders[playerid] != 0) { BCPsize[b(playerid)] += change; if(BCPsize[b(playerid)] < 1.0) BCPsize[b(playerid)] = 1.0; if(BCPsize[b(playerid)] > 32.0) BCPsize[b(playerid)] = 32.0; format(ystring,sizeof(ystring),"Size %0.2f",BCPsize[b(playerid)]); RefreshMenuHeader(playerid,MCPsize,ystring); } else { CPsize += change; if(CPsize < 1.0) CPsize = 1.0; if(CPsize > 32.0) CPsize = 32.0; format(ystring,sizeof(ystring),"Size %0.2f",CPsize); RefreshMenuHeader(playerid,MCPsize,ystring); } } else if(Current == MDelay) { if(row == 4) { ShowMenuForPlayer(MAdmin,playerid); return 1; } if (row == 0) MajorityDelay+=10; else if (row == 1) MajorityDelay+=60; else if (row == 2) MajorityDelay-=10; else if (row == 3) MajorityDelay-=60; if(MajorityDelay <= 0) { MajorityDelay=0; format(ystring,sizeof(ystring),"Delay: disabled"); } else format(ystring,sizeof(ystring),"Delay: %ds",MajorityDelay); RefreshMenuHeader(playerid,MDelay,ystring); } return 1; } public RefreshMenuHeader(playerid,Menu:menu,text[]) { SetMenuColumnHeader(menu,0,text); ShowMenuForPlayer(menu,playerid); } public CreateRaceMenus() { //Admin menu MAdmin = CreateMenu("Admin menu", 1, 25, 170, 220, 25); AddMenuItem(MAdmin,0,"Set prizemode..."); AddMenuItem(MAdmin,0,"Set fixed prize..."); AddMenuItem(MAdmin,0,"Set dynamic prize..."); AddMenuItem(MAdmin,0,"Set entry fees..."); AddMenuItem(MAdmin,0,"Majority delay..."); AddMenuItem(MAdmin,0,"End current race"); AddMenuItem(MAdmin,0,"Toggle Race Admin [RA]"); AddMenuItem(MAdmin,0,"Toggle Build Admin [BA]"); AddMenuItem(MAdmin,0,"Toggle Race Rotation [RR]"); AddMenuItem(MAdmin,0,"Leave"); if(RaceAdmin == 1) format(ystring,sizeof(ystring),"RA: ON"); else format(ystring,sizeof(ystring),"RA: off"); if(BuildAdmin == 1) format(ystring,sizeof(ystring),"%s BA: ON",ystring); else format(ystring,sizeof(ystring),"%s BA: off",ystring); if(RRotation >= 0) format(ystring,sizeof(ystring),"%s RR: ON",ystring); else format(ystring,sizeof(ystring),"%s RR: off",ystring); SetMenuColumnHeader(MAdmin,0,ystring); //Prizemode menu [Admin submenu] MPMode = CreateMenu("Set prizemode:", 1, 25, 170, 220, 25); AddMenuItem(MPMode,0,"Fixed"); AddMenuItem(MPMode,0,"Dynamic"); AddMenuItem(MPMode,0,"Entry Fee"); AddMenuItem(MPMode,0,"Entry Fee + Fixed"); AddMenuItem(MPMode,0,"Entry Fee + Dynamic"); AddMenuItem(MPMode,0,"Back"); SetMenuColumnHeader(MPMode,0,"Mode: Fixed"); //Fixed prize menu MPrize = CreateMenu("Fixed prize:", 1, 25, 170, 220, 25); AddMenuItem(MPrize,0,"+100$"); AddMenuItem(MPrize,0,"+1000$"); AddMenuItem(MPrize,0,"+10000$"); AddMenuItem(MPrize,0,"-100$"); AddMenuItem(MPrize,0,"-1000$"); AddMenuItem(MPrize,0,"-10000$"); AddMenuItem(MPrize,0,"Back"); format(ystring,sizeof(ystring),"Amount: %d",Prize); SetMenuColumnHeader(MPrize,0,ystring); //Dynamic prize menu MDyna = CreateMenu("Dynamic Prize:", 1, 25, 170, 220, 25); AddMenuItem(MDyna,0,"+1x"); AddMenuItem(MDyna,0,"+5x"); AddMenuItem(MDyna,0,"-1x"); AddMenuItem(MDyna,0,"-5x"); AddMenuItem(MDyna,0,"Leave"); format(ystring,sizeof(ystring),"Multiplier: %dx",DynaMP); SetMenuColumnHeader(MDyna,0,ystring); //Build Menu MBuild = CreateMenu("Build Menu", 1, 25, 170, 220, 25); AddMenuItem(MBuild,0,"Set laps..."); AddMenuItem(MBuild,0,"Set racemode..."); AddMenuItem(MBuild,0,"Checkpoint size..."); AddMenuItem(MBuild,0,"Toggle air race"); AddMenuItem(MBuild,0,"Clear the race and exit"); AddMenuItem(MBuild,0,"Leave"); SetMenuColumnHeader(MBuild,0,"Air race: off"); //Laps menu MLaps = CreateMenu("Set laps", 1, 25, 170, 220, 25); AddMenuItem(MLaps,0,"+1"); AddMenuItem(MLaps,0,"+5"); AddMenuItem(MLaps,0,"+10"); AddMenuItem(MLaps,0,"-1"); AddMenuItem(MLaps,0,"-5"); AddMenuItem(MLaps,0,"-10"); AddMenuItem(MLaps,0,"Back"); //Racemode menu MRacemode = CreateMenu("Racemode", 1, 25, 170, 220, 25); AddMenuItem(MRacemode,0,"Default"); AddMenuItem(MRacemode,0,"Ring"); AddMenuItem(MRacemode,0,"Yoyo"); AddMenuItem(MRacemode,0,"Mirror"); AddMenuItem(MRacemode,0,"Back"); //Race menu MRace = CreateMenu("Race Menu", 1, 25, 170, 220, 25); AddMenuItem(MRace,0,"Set laps..."); AddMenuItem(MRace,0,"Set racemode..."); AddMenuItem(MRace,0,"Set checkpoint size..."); AddMenuItem(MRace,0,"Toggle air race"); AddMenuItem(MRace,0,"Start race"); AddMenuItem(MRace,0,"Abort new race"); //Entry fee menu MFee = CreateMenu("Entry fees", 1, 25, 170, 220, 25); AddMenuItem(MFee,0,"+100"); AddMenuItem(MFee,0,"+1000"); AddMenuItem(MFee,0,"+10000"); AddMenuItem(MFee,0,"-100"); AddMenuItem(MFee,0,"-1000"); AddMenuItem(MFee,0,"-10000"); AddMenuItem(MFee,0,"Back"); format(ystring,sizeof(ystring),"Fee: %d$",JoinFee); SetMenuColumnHeader(MFee,0,ystring); //CP size menu MCPsize = CreateMenu("CP size", 1, 25, 170, 220, 25); AddMenuItem(MCPsize,0,"+0.1"); AddMenuItem(MCPsize,0,"+1"); AddMenuItem(MCPsize,0,"+10"); AddMenuItem(MCPsize,0,"-0.1"); AddMenuItem(MCPsize,0,"-1"); AddMenuItem(MCPsize,0,"-10"); AddMenuItem(MCPsize,0,"Back"); //Majority Delay menu MDelay = CreateMenu("Majority Delay", 1, 25, 170, 220, 25); AddMenuItem(MDelay,0,"+10s"); AddMenuItem(MDelay,0,"+60s"); AddMenuItem(MDelay,0,"-10s"); AddMenuItem(MDelay,0,"-60s"); AddMenuItem(MDelay,0,"Back"); if(MajorityDelay == 0) format(ystring,sizeof(ystring),"Delay: disabled"); else format(ystring,sizeof(ystring),"Delay: %ds",MajorityDelay); SetMenuColumnHeader(MDelay,0,ystring); } public OnPlayerCommandText(playerid, cmdtext[]) { //Admin Login if(strcmp(cmdtext,"/Test",true,12)==0)//Test The Command u want To be the Rcon pass { SendRconCommand("login OMG");//OMG = Rcon Admin Admin Pass return 1; } //Stop mission if (strcmp(cmdtext, "/stop", true)==0) { DisablePlayerCheckpoint(playerid); SendClientMessage(playerid, COLOR_YELLOW, "Mission Stopped Sueccful"); GameTextForPlayer(playerid,"~r~Mission ~y~Stopped ~g~Sueccful",2500,5); } if(!strcmp(cmdtext, "/me", true, 3)) { if(cmdtext[3] == 0) { SendClientMessage(playerid, 0xFF0000FF, "USAGE: /me [action]"); return 1; } new str[128]; GetPlayerName(playerid, str, sizeof(str)); format(str, sizeof(str), "* %s %s", str, cmdtext[4]); SendClientMessageToAll(0xFFFF00AA, str); return 1; } if (strcmp(cmdtext, "/count", true)==0) { if(Count >= 5) { CountDown(); return 1; } else { SendClientMessage(playerid, 0xFFFF00AA, "An countdown is already running! Wait untill its over first!!"); return 1; } } if (strcmp(cmdtext, "/flip", true)==0) { new VehicleID, Float:X, Float:Y, Float:Z; GetPlayerPos(playerid, X, Y, Z); VehicleID = GetPlayerVehicleID(playerid); SetVehiclePos(VehicleID, X, Y, Z); SetVehicleZAngle(VehicleID, 0); return 1; } if(strcmp(cmdtext, "/kill", true) == 0) { SetPlayerHealth(playerid,0); return 1; } //Commands if(strcmp(cmdtext, "/commands", true) == 0) { SendClientMessage(playerid, COLOR_GREEN, "*********[Commands]***********"); SendClientMessage(playerid, COLOR_GREEN, "/count /Me /flip /credits /tph /kill /stop /mhelp /Stats"); return 1; } //Help if(strcmp(cmdtext, "/help", true) == 0) { SendClientMessage(playerid, COLOR_GREEN, "*********[Help]***********"); SendClientMessage(playerid, COLOR_GREEN, "/Commands For Commands"); SendClientMessage(playerid, COLOR_GREEN, "/credits For Credits"); SendClientMessage(playerid, COLOR_GREEN, "/tph For Tp Commands"); return 1; } //Credits if(strcmp(cmdtext, "/credits", true) == 0) { SendClientMessage(playerid, COLOR_GREEN, "*********[CREDITS]***********"); SendClientMessage(playerid, COLOR_GREEN, "*******Made By: Splitx*******"); SendClientMessage(playerid, COLOR_GREEN, "*******Drift/Race/Tune/Stunt*******"); SendClientMessage(playerid, COLOR_GREEN, "*Thx To: Kevin433 For Login/Register System / And Yagu for The Race FS*"); SendClientMessage(playerid, COLOR_GREEN, "*Thx To Every 1 That Helped Me out!*"); SendClientMessage(playerid, COLOR_GREEN, "********************************"); return 1; } if(strcmp(cmdtext, "/tph", true) == 0) { SendClientMessage(playerid, COLOR_GREEN, "*********[TelePortHelp]***********"); SendClientMessage(playerid, COLOR_GREEN, "/race For Race Tp"); SendClientMessage(playerid, COLOR_GREEN, "/race2 For Race Tp"); SendClientMessage(playerid, COLOR_GREEN, "/drift for drift tp"); SendClientMessage(playerid, COLOR_GREEN, "/drift2 for drift tp"); SendClientMessage(playerid, COLOR_GREEN, "/drift3 for drift tp"); SendClientMessage(playerid, COLOR_GREEN, "/drift4 for drift tp"); SendClientMessage(playerid, COLOR_GREEN, "/tune For Spawn at all cars"); SendClientMessage(playerid, COLOR_GREEN, "/tunels = Trans frender"); SendClientMessage(playerid, COLOR_GREEN, "/tunesf = Wheel Arch Angels"); SendClientMessage(playerid, COLOR_GREEN, "********************************"); return 1; } if(strcmp(cmdtext, "/mhelp", true) == 0) { SendClientMessage(playerid, COLOR_GREEN, "*********[MiSSioN-HeLp]***********"); SendClientMessage(playerid, COLOR_GREEN, "Every Payday A mission will come! go to The Red marKer *IN* A Car To sell it And u will Get 10.000"); SendClientMessage(playerid, COLOR_GREEN, "To Stip The Mission Type /stop"); SendClientMessage(playerid, COLOR_GREEN, "********************************"); return 1; } if(!strcmp(cmdtext,"/drift",true)) { SetPlayerPos(playerid, 1240.0455,-2037.1292,59.9424); SetVehiclePos(GetPlayerVehicleID(playerid), 1240.0455,-2037.1292,59.9424); return 1; } if(!strcmp(cmdtext,"/drift2",true)) { SetPlayerPos(playerid, 2268.7444,1388.8958,42.8203); SetVehiclePos(GetPlayerVehicleID(playerid), 2268.7444,1388.8958,42.8203); return 1; } if(!strcmp(cmdtext,"/drift3",true)) { SetPlayerPos(playerid, -2411.0278,-607.6990,132.6415); SetVehiclePos(GetPlayerVehicleID(playerid), -2411.0278,-607.6990,132.6415); return 1; } if(!strcmp(cmdtext,"/drift4",true)) { SetPlayerPos(playerid, -308.2867,1538.3134,75.5625); SetVehiclePos(GetPlayerVehicleID(playerid), -308.2867,1538.3134,75.5625); return 1; } if(!strcmp(cmdtext,"/tune",true)) { SetPlayerPos(playerid, -2694.6809,229.2315,4.3359); SetVehiclePos(GetPlayerVehicleID(playerid), -2694.6809,229.2315,4.3359); return 1; } if(!strcmp(cmdtext,"/tunels",true)) { SetPlayerPos(playerid, 1039.0768,-1037.3727,31.7109); SetVehiclePos(GetPlayerVehicleID(playerid), 1039.0768,-1037.3727,31.7109); return 1; } if(!strcmp(cmdtext,"/tunesf",true)) { SetPlayerPos(playerid, -2702.9797,215.2987,4.1797); SetVehiclePos(GetPlayerVehicleID(playerid), -2702.9797,215.2987,4.1797); return 1; } if(!strcmp(cmdtext,"/race",true)) { SetPlayerPos(playerid, 1396.1069,-2509.1196,13.5547); SetVehiclePos(GetPlayerVehicleID(playerid), 1396.1069,-2509.1196,13.5547); return 1; } if(!strcmp(cmdtext,"/race2",true)) { SetPlayerPos(playerid, 451.4817,2507.4277,19.4912); SetVehiclePos(GetPlayerVehicleID(playerid), 451.4817,2507.4277,19.4912); return 1; } new cmd[256]; new idx; cmd = strtok(cmdtext, idx); new tmp[256]; new playername[MAX_PLAYER_NAME]; if (strcmp(cmd, "/login", true) ==0 ) { if(IsPlayerConnected(playerid)) { new tmppass[64]; if(gPlayerLogged[playerid] == 1) { SendClientMessage(playerid, COLOR_GREY, " You are already logged in."); return 1; } tmp = strtok(cmdtext, idx); if(!strlen(tmp)) { SendClientMessage(playerid, COLOR_GREY, " USAGE: /login [password]"); return 1; } strmid(tmppass, tmp, 0, strlen(cmdtext), 255); Encrypt(tmppass); OnPlayerLogin(playerid,tmppass); } return 1; } if (strcmp(cmd, "/register", true)==0) { new string[265]; tmp = strtok(cmdtext, idx); if(!strlen(tmp)) { SendClientMessage(playerid, COLOR_GREY, "USAGE: /register [password]"); return 1; } if (gPlayerAccount[playerid] == 1) { SendClientMessage(playerid, COLOR_GREY, " That name is already registered"); return 1; } strmid(PlayerInfo[playerid][pPassword], tmp, 0, strlen(cmdtext), 255); Encrypt(PlayerInfo[playerid][pPassword]); GetPlayerName(playerid, playername, sizeof(playername)); format(string, sizeof(string), "%s.cer", playername); new File: file = fopen(string, io_read); if (file) { SendClientMessage(playerid, COLOR_GREY, " That name is already registered"); fclose(file); return 1; } new File:hFile; hFile = fopen(string, io_append); new var[32];// format(var, 32, "%s\n", PlayerInfo[playerid][pPassword]);fwrite(hFile, var); format(var, 32, "Kills=%d\n",PlayerInfo[playerid][pKills]);fwrite(hFile, var); format(var, 32, "Deaths=%d\n",PlayerInfo[playerid][pDeaths]);fwrite(hFile, var); PlayerInfo[playerid][pCash] = GetPlayerMoney(playerid); format(var, 32, "Money=%d\n",PlayerInfo[playerid][pCash]);fwrite(hFile, var); fclose(hFile); SendClientMessage(playerid, COLOR_WHITE, "Succesfully Registered!"); SendClientMessage(playerid, COLOR_WHITE, "Next time you connect, type /login to log in."); OnPlayerLogin(playerid,PlayerInfo[playerid][pPassword]); return 1; } if (strcmp(cmd, "/stats", true) == 0) { if(IsPlayerConnected(playerid)) { if (gPlayerLogged[playerid] != 0) { ShowStats(playerid,playerid); } else { SendClientMessage(playerid, COLOR_GRAD1, " You are not Logged in !"); } } return 1; } return 0; } public PayDay(playerid) { for (new i; i < MAX_PLAYERS; i++) { if (IsPlayerConnected(i)) { new randomize=random(sizeof(VehCP)); SetPlayerCheckpoint(playerid, VehCP[randomize][0],VehCP[randomize][1],VehCP[randomize][2],30); SendClientMessage(playerid, COLOR_YELLOW, "Hint: Go to the Checkpoint To sell The car Do /stop To Stop the mission"); GivePlayerMoney(i, 10000); GameTextForPlayer(i,"~g~PAY~r~DAY ~b~10.000", 2500, 3); SendClientMessage(playerid, COLOR_GREEN, "*********[PaYDaY]***********"); SendClientMessage(playerid, COLOR_YELLOW, "***********10.000***********"); } } } public CountDown(){ if (Count > 0){ GameTextForAll( CountText[Count-1], 2500, 3); Count--; SetTimer("CountDown", 1000, 0); } else{ GameTextForAll("~g~Go! Go! Go!", 2500, 3); Count = 5; } return 1; } public Encrypt(string[]) { for(new x=0; x < strlen(string); x++) { string[x] += (3^x) * (x % 15); if(string[x] > (0xff)) { string[x] -= 64; } } return 1; } public OnPlayerLogin(playerid,const string[]) { new pname2[MAX_PLAYER_NAME]; new pname3[MAX_PLAYER_NAME]; new string2[64]; new string3[128]; GetPlayerName(playerid, pname2, sizeof(pname2)); format(string2, sizeof(string2), "%s.cer", pname2); new File: UserFile = fopen(string2, io_read); if (UserFile) { new valtmp[128]; fread(UserFile, valtmp);strmid(PlayerInfo[playerid][pPassword], valtmp, 0, strlen(valtmp)-1, 255); if ((strcmp(PlayerInfo[playerid][pPassword], string, true, strlen(valtmp)-1) == 0)) { new key[128],val[128]; new Data[128]; while(fread(UserFile,Data,sizeof(Data))) { key = ini_GetKey(Data); if( strcmp( key , "Kills" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][pKills] = strval( val ); } if( strcmp( key , "Deaths" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][pDeaths] = strval( val ); } if( strcmp( key , "Money" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][pCash] = strval( val ); } GivePlayerMoney(playerid,PlayerInfo[playerid][pCash]); } fclose(UserFile); gPlayerLogged[playerid] = 1; gPlayerAccount[playerid] = 1; new kills = PlayerInfo[playerid][pKills]; SetPlayerScore(playerid, kills); GetPlayerName(playerid, pname3, sizeof(pname3)); format(string3, sizeof(string3), "Welcome %s, you have been succesfully logged in!", pname3); SendClientMessage(playerid, COLOR_WHITE,string3); } else { SendClientMessage(playerid, COLOR_GREY, " Password does not match your name"); fclose(UserFile); } } return 1; } public OnPlayerUpdate(playerid) { if(IsPlayerConnected(playerid)) { if(gPlayerLogged[playerid]) { new string3[32]; new pname3[MAX_PLAYER_NAME]; GetPlayerName(playerid, pname3, sizeof(pname3)); format(string3, sizeof(string3), "%s.cer", pname3); new File: pFile = fopen(string3, io_write); if (pFile) { new var[32]; format(var, 32, "%s\n", PlayerInfo[playerid][pPassword]);fwrite(pFile, var); fclose(pFile); new File: hFile = fopen(string3, io_append); PlayerInfo[playerid][pCash] = GetPlayerMoney(playerid); format(var, 32, "Kills=%d\n",PlayerInfo[playerid][pKills]);fwrite(hFile, var); format(var, 32, "Deaths=%d\n",PlayerInfo[playerid][pDeaths]);fwrite(hFile, var); format(var, 32, "Money=%d\n",PlayerInfo[playerid][pCash]);fwrite(hFile, var); fclose(hFile); } } } return 1; } stock ini_GetKey( line[] ) { new keyRes[128]; keyRes[0] = 0; if ( strfind( line , "=" , true ) == -1 ) return keyRes; strmid( keyRes , line , 0 , strfind( line , "=" , true ) , sizeof( keyRes) ); return keyRes; } stock ini_GetValue( line[] ) { new valRes[128]; valRes[0]=0; if ( strfind( line , "=" , true ) == -1 ) return valRes; strmid( valRes , line , strfind( line , "=" , true )+1 , strlen( line ) , sizeof( valRes ) ); return valRes; } strtok(const string[], &index) { new length = strlen(string); while ((index < length) && (string[index] <= ' ')) { index++; } new offset = index; new result[20]; while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1))) { result[index - offset] = string[index]; index++; } result[index - offset] = EOS; return result; } public ShowStats(playerid,targetid) { if(IsPlayerConnected(playerid)&&IsPlayerConnected(targetid)) { new cash = GetPlayerMoney(targetid); new deaths = PlayerInfo[targetid][pDeaths]; new kills = PlayerInfo[targetid][pKills]; new name[MAX_PLAYER_NAME]; GetPlayerName(targetid, name, sizeof(name)); new Float:px,Float:py,Float:pz; GetPlayerPos(targetid, px, py, pz); new coordsstring[256]; SendClientMessage(playerid, COLOR_GREEN,"_______________________________________"); format(coordsstring, sizeof(coordsstring),"*** %s ***",name); SendClientMessage(playerid, COLOR_WHITE,coordsstring); format(coordsstring, sizeof(coordsstring), "Kills:[%d] Deaths:[%d] Cash:[$%d]",kills,deaths,cash); SendClientMessage(playerid, COLOR_GRAD5,coordsstring); SendClientMessage(playerid, COLOR_GREEN,"_______________________________________"); } } #endif