//Useful Functions:

#define MAX_STRING 255
#define MAX_GTASAVEHICLES   212
#define VTYPE_CAR 1
#define VTYPE_HEAVY 2
#define VTYPE_BIKE 3
#define VTYPE_AIR 4
#define VTYPE_SEA 5
#define MAX_PICKUPS 999

new vehicleNames[MAX_GTASAVEHICLES][] = {
   "Landstalker",
   "Bravura",
   "Buffalo",
   "Linerunner",
   "Pereniel",
   "Sentinel",
   "Dumper",
   "Firetruck",
   "Trashmaster",
   "Stretch",
   "Manana",
   "Infernus",
   "Voodoo",
   "Pony",
   "Mule",
   "Cheetah",
   "Ambulance",
   "Leviathan",
   "Moonbeam",
   "Esperanto",
   "Taxi",
   "Washington",
   "Bobcat",
   "Mr Whoopee",
   "BF Injection",
   "Hunter",
   "Premier",
   "Enforcer",
   "Securicar",
   "Banshee",
   "Predator",
   "Bus",
   "Rhino",
   "Barracks",
   "Hotknife",
   "Trailer", //artict1
   "Previon",
   "Coach",
   "Cabbie",
   "Stallion",
   "Rumpo",
   "RC Bandit",
   "Romero",
   "Packer",
   "Monster",
   "Admiral",
   "Squalo",
   "Seasparrow",
   "Pizzaboy",
   "Tram",
   "Trailer", //artict2
   "Turismo",
   "Speeder",
   "Reefer",
   "Tropic",
   "Flatbed",
   "Yankee",
   "Caddy",
   "Solair",
   "Berkley's RC Van",
   "Skimmer",
   "PCJ-600",
   "Faggio",
   "Freeway",
   "RC Baron",
   "RC Raider",
   "Glendale",
   "Oceanic",
   "Sanchez",
   "Sparrow",
   "Patriot",
   "Quad",
   "Coastguard",
   "Dinghy",
   "Hermes",
   "Sabre",
   "Rustler",
   "ZR3 50",
   "Walton",
   "Regina",
   "Comet",
   "BMX",
   "Burrito",
   "Camper",
   "Marquis",
   "Baggage",
   "Dozer",
   "Maverick",
   "News Chopper",
   "Rancher",
   "FBI Rancher",
   "Virgo",
   "Greenwood",
   "Jetmax",
   "Hotring",
   "Sandking",
   "Blista Compact",
   "Police Maverick",
   "Boxville",
   "Benson",
   "Mesa",
   "RC Goblin",
   "Hotring Racer", //hotrina
   "Hotring Racer", //hotrinb
   "Bloodring Banger",
   "Rancher",
   "Super GT",
   "Elegant",
   "Journey",
   "Bike",
   "Mountain Bike",
   "Beagle",
   "Cropdust",
   "Stunt",
   "Tanker", //petro
   "RoadTrain",
   "Nebula",
   "Majestic",
   "Buccaneer",
   "Shamal",
   "Hydra",
   "FCR-900",
   "NRG-500",
   "HPV1000",
   "Cement Truck",
   "Tow Truck",
   "Fortune",
   "Cadrona",
   "FBI Truck",
   "Willard",
   "Forklift",
   "Tractor",
   "Combine",
   "Feltzer",
   "Remington",
   "Slamvan",
   "Blade",
   "Freight",
   "Streak",
   "Vortex",
   "Vincent",
   "Bullet",
   "Clover",
   "Sadler",
   "Firetruck", //firela
   "Hustler",
   "Intruder",
   "Primo",
   "Cargobob",
   "Tampa",
   "Sunrise",
   "Merit",
   "Utility",
   "Nevada",
   "Yosemite",
   "Windsor",
   "Monster", //monstera
   "Monster", //monsterb
   "Uranus",
   "Jester",
   "Sultan",
   "Stratum",
   "Elegy",
   "Raindance",
   "RC Tiger",
   "Flash",
   "Tahoma",
   "Savanna",
   "Bandito",
   "Freight", //freiflat
   "Trailer", //streakc
   "Kart",
   "Mower",
   "Duneride",
   "Sweeper",
   "Broadway",
   "Tornado",
   "AT-400",
   "DFT-30",
   "Huntley",
   "Stafford",
   "BF-400",
   "Newsvan",
   "Tug",
   "Trailer", //petrotr
   "Emperor",
   "Wayfarer",
   "Euros",
   "Hotdog",
   "Club",
   "Trailer", //freibox
   "Trailer", //artict3
   "Andromada",
   "Dodo",
   "RC Cam",
   "Launch",
   "Police Car (LSPD)",
   "Police Car (SFPD)",
   "Police Car (LVPD)",
   "Police Ranger",
   "Picador",
   "S.W.A.T. Van",
   "Alpha",
   "Phoenix",
   "Glendale",
   "Sadler",
   "Luggage Trailer", //bagboxa
   "Luggage Trailer", //bagboxb
   "Stair Trailer", //tugstair
   "Boxville",
   "Farm Plow", //farmtr1
   "Utility Trailer" //utiltr1
};
#if defined OnPlayerBuyWeapon
new Float:lvammu[3][3] = {
(295.7932,-80.8074,1001.5156),
(295.5800,-80.4444,1001.5156),
(290.1626,-109.7770,1001.5156)
};
new Float:ammu[7][3] = {
(296.7232,-38.5011,1001.5156),
(313.0667,-165.7863,999.6010),
(296.5075,-38.5065,1001.5156),
(289.7543,-109.7784,1001.5156),
(296.1650,-80.8099,1001.5156),
(290.6806,-109.7799,1001.5156),
(290.4812,-109.7673,1001.5156)
};
#endif
#if defined OnPlayerGamble
new Float:gamble1[12][3] = {
(2230.7319,1589.3613,1007.1223),
(2230.9382,1595.0582,1007.1223),
(2230.7825,1615.1445,1007.1223),
(2230.1284,1619.4703,1007.1223),
(2241.9258,1619.5101,1007.1223),
(2241.4067,1614.7375,1007.1223),
(2242.6226,1595.3263,1007.1223),
(2242.6494,1589.4646,1007.1223),
(1958.8229,1025.9097,993.4035),
(1963.6870,1025.8323,993.4035),
(1959.4716,1010.6929,993.4035),
(1963.4226,1010.7554,993.4035)
};
new Float:gamble2[3][3] = {
(2230.3799,1604.6863,1006.1860),
(2241.3516,1604.2601,1006.1797),
(1126.4874,-1.4898,1000.6797)
};
new Float:gamble3[20][3] = {
(1969.5471,1029.5972,992.4745),
(1969.5416,1021.4896,992.4688),
(1969.5569,1014.0104,992.4688),
(1969.5547,1006.4145,992.4745),
(1969.7015,1029.5469,992.4745),
(1942.8903,1006.8364,992.4688),
(1941.8312,1013.9740,992.4688),
(1941.8381,1021.5088,992.4688),
(1942.5658,1028.6289,992.4688),
(2275.2219,1596.2104,1006.1797),
(2275.2146,1589.7419,1006.1797),
(2270.4824,1595.9219,1006.1797),
(2265.4377,1596.3553,1006.1797),
(2260.0259,1596.6718,1006.1797),
(2254.9976,1596.3917,1006.1797),
(2252.4050,1590.1534,1006.1797),
(2257.4419,1590.0051,1006.1797),
(2262.8257,1589.6021,1006.1797),
(2267.9023,1589.6578,1006.1797),
(1126.6071,2.9759,1000.6797)
};
new Float:gamble4[18][3] = {
(1965.8324,997.9891,992.4688),
(1962.9382,991.2863,992.4688),
(1965.8340,998.0048,992.4688),
(1958.1143,986.5440,992.4688),
(1965.8490,1037.6136,992.4688),
(1963.0631,1044.0096,992.4688),
(1958.1376,1049.0104,992.4688),
(2255.1760,1618.7878,1006.1797),
(2255.2905,1614.8890,1006.1797),
(2255.2170,1610.8423,1006.1797),
(2268.5320,1606.8667,1006.1797),
(2274.5471,1606.8854,1006.1797),
(2218.6533,1619.8169,1006.1794),
(2218.5603,1615.4678,1006.1797),
(2216.3044,1603.6766,1006.1819),
(2219.9624,1603.8689,1006.1797),
(2218.4788,1593.6322,1006.1871),
(2218.6128,1589.3203,1006.1841)
};
new Float:gamble5[2][3] = {
(1961.4709,1020.2551,992.4688),
(1961.5642,1015.8394,992.4688),
};
new Float:gamble6[5][3] = {
(2271.6360,1586.1650,1006.1797),
(2261.5183,1586.4304,1006.1797),
(2251.8772,1586.5632,1006.1860),
(1946.5306,986.7844,992.4688),
(1120.0988,-1.3969,1000.6908)
};
new Float:gamble7[1][3] = {
(1136.3954,-1.6494,1000.6797)
};
#endif

