Useful Functions

Quote:
Originally Posted by XO
Посмотреть сообщение
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.
Yeah but you see, this forum is full of people who wouldn't have a clue.
Reply

strnull
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;
}
Reply

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
}
TESTING:

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
TEST CODE:

pawn Код:
new i = 0;
    while(i < 210000000)
    {
        i += random(9) + 1;
        printf("formatted: %s", formatInt(i));
        printf("formatted: %s", formatInt(i * -1));
       
        i *= 10;
    }
Reply

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;
}
Reply

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

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
}
Usage
pawn Код:
db_queryf(DB:1, "SELECT * FROM `Users` WHERE `Name` = '%q'", "Gammix");
The query will be "SELECT * FROM `Users` WHERE `Name` = 'Gammix'".
NOTE: You can use "%q" to escape strings as the function uses format internally.
Reply

I had once posted a small function to format integer to currency. This is an improved version of my previous code;

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;
}
Function will return a string containing currency formatted integer.
Reply

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

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);
}
Usage
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;
}
Reply

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

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;
}
Usage
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;
}
Reply

Quote:
Originally Posted by Gammix
Посмотреть сообщение
IsRPName
Hmm... "Henry_McMadden"
Reply

Quote:
Originally Posted by Crayder
Посмотреть сообщение
Hmm... "Henry_McMadden"
It's says valid.
But it wasn't working for single names without '_' which i just fixed now.
Reply

Variable swap macro, without using temporary variables.

