This function came in like a wrecking ball..
Anyhow, how is in any kind of sense, someone would ever use my function and what for. It's just a simple sense of humor, Have a nice day. |
stock strnull(const str[])
{
if (! str[0] || (str[0] == '\1' && ! str[0]))
return true;
new len = strlen(str);
new count;
for (new i; i < len; i++)
{
if (str[i] == ' ')
count++;
}
if (count == len)
return true;
return false;
}
formatInt(intVariable, iThousandSeparator = ',', iCurrencyChar = '$')
{
static
s_szReturn[ 32 ],
s_szThousandSeparator[ 2 ] = { ' ', EOS },
s_szCurrencyChar[ 2 ] = { ' ', EOS },
s_iVariableLen,
s_iChar,
s_iSepPos,
bool:s_isNegative
;
format( s_szReturn, sizeof( s_szReturn ), "%d", intVariable );
if(s_szReturn[0] == '-')
s_isNegative = true;
else
s_isNegative = false;
s_iVariableLen = strlen( s_szReturn );
if ( s_iVariableLen >= 4 && iThousandSeparator)
{
s_szThousandSeparator[ 0 ] = iThousandSeparator;
s_iChar = s_iVariableLen;
s_iSepPos = 0;
while ( --s_iChar > _:s_isNegative )
{
if ( ++s_iSepPos == 3 )
{
strins( s_szReturn, s_szThousandSeparator, s_iChar);
s_iSepPos = 0;
}
}
}
if(iCurrencyChar) {
s_szCurrencyChar[ 0 ] = iCurrencyChar;
strins( s_szReturn, s_szCurrencyChar, _:s_isNegative );
}
return s_szReturn; // ALL credits go to Slice
}
[30/03/2016 01:46:55] formatted: $3
[30/03/2016 01:46:55] formatted: -$3
[30/03/2016 01:46:55] formatted: $33
[30/03/2016 01:46:55] formatted: -$33
[30/03/2016 01:46:55] formatted: $338
[30/03/2016 01:46:55] formatted: -$338
[30/03/2016 01:46:55] formatted: $3,382
[30/03/2016 01:46:55] formatted: -$3,382
[30/03/2016 01:46:55] formatted: $33,822
[30/03/2016 01:46:55] formatted: -$33,822
[30/03/2016 01:46:55] formatted: $338,227
[30/03/2016 01:46:55] formatted: -$338,227
[30/03/2016 01:46:55] formatted: $3,382,273
[30/03/2016 01:46:55] formatted: -$3,382,273
[30/03/2016 01:46:55] formatted: $33,822,736
[30/03/2016 01:46:55] formatted: -$33,822,736
new i = 0;
while(i < 210000000)
{
i += random(9) + 1;
printf("formatted: %s", formatInt(i));
printf("formatted: %s", formatInt(i * -1));
i *= 10;
}
IntegerWithDelimiter(integer, delimiter[] = ",")
{
new
string[16];
format(string, sizeof string, "%i", integer);
for (new i = strlen(string) - 3, j = ((integer < 0) ? 1 : 0); i > j; i -= 3)
{
strins(string, delimiter, i, sizeof string);
}
return string;
}
forward _fix_format();
public _fix_format()
{
format("", 0, "");
}
stock DBResult:db_queryf(DB:db, query[], {Float, _}:...)
{
static
args
;
args = numargs();
#define STATIC_ARGS (2)
if (args > STATIC_ARGS)
{
const
SIZE = 4024
;
static
dest[SIZE]
;
while (--args >= STATIC_ARGS)
{
#emit LCTRL 5
#emit LOAD.alt args
#emit SHL.C.alt 2
#emit ADD.C 12
#emit ADD
#emit LOAD.I
#emit PUSH.pri
}
#emit PUSH.S query
#emit PUSH.C SIZE
#emit PUSH.C dest
#emit LOAD.S.pri 8
#emit CONST.alt 16
#emit SUB
#emit PUSH.pri
#emit SYSREQ.C format
#emit LCTRL 5
#emit SCTRL 4
print(dest);
return db_query(db, dest);
}
else
{
return db_query(db, query);
}
#undef STATIC_ARGS
}
db_queryf(DB:1, "SELECT * FROM `Users` WHERE `Name` = '%q'", "Gammix");
//charins - To insert a character to an array.
stock charins(string[], char_, pos, len = -1) {
if(len == -1)
len = strlen(string);
for(--len; len >= pos; len--)
string[len+1] = string[len];
string[pos] = char_;
return 1;
}
stock currency_format(number, curr = '$', delim = ',') {
new
temp_Str[32],
temp_Len = 0
;
valstr(temp_Str, number, false);
temp_Len = strlen(temp_Str);
charins(temp_Str, curr, 0, temp_Len++);
if(number > 999) {
new
i = temp_Len - 3;
do {
charins(temp_Str, delim, i, temp_Len++);
i -= 3;
}
while(i >= 2);
}
else if(number < -999) {
new
i = temp_Len - 3;
do {
charins(temp_Str, delim, i, temp_Len++);
i -= 3;
}
while(i >= 3);
}
return temp_Str;
}
GetIPVal(const ip[])
{
new len = strlen(ip);
if (!(len > 0 && len < 17))
return 0;
new count;
new pos;
new dest[3];
new val[4];
for (new i; i < len; i++)
{
if (ip[i] == '.' || i == len)
{
strmid(dest, ip, pos, i);
pos = (i + 1);
val[count] = strval(dest);
if (!(1 <= val[count] <= 255))
return 0;
count++;
if (count > 3)
return 0;
}
}
if (count != 3)
return 0;
return ((val[0] * 16777216) + (val[1] * 65536) + (val[2] * 256) + (val[3]));
}
IpMatch(const ip1[], const ip2[], rangetype = 26)
{
new ip = GetIPVal(ip1);
new subnet = GetIPVal(ip2);
new mask = -1 << (32 - rangetype);
subnet &= mask;
return bool:((ip & mask) == subnet);
}
public OnPlayerConnect(playerid)
{
new ip[18];
GetPlayerIp(playerid, ip, sizeof (ip));
if (ipmatch("0.0.0.0", ip))
{
SendClientMessage(playerid, 0xFF0000FF, "Your IP is blacklisted.");
return Kick(playerid);
}
return 1;
}
bool:IsRPName(name[], min_underscores = 1, max_uderscores = 3, bool:first_letter_upper = true)
{
new tempname[MAX_PLAYER_NAME];
strcat(tempname, name);
#pragma unused name
new count;
new pos;
new dest[MAX_PLAYER_NAME];
while ((pos = strfind(tempname, "_")) != -1)
{
strmid((dest[0] = EOS, dest), tempname, 0, pos, MAX_PLAYER_NAME);
strdel(tempname, 0, (pos + 1));
if (! dest[0])
return false;
if (first_letter_upper && dest[0] >= 'a')
return false;
for (new i, j = strlen(dest); i < j; i++)
{
if (dest[i] < 'A' || dest[i] > 'z' || dest[i] == ' ')
return false;
}
count++;
}
if (count < min_underscores)
return false;
if (! tempname[0])
return false;
if (first_letter_upper && tempname[0] >= 'a')
return false;
for (new i, j = strlen(tempname); i < j; i++)
{
if (tempname[i] < 'A' || tempname[i] > 'z' || tempname[i] == ' ')
return false;
}
count++;
if (count > max_uderscores)
return false;
return true;
}
public OnPlayerConnect(playerid)
{
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
if (! IsRPName(name, 1, 3, true))
{
return Kick(playerid);
}
return 1;
}
#define swapvars(%0,%1)\
(((%0) ^= (%1)), ((%1) ^= (%0)), ((%0) ^= (%1)))
//Step 1: OR the NOT bits (a.k.a. XOR) of var 2 into var 1.
10111000 // var1
^
01001000 // var2
=
11110000 // new var1
//Step 2: OR the new NOT bits of var 1 into var 2.
01001000 // var2
^
11110000 // new var1
=
10111000 // new, final var2 (which is the old bit of var1)
//Step 2: OR the new NOT bits of var 2 into var 1.
11110000 // new var1
^
10111000 // final var2
=
01001000 // final var1 (which is the old bit of var2)
// Returns
// -1 : Only one string
// 1 : 100% Success
strexpand(input[], output[][], maxstrings = sizeof(output), maxlength = sizeof(output[]), outstart[] = "") {
new appendlen = maxlength - strlen(outstart) - 1;
strmid(output[0], input, 0, maxlength, maxlength);
strdel(input, 0, maxlength - 1);
if(strlen(input) < maxlength)
return -1;
new curstring = 1;
do {
strmid(output[curstring], input, 0, appendlen, maxlength);
strins(output[curstring], outstart, 0, maxlength);
strdel(input, 0, appendlen);
curstring += 1;
} while(strlen(input) && curstring < maxstrings);
return 1;
}
#include a_samp
new longpart[8][64 + 1] = {
"darCCeaadraCyryreCedaaCaereeCyr3ereyderadyaCrredeerCerdryryCrre3",
"rydrdreCdaaCraydeyCdrayrydCreda3rCerryCradCryrerrrdyrrdCerdraye3",
"eCeaydrCrrararrarrCCayrCrydrdyC3CeadrdrCeedaedryrCearCdaCeCarea3",
"rarrdyraardeaaderdraaerCyyerdry3yrdeeCCrdrdrrrrCyyaCrerCeryCdrr3",
"yrryryererrCCaCrrredrCrryadeeyr3eaeyerrraeyrdCyarCeraeyadraayrd3",
"rdddCyreyCyeCarerryCCayadydCrey3aayeraCyrrrarrreraCCdyrdCrrerer3",
"CryeardrrrarryrraddreeryaaraadC3CyyrdderadyddayryraarrdarrrCedy3",
"eyryCededayyrddarddeayryyrCdera3darrrdrraaaerdrrCryCedCrdaeaeCr3"
};
main() {
new longstr[1024 + 1];
strcat(longstr, longpart[0]);
strcat(longstr, longpart[1]);
strcat(longstr, longpart[2]);
strcat(longstr, longpart[3]);
strcat(longstr, longpart[4]);
strcat(longstr, longpart[5]);
strcat(longstr, longpart[6]);
strcat(longstr, longpart[7]);
// Notice I accounted for a null terminator.
new output[32][32 + 1];
strexpand(longstr, output, .outstart = " ");
for(new i; i < sizeof(output); i++) {
if(strlen(output[i]))
printf("%s", output[i]);
}
}
darCCeaadraCyryreCedaaCaereeCyr3 ereyderadyaCrredeerCerdryryC rre3rydrdreCdaaCraydeyCdrayr ydCreda3rCerryCradCryrerrrdy rrdCerdraye3eCeaydrCrrararra rrCCayrCrydrdyC3CeadrdrCeeda edryrCearCdaCeCarea3rarrdyra ardeaaderdraaerCyyerdry3yrde eCCrdrdrrrrCyyaCrerCeryCdrr3 yrryryererrCCaCrrredrCrryade eyr3eaeyerrraeyrdCyarCeraeya draayrd3rdddCyreyCyeCarerryC CayadydCrey3aayeraCyrrrarrre raCCdyrdCrrerer3Cryeardrrrar ryrraddreeryaaraadC3Cyyrdder adyddayryraarrdarrrCedy3eyry CededayyrddarddeayryyrCdera3 darrrdrraaaerdrrCryCedCrdaea eCr3
ReturnDate()
{
static
date[36];
getdate(date[2], date[1], date[0]);
gettime(date[3], date[4], date[5]);
format(date, sizeof(date), "%02d/%02d/%d, %02d:%02d", date[0], date[1], date[2], date[3], date[4]);
return date;
}
ReturnVehicleHealth(vehicleid)
{
if (!IsValidVehicle(vehicleid))
return 0;
static
Float:amount;
GetVehicleHealth(vehicleid, amount);
return floatround(amount, floatround_round);
}
ReturnArmour(playerid)
{
static
Float:amount;
GetPlayerArmour(playerid, amount);
return floatround(amount, floatround_round);
}
ReturnHealth(playerid)
{
static
Float:amount;
GetPlayerHealth(playerid, amount);
return floatround(amount, floatround_round);
}
ReturnName(playerid, underscore = 1)
{
static
name[MAX_PLAYER_NAME + 1];
GetPlayerName(playerid, name, sizeof(name));
if (!underscore) {
for (new i = 0, len = strlen(name); i < len; i ++) {
if (name[i] == '_') name[i] = ' ';
}
}
return name;
}
ReturnIP(playerid)
{
static
ip[16];
GetPlayerIp(playerid, ip, sizeof(ip));
return ip;
}
GetDistance(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2)
{
return floatround(floatsqroot(((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2)) + ((z1 - z2) * (z1 - z2))));
}
IsValidObjectModel(modelid)
{
if (modelid < 0 || modelid > 20000)
return 0;
switch (modelid)
{
case 18632..18645, 18646..18658, 18659..18667, 18668..19299, 19301..19515, 18631, 331, 333..339, 318..321, 325, 326, 341..344, 346..353, 355..370, 372:
return 1;
}
new const g_arrModelData[] =
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128,
-515899393, -134217729, -1, -1, 33554431, -1, -1, -1, -14337, -1, -33,
127, 0, 0, 0, 0, 0, -8388608, -1, -1, -1, -16385, -1, -1, -1, -1, -1,
-1, -1, -33, -1, -771751937, -1, -9, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 33554431, -25, -1, -1, -1, -1, -1, -1,
-1073676289, -2147483648, 34079999, 2113536, -4825600, -5, -1, -3145729,
-1, -16777217, -63, -1, -1, -1, -1, -201326593, -1, -1, -1, -1, -1,
-257, -1, 1073741823, -133122, -1, -1, -65, -1, -1, -1, -1, -1, -1,
-2146435073, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1073741823, -64, -1,
-1, -1, -1, -2635777, 134086663, 0, -64, -1, -1, -1, -1, -1, -1, -1,
-536870927, -131069, -1, -1, -1, -1, -1, -1, -1, -1, -16384, -1,
-33554433, -1, -1, -1, -1, -1, -1610612737, 524285, -128, -1,
2080309247, -1, -1, -1114113, -1, -1, -1, 66977343, -524288, -1, -1, -1,
-1, -2031617, -1, 114687, -256, -1, -4097, -1, -4097, -1, -1,
1010827263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32768, -1, -1, -1, -1, -1,
2147483647, -33554434, -1, -1, -49153, -1148191169, 2147483647,
-100781080, -262145, -57, 134217727, -8388608, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1048577, -1, -449, -1017, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1835009, -2049, -1, -1, -1, -1, -1, -1,
-8193, -1, -536870913, -1, -1, -1, -1, -1, -87041, -1, -1, -1, -1, -1,
-1, -209860, -1023, -8388609, -2096897, -1, -1048577, -1, -1, -1, -1,
-1, -1, -897, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1610612737,
-3073, -28673, -1, -1, -1, -1537, -1, -1, -13, -1, -1, -1, -1, -1985,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1056964609, -1, -1, -1,
-1, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-236716037, -1, -1, -1, -1, -1, -1, -1, -536870913, 3, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -2097153, -2109441, -1, 201326591, -4194304, -1, -1,
-241, -1, -1, -1, -1, -1, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, -32768, -1, -1, -1, -2, -671096835, -1, -8388609, -66323585, -13,
-1793, -32257, -247809, -1, -1, -513, 16252911, 0, 0, 0, -131072,
33554383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8356095, 0, 0, 0, 0, 0,
0, -256, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-268435449, -1, -1, -2049, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
92274627, -65536, -2097153, -268435457, 591191935, 1, 0, -16777216, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 127
};
return ((modelid >= 0) && ((modelid / 32) < sizeof(g_arrModelData)) && (g_arrModelData[modelid / 32] & (1 << (modelid % 32))));
}
GetLocation(Float:fX, Float:fY, Float:fZ)
{
enum e_ZoneData
{
e_ZoneName[32 char],
Float:e_ZoneArea[6]
};
new const g_arrZoneData[][e_ZoneData] =
{
{!"The Big Ear", {-410.00, 1403.30, -3.00, -137.90, 1681.20, 200.00}},
{!"Aldea Malvada", {-1372.10, 2498.50, 0.00, -1277.50, 2615.30, 200.00}},
{!"Angel Pine", {-2324.90, -2584.20, -6.10, -1964.20, -2212.10, 200.00}},
{!"Arco del Oeste", {-901.10, 2221.80, 0.00, -592.00, 2571.90, 200.00}},
{!"Avispa Country Club", {-2646.40, -355.40, 0.00, -2270.00, -222.50, 200.00}},
{!"Avispa Country Club", {-2831.80, -430.20, -6.10, -2646.40, -222.50, 200.00}},
{!"Avispa Country Club", {-2361.50, -417.10, 0.00, -2270.00, -355.40, 200.00}},
{!"Avispa Country Club", {-2667.80, -302.10, -28.80, -2646.40, -262.30, 71.10}},
{!"Avispa Country Club", {-2470.00, -355.40, 0.00, -2270.00, -318.40, 46.10}},
{!"Avispa Country Club", {-2550.00, -355.40, 0.00, -2470.00, -318.40, 39.70}},
{!"Back o Beyond", {-1166.90, -2641.10, 0.00, -321.70, -1856.00, 200.00}},
{!"Battery Point", {-2741.00, 1268.40, -4.50, -2533.00, 1490.40, 200.00}},
{!"Bayside", {-2741.00, 2175.10, 0.00, -2353.10, 2722.70, 200.00}},
{!"Bayside Marina", {-2353.10, 2275.70, 0.00, -2153.10, 2475.70, 200.00}},
{!"Beacon Hill", {-399.60, -1075.50, -1.40, -319.00, -977.50, 198.50}},
{!"Blackfield", {964.30, 1203.20, -89.00, 1197.30, 1403.20, 110.90}},
{!"Blackfield", {964.30, 1403.20, -89.00, 1197.30, 1726.20, 110.90}},
{!"Blackfield Chapel", {1375.60, 596.30, -89.00, 1558.00, 823.20, 110.90}},
{!"Blackfield Chapel", {1325.60, 596.30, -89.00, 1375.60, 795.00, 110.90}},
{!"Blackfield Intersection", {1197.30, 1044.60, -89.00, 1277.00, 1163.30, 110.90}},
{!"Blackfield Intersection", {1166.50, 795.00, -89.00, 1375.60, 1044.60, 110.90}},
{!"Blackfield Intersection", {1277.00, 1044.60, -89.00, 1315.30, 1087.60, 110.90}},
{!"Blackfield Intersection", {1375.60, 823.20, -89.00, 1457.30, 919.40, 110.90}},
{!"Blueberry", {104.50, -220.10, 2.30, 349.60, 152.20, 200.00}},
{!"Blueberry", {19.60, -404.10, 3.80, 349.60, -220.10, 200.00}},
{!"Blueberry Acres", {-319.60, -220.10, 0.00, 104.50, 293.30, 200.00}},
{!"Caligula's Palace", {2087.30, 1543.20, -89.00, 2437.30, 1703.20, 110.90}},
{!"Caligula's Palace", {2137.40, 1703.20, -89.00, 2437.30, 1783.20, 110.90}},
{!"Calton Heights", {-2274.10, 744.10, -6.10, -1982.30, 1358.90, 200.00}},
{!"Chinatown", {-2274.10, 578.30, -7.60, -2078.60, 744.10, 200.00}},
{!"City Hall", {-2867.80, 277.40, -9.10, -2593.40, 458.40, 200.00}},
{!"Come-A-Lot", {2087.30, 943.20, -89.00, 2623.10, 1203.20, 110.90}},
{!"Commerce", {1323.90, -1842.20, -89.00, 1701.90, -1722.20, 110.90}},
{!"Commerce", {1323.90, -1722.20, -89.00, 1440.90, -1577.50, 110.90}},
{!"Commerce", {1370.80, -1577.50, -89.00, 1463.90, -1384.90, 110.90}},
{!"Commerce", {1463.90, -1577.50, -89.00, 1667.90, -1430.80, 110.90}},
{!"Commerce", {1583.50, -1722.20, -89.00, 1758.90, -1577.50, 110.90}},
{!"Commerce", {1667.90, -1577.50, -89.00, 1812.60, -1430.80, 110.90}},
{!"Conference Center", {1046.10, -1804.20, -89.00, 1323.90, -1722.20, 110.90}},
{!"Conference Center", {1073.20, -1842.20, -89.00, 1323.90, -1804.20, 110.90}},
{!"Cranberry Station", {-2007.80, 56.30, 0.00, -1922.00, 224.70, 100.00}},
{!"Creek", {2749.90, 1937.20, -89.00, 2921.60, 2669.70, 110.90}},
{!"Dillimore", {580.70, -674.80, -9.50, 861.00, -404.70, 200.00}},
{!"Doherty", {-2270.00, -324.10, -0.00, -1794.90, -222.50, 200.00}},
{!"Doherty", {-2173.00, -222.50, -0.00, -1794.90, 265.20, 200.00}},
{!"Downtown", {-1982.30, 744.10, -6.10, -1871.70, 1274.20, 200.00}},
{!"Downtown", {-1871.70, 1176.40, -4.50, -1620.30, 1274.20, 200.00}},
{!"Downtown", {-1700.00, 744.20, -6.10, -1580.00, 1176.50, 200.00}},
{!"Downtown", {-1580.00, 744.20, -6.10, -1499.80, 1025.90, 200.00}},
{!"Downtown", {-2078.60, 578.30, -7.60, -1499.80, 744.20, 200.00}},
{!"Downtown", {-1993.20, 265.20, -9.10, -1794.90, 578.30, 200.00}},
{!"Downtown Los Santos", {1463.90, -1430.80, -89.00, 1724.70, -1290.80, 110.90}},
{!"Downtown Los Santos", {1724.70, -1430.80, -89.00, 1812.60, -1250.90, 110.90}},
{!"Downtown Los Santos", {1463.90, -1290.80, -89.00, 1724.70, -1150.80, 110.90}},
{!"Downtown Los Santos", {1370.80, -1384.90, -89.00, 1463.90, -1170.80, 110.90}},
{!"Downtown Los Santos", {1724.70, -1250.90, -89.00, 1812.60, -1150.80, 110.90}},
{!"Downtown Los Santos", {1370.80, -1170.80, -89.00, 1463.90, -1130.80, 110.90}},
{!"Downtown Los Santos", {1378.30, -1130.80, -89.00, 1463.90, -1026.30, 110.90}},
{!"Downtown Los Santos", {1391.00, -1026.30, -89.00, 1463.90, -926.90, 110.90}},
{!"Downtown Los Santos", {1507.50, -1385.20, 110.90, 1582.50, -1325.30, 335.90}},
{!"East Beach", {2632.80, -1852.80, -89.00, 2959.30, -1668.10, 110.90}},
{!"East Beach", {2632.80, -1668.10, -89.00, 2747.70, -1393.40, 110.90}},
{!"East Beach", {2747.70, -1668.10, -89.00, 2959.30, -1498.60, 110.90}},
{!"East Beach", {2747.70, -1498.60, -89.00, 2959.30, -1120.00, 110.90}},
{!"East Los Santos", {2421.00, -1628.50, -89.00, 2632.80, -1454.30, 110.90}},
{!"East Los Santos", {2222.50, -1628.50, -89.00, 2421.00, -1494.00, 110.90}},
{!"East Los Santos", {2266.20, -1494.00, -89.00, 2381.60, -1372.00, 110.90}},
{!"East Los Santos", {2381.60, -1494.00, -89.00, 2421.00, -1454.30, 110.90}},
{!"East Los Santos", {2281.40, -1372.00, -89.00, 2381.60, -1135.00, 110.90}},
{!"East Los Santos", {2381.60, -1454.30, -89.00, 2462.10, -1135.00, 110.90}},
{!"East Los Santos", {2462.10, -1454.30, -89.00, 2581.70, -1135.00, 110.90}},
{!"Easter Basin", {-1794.90, 249.90, -9.10, -1242.90, 578.30, 200.00}},
{!"Easter Basin", {-1794.90, -50.00, -0.00, -1499.80, 249.90, 200.00}},
{!"Easter Bay Airport", {-1499.80, -50.00, -0.00, -1242.90, 249.90, 200.00}},
{!"Easter Bay Airport", {-1794.90, -730.10, -3.00, -1213.90, -50.00, 200.00}},
{!"Easter Bay Airport", {-1213.90, -730.10, 0.00, -1132.80, -50.00, 200.00}},
{!"Easter Bay Airport", {-1242.90, -50.00, 0.00, -1213.90, 578.30, 200.00}},
{!"Easter Bay Airport", {-1213.90, -50.00, -4.50, -947.90, 578.30, 200.00}},
{!"Easter Bay Airport", {-1315.40, -405.30, 15.40, -1264.40, -209.50, 25.40}},
{!"Easter Bay Airport", {-1354.30, -287.30, 15.40, -1315.40, -209.50, 25.40}},
{!"Easter Bay Airport", {-1490.30, -209.50, 15.40, -1264.40, -148.30, 25.40}},
{!"Easter Bay Chemicals", {-1132.80, -768.00, 0.00, -956.40, -578.10, 200.00}},
{!"Easter Bay Chemicals", {-1132.80, -787.30, 0.00, -956.40, -768.00, 200.00}},
{!"El Castillo del Diablo", {-464.50, 2217.60, 0.00, -208.50, 2580.30, 200.00}},
{!"El Castillo del Diablo", {-208.50, 2123.00, -7.60, 114.00, 2337.10, 200.00}},
{!"El Castillo del Diablo", {-208.50, 2337.10, 0.00, 8.40, 2487.10, 200.00}},
{!"El Corona", {1812.60, -2179.20, -89.00, 1970.60, -1852.80, 110.90}},
{!"El Corona", {1692.60, -2179.20, -89.00, 1812.60, -1842.20, 110.90}},
{!"El Quebrados", {-1645.20, 2498.50, 0.00, -1372.10, 2777.80, 200.00}},
{!"Esplanade East", {-1620.30, 1176.50, -4.50, -1580.00, 1274.20, 200.00}},
{!"Esplanade East", {-1580.00, 1025.90, -6.10, -1499.80, 1274.20, 200.00}},
{!"Esplanade East", {-1499.80, 578.30, -79.60, -1339.80, 1274.20, 20.30}},
{!"Esplanade North", {-2533.00, 1358.90, -4.50, -1996.60, 1501.20, 200.00}},
{!"Esplanade North", {-1996.60, 1358.90, -4.50, -1524.20, 1592.50, 200.00}},
{!"Esplanade North", {-1982.30, 1274.20, -4.50, -1524.20, 1358.90, 200.00}},
{!"Fallen Tree", {-792.20, -698.50, -5.30, -452.40, -380.00, 200.00}},
{!"Fallow Bridge", {434.30, 366.50, 0.00, 603.00, 555.60, 200.00}},
{!"Fern Ridge", {508.10, -139.20, 0.00, 1306.60, 119.50, 200.00}},
{!"Financial", {-1871.70, 744.10, -6.10, -1701.30, 1176.40, 300.00}},
{!"Fisher's Lagoon", {1916.90, -233.30, -100.00, 2131.70, 13.80, 200.00}},
{!"Flint Intersection", {-187.70, -1596.70, -89.00, 17.00, -1276.60, 110.90}},
{!"Flint Range", {-594.10, -1648.50, 0.00, -187.70, -1276.60, 200.00}},
{!"Fort Carson", {-376.20, 826.30, -3.00, 123.70, 1220.40, 200.00}},
{!"Foster Valley", {-2270.00, -430.20, -0.00, -2178.60, -324.10, 200.00}},
{!"Foster Valley", {-2178.60, -599.80, -0.00, -1794.90, -324.10, 200.00}},
{!"Foster Valley", {-2178.60, -1115.50, 0.00, -1794.90, -599.80, 200.00}},
{!"Foster Valley", {-2178.60, -1250.90, 0.00, -1794.90, -1115.50, 200.00}},
{!"Frederick Bridge", {2759.20, 296.50, 0.00, 2774.20, 594.70, 200.00}},
{!"Gant Bridge", {-2741.40, 1659.60, -6.10, -2616.40, 2175.10, 200.00}},
{!"Gant Bridge", {-2741.00, 1490.40, -6.10, -2616.40, 1659.60, 200.00}},
{!"Ganton", {2222.50, -1852.80, -89.00, 2632.80, -1722.30, 110.90}},
{!"Ganton", {2222.50, -1722.30, -89.00, 2632.80, -1628.50, 110.90}},
{!"Garcia", {-2411.20, -222.50, -0.00, -2173.00, 265.20, 200.00}},
{!"Garcia", {-2395.10, -222.50, -5.30, -2354.00, -204.70, 200.00}},
{!"Garver Bridge", {-1339.80, 828.10, -89.00, -1213.90, 1057.00, 110.90}},
{!"Garver Bridge", {-1213.90, 950.00, -89.00, -1087.90, 1178.90, 110.90}},
{!"Garver Bridge", {-1499.80, 696.40, -179.60, -1339.80, 925.30, 20.30}},
{!"Glen Park", {1812.60, -1449.60, -89.00, 1996.90, -1350.70, 110.90}},
{!"Glen Park", {1812.60, -1100.80, -89.00, 1994.30, -973.30, 110.90}},
{!"Glen Park", {1812.60, -1350.70, -89.00, 2056.80, -1100.80, 110.90}},
{!"Green Palms", {176.50, 1305.40, -3.00, 338.60, 1520.70, 200.00}},
{!"Greenglass College", {964.30, 1044.60, -89.00, 1197.30, 1203.20, 110.90}},
{!"Greenglass College", {964.30, 930.80, -89.00, 1166.50, 1044.60, 110.90}},
{!"Hampton Barns", {603.00, 264.30, 0.00, 761.90, 366.50, 200.00}},
{!"Hankypanky Point", {2576.90, 62.10, 0.00, 2759.20, 385.50, 200.00}},
{!"Harry Gold Parkway", {1777.30, 863.20, -89.00, 1817.30, 2342.80, 110.90}},
{!"Hashbury", {-2593.40, -222.50, -0.00, -2411.20, 54.70, 200.00}},
{!"Hilltop Farm", {967.30, -450.30, -3.00, 1176.70, -217.90, 200.00}},
{!"Hunter Quarry", {337.20, 710.80, -115.20, 860.50, 1031.70, 203.70}},
{!"Idlewood", {1812.60, -1852.80, -89.00, 1971.60, -1742.30, 110.90}},
{!"Idlewood", {1812.60, -1742.30, -89.00, 1951.60, -1602.30, 110.90}},
{!"Idlewood", {1951.60, -1742.30, -89.00, 2124.60, -1602.30, 110.90}},
{!"Idlewood", {1812.60, -1602.30, -89.00, 2124.60, -1449.60, 110.90}},
{!"Idlewood", {2124.60, -1742.30, -89.00, 2222.50, -1494.00, 110.90}},
{!"Idlewood", {1971.60, -1852.80, -89.00, 2222.50, -1742.30, 110.90}},
{!"Jefferson", {1996.90, -1449.60, -89.00, 2056.80, -1350.70, 110.90}},
{!"Jefferson", {2124.60, -1494.00, -89.00, 2266.20, -1449.60, 110.90}},
{!"Jefferson", {2056.80, -1372.00, -89.00, 2281.40, -1210.70, 110.90}},
{!"Jefferson", {2056.80, -1210.70, -89.00, 2185.30, -1126.30, 110.90}},
{!"Jefferson", {2185.30, -1210.70, -89.00, 2281.40, -1154.50, 110.90}},
{!"Jefferson", {2056.80, -1449.60, -89.00, 2266.20, -1372.00, 110.90}},
{!"Julius Thruway East", {2623.10, 943.20, -89.00, 2749.90, 1055.90, 110.90}},
{!"Julius Thruway East", {2685.10, 1055.90, -89.00, 2749.90, 2626.50, 110.90}},
{!"Julius Thruway East", {2536.40, 2442.50, -89.00, 2685.10, 2542.50, 110.90}},
{!"Julius Thruway East", {2625.10, 2202.70, -89.00, 2685.10, 2442.50, 110.90}},
{!"Julius Thruway North", {2498.20, 2542.50, -89.00, 2685.10, 2626.50, 110.90}},
{!"Julius Thruway North", {2237.40, 2542.50, -89.00, 2498.20, 2663.10, 110.90}},
{!"Julius Thruway North", {2121.40, 2508.20, -89.00, 2237.40, 2663.10, 110.90}},
{!"Julius Thruway North", {1938.80, 2508.20, -89.00, 2121.40, 2624.20, 110.90}},
{!"Julius Thruway North", {1534.50, 2433.20, -89.00, 1848.40, 2583.20, 110.90}},
{!"Julius Thruway North", {1848.40, 2478.40, -89.00, 1938.80, 2553.40, 110.90}},
{!"Julius Thruway North", {1704.50, 2342.80, -89.00, 1848.40, 2433.20, 110.90}},
{!"Julius Thruway North", {1377.30, 2433.20, -89.00, 1534.50, 2507.20, 110.90}},
{!"Julius Thruway South", {1457.30, 823.20, -89.00, 2377.30, 863.20, 110.90}},
{!"Julius Thruway South", {2377.30, 788.80, -89.00, 2537.30, 897.90, 110.90}},
{!"Julius Thruway West", {1197.30, 1163.30, -89.00, 1236.60, 2243.20, 110.90}},
{!"Julius Thruway West", {1236.60, 2142.80, -89.00, 1297.40, 2243.20, 110.90}},
{!"Juniper Hill", {-2533.00, 578.30, -7.60, -2274.10, 968.30, 200.00}},
{!"Juniper Hollow", {-2533.00, 968.30, -6.10, -2274.10, 1358.90, 200.00}},
{!"K.A.C.C. Military Fuels", {2498.20, 2626.50, -89.00, 2749.90, 2861.50, 110.90}},
{!"Kincaid Bridge", {-1339.80, 599.20, -89.00, -1213.90, 828.10, 110.90}},
{!"Kincaid Bridge", {-1213.90, 721.10, -89.00, -1087.90, 950.00, 110.90}},
{!"Kincaid Bridge", {-1087.90, 855.30, -89.00, -961.90, 986.20, 110.90}},
{!"King's", {-2329.30, 458.40, -7.60, -1993.20, 578.30, 200.00}},
{!"King's", {-2411.20, 265.20, -9.10, -1993.20, 373.50, 200.00}},
{!"King's", {-2253.50, 373.50, -9.10, -1993.20, 458.40, 200.00}},
{!"LVA Freight Depot", {1457.30, 863.20, -89.00, 1777.40, 1143.20, 110.90}},
{!"LVA Freight Depot", {1375.60, 919.40, -89.00, 1457.30, 1203.20, 110.90}},
{!"LVA Freight Depot", {1277.00, 1087.60, -89.00, 1375.60, 1203.20, 110.90}},
{!"LVA Freight Depot", {1315.30, 1044.60, -89.00, 1375.60, 1087.60, 110.90}},
{!"LVA Freight Depot", {1236.60, 1163.40, -89.00, 1277.00, 1203.20, 110.90}},
{!"Las Barrancas", {-926.10, 1398.70, -3.00, -719.20, 1634.60, 200.00}},
{!"Las Brujas", {-365.10, 2123.00, -3.00, -208.50, 2217.60, 200.00}},
{!"Las Colinas", {1994.30, -1100.80, -89.00, 2056.80, -920.80, 110.90}},
{!"Las Colinas", {2056.80, -1126.30, -89.00, 2126.80, -920.80, 110.90}},
{!"Las Colinas", {2185.30, -1154.50, -89.00, 2281.40, -934.40, 110.90}},
{!"Las Colinas", {2126.80, -1126.30, -89.00, 2185.30, -934.40, 110.90}},
{!"Las Colinas", {2747.70, -1120.00, -89.00, 2959.30, -945.00, 110.90}},
{!"Las Colinas", {2632.70, -1135.00, -89.00, 2747.70, -945.00, 110.90}},
{!"Las Colinas", {2281.40, -1135.00, -89.00, 2632.70, -945.00, 110.90}},
{!"Las Payasadas", {-354.30, 2580.30, 2.00, -133.60, 2816.80, 200.00}},
{!"Las Venturas Airport", {1236.60, 1203.20, -89.00, 1457.30, 1883.10, 110.90}},
{!"Las Venturas Airport", {1457.30, 1203.20, -89.00, 1777.30, 1883.10, 110.90}},
{!"Las Venturas Airport", {1457.30, 1143.20, -89.00, 1777.40, 1203.20, 110.90}},
{!"Las Venturas Airport", {1515.80, 1586.40, -12.50, 1729.90, 1714.50, 87.50}},
{!"Last Dime Motel", {1823.00, 596.30, -89.00, 1997.20, 823.20, 110.90}},
{!"Leafy Hollow", {-1166.90, -1856.00, 0.00, -815.60, -1602.00, 200.00}},
{!"Liberty City", {-1000.00, 400.00, 1300.00, -700.00, 600.00, 1400.00}},
{!"Lil' Probe Inn", {-90.20, 1286.80, -3.00, 153.80, 1554.10, 200.00}},
{!"Linden Side", {2749.90, 943.20, -89.00, 2923.30, 1198.90, 110.90}},
{!"Linden Station", {2749.90, 1198.90, -89.00, 2923.30, 1548.90, 110.90}},
{!"Linden Station", {2811.20, 1229.50, -39.50, 2861.20, 1407.50, 60.40}},
{!"Little Mexico", {1701.90, -1842.20, -89.00, 1812.60, -1722.20, 110.90}},
{!"Little Mexico", {1758.90, -1722.20, -89.00, 1812.60, -1577.50, 110.90}},
{!"Los Flores", {2581.70, -1454.30, -89.00, 2632.80, -1393.40, 110.90}},
{!"Los Flores", {2581.70, -1393.40, -89.00, 2747.70, -1135.00, 110.90}},
{!"Los Santos International", {1249.60, -2394.30, -89.00, 1852.00, -2179.20, 110.90}},
{!"Los Santos International", {1852.00, -2394.30, -89.00, 2089.00, -2179.20, 110.90}},
{!"Los Santos International", {1382.70, -2730.80, -89.00, 2201.80, -2394.30, 110.90}},
{!"Los Santos International", {1974.60, -2394.30, -39.00, 2089.00, -2256.50, 60.90}},
{!"Los Santos International", {1400.90, -2669.20, -39.00, 2189.80, -2597.20, 60.90}},
{!"Los Santos International", {2051.60, -2597.20, -39.00, 2152.40, -2394.30, 60.90}},
{!"Marina", {647.70, -1804.20, -89.00, 851.40, -1577.50, 110.90}},
{!"Marina", {647.70, -1577.50, -89.00, 807.90, -1416.20, 110.90}},
{!"Marina", {807.90, -1577.50, -89.00, 926.90, -1416.20, 110.90}},
{!"Market", {787.40, -1416.20, -89.00, 1072.60, -1310.20, 110.90}},
{!"Market", {952.60, -1310.20, -89.00, 1072.60, -1130.80, 110.90}},
{!"Market", {1072.60, -1416.20, -89.00, 1370.80, -1130.80, 110.90}},
{!"Market", {926.90, -1577.50, -89.00, 1370.80, -1416.20, 110.90}},
{!"Market Station", {787.40, -1410.90, -34.10, 866.00, -1310.20, 65.80}},
{!"Martin Bridge", {-222.10, 293.30, 0.00, -122.10, 476.40, 200.00}},
{!"Missionary Hill", {-2994.40, -811.20, 0.00, -2178.60, -430.20, 200.00}},
{!"Montgomery", {1119.50, 119.50, -3.00, 1451.40, 493.30, 200.00}},
{!"Montgomery", {1451.40, 347.40, -6.10, 1582.40, 420.80, 200.00}},
{!"Montgomery Intersection", {1546.60, 208.10, 0.00, 1745.80, 347.40, 200.00}},
{!"Montgomery Intersection", {1582.40, 347.40, 0.00, 1664.60, 401.70, 200.00}},
{!"Mulholland", {1414.00, -768.00, -89.00, 1667.60, -452.40, 110.90}},
{!"Mulholland", {1281.10, -452.40, -89.00, 1641.10, -290.90, 110.90}},
{!"Mulholland", {1269.10, -768.00, -89.00, 1414.00, -452.40, 110.90}},
{!"Mulholland", {1357.00, -926.90, -89.00, 1463.90, -768.00, 110.90}},
{!"Mulholland", {1318.10, -910.10, -89.00, 1357.00, -768.00, 110.90}},
{!"Mulholland", {1169.10, -910.10, -89.00, 1318.10, -768.00, 110.90}},
{!"Mulholland", {768.60, -954.60, -89.00, 952.60, -860.60, 110.90}},
{!"Mulholland", {687.80, -860.60, -89.00, 911.80, -768.00, 110.90}},
{!"Mulholland", {737.50, -768.00, -89.00, 1142.20, -674.80, 110.90}},
{!"Mulholland", {1096.40, -910.10, -89.00, 1169.10, -768.00, 110.90}},
{!"Mulholland", {952.60, -937.10, -89.00, 1096.40, -860.60, 110.90}},
{!"Mulholland", {911.80, -860.60, -89.00, 1096.40, -768.00, 110.90}},
{!"Mulholland", {861.00, -674.80, -89.00, 1156.50, -600.80, 110.90}},
{!"Mulholland Intersection", {1463.90, -1150.80, -89.00, 1812.60, -768.00, 110.90}},
{!"North Rock", {2285.30, -768.00, 0.00, 2770.50, -269.70, 200.00}},
{!"Ocean Docks", {2373.70, -2697.00, -89.00, 2809.20, -2330.40, 110.90}},
{!"Ocean Docks", {2201.80, -2418.30, -89.00, 2324.00, -2095.00, 110.90}},
{!"Ocean Docks", {2324.00, -2302.30, -89.00, 2703.50, -2145.10, 110.90}},
{!"Ocean Docks", {2089.00, -2394.30, -89.00, 2201.80, -2235.80, 110.90}},
{!"Ocean Docks", {2201.80, -2730.80, -89.00, 2324.00, -2418.30, 110.90}},
{!"Ocean Docks", {2703.50, -2302.30, -89.00, 2959.30, -2126.90, 110.90}},
{!"Ocean Docks", {2324.00, -2145.10, -89.00, 2703.50, -2059.20, 110.90}},
{!"Ocean Flats", {-2994.40, 277.40, -9.10, -2867.80, 458.40, 200.00}},
{!"Ocean Flats", {-2994.40, -222.50, -0.00, -2593.40, 277.40, 200.00}},
{!"Ocean Flats", {-2994.40, -430.20, -0.00, -2831.80, -222.50, 200.00}},
{!"Octane Springs", {338.60, 1228.50, 0.00, 664.30, 1655.00, 200.00}},
{!"Old Venturas Strip", {2162.30, 2012.10, -89.00, 2685.10, 2202.70, 110.90}},
{!"Palisades", {-2994.40, 458.40, -6.10, -2741.00, 1339.60, 200.00}},
{!"Palomino Creek", {2160.20, -149.00, 0.00, 2576.90, 228.30, 200.00}},
{!"Paradiso", {-2741.00, 793.40, -6.10, -2533.00, 1268.40, 200.00}},
{!"Pershing Square", {1440.90, -1722.20, -89.00, 1583.50, -1577.50, 110.90}},
{!"Pilgrim", {2437.30, 1383.20, -89.00, 2624.40, 1783.20, 110.90}},
{!"Pilgrim", {2624.40, 1383.20, -89.00, 2685.10, 1783.20, 110.90}},
{!"Pilson Intersection", {1098.30, 2243.20, -89.00, 1377.30, 2507.20, 110.90}},
{!"Pirates in Men's Pants", {1817.30, 1469.20, -89.00, 2027.40, 1703.20, 110.90}},
{!"Playa del Seville", {2703.50, -2126.90, -89.00, 2959.30, -1852.80, 110.90}},
{!"Prickle Pine", {1534.50, 2583.20, -89.00, 1848.40, 2863.20, 110.90}},
{!"Prickle Pine", {1117.40, 2507.20, -89.00, 1534.50, 2723.20, 110.90}},
{!"Prickle Pine", {1848.40, 2553.40, -89.00, 1938.80, 2863.20, 110.90}},
{!"Prickle Pine", {1938.80, 2624.20, -89.00, 2121.40, 2861.50, 110.90}},
{!"Queens", {-2533.00, 458.40, 0.00, -2329.30, 578.30, 200.00}},
{!"Queens", {-2593.40, 54.70, 0.00, -2411.20, 458.40, 200.00}},
{!"Queens", {-2411.20, 373.50, 0.00, -2253.50, 458.40, 200.00}},
{!"Randolph Industrial Estate", {1558.00, 596.30, -89.00, 1823.00, 823.20, 110.90}},
{!"Redsands East", {1817.30, 2011.80, -89.00, 2106.70, 2202.70, 110.90}},
{!"Redsands East", {1817.30, 2202.70, -89.00, 2011.90, 2342.80, 110.90}},
{!"Redsands East", {1848.40, 2342.80, -89.00, 2011.90, 2478.40, 110.90}},
{!"Redsands West", {1236.60, 1883.10, -89.00, 1777.30, 2142.80, 110.90}},
{!"Redsands West", {1297.40, 2142.80, -89.00, 1777.30, 2243.20, 110.90}},
{!"Redsands West", {1377.30, 2243.20, -89.00, 1704.50, 2433.20, 110.90}},
{!"Redsands West", {1704.50, 2243.20, -89.00, 1777.30, 2342.80, 110.90}},
{!"Regular Tom", {-405.70, 1712.80, -3.00, -276.70, 1892.70, 200.00}},
{!"Richman", {647.50, -1118.20, -89.00, 787.40, -954.60, 110.90}},
{!"Richman", {647.50, -954.60, -89.00, 768.60, -860.60, 110.90}},
{!"Richman", {225.10, -1369.60, -89.00, 334.50, -1292.00, 110.90}},
{!"Richman", {225.10, -1292.00, -89.00, 466.20, -1235.00, 110.90}},
{!"Richman", {72.60, -1404.90, -89.00, 225.10, -1235.00, 110.90}},
{!"Richman", {72.60, -1235.00, -89.00, 321.30, -1008.10, 110.90}},
{!"Richman", {321.30, -1235.00, -89.00, 647.50, -1044.00, 110.90}},
{!"Richman", {321.30, -1044.00, -89.00, 647.50, -860.60, 110.90}},
{!"Richman", {321.30, -860.60, -89.00, 687.80, -768.00, 110.90}},
{!"Richman", {321.30, -768.00, -89.00, 700.70, -674.80, 110.90}},
{!"Robada Intersection", {-1119.00, 1178.90, -89.00, -862.00, 1351.40, 110.90}},
{!"Roca Escalante", {2237.40, 2202.70, -89.00, 2536.40, 2542.50, 110.90}},
{!"Roca Escalante", {2536.40, 2202.70, -89.00, 2625.10, 2442.50, 110.90}},
{!"Rockshore East", {2537.30, 676.50, -89.00, 2902.30, 943.20, 110.90}},
{!"Rockshore West", {1997.20, 596.30, -89.00, 2377.30, 823.20, 110.90}},
{!"Rockshore West", {2377.30, 596.30, -89.00, 2537.30, 788.80, 110.90}},
{!"Rodeo", {72.60, -1684.60, -89.00, 225.10, -1544.10, 110.90}},
{!"Rodeo", {72.60, -1544.10, -89.00, 225.10, -1404.90, 110.90}},
{!"Rodeo", {225.10, -1684.60, -89.00, 312.80, -1501.90, 110.90}},
{!"Rodeo", {225.10, -1501.90, -89.00, 334.50, -1369.60, 110.90}},
{!"Rodeo", {334.50, -1501.90, -89.00, 422.60, -1406.00, 110.90}},
{!"Rodeo", {312.80, -1684.60, -89.00, 422.60, -1501.90, 110.90}},
{!"Rodeo", {422.60, -1684.60, -89.00, 558.00, -1570.20, 110.90}},
{!"Rodeo", {558.00, -1684.60, -89.00, 647.50, -1384.90, 110.90}},
{!"Rodeo", {466.20, -1570.20, -89.00, 558.00, -1385.00, 110.90}},
{!"Rodeo", {422.60, -1570.20, -89.00, 466.20, -1406.00, 110.90}},
{!"Rodeo", {466.20, -1385.00, -89.00, 647.50, -1235.00, 110.90}},
{!"Rodeo", {334.50, -1406.00, -89.00, 466.20, -1292.00, 110.90}},
{!"Royal Casino", {2087.30, 1383.20, -89.00, 2437.30, 1543.20, 110.90}},
{!"San Andreas Sound", {2450.30, 385.50, -100.00, 2759.20, 562.30, 200.00}},
{!"Santa Flora", {-2741.00, 458.40, -7.60, -2533.00, 793.40, 200.00}},
{!"Santa Maria Beach", {342.60, -2173.20, -89.00, 647.70, -1684.60, 110.90}},
{!"Santa Maria Beach", {72.60, -2173.20, -89.00, 342.60, -1684.60, 110.90}},
{!"Shady Cabin", {-1632.80, -2263.40, -3.00, -1601.30, -2231.70, 200.00}},
{!"Shady Creeks", {-1820.60, -2643.60, -8.00, -1226.70, -1771.60, 200.00}},
{!"Shady Creeks", {-2030.10, -2174.80, -6.10, -1820.60, -1771.60, 200.00}},
{!"Sobell Rail Yards", {2749.90, 1548.90, -89.00, 2923.30, 1937.20, 110.90}},
{!"Spinybed", {2121.40, 2663.10, -89.00, 2498.20, 2861.50, 110.90}},
{!"Starfish Casino", {2437.30, 1783.20, -89.00, 2685.10, 2012.10, 110.90}},
{!"Starfish Casino", {2437.30, 1858.10, -39.00, 2495.00, 1970.80, 60.90}},
{!"Starfish Casino", {2162.30, 1883.20, -89.00, 2437.30, 2012.10, 110.90}},
{!"Temple", {1252.30, -1130.80, -89.00, 1378.30, -1026.30, 110.90}},
{!"Temple", {1252.30, -1026.30, -89.00, 1391.00, -926.90, 110.90}},
{!"Temple", {1252.30, -926.90, -89.00, 1357.00, -910.10, 110.90}},
{!"Temple", {952.60, -1130.80, -89.00, 1096.40, -937.10, 110.90}},
{!"Temple", {1096.40, -1130.80, -89.00, 1252.30, -1026.30, 110.90}},
{!"Temple", {1096.40, -1026.30, -89.00, 1252.30, -910.10, 110.90}},
{!"The Camel's Toe", {2087.30, 1203.20, -89.00, 2640.40, 1383.20, 110.90}},
{!"The Clown's Pocket", {2162.30, 1783.20, -89.00, 2437.30, 1883.20, 110.90}},
{!"The Emerald Isle", {2011.90, 2202.70, -89.00, 2237.40, 2508.20, 110.90}},
{!"The Farm", {-1209.60, -1317.10, 114.90, -908.10, -787.30, 251.90}},
{!"The Four Dragons Casino", {1817.30, 863.20, -89.00, 2027.30, 1083.20, 110.90}},
{!"The High Roller", {1817.30, 1283.20, -89.00, 2027.30, 1469.20, 110.90}},
{!"The Mako Span", {1664.60, 401.70, 0.00, 1785.10, 567.20, 200.00}},
{!"The Panopticon", {-947.90, -304.30, -1.10, -319.60, 327.00, 200.00}},
{!"The Pink Swan", {1817.30, 1083.20, -89.00, 2027.30, 1283.20, 110.90}},
{!"The Sherman Dam", {-968.70, 1929.40, -3.00, -481.10, 2155.20, 200.00}},
{!"The Strip", {2027.40, 863.20, -89.00, 2087.30, 1703.20, 110.90}},
{!"The Strip", {2106.70, 1863.20, -89.00, 2162.30, 2202.70, 110.90}},
{!"The Strip", {2027.40, 1783.20, -89.00, 2162.30, 1863.20, 110.90}},
{!"The Strip", {2027.40, 1703.20, -89.00, 2137.40, 1783.20, 110.90}},
{!"The Visage", {1817.30, 1863.20, -89.00, 2106.70, 2011.80, 110.90}},
{!"The Visage", {1817.30, 1703.20, -89.00, 2027.40, 1863.20, 110.90}},
{!"Unity Station", {1692.60, -1971.80, -20.40, 1812.60, -1932.80, 79.50}},
{!"Valle Ocultado", {-936.60, 2611.40, 2.00, -715.90, 2847.90, 200.00}},
{!"Verdant Bluffs", {930.20, -2488.40, -89.00, 1249.60, -2006.70, 110.90}},
{!"Verdant Bluffs", {1073.20, -2006.70, -89.00, 1249.60, -1842.20, 110.90}},
{!"Verdant Bluffs", {1249.60, -2179.20, -89.00, 1692.60, -1842.20, 110.90}},
{!"Verdant Meadows", {37.00, 2337.10, -3.00, 435.90, 2677.90, 200.00}},
{!"Verona Beach", {647.70, -2173.20, -89.00, 930.20, -1804.20, 110.90}},
{!"Verona Beach", {930.20, -2006.70, -89.00, 1073.20, -1804.20, 110.90}},
{!"Verona Beach", {851.40, -1804.20, -89.00, 1046.10, -1577.50, 110.90}},
{!"Verona Beach", {1161.50, -1722.20, -89.00, 1323.90, -1577.50, 110.90}},
{!"Verona Beach", {1046.10, -1722.20, -89.00, 1161.50, -1577.50, 110.90}},
{!"Vinewood", {787.40, -1310.20, -89.00, 952.60, -1130.80, 110.90}},
{!"Vinewood", {787.40, -1130.80, -89.00, 952.60, -954.60, 110.90}},
{!"Vinewood", {647.50, -1227.20, -89.00, 787.40, -1118.20, 110.90}},
{!"Vinewood", {647.70, -1416.20, -89.00, 787.40, -1227.20, 110.90}},
{!"Whitewood Estates", {883.30, 1726.20, -89.00, 1098.30, 2507.20, 110.90}},
{!"Whitewood Estates", {1098.30, 1726.20, -89.00, 1197.30, 2243.20, 110.90}},
{!"Willowfield", {1970.60, -2179.20, -89.00, 2089.00, -1852.80, 110.90}},
{!"Willowfield", {2089.00, -2235.80, -89.00, 2201.80, -1989.90, 110.90}},
{!"Willowfield", {2089.00, -1989.90, -89.00, 2324.00, -1852.80, 110.90}},
{!"Willowfield", {2201.80, -2095.00, -89.00, 2324.00, -1989.90, 110.90}},
{!"Willowfield", {2541.70, -1941.40, -89.00, 2703.50, -1852.80, 110.90}},
{!"Willowfield", {2324.00, -2059.20, -89.00, 2541.70, -1852.80, 110.90}},
{!"Willowfield", {2541.70, -2059.20, -89.00, 2703.50, -1941.40, 110.90}},
{!"Yellow Bell Station", {1377.40, 2600.40, -21.90, 1492.40, 2687.30, 78.00}},
{!"Los Santos", {44.60, -2892.90, -242.90, 2997.00, -768.00, 900.00}},
{!"Las Venturas", {869.40, 596.30, -242.90, 2997.00, 2993.80, 900.00}},
{!"Bone County", {-480.50, 596.30, -242.90, 869.40, 2993.80, 900.00}},
{!"Tierra Robada", {-2997.40, 1659.60, -242.90, -480.50, 2993.80, 900.00}},
{!"Tierra Robada", {-1213.90, 596.30, -242.90, -480.50, 1659.60, 900.00}},
{!"San Fierro", {-2997.40, -1115.50, -242.90, -1213.90, 1659.60, 900.00}},
{!"Red County", {-1213.90, -768.00, -242.90, 2997.00, 596.30, 900.00}},
{!"Flint County", {-1213.90, -2892.90, -242.90, 44.60, -768.00, 900.00}},
{!"Whetstone", {-2997.40, -2892.90, -242.90, -1213.90, -1115.50, 900.00}}
};
new
name[32] = "San Andreas";
for (new i = 0; i != sizeof(g_arrZoneData); i ++) if ((fX >= g_arrZoneData[i][e_ZoneArea][0] && fX <= g_arrZoneData[i][e_ZoneArea][3]) && (fY >= g_arrZoneData[i][e_ZoneArea][1] && fY <= g_arrZoneData[i][e_ZoneArea][4]) && (fZ >= g_arrZoneData[i][e_ZoneArea][2] && fZ <= g_arrZoneData[i][e_ZoneArea][5])) {
strunpack(name, g_arrZoneData[i][e_ZoneName]);
break;
}
return name;
}
stock Float:GetPlayerDistanceFromPlayer(playerid, targetid)
{
new
Float:x,
Float:y,
Float:z;
GetPlayerPos(targetid, x, y, z);
return GetPlayerDistanceFromPoint(playerid, x, y, z);
}
IsPlayerArmed(playerid)
{
new
weapon,
ammo;
for (new i = 0; i < 13; i ++) {
GetPlayerWeaponData(playerid, i, weapon, ammo);
if (ammo > 0) {
switch (weapon) {
case 1, 2, 4, 6, 8, 9, 15, 22..38: return 1;
}
}
}
return 0;
}
GetNearestPlayerInView(playerid, Float:distance = 2.0)
{
new
Float:fAngle,
Float:fPosX,
Float:fPosY,
Float:fPosZ;
GetPlayerFacingAngle(playerid, fAngle);
GetPlayerPos(playerid, fPosX, fPosY, fPosZ);
fPosX += distance * floatsin(-fAngle, degrees);
fPosY += distance * floatcos(-fAngle, degrees);
for (new i = 0; i < MAX_PLAYERS; i++) if (IsPlayerConnected(i) && IsPlayerInRangeOfPoint(i, 2.0, fPosX, fPosY, fPosZ)) {
return i;
}
return INVALID_PLAYER_ID;
}
PlayReloadAnimation(playerid, weaponid)
{
switch (weaponid)
{
case 22: ApplyAnimation(playerid, "COLT45", "colt45_reload", 4.0, 0, 0, 0, 0, 0);
case 23: ApplyAnimation(playerid, "SILENCED", "Silence_reload", 4.0, 0, 0, 0, 0, 0);
case 24: ApplyAnimation(playerid, "PYTHON", "python_reload", 4.0, 0, 0, 0, 0, 0);
case 25, 27: ApplyAnimation(playerid, "BUDDY", "buddy_reload", 4.0, 0, 0, 0, 0, 0);
case 26: ApplyAnimation(playerid, "COLT45", "sawnoff_reload", 4.0, 0, 0, 0, 0, 0);
case 29..31, 33, 34: ApplyAnimation(playerid, "RIFLE", "rifle_load", 4.0, 0, 0, 0, 0, 0);
case 28, 32: ApplyAnimation(playerid, "TEC", "tec_reload", 4.0, 0, 0, 0, 0, 0);
}
return 1;
}
IsWheelModel(modelid)
{
switch (modelid) {
case 1025, 1073..1085, 1096..1098: return 1;
}
return 0;
}
IsNOSCompatible(modelid)
{
switch (modelid) {
case 581, 523, 462, 521, 463, 522, 461, 448, 468, 586, 509, 481, 510, 472, 473, 493, 595, 484, 430, 453, 452, 446, 454, 590, 569, 537, 538, 570, 449: return 0;
}
return 1;
}
new const g_aLegalMods[][] = {
{400, 1024, 1021, 1020, 1019, 1018, 1013, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{401, 1145, 1144, 1143, 1142, 1020, 1019, 1017, 1013, 1007, 1006, 1005, 1004, 1003, 1001, 0000, 0000, 0000, 0000},
{404, 1021, 1020, 1019, 1017, 1016, 1013, 1007, 1002, 1000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{405, 1023, 1021, 1020, 1019, 1018, 1014, 1001, 1000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{410, 1024, 1023, 1021, 1020, 1019, 1017, 1013, 1007, 1003, 1001, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{415, 1023, 1019, 1018, 1017, 1007, 1003, 1001, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{418, 1021, 1020, 1016, 1006, 1002, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{420, 1021, 1019, 1005, 1004, 1003, 1001, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{421, 1023, 1021, 1020, 1019, 1018, 1016, 1014, 1000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{422, 1021, 1020, 1019, 1017, 1013, 1007, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{426, 1021, 1019, 1006, 1005, 1004, 1003, 1001, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{436, 1022, 1021, 1020, 1019, 1017, 1013, 1007, 1006, 1003, 1001, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{439, 1145, 1144, 1143, 1142, 1023, 1017, 1013, 1007, 1003, 1001, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{477, 1021, 1020, 1019, 1018, 1017, 1007, 1006, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{478, 1024, 1022, 1021, 1020, 1013, 1012, 1005, 1004, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{489, 1024, 1020, 1019, 1018, 1016, 1013, 1006, 1005, 1004, 1002, 1000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{491, 1145, 1144, 1143, 1142, 1023, 1021, 1020, 1019, 1018, 1017, 1014, 1007, 1003, 0000, 0000, 0000, 0000, 0000},
{492, 1016, 1006, 1005, 1004, 1000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{496, 1143, 1142, 1023, 1020, 1019, 1017, 1011, 1007, 1006, 1003, 1002, 1001, 0000, 0000, 0000, 0000, 0000, 0000},
{500, 1024, 1021, 1020, 1019, 1013, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{516, 1021, 1020, 1019, 1018, 1017, 1016, 1015, 1007, 1004, 1002, 1000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{517, 1145, 1144, 1143, 1142, 1023, 1020, 1019, 1018, 1017, 1016, 1007, 1003, 1002, 0000, 0000, 0000, 0000, 0000},
{518, 1145, 1144, 1143, 1142, 1023, 1020, 1018, 1017, 1013, 1007, 1006, 1005, 1003, 1001, 0000, 0000, 0000, 0000},
{527, 1021, 1020, 1018, 1017, 1015, 1014, 1007, 1001, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{529, 1023, 1020, 1019, 1018, 1017, 1012, 1011, 1007, 1006, 1003, 1001, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{534, 1185, 1180, 1179, 1178, 1127, 1126, 1125, 1124, 1123, 1122, 1106, 1101, 1100, 0000, 0000, 0000, 0000, 0000},
{535, 1121, 1120, 1119, 1118, 1117, 1116, 1115, 1114, 1113, 1110, 1109, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{536, 1184, 1183, 1182, 1181, 1128, 1108, 1107, 1105, 1104, 1103, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{540, 1145, 1144, 1143, 1142, 1024, 1023, 1020, 1019, 1018, 1017, 1007, 1006, 1004, 1001, 0000, 0000, 0000, 0000},
{542, 1145, 1144, 1021, 1020, 1019, 1018, 1015, 1014, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{546, 1145, 1144, 1143, 1142, 1024, 1023, 1019, 1018, 1017, 1007, 1006, 1004, 1002, 1001, 0000, 0000, 0000, 0000},
{547, 1143, 1142, 1021, 1020, 1019, 1018, 1016, 1003, 1000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{549, 1145, 1144, 1143, 1142, 1023, 1020, 1019, 1018, 1017, 1012, 1011, 1007, 1003, 1001, 0000, 0000, 0000, 0000},
{550, 1145, 1144, 1143, 1142, 1023, 1020, 1019, 1018, 1006, 1005, 1004, 1003, 1001, 0000, 0000, 0000, 0000, 0000},
{551, 1023, 1021, 1020, 1019, 1018, 1016, 1006, 1005, 1003, 1002, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{558, 1168, 1167, 1166, 1165, 1164, 1163, 1095, 1094, 1093, 1092, 1091, 1090, 1089, 1088, 0000, 0000, 0000, 0000},
{559, 1173, 1162, 1161, 1160, 1159, 1158, 1072, 1071, 1070, 1069, 1068, 1067, 1066, 1065, 0000, 0000, 0000, 0000},
{560, 1170, 1169, 1141, 1140, 1139, 1138, 1033, 1032, 1031, 1030, 1029, 1028, 1027, 1026, 0000, 0000, 0000, 0000},
{561, 1157, 1156, 1155, 1154, 1064, 1063, 1062, 1061, 1060, 1059, 1058, 1057, 1056, 1055, 1031, 1030, 1027, 1026},
{562, 1172, 1171, 1149, 1148, 1147, 1146, 1041, 1040, 1039, 1038, 1037, 1036, 1035, 1034, 0000, 0000, 0000, 0000},
{565, 1153, 1152, 1151, 1150, 1054, 1053, 1052, 1051, 1050, 1049, 1048, 1047, 1046, 1045, 0000, 0000, 0000, 0000},
{567, 1189, 1188, 1187, 1186, 1133, 1132, 1131, 1130, 1129, 1102, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{575, 1177, 1176, 1175, 1174, 1099, 1044, 1043, 1042, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{576, 1193, 1192, 1191, 1190, 1137, 1136, 1135, 1134, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{580, 1023, 1020, 1018, 1017, 1007, 1006, 1001, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{589, 1145, 1144, 1024, 1020, 1018, 1017, 1016, 1013, 1007, 1006, 1005, 1004, 1000, 0000, 0000, 0000, 0000, 0000},
{600, 1022, 1020, 1018, 1017, 1013, 1007, 1006, 1005, 1004, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000},
{603, 1145, 1144, 1143, 1142, 1024, 1023, 1020, 1019, 1018, 1017, 1007, 1006, 1001, 0000, 0000, 0000, 0000, 0000}
};
IsLegalComponent(modelid, componentid)
{
if (IsWheelModel(componentid) || (1086 <= componentid <= 1087) || (componentid >= 1008 && componentid <= 1010))
{
if (!IsNOSCompatible(modelid))
return 1;
}
else
{
for (new i = 0; i < sizeof(g_aLegalMods); i ++)
{
if (g_aLegalMods[i][0] != modelid)
continue;
else for (new l = 1; l < 22; l ++) if (g_aLegalMods[i][l] == componentid) {
return 1;
}
}
}
return 0;
}
IsWeaponModel(model) {
new const g_aWeaponModels[] = {
0, 331, 333, 334, 335, 336, 337, 338, 339, 341, 321, 322, 323, 324,
325, 326, 342, 343, 344, 0, 0, 0, 346, 347, 348, 349, 350, 351, 352,
353, 355, 356, 372, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366,
367, 368, 368, 371
};
for (new i = 0; i < sizeof(g_aWeaponModels); i ++) if (g_aWeaponModels[i] == model) {
return 1;
}
return 0;
}
GetWeaponModel(weaponid) {
new const g_aWeaponModels[] = {
0, 331, 333, 334, 335, 336, 337, 338, 339, 341, 321, 322, 323, 324,
325, 326, 342, 343, 344, 0, 0, 0, 346, 347, 348, 349, 350, 351, 352,
353, 355, 356, 372, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366,
367, 368, 368, 371
};
if (1 <= weaponid <= 46)
return g_aWeaponModels[weaponid];
return 0;
}
IsVehicleSeatUsed(vehicleid, seat)
{
for (new i = 0; i < MAX_PLAYERS; i++) if (IsPlayerConnected(i) && IsPlayerInVehicle(i, vehicleid) && GetPlayerVehicleSeat(i) == seat) {
return 1;
}
return 0;
}
RemoveFromVehicle(playerid)
{
if (IsPlayerInAnyVehicle(playerid))
{
static
Float:fX,
Float:fY,
Float:fZ;
GetPlayerPos(playerid, fX, fY, fZ);
SetPlayerPos(playerid, fX, fY, fZ + 1.5);
}
return 1;
}
GetAvailableSeat(vehicleid, start = 1)
{
new seats = GetVehicleMaxSeats(vehicleid);
for (new i = start; i < seats; i ++) if (!IsVehicleSeatUsed(vehicleid, i)) {
return i;
}
return -1;
}
GetVehicleFromBehind(vehicleid)
{
static
Float:fCoords[7];
GetVehiclePos(vehicleid, fCoords[0], fCoords[1], fCoords[2]);
GetVehicleZAngle(vehicleid, fCoords[3]);
for (new i = 1; i != MAX_VEHICLES; i ++) if (i != vehicleid && GetVehiclePos(i, fCoords[4], fCoords[5], fCoords[6]))
{
if (floatabs(fCoords[0] - fCoords[4]) < 6 && floatabs(fCoords[1] - fCoords[5]) < 6 && floatabs(fCoords[2] - fCoords[6]) < 6)
return i;
}
return INVALID_VEHICLE_ID;
}
GetVehicleBoot(vehicleid, &Float:x, &Float:y, &Float:z)
{
if (!GetVehicleModel(vehicleid) || vehicleid == INVALID_VEHICLE_ID)
return (x = 0.0, y = 0.0, z = 0.0), 0;
static
Float:pos[7]
;
GetVehicleModelInfo(GetVehicleModel(vehicleid), VEHICLE_MODEL_INFO_SIZE, pos[0], pos[1], pos[2]);
GetVehiclePos(vehicleid, pos[3], pos[4], pos[5]);
GetVehicleZAngle(vehicleid, pos[6]);
x = pos[3] - (floatsqroot(pos[1] + pos[1]) * floatsin(-pos[6], degrees));
y = pos[4] - (floatsqroot(pos[1] + pos[1]) * floatcos(-pos[6], degrees));
z = pos[5];
return 1;
}
GetVehicleHood(vehicleid, &Float:x, &Float:y, &Float:z)
{
if (!GetVehicleModel(vehicleid) || vehicleid == INVALID_VEHICLE_ID)
return (x = 0.0, y = 0.0, z = 0.0), 0;
static
Float:pos[7]
;
GetVehicleModelInfo(GetVehicleModel(vehicleid), VEHICLE_MODEL_INFO_SIZE, pos[0], pos[1], pos[2]);
GetVehiclePos(vehicleid, pos[3], pos[4], pos[5]);
GetVehicleZAngle(vehicleid, pos[6]);
x = pos[3] + (floatsqroot(pos[1] + pos[1]) * floatsin(-pos[6], degrees));
y = pos[4] + (floatsqroot(pos[1] + pos[1]) * floatcos(-pos[6], degrees));
z = pos[5];
return 1;
}
RemoveAlpha(color) {
return (color & ~0xFF);
}
FormatNumber(number, prefix[] = "$")
{
static
value[32],
length;
format(value, sizeof(value), "%d", (number < 0) ? (-number) : (number));
if ((length = strlen(value)) > 3)
{
for (new i = length, l = 0; --i >= 0; l ++) {
if ((l > 0) && (l % 3 == 0)) strins(value, ",", i + 1);
}
}
if (prefix[0] != 0)
strins(value, prefix, 0);
if (number < 0)
strins(value, "-", 0);
return value;
}
IsValidPlayerName(const str[])
{
if (!str[0] || str[0] == '\1')
return 0;
for (new i = 0, l = strlen(str); i != l; i ++)
{
if ((str[i] >= '0' && str[i] <= '9') || (str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z'))
continue;
if (str[i] == '_' || str[i] == '$' || str[i] == '@' || str[i] == '[' || str[i] == ']')
continue;
else
return 0;
}
return 1;
}
IsAnIP(str[])
{
if (!str[0] || str[0] == '\1')
return 0;
for (new i = 0, l = strlen(str); i != l; i ++)
{
if ((str[i] < '0' || str[i] > '9') && str[i] != '.')
return 0;
if (0 < ((i == 0) ? (strval(str)) : (strval(str[i + 1]))) > 255)
return 0;
}
return 1;
}
IsPlayerIdle(playerid) {
new
index = GetPlayerAnimationIndex(playerid);
return ((index == 1275) || (1181 <= index <= 1192));
}
IsPlayerNearDynamicObject(playerid, objectid, Float:range = 5.0) {
static
Float:fX,
Float:fY,
Float:fZ;
GetDynamicObjectPos(objectid, fX, fY, fZ);
return (IsPlayerInRangeOfPoint(playerid, range, fX, fY, fZ));
}
GetVehicleMaxSeats(vehicleid)
{
static const g_arrMaxSeats[] = {
4, 2, 2, 2, 4, 4, 1, 2, 2, 4, 2, 2, 2, 4, 2, 2, 4, 2, 4, 2, 4, 4, 2, 2, 2, 1, 4, 4, 4, 2,
1, 7, 1, 2, 2, 0, 2, 7, 4, 2, 4, 1, 2, 2, 2, 4, 1, 2, 1, 0, 0, 2, 1, 1, 1, 2, 2, 2, 4, 4,
2, 2, 2, 2, 1, 1, 4, 4, 2, 2, 4, 2, 1, 1, 2, 2, 1, 2, 2, 4, 2, 1, 4, 3, 1, 1, 1, 4, 2, 2,
4, 2, 4, 1, 2, 2, 2, 4, 4, 2, 2, 1, 2, 2, 2, 2, 2, 4, 2, 1, 1, 2, 1, 1, 2, 2, 4, 2, 2, 1,
1, 2, 2, 2, 2, 2, 2, 2, 2, 4, 1, 1, 1, 2, 2, 2, 2, 7, 7, 1, 4, 2, 2, 2, 2, 2, 4, 4, 2, 2,
4, 4, 2, 1, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 1, 2, 4, 4, 1, 0, 0, 1, 1, 2, 1, 2, 2, 1, 2, 4,
4, 2, 4, 1, 0, 4, 2, 2, 2, 2, 0, 0, 7, 2, 2, 1, 4, 4, 4, 2, 2, 2, 2, 2, 4, 2, 0, 0, 0, 4,
0, 0
};
new
model = GetVehicleModel(vehicleid);
if (400 <= model <= 611)
return g_arrMaxSeats[model - 400];
return 0;
}
GetNearestVehicle(playerid)
{
static
Float:fX,
Float:fY,
Float:fZ;
for (new i = 1; i != MAX_VEHICLES; i ++) if (IsValidVehicle(i) && GetVehiclePos(i, fX, fY, fZ))
{
if (IsPlayerInRangeOfPoint(playerid, 3.5, fX, fY, fZ)) return i;
}
return INVALID_VEHICLE_ID;
}
IsPlayerNearPlayer(playerid, targetid, Float:radius)
{
static
Float:fX,
Float:fY,
Float:fZ;
GetPlayerPos(targetid, fX, fY, fZ);
return (GetPlayerInterior(playerid) == GetPlayerInterior(targetid) && GetPlayerVirtualWorld(playerid) == GetPlayerVirtualWorld(targetid)) && IsPlayerInRangeOfPoint(playerid, radius, fX, fY, fZ);
}
IsPlayerNearBoot(playerid, vehicleid)
{
static
Float:fX,
Float:fY,
Float:fZ;
GetVehicleBoot(vehicleid, fX, fY, fZ);
return (GetPlayerVirtualWorld(playerid) == GetVehicleVirtualWorld(vehicleid)) && IsPlayerInRangeOfPoint(playerid, 3.5, fX, fY, fZ);
}
IsPlayerNearHood(playerid, vehicleid)
{
static
Float:fX,
Float:fY,
Float:fZ;
GetVehicleHood(vehicleid, fX, fY, fZ);
return (GetPlayerVirtualWorld(playerid) == GetVehicleVirtualWorld(vehicleid)) && IsPlayerInRangeOfPoint(playerid, 3.0, fX, fY, fZ);
}
Log_Write(const path[], const str[], {Float,_}:...)
{
static
args,
start,
end,
File:file,
string[1024]
;
if ((start = strfind(path, "/")) != -1) {
strmid(string, path, 0, start + 1);
if (!fexist(string))
return printf("** Warning: Directory \"%s\" doesn't exist.", string);
}
#emit LOAD.S.pri 8
#emit STOR.pri args
file = fopen(path, io_append);
if (!file)
return 0;
if (args > 8)
{
#emit ADDR.pri str
#emit STOR.pri start
for (end = start + (args - 8); end > start; end -= 4)
{
#emit LREF.pri end
#emit PUSH.pri
}
#emit PUSH.S str
#emit PUSH.C 1024
#emit PUSH.C string
#emit PUSH.C args
#emit SYSREQ.C format
fwrite(file, string);
fwrite(file, "\r\n");
fclose(file);
#emit LCTRL 5
#emit SCTRL 4
#emit RETN
}
fwrite(file, str);
fwrite(file, "\r\n");
fclose(file);
return 1;
}
IsValidRoleplayName(const name[]) {
if (!name[0] || strfind(name, "_") == -1)
return 0;
else for (new i = 0, len = strlen(name); i != len; i ++) {
if ((i == 0) && (name[i] < 'A' || name[i] > 'Z'))
return 0;
else if ((i != 0 && i < len && name[i] == '_') && (name[i + 1] < 'A' || name[i + 1] > 'Z'))
return 0;
else if ((name[i] < 'A' || name[i] > 'Z') && (name[i] < 'a' || name[i] > 'z') && name[i] != '_' && name[i] != '.')
return 0;
}
return 1;
}
IsNumeric(const str[])
{
for (new i = 0, l = strlen(str); i != l; i ++)
{
if (i == 0 && str[0] == '-')
continue;
else if (str[i] < '0' || str[i] > '9')
return 0;
}
return 1;
}
ReturnWeaponName(weaponid)
{
static
name[32];
GetWeaponName(weaponid, name, sizeof(name));
if (!weaponid)
name = "None";
else if (weaponid == 18)
name = "Molotov Cocktail";
else if (weaponid == 44)
name = "Nightvision";
else if (weaponid == 45)
name = "Infrared";
return name;
}
new stock g_arrVehicleNames[][] = {
"Landstalker", "Bravura", "Buffalo", "Linerunner", "Perrenial", "Sentinel", "Dumper", "Firetruck", "Trashmaster",
"Stretch", "Manana", "Infernus", "Voodoo", "Pony", "Mule", "Cheetah", "Ambulance", "Leviathan", "Moonbeam",
"Esperanto", "Taxi", "Washington", "Bobcat", "Whoopee", "BF Injection", "Hunter", "Premier", "Enforcer",
"Securicar", "Banshee", "Predator", "Bus", "Rhino", "Barracks", "Hotknife", "Trailer", "Previon", "Coach",
"Cabbie", "Stallion", "Rumpo", "RC Bandit", "Romero", "Packer", "Monster", "Admiral", "Squalo", "Seasparrow",
"Pizzaboy", "Tram", "Trailer", "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", "ZR-350", "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 A", "Hotring Racer B", "Bloodring Banger", "Rancher",
"Super GT", "Elegant", "Journey", "Bike", "Mountain Bike", "Beagle", "Cropduster", "Stunt", "Tanker", "Roadtrain",
"Nebula", "Majestic", "Buccaneer", "Shamal", "Hydra", "FCR-900", "NRG-500", "HPV1000", "Cement Truck", "Tow Truck",
"Fortune", "Cadrona", "SWAT Truck", "Willard", "Forklift", "Tractor", "Combine", "Feltzer", "Remington", "Slamvan",
"Blade", "Streak", "Freight", "Vortex", "Vincent", "Bullet", "Clover", "Sadler", "Firetruck", "Hustler", "Intruder",
"Primo", "Cargobob", "Tampa", "Sunrise", "Merit", "Utility", "Nevada", "Yosemite", "Windsor", "Monster", "Monster",
"Uranus", "Jester", "Sultan", "Stratum", "Elegy", "Raindance", "RC Tiger", "Flash", "Tahoma", "Savanna", "Bandito",
"Freight Flat", "Streak Carriage", "Kart", "Mower", "Dune", "Sweeper", "Broadway", "Tornado", "AT-400", "DFT-30",
"Huntley", "Stafford", "BF-400", "News Van", "Tug", "Trailer", "Emperor", "Wayfarer", "Euros", "Hotdog", "Club",
"Freight Box", "Trailer", "Andromada", "Dodo", "RC Cam", "Launch", "LSPD Car", "SFPD Car", "LVPD Car",
"Police Rancher", "Picador", "S.W.A.T", "Alpha", "Phoenix", "Glendale", "Sadler", "Luggage", "Luggage", "Stairs",
"Boxville", "Tiller", "Utility Trailer"
};
ReturnVehicleModelName(model)
{
new
name[32] = "None";
if (model < 400 || model > 611)
return name;
format(name, sizeof(name), g_arrVehicleNames[model - 400]);
return name;
}
ReturnVehicleName(vehicleid)
{
new
model = GetVehicleModel(vehicleid),
name[32] = "None";
if (model < 400 || model > 611)
return name;
format(name, sizeof(name), g_arrVehicleNames[model - 400]);
return name;
}
GetVehicleModelByName(const name[])
{
if (IsNumeric(name) && (strval(name) >= 400 && strval(name) <= 611))
return strval(name);
for (new i = 0; i < sizeof(g_arrVehicleNames); i ++)
{
if (strfind(g_arrVehicleNames[i], name, true) != -1)
{
return i + 400;
}
}
return 0;
}
GetVehicleDriver(vehicleid) {
for (new i = 0; i < MAX_PLAYERS; i++) if (IsPlayerConnected(i)) {
if (GetPlayerState(i) == PLAYER_STATE_DRIVER && GetPlayerVehicleID(i) == vehicleid) return i;
}
return INVALID_PLAYER_ID;
}
IsWindowedVehicle(vehicleid)
{
static const g_aWindowStatus[] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1,
1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1,
1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1,
1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1,
1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0
};
new modelid = GetVehicleModel(vehicleid);
if (modelid < 400 || modelid > 611)
return 0;
return (g_aWindowStatus[modelid - 400]);
}
IsNewsVehicle(vehicleid)
{
switch (GetVehicleModel(vehicleid)) {
case 488, 582: return 1;
}
return 0;
}
IsACruiser(vehicleid)
{
switch (GetVehicleModel(vehicleid)) {
case 523, 427, 490, 528, 596..599, 601: return 1;
}
return 0;
}
IsDoorVehicle(vehicleid)
{
switch (GetVehicleModel(vehicleid)) {
case 400..424, 426..429, 431..440, 442..445, 451, 455, 456, 458, 459, 466, 467, 470, 474, 475:
return 1;
case 477..480, 482, 483, 486, 489, 490..492, 494..496, 498..500, 502..508, 514..518, 524..529, 533..536:
return 1;
case 540..547, 549..552, 554..562, 565..568, 573, 575, 576, 578..580, 582, 585, 587..589, 596..605, 609:
return 1;
}
return 0;
}
IsLoadableVehicle(vehicleid)
{
new modelid = GetVehicleModel(vehicleid);
if (GetVehicleTrailer(vehicleid))
modelid = GetVehicleModel(GetVehicleTrailer(vehicleid));
switch (modelid) {
case 609, 403, 414, 456, 498, 499, 514, 515, 435, 591: return 1;
}
return 0;
}
IsABoat(vehicleid)
{
switch (GetVehicleModel(vehicleid)) {
case 430, 446, 452, 453, 454, 472, 473, 484, 493, 595: return 1;
}
return 0;
}
IsABike(vehicleid)
{
switch (GetVehicleModel(vehicleid)) {
case 448, 461..463, 468, 521..523, 581, 586, 481, 509, 510: return 1;
}
return 0;
}
IsAPlane(vehicleid)
{
switch (GetVehicleModel(vehicleid)) {
case 460, 464, 476, 511, 512, 513, 519, 520, 553, 577, 592, 593: return 1;
}
return 0;
}
IsAHelicopter(vehicleid)
{
switch (GetVehicleModel(vehicleid)) {
case 417, 425, 447, 465, 469, 487, 488, 497, 501, 548, 563: return 1;
}
return 0;
}
IsEngineVehicle(vehicleid)
{
static const g_aEngineStatus[] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0
};
new modelid = GetVehicleModel(vehicleid);
if (modelid < 400 || modelid > 611)
return 0;
return (g_aEngineStatus[modelid - 400]);
}
GetElapsedTime(time, &hours, &minutes, &seconds)
{
hours = 0;
minutes = 0;
seconds = 0;
if (time >= 3600)
{
hours = (time / 3600);
time -= (hours * 3600);
}
while (time >= 60)
{
minutes++;
time -= 60;
}
return (seconds = time);
}
GetDuration(time)
{
new
str[32];
if (time < 0 || time == gettime()) {
format(str, sizeof(str), "Never");
return str;
}
else if (time < 60)
format(str, sizeof(str), "%d seconds", time);
else if (time >= 0 && time < 60)
format(str, sizeof(str), "%d seconds", time);
else if (time >= 60 && time < 3600)
format(str, sizeof(str), (time >= 120) ? ("%d minutes") : ("%d minute"), time / 60);
else if (time >= 3600 && time < 86400)
format(str, sizeof(str), (time >= 7200) ? ("%d hours") : ("%d hour"), time / 3600);
else if (time >= 86400 && time < 2592000)
format(str, sizeof(str), (time >= 172800) ? ("%d days") : ("%d day"), time / 86400);
else if (time >= 2592000 && time < 31536000)
format(str, sizeof(str), (time >= 5184000) ? ("%d months") : ("%d month"), time / 2592000);
else if (time >= 31536000)
format(str, sizeof(str), (time >= 63072000) ? ("%d years") : ("%d year"), time / 31536000);
strcat(str, " ago");
return str;
}
GetEngineStatus(vehicleid)
{
static
engine,
lights,
alarm,
doors,
bonnet,
boot,
objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if (engine != 1)
return 0;
return 1;
}
GetHoodStatus(vehicleid)
{
static
engine,
lights,
alarm,
doors,
bonnet,
boot,
objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if (bonnet != 1)
return 0;
return 1;
}
GetTrunkStatus(vehicleid)
{
static
engine,
lights,
alarm,
doors,
bonnet,
boot,
objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if (boot != 1)
return 0;
return 1;
}
GetLightStatus(vehicleid)
{
static
engine,
lights,
alarm,
doors,
bonnet,
boot,
objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if (lights != 1)
return 0;
return 1;
}
SetEngineStatus(vehicleid, status)
{
static
engine,
lights,
alarm,
doors,
bonnet,
boot,
objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
return SetVehicleParamsEx(vehicleid, status, lights, alarm, doors, bonnet, boot, objective);
}
SetLightStatus(vehicleid, status)
{
static
engine,
lights,
alarm,
doors,
bonnet,
boot,
objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
return SetVehicleParamsEx(vehicleid, engine, status, alarm, doors, bonnet, boot, objective);
}
SetTrunkStatus(vehicleid, status)
{
static
engine,
lights,
alarm,
doors,
bonnet,
boot,
objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
return SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, status, objective);
}
SetHoodStatus(vehicleid, status)
{
static
engine,
lights,
alarm,
doors,
bonnet,
boot,
objective;
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
return SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, status, boot, objective);
}
static const SkinModelNames[][] = { "cj", "truth", "maccer", "andre", "bbthin", "bb", "emmet", "male01", "janitor", "bfori", "bfost", "vbfycrp", "bfyri", "bfyst", "bmori", "bmost", "bmyap", "bmybu", "bmybe", "bmydj", "bmyri", "bmycr", "bmyst", "wmybmx", "wbdyg1", "wbdyg2", "wmybp", "wmycon", "bmydrug", "wmydrug", "hmydrug", "dwfolc", "dwmolc1", "dwmolc2", "dwmylc1", "hmogar", "wmygol1", "wmygol2", "hfori", "hfost", "hfyri", "hfyst", "jethro", "hmori", "hmost", "hmybe", "hmyri", "hmycr", "hmyst", "omokung", "wmymech", "bmymoun", "wmymoun", "ofori", "ofost", "ofyri", "ofyst", "omori", "omost", "omyri", "omyst", "wmyplt", "wmopj", "bfypro", "hfypro", "kendl", "bmypol1", "bmypol2", "wmoprea", "sbfyst", "wmosci", "wmysgrd", "swmyhp1", "swmyhp2", "", "swfopro", "wfystew", "swmotr1", "wmotr1", "bmotr1", "vbmybox", "vwmybox", "vhmyelv", "vbmyelv", "vimyelv", "vwfypro", "ryder3", "vwfyst1", "wfori", "wfost", "wfyjg", "wfyri", "wfyro", "wfyst", "wmori", "wmost", "wmyjg", "wmylg", "wmyri", "wmyro", "wmycr", "wmyst", "ballas1", "ballas2", "ballas3", "fam1", "fam2", "fam3", "lsv1", "lsv2", "lsv3", "maffa", "maffb", "mafboss", "vla1", "vla2", "vla3", "triada", "triadb", "sindaco", "triboss", "dnb1", "dnb2", "dnb3", "vmaff1", "vmaff2", "vmaff3", "vmaff4", "dnmylc", "dnfolc1", "dnfolc2", "dnfylc", "dnmolc1", "dnmolc2", "sbmotr2", "swmotr2", "sbmytr3", "swmotr3", "wfybe", "bfybe", "hfybe", "sofybu", "sbmyst", "sbmycr", "bmycg", "wfycrk", "hmycm", "wmybu", "bfybu", "smokev", "wfybu", "dwfylc1", "wfypro", "wmyconb", "wmybe", "wmypizz", "bmobar", "cwfyhb", "cwmofr", "cwmohb1", "cwmohb2", "cwmyfr", "cwmyhb1", "bmyboun", "wmyboun", "wmomib", "bmymib", "wmybell", "bmochil", "sofyri", "somyst", "vwmybjd", "vwfycrp", "sfr1", "sfr2", "sfr3", "bmybar", "wmybar", "wfysex", "wmyammo", "bmytatt", "vwmycr", "vbmocd", "vbmycr", "vhmycr", "sbmyri", "somyri", "somybu", "swmyst", "wmyva", "copgrl3", "gungrl3", "mecgrl3", "nurgrl3", "crogrl3", "gangrl3", "cwfofr", "cwfohb", "cwfyfr1", "cwfyfr2", "cwmyhb2", "dwfylc2", "dwmylc2", "omykara", "wmykara", "wfyburg", "vwmycd", "vhfypro", "suzie", "omonood", "omoboat", "wfyclot", "vwmotr1", "vwmotr2", "vwfywai", "sbfori", "swfyri", "wmyclot", "sbfost", "sbfyri", "sbmocd", "sbmori", "sbmost", "shmycr", "sofori", "sofost", "sofyst", "somobu", "somori", "somost", "swmotr5", "swfori", "swfost", "swfyst", "swmocd", "swmori", "swmost", "shfypro", "sbfypro", "swmotr4", "swmyri", "smyst", "smyst2", "sfypro", "vbfyst2", "vbfypro", "vhfyst3", "bikera", "bikerb", "bmypimp", "swmycr", "wfylg", "wmyva2", "bmosec", "bikdrug", "wmych", "sbfystr", "swfystr", "heck1", "heck2", "bmycon", "wmycd1", "bmocd", "vwfywa2", "wmoice", "tenpen", "pulaski", "hern", "dwayne", "smoke", "sweet", "ryder", "forelli", "tbone", "laemt1", "lvemt1", "sfemt1", "lafd1", "lvfd1", "sffd1", "lapd1", "sfpd1", "lvpd1", "csher", "lapdm1", "swat", "fbi", "army", "dsher", "zero", "rose", "paul", "cesar", "ogloc", "wuzimu", "torino", "jizzy", "maddogg", "cat", "claude", "lapdna", "sfpdna", "lvpdna", "lapdpc", "lapdpd", "lvpdpc", "wfyclpd", "vbfycpd", "wfyclem", "wfycllv", "csherna", "dsherna" }; stock GetSkinModelName(skinid, name[], namesize) { if(-1 < skinid < 312) { memcpy(name, SkinModelNames[skinid], 0, namesize * 4, namesize); return 1; } return 0; }
forward OnPlayerFullyConnect(playerid);
public OnPlayerConnect(playerid)
SetTimerEx("OnPlayerFullyConnect", 0001, false, "i", playerid);
public OnPlayerFullyConnect(playerid) {
..
}
GetNearestPlayer(playerid)
{
if(!IsPlayerConnected(playerid)) return 0;
static Float:x,
Float:y,
Float:z;
new Float:distance = 999.1,
player = playerid;
for(new i=1; i<MAX_VEHICLES; i++)
{
GetPlayerPos(i, x, y, z);
if(GetPlayerDistanceFromPoint(playerid, x, y, z) > distance) continue;
else distance = GetPlayerDistanceFromPoint(playerid, x, y, z), player = i;
}
return player == playerid ? -1 : player;
}
IsARPName(const playername[MAX_PLAYER_NAME])
{
if(strfind(playername, "_", true) == -1) return false;
new psize = strlen(playername);
for(new i; i < psize; i++)
{
if(playername[i] == '_') continue;
if('A' > playername[i] || playername[i] > 'Z' && playername[i] < 'a' || playername[i] > 'z') return false;
}
return true;
}
ErrorMessage(playerid, const msg[], va_args<>)
{
static strinng[200], second[100];
format(second, sizeof(second), "[Error] {FF0000}%s", msg);
va_format(strinng, sizeof(strinng), second, va_start<2>);
return SendClientMessage(playerid, 0xCC0000FF, strinng);
}
GetName(playerid)
{
static str[MAX_PLAYER_NAME];
GetPlayerName(playerid, str, sizeof(str));
return str;
}
SCMF(playerid, couleur, const msg[], va_args<>)
{
static
string[145];
va_format(string, sizeof(string), msg, va_start<3>);
return SendClientMessage(playerid, couleur, string);
}
SendClientMessageToAllEx(color, const message[], va_args<>)
{
static msg[190];
va_format(msg, sizeof(msg), message, va_start<2>);
return SendClientMessageToAll(color, msg);
}
OnPlayerFullyConnect
Now, there is OnPlayerConnect, but that calls on the second connection, not the third where "Connected to: name.", That's when the server can handle the connections with the client such as dialogs responses etc, this will also work with InterpolateCamera PHP Code:
|
SecondToTime(seconds)
{
new string[40], minutes, hours, newseconds = seconds;
while(newseconds>=60){newseconds-=60,minutes++;}
while(minutes>=60){minutes-=60,hours++;}
format(string, sizeof(string), "%02dHour%s : %02dMinute%s : %02dSecond%s", hours, (hours > 1)?("s"):(""), minutes, (minutes>1)?("s"):(""), newseconds, (newseconds>1)?("s"):(""));
//debug printf("[converter] %d seconds are %02d hours and %02d minutes and %02d seconds", seconds, hours, minutes, newseconds);
return string;
}
stock ReturnTimelapse(start, till)
{
new seconds = till - start;
const MINUTE = 60;
const HOUR = 60 * MINUTE;
const DAY = 24 * HOUR;
const MONTH = 30 * DAY;
new time[32];
if (seconds == 1)
format(time, sizeof (time), "A seconds ago");
if (seconds < (1 * MINUTE))
format(time, sizeof (time), "%i seconds ago", seconds);
else if (seconds < (2 * MINUTE))
format(time, sizeof (time), "A minute ago");
else if (seconds < (45 * MINUTE))
format(time, sizeof (time), "%i minutes ago", (seconds / MINUTE));
else if (seconds < (90 * MINUTE))
format(time, sizeof (time), "An hour ago");
else if (seconds < (24 * HOUR))
format(time, sizeof (time), "%i hours ago", (seconds / HOUR));
else if (seconds < (48 * HOUR))
format(time, sizeof (time), "Yesterday");
else if (seconds < (30 * DAY))
format(time, sizeof (time), "%i days ago", (seconds / DAY));
else if (seconds < (12 * MONTH))
{
new months = floatround(seconds / DAY / 30);
if (months <= 1)
format(time, sizeof (time), "One month ago");
else
format(time, sizeof (time), "%i months ago", months);
}
else
{
new years = floatround(seconds / DAY / 365);
if (years <= 1)
format(time, sizeof (time), "One year ago");
else
format(time, sizeof (time), "%i years ago", years);
}
return time;
}
print(ReturnTimelapse(gettime(), gettime() + 60)); // Result: "A minute ago"
print(ReturnTimelapse(gettime(), gettime() + 15)); // Result: "15 seconds ago"
print(ReturnTimelapse(gettime(), gettime() + 3600)); // Result: "An hour ago"
CreateCircle(objectid, Float:x, Float:y, Float:z, Float:size, &Float:valA2, &Float:valB2, &Float:valC2)
{
new Float:valx2,
Float:valy2,
Float:valz2;
for(new i; i < 360; i++) // 3498 - 1214
{
if(i == 180)
{
valx2 = x;
valy2 = y;
valz2 = z;
}
x = x+size*floatcos(i,degrees);
y = y+size*floatsin(i,degrees);
if(objectid != 0) CreateObject(objectid, x, y, z, 0.0, 0.0, 0.0);
}
GetCoordMid2Pts(valx2, valy2, valz2, x, y, z, valA2, valB2, valC2);
}
stock GetCoordMid2Pts(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2, &Float:rX, &Float:rY, &Float:rZ)
{
rX = (x1+x2)/2;
rY = (y1+y2)/2;
rZ = (z1+z2)/2;
}