new Float:pi=3.14159265;
new VehicleModels[MAX_VEHICLES];
new VehicleAngles[MAX_VEHICLES];
new Skin[MAX_PLAYERS];
new VC;
new PC;
new pickupmodel[MAX_PICKUPS];
new pickuptype[MAX_PICKUPS];
new Float:pickupx[MAX_PICKUPS];
new Float:pickupy[MAX_PICKUPS];
new Float:pickupz[MAX_PICKUPS];
enum SavePlayerPosEnum
{
    Float:LastX,
    Float:LastY,
    Float:LastZ
}
new SavePlayerPos[MAX_PLAYERS][SavePlayerPosEnum];
new acc[MAX_PLAYERS];
new kmph[MAX_PLAYERS];
new preh[MAX_PLAYERS];
new moneyss[MAX_PLAYERS];
#if defined OnPlayerGamble
new bet[MAX_PLAYERS];
new betting[MAX_PLAYERS];
#endif
new pickuprespawn[MAX_PICKUPS];
new Float:vehiclex[MAX_VEHICLES];
new Float:vehicley[MAX_VEHICLES];
new Float:vehiclez[MAX_VEHICLES];
new Float:vehiclea[MAX_VEHICLES];
new dynamicv[MAX_VEHICLES];

forward Float:itan(Float:opp,Float:adj);

stock encrypt(string[]) //By Alex "Y_Less" Cole (Based on code from Jeremy Cole)
{
	static key[] = "1345767";
	static size = sizeof(key) - 1;
	new retval[64];
	new j, k, sum, tmp[] = {0, 0};
	j = strlen(string);
	sum = j;
	k = ((j >> 4) + 1) << 4;
	for (new i = 0; i < k; i++)
	{
		if (i < j)
		{
			tmp[0] = string[i];
		}
		else
		{
			tmp[0] = ' ';
		}
		sum = ((sum + strfind(key, tmp) + 1) % size);
		retval[i] = key[sum];
	}
	return retval;
}

stock left(source[], len) //By Alex "Y_Less" Cole (Edited by Sacky)
{
	new retval[MAX_STRING];
	strmid(retval, source, 0, len, MAX_STRING);
	return retval;
}

stock right(source[], len) //By Alex "Y_Less" Cole
{
	new retval[MAX_STRING], srclen;
	srclen = strlen(source);
	strmid(retval, source, srclen - len, srclen, MAX_STRING);
	return retval;
}

stock GetPlayerId(playername[]) //By Alex "Y_Less" Cole (Edited by Sacky)
{
new playername2[MAX_PLAYER_NAME];
for (new i = 0; i < MAX_PLAYERS; i++)
{
if (IsPlayerConnected(i))
{
GetPlayerName(i,playername2,sizeof(playername2));
if(strcmp(playername,playername2,true)==0){
return i;
}
}
}
return  INVALID_PLAYER_ID;
}

stock parsecommand(cmdtext[], cmd[], text[], parcount) //By Alex "Y_Less" Cole
{
	new index = 0, length;
	length = strlen(cmdtext);
	while ((index < length) && (cmdtext[index] != ' '))
	{
		index++;
	}
	if (index == length)
	{
		strcat(cmd, cmdtext, 256);
		text[0] = EOS;
		return 0;
	}
	else
	{
	    strmid(cmd, cmdtext, 0, index, 256);
	    cmd[index] = EOS;
	    strmid(text, cmdtext, index + 1, length, 256);
		text[length] = EOS;
		if (parcount)
		{
		    index = 0;
			new pars = 0;
			length = strlen(text);
			while (index < length)
			{
				if ((text[index] != ' ') && ((index == 0) || ((index > 0) && (text[index - 1] == ' '))))
				{
				    pars++;
				}
				index++;
			}
			return pars;
		}
		else
		{
			return 1;
		}
	}
	return 0;
}

stock ReturnPlayerName(playerid) //By Alex "Y_Less" Cole
{
	new pname[MAX_PLAYER_NAME];
	GetPlayerName(playerid, pname, sizeof (pname));
	return pname;
}

stock minrand(min, max) //By Alex "Y_Less" Cole
{
	return random(max - min) + min;
}

stock Float:floatrand(Float:min, Float:max) //By Alex "Y_Less" Cole
{
	new imin;
	imin = floatround(min);
	return float(random((floatround(max) - imin) * 100) + (imin * 100)) / 100.0;
}

stock IsPlayerInArea(playerid, Float:minx, Float:maxx, Float:miny, Float:maxy) //By Alex "Y_Less" Cole
{
	new Float:x, Float:y, Float:z;
	GetPlayerPos(playerid, x, y, z);
	if (x > minx && x < maxx && y > miny && y < maxy) return 1;
	return 0;
}

#if defined gTeam
stock GameTextForTeam(team, text[], time, style) //By Alex "Y_Less" Cole
{
	for (new i = 0; i < MAX_PLAYERS; i++)
	{
		if (gTeam[i] == team && IsPlayerConnected(i)) GameTextForPlayer(i, text, time, style);
	}
}

stock SendClientMessageToTeam(team, color, text[]) //By Alex "Y_Less" Cole
{
	for (new i = 0; i < MAX_PLAYERS; i++)
	{
		if (gTeam[i] == team && IsPlayerConnected(i)) SendClientMessage(i, color, text);
	}
}
#endif

stock RetStr(num) //By Alex "Y_Less" Cole
{
	new str[11];
	valstr(str, num);
	return str;
}

#if !defined SetPlayerMoney
stock SetPlayerMoney(playerid,money) //By Jan "DracoBlue" Schütze (Edited by Sacky)
{
GivePlayerMoney(playerid,money-GetPlayerMoney(playerid));
}
#endif

stock PlayerID(partofname[]) //By Jan "DracoBlue" Schütze
{
   new i;
   new playername[MAX_STRING];
   for (i=0;i<MAX_PLAYERS;i++) {
     if (IsPlayerConnected(i)) {
       GetPlayerName(i,playername,MAX_STRING);
       if (strcmp(playername,partofname,true)==0) {
         return i;
       }
     }
   }
    new correctsigns_userid=-1;
    new tmpuname[MAX_STRING];
    new hasmultiple=-1;
    for (i=0;i<MAX_PLAYERS;i++) {
        if (IsPlayerConnected(i)) {
          GetPlayerName(i,tmpuname,MAX_STRING);
	  if (strfind(tmpuname,partofname,true)==0) {
	    hasmultiple++;
	    correctsigns_userid=i;
          }
	  if (hasmultiple>0) {
            return -2;
          }
       }
    }
  return correctsigns_userid;
}

stock ValidEmail(email[]) //By Jan "DracoBlue" Schütze
{
  new len=strlen(email);
  new cstate=0;
  new i;
  for(i=0;i<len;i++) {
    if ((cstate==0 || cstate==1) && (email[i]>='A' && email[i]<='Z') || (email[i]>='a' && email[i]<='z')  || (email[i]=='.')  || (email[i]=='-')  || (email[i]=='_'))
    {
    } else {
       if ((cstate==0) &&(email[i]=='@')) {
          cstate=1;
       } else {
          return false;
       }
    }
  }
  if (cstate<1) return false;
  if (len<6) return false;
  if ((email[len-3]=='.') || (email[len-4]=='.') || (email[len-5]=='.')) return true;
  return false;
}

stock VehicleDriverID(vehicleid) //By Jan "DracoBlue" Schütze
{
  new i;
  for (i=0;i<MAX_PLAYERS;i++) {
     if ((IsPlayerConnected(i))&&(GetPlayerVehicleID(i)==vehicleid)&&(GetPlayerState(i)==2))  return i;
  }
  return -1;
}