pawn Код:
#define swapvars(%0,%1)\
    (((%0) ^= (%1)), ((%1) ^= (%0)), ((%0) ^= (%1)))
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 Код:
//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)
Reply

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.

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;
}
Example script:
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]);
    }
}
Output:
Код:
darCCeaadraCyryreCedaaCaereeCyr3
    ereyderadyaCrredeerCerdryryC
    rre3rydrdreCdaaCraydeyCdrayr
    ydCreda3rCerryCradCryrerrrdy
    rrdCerdraye3eCeaydrCrrararra
    rrCCayrCrydrdyC3CeadrdrCeeda
    edryrCearCdaCeCarea3rarrdyra
    ardeaaderdraaerCyyerdry3yrde
    eCCrdrdrrrrCyyaCrerCeryCdrr3
    yrryryererrCCaCrrredrCrryade
    eyr3eaeyerrraeyrdCyarCeraeya
    draayrd3rdddCyreyCyeCarerryC
    CayadydCrey3aayeraCyrrrarrre
    raCCdyrdCrrerer3Cryeardrrrar
    ryrraddreeryaaraadC3Cyyrdder
    adyddayryraarrdarrrCedy3eyry
    CededayyrddarddeayryyrCdera3
    darrrdrraaaerdrrCryCedCrdaea
    eCr3
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.
Reply

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(datesizeof(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(vehicleidamount);
    return 
floatround(amountfloatround_round);
}
ReturnArmour(playerid)
{
    static
        
Float:amount;
    
GetPlayerArmour(playeridamount);
    return 
floatround(amountfloatround_round);
}
ReturnHealth(playerid)
{
    static
        
Float:amount;
    
GetPlayerHealth(playeridamount);
    return 
floatround(amountfloatround_round);
}
ReturnName(playeridunderscore 1)
{
    static
        
name[MAX_PLAYER_NAME 1];
    
GetPlayerName(playeridnamesizeof(name));
    
    if (!
underscore) {
        for (new 
0len strlen(name); len++) {
            if (
name[i] == '_'name[i] = ' ';
        }
    }
    return 
name;
}
ReturnIP(playerid)
{
    static
        
ip[16];
    
GetPlayerIp(playeridipsizeof(ip));
    return 
ip;
}
GetDistance(Float:x1Float:y1Float:z1Float:x2Float:y2Float:z2)
{
    return 
floatround(floatsqroot(((x1 x2) * (x1 x2)) + ((y1 y2) * (y1 y2)) + ((z1 z2) * (z1 z2))));
}
IsValidObjectModel(modelid)
{
    if (
modelid || modelid 20000)
        return 
0;
    switch (
modelid)
    {
        case 
18632..1864518646..1865818659..1866718668..1929919301..1951518631331333..339318..321325326341..344346..353355..370372:
            return 
1;
    }
    new const 
g_arrModelData[] =
    {
        
0000000000000000000, -128,
        -
515899393, -134217729, -1, -133554431, -1, -1, -1, -14337, -1, -33,
          
12700000, -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, -133554431, -25, -1, -1, -1, -1, -1, -1,
       -
1073676289, -2147483648340799992113536, -4825600, -5, -1, -3145729,
       -
1, -16777217, -63, -1, -1, -1, -1, -201326593, -1, -1, -1, -1, -1,
       -
257, -11073741823, -133122, -1, -1, -65, -1, -1, -1, -1, -1, -1,
       -
2146435073, -1, -1, -1, -1, -1, -1, -1, -1, -11073741823, -64, -1,
       -
1, -1, -1, -26357771340866630, -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, -1610612737524285, -128, -1,
       
2080309247, -1, -1, -1114113, -1, -1, -166977343, -524288, -1, -1, -1,
       -
1, -2031617, -1114687, -256, -1, -4097, -1, -4097, -1, -1,
       
10108272630000000000, -32768, -1, -1, -1, -1, -1,
       
2147483647, -33554434, -1, -1, -49153, -11481911692147483647,
       -
100781080, -262145, -57134217727, -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, -5368709133000000,
       
000000000000000000000000,
       
0000, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       -
1, -1, -1, -1, -1, -2097153, -2109441, -1201326591, -4194304, -1, -1,
       -
241, -1, -1, -1, -1, -1, -170000000000000,
       
0, -32768, -1, -1, -1, -2, -671096835, -1, -8388609, -66323585, -13,
       -
1793, -32257, -247809, -1, -1, -51316252911000, -131072,
       
33554383000000000000000000000,
       
00000000, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       -
1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1835609500000,
       
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, -26843545759119193510, -16777216, -1,
       -
1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1127
    
};
     return ((
modelid >= 0) && ((modelid 32) < sizeof(g_arrModelData)) && (g_arrModelData[modelid 32] & (<< (modelid 32))));
}
GetLocation(Float:fXFloat:fYFloat:fZ)
{
    
enum e_ZoneData
    
{
         
e_ZoneName[32 char],
         
Float:e_ZoneArea[6]
    };
    new const 
g_arrZoneData[][e_ZoneData] =
    {
        {!
"The Big Ear",                   {-410.001403.30, -3.00, -137.901681.20200.00}},
        {!
"Aldea Malvada",                {-1372.102498.500.00, -1277.502615.30200.00}},
        {!
"Angel Pine",                   {-2324.90, -2584.20, -6.10, -1964.20, -2212.10200.00}},
        {!
"Arco del Oeste",               {-901.102221.800.00, -592.002571.90200.00}},
        {!
"Avispa Country Club",          {-2646.40, -355.400.00, -2270.00, -222.50200.00}},
        {!
"Avispa Country Club",          {-2831.80, -430.20, -6.10, -2646.40, -222.50200.00}},
        {!
"Avispa Country Club",          {-2361.50, -417.100.00, -2270.00, -355.40200.00}},
        {!
"Avispa Country Club",          {-2667.80, -302.10, -28.80, -2646.40, -262.3071.10}},
        {!
"Avispa Country Club",          {-2470.00, -355.400.00, -2270.00, -318.4046.10}},
        {!
"Avispa Country Club",          {-2550.00, -355.400.00, -2470.00, -318.4039.70}},
        {!
"Back o Beyond",                {-1166.90, -2641.100.00, -321.70, -1856.00200.00}},
        {!
"Battery Point",                {-2741.001268.40, -4.50, -2533.001490.40200.00}},
        {!
"Bayside",                      {-2741.002175.100.00, -2353.102722.70200.00}},
        {!
"Bayside Marina",               {-2353.102275.700.00, -2153.102475.70200.00}},
        {!
"Beacon Hill",                  {-399.60, -1075.50, -1.40, -319.00, -977.50198.50}},
        {!
"Blackfield",                   {964.301203.20, -89.001197.301403.20110.90}},
        {!
"Blackfield",                   {964.301403.20, -89.001197.301726.20110.90}},
        {!
"Blackfield Chapel",            {1375.60596.30, -89.001558.00823.20110.90}},
        {!
"Blackfield Chapel",            {1325.60596.30, -89.001375.60795.00110.90}},
        {!
"Blackfield Intersection",      {1197.301044.60, -89.001277.001163.30110.90}},
        {!
"Blackfield Intersection",      {1166.50795.00, -89.001375.601044.60110.90}},
        {!
"Blackfield Intersection",      {1277.001044.60, -89.001315.301087.60110.90}},
        {!
"Blackfield Intersection",      {1375.60823.20, -89.001457.30919.40110.90}},
        {!
"Blueberry",                    {104.50, -220.102.30349.60152.20200.00}},
        {!
"Blueberry",                    {19.60, -404.103.80349.60, -220.10200.00}},
        {!
"Blueberry Acres",              {-319.60, -220.100.00104.50293.30200.00}},
        {!
"Caligula's Palace",            {2087.301543.20, -89.002437.301703.20110.90}},
        {!
"Caligula's Palace",            {2137.401703.20, -89.002437.301783.20110.90}},
        {!
"Calton Heights",               {-2274.10744.10, -6.10, -1982.301358.90200.00}},
        {!
"Chinatown",                    {-2274.10578.30, -7.60, -2078.60744.10200.00}},
        {!
"City Hall",                    {-2867.80277.40, -9.10, -2593.40458.40200.00}},
        {!
"Come-A-Lot",                   {2087.30943.20, -89.002623.101203.20110.90}},
        {!
"Commerce",                     {1323.90, -1842.20, -89.001701.90, -1722.20110.90}},
        {!
"Commerce",                     {1323.90, -1722.20, -89.001440.90, -1577.50110.90}},
        {!
"Commerce",                     {1370.80, -1577.50, -89.001463.90, -1384.90110.90}},
        {!
"Commerce",                     {1463.90, -1577.50, -89.001667.90, -1430.80110.90}},
        {!
"Commerce",                     {1583.50, -1722.20, -89.001758.90, -1577.50110.90}},
        {!
"Commerce",                     {1667.90, -1577.50, -89.001812.60, -1430.80110.90}},
        {!
"Conference Center",            {1046.10, -1804.20, -89.001323.90, -1722.20110.90}},
        {!
"Conference Center",            {1073.20, -1842.20, -89.001323.90, -1804.20110.90}},
        {!
"Cranberry Station",            {-2007.8056.300.00, -1922.00224.70100.00}},
        {!
"Creek",                        {2749.901937.20, -89.002921.602669.70110.90}},
        {!
"Dillimore",                    {580.70, -674.80, -9.50861.00, -404.70200.00}},
        {!
"Doherty",                      {-2270.00, -324.10, -0.00, -1794.90, -222.50200.00}},
        {!
"Doherty",                      {-2173.00, -222.50, -0.00, -1794.90265.20200.00}},
        {!
"Downtown",                     {-1982.30744.10, -6.10, -1871.701274.20200.00}},
        {!
"Downtown",                     {-1871.701176.40, -4.50, -1620.301274.20200.00}},
        {!
"Downtown",                     {-1700.00744.20, -6.10, -1580.001176.50200.00}},
        {!
"Downtown",                     {-1580.00744.20, -6.10, -1499.801025.90200.00}},
        {!
"Downtown",                     {-2078.60578.30, -7.60, -1499.80744.20200.00}},
        {!
"Downtown",                     {-1993.20265.20, -9.10, -1794.90578.30200.00}},
        {!
"Downtown Los Santos",          {1463.90, -1430.80, -89.001724.70, -1290.80110.90}},
        {!
"Downtown Los Santos",          {1724.70, -1430.80, -89.001812.60, -1250.90110.90}},
        {!
"Downtown Los Santos",          {1463.90, -1290.80, -89.001724.70, -1150.80110.90}},
        {!
"Downtown Los Santos",          {1370.80, -1384.90, -89.001463.90, -1170.80110.90}},
        {!
"Downtown Los Santos",          {1724.70, -1250.90, -89.001812.60, -1150.80110.90}},
        {!
"Downtown Los Santos",          {1370.80, -1170.80, -89.001463.90, -1130.80110.90}},
        {!
"Downtown Los Santos",          {1378.30, -1130.80, -89.001463.90, -1026.30110.90}},
        {!
"Downtown Los Santos",          {1391.00, -1026.30, -89.001463.90, -926.90110.90}},
        {!
"Downtown Los Santos",          {1507.50, -1385.20110.901582.50, -1325.30335.90}},
        {!
"East Beach",                   {2632.80, -1852.80, -89.002959.30, -1668.10110.90}},
        {!
"East Beach",                   {2632.80, -1668.10, -89.002747.70, -1393.40110.90}},
        {!
"East Beach",                   {2747.70, -1668.10, -89.002959.30, -1498.60110.90}},
        {!
"East Beach",                   {2747.70, -1498.60, -89.002959.30, -1120.00110.90}},
        {!
"East Los Santos",              {2421.00, -1628.50, -89.002632.80, -1454.30110.90}},
        {!
"East Los Santos",              {2222.50, -1628.50, -89.002421.00, -1494.00110.90}},
        {!
"East Los Santos",              {2266.20, -1494.00, -89.002381.60, -1372.00110.90}},
        {!
"East Los Santos",              {2381.60, -1494.00, -89.002421.00, -1454.30110.90}},
        {!
"East Los Santos",              {2281.40, -1372.00, -89.002381.60, -1135.00110.90}},
        {!
"East Los Santos",              {2381.60, -1454.30, -89.002462.10, -1135.00110.90}},
        {!
"East Los Santos",              {2462.10, -1454.30, -89.002581.70, -1135.00110.90}},
        {!
"Easter Basin",                 {-1794.90249.90, -9.10, -1242.90578.30200.00}},
        {!
"Easter Basin",                 {-1794.90, -50.00, -0.00, -1499.80249.90200.00}},
        {!
"Easter Bay Airport",           {-1499.80, -50.00, -0.00, -1242.90249.90200.00}},
        {!
"Easter Bay Airport",           {-1794.90, -730.10, -3.00, -1213.90, -50.00200.00}},
        {!
"Easter Bay Airport",           {-1213.90, -730.100.00, -1132.80, -50.00200.00}},
        {!
"Easter Bay Airport",           {-1242.90, -50.000.00, -1213.90578.30200.00}},
        {!
"Easter Bay Airport",           {-1213.90, -50.00, -4.50, -947.90578.30200.00}},
        {!
"Easter Bay Airport",           {-1315.40, -405.3015.40, -1264.40, -209.5025.40}},
        {!
"Easter Bay Airport",           {-1354.30, -287.3015.40, -1315.40, -209.5025.40}},
        {!
"Easter Bay Airport",           {-1490.30, -209.5015.40, -1264.40, -148.3025.40}},
        {!
"Easter Bay Chemicals",         {-1132.80, -768.000.00, -956.40, -578.10200.00}},
        {!
"Easter Bay Chemicals",         {-1132.80, -787.300.00, -956.40, -768.00200.00}},
        {!
"El Castillo del Diablo",       {-464.502217.600.00, -208.502580.30200.00}},
        {!
"El Castillo del Diablo",       {-208.502123.00, -7.60114.002337.10200.00}},
        {!
"El Castillo del Diablo",       {-208.502337.100.008.402487.10200.00}},
        {!
"El Corona",                    {1812.60, -2179.20, -89.001970.60, -1852.80110.90}},
        {!
"El Corona",                    {1692.60, -2179.20, -89.001812.60, -1842.20110.90}},
        {!
"El Quebrados",                 {-1645.202498.500.00, -1372.102777.80200.00}},
        {!
"Esplanade East",               {-1620.301176.50, -4.50, -1580.001274.20200.00}},
        {!
"Esplanade East",               {-1580.001025.90, -6.10, -1499.801274.20200.00}},
        {!
"Esplanade East",               {-1499.80578.30, -79.60, -1339.801274.2020.30}},
        {!
"Esplanade North",              {-2533.001358.90, -4.50, -1996.601501.20200.00}},
        {!
"Esplanade North",              {-1996.601358.90, -4.50, -1524.201592.50200.00}},
        {!
"Esplanade North",              {-1982.301274.20, -4.50, -1524.201358.90200.00}},
        {!
"Fallen Tree",                  {-792.20, -698.50, -5.30, -452.40, -380.00200.00}},
        {!
"Fallow Bridge",                {434.30366.500.00603.00555.60200.00}},
        {!
"Fern Ridge",                   {508.10, -139.200.001306.60119.50200.00}},
        {!
"Financial",                    {-1871.70744.10, -6.10, -1701.301176.40300.00}},
        {!
"Fisher's Lagoon",              {1916.90, -233.30, -100.002131.7013.80200.00}},
        {!
"Flint Intersection",           {-187.70, -1596.70, -89.0017.00, -1276.60110.90}},
        {!
"Flint Range",                  {-594.10, -1648.500.00, -187.70, -1276.60200.00}},
        {!
"Fort Carson",                  {-376.20826.30, -3.00123.701220.40200.00}},
        {!
"Foster Valley",                {-2270.00, -430.20, -0.00, -2178.60, -324.10200.00}},
        {!
"Foster Valley",                {-2178.60, -599.80, -0.00, -1794.90, -324.10200.00}},
        {!
"Foster Valley",                {-2178.60, -1115.500.00, -1794.90, -599.80200.00}},
        {!
"Foster Valley",                {-2178.60, -1250.900.00, -1794.90, -1115.50200.00}},
        {!
"Frederick Bridge",             {2759.20296.500.002774.20594.70200.00}},
        {!
"Gant Bridge",                  {-2741.401659.60, -6.10, -2616.402175.10200.00}},
        {!
"Gant Bridge",                  {-2741.001490.40, -6.10, -2616.401659.60200.00}},
        {!
"Ganton",                       {2222.50, -1852.80, -89.002632.80, -1722.30110.90}},
        {!
"Ganton",                       {2222.50, -1722.30, -89.002632.80, -1628.50110.90}},
        {!
"Garcia",                       {-2411.20, -222.50, -0.00, -2173.00265.20200.00}},
        {!
"Garcia",                       {-2395.10, -222.50, -5.30, -2354.00, -204.70200.00}},
        {!
"Garver Bridge",                {-1339.80828.10, -89.00, -1213.901057.00110.90}},
        {!
"Garver Bridge",                {-1213.90950.00, -89.00, -1087.901178.90110.90}},
        {!
"Garver Bridge",                {-1499.80696.40, -179.60, -1339.80925.3020.30}},
        {!
"Glen Park",                    {1812.60, -1449.60, -89.001996.90, -1350.70110.90}},
        {!
"Glen Park",                    {1812.60, -1100.80, -89.001994.30, -973.30110.90}},
        {!
"Glen Park",                    {1812.60, -1350.70, -89.002056.80, -1100.80110.90}},
        {!
"Green Palms",                  {176.501305.40, -3.00338.601520.70200.00}},
        {!
"Greenglass College",           {964.301044.60, -89.001197.301203.20110.90}},
        {!
"Greenglass College",           {964.30930.80, -89.001166.501044.60110.90}},
        {!
"Hampton Barns",                {603.00264.300.00761.90366.50200.00}},
        {!
"Hankypanky Point",             {2576.9062.100.002759.20385.50200.00}},
        {!
"Harry Gold Parkway",           {1777.30863.20, -89.001817.302342.80110.90}},
        {!
"Hashbury",                     {-2593.40, -222.50, -0.00, -2411.2054.70200.00}},
        {!
"Hilltop Farm",                 {967.30, -450.30, -3.001176.70, -217.90200.00}},
        {!
"Hunter Quarry",                {337.20710.80, -115.20860.501031.70203.70}},
        {!
"Idlewood",                     {1812.60, -1852.80, -89.001971.60, -1742.30110.90}},
        {!
"Idlewood",                     {1812.60, -1742.30, -89.001951.60, -1602.30110.90}},
        {!
"Idlewood",                     {1951.60, -1742.30, -89.002124.60, -1602.30110.90}},
        {!
"Idlewood",                     {1812.60, -1602.30, -89.002124.60, -1449.60110.90}},
        {!
"Idlewood",                     {2124.60, -1742.30, -89.002222.50, -1494.00110.90}},
        {!
"Idlewood",                     {1971.60, -1852.80, -89.002222.50, -1742.30110.90}},
        {!
"Jefferson",                    {1996.90, -1449.60, -89.002056.80, -1350.70110.90}},
        {!
"Jefferson",                    {2124.60, -1494.00, -89.002266.20, -1449.60110.90}},
        {!
"Jefferson",                    {2056.80, -1372.00, -89.002281.40, -1210.70110.90}},
        {!
"Jefferson",                    {2056.80, -1210.70, -89.002185.30, -1126.30110.90}},
        {!
"Jefferson",                    {2185.30, -1210.70, -89.002281.40, -1154.50110.90}},
        {!
"Jefferson",                    {2056.80, -1449.60, -89.002266.20, -1372.00110.90}},
        {!
"Julius Thruway East",          {2623.10943.20, -89.002749.901055.90110.90}},
        {!
"Julius Thruway East",          {2685.101055.90, -89.002749.902626.50110.90}},
        {!
"Julius Thruway East",          {2536.402442.50, -89.002685.102542.50110.90}},
        {!
"Julius Thruway East",          {2625.102202.70, -89.002685.102442.50110.90}},
        {!
"Julius Thruway North",         {2498.202542.50, -89.002685.102626.50110.90}},
        {!
"Julius Thruway North",         {2237.402542.50, -89.002498.202663.10110.90}},
        {!
"Julius Thruway North",         {2121.402508.20, -89.002237.402663.10110.90}},
        {!
"Julius Thruway North",         {1938.802508.20, -89.002121.402624.20110.90}},
        {!
"Julius Thruway North",         {1534.502433.20, -89.001848.402583.20110.90}},
        {!
"Julius Thruway North",         {1848.402478.40, -89.001938.802553.40110.90}},
        {!
"Julius Thruway North",         {1704.502342.80, -89.001848.402433.20110.90}},
        {!
"Julius Thruway North",         {1377.302433.20, -89.001534.502507.20110.90}},
        {!
"Julius Thruway South",         {1457.30823.20, -89.002377.30863.20110.90}},
        {!
"Julius Thruway South",         {2377.30788.80, -89.002537.30897.90110.90}},
        {!
"Julius Thruway West",          {1197.301163.30, -89.001236.602243.20110.90}},
        {!
"Julius Thruway West",          {1236.602142.80, -89.001297.402243.20110.90}},
        {!
"Juniper Hill",                 {-2533.00578.30, -7.60, -2274.10968.30200.00}},
        {!
"Juniper Hollow",               {-2533.00968.30, -6.10, -2274.101358.90200.00}},
        {!
"K.A.C.C. Military Fuels",      {2498.202626.50, -89.002749.902861.50110.90}},
        {!
"Kincaid Bridge",               {-1339.80599.20, -89.00, -1213.90828.10110.90}},
        {!
"Kincaid Bridge",               {-1213.90721.10, -89.00, -1087.90950.00110.90}},
        {!
"Kincaid Bridge",               {-1087.90855.30, -89.00, -961.90986.20110.90}},
        {!
"King's",                       {-2329.30458.40, -7.60, -1993.20578.30200.00}},
        {!
"King's",                       {-2411.20265.20, -9.10, -1993.20373.50200.00}},
        {!
"King's",                       {-2253.50373.50, -9.10, -1993.20458.40200.00}},
        {!
"LVA Freight Depot",            {1457.30863.20, -89.001777.401143.20110.90}},
        {!
"LVA Freight Depot",            {1375.60919.40, -89.001457.301203.20110.90}},
        {!
"LVA Freight Depot",            {1277.001087.60, -89.001375.601203.20110.90}},
        {!
"LVA Freight Depot",            {1315.301044.60, -89.001375.601087.60110.90}},
        {!
"LVA Freight Depot",            {1236.601163.40, -89.001277.001203.20110.90}},
        {!
"Las Barrancas",                {-926.101398.70, -3.00, -719.201634.60200.00}},
        {!
"Las Brujas",                   {-365.102123.00, -3.00, -208.502217.60200.00}},
        {!
"Las Colinas",                  {1994.30, -1100.80, -89.002056.80, -920.80110.90}},
        {!
"Las Colinas",                  {2056.80, -1126.30, -89.002126.80, -920.80110.90}},
        {!
"Las Colinas",                  {2185.30, -1154.50, -89.002281.40, -934.40110.90}},
        {!
"Las Colinas",                  {2126.80, -1126.30, -89.002185.30, -934.40110.90}},
        {!
"Las Colinas",                  {2747.70, -1120.00, -89.002959.30, -945.00110.90}},
        {!
"Las Colinas",                  {2632.70, -1135.00, -89.002747.70, -945.00110.90}},
        {!
"Las Colinas",                  {2281.40, -1135.00, -89.002632.70, -945.00110.90}},
        {!
"Las Payasadas",                {-354.302580.302.00, -133.602816.80200.00}},
        {!
"Las Venturas Airport",         {1236.601203.20, -89.001457.301883.10110.90}},
        {!
"Las Venturas Airport",         {1457.301203.20, -89.001777.301883.10110.90}},
        {!
"Las Venturas Airport",         {1457.301143.20, -89.001777.401203.20110.90}},
        {!
"Las Venturas Airport",         {1515.801586.40, -12.501729.901714.5087.50}},
        {!
"Last Dime Motel",              {1823.00596.30, -89.001997.20823.20110.90}},
        {!
"Leafy Hollow",                 {-1166.90, -1856.000.00, -815.60, -1602.00200.00}},
        {!
"Liberty City",                 {-1000.00400.001300.00, -700.00600.001400.00}},
        {!
"Lil' Probe Inn",               {-90.201286.80, -3.00153.801554.10200.00}},
        {!
"Linden Side",                  {2749.90943.20, -89.002923.301198.90110.90}},
        {!
"Linden Station",               {2749.901198.90, -89.002923.301548.90110.90}},
        {!
"Linden Station",               {2811.201229.50, -39.502861.201407.5060.40}},
        {!
"Little Mexico",                {1701.90, -1842.20, -89.001812.60, -1722.20110.90}},
        {!
"Little Mexico",                {1758.90, -1722.20, -89.001812.60, -1577.50110.90}},
        {!
"Los Flores",                   {2581.70, -1454.30, -89.002632.80, -1393.40110.90}},
        {!
"Los Flores",                   {2581.70, -1393.40, -89.002747.70, -1135.00110.90}},
        {!
"Los Santos International",     {1249.60, -2394.30, -89.001852.00, -2179.20110.90}},
        {!
"Los Santos International",     {1852.00, -2394.30, -89.002089.00, -2179.20110.90}},
        {!
"Los Santos International",     {1382.70, -2730.80, -89.002201.80, -2394.30110.90}},
        {!
"Los Santos International",     {1974.60, -2394.30, -39.002089.00, -2256.5060.90}},
        {!
"Los Santos International",     {1400.90, -2669.20, -39.002189.80, -2597.2060.90}},
        {!
"Los Santos International",     {2051.60, -2597.20, -39.002152.40, -2394.3060.90}},
        {!
"Marina",                       {647.70, -1804.20, -89.00851.40, -1577.50110.90}},
        {!
"Marina",                       {647.70, -1577.50, -89.00807.90, -1416.20110.90}},
        {!
"Marina",                       {807.90, -1577.50, -89.00926.90, -1416.20110.90}},
        {!
"Market",                       {787.40, -1416.20, -89.001072.60, -1310.20110.90}},
        {!
"Market",                       {952.60, -1310.20, -89.001072.60, -1130.80110.90}},
        {!
"Market",                       {1072.60, -1416.20, -89.001370.80, -1130.80110.90}},
        {!
"Market",                       {926.90, -1577.50, -89.001370.80, -1416.20110.90}},
        {!
"Market Station",               {787.40, -1410.90, -34.10866.00, -1310.2065.80}},
        {!
"Martin Bridge",                {-222.10293.300.00, -122.10476.40200.00}},
        {!
"Missionary Hill",              {-2994.40, -811.200.00, -2178.60, -430.20200.00}},
        {!
"Montgomery",                   {1119.50119.50, -3.001451.40493.30200.00}},
        {!
"Montgomery",                   {1451.40347.40, -6.101582.40420.80200.00}},
        {!
"Montgomery Intersection",      {1546.60208.100.001745.80347.40200.00}},
        {!
"Montgomery Intersection",      {1582.40347.400.001664.60401.70200.00}},
        {!
"Mulholland",                   {1414.00, -768.00, -89.001667.60, -452.40110.90}},
        {!
"Mulholland",                   {1281.10, -452.40, -89.001641.10, -290.90110.90}},
        {!
"Mulholland",                   {1269.10, -768.00, -89.001414.00, -452.40110.90}},
        {!
"Mulholland",                   {1357.00, -926.90, -89.001463.90, -768.00110.90}},
        {!
"Mulholland",                   {1318.10, -910.10, -89.001357.00, -768.00110.90}},
        {!
"Mulholland",                   {1169.10, -910.10, -89.001318.10, -768.00110.90}},
        {!
"Mulholland",                   {768.60, -954.60, -89.00952.60, -860.60110.90}},
        {!
"Mulholland",                   {687.80, -860.60, -89.00911.80, -768.00110.90}},
        {!
"Mulholland",                   {737.50, -768.00, -89.001142.20, -674.80110.90}},
        {!
"Mulholland",                   {1096.40, -910.10, -89.001169.10, -768.00110.90}},
        {!
"Mulholland",                   {952.60, -937.10, -89.001096.40, -860.60110.90}},
        {!
"Mulholland",                   {911.80, -860.60, -89.001096.40, -768.00110.90}},
        {!
"Mulholland",                   {861.00, -674.80, -89.001156.50, -600.80110.90}},
        {!
"Mulholland Intersection",      {1463.90, -1150.80, -89.001812.60, -768.00110.90}},
        {!
"North Rock",                   {2285.30, -768.000.002770.50, -269.70200.00}},
        {!
"Ocean Docks",                  {2373.70, -2697.00, -89.002809.20, -2330.40110.90}},
        {!
"Ocean Docks",                  {2201.80, -2418.30, -89.002324.00, -2095.00110.90}},
        {!
"Ocean Docks",                  {2324.00, -2302.30, -89.002703.50, -2145.10110.90}},
        {!
"Ocean Docks",                  {2089.00, -2394.30, -89.002201.80, -2235.80110.90}},
        {!
"Ocean Docks",                  {2201.80, -2730.80, -89.002324.00, -2418.30110.90}},
        {!
"Ocean Docks",                  {2703.50, -2302.30, -89.002959.30, -2126.90110.90}},
        {!
"Ocean Docks",                  {2324.00, -2145.10, -89.002703.50, -2059.20110.90}},
        {!
"Ocean Flats",                  {-2994.40277.40, -9.10, -2867.80458.40200.00}},
        {!
"Ocean Flats",                  {-2994.40, -222.50, -0.00, -2593.40277.40200.00}},
        {!
"Ocean Flats",                  {-2994.40, -430.20, -0.00, -2831.80, -222.50200.00}},
        {!
"Octane Springs",               {338.601228.500.00664.301655.00200.00}},
        {!
"Old Venturas Strip",           {2162.302012.10, -89.002685.102202.70110.90}},
        {!
"Palisades",                    {-2994.40458.40, -6.10, -2741.001339.60200.00}},
        {!
"Palomino Creek",               {2160.20, -149.000.002576.90228.30200.00}},
        {!
"Paradiso",                     {-2741.00793.40, -6.10, -2533.001268.40200.00}},
        {!
"Pershing Square",              {1440.90, -1722.20, -89.001583.50, -1577.50110.90}},
        {!
"Pilgrim",                      {2437.301383.20, -89.002624.401783.20110.90}},
        {!
"Pilgrim",                      {2624.401383.20, -89.002685.101783.20110.90}},
        {!
"Pilson Intersection",          {1098.302243.20, -89.001377.302507.20110.90}},
        {!
"Pirates in Men's Pants",       {1817.301469.20, -89.002027.401703.20110.90}},
        {!
"Playa del Seville",            {2703.50, -2126.90, -89.002959.30, -1852.80110.90}},
        {!
"Prickle Pine",                 {1534.502583.20, -89.001848.402863.20110.90}},
        {!
"Prickle Pine",                 {1117.402507.20, -89.001534.502723.20110.90}},
        {!
"Prickle Pine",                 {1848.402553.40, -89.001938.802863.20110.90}},
        {!
"Prickle Pine",                 {1938.802624.20, -89.002121.402861.50110.90}},
        {!
"Queens",                       {-2533.00458.400.00, -2329.30578.30200.00}},
        {!
"Queens",                       {-2593.4054.700.00, -2411.20458.40200.00}},
        {!
"Queens",                       {-2411.20373.500.00, -2253.50458.40200.00}},
        {!
"Randolph Industrial Estate",   {1558.00596.30, -89.001823.00823.20110.90}},
        {!
"Redsands East",                {1817.302011.80, -89.002106.702202.70110.90}},
        {!
"Redsands East",                {1817.302202.70, -89.002011.902342.80110.90}},
        {!
"Redsands East",                {1848.402342.80, -89.002011.902478.40110.90}},
        {!
"Redsands West",                {1236.601883.10, -89.001777.302142.80110.90}},
        {!
"Redsands West",                {1297.402142.80, -89.001777.302243.20110.90}},
        {!
"Redsands West",                {1377.302243.20, -89.001704.502433.20110.90}},
        {!
"Redsands West",                {1704.502243.20, -89.001777.302342.80110.90}},
        {!
"Regular Tom",                  {-405.701712.80, -3.00, -276.701892.70200.00}},
        {!
"Richman",                      {647.50, -1118.20, -89.00787.40, -954.60110.90}},
        {!
"Richman",                      {647.50, -954.60, -89.00768.60, -860.60110.90}},
        {!
"Richman",                      {225.10, -1369.60, -89.00334.50, -1292.00110.90}},
        {!
"Richman",                      {225.10, -1292.00, -89.00466.20, -1235.00110.90}},
        {!
"Richman",                      {72.60, -1404.90, -89.00225.10, -1235.00110.90}},
        {!
"Richman",                      {72.60, -1235.00, -89.00321.30, -1008.10110.90}},
        {!
"Richman",                      {321.30, -1235.00, -89.00647.50, -1044.00110.90}},
        {!
"Richman",                      {321.30, -1044.00, -89.00647.50, -860.60110.90}},
        {!
"Richman",                      {321.30, -860.60, -89.00687.80, -768.00110.90}},
        {!
"Richman",                      {321.30, -768.00, -89.00700.70, -674.80110.90}},
        {!
"Robada Intersection",          {-1119.001178.90, -89.00, -862.001351.40110.90}},
        {!
"Roca Escalante",               {2237.402202.70, -89.002536.402542.50110.90}},
        {!
"Roca Escalante",               {2536.402202.70, -89.002625.102442.50110.90}},
        {!
"Rockshore East",               {2537.30676.50, -89.002902.30943.20110.90}},
        {!
"Rockshore West",               {1997.20596.30, -89.002377.30823.20110.90}},
        {!
"Rockshore West",               {2377.30596.30, -89.002537.30788.80110.90}},
        {!
"Rodeo",                        {72.60, -1684.60, -89.00225.10, -1544.10110.90}},
        {!
"Rodeo",                        {72.60, -1544.10, -89.00225.10, -1404.90110.90}},
        {!
"Rodeo",                        {225.10, -1684.60, -89.00312.80, -1501.90110.90}},
        {!
"Rodeo",                        {225.10, -1501.90, -89.00334.50, -1369.60110.90}},
        {!
"Rodeo",                        {334.50, -1501.90, -89.00422.60, -1406.00110.90}},
        {!
"Rodeo",                        {312.80, -1684.60, -89.00422.60, -1501.90110.90}},
        {!
"Rodeo",                        {422.60, -1684.60, -89.00558.00, -1570.20110.90}},
        {!
"Rodeo",                        {558.00, -1684.60, -89.00647.50, -1384.90110.90}},
        {!
"Rodeo",                        {466.20, -1570.20, -89.00558.00, -1385.00110.90}},
        {!
"Rodeo",                        {422.60, -1570.20, -89.00466.20, -1406.00110.90}},
        {!
"Rodeo",                        {466.20, -1385.00, -89.00647.50, -1235.00110.90}},
        {!
"Rodeo",                        {334.50, -1406.00, -89.00466.20, -1292.00110.90}},
        {!
"Royal Casino",                 {2087.301383.20, -89.002437.301543.20110.90}},
        {!
"San Andreas Sound",            {2450.30385.50, -100.002759.20562.30200.00}},
        {!
"Santa Flora",                  {-2741.00458.40, -7.60, -2533.00793.40200.00}},
        {!
"Santa Maria Beach",            {342.60, -2173.20, -89.00647.70, -1684.60110.90}},
        {!
"Santa Maria Beach",            {72.60, -2173.20, -89.00342.60, -1684.60110.90}},
        {!
"Shady Cabin",                  {-1632.80, -2263.40, -3.00, -1601.30, -2231.70200.00}},
        {!
"Shady Creeks",                 {-1820.60, -2643.60, -8.00, -1226.70, -1771.60200.00}},
        {!
"Shady Creeks",                 {-2030.10, -2174.80, -6.10, -1820.60, -1771.60200.00}},
        {!
"Sobell Rail Yards",            {2749.901548.90, -89.002923.301937.20110.90}},
        {!
"Spinybed",                     {2121.402663.10, -89.002498.202861.50110.90}},
        {!
"Starfish Casino",              {2437.301783.20, -89.002685.102012.10110.90}},
        {!
"Starfish Casino",              {2437.301858.10, -39.002495.001970.8060.90}},
        {!
"Starfish Casino",              {2162.301883.20, -89.002437.302012.10110.90}},
        {!
"Temple",                       {1252.30, -1130.80, -89.001378.30, -1026.30110.90}},
        {!
"Temple",                       {1252.30, -1026.30, -89.001391.00, -926.90110.90}},
        {!
"Temple",                       {1252.30, -926.90, -89.001357.00, -910.10110.90}},
        {!
"Temple",                       {952.60, -1130.80, -89.001096.40, -937.10110.90}},
        {!
"Temple",                       {1096.40, -1130.80, -89.001252.30, -1026.30110.90}},
        {!
"Temple",                       {1096.40, -1026.30, -89.001252.30, -910.10110.90}},
        {!
"The Camel's Toe",              {2087.301203.20, -89.002640.401383.20110.90}},
        {!
"The Clown's Pocket",           {2162.301783.20, -89.002437.301883.20110.90}},
        {!
"The Emerald Isle",             {2011.902202.70, -89.002237.402508.20110.90}},
        {!
"The Farm",                     {-1209.60, -1317.10114.90, -908.10, -787.30251.90}},
        {!
"The Four Dragons Casino",      {1817.30863.20, -89.002027.301083.20110.90}},
        {!
"The High Roller",              {1817.301283.20, -89.002027.301469.20110.90}},
        {!
"The Mako Span",                {1664.60401.700.001785.10567.20200.00}},
        {!
"The Panopticon",               {-947.90, -304.30, -1.10, -319.60327.00200.00}},
        {!
"The Pink Swan",                {1817.301083.20, -89.002027.301283.20110.90}},
        {!
"The Sherman Dam",              {-968.701929.40, -3.00, -481.102155.20200.00}},
        {!
"The Strip",                    {2027.40863.20, -89.002087.301703.20110.90}},
        {!
"The Strip",                    {2106.701863.20, -89.002162.302202.70110.90}},
        {!
"The Strip",                    {2027.401783.20, -89.002162.301863.20110.90}},
        {!
"The Strip",                    {2027.401703.20, -89.002137.401783.20110.90}},
        {!
"The Visage",                   {1817.301863.20, -89.002106.702011.80110.90}},
        {!
"The Visage",                   {1817.301703.20, -89.002027.401863.20110.90}},
        {!
"Unity Station",                {1692.60, -1971.80, -20.401812.60, -1932.8079.50}},
        {!
"Valle Ocultado",               {-936.602611.402.00, -715.902847.90200.00}},
        {!
"Verdant Bluffs",               {930.20, -2488.40, -89.001249.60, -2006.70110.90}},
        {!
"Verdant Bluffs",               {1073.20, -2006.70, -89.001249.60, -1842.20110.90}},
        {!
"Verdant Bluffs",               {1249.60, -2179.20, -89.001692.60, -1842.20110.90}},
        {!
"Verdant Meadows",              {37.002337.10, -3.00435.902677.90200.00}},
        {!
"Verona Beach",                 {647.70, -2173.20, -89.00930.20, -1804.20110.90}},
        {!
"Verona Beach",                 {930.20, -2006.70, -89.001073.20, -1804.20110.90}},
        {!
"Verona Beach",                 {851.40, -1804.20, -89.001046.10, -1577.50110.90}},
        {!
"Verona Beach",                 {1161.50, -1722.20, -89.001323.90, -1577.50110.90}},
        {!
"Verona Beach",                 {1046.10, -1722.20, -89.001161.50, -1577.50110.90}},
        {!
"Vinewood",                     {787.40, -1310.20, -89.00952.60, -1130.80110.90}},
        {!
"Vinewood",                     {787.40, -1130.80, -89.00952.60, -954.60110.90}},
        {!
"Vinewood",                     {647.50, -1227.20, -89.00787.40, -1118.20110.90}},
        {!
"Vinewood",                     {647.70, -1416.20, -89.00787.40, -1227.20110.90}},
        {!
"Whitewood Estates",            {883.301726.20, -89.001098.302507.20110.90}},
        {!
"Whitewood Estates",            {1098.301726.20, -89.001197.302243.20110.90}},
        {!
"Willowfield",                  {1970.60, -2179.20, -89.002089.00, -1852.80110.90}},
        {!
"Willowfield",                  {2089.00, -2235.80, -89.002201.80, -1989.90110.90}},
        {!
"Willowfield",                  {2089.00, -1989.90, -89.002324.00, -1852.80110.90}},
        {!
"Willowfield",                  {2201.80, -2095.00, -89.002324.00, -1989.90110.90}},
        {!
"Willowfield",                  {2541.70, -1941.40, -89.002703.50, -1852.80110.90}},
        {!
"Willowfield",                  {2324.00, -2059.20, -89.002541.70, -1852.80110.90}},
        {!
"Willowfield",                  {2541.70, -2059.20, -89.002703.50, -1941.40110.90}},
        {!
"Yellow Bell Station",          {1377.402600.40, -21.901492.402687.3078.00}},
        {!
"Los Santos",                   {44.60, -2892.90, -242.902997.00, -768.00900.00}},
        {!
"Las Venturas",                 {869.40596.30, -242.902997.002993.80900.00}},
        {!
"Bone County",                  {-480.50596.30, -242.90869.402993.80900.00}},
        {!
"Tierra Robada",                {-2997.401659.60, -242.90, -480.502993.80900.00}},
        {!
"Tierra Robada",                {-1213.90596.30, -242.90, -480.501659.60900.00}},
        {!
"San Fierro",                   {-2997.40, -1115.50, -242.90, -1213.901659.60900.00}},
        {!
"Red County",                   {-1213.90, -768.00, -242.902997.00596.30900.00}},
        {!
"Flint County",                 {-1213.90, -2892.90, -242.9044.60, -768.00900.00}},
        {!
"Whetstone",                    {-2997.40, -2892.90, -242.90, -1213.90, -1115.50900.00}}
    };
    new
        
name[32] = "San Andreas";
    for (new 
0!= sizeof(g_arrZoneData); ++) 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(nameg_arrZoneData[i][e_ZoneName]);
        break;
    }
    return 
name;
}
stock Float:GetPlayerDistanceFromPlayer(playeridtargetid)
{
    new
        
Float:x,
        
Float:y,
        
Float:z;
    
GetPlayerPos(targetidxyz);
    return 
GetPlayerDistanceFromPoint(playeridxyz);
}
IsPlayerArmed(playerid)
{
    new
        
weapon,
        
ammo;
    for (new 
013++) {
        
GetPlayerWeaponData(playeridiweaponammo);
        if (
ammo 0) {
            switch (
weapon) {
                case 
1246891522..38: return 1;
            }
        }
    }
    return 
0;
}
GetNearestPlayerInView(playeridFloat:distance 2.0)
{
    new
        
Float:fAngle,
        
Float:fPosX,
        
Float:fPosY,
        
Float:fPosZ;
    
GetPlayerFacingAngle(playeridfAngle);
    
GetPlayerPos(playeridfPosXfPosYfPosZ);
    
fPosX += distance floatsin(-fAngledegrees);
    
fPosY += distance floatcos(-fAngledegrees);
    for (new 
0MAX_PLAYERSi++) if (IsPlayerConnected(i) && IsPlayerInRangeOfPoint(i2.0fPosXfPosYfPosZ)) {
        return 
i;
    }
    return 
INVALID_PLAYER_ID;
}
PlayReloadAnimation(playeridweaponid)
{
    switch (
weaponid)
    {
        case 
22ApplyAnimation(playerid"COLT45""colt45_reload"4.000000);
        case 
23ApplyAnimation(playerid"SILENCED""Silence_reload"4.000000);
        case 
24ApplyAnimation(playerid"PYTHON""python_reload"4.000000);
        case 
2527ApplyAnimation(playerid"BUDDY""buddy_reload"4.000000);
        case 
26ApplyAnimation(playerid"COLT45""sawnoff_reload"4.000000);
        case 
29..313334ApplyAnimation(playerid"RIFLE""rifle_load"4.000000);
        case 
2832ApplyAnimation(playerid"TEC""tec_reload"4.000000);
    }
    return 
1;
}
IsWheelModel(modelid)
{
    switch (
modelid) {
        case 
10251073..10851096..1098: return 1;
    }
    return 
0;
}
IsNOSCompatible(modelid)
{
    switch (
modelid) {
        case 
581523462521463522461448468586509481510472473493595484430453452446454590569537538570449: return 0;
    }
    return 
1;
}
new const 
g_aLegalMods[][] = {
    {
400102410211020101910181013000000000000000000000000000000000000000000000000},
    {
401114511441143114210201019101710131007100610051004100310010000000000000000},
    {
404102110201019101710161013100710021000000000000000000000000000000000000000},
    {
405102310211020101910181014100110000000000000000000000000000000000000000000},
    {
410102410231021102010191017101310071003100100000000000000000000000000000000},
    {
415102310191018101710071003100100000000000000000000000000000000000000000000},
    {
418102110201016100610020000000000000000000000000000000000000000000000000000},
    {
420102110191005100410031001000000000000000000000000000000000000000000000000},
    {
421102310211020101910181016101410000000000000000000000000000000000000000000},
    {
422102110201019101710131007000000000000000000000000000000000000000000000000},
    {
426102110191006100510041003100100000000000000000000000000000000000000000000},
    {
436102210211020101910171013100710061003100100000000000000000000000000000000},
    {
439114511441143114210231017101310071003100100000000000000000000000000000000},
    {
477102110201019101810171007100600000000000000000000000000000000000000000000},
    {
478102410221021102010131012100510040000000000000000000000000000000000000000},
    {
489102410201019101810161013100610051004100210000000000000000000000000000000},
    {
491114511441143114210231021102010191018101710141007100300000000000000000000},
    {
492101610061005100410000000000000000000000000000000000000000000000000000000},
    {
496114311421023102010191017101110071006100310021001000000000000000000000000},
    {
500102410211020101910130000000000000000000000000000000000000000000000000000},
    {
516102110201019101810171016101510071004100210000000000000000000000000000000},
    {
517114511441143114210231020101910181017101610071003100200000000000000000000},
    {
518114511441143114210231020101810171013100710061005100310010000000000000000},
    {
527102110201018101710151014100710010000000000000000000000000000000000000000},
    {
529102310201019101810171012101110071006100310010000000000000000000000000000},
    {
534118511801179117811271126112511241123112211061101110000000000000000000000},
    {
535112111201119111811171116111511141113111011090000000000000000000000000000},
    {
536118411831182118111281108110711051104110300000000000000000000000000000000},
    {
540114511441143114210241023102010191018101710071006100410010000000000000000},
    {
542114511441021102010191018101510140000000000000000000000000000000000000000},
    {
546114511441143114210241023101910181017100710061004100210010000000000000000},
    {
547114311421021102010191018101610031000000000000000000000000000000000000000},
    {
549114511441143114210231020101910181017101210111007100310010000000000000000},
    {
550114511441143114210231020101910181006100510041003100100000000000000000000},
    {
551102310211020101910181016100610051003100200000000000000000000000000000000},
    {
558116811671166116511641163109510941093109210911090108910880000000000000000},
    {
559117311621161116011591158107210711070106910681067106610650000000000000000},
    {
560117011691141114011391138103310321031103010291028102710260000000000000000},
    {
561115711561155115410641063106210611060105910581057105610551031103010271026},
    {
562117211711149114811471146104110401039103810371036103510340000000000000000},
    {
565115311521151115010541053105210511050104910481047104610450000000000000000},
    {
567118911881187118611331132113111301129110200000000000000000000000000000000},
    {
575117711761175117410991044104310420000000000000000000000000000000000000000},
    {
576119311921191119011371136113511340000000000000000000000000000000000000000},
    {
580102310201018101710071006100100000000000000000000000000000000000000000000},
    {
589114511441024102010181017101610131007100610051004100000000000000000000000},
    {
600102210201018101710131007100610051004000000000000000000000000000000000000},
    {
603114511441143114210241023102010191018101710071006100100000000000000000000}
};
IsLegalComponent(modelidcomponentid)
{
    if (
IsWheelModel(componentid) || (1086 <= componentid <= 1087) || (componentid >= 1008 && componentid <= 1010))
    {
        if (!
IsNOSCompatible(modelid))
            return 
1;
    }
    else
    {
        for (new 
0sizeof(g_aLegalMods); ++)
        {
            if (
g_aLegalMods[i][0] != modelid)
                continue;
            else for (new 
122++) if (g_aLegalMods[i][l] == componentid) {
                return 
1;
            }
        }
    }
    return 
0;
}
IsWeaponModel(model) {
    new const 
g_aWeaponModels[] = {
        
0331333334335336337338339341321322323324,
        
325326342343344000346347348349350351352,
        
353355356372357358359360361362363364365366,
        
367368368371
    
};
    for (new 
0sizeof(g_aWeaponModels); ++) if (g_aWeaponModels[i] == model) {
        return 
1;
    }
    return 
0;
}
GetWeaponModel(weaponid) {
    new const 
g_aWeaponModels[] = {
        
0331333334335336337338339341321322323324,
        
325326342343344000346347348349350351352,
        
353355356372357358359360361362363364365366,
        
367368368371
    
};
    if (
<= weaponid <= 46)
        return 
g_aWeaponModels[weaponid];
    return 
0;
}
IsVehicleSeatUsed(vehicleidseat)
{
    for (new 
0MAX_PLAYERSi++) if (IsPlayerConnected(i) && IsPlayerInVehicle(ivehicleid) && GetPlayerVehicleSeat(i) == seat) {
        return 
1;
    }
    return 
0;
}
RemoveFromVehicle(playerid)
{
    if (
IsPlayerInAnyVehicle(playerid))
    {
        static
            
Float:fX,
            
Float:fY,
            
Float:fZ;
        
GetPlayerPos(playeridfXfYfZ);
        
SetPlayerPos(playeridfXfYfZ 1.5);
    }
    return 
1;
}
GetAvailableSeat(vehicleidstart 1)
{
    new 
seats GetVehicleMaxSeats(vehicleid);
    for (new 
startseats++) if (!IsVehicleSeatUsed(vehicleidi)) {
        return 
i;
    }
    return -
1;
}
GetVehicleFromBehind(vehicleid)
{
    static
        
Float:fCoords[7];
    
GetVehiclePos(vehicleidfCoords[0], fCoords[1], fCoords[2]);
    
GetVehicleZAngle(vehicleidfCoords[3]);
    for (new 
1!= MAX_VEHICLES++) if (!= vehicleid && GetVehiclePos(ifCoords[4], fCoords[5], fCoords[6]))
    {
        if (
floatabs(fCoords[0] - fCoords[4]) < && floatabs(fCoords[1] - fCoords[5]) < && 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 (
0.00.00.0), 0;
    static
        
Float:pos[7]
    ;
    
GetVehicleModelInfo(GetVehicleModel(vehicleid), VEHICLE_MODEL_INFO_SIZEpos[0], pos[1], pos[2]);
    
GetVehiclePos(vehicleidpos[3], pos[4], pos[5]);
    
GetVehicleZAngle(vehicleidpos[6]);
    
pos[3] - (floatsqroot(pos[1] + pos[1]) * floatsin(-pos[6], degrees));
    
pos[4] - (floatsqroot(pos[1] + pos[1]) * floatcos(-pos[6], degrees));
     
pos[5];
    return 
1;
}
GetVehicleHood(vehicleid, &Float:x, &Float:y, &Float:z)
{
    if (!
GetVehicleModel(vehicleid) || vehicleid == INVALID_VEHICLE_ID)
        return (
0.00.00.0), 0;
    static
        
Float:pos[7]
    ;
    
GetVehicleModelInfo(GetVehicleModel(vehicleid), VEHICLE_MODEL_INFO_SIZEpos[0], pos[1], pos[2]);
    
GetVehiclePos(vehicleidpos[3], pos[4], pos[5]);
    
GetVehicleZAngle(vehicleidpos[6]);
    
pos[3] + (floatsqroot(pos[1] + pos[1]) * floatsin(-pos[6], degrees));
    
pos[4] + (floatsqroot(pos[1] + pos[1]) * floatcos(-pos[6], degrees));
     
pos[5];
    return 
1;
}
RemoveAlpha(color) {
    return (
color & ~0xFF);
}
FormatNumber(numberprefix[] = "$")
{
    static
        
value[32],
        
length;
    
format(valuesizeof(value), "%d", (number 0) ? (-number) : (number));
    if ((
length strlen(value)) > 3)
    {
        for (new 
length0; -->= 0++) {
            if ((
0) && (== 0)) strins(value","1);
        }
    }
    if (
prefix[0] != 0)
        
strins(valueprefix0);
    if (
number 0)
        
strins(value"-"0);
    return 
value;
}
IsValidPlayerName(const str[])
{
    if (!
str[0] || str[0] == '\1')
        return 
0;
    for (new 
0strlen(str); != l++)
    {
        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 
0strlen(str); != l++)
    {
        if ((
str[i] < '0' || str[i] > '9') && str[i] != '.')
            return 
0;
        if (
< ((== 0) ? (strval(str)) : (strval(str[1]))) > 255)
            return 
0;
    }
    return 
1;
}
IsPlayerIdle(playerid) {
    new
        
index GetPlayerAnimationIndex(playerid);
    return ((
index == 1275) || (1181 <= index <= 1192));
}
IsPlayerNearDynamicObject(playeridobjectidFloat:range 5.0) {
    static
        
Float:fX,
        
Float:fY,
        
Float:fZ;
    
GetDynamicObjectPos(objectidfXfYfZ);
    return (
IsPlayerInRangeOfPoint(playeridrangefXfYfZ));
}
GetVehicleMaxSeats(vehicleid)
{
    static const 
g_arrMaxSeats[] = {
        
422244122422242242424422214442,
        
171220274241222412100211122244,
        
222211442242112212242143111422,
        
424122244221222224211211224221,
        
122222222411122227714222224422,
        
442122222244221244100112122124,
        
424104222200722144422222420004,
        
00
    
};
    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 
1!= MAX_VEHICLES++) if (IsValidVehicle(i) && GetVehiclePos(ifXfYfZ))
    {
        if (
IsPlayerInRangeOfPoint(playerid3.5fXfYfZ)) return i;
    }
    return 
INVALID_VEHICLE_ID;
}
IsPlayerNearPlayer(playeridtargetidFloat:radius)
{
    static
        
Float:fX,
        
Float:fY,
        
Float:fZ;
    
GetPlayerPos(targetidfXfYfZ);
    return (
GetPlayerInterior(playerid) == GetPlayerInterior(targetid) && GetPlayerVirtualWorld(playerid) == GetPlayerVirtualWorld(targetid)) && IsPlayerInRangeOfPoint(playeridradiusfXfYfZ);
}
IsPlayerNearBoot(playeridvehicleid)
{
    static
        
Float:fX,
        
Float:fY,
        
Float:fZ;
    
GetVehicleBoot(vehicleidfXfYfZ);
    return (
GetPlayerVirtualWorld(playerid) == GetVehicleVirtualWorld(vehicleid)) && IsPlayerInRangeOfPoint(playerid3.5fXfYfZ);
}
IsPlayerNearHood(playeridvehicleid)
{
    static
        
Float:fX,
        
Float:fY,
        
Float:fZ;
    
GetVehicleHood(vehicleidfXfYfZ);
    return (
GetPlayerVirtualWorld(playerid) == GetVehicleVirtualWorld(vehicleid)) && IsPlayerInRangeOfPoint(playerid3.0fXfYfZ);
}
Log_Write(const path[], const str[], {Float,_}:...)
{
    static
        
args,
        
start,
        
end,
        
File:file,
        
string[1024]
    ;
    if ((
start strfind(path"/")) != -1) {
        
strmid(stringpath0start 1);
        if (!
fexist(string))
            return 
printf("** Warning: Directory \"%s\" doesn't exist."string);
    }
    
#emit LOAD.S.pri 8
    #emit STOR.pri args
    
file fopen(pathio_append);
    if (!
file)
        return 
0;
    if (
args 8)
    {
        
#emit ADDR.pri str
        #emit STOR.pri start
        
for (end start + (args 8); end startend -= 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(filestring);
        
fwrite(file"\r\n");
        
fclose(file);
        
#emit LCTRL 5
        #emit SCTRL 4
        #emit RETN
    
}
    
fwrite(filestr);
    
fwrite(file"\r\n");
    
fclose(file);
    return 
1;
}
IsValidRoleplayName(const name[]) {
    if (!
name[0] || strfind(name"_") == -1)
        return 
0;
    else for (new 
0len strlen(name); != len++) {
        if ((
== 0) && (name[i] < 'A' || name[i] > 'Z'))
            return 
0;
        else if ((
!= && len  && name[i] == '_') && (name[1] < 'A' || name[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 
0strlen(str); != l++)
    {
        if (
== && str[0] == '-')
            continue;
        else if (
str[i] < '0' || str[i] > '9')
            return 
0;
    }
    return 
1;
}
ReturnWeaponName(weaponid)
{
    static
        
name[32];
    
GetWeaponName(weaponidnamesizeof(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(namesizeof(name), g_arrVehicleNames[model 400]);
    return 
name;
}
ReturnVehicleName(vehicleid)
{
    new
        
model GetVehicleModel(vehicleid),
        
name[32] = "None";
    if (
model 400 || model 611)
        return 
name;
    
format(namesizeof(name), g_arrVehicleNames[model 400]);
    return 
name;
}
GetVehicleModelByName(const name[])
{
    if (
IsNumeric(name) && (strval(name) >= 400 && strval(name) <= 611))
        return 
strval(name);
    for (new 
0sizeof(g_arrVehicleNames); ++)
    {
        if (
strfind(g_arrVehicleNames[i], nametrue) != -1)
        {
            return 
400;
        }
    }
    return 
0;
}
GetVehicleDriver(vehicleid) {
    for (new 
0MAX_PLAYERSi++) if (IsPlayerConnected(i)) {
        if (
GetPlayerState(i) == PLAYER_STATE_DRIVER && GetPlayerVehicleID(i) == vehicleid) return i;
    }
    return 
INVALID_PLAYER_ID;
}
IsWindowedVehicle(vehicleid)
{
    static const 
g_aWindowStatus[] = {
        
11111111111111111111,
        
11110111110111101111,
        
10111101000100011011,
        
10000011011000111111,
        
10110001111110111111,
        
10111111100111111111,
        
10001111110010110000,
        
11111111111111111111,
        
11110110000001101111,
        
10110101110011001111,
        
111111000100
    
};
    new 
modelid GetVehicleModel(vehicleid);
    if (
modelid 400 || modelid 611)
        return 
0;
    return (
g_aWindowStatus[modelid 400]);
}
IsNewsVehicle(vehicleid)
{
    switch (
GetVehicleModel(vehicleid)) {
        case 
488582: return 1;
    }
    return 
0;
}
IsACruiser(vehicleid)
{
    switch (
GetVehicleModel(vehicleid)) {
        case 
523427490528596..599601: return 1;
    }
    return 
0;
}
IsDoorVehicle(vehicleid)
{
    switch (
GetVehicleModel(vehicleid)) {
        case 
400..424426..429431..440442..445451455456458459466467470474475:
            return 
1;
        case 
477..480482483486489490..492494..496498..500502..508514..518524..529533..536:
            return 
1;
        case 
540..547549..552554..562565..568573575576578..580582585587..589596..605609:
            return 
1;
    }
    return 
0;
}
IsLoadableVehicle(vehicleid)
{
    new 
modelid GetVehicleModel(vehicleid);
    if (
GetVehicleTrailer(vehicleid))
        
modelid GetVehicleModel(GetVehicleTrailer(vehicleid));
    switch (
modelid) {
        case 
609403414456498499514515435591: return 1;
    }
    return 
0;
}
IsABoat(vehicleid)
{
    switch (
GetVehicleModel(vehicleid)) {
        case 
430446452453454472473484493595: return 1;
    }
    return 
0;
}
IsABike(vehicleid)
{
    switch (
GetVehicleModel(vehicleid)) {
        case 
448461..463468521..523581586481509510: return 1;
    }
    return 
0;
}
IsAPlane(vehicleid)
{
    switch (
GetVehicleModel(vehicleid)) {
        case 
460464476511512513519520553577592593: return 1;
    }
    return 
0;
}
IsAHelicopter(vehicleid)
{
    switch (
GetVehicleModel(vehicleid)) {
        case 
417425447465469487488497501548563: return 1;
    }
    return 
0;
}
IsEngineVehicle(vehicleid)
{
    static const 
g_aEngineStatus[] = {
        
11111111111111111111,
        
11111111111111101111,
        
10111111100111111111,
        
11110011111111111111,
        
10111111111111111111,
        
10111111100111111111,
        
11111111111111111001,
        
11111111111111111111,
        
11110111100111111111,
        
11110111110011011111,
        
111111000100
    
};
    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 || time == gettime()) {
        
format(strsizeof(str), "Never");
        return 
str;
    }
    else if (
time 60)
        
format(strsizeof(str), "%d seconds"time);
    else if (
time >= && time 60)
        
format(strsizeof(str), "%d seconds"time);
    else if (
time >= 60 && time 3600)
        
format(strsizeof(str), (time >= 120) ? ("%d minutes") : ("%d minute"), time 60);
    else if (
time >= 3600 && time 86400)
        
format(strsizeof(str), (time >= 7200) ? ("%d hours") : ("%d hour"), time 3600);
    else if (
time >= 86400 && time 2592000)
         
format(strsizeof(str), (time >= 172800) ? ("%d days") : ("%d day"), time 86400);
    else if (
time >= 2592000 && time 31536000)
         
format(strsizeof(str), (time >= 5184000) ? ("%d months") : ("%d month"), time 2592000);
    else if (
time >= 31536000)
        
format(strsizeof(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(vehicleidenginelightsalarmdoorsbonnetbootobjective);
    if (
engine != 1)
        return 
0;
    return 
1;
}
GetHoodStatus(vehicleid)
{
    static
        
engine,
        
lights,
        
alarm,
        
doors,
        
bonnet,
        
boot,
        
objective;
    
GetVehicleParamsEx(vehicleidenginelightsalarmdoorsbonnetbootobjective);
    if (
bonnet != 1)
        return 
0;
    return 
1;
}
GetTrunkStatus(vehicleid)
{
    static
        
engine,
        
lights,
        
alarm,
        
doors,
        
bonnet,
        
boot,
        
objective;
    
GetVehicleParamsEx(vehicleidenginelightsalarmdoorsbonnetbootobjective);
    if (
boot != 1)
        return 
0;
    return 
1;
}
GetLightStatus(vehicleid)
{
    static
        
engine,
        
lights,
        
alarm,
        
doors,
        
bonnet,
        
boot,
        
objective;
    
GetVehicleParamsEx(vehicleidenginelightsalarmdoorsbonnetbootobjective);
    if (
lights != 1)
        return 
0;
    return 
1;
}
SetEngineStatus(vehicleidstatus)
{
    static
        
engine,
        
lights,
        
alarm,
        
doors,
        
bonnet,
        
boot,
        
objective;
    
GetVehicleParamsEx(vehicleidenginelightsalarmdoorsbonnetbootobjective);
    return 
SetVehicleParamsEx(vehicleidstatuslightsalarmdoorsbonnetbootobjective);
}
SetLightStatus(vehicleidstatus)
{
    static
        
engine,
        
lights,
        
alarm,
        
doors,
        
bonnet,
        
boot,
        
objective;
    
GetVehicleParamsEx(vehicleidenginelightsalarmdoorsbonnetbootobjective);
    return 
SetVehicleParamsEx(vehicleidenginestatusalarmdoorsbonnetbootobjective);
}
SetTrunkStatus(vehicleidstatus)
{
    static
        
engine,
        
lights,
        
alarm,
        
doors,
        
bonnet,
        
boot,
        
objective;
    
GetVehicleParamsEx(vehicleidenginelightsalarmdoorsbonnetbootobjective);
    return 
SetVehicleParamsEx(vehicleidenginelightsalarmdoorsbonnetstatusobjective);
}
SetHoodStatus(vehicleidstatus)
{
    static
        
engine,
        
lights,
        
alarm,
        
doors,
        
bonnet,
        
boot,
        
objective;
    
GetVehicleParamsEx(vehicleidenginelightsalarmdoorsbonnetbootobjective);
    return 
SetVehicleParamsEx(vehicleidenginelightsalarmdoorsstatusbootobjective);

Reply

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;
}
Reply

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:
forward OnPlayerFullyConnect(playerid);
public 
OnPlayerConnect(playerid)
     
SetTimerEx("OnPlayerFullyConnect"0001false"i"playerid);
public 
OnPlayerFullyConnect(playerid) {
     ..

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.
Reply

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=1i<MAX_VEHICLESi++)
    {
        
GetPlayerPos(ixyz);
        if(
GetPlayerDistanceFromPoint(playeridxyz) > distance) continue;
        else 
distance GetPlayerDistanceFromPoint(playeridxyz), player i;
    }
    return 
player == playerid ? -player;
}
IsARPName(const playername[MAX_PLAYER_NAME])
{
    if(
strfind(playername"_"true) == -1) return false;
    new 
psize strlen(playername);
    for(new 
ipsizei++)
    {
        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(secondsizeof(second), "[Error] {FF0000}%s"msg);
    
va_format(strinngsizeof(strinng), secondva_start<2>);
    return 
SendClientMessage(playerid0xCC0000FFstrinng);
}
GetName(playerid)
{
    static 
str[MAX_PLAYER_NAME];
    
GetPlayerName(playeridstrsizeof(str));
    return 
str;
}
SCMF(playeridcouleur, const msg[], va_args<>)
{
    static
        
string[145];
    
va_format(stringsizeof(string), msgva_start<3>);
    return 
SendClientMessage(playeridcouleurstring);
}
SendClientMessageToAllEx(color, const message[], va_args<>)
{
    static 
msg[190];
    
va_format(msgsizeof(msg), messageva_start<2>);
    return 
SendClientMessageToAll(colormsg);

Reply

Quote:
Originally Posted by Luicy.
View Post
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:
forward OnPlayerFullyConnect(playerid);
public 
OnPlayerConnect(playerid)
     
SetTimerEx("OnPlayerFullyConnect"0001false"i"playerid);
public 
OnPlayerFullyConnect(playerid) {
     ..

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.
Emmet's No Class Selection include does this and better.
Reply

PHP Code:
SecondToTime(seconds

    new 
string[40], minuteshoursnewseconds seconds
    while(
newseconds>=60){newseconds-=60,minutes++;} 
    while(
minutes>=60){minutes-=60,hours++;} 
    
format(stringsizeof(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

Reply

ReturnTimelapse
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;
}
Example:
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"
Reply

Create a circle with an object and get the center's coordinates.
PHP Code:
CreateCircle(objectidFloat:xFloat:yFloat:zFloat:size, &Float:valA2, &Float:valB2, &Float:valC2)
{
    new 
Float:valx2,
        
Float:valy2,
        
Float:valz2;
    for(new 
i360i++) // 3498 - 1214
    
{
        if(
== 180)
        {
            
valx2 x;
            
valy2 y;
            
valz2 z;
        }
        
x+size*floatcos(i,degrees);
          
y+size*floatsin(i,degrees);
      
          if(
objectid != 0CreateObject(objectidxyz0.00.00.0);
    }
    
GetCoordMid2Pts(valx2valy2valz2xyzvalA2valB2valC2);
}
stock GetCoordMid2Pts(Float:x1Float:y1Float:z1Float:x2Float:y2Float:z2, &Float:rX, &Float:rY, &Float:rZ)
{
    
rX = (x1+x2)/2;
    
rY = (y1+y2)/2
    
rZ = (z1+z2)/2;

Reply


Forum Jump:


Users browsing this thread: 29 Guest(s)