22.04.2014, 21:26
Код:
public UnlockRacers() { for(new i;i<GetMaxPlayers();i++) { if(RaceParticipant[i]>0) { TogglePlayerControllable(i,1); if(PlayerVehicles[i] != 0) { PutPlayerInVehicle(i,PlayerVehicles[i],0); PlayerVehicles[i]=0; } } } } public LockRacers() { for(new i;i<GetMaxPlayers();i++) { if(RaceParticipant[i] != 0) { TogglePlayerControllable(i,0); if(IsPlayerInAnyVehicle(i)) PlayerVehicles[i]=GetPlayerVehicleID(i); else PlayerVehicles[i]=0; } } } public Racecountdown() { if(RaceStart == 1) // Locking players, setting the reward and { RaceStart=0; 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;i<GetMaxPlayers();i++) { if(RaceParticipant[i]>1) { 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;i<GetMaxPlayers();i++) { if(RaceParticipant[i]>1) { 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 rname[MAX_PLAYER_NAME], LapTime, RaceTime; LapTime=GetLapTick(playerid); RaceTime=GetRaceTick(playerid); GetPlayerName(playerid, rname, MAX_PLAYER_NAME); RaceParticipant[playerid]=0; RaceSound(playerid,1139); format(ystring,sizeof(ystring),"%s has finished the race, position: %d",rname,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<LCurrentCheckpoint;i++) { RaceCheckpoints[i][0]=0.0; RaceCheckpoints[i][1]=0.0; RaceCheckpoints[i][2]=0.0; } LCurrentCheckpoint=0; for(new i=0;i<GetMaxPlayers();i++) { LastLapTick[i]=0; DisablePlayerRaceCheckpoint(i); if(RaceParticipant[i]==3) //Player was still /ready-locked, unlocking. { TogglePlayerControllable(i,1); if(PlayerVehicles[i] != 0) { PutPlayerInVehicle(i,PlayerVehicles[i],0); PlayerVehicles[i]=0; } } RaceParticipant[i]=0; } RaceActive=0; RaceStart=0; Participants=0; Pot = 0; PrizeMP = 3; SendClientMessageToAll(COLOR_YELLOW, "The current race has been finished."); } public BActiveCP(playerid,sele) { if(BCurrentCheckpoints[b(playerid)]-1 == sele) SetBRaceCheckpoint(playerid,sele,-1); else SetBRaceCheckpoint(playerid,sele,sele+1); } public RaceSound(playerid,sound) { new Float:x,Float:y,Float:z; GetPlayerPos(playerid,x,y,z); PlayerPlaySound(playerid,sound,x,y,z); } public ReadyRefresh(playerid) { if(RaceActive==1) //No countdown if no race is active (could occur with /leave) { new Waiting=0, Ready=0; for(new i=0;i<GetMaxPlayers();i++) { if(RaceParticipant[i] == 1 || RaceParticipant[i] == 2) Waiting++; else if(RaceParticipant[i] == 3) Ready++; } if(Waiting==0) { SendClientMessageToAll(COLOR_GREEN,"Everyone is ready, the race begins!"); cd=5; Countdown = SetTimer("Racecountdown",1000,1); } else if(Ready >= 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<GetMaxPlayers();i++) { if(RaceParticipant[i] != 3 && RaceParticipant[i] != 0) { GameTextForPlayer(i,"~r~You didn't make it in time!",6000,3); DisablePlayerRaceCheckpoint(i); RaceParticipant[i]=0; Participants--; } else if (RaceParticipant[i]!=0) SendClientMessage(i,COLOR_GREEN,"Pre-race countdown done, the race beings!"); } KillTimer(MajStartTimer); cd=5; Countdown = SetTimer("Racecountdown",1000,1); } else { new hurry_string[64]; format(ystring,sizeof(ystring),"~y~Race starting in ~w~%d~y~ seconds!",mscd); format(hurry_string,sizeof(hurry_string),"%s~n~~r~HURRY UP AND /READY",ystring); for(new i;i<GetMaxPlayers();i++) { if(RaceParticipant[i] < 3 && mscd < 31) GameTextForPlayer(i,hurry_string,6000,3); else if(RaceParticipant[i] > 0) GameTextForPlayer(i,ystring,6000,3); } } } } public CheckBestLap(playerid,laptime) { if(TopLapTimes[4]<laptime && TopLapTimes[4] != 0 || Racemode == 0) { return 0; // If the laptime is more than the previous 5th on the top list, skip to end } // Or the race is gamemode 0 where laps don't really apply for(new i;i<5;i++) { if(TopLapTimes[i] == 0) { new playername[MAX_PLAYER_NAME]; GetPlayerName(playerid,playername,MAX_PLAYER_NAME); TopLappers[i]=playername; TopLapTimes[i]=laptime; ScoreChange=1; return i+1; } else if(TopLapTimes[i] > 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 && TopRacerTimes[4] != 0) return 0; for(new i;i<5;i++) { if(TopRacerTimes[i] == 0) { new playername[MAX_PLAYER_NAME]; GetPlayerName(playerid,playername,MAX_PLAYER_NAME); TopRacers[i]=playername; TopRacerTimes[i]=racetime; ScoreChange=1; return i+1; } else if(TopRacerTimes[i] > 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),"LOPTDM/Race/%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 (PlayerInfo[playerid][Level]==0) { 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] < GetMaxPlayers()+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<BCurrentCheckpoints[b(playerid)];i++) { BRaceCheckpoints[b(playerid)][i][0]=0.0; BRaceCheckpoints[b(playerid)][i][1]=0.0; BRaceCheckpoints[b(playerid)][i][2]=0.0; } BCurrentCheckpoints[b(playerid)]=0; DisablePlayerRaceCheckpoint(playerid); SendClientMessage(playerid, COLOR_GREEN, "Your race has been cleared! Use /buildrace to start a new one."); BuilderSlots[b(playerid)] = GetMaxPlayers()+1; RaceBuilders[playerid]=0; } public startrace() { format(ystring,128,"Race '%s' is about to start, type /join to join!",CRaceName); SendClientMessageToAll(COLOR_GREEN,ystring); if(Racemode == 0) format(ystring,sizeof(ystring),"default"); else if(Racemode == 1) format(ystring,sizeof(ystring),"ring"); else if(Racemode == 2) format(ystring,sizeof(ystring),"yoyo"); else if(Racemode == 3) format(ystring,sizeof(ystring),"mirror"); format(ystring,sizeof(ystring),"Racemode: %s Laps: %d",ystring,Racelaps); if(PrizeMode >= 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), "LOPTDM/Race/%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("LOPTDM/Race/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[]="LOPTDM/Race/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(); // print("Race Rotated!"); return 1; } #if defined MENUSYSTEM 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); } #endif