stock IsNumeric(const string[]) //By Mike
{
	for (new i = 0, j = strlen(string); i < j; i++)
	{
	    if (string[i] > '9' || string[i] < '0') return 0;
	}
	return 1;
}

stock SendClientMessageToAdmins(colour,const str[]) //By Mike (Edited by Sacky)
{
	for (new i = 0; i < MAX_PLAYERS; i++)
	{
	    if (IsPlayerConnected(i)) {
	        if (IsPlayerAdmin(i)) {
	            SendClientMessage(i, colour, str);
	        }
	    }
	}
}

stock GetDistanceBetweenPlayers(playerid,playerid2) //By Slick (Edited by Sacky)
{
new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
new Float:tmpdis;
GetPlayerPos(playerid,x1,y1,z1);
GetPlayerPos(playerid2,x2,y2,z2);
tmpdis = floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
return floatround(tmpdis);
}

stock GetClosestPlayer(playerid) //By Slick
{
new x,Float:dis,Float:dis2,player;
new pteam[MAX_PLAYERS];
player = -1;
dis = 99999.99;
for (x=0;x<MAX_PLAYERS;x++){
if (x != playerid){
dis2 = GetDistanceBetweenPlayers(x,playerid);
if (dis2 < dis && dis2 != -1.00 && pteam[x] == pteam[playerid]){
dis = dis2;
player = x;
}
}
}
return player;
}

#if !defined strtok
stock strtok(const string[], &index) //By Slick
{
	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;
}
#endif

stock Float:lengthdir_x(Float:length,Float:angle) //By Slick
{
return floatmul(floatcos(floatdiv(floatmul(angle,pi),180.00)),length);
}

stock Float:lengthdir_y(Float:length,Float:angle) //By Slick
{
return floatmul(-floatsin(floatdiv(floatmul(angle,pi),180.00)),length);
}

stock TwoWayRand(value) //By Allan
{
value=(random(value*2+1)-value);
return value;
}

stock QuadraticRootCalc(Float:Xsq,Float:X,Float:num) //By Allan
{
new Float:Val1;
new Float:Val2;
Val1=floatsqroot(floatpower(X,2)*4*Xsq*num)/2*Xsq+X;
Val2=floatsqroot(floatpower(X,2)*4*Xsq*num)/2*Xsq-X;
return floatround(Val1*Val2);
}

stock SendFormattedGameTextToPlayer(playerid, const msg[], time, style, define) //By Allan
{
	new wrap[256];
	format(wrap, sizeof(wrap), msg, define);
	GameTextForPlayer(playerid,wrap,time,style);
}

stock SendFormattedGameTextToAll(const msg[], time, style, define) //By Allan
{
	new wrap[256];
	format(wrap, sizeof(wrap), msg, define);
	GameTextForAll(wrap,time,style);
}

stock GivePlayerWeaponAlt(playerid, weaponid, ammo) //By Allan (Edited by Y_Less)
{
	if ((weaponid > 15 && weaponid < 22) || (weaponid > 32 && weaponid < 37) || (weaponid > 38 && weaponid < 41) || (weaponid > 42 && weaponid != 46))
	{
		weaponid = 0;
		print("Non-Working weapon class specified");
		SendClientMessage(playerid, 0x0000FFAA, "Non-Working weapon class specified");
	}
	GivePlayerWeapon(playerid, weaponid, ammo);
}

stock GetDistanceToCar(playerid,carid) //By Darkrealm (Edited by Sacky)
{
	new Float:dis;
	new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
	if (!IsPlayerConnected(playerid)) {
	return -1;
	}
	GetPlayerPos(playerid,x1,y1,z1);
	GetVehiclePos(carid,x2,y2,z2);
	dis = floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
	return floatround(dis);
}

stock GetClosestCar(playerid) //By Darkrealm
{
	if (!IsPlayerConnected(playerid)) {
	    return -1;
	}
	new Float:prevdist = 100000.000;
	new prevcar;
	for (new carid = 0; carid < MAX_VEHICLES; carid++) {
                 new Float:dist = GetDistanceToCar(playerid,carid);
	    if ((dist < prevdist)) {
	         prevdist = dist;
	         prevcar = carid;
                 }
	}
	return prevcar;
}

stock ConvertSeconds(time) //By El Presy
{
	new string[40];
	if(time < 60)
	    format(string, sizeof(string), "%d seconds", time);
 	else if(time == 60)
 	    string = "1 minute";
	else if(time > 60 && time < 3600){
	    new Float: minutes;
	    new seconds;
	    minutes = time / 60;
	    seconds = time % 60;
	    format(string, sizeof(string), "%.0f minutes and %d seconds", minutes, seconds);
	}else if(time == 3600)
	    string = "1 hour";
	else if(time > 3600){
	    new Float: hours;
	    new minutes_int;
	    new Float: minutes;
	    new seconds;
	    hours = time / 3600;
	    minutes_int = time % 3600;
	    minutes = minutes_int / 60;
	    seconds = minutes_int % 60;
	    format(string, sizeof(string), "%.0f hours, %.0f minutes and %d seconds", hours, minutes, seconds);
	}
	return string;
}

stock wiper(playerid) //By Spectre
{
for (new a=1;a<=10;a++)
{
SendClientMessage(playerid,0xFFFFFFFF,"\n");
}
return 1;
}

#if !defined mktime
stock mktime(hour,minute,second,day,month,year) //By mabako
{
 new timestamp;
 timestamp = second;
 timestamp += minute * 60;
 timestamp += hour * 3600;
 new days_of_month[12];
 if(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
  days_of_month = {31,29,31,30,31,30,31,31,30,31,30,31};
 } else {
  days_of_month = {31,28,31,30,31,30,31,31,30,31,30,31};
 }
 new days_this_year = 0;
 days_this_year = day;
 if(month > 1) {
  for(new i=0; i<month-1;i++) {
   days_this_year += days_of_month[i];
  }
 }
 timestamp += days_this_year * 86400;
 for(new j=1970;j<year;j++) {
  timestamp += 31536000;
   if(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) timestamp += 86400;
 }
 return timestamp;
}
#endif

stock GetCurrentPosition(playerid) //By Sacky
{
new Float:x;
new Float:y;
new Float:z;
new Float:a;
new string[256];
if(IsPlayerConnected(playerid)){
GetPlayerPos(playerid,x,y,z);
GetPlayerFacingAngle(playerid,a);
format(string,sizeof(string),"x: %d, y: %d, z: %d, angle: %d",floatround(x),floatround(y),floatround(z),floatround(a));
return string;
}
return string;
}

stock GetVehicleClass(vehicleid) //By Sacky
{
return VehicleModels[vehicleid];
}

stock GetVehicles() //By Sacky
{
new Float:x;
new Float:y;
new Float:z;
new maxv;
for(new i=0;i<MAX_VEHICLES;i++){
GetVehiclePos(i,x,y,z);
if(z != 0 && x!= 0 && y != 0){
maxv++;
}
}
return maxv;
}

stock VehicleDriverName(vehicleid) //By Sacky
{
new playername[MAX_PLAYER_NAME];
for(new i=0;i<MAX_PLAYERS;i++){
if(IsPlayerConnected(i)){
if(IsPlayerInVehicle(i,vehicleid)){
GetPlayerName(i,playername,sizeof(playername));
return playername;
}
}
}
return playername;
}

stock timeconvert_seconds(time) //By Sacky
{
new minutes;
new seconds;
new string[256];
if(time > 60){
minutes = floatround(time/60);
seconds = floatround(time - minutes*60);
format(string,sizeof(string),"~b~%d:%d",minutes,seconds);
}
else{
seconds = floatround(time);
format(string,sizeof(string),"~b~%d",seconds);
}
return string;
}


stock IsPlayerInAnyInterior(playerid) //By Sacky
{
new Float:x;
new Float:y;
new Float:z;
if(IsPlayerConnected(playerid)){
GetPlayerPos(playerid,x,y,z);
if(z > 900 && !IsPlayerInAnyVehicle(playerid)){
return 1;
}
}
return 0;
}

stock IsPlayerPassenger(playerid) //By Sacky
{
new playerstate;
playerstate = GetPlayerState(playerid);
if(playerstate == PLAYER_STATE_PASSENGER){
return 1;
}
return 0;
}

