#include <a_samp>
#include <Dini>
#include <dutils>
#define COLOR_YELLOW 0xFFFF00AA
#pragma unused TimerDST // make it shut up saying that TimerDST is unused.
#define TooFast 90
#define TooSlow 115
new File:DSchool;
/*Format: X,Y,Z,CheckpointSize*/
new Float:CPDSchoolData[24][4] =
{
{-2047.2,-83.0,34.8,3.0}, // DT1 and 24
{-2026.6925,-70.1228,34.8783,3.0}, // DT2
{-2004.7513,189.6104,27.2453,3.0}, // DT3
{-2005.5742,445.2907,34.7222,3.0}, // DT4
{-2004.9156,657.1252,41.4480,3.0}, // DT5
{-2003.5272,958.6751,45.0033,3.0}, // DT6
{-2002.3400,1074.9663,55.2773,3.0}, // DT7
{-2160.8247,1070.2000,55.2843,3.0},// DT8
{-2166.7864,1047.6621,55.3587,3.0},// DT9
{-2106.8022,1051.5979,55.2844,3.0}, // DT10
{-2015.2802,1051.7932,55.2764,3.0}, // DT11
{-2006.7701,1022.1216,54.4400,3.0}, // DT12
{-2009.5132,932.4048,45.0042,3.0},// DT13
{-2008.8276,749.4720,44.9973,3.0}, // DT14
{-2008.6039,657.2002,41.4607,3.0}, // DT15
{-2007.3783,557.6398,34.7220,3.0}, // DT16
{-2009.1946,291.6661,33.8823,3.0}, // DT17
{-2009.2443,148.1573,27.2452,3.0}, // DT18
{-2009.5765,78.9214,27.2453,3.0}, // DT19
{-2009.7845,34.7367,32.5174,3.0}, // DT20
{-2009.8560,-55.1156,34.8721,3.0}, // DT21
{-2033.1410,-68.0971,34.8788,3.0}, // DT22
{-2042.7212,-69.9372,35.0068,3.0}, // DT23
{-2047.2,-83.0,34.8,3.0} // DT1 and 24
};
// You can make up some checkpoints of your own!
// I've coded everything else here!
//
// This starts and ends at the SF Driving School.
new TimerCD,TimerDSTime;
new TimerDST;
new PID;
new DriverTakingTest;
new DSCP[MAX_PLAYERS];
public OnFilterScriptInit()
{
print("\n----------------------------------");
print(" Driving School system made by Allan!!");
print(" Coded into a Filterscript By DragSta!!");
print("----------------------------------\n");
DriverTakingTest=-1;
if(!fopen("DSchool",io_read))
{
print("\r\n\r\nError: No driving school data found. Creating new data file.");
DSchool=fopen("DSchool",io_readwrite);
}
else
{
print("\r\n\r\nDriving School data found. Now loading data...");
DSchool=fopen("DSchool",io_readwrite);
}
fclose(DSchool);
return 1;
}
public OnPlayerConnect(playerid)
{
SendClientMessage(playerid, COLOR_YELLOW, "This server uses Allans Driving School Filterscript!");
new PName[MAX_PLAYER_NAME];
GetPlayerName(playerid,PName,sizeof(PName));
DSchool=fopen("DSchool",io_readwrite);
if(strcmp(dini_Get("DSchool",PName),"Y",false)==0)
{
if(strlen(dini_Get("DSchool",PName))==1) // seems streams with no data also run through this part.
{
fclose(DSchool);
}
else // If there is no data present,
{
Dschool_No(playerid); // Make some!
}
}
else if(strcmp(dini_Get("DSchool",PName),"N",false)==0)
{
fclose(DSchool);
}
else if(strcmp(dini_Get("DSchool",PName),"D",false)==0)
{
fclose(DSchool);
}
else
{
Dschool_No(playerid);
}
return 1;
}
public OnGameModeExit()
{
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
new string[256];
new cmd[256];
new tmp[256];
new idx;
//=======================================
// Debug commands for the Licence tests.
//=======================================
/* if (strcmp(cmdtext, "/dschool-y", true)==0)
{
Dschool_Yes(playerid);
SendClientMessage(playerid, 0xFF000000, "Your new licence status is: Valid Licence.");
return 1;
}
if (strcmp(cmdtext, "/dschool-n", true)==0)
{
Dschool_No(playerid);
SendClientMessage(playerid, 0xFF000000, "Your new licence status is: No Licence.");
return 1;
}
if (strcmp(cmdtext, "/dschool-d", true)==0)
{
Dschool_Dis(playerid);
SendClientMessage(playerid, 0xFF000000, "Your new licence status is: Disqualified.");
return 1;
}*/
//=======================================
// Licence Checker.
//=======================================
if(strcmp(cmd,"/licence",true)==0)
{
new tracedID;
new tracedIDName[MAX_PLAYER_NAME];
tmp = strtok(cmdtext, idx);
if(strlen(tmp)==0)
{
SendClientMessage(playerid, 0xFF000000, "USAGE: /licence (playerid)");
return 1;
}
tracedID = strval(tmp);
// if(Checks for whether or not the player can use this command)
// {
if(tracedID!=INVALID_PLAYER_ID)
{
if(IsPlayerConnected(tracedID))
{
GetPlayerName(tracedID, tracedIDName, sizeof(tracedIDName));
DSchool=fopen("DSchool",io_readwrite);
if(strcmp(dini_Get("DSchool",tracedIDName),"Y",true)==0)
{
format(string, sizeof(string), "%s (ID:%d) has a valid drivers licence.",tracedIDName,tracedID);
printf("%s (ID:%d) has been licence checked. Status: Clean licence.",tracedIDName,tracedID);
SendClientMessage(playerid,0xFF000000,string);
fclose(DSchool);
return 1;
}
else if(strcmp(dini_Get("DSchool",tracedIDName),"N",true)==0)
{
format(string, sizeof(string), "%s (ID:%d) doesn't carry a drivers licence.",tracedIDName,tracedID);
SendClientMessage(playerid,0xFF000000,string);
SendClientMessage(playerid,0xFF000000,"COA: Jail them, or send them to driving school.");
printf("%s (ID:%d) has been licence checked. Status: No licence.",tracedIDName,tracedID);
fclose(DSchool);
return 1;
}
else if(strcmp(dini_Get("DSchool",tracedIDName),"D",true)==0)
{
format(string, sizeof(string), "%s (ID:%d) has been disqualified from driving.",tracedIDName,tracedID);
SendClientMessage(playerid,0xFF000000,string);
SendClientMessage(playerid,0xFF000000,"COA: Jail them, at reasonable cost.");
printf("%s (ID:%d) has been licence checked. Status: Disqualified licence.",tracedIDName,tracedID);
fclose(DSchool);
return 1;
}
else
{
SendClientMessage(playerid,0xFF000000,"Error: Unable to establish licence status.");
fclose(DSchool);
return 1;
}
}
else
{
SendClientMessage(playerid,0xFF000000,"That player is not in the server.");
}
}
else
{
SendClientMessage(playerid,0xFF000000,"You have specified an invalid Player ID.");
}
// }
// else
// {
// SendClientMessage(playerid,0xFFFFFF00,"SERVER: Your Error Message Here");
// }
return 1;
}
//=======================================
// Suspend a Licence.
//=======================================
if(strcmp(cmd,"/l-suspend",true)==0)
{
new tracedID;
new tracedIDName[MAX_PLAYER_NAME];
new PName[MAX_PLAYER_NAME];
tmp = strtok(cmdtext, idx);
if(strlen(tmp)==0)
{
SendClientMessage(playerid, 0xFF000000, "USAGE: /l-suspend (playerid)");
return 1;
}
tracedID = strval(tmp);
// if(Checks for whether or not the player can use this command)
// {
if(tracedID!=INVALID_PLAYER_ID)
{
if(IsPlayerConnected(tracedID))
{
GetPlayerName(tracedID, tracedIDName, sizeof(tracedIDName));
GetPlayerName(playerid, PName, sizeof(PName));
DSchool=fopen("DSchool",io_readwrite);
if(strcmp(dini_Get("DSchool",tracedIDName),"Y",true)==0)
{
format(string, sizeof(string), "%s (ID:%d) has had their licence suspended.",tracedIDName,tracedID);
printf("%s (ID:%d) has been licence suspended.",tracedIDName,tracedID);
SendClientMessage(playerid,0xFF000000,string);
format(string, sizeof(string), "%s (ID:%d) has had their licence suspended by %s (ID:%d).",tracedIDName,tracedID,PName,playerid);
SendClientMessageToAll(0xFF800000,string);
Dschool_Dis(tracedID);
fclose(DSchool);
return 1;
}
else if(strcmp(dini_Get("DSchool",tracedIDName),"N",true)==0)
{
format(string, sizeof(string), "%s (ID:%d) have a licence to suspend!",tracedIDName,tracedID);
SendClientMessage(playerid,0xFF000000,string);
printf("%s (ID:%d) is being licence suspended, but doesn't have a licence.",tracedIDName,tracedID);
fclose(DSchool);
return 1;
}
else if(strcmp(dini_Get("DSchool",tracedIDName),"D",true)==0)
{
format(string, sizeof(string), "%s (ID:%d) is already disqualified from driving.",tracedIDName,tracedID);
SendClientMessage(playerid,0xFF000000,string);
printf("%s (ID:%d) is being licence suspended, but the licence is already suspended.",tracedIDName,tracedID);
fclose(DSchool);
return 1;
}
else
{
SendClientMessage(playerid,0xFF000000,"Error: Unable to establish licence status.");
fclose(DSchool);
return 1;
}
}
else
{
SendClientMessage(playerid,0xFF000000,"That player is not in the server.");
}
}
else
{
SendClientMessage(playerid,0xFF000000,"You have specified an invalid Player ID.");
}
// }
// else
// {
// SendClientMessage(playerid,0xFFFFFF00,"SERVER: Your Error Message Here");
// }
return 1;
}
//=======================================
// Renew a Licence.
//=======================================
if(strcmp(cmd,"/l-renew",true)==0)
{
new tracedID;
new tracedIDName[MAX_PLAYER_NAME];
new PName[MAX_PLAYER_NAME];
tmp = strtok(cmdtext, idx);
if(strlen(tmp)==0)
{
SendClientMessage(playerid, 0xFF000000, "USAGE: /l-renew (playerid)");
return 1;
}
tracedID = strval(tmp);
// if(Checks for whether or not the player can use this command)
// {
if(tracedID!=INVALID_PLAYER_ID)
{
if(IsPlayerConnected(tracedID))
{
GetPlayerName(tracedID, tracedIDName, sizeof(tracedIDName));
GetPlayerName(playerid, PName, sizeof(PName));
DSchool=fopen("DSchool",io_readwrite);
if(strcmp(dini_Get("DSchool",tracedIDName),"D",true)==0)
{
format(string, sizeof(string), "%s (ID:%d) has had their licence renewed.",tracedIDName,tracedID);
SendClientMessage(playerid,0xFF000000,string);
printf("%s (ID:%d) is being licence suspended, but the licence is already suspended.",tracedIDName,tracedID);
format(string, sizeof(string), "%s (ID:%d) has had their licence suspended by %s (ID:%d).",tracedIDName,tracedID,PName,playerid);
SendClientMessageToAll(0xFF800000,string);
Dschool_Yes(tracedID);
fclose(DSchool);
return 1;
}
else
{
SendClientMessage(playerid,0xFF000000,"Error: Unable to establish licence status.");
fclose(DSchool);
return 1;
}
}
else
{
SendClientMessage(playerid,0xFF000000,"That player is not in the server.");
}
}
else
{
SendClientMessage(playerid,0xFF000000,"You have specified an invalid Player ID.");
}
// }
// else
// {
// SendClientMessage(playerid,0xFFFFFF00,"SERVER: Your Error Message Here");
// }
return 1;
}
//=======================================
// Go to Driving School.
//=======================================
if (strcmp(cmdtext, "/dschool", true)==0)
{
new tracedIDName[MAX_PLAYER_NAME];
new strn[255];
if(DriverTakingTest==-1)
{
if(GetPlayerMoney(playerid)>=500)
{
GetPlayerName(playerid,tracedIDName,sizeof(tracedIDName));
if(strcmp(dini_Get("DSchool",tracedIDName),"Y",true)==0)
{
SendClientMessage(playerid, 0xFF000000, "Error: You already have a valid licence!");
return 1;
}
DriverTakingTest=(playerid);
GivePlayerMoney(playerid,-500);
SetPlayerCheckpoint(playerid,CPDSchoolData[0][0],CPDSchoolData[0][1],CPDSchoolData[0][2],CPDSchoolData[0][3]);
DSCP[playerid]=0;
SetPlayerPos(playerid,-2077.3,-81.4,34.8);
SendClientMessage(playerid, 0xFF000000, "You are now on the Driving School program. Drive safe, yet speedy.");
return 1;
}
else
{
SendClientMessage(playerid, 0xFF000000, "Error: Insufficient funds to take the test.");
return 1;
}
}
else
{
GetPlayerName(DriverTakingTest,tracedIDName,sizeof(tracedIDName));
format(strn, sizeof(strn), "%s(ID:%d) is currently taking the Driving School Test. Try again later.",tracedIDName,DriverTakingTest);
SendClientMessage(playerid, 0xFF000000, strn);
return 1;
}
}
else
{
SendClientMessage(playerid,0xFFFF00AA,"Cannot teleport: You're in Jail!");
return 1;
}
return 0;
}
public Dschool_Yes(playerid)
{
new PName[MAX_PLAYER_NAME];
GetPlayerName(playerid,PName,sizeof(PName));
DSchool=fopen("DSchool",io_readwrite);
dini_Set("DSchool",PName,"Y");
fclose(DSchool);
return 1;
}
public Dschool_No(playerid)
{
new PName[MAX_PLAYER_NAME];
GetPlayerName(playerid,PName,sizeof(PName));
DSchool=fopen("DSchool",io_readwrite);
dini_Set("DSchool",PName,"N");
fclose(DSchool);
return 1;
}
public Dschool_Dis(playerid)
{
new PName[MAX_PLAYER_NAME];
GetPlayerName(playerid,PName,sizeof(PName));
DSchool=fopen("DSchool",io_readwrite);
dini_Set("DSchool",PName,"D");
fclose(DSchool);
return 1;
}
public QuitSchool(playerid) // Use for things which force you to quit the driving school test
{
if(DriverTakingTest==playerid)
{
KillTimer(TimerDST);
TimerDSTime=0;
TimerCD=0;
DriverTakingTest=-1;
if(IsPlayerConnected(playerid))
{
DisablePlayerCheckpoint(playerid);
GameTextForPlayer(playerid,"~r~you failed the driving test.",3000,3);
}
return 1;
}
return 0;
}
public Countdown()
{
new Num=4;
new string[2];
TimerCD++;
if(Num-TimerCD<=0)
{
TimerCD=0;
GameTextForPlayer(PID,"~r~GO!!!",3000,3);
SetPlayerCheckpoint(PID,CPDSchoolData[1][0],CPDSchoolData[1][1],CPDSchoolData[1][2],CPDSchoolData[1][3]);
DSCP[PID]=1;
TogglePlayerControllable(PID,1);
TimerDST=SetTimer("CountUpTimeTaken",1000,1);
}
else
{
SetTimer("Countdown",1000,0);
valstr(string,Num-TimerCD);
GameTextForPlayer(PID,string,800,3);
}
return 1;
}
public CountUpTimeTaken()
{
TimerDSTime++;
}
public OnPlayerEnterCheckpoint(playerid)
{
switch(DSCP[playerid])
{
case 0:
{
if(IsPlayerInAnyVehicle(playerid))
{
PID=playerid;
SetTimer("Countdown",1000,0);
TogglePlayerControllable(playerid,0);
}
else
{
GameTextForPlayer(playerid,"Get in a car!",2000,3);
}
}
case 1:
{
if(IsPlayerInAnyVehicle(playerid))
{
SetPlayerCheckpoint(playerid,CPDSchoolData[2][0],CPDSchoolData[2][1],CPDSchoolData[2][2],CPDSchoolData[2][3]);
DSCP[playerid]=2;
}
else
{
GameTextForPlayer(playerid,"Get in a car!",2000,3);
}
}
case 2..22:
{
if(IsPlayerInAnyVehicle(playerid))
{
SetPlayerCheckpoint(playerid,CPDSchoolData[DSCP[playerid]+1][0],CPDSchoolData[DSCP[playerid]+1][1],CPDSchoolData[DSCP[playerid]+1][2],CPDSchoolData[DSCP[playerid]+1][3]);
DSCP[playerid]++;
}
else
{
GameTextForPlayer(playerid,"Get in a car!",2000,3);
}
}
case 23:
{
DisablePlayerCheckpoint(playerid);
KillTimer(TimerDST);
DSCP[playerid]=0;
new String1[255];
if(TimerDSTime<=TooFast)
{
format(String1,255,"~b~Your time was: %d Seconds.\r\n ~r~You were too wreckless, and failed the course.",TimerDSTime);
}
else if(TimerDSTime>=TooSlow)
{
format(String1,255,"~b~Your time was: %d Seconds.\r\n ~r~You were hazardously slow, and failed the course.",TimerDSTime);
}
else
{
format(String1,255,"~b~Your time was: %d Seconds.\r\n ~g~Congratulations! You passed the course.",TimerDSTime);
Dschool_Yes(playerid); // Gain your licence! :D
}
GameTextForPlayer(playerid,String1,4000,3);
printf("ID:%d finished the Driving School course in %d seconds.",playerid,TimerDSTime);
TimerDSTime=0;
DriverTakingTest=-1;
}
}
}
public OnPlayerStateChange(playerid, newstate, oldstate)
{
new PName[MAX_PLAYER_NAME];
GetPlayerName(playerid,PName,sizeof(PName));
if((newstate==PLAYER_STATE_DRIVER)&&(strcmp(dini_Get("DSchool",PName),"N",false)==0))
{
SendClientMessage(playerid,0xFF000000,"You are driving without a licence. You may be arrested.");
printf("%s(ID:%d) is driving without a licence.",PName,playerid);
}
else if((newstate==PLAYER_STATE_DRIVER)&&(strcmp(dini_Get("DSchool",PName),"D",false)==0))
{
SendClientMessage(playerid,0xFF000000,"You are driving illegally. You are likely to be arrested.");
printf("%s(ID:%d) is driving with a suspended licence.",PName,playerid);
}
}