25.03.2016, 18:15
Useful Functions
26.03.2016, 02:13
strnull
Checks if the string is empty or spaced.
Return true if empty
Return false if there are some characters excluding space
Checks if the string is empty or spaced.
Return true if empty
Return false if there are some characters excluding space
pawn Код:
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;
}
30.03.2016, 05:42
pawn Код:
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
}
pawn Код:
[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
pawn Код:
new i = 0;
while(i < 210000000)
{
i += random(9) + 1;
printf("formatted: %s", formatInt(i));
printf("formatted: %s", formatInt(i * -1));
i *= 10;
}
30.03.2016, 15:12
It can be written better:
pawn Код:
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;
}
01.04.2016, 12:43
db_queryf
db_query with arguments, allows you to format the query within the function!
Returns DBResult:x if query was successful (starts from DBResult:1)
Returns DBResult:0 if query was unsuccessful
Usage
The query will be "SELECT * FROM `Users` WHERE `Name` = 'Gammix'".
NOTE: You can use "%q" to escape strings as the function uses format internally.
db_query with arguments, allows you to format the query within the function!
Returns DBResult:x if query was successful (starts from DBResult:1)
Returns DBResult:0 if query was unsuccessful
pawn Код:
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
}
pawn Код:
db_queryf(DB:1, "SELECT * FROM `Users` WHERE `Name` = '%q'", "Gammix");
NOTE: You can use "%q" to escape strings as the function uses format internally.
01.04.2016, 16:06
I had once posted a small function to format integer to currency. This is an improved version of my previous code;
Function will return a string containing currency formatted integer.
pawn Код:
//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;
}
02.04.2016, 16:51
(
Последний раз редактировалось Gammix; 26.08.2016 в 19:51.
)
Ipmatch
(originally by R@f, modified by me)
Checks if the 2 IPs match using the CIDR IP system. (This can be used to create your own range ban script)
Returns true if the 2 ips matches
Returns false if the 2 ips does not match
Usage
If you want to blacklist an ip (say 0.0.0.0 is blacklisted):
(originally by R@f, modified by me)
Checks if the 2 IPs match using the CIDR IP system. (This can be used to create your own range ban script)
Returns true if the 2 ips matches
Returns false if the 2 ips does not match
pawn Код:
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);
}
If you want to blacklist an ip (say 0.0.0.0 is blacklisted):
pawn Код:
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;
}
07.04.2016, 20:16
IsRPName
Check if the specified username is a valid Roleplay name (i.e. with '_' and chars between 'A' to 'z').
Return true if a valid name
Return false if not a RP name
Usage
Check if the specified username is a valid Roleplay name (i.e. with '_' and chars between 'A' to 'z').
Return true if a valid name
Return false if not a RP name
pawn Код:
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;
}
pawn Код:
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;
}
07.04.2016, 20:30
07.04.2016, 20:35
12.04.2016, 17:54
Variable swap macro, without using temporary variables.
Steps taken:
1. OR the NOT bits (a.k.a. XOR) of var 2 into var 1.
2. OR the new NOT bits of var 1 into var 2.
3. OR the new NOT bits of var 2 into var 1.
Walkthrough (given that var1 is 10111000 and var2 is 01001000):
pawn Код:
#define swapvars(%0,%1)\
(((%0) ^= (%1)), ((%1) ^= (%0)), ((%0) ^= (%1)))
1. OR the NOT bits (a.k.a. XOR) of var 2 into var 1.
2. OR the new NOT bits of var 1 into var 2.
3. OR the new NOT bits of var 2 into var 1.
Walkthrough (given that var1 is 10111000 and var2 is 01001000):
pawn Код:
//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)
29.04.2016, 04:52
(
Последний раз редактировалось Crayder; 29.04.2016 в 06:06.
)
String splitting by length, strexpand.
This function splits a given string into equal parts. The results are stored in a given multi-dimensional array. Each part will be exactly the preferred length or less (less only if it's the last string or the first if the first is short).
There is also a parameter called 'outstart'. This parameter allows for the resulting strings to begin with a set of characters and remain at the given length.
Example script:
Output:
This could be further improved, like ending the lines at the last space so words aren't broken. Or even 'outend', to append text to the end of the lines like 'outstart' does the beginning.
This function splits a given string into equal parts. The results are stored in a given multi-dimensional array. Each part will be exactly the preferred length or less (less only if it's the last string or the first if the first is short).
There is also a parameter called 'outstart'. This parameter allows for the resulting strings to begin with a set of characters and remain at the given length.
pawn Код:
// 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;
}
pawn Код:
#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
29.04.2016, 07:40
(
Последний раз редактировалось thaKing; 29.04.2016 в 08:11.
)
Many functions from SC:RP, a few edits of mine. All credits goes to SC:RP original owners/scripters.
PHP код:
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);
}
05.05.2016, 14:42
(
Последний раз редактировалось OstGot; 11.11.2016 в 05:00.
)
GetSkinModelName(skinid, name[], namesize)
Код:
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; }
29.07.2016, 20:53
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
This is a simple code, but people has been struggling with this problem where a player connect, and receives the login dialog, and they type their password really really fast, then they need to wait a few seconds depending on the server connection rate with the client.
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:
forward OnPlayerFullyConnect(playerid);
public OnPlayerConnect(playerid)
SetTimerEx("OnPlayerFullyConnect", 0001, false, "i", playerid);
public OnPlayerFullyConnect(playerid) {
..
}
09.08.2016, 15:08
(
Last edited by Dayrion; 09/08/2016 at 11:37 PM.
)
Random functions:
PHP Code:
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);
}
09.08.2016, 18:13
Quote:
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:
|
15.08.2016, 17:22
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;
}
23.08.2016, 16:18
ReturnTimelapse
Returns a string. String contains the time elapsed between the start and till timestamps.
Example:
Returns a string. String contains the time elapsed between the start and till timestamps.
pawn Code:
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;
}
pawn Code:
print(ReturnTimelapse(gettime(), gettime() + 60)); // Result: "A minute ago"
pawn Code:
print(ReturnTimelapse(gettime(), gettime() + 15)); // Result: "15 seconds ago"
pawn Code:
print(ReturnTimelapse(gettime(), gettime() + 3600)); // Result: "An hour ago"
07.09.2016, 23:23
(
Last edited by Dayrion; 09/09/2016 at 09:53 AM.
)
Create a circle with an object and get the center's coordinates.
PHP Code:
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;
}
« Next Oldest | Next Newest »
Users browsing this thread: 14 Guest(s)