stock IsPlayerDriver(playerid) //By Sacky
{
new playerstate;
playerstate = GetPlayerState(playerid);
if(playerstate == PLAYER_STATE_DRIVER){
return 1;
}
return 0;
}

stock IsPlayerOnFoot(playerid) //By Sacky
{
new playerstate;
playerstate = GetPlayerState(playerid);
if(playerstate == PLAYER_STATE_ONFOOT){
return 1;
}
return 0;
}


stock IsPlayerOnBike(playerid) //By Sacky
{
if(IsPlayerInAnyVehicle(playerid)){
new vehicleid = GetPlayerVehicleID(playerid);
new vehicleclass = GetVehicleClass(vehicleid);
switch(vehicleclass)
{
case 448:return 1;
case 461:return 1;
case 462:return 1;
case 463:return 1;
case 468:return 1;
case 521:return 1;
case 522:return 1;
case 523:return 1;
case 581:return 1;
case 586:return 1;
}
}
return 0;
}

stock IsPlayerOnBicycle(playerid) //By Sacky
{
if(IsPlayerInAnyVehicle(playerid)){
new vehicleid = GetPlayerVehicleID(playerid);
new vehicleclass = GetVehicleClass(vehicleid);
switch(vehicleclass)
{
case 481:return 1;
case 509:return 1;
case 510:return 1;
}
}
return 0;
}

stock IsPlayerInBoat(playerid) //By Sacky
{
if(IsPlayerInAnyVehicle(playerid)){
new vehicleid = GetPlayerVehicleID(playerid);
new vehicleclass = GetVehicleClass(vehicleid);
switch(vehicleclass)
{
case 430:return 1;
case 446:return 1;
case 452:return 1;
case 453:return 1;
case 454:return 1;
case 472:return 1;
case 473:return 1;
case 484:return 1;
case 493:return 1;
case 595:return 1;
}
}
return 0;
}

stock IsPlayerInHelicopter(playerid) //By Sacky
{
if(IsPlayerInAnyVehicle(playerid)){
new vehicleid = GetPlayerVehicleID(playerid);
new vehicleclass = GetVehicleClass(vehicleid);
switch(vehicleclass)
{
case 417:return 1;
case 425:return 1;
case 447:return 1;
case 465:return 1;
case 469:return 1;
case 487:return 1;
case 488:return 1;
case 497:return 1;
case 501:return 1;
case 548:return 1;
case 563:return 1;
}
}
return 0;
}

stock IsPlayerInMonsterTruck(playerid) //By Sacky
{
if(IsPlayerInAnyVehicle(playerid)){
new vehicleid = GetPlayerVehicleID(playerid);
new vehicleclass = GetVehicleClass(vehicleid);
switch(vehicleclass)
{
case 406:return 1;
case 444:return 1;
case 556:return 1;
case 557:return 1;
case 573:return 1;
}
}
return 0;
}

stock IsPlayerInPlane(playerid) //By Sacky
{
if(IsPlayerInAnyVehicle(playerid)){
new vehicleid = GetPlayerVehicleID(playerid);
new vehicleclass = GetVehicleClass(vehicleid);
switch(vehicleclass)
{
case 460:return 1;
case 464:return 1;
case 476:return 1;
case 511:return 1;
case 512:return 1;
case 513:return 1;
case 519:return 1;
case 520:return 1;
case 539:return 1;
case 553:return 1;
case 577:return 1;
case 592:return 1;
case 593:return 1;
}
}
return 0;
}

stock IsPlayerInQuad(playerid) //By Sacky
{
if(IsPlayerInAnyVehicle(playerid)){
new vehicleid = GetPlayerVehicleID(playerid);
new vehicleclass = GetVehicleClass(vehicleid);
switch(vehicleclass)
{
case 471:return 1;
}
}
return 0;
}

stock IsPlayerInCar(playerid) //By Sacky
{
if(IsPlayerInAnyVehicle(playerid)){
new vehicleid = GetPlayerVehicleID(playerid);
new vehicleclass = GetVehicleClass(vehicleid);
switch(vehicleclass)
{
case 448:return 0;
case 461:return 0;
case 462:return 0;
case 463:return 0;
case 468:return 0;
case 521:return 0;
case 522:return 0;
case 523:return 0;
case 581:return 0;
case 586:return 0;
case 481:return 0;
case 509:return 0;
case 510:return 0;
case 430:return 0;
case 446:return 0;
case 452:return 0;
case 453:return 0;
case 454:return 0;
case 472:return 0;
case 473:return 0;
case 484:return 0;
case 493:return 0;
case 595:return 0;
case 417:return 0;
case 425:return 0;
case 447:return 0;
case 465:return 0;
case 469:return 0;
case 487:return 0;
case 488:return 0;
case 497:return 0;
case 501:return 0;
case 548:return 0;
case 563:return 0;
case 406:return 0;
case 444:return 0;
case 556:return 0;
case 557:return 0;
case 573:return 0;
case 460:return 0;
case 464:return 0;
case 476:return 0;
case 511:return 0;
case 512:return 0;
case 513:return 0;
case 519:return 0;
case 520:return 0;
case 539:return 0;
case 553:return 0;
case 577:return 0;
case 592:return 0;
case 593:return 0;
case 471:return 0;
}
return 1;
}
return 0;
}

stock GetVehicleName(vehicleid) //By Sacky
{
new vehicleclass = GetVehicleClass(vehicleid);
new tmp = vehicleclass - 400;
return vehicleNames[tmp];
}

#if defined Skin
stock GetPlayerSkin(playerid) //By Sacky
{
if(IsPlayerConnected(playerid)){
return Skin[playerid];
}
return -1;
}
#endif

stock IsPlayerInCircle(playerid,Float:x,Float:y,radius) //By Sacky
{
if(GetPlayerDistanceToPoint(playerid,x,y) < radius){
return 1;
}
return 0;
}

stock GetPlayerDistanceToPoint(playerid,Float:x,Float:y) //By Sacky
{
new Float:x1,Float:y1,Float:z1;
new Float:tmpdis;
GetPlayerPos(playerid,x1,y1,z1);
tmpdis = floatsqroot(floatpower(floatabs(floatsub(x,x1)),2)+floatpower(floatabs(floatsub(y,y1)),2));
return floatround(tmpdis);
}

stock IsPlayerInSphere(playerid,Float:x,Float:y,Float:z,radius) //By Sacky
{
if(GetPlayerDistanceToPointEx(playerid,x,y,z) < radius){
return 1;
}
return 0;
}

stock GetPlayerDistanceToPointEx(playerid,Float:x,Float:y,Float:z) //By Sacky
{
new Float:x1,Float:y1,Float:z1;
new Float:tmpdis;
GetPlayerPos(playerid,x1,y1,z1);
tmpdis = floatsqroot(floatpower(floatabs(floatsub(x,x1)),2)+floatpower(floatabs(floatsub(y,y1)),2)+floatpower(floatabs(floatsub(z,z1)),2));
return floatround(tmpdis);
}

stock TakePlayerMoney(playerid,money) //By Sacky
{
GivePlayerMoney(playerid,0-money);
}

stock AddStaticPickup2(model,type,Float:X,Float:Y,Float:Z) //By Sacky
{
PC++;
pickupmodel[PC] = model;
pickuptype[PC] = type;
pickupx[PC] = X;
pickupy[PC] = Y;
pickupz[PC] = Z;
AddStaticPickup(model,type,Float:X,Float:Y,Float:Z);
}

stock AddStaticVehicleEx2(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:z_angle, color1, color2,respawn_delay) //By Sacky
{
if(VC<MAX_VEHICLES){
VC++;
VehicleModels[VC] = modelid;
VehicleAngles[VC] = floatround(z_angle);
AddStaticVehicleEx(modelid, spawn_x, spawn_y, spawn_z, z_angle, color1, color2,respawn_delay);
}
}

stock GetPlayerSpeed(playerid) //By Sacky
{
return kmph[playerid];
}

stock GetPlayerAcceleration(playerid) //By Sacky
{
return acc[playerid];
}

stock IsVehicleConnected(vehicleid) //By Sacky
{
if(vehicleid < GetVehicles()){
return 1;
}
return 0;
}

stock IsPickupConnected(pickupid) //By Sacky
{
if(pickupid < PC){
return 1;
}
return 0;
}

stock GetPickups() //By Sacky
{
return PC;
}

stock GetPointDistanceToPoint(Float:x,Float:y,Float:x2,Float:y2) //By Sacky
{
new Float:tmpdis;
tmpdis = floatsqroot(floatpower(floatabs(floatsub(x,x2)),2)+floatpower(floatabs(floatsub(y,y2)),2));
return floatround(tmpdis);
}

stock GetPointDistanceToPointEx(Float:x,Float:y,Float:z,Float:x2,Float:y2,Float:z2) //By Sacky
{
new Float:tmpdis;
tmpdis = floatsqroot(floatpower(floatabs(floatsub(x,x2)),2)+floatpower(floatabs(floatsub(y,y2)),2)+floatpower(floatabs(floatsub(z,z2)),2));
return floatround(tmpdis);
}

stock GetVehicleZAngle(vehicleid) //By Sacky
{
new Float:x;
new Float:y;
new Float:z;
if(IsVehicleInUse(vehicleid)){
new vdid = VehicleDriverID(vehicleid);
GetPlayerPos(vdid,x,y,z);
new Float:cx = SavePlayerPos[vdid][LastX];
new Float:cy = y;
new adj = GetPointDistanceToPoint(SavePlayerPos[vdid][LastX],SavePlayerPos[vdid][LastY],cx,cy);
new opp = GetPointDistanceToPoint(x,y,cx,cy);
new Float:rad = itan(opp,adj);
new ang = RadiansToDegrees(rad);
return ang;
}
return VehicleAngles[vehicleid];
}

stock Float:isin(Float:opp,Float:hyp) //By Sacky
{
new Float:x = opp/hyp;
if(x < 1 && x > -1){
new Float:ret = x+(1.0/2.0)*(floatpower(x,3)/3.0)+((1.0*3.0)/(2.0*4.0))*(floatpower(x,5)/5.0)+((1.0*3.0*5.0)/(2.0*4.0*6.0))*(floatpower(x,7)/7.0)+((1.0*3.0*5.0*7.0)/(2.0*4.0*6.0*8.0))*(floatpower(x,9)/9.0)+((1.0*3.0*5.0*7.0*9.0)/(2.0*4.0*6.0*8.0*10.0))*(floatpower(x,11)/11.0);
return ret;
}
return -1.00;
}

stock Float:icos(Float:adj,Float:hyp) //By Sacky
{
new Float:x = adj/hyp;
if(x < 1 && x > -1){
new Float:ret = (pi/2.0)-isin(adj,hyp);
return ret;
}
return -1.00;
}

stock Float:itan(Float:opp,Float:adj) //By Sacky
{
new Float:x = opp/adj;
if(x < 1 && x > -1){
new Float:ret = x-(1.0/3.0)*floatpower(x,3)+(1.0/5.0)*floatpower(x,5)-(1.0/7.0)*floatpower(x,7)+(1.0/9.0)*floatpower(x,9)-(1.0/11.0)*floatpower(x,11)+(1.0/13.0)*floatpower(x,13)-(1.0/15.0)*floatpower(x,15)+(1.0/17.0)*floatpower(x,17)-(1.0/19.0)*floatpower(x,19)+(1.0/21.0)*floatpower(x,21)-(1.0/23.0)*floatpower(x,23)+(1.0/25.0)*floatpower(x,25);
return ret;
}
return -1.00;
}

stock RadiansToDegrees(Float:radian) //By Sacky
{
new Float:tmp = floatdiv(floatmul(float(radian),pi),float(180));
return floatround(tmp);
}

stock Float:DegreesToRadians(Float:degrees) //By Sacky
{
new Float:multiply = floatmul(float(degrees),float(180));
new Float:tmp = floatdiv(multiply,pi);
return tmp;
}

stock IsVehicleInUse(vehicleid) //By Sacky
{
new vdid = VehicleDriverID(vehicleid);
if(vdid != -1){
return 1;
}
return 0;
}

stock PlayerPlaySoundEx(playerid,soundid) //By Sacky
{
new Float:x;
new Float:y;
new Float:z;
GetPlayerPos(playerid,x,y,z);
PlayerPlaySound(playerid,soundid,x,y,z);
}

stock SetVehicleRespawnPos(vehicleid,Float:x,Float:y,Float:z,Float:angle)
{
vehiclex[vehicleid] = x;
vehicley[vehicleid] = y;
vehiclez[vehicleid] = z;
vehiclea[vehicleid] = angle;
dynamicv[vehicleid] = 1;
}

stock ResetVehicleSpawnPos(vehicleid)
{
dynamicv[vehicleid] = 0;
}

stock AddStaticVehicle2(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:z_angle, color1, color2) //By Boss
{
if(VC<MAX_VEHICLES){
VC++;
VehicleModels[VC] = modelid;
VehicleAngles[VC] = floatround(z_angle);
AddStaticVehicle(modelid, spawn_x, spawn_y, spawn_z, z_angle, color1, color2);
}
}

stock AddStaticVehicleLine(Modelid, Float:Start[2], Float:Rate[2], Float:Z, Float:Z_Angle, MaxAmount) //Toxic
{
	new Float:x = Start[0], Float:y = Start[1];
	new Float:xRate = Start[0] - Rate[0];
	new Float:yRate = Start[1] - Rate[1];
	for(new Amount = 0;Amount < MaxAmount;Amount++){
	AddStaticVehicle2(Modelid, x, y, Z, Z_Angle, -1, -1);
	x -= xRate;
	y -= yRate;
	}
	return 1;
}

#if defined gTeam
stock SetTeamPos(team, x, y, z) //dyraXon
{
for (new i = 0; i < MAX_PLAYERS; i++)
{
if (gTeam[i] == team && IsPlayerConnected(i)) 
{
SetPlayerPos(i, x, y, z);
}
}
}

stock IsTeamInArea(team, Float:minx, Float:maxx, Float:miny, Float:maxy) //dyraXon
{
for (new i = 0; i < MAX_PLAYERS; i++)
{
if (gTeam[i] == team && IsPlayerConnected(i)) 
{
new Float:x, Float:y, Float:z;
GetPlayerPos(i, x, y, z);
if (x > minx && x < maxx && y > miny && y < maxy) return 1;
}
}
return 0;
}

stock KickTeam(team) //dyraXon
{
for (new i = 0; i < MAX_PLAYERS; i++)
{
if (gTeam[i] == team && IsPlayerConnected(i)) 
{
Kick(i);
}
}
}

stock BanTeam(team) //dyraXon
{
for (new i = 0; i < MAX_PLAYERS; i++)
{
if (gTeam[i] == team && IsPlayerConnected(i)) 
{
Ban(i);
}
}
}
#endif

stock GetVehicleType(vid) //By YellowBlood
{
	new type;
// ================== CARS =======
	switch(VehicleModels[vid]) {
	case
	416,   //ambulan  -  car
	445,   //admiral  -  car
	602,   //alpha  -  car
	485,   //baggage  -  car
	568,   //bandito  -  car
	429,   //banshee  -  car
	499,   //benson  -  car
	424,   //bfinject,   //car
	536,   //blade  -  car
	496,   //blistac  -  car
	504,   //bloodra  -  car
	422,   //bobcat  -  car
	609,   //boxburg  -  car
	498,   //boxville,   //car
	401,   //bravura  -  car
	575,   //broadway,   //car
	518,   //buccanee,   //car
	402,   //buffalo  -  car
	541,   //bullet  -  car
	482,   //burrito  -  car
	431,   //bus  -  car
	438,   //cabbie  -  car
	457,   //caddy  -  car
	527,   //cadrona  -  car
	483,   //camper  -  car
	524,   //cement  -  car
	415,   //cheetah  -  car
	542,   //clover  -  car
	589,   //club  -  car
	480,   //comet  -  car
	596,   //copcarla,   //car
	599,   //copcarru,   //car
	597,   //copcarsf,   //car
	598,   //copcarvg,   //car
	578,   //dft30  -  car
	486,   //dozer  -  car
	507,   //elegant  -  car
	562,   //elegy  -  car
	585,   //emperor  -  car
	427,   //enforcer,   //car
	419,   //esperant,   //car
	587,   //euros  -  car
	490,   //fbiranch,   //car
	528,   //fbitruck,   //car
	533,   //feltzer  -  car
	544,   //firela  -  car
	407,   //firetruk,   //car
	565,   //flash  -  car
	455,   //flatbed  -  car
	530,   //forklift,   //car
	526,   //fortune  -  car
	466,   //glendale,   //car
	604,   //glenshit,   //car
	492,   //greenwoo,   //car
	474,   //hermes  -  car
	434,   //hotknife,   //car
	502,   //hotrina  -  car
	503,   //hotrinb  -  car
	494,   //hotring  -  car
	579,   //huntley  -  car
	545,   //hustler  -  car
	411,   //infernus,   //car
	546,   //intruder,   //car
	559,   //jester  -  car
	508,   //journey  -  car
	571,   //kart  -  car
	400,   //landstal,   //car
	403,   //linerun  -  car
	517,   //majestic,   //car
	410,   //manana  -  car
	551,   //merit  -  car
	500,   //mesa  -  car
	418,   //moonbeam,   //car
	572,   //mower  -  car
	423,   //mrwhoop  -  car
	516,   //nebula  -  car
	582,   //newsvan  -  car
	467,   //oceanic  -  car
	404,   //peren  -  car
	514,   //petro  -  car
	603,   //phoenix  -  car
	600,   //picador  -  car
	413,   //pony  -  car
	426,   //premier  -  car
	436,   //previon  -  car
	547,   //primo  -  car
	489,   //rancher  -  car
	441,   //rcbandit,   //car
	594,   //rccam  -  car
	564,   //rctiger  -  car
	515,   //rdtrain  -  car
	479,   //regina  -  car
	534,   //remingtn,   //car
	505,   //rnchlure,   //car
	442,   //romero  -  car
	440,   //rumpo  -  car
	475,   //sabre  -  car
	543,   //sadler  -  car
	605,   //sadlshit,   //car
	495,   //sandking,   //car
	567,   //savanna  -  car
	428,   //securica,   //car
	405,   //sentinel,   //car
	535,   //slamvan  -  car
	458,   //solair  -  car
	580,   //stafford,   //car
	439,   //stallion,   //car
	561,   //stratum  -  car
	409,   //stretch  -  car
	560,   //sultan  -  car
	550,   //sunrise  -  car
	506,   //supergt  -  car
	601,   //swatvan  -  car
	574,   //sweeper  -  car
	566,   //tahoma  -  car
	549,   //tampa  -  car
	420,   //taxi  -  car
	459,   //topfun  -  car
	576,   //tornado  -  car
	583,   //tug  -  car
	451,   //turismo  -  car
	558,   //uranus  -  car
	552,   //utility  -  car
	540,   //vincent  -  car
	491,   //virgo  -  car
	412,   //voodoo  -  car
	478,   //walton  -  car
	421,   //washing  -  car
	529,   //willard  -  car
	555,   //windsor  -  car
	456,   //yankee  -  car
	554,   //yosemite,   //car
	477   //zr3	50  -  car
	: type = VTYPE_CAR;

// ================== BIKES =======
	case
	581,   //bf400  -  bike
	523,   //copbike  -  bike
	462,   //faggio  -  bike
	521,   //fcr900  -  bike
	463,   //freeway  -  bike
	522,   //nrg500  -  bike
	461,   //pcj600  -  bike
	448,   //pizzaboy,   //bike
	468,   //sanchez  -  bike
	586,   //wayfarer,   //bike
	509,   //bike  -  bmx
	481,   //bmx  -  bmx
	510,   //mtbike  -  bmx
	471   //quad  -  quad
	: type = VTYPE_BIKE;

// ================== SEA =======
	case
	472,   //coastg  -  boat
	473,   //dinghy  -  boat
	493,   //jetmax  -  boat
	595,   //launch  -  boat
	484,   //marquis  -  boat
	430,   //predator,   //boat
	453,   //reefer  -  boat
	452,   //speeder  -  boat
	446,   //squalo  -  boat
	454   //tropic  -  boat
	: type = VTYPE_SEA;

// ================== AIR =======
	case
	548,   //cargobob,   //heli
	425,   //hunter  -  heli
	417,   //leviathn,   //heli
	487,   //maverick,   //heli
	497,   //polmav  -  heli
	563,   //raindanc,   //heli
	501,   //rcgoblin,   //heli
	465,   //rcraider,   //heli
	447,   //seaspar  -  heli
	469,   //sparrow  -  heli
	488,   //vcnmav  -  heli
	592,   //androm  -  plane
	577,   //at	400  -  plane
	511,   //beagle  -  plane
	512,   //cropdust,   //plane
	593,   //dodo  -  plane
	520,   //hydra  -  plane
	553,   //nevada  -  plane
	464,   //rcbaron  -  plane
	476,   //rustler  -  plane
	519,   //shamal  -  plane
	460,   //skimmer  -  plane
	513,   //stunt  -  plane
	539   //vortex  -  plane
	: type = VTYPE_AIR;

// ================== HEAVY =======
	case
	588,   //hotdog  -  car
	437,   //coach  -  car
	532,   //combine  -  car
	433,   //barracks,   //car
	414,   //mule  -  car
	443,   //packer  -  car
	470,   //patriot  -  car
	432,   //rhino  -  car
	525,   //towtruck,   //car
	531,   //tractor  -  car
	408,   //trash  -  car
	406,   //dumper  -  mtruck
	573,   //duneride,   //mtruck
	444,   //monster  -  mtruck
	556,   //monstera,   //mtruck
	557,   //monsterb,   //mtruck
	435,   //artict1  -  trailer
	450,   //artict2  -  trailer
	591,   //artict3  -  trailer
	606,   //bagboxa  -  trailer
	607,   //bagboxb  -  trailer
	610,   //farmtr1  -  trailer
	584,   //petrotr  -  trailer
	608,   //tugstair,   //trailer
	611,   //utiltr1  -  trailer
	590,   //freibox  -  train
	569,   //freiflat,   //train
	537,   //freight  -  train
	538,   //streak  -  train
	570,   //streakc  -  train
	449   //tram  -  train
	: type = VTYPE_HEAVY;
	}
	return type;
}

stock IsPlayerInCube(playerid, xmin, ymin, zmin, xmax, ymax, zmax) //By 50p
{
   new Float:x, Float:y, Float:z;
   GetPlayerPos(playerid, x, y, z);
   if( x > xmin && y > ymin && z > zmin && x < xmax && y < ymax && z < zmax) return 1;
   return 0;
}

stock GetPlayers() //By rapidZ
{
new i;
new player;
player = 0;
for (i=0;i<MAX_PLAYERS;i++){
if(IsPlayerConnected(i)){
player++;
}
}
return player;
}

stock str_replace(search[], replace[], source[]) //By Tratulla
{
	new newnick[256];
	new newlen;
	for (new i; i < strlen(source); i++)
	{
	    if (strlen(search) > 1 && i != (strlen(source) - 1))
	    {
	        new matched = 1;
	        new start = i;
	        for (new s; s < strlen(search) && matched == 1; s++)
	        {
	            if (source[i] != search[s] && s == 0)
	            {
	                newnick[newlen] = source[i];
	                matched = 0;
				} else
				{
		            if (source[i] == search[s])
		            {
		                i++;
		            } else
		            {
		                matched = 0;
					}
				}
	        }
	        if (matched == 0)
	        {
	            for (;start <= i; start++)
	            {
	                newnick[newlen] = source[start];
	                newlen++;
	            }
	        } else
	        {
	            for (new r; r < strlen(replace); r++)
	            {
	                newnick[newlen] = replace[r];
	                newlen++;
	            }
				i = (start + (strlen(search) - 1));
	        }
	    } else
	    {
			if (strlen(search) == 1 && source[i] == search[0])
			{
			    for (new r; r < strlen(replace); r++)
			    {
			        newnick[newlen] = replace[r];
			        newlen++;
			    }
			} else
			{
			    newnick[newlen] = source[i];
			    newlen++;
			}
		}
	}
	newnick[newlen] = EOS;
	return newnick;
}

stock GameTextCheck(const string[]) //By Kamazy
{
for (new i = 0; i < strlen(string); i++)
	{
    if ((string[i] == 126) && (string[i-1] == 126)
	|| (string[i] == ' ') && (string[i-1] == '~') && (string[i-2] == ' ')
	|| (string[i] == '~') && (string[i+2] != '~') && (string[i-2] != '~')
	|| (string[i] == '~') && (string[i+2] == '~') && (string[i-2] == '~')) return 1;
    }
return 0;
}

stock SetPlayerPosEx(playerid,Float:X,Float:Y,Float:Z,Float:Ang,Int) //By Kamazy
{
SetPlayerInterior(playerid,Int);
SetPlayerFacingAngle(playerid,Ang);
SetPlayerPos(playerid,X,Y,Z);
SetCameraBehindPlayer(playerid);
}

stock IsPlayerInRange(playerid, Float: Range, Float: Z_Range, Float:tar_x, Float:tar_y, Float:tar_z) //By Simon
{
new Float:player_x, Float:player_y, Float:player_z;
GetPlayerPos(playerid, player_x, player_y, player_z);
if(player_x - tar_x <= Range && player_x - tar_x >= (0.0 - Range) && player_y - tar_y <= Range && player_y - tar_y >= (0.0 - Range) && player_z - tar_z <= Z_Range && player_z - tar_z >= (0.0 - Z_Range))
{ 
return 1;
}
return 0;
}

stock GivePlayerWeaponEx( playerid, ... ) //By Peter
{
    new Count = numargs();
    for( new i = 1; i < Count; i += 2 )
    {
        new WeaponID = getarg( i );
        new Ammo = getarg( ( i + 1 ) );
        if( WeaponID > 0 && WeaponID < 47 )
        {
            GivePlayerWeaponAlt( playerid, WeaponID, Ammo );
        }
    }
}

stock SendClientMessageToAllOthers(playerid, color, const message[]) //By yom
{
    for (new i = 0; i < MAX_PLAYERS; i++)
    {
        if ((IsPlayerConnected(i)) && (i != playerid))
        {
            SendClientMessage(i, color, message);
        }
    }
}

stock GameTextForAllOthers(playerid, const string[], time, style) //By yom
{
    for (new i = 0; i < MAX_PLAYERS; i++)
    {
        if ((IsPlayerConnected(i)) && (i != playerid))
        {
            GameTextForPlayer(i, string, time, style);
        }
    }
}

stock SetPlayerColourAlpha(playerid, alpha) //By Betamaster
{
	new r, g, b, a;
	HexToRGBA(GetPlayerColor(playerid), r, g, b, a);
	SetPlayerColor(playerid, RGBAToHex(r, g, b, alpha));
}

stock RGBAToHex(r, g, b, a) //By Betamaster
{
	return (r<<24 | g<<16 | b<<8 | a);
}

stock HexToRGBA(colour, &r, &g, &b, &a) //By Betamaster
{
	r = (colour >> 24) & 0xFF;
	g = (colour >> 16) & 0xFF;
	b = (colour >> 8) & 0xFF;
	a = colour & 0xFF;
}

stock IsPlayerInAreaEx(playerid, Float:...) //By kool
{
        new Count = numargs();
        new Float:xe[255], Float:ye[255];
        new j=0;
        for(new i=1; i<Count; i+=2)
        {
                xe[j] = Float:getarg(i);
                ye[j] = Float:getarg(i+1);
                j++;
        }
        xe[j] = xe[0];
        ye[j] = ye[0];
        new Lines;
        new Float:xcut;
        new Float:x, Float:y, Float:z;
        GetPlayerPos(playerid, x, y, z);
        for(new i=0; i<j; i++)
        {
                xcut = xe[i]+((y-ye[i])*(xe[i+1]-xe[i])/(ye[i+1]-ye[i]));
                if(((y >= ye[i] && y <= ye[i+1]) || (y >= ye[i+1] && y <= ye[i])) && xcut < x)
                        Lines++;
        }
        if(Lines%2 == 1)
                return 1;
        return 0;
}

#if defined gTeam
stock SetTeamScore(team, score) //By Hellomy
{
	for (new i = 0; i < MAX_PLAYERS; i++)
	{
		if (gTeam[i] == team && IsPlayerConnected(i)) SetPlayerScore(i, score);
	}
}

stock GiveTeamMoney(team, amount) //By Hellomy
{
	for (new i = 0; i < MAX_PLAYERS; i++)
	{
		if (gTeam[i] == team && IsPlayerConnected(i)) GivePlayerMoney(i, amount);
	}
}
#endif

//>>By Unknown

stock Wait(time)
{
	new stamp = tickcount();
    while (tickcount() - stamp < time){}
    return 1;
}

stock strrest(const string[], index)
{
	new length = strlen(string);

	new offset = index;
	new result[256];
	while ((index < length) && ((index - offset) < (sizeof(result) - 1)) && (string[index] > '\r'))
	{
		result[index - offset] = string[index];
		index++;
	}
	result[index - offset] = EOS;
	return result;
}

/*Credits
Alex "Y_Less" Cole
Jan "DracoBlue" Schütze
Mike
Slick
Allan
SidViciousII
Darkrealm
El Presy
Spectre
mabako
Sacky
Boss
Toxic
dyraXon
yellowblood
50p
rapidZ
Tratulla
Kamazy
Simon
yom
Betamaster
Peter
kool
Hellomy
*/

//Useful Callbacks:

stock ufctimer()
{
PickupTimer();
ShotTimer();
SpeedTimer();
VehicleSpawn();
}

stock PickupTimer()
{
for(new i=0;i<GetMaxPlayers();i++){
if(IsPlayerConnected(i)){
CheckPickup(i);
}
}
}

stock CheckPickup(playerid)
{
for(new i=0;i<PC;i++){
if(IsPlayerInSphere(playerid,pickupx[i],pickupy[i],pickupz[i],1)){
#if defined OnPlayerPickupItem
OnPlayerPickupItem(playerid,i,pickupmodel[i],pickuptype[i]);
if(pickuptype[i] == 2){
pickuprespawn[i] = 180;
}
#endif
}
if(pickuprespawn[i] == 0){
#if defined OnPlayerGetShot
OnPickupRespawn(i,pickupmodel[i]);
#endif
pickuprespawn[i] = 999;
}
if(pickuprespawn[i] != 999){
new tmp;
tmp = pickuprespawn[i];
pickuprespawn[i] = tmp-1;
}
}
}

stock ShotTimer()
{
if(GetPlayers() != 1 || GetPlayers() != 0){
for(new i=0;i<GetMaxPlayers();i++){
if(IsPlayerConnected(i)){
CheckShot(i);
}
}
}
}

stock CheckShot(playerid)
{
new Float:x;
new Float:y;
new Float:z;
new cid;
new dis;
new Float:h;
new rh;
GetPlayerPos(playerid,x,y,z);
GetPlayerHealth(playerid,h);
rh = floatround(h);
if(preh[playerid]-rh > 5){
cid = GetClosestPlayer(playerid);
dis = GetDistanceBetweenPlayers(playerid,cid);
if(dis < 100 && z >= floatround(SavePlayerPos[playerid][LastZ])){
if(IsPlayerInAnyVehicle(cid)){
if(GetPlayerSpeed(cid) < 75){
}
#if defined OnPlayerGetShot
OnPlayerGetShot(playerid);
#endif
}
#if defined OnPlayerGetShot
OnPlayerGetShot(playerid);
#endif
}
}
preh[playerid] = rh;
}

stock SpeedTimer()
{
    new Float:x,Float:y,Float:z;
    new Float:distance,value;
    for(new i=0; i<GetMaxPlayers(); i++)
    {
        if(IsPlayerConnected(i))
        {
            GetPlayerPos(i, x, y, z);
            distance=floatsqroot(floatpower(floatabs(floatsub(x,SavePlayerPos[i][LastX])),2)
            +floatpower(floatabs(floatsub(y,SavePlayerPos[i][LastY])),2)
            +floatpower(floatabs(floatsub(z,SavePlayerPos[i][LastZ])),2));
            value = floatround(distance * 3600);
            acc[i] = kmph[i]*1000 - floatround(value);
            SavePlayerPos[i][LastX] = x;
            SavePlayerPos[i][LastY] = y;
            SavePlayerPos[i][LastZ] = z;
            kmph[i] = floatround(value/1000);
        }
    }
}

stock AreaTimer()
{
for(new i=0;i<GetMaxPlayers();i++){
if(IsPlayerConnected(i)){
CheckArea(i);
}
}
}

stock CheckArea(playerid)
{
new moneys = GetPlayerMoney(playerid);
new tmpmon = moneyss[playerid] - moneys;
new tmpmon2 = moneys - moneyss[playerid];
#if defined OnPlayerGamble
new nb;
#endif
if(tmpmon > 0){
#if defined OnPlayerBuyWeapon
for(new i=0;i<sizeof(lvammu);i++){
if(IsPlayerInSphere(playerid,lvammu[i][1],lvammu[i][2],lvammu[i][3],1)){
switch (tmpmon)
{
case 200:OnPlayerBuyWeapon(playerid,22,200);
case 240:OnPlayerBuyWeapon(playerid,0,240);
case 300:OnPlayerBuyWeapon(playerid,32,300);
case 500:OnPlayerBuyWeapon(playerid,28,500);
case 600:{OnPlayerBuyWeapon(playerid,23,600);
OnPlayerBuyWeapon(playerid,25,0);}
case 800:OnPlayerBuyWeapon(playerid,26,800);
case 1200:{OnPlayerBuyWeapon(playerid,24,1200);
OnPlayerBuyWeapon(playerid,27,1200);}
case 2000:OnPlayerBuyWeapon(playerid,29,2000);
case 3500:OnPlayerBuyWeapon(playerid,30,3500);
case 4500:OnPlayerBuyWeapon(playerid,31,4500);
}
}
}
for(new i=0;i<sizeof(ammu);i++){
if(IsPlayerInSphere(playerid,ammu[i][1],ammu[i][2],ammu[i][3],1)){
switch (tmpmon)
{
case 200:{OnPlayerBuyWeapon(playerid,22,200);
OnPlayerBuyWeapoon(playerid,0,0);}
case 300:OnPlayerBuyWeapon(playerid,32,300);
case 500:OnPlayerBuyWeapon(playerid,28,500);
case 600:{OnPlayerBuyWeapon(playerid,23,600);
OnPlayerBuyWeapon(playerid,25,0);}
case 800:OnPlayerBuyWeapon(playerid,26,800);
case 1200:{OnPlayerBuyWeapon(playerid,24,1200);
OnPlayerBuyWeapon(playerid,27,1200);}
case 2000:OnPlayerBuyWeapon(playerid,29,2000);
case 3500:OnPlayerBuyWeapon(playerid,30,3500);
case 4500:OnPlayerBuyWeapon(playerid,31,4500);
}
}
}
#endif
#if defined OnPlayerBuyPizza
if(IsPlayerInSphere(playerid,374.0000,374.0000,374.0000,1)){
switch (tmpmon)
{
case 2:OnPlayerBuyPizza(playerid,2);
}
}
#endif
#if defined OnPlayerBuyChicken
if(IsPlayerInSphere(playerid,368.7890,-6.8570,1001.8516,1)){
switch (tmpmon)
{
case 2:OnPlayerBuyChicken(playerid,2);
}
}
#endif
#if defined OnPlayerBuyBurger
if(IsPlayerInSphere(playerid,375.5660,-68.2220,1001.5151,1)){
switch (tmpmon)
{
case 2:OnPlayerBuyChicken(playerid,2);
}
}
#endif
#if defined OnPlayerBuyDrink
if(tmpmon == 5){
OnPlayerBuyDrink(playerid,5);
}
#endif
#if defined OnPlayerGamble
if(betting[playerid] != 0){
if(bet[playerid] == 0){
bet[playerid] = tmpmon;
}
else{
OnPlayerGamble(playerid,betting[playerid],bet[playerid],0);
betting[playerid] = 0;
bet[playerid] = 0;
}
}
#endif
#if defined OnPlayerModCar
if(IsPlayerInSphere(playerid,617.5360,-1.9889,1000.6190,4) && IsPlayerInAnyVehicle(playerid)){
new vehicleid = GetPlayerVehicleID(playerid);
switch (tmpmon)
{
case 150:OnPlayerModCar(playerid,vehicleid,1,150);
case 200:OnPlayerModCar(playerid,vehicleid,2,200);
case 250:OnPlayerModCar(playerid,vehicleid,3,250);
case 300:OnPlayerModCar(playerid,vehicleid,4,300);
case 350:{OnPlayerModCar(playerid,vehicleid,5,350);
OnPlayerModCar(playerid,vehicleid,6,0);}
case 500:{OnPlayerModCar(playerid,vehicleid,7,500);
OnPlayerModCar(playerid,vehicleid,8,0);}
case 550:OnPlayerModCar(playerid,vehicleid,9,550);
case 620:OnPlayerModCar(playerid,vehicleid,10,620);
case 770:OnPlayerModCar(playerid,vehicleid,11,770);
case 820:OnPlayerModCar(playerid,vehicleid,12,820);
case 1000:{OnPlayerModCar(playerid,vehicleid,13,1000);
OnPlayerModCar(playerid,vehicleid,14,0);
OnPlayerModCar(playerid,vehicleid,15,0);}
case 1030:OnPlayerModCar(playerid,vehicleid,16,1030);
case 1140:OnPlayerModCar(playerid,vehicleid,17,1140);
case 1200:OnPlayerModCar(playerid,vehicleid,18,1200);
case 1230:OnPlayerModCar(playerid,vehicleid,19,1230);
case 1500:OnPlayerModCar(playerid,vehicleid,20,1500);
case 1560:OnPlayerModCar(playerid,vehicleid,21,1560);
}
}
#endif
}
if(tmpmon2 > 0){
#if defined OnPlayerGamble
if(betting != 0){
OnPlayerGamble(playerid,betting[playerid],bet[playerid],1);
betting[playerid] = 0;
bet[playerid] = 0;
}
#endif
}
#if defined OnPlayerGamble
for(new i=0;i<sizeof(gamble1);i++){
if(IsPlayerInSphere(playerid,gamble1[i][1],gamble1[i][2],gamble1[i][3],1){
betting[playerid] = 1;
nb++;
}
}
for(new i=0;i<sizeof(gamble2);i++){
if(IsPlayerInSphere(playerid,gamble2[i][1],gamble2[i][2],gamble2[i][3],1){
betting[playerid] = 2;
nb++;
}
}
for(new i=0;i<sizeof(gamble3);i++){
if(IsPlayerInSphere(playerid,gamble3[i][1],gamble3[i][2],gamble3[i][3],1){
betting[playerid] = 3;
nb++;
}
}
for(new i=0;i<sizeof(gamble4);i++){
if(IsPlayerInSphere(playerid,gamble4[i][1],gamble4[i][2],gamble4[i][3],1){
betting[playerid] = 4;
nb++;
}
}
for(new i=0;i<sizeof(gamble5);i++){
if(IsPlayerInSphere(playerid,gamble5[i][1],gamble5[i][2],gamble5[i][3],1){
betting[playerid] = 2;
nb++;
}
}
for(new i=0;i<sizeof(gamble6);i++){
if(IsPlayerInSphere(playerid,gamble6[i][1],gamble6[i][2],gamble6[i][3],1){
betting[playerid] = 5;
nb++;
}
}
for(new i=0;i<sizeof(gamble7);i++){
if(IsPlayerInSphere(playerid,gamble7[i][1],gamble7[i][2],gamble7[i][3],1){
betting[playerid] = 3;
nb++;
}
}
if(nb == 0){
betting[playerid] = 0;
bet[playerid] = 0;
}
#endif
moneyss[playerid] = moneys;
}

stock VehicleSpawn()
{
#if defined OnVehicleSpawnEx
for(new i=0;i<GetVehicles();i++){
if(vehiclespawn[i] != 999){
if(vehiclespawn[i] == 0){
OnVehicleSpawnEx(vehicleid);
if(dynamicv[i] == 1){
DynamicSpawn(i);
}
}
else{
new tmp = vehiclespawn[i];
vehiclespawn[i] = tmp-1;
}
}
}
#endif
}

stock DynamicSpawn(vehicleid)
{
new Float:x;
new Float:y;
new Float:z;
GetPlayerPos(0,x,y,z);
PutPlayerInVehicle(0,vehicleid,0);
SetVehiclePos(vehicleid,vehiclex[vehicleid],vehicley[vehicleid],vehiclez[vehicleid]);
SetVehicleZAngle(vehicleid,vehiclea[vehicleid]);
SetPlayerPos(0,x,y,z);
}
