SA-MP Forums

SA-MP Forums (http://forum.sa-mp.com/index.php)
-   Русский/Russian (http://forum.sa-mp.com/forumdisplay.php?f=32)
-   -   Коллекция функций / макросов (http://forum.sa-mp.com/showthread.php?t=118026)

MX_Master 02/01/2010 08:13 PM

Коллекция функций / макросов
 
В общем разделе есть похожая темка, где человеки могут поделится очень ценными функциями или инструментами, не создавая никаких новых тем и релизов библиотек. Желающие могут запостить тут свои (возможно, чужие) функции, макросы и их описание. Естессна, от функции или макроса должен быть толк (:

* Желательно не более 5 штук в посте, а то всем будет не очень приятно читать и просматривать.
* Флуд из темы будет удаляться. Остаются только скрипты/функции/макросы и сообщения строго по теме.

Начну я с небольших но быстрых функций. Описание прямо в комментах в коде.
Вот код для тестирования - http://pastebin.mozilla-russia.org/103683.

Code:

/*
        Выдёргивает из строки source[], разделенной пробелами,
        подстроку под указанным индексом index и помещает ее
        в dest[]

        Фактически это шустрая замена strtok и похожих функций


        maxsize                это максимальная длина подстроки,
                                если подстрока больше этой длина,
                                то она будет урезана

        При вызове этой функции в ОЗУ выделяется
        не более 5 временных pawn ячеек (20 байт)


        ПРИМЕРЫ
                new dest[20], source[] = "/givecash 17 50000";

                sparam( dest, 20, source, -1 ); // в dest будет помещено "", т.к. такой индекс не существует
                sparam( dest, 20, source, 0 ); // в dest будет помещено "/givecash"
                sparam( dest, 20, source, 1 ); // в dest будет помещено "17"
                sparam( dest, 20, source, 2 ); // в dest будет помещено "50000"
                sparam( dest, 20, source, 3 ); // в dest будет помещено "", т.к. такой индекс не существует
*/
stock sparam ( dest[], maxsize = sizeof(dest), source[], index = 0 )
{
        dest[0] = 0;

        for ( new cur, pre, i = -1; ; cur++ )
        {
                switch ( source[cur] )
                {
                        case ' ' :
                        {
                                if ( ++i == index )
                                {
                                        strmid( dest, source, pre, cur, maxsize );
                                        return;
                                }

                                pre = cur + 1;
                        }

                        case 0 :
                        {
                                if ( ++i == index ) strmid( dest, source, pre, cur, maxsize );
                                return;
                        }
                }
        }
}




/*
        А это макрос, аналогичный функции sparam,
        который по логике должен работать еще быстрее,
        т.к. это вовсе не функция.

        Параметры и их порядок такой же как у функции sparam.

        При вызове этого макроса в ОЗУ выделяется
        не более 3 временных pawn ячеек (12 байт)
*/
#define  m_sparam(%0,%1,%2,%3)  %0[0]=0;for(new cur,pre,i=(-1);;cur++){switch(%2[cur]){case ' ':{if(++i==(%3)){strmid(%0,%2,pre,cur,(%1));break;}pre=cur+1;}case 0:{if(++i==%3)strmid(%0,%2,pre,cur,(%1));break;}}}

модер: подправил название, чтобы тема отражала смысл более четко

MX_Master 03/01/2010 12:41 PM

Re: Коллекция функций / макросов
 
еще парочка похожих функций, только для извлечения целых и дробных чисел

iparam

Code:

/*
        Выдёргивает из строки source[], разделенную пробелами,
        подстроку под указанным индексом index и возвращает ее
        числовое значение


        При вызове этой функции в ОЗУ выделяется
        не более 16 временных pawn ячеек (64 байта)


        ПРИМЕРЫ
                new targetPlayerID, sendMoney,
                        source[] = "/givecash 17 50000";

                targetPlayerID        = iparam( source, 1 ); // в targetPlayerID будет помещено 17
                sendMoney                = iparam( source, 2 ); // в sendMoney будет помещено 50000
*/
stock iparam ( source[], index = 0 )
{
        for ( new dest[12], cur, pre, i = -1; ; cur++ )
        {
                switch ( source[cur] )
                {
                        case ' ' :
                        {
                                if ( ++i == index )
                                {
                                        strmid( dest, source, pre, cur, 12 );
                                        return strval(dest);
                                }

                                pre = cur + 1;
                        }

                        case 0 :
                        {
                                if ( ++i == index ) strmid( dest, source, pre, cur, 12 );
                                return strval(dest);
                        }
                }
        }
}


fparam

Code:

/*
        Выдёргивает из строки source[], разделенную пробелами,
        подстроку под указанным индексом index и возвращает ее
        дробное значение


        При вызове этой функции в ОЗУ выделяется
        не более 44 временных pawn ячеек (220 байт)


        ПРИМЕРЫ
                new targetPlayerID, Float:newHealth,
                        source[] = "/sethealth 12 77.0";

                targetPlayerID        = iparam( source, 1 ); // в targetPlayerID будет помещено 12
                newHealth                = fparam( source, 2 ); // в sendMoney будет помещено 77.0
*/
stock Float:fparam ( source[], index = 0 )
{
        for ( new dest[40], cur, pre, i = -1; ; cur++ )
        {
                switch ( source[cur] )
                {
                        case ' ' :
                        {
                                if ( ++i == index )
                                {
                                        strmid( dest, source, pre, cur, 40 );
                                        return floatstr(dest);
                                }

                                pre = cur + 1;
                        }

                        case 0 :
                        {
                                if ( ++i == index ) strmid( dest, source, pre, cur, 40 );
                                return floatstr(dest);
                        }
                }
        }
}

скрипт для проверки - http://pastebin.mozilla-russia.org/103690

[JIeXa] 03/01/2010 03:54 PM

Re: Коллекция функций / макросов
 
Я канешна же нихера не понимаю в быстродействии, и вообще нуб, но всё же....

stock sparam (dest[], source[], index = 0)
{
new pos = 0, i = -1, nextpos = 0;
while (++i < index) pos = strfind(source, " ", true, pos), pos++;
nextpos = strfind(source, " ", true, pos);
if (nextpos == -1) nextpos = strlen(source);
strmid(dest, source, pos, nextpos, 100);
}

вот так мне нравится гораздо больше...
особенно потому, что более низкие уровни языков действуют гораздо быстрее...
т.е. если strfind написан на C++, то он будет в сто раз быстрее длиннющих циклов в pawn.

и небольшой модификат старой:

stock sparam (dest[], source[], index = 0) {
for (new cur, pre, i = -1;;cur++) {
if(source[cur] == ' ') {
if (++i == index) { strmid(dest, source, pre, cur, 50), break; }
pre = cur + 1;
}
if (source[cur] == 0) {
if (i == index) strmid(dest, source, pre, cur, 50);
break;
}
}
}

P.s. в С++ конечно предпочтение отдаю второму варианту.

Serafim_sd 03/01/2010 06:11 PM

Re: Коллекция функций / макросов
 
Возвращает UNIX-timestamp, необходимая вещь для создания веб-статистик и всего веб-прочего. :)
Code:

stock mktime(uhour,uminute,usecond,uday,umonth,uyear) {
        new timestamp2;

        timestamp2 = usecond + (uminute * 60) + (uhour * 3600);

        new days_of_month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };

        if ( ((uyear % 4 == 0) && (uyear % 100 != 0)) || (uyear % 400 == 0) ) {
                        days_of_month[1] = 29;
                } else {
                        days_of_month[1] = 28;
                }
       
        new days_this_year = 0;
        days_this_year = --uday;
        if(umonth > 1) {
                for(new i=0; i<umonth-1;i++) {
                        days_this_year += days_of_month[i];
                }
        }
        timestamp2 += days_this_year * 86400;

        for(new j=1970;j<uyear;j++) {
                timestamp2 += 31536000;
                if ( ((j % 4 == 0) && (j % 100 != 0)) || (j % 400 == 0) ) timestamp2 += 86400;
        }
        return timestamp2;
}

ЗЫ нинада драца, давайте травите что у вас там есть)

[JIeXa] 03/01/2010 07:02 PM

Re: Коллекция функций / макросов
 
Code:

//      сорц строка, двумерный массив, разделитель
// разделяет строку по символу на куски в массив.
stock split(const strsrc[], strdest[][], delimiter)
{
        new i, li;
        new aNum;
        new len;
        while(i <= strlen(strsrc))
        {
          if(strsrc[i]==delimiter || i==strlen(strsrc))
                {
            len = strmid(strdest[aNum], strsrc, li, i, 128);
            strdest[aNum][len] = 0;
            li = i+1;
            aNum++;
                }
                i++;
        }
        return 1;
}

// создать хэш таблицу
stock hmake(const name[]) return HLoad(name,"All");
// очистить хэш таблицу
stock hfree(const name[]) { HClose(name), HLoad(name, "All"); }
// узнать данные в хт,  единица данных какой номер
stock hgetv(const name[], const item[], value) {
        if(value > 0 && value < 11) {
                new ret[256];
                HGet(name, item, ret);
                new rst[11][10];
                split(ret,rst,',');
                return rst[value-1];
        }
}
добавить в хт, в ещё таблицу, и под номером таким та
stock haddv(const name[], const item[], value, const data[]) {
        if(value > 0 && value < 11) {
                new ret[512];
                HGet(name, item, ret);
                if(!equal(ret,"")) {
                        new rst[11][50];
                        split(ret,rst,',');
                        strdel(ret,0,512);
                        for(new i;i<11;i++) {
                          if(i == value) format(ret,sizeof(ret),"%s,%s",ret,data);
                          else if(i == 0) format(ret,sizeof(ret),"%s",rst[i]);
                          else format(ret,sizeof(ret),"%s,%s",ret,rst[i]);
                        }
                } else { format(ret,sizeof(ret),"%s",data); }
          HAdd(name, item, ret);
                return ret;
        }
        return ret;
}

; установить значение rgba в цвете.

stock setrgba(res,r,g,b,a)
{
  if(r != 0x00) { res = (res & 0x00ffffff) | (r << 24); }
        if(g != 0x00) { res = (res & 0xff00ffff) | (g << 16); }
        if(b != 0x00) { res = (res & 0xffff00ff) | (b << 8); }
        if(a != 0x00) { res = (res & 0xffffff00) | a; }
        return res;
}

// поставить значение альфа

stock seta(color,a)
        return color & 0xffffff00 | a;

; хз чо такое :)
// а ну, прибавить к альфе ещё маленька альфы :)
stock givea(color,a)
        return color | a;

;кол-во цифорок в числе
stock num(numb)
{
        new i = 10, d = 1;
        while(i<=numb) i*=10, d++;
        return d;
}

;узнать из цвета r g b a
stock getr(color)
        return (color & 0xFF000000) >> 24;
       
stock getg(color)
        return (color & 0x00FF0000) >> 16;
       
stock getb(color)
        return (color & 0x0000FF00) >> 8;
       
stock geta(color)
        return color & 0x000000FF;

;удаляем в строке от start до end
stock strdel2(str[], start, end)
{
        new str2[256];
        for(new i;i<start-1;i++) str2[i] = str[i];
        for(new i = end-1;i<strlen2(str);i++) str2[i - end + start] = str[i];
        return str2;
}

// копируем в dest из source данные от start, и len символов.

stock strmid3(dest[], source[], start, len) {
        for(new i = start;i < strlen(source) - (start - len + 1);i++) dest[i-start] = source[i];
}

// сортировка пузырьком.. ^^
stock BubbleSort(mass[])
{
        new top = 4 - 1;
        while(top != 0)
        {
                for(new i;i < top;i++)
                {
                        if(mass[i] > mass[i+1])
                        {
                                new temp = mass[i];
                                mass[i] = mass[i+1];
                                mass[i+1] = temp;
                        }
                }
                top--;
        }
}

// соединение строк

stock TooStrings(str[],str2[]) {
        new string2[256];
  format(string2,256,"%s%s",str,str2);
  return string2;
}

/*
-----------------------
это типа вставить строку string в source с pos'a(в соурс)
By Aleksey
-----------------------
*/
stock strins2(string[], source[], pos) {
        new len = strlen2(string);
        new str[256];
        for(new i = 0;i < pos;i++) str[i] = source[i];
        for(new i = pos;i < pos+len;i++) str[i] = string[i-pos];
        for(new i = pos+len;i < strlen2(source)+len;i++) str[i] = source[i-len];
        return str;
}

/*
-----------------------
возвращает N правых символов, если N < 0, то вовзращает символы от strlen2(string)+N до strlen2(string)
это м.. возвращает n правый символов(мона юзать -n)
By Aleksey
-----------------------
*/
stock right(string[],N) {
        new dest[256];
        if (N > 0) { for(new i = strlen2(string) - N;i < strlen2(string);i++) dest[i-(strlen2(string)-N)] = string[i]; }
        if (N < 0) { for(new i = strlen2(string) + N;i < strlen2(string);i++) dest[i-(strlen2(string)+N)] = string[i]; }
        return dest;
}
/*
-----------------------
возвращает N левых символов, если N < 0, то вовзращает символы от 0 до strlen2(string)+N
возвращает n левых символов, мона юзать -n
By Aleksey
-----------------------
*/
stock left(string[],N) {
        new dest[256];
        if (N > 0) { for(new i;i < N;i++) dest[i] = string[i]; }
        if (N < 0) { for(new i;i < strlen2(string)+N;i++) dest[i] = string[i]; }
        return dest;
}
/*
-----------------------
поиск findtext в source, с позиции pos(по умолчанию = 0)
находит позицию строки findtext в source с pos
By Aleksey
-----------------------
*/
stock strfind2(source[],findtext[],pos = 0) {
        new n;
        for(new i = pos;i < strlen2(source);i++) {
                for(new m;m < strlen2(findtext);m++) {
                        if (source[i+m] == findtext[m] && n < strlen2(findtext)) n++;
                        if (n == strlen2(findtext)) return i;
                }
                n=0;
        }
        return -1;
}
/*
-----------------------
возвращает длину строки
длина строки?
By Aleksey
-----------------------
*/
stock strlen2(str[]) {
        new c; while(str[c++]!=0) {}
        return c-1;
}
/*
-----------------------
копирование символов из source в dest, maxlength - макс. длина dest
эм..
соурс приравнивает в дест..
By Aleksey
-----------------------
*/
stock strcat2(dest[], source[],maxlength = sizeof(dest)) { for(new i;i<maxlength;i++) dest[i] = source[i]; }
/*
-----------------------
в dest копируются символы с source со start до end, maxlength - макс. длина dest
в дест копируется символы c source со start до end
By Aleksey
-----------------------
*/
stock strmid2(dest[], source[], start, end, maxlength = sizeof(dest)) {
        for(new i = start;i < end;i++) { if (strlen2(dest) < maxlength) dest[i-start] = source[i]; else break; }
}

/*
-----------------------
Конвентирует число s из fs системы счисления в fd систему счисления
строка, все числа в строке, конвентирует из fs системы счисления в fd.
By Aleksey
-----------------------
*/
stock conv(s[], fs, fd)
{
        new A, sd[256];
        for (new i; i < strlen2(s); i++)
        {
                new a = strval2(s[i]);
                if ((a >= 0) && (a <= fs)) A = A * fs + a;
                else break;
        }
        while (A != 0)
        {
                format(sd,sizeof(sd),"%s%s",valstr2(A % fd),sd);
                A /= fd;
        }
        return sd;
}

/*
-----------------------
Возвращает номер символа из таблицы ASCII
возвращает номер символа по ASCII
By Aleksey
-----------------------
*/
stock asc(S)
        return S;
/*
-----------------------
Возвращает символ по номеру в таблице ASCII
возвращает символ из номера символа по ASCII
By Aleksey
-----------------------
*/
stock chr(N) {
        new str[1];
        format(str,sizeof(str),"%s",N);
        return str;
}

.... :)

[JIeXa] 03/01/2010 07:04 PM

Re: Коллекция функций / макросов
 
jula by aleksey:

Code:

#include <a_samp>
new Object;
main()
{
SetGameModeText("Jula By Aleksey");
AddPlayerClass(0,0, 0, 105,0,1,1,2,1,3,1);
Object = CreateObject(13607,0,0,100,0,0,0);
SetTimer("Main", 100, 1);
}
forward Main();
public Main()
{
        new Float:Pos[3],Float:Rot[3],Float:XPos,Float:YPos,Float:Power;
        for(new i;i < 5;i++)
        {
        if(!IsPlayerConnected(i)) continue;
        GetPlayerPos(i,Pos[0],Pos[1],Pos[2]);
        if(Pos[0] > 40 || Pos[0] < -40 || Pos[1] > 40 || Pos[1] < -40 || Pos[2] > 113 || Pos[2] < -113) continue;
        XPos+=Pos[1], YPos-=Pos[0];
        Power+=floatsqroot((Pos[1]*Pos[1])+(Pos[0]*Pos[0]));
        }
        GetObjectRot(Object,Rot[0],Rot[1],Rot[2]);
        Rot[0]-=floatdiv(XPos*Power,5000);
        Rot[1]-=floatdiv(YPos*Power,5000);
        if(Rot[0] < 35 && Rot[0] > -35 && Rot[1] < 35 && Rot[1] > -35) SetObjectRot(Object,Rot[0],Rot[1],Rot[2]);
        return 1;
}


MX_Master 04/01/2010 06:07 AM

Re: Коллекция функций / макросов
 
asc и chr - бесполезные функции, т.к. для pawn неважно как писать, или ' ' или 32, ну разве что в функции format для символа есть свое обозначение - %c
mktime - уже давно был написан и лежит в старой библиотеке dutils.inc

Quote:

Originally Posted by MX_Master
кстати, все знают, что стандартная функция gettime возвращает текущий unix timestamp ? она также может возвращать по ссылке отдельные значения часа, минуты и секунды как обычно. Т.е. чтобы узнать unix timestamp сервера в данный момент можно просто написать new stamp = gettime(); и все, даже без параметров (: хотя кто-то мог это знать

стандартная getdate возвращает день текущего года по порядку ну и, канеш, по ссылке возврашает день месяц и год отдельно. К примеру, если на дворе 23-е февраля, то getdate(); вернет 54 (31 дня января + 23 февраля).


[JIeXa]
сортировка методом пузырька заставила меня вспомнить те времена, когда я ходил на дополнительные занятия по трубо паскаЛЛю (: однако, мне помниЦЦо была еще одна быстрейшая "сортирова с разделением" там


со своей стороны предлагаю 3 самые быстрые и удобные функции для работы с unix timestamp.

Quote:

Originally Posted by MX_Master
СПРАВКО:
unix timestamp - кол-во секунд начиная, с 1 января 1970 года


date_to_timestamp - более быстрый аналог mktime, который не создает никаких лишних переменных. Фактически функцию можно заменить макросом, только стоит помнить, что функция меняет значение передаваемого аргумента day на другое.
[aeva]
Code:

/*
        Возвращает UNIX TIMESTAMP в соответствии с указанной датой.

        ПОДРОБНЕЕ
                UNIX TIMESTAMP это кол-во секунд со дня 01.01.1970, 00:00:00 до
                указанной в параметрах даты

        ВЕРНЕТ
                число integer (4 байта)
*/
stock date_to_timestamp
(
        year = 1970,        month = 1,        day  = 1,
        hour =  0,        minute = 0,        second = 0
)
{
        switch ( month )
        {
                case 2 : day += 31;        case 3 : day += 59;        case 4 : day += 90;
                case 5 : day += 120;        case 6 : day += 151;        case 7 : day += 181;
                case 8 : day += 212;        case 9 : day += 243;        case 10 : day += 273;
                case 11 : day += 304;        case 12 : day += 334;
        }

        return ( second + minute*60 + hour*3600 + (day - 1)*86400
                + (year - 1970)*31557600 + ( year % 4 == 0 ? 21600 : 0 ) );
}

[/aeva]

timestamp_to_date - обратное преобразование из unix timestamp в отдельные - год, месяц, число, час, минуту, секунду. Естессна, также не создает никаких лишних переменных внутри.
[aeva]
Code:

/*
        Возвращает по ссылке дату в соответствии с указанным UNIX TIMESTAMP.

        ПОДРОБНЕЕ
                UNIX TIMESTAMP это кол-во секунд со дня 01.01.1970, 00:00:00 до
                указанной в параметрах даты. Если он правильно указан, то в
                year будет помещен год, в month - месяц, в day - день,
                в hour - час, в minute - минута, в second - секунда.

        ВЕРНЕТ
                ничего
*/
stock timestamp_to_date
(
        unix_timestamp = 0,

        & year = 1970,                & month = 1,                & day  = 1,
        & hour =  0,                & minute = 0,                & second = 0
)
{
        year = unix_timestamp / 31557600;
        unix_timestamp -= year * 31557600;
        year += 1970;

        if ( year % 4 == 0 ) unix_timestamp -= 21600;

        day = unix_timestamp / 86400;

        switch ( day )
        {
                // в second будет временно хранится число месяца
                case  0..30 : { second = day;    month = 1; }
                case  31..58 : { second = day - 31; month = 2; }
                case  59..89 : { second = day - 59; month = 3; }
                case 90..119 : { second = day - 90; month = 4; }
                case 120..150 : { second = day - 120; month = 5; }
                case 151..180 : { second = day - 151; month = 6; }
                case 181..211 : { second = day - 181; month = 7; }
                case 212..242 : { second = day - 212; month = 8; }
                case 243..272 : { second = day - 243; month = 9; }
                case 273..303 : { second = day - 273; month = 10; }
                case 304..333 : { second = day - 304; month = 11; }
                case 334..366 : { second = day - 334; month = 12; }
        }

        unix_timestamp -= day * 86400;
        hour = unix_timestamp / 3600;

        unix_timestamp -= hour * 3600;
        minute = unix_timestamp / 60;

        unix_timestamp -= minute * 60;
        day = second + 1;
        second = unix_timestamp;
}

[/aeva]

date - сложный, но несомненно самый полезный инструмент, который схож по своему смыслу с функцией date() из PHP. Кто в танке знает, что без date() в PHP не обходится ни один скрипт вывода времени в нужном формате на страницу. Даже на странице, которую вы читаете сейчас, все даты и время были созданы с помощью функции date() (:
[aeva]
Code:

/*
        Заменяет в указанной строке условные обозначения времени на их значения
        в соответствии с указанным UNIX TIMESTAMP

        ПОДРОБНЕЕ
                UNIX TIMESTAMP это кол-во секунд со дня 01.01.1970, 00:00:00 до
                указанной в параметрах даты. Если он правильно указан, то в
                строке format все условные обозначения времени будут заменены
                на их значения в соответствии с указанным UNIX TIMESTAMP.

                Функция ищет:        Заменяет на:
                %yyyy                        четырехзначное значение года
                %yy                        двузначное значение года с ведущим нулём
                %m                        значение месяца
                %mm                        значение месяца с ведущим нулём
                %d                        значение дня
                %dd                        значение дня с ведущим нулём
                %h                        значение часа
                %hh                        значение часа с ведущим нулём
                %i                        значение минуты
                %ii                        значение минуты с ведущим нулём
                %s                        значение секунды
                %ss                        значение секунды с ведущим нулём

        ВЕРНЕТ
                строку с численными значениями даты вместо их псевдонимов
                размер строки = sizeOfOutput
*/
stock date ( formatStr[] = "%dd.%mm.%yyyy, %hh:%ii:%ss", timestamp = 0 )
{
        // ------------
        const sizeOfOutput = 128; // размер возвращаемой строки

        new yyyy, mm, dd, h, m, s,
                pos, foundPos, searchStartPos, outStrLen,
                tmpNumStr[5], outStr[sizeOfOutput];

        timestamp_to_date( timestamp, yyyy,mm,dd, h,m,s ); // превратим штамп в дату
        // ------------


        // -------------------
        // скопируем formatStr в outStr
        memcpy( outStr, formatStr, 0, (sizeOfOutput - 1)*4 );
        outStr[sizeOfOutput - 1] = 0; // правильный обрез строки в целях безопасности

        outStrLen = strlen(outStr);
        // -------------------


        // YEAR
        // -------------------
        searchStartPos = 0; // поз начала поиска = 0
        foundPos = strfind( outStr, "%yyyy", false, searchStartPos ); // ищем первую позицию

        while ( foundPos != -1 )
        {
                format( tmpNumStr, 5, "%04d", yyyy ); // tmpNumStr = строкое значение yyyy

                for ( pos = 0; tmpNumStr[pos] != 0 && pos < 4; pos++ ) // замена псевдонима на значение
                        outStr[foundPos + pos] = tmpNumStr[pos];

                // сдвиг назад на 1 дальнейшего контента строки
                for ( pos += foundPos; pos < outStrLen; pos++ )
                        outStr[pos] = outStr[pos + 1];

                outStr[pos] = 0; // правильный обрез строки
                outStrLen = strlen(outStr); // размер строки изменился
                searchStartPos = foundPos + 4; // позиция начала след. поиска += 4

                if ( searchStartPos < outStrLen ) // если поз начала поиска меньше длины строки
                        foundPos = strfind( outStr, "%yyyy", false, searchStartPos ); // продолжим поиск
                else break; // иначе - остановим поиск и замену
        }
        // -------------------


        // -------------------
        searchStartPos = 0; // поз начала поиска = 0
        foundPos = strfind( outStr, "%yy", false, searchStartPos ); // ищем первую позицию

        while ( foundPos != -1 )
        {
                format( tmpNumStr, 5, "%04d", yyyy ); // tmpNumStr = строкое значение yyyy

                for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
                        outStr[foundPos + pos] = tmpNumStr[pos + 2];

                // сдвиг назад на 1 дальнейшего контента строки
                for ( pos += foundPos; pos <= outStrLen; pos++ )
                        outStr[pos] = outStr[pos + 1];

                outStr[pos] = 0; // правильный обрез строки
                outStrLen = strlen(outStr); // размер строки изменился
                searchStartPos = foundPos + 2; // позиция начала след. поиска изменилась

                if ( searchStartPos < outStrLen ) // если поз начала поиска меньше длины строки
                        foundPos = strfind( outStr, "%yy", false, searchStartPos ); // продолжим поиск
                else break; // иначе - остановим поиск и замену
        }
        // -------------------


        // MONTH
        // -------------------
        foundPos = 0; // поз начала поиска = 0
        foundPos = strfind( outStr, "%mm", false, foundPos ); // ищем первую позицию

        while ( foundPos != -1 )
        {
                format( tmpNumStr, 3, "%02d", mm ); // tmpNumStr = строкое значение числа

                for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
                        outStr[foundPos + pos] = tmpNumStr[pos];

                // сдвиг назад на 1 дальнейшего контента строки
                for ( pos += foundPos; pos <= outStrLen; pos++ )
                        outStr[pos] = outStr[pos + 1];

                outStr[pos] = 0; // правильный обрез строки
                outStrLen = strlen(outStr); // размер строки изменился
                foundPos += 2; // позиция начала след. поиска изменилась

                if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
                        foundPos = strfind( outStr, "%mm", false, foundPos ); // продолжим поиск
                else break; // иначе - остановим поиск и замену
        }
        // -------------------


        // -------------------
        foundPos = 0; // поз начала поиска = 0
        foundPos = strfind( outStr, "%m", false, foundPos ); // ищем первую позицию

        while ( foundPos != -1 )
        {
                format( tmpNumStr, 3, "%d", mm ); // tmpNumStr = строкое значение числа

                for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
                        outStr[foundPos + pos] = tmpNumStr[pos];

                // сдвиг назад на 1 дальнейшего контента строки
                if ( mm < 10 )
                {
                        for ( pos += foundPos; pos <= outStrLen; pos++ )
                                outStr[pos] = outStr[pos + 1];

                        outStr[pos] = 0; // правильный обрез строки
                        outStrLen = strlen(outStr); // размер строки изменился
                        foundPos++; // позиция начала след. поиска изменилась
                }
                else
                        foundPos += 2; // позиция начала след. поиска изменилась

                if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
                        foundPos = strfind( outStr, "%m", false, foundPos ); // продолжим поиск
                else break; // иначе - остановим поиск и замену
        }
        // -------------------


        // DAY
        // -------------------
        foundPos = 0; // поз начала поиска = 0
        foundPos = strfind( outStr, "%dd", false, foundPos ); // ищем первую позицию

        while ( foundPos != -1 )
        {
                format( tmpNumStr, 3, "%02d", dd ); // tmpNumStr = строкое значение числа

                for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
                        outStr[foundPos + pos] = tmpNumStr[pos];

                // сдвиг назад на 1 дальнейшего контента строки
                for ( pos += foundPos; pos <= outStrLen; pos++ )
                        outStr[pos] = outStr[pos + 1];

                outStr[pos] = 0; // правильный обрез строки
                outStrLen = strlen(outStr); // размер строки изменился
                foundPos += 2; // позиция начала след. поиска изменилась

                if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
                        foundPos = strfind( outStr, "%dd", false, foundPos ); // продолжим поиск
                else break; // иначе - остановим поиск и замену
        }
        // -------------------


        // -------------------
        foundPos = 0; // поз начала поиска = 0
        foundPos = strfind( outStr, "%d", false, foundPos ); // ищем первую позицию

        while ( foundPos != -1 )
        {
                format( tmpNumStr, 3, "%d", dd ); // tmpNumStr = строкое значение числа

                for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
                        outStr[foundPos + pos] = tmpNumStr[pos];

                // сдвиг назад на 1 дальнейшего контента строки
                if ( dd < 10 )
                {
                        for ( pos += foundPos; pos <= outStrLen; pos++ )
                                outStr[pos] = outStr[pos + 1];

                        outStr[pos] = 0; // правильный обрез строки
                        outStrLen = strlen(outStr); // размер строки изменился
                        foundPos++; // позиция начала след. поиска изменилась
                }
                else
                        foundPos += 2; // позиция начала след. поиска изменилась

                if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
                        foundPos = strfind( outStr, "%d", false, foundPos ); // продолжим поиск
                else break; // иначе - остановим поиск и замену
        }
        // -------------------


        // HOUR
        // -------------------
        foundPos = 0; // поз начала поиска = 0
        foundPos = strfind( outStr, "%hh", false, foundPos ); // ищем первую позицию

        while ( foundPos != -1 )
        {
                format( tmpNumStr, 3, "%02d", h ); // tmpNumStr = строкое значение числа

                for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
                        outStr[foundPos + pos] = tmpNumStr[pos];

                // сдвиг назад на 1 дальнейшего контента строки
                for ( pos += foundPos; pos <= outStrLen; pos++ )
                        outStr[pos] = outStr[pos + 1];

                outStr[pos] = 0; // правильный обрез строки
                outStrLen = strlen(outStr); // размер строки изменился
                foundPos += 2; // позиция начала след. поиска изменилась

                if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
                        foundPos = strfind( outStr, "%hh", false, foundPos ); // продолжим поиск
                else break; // иначе - остановим поиск и замену
        }
        // -------------------


        // -------------------
        foundPos = 0; // поз начала поиска = 0
        foundPos = strfind( outStr, "%h", false, foundPos ); // ищем первую позицию

        while ( foundPos != -1 )
        {
                format( tmpNumStr, 3, "%d", h ); // tmpNumStr = строкое значение числа

                for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
                        outStr[foundPos + pos] = tmpNumStr[pos];

                // сдвиг назад на 1 дальнейшего контента строки
                if ( h < 10 )
                {
                        for ( pos += foundPos; pos <= outStrLen; pos++ )
                                outStr[pos] = outStr[pos + 1];

                        outStr[pos] = 0; // правильный обрез строки
                        outStrLen = strlen(outStr); // размер строки изменился
                        foundPos++; // позиция начала след. поиска изменилась
                }
                else
                        foundPos += 2; // позиция начала след. поиска изменилась

                if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
                        foundPos = strfind( outStr, "%h", false, foundPos ); // продолжим поиск
                else break; // иначе - остановим поиск и замену
        }
        // -------------------


        // MINUTE
        // -------------------
        foundPos = 0; // поз начала поиска = 0
        foundPos = strfind( outStr, "%ii", false, foundPos ); // ищем первую позицию

        while ( foundPos != -1 )
        {
                format( tmpNumStr, 3, "%02d", m ); // tmpNumStr = строкое значение числа

                for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
                        outStr[foundPos + pos] = tmpNumStr[pos];

                // сдвиг назад на 1 дальнейшего контента строки
                for ( pos += foundPos; pos <= outStrLen; pos++ )
                        outStr[pos] = outStr[pos + 1];

                outStr[pos] = 0; // правильный обрез строки
                outStrLen = strlen(outStr); // размер строки изменился
                foundPos += 2; // позиция начала след. поиска изменилась

                if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
                        foundPos = strfind( outStr, "%ii", false, foundPos ); // продолжим поиск
                else break; // иначе - остановим поиск и замену
        }
        // -------------------


        // -------------------
        foundPos = 0; // поз начала поиска = 0
        foundPos = strfind( outStr, "%i", false, foundPos ); // ищем первую позицию

        while ( foundPos != -1 )
        {
                format( tmpNumStr, 3, "%d", m ); // tmpNumStr = строкое значение числа

                for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
                        outStr[foundPos + pos] = tmpNumStr[pos];

                // сдвиг назад на 1 дальнейшего контента строки
                if ( m < 10 )
                {
                        for ( pos += foundPos; pos <= outStrLen; pos++ )
                                outStr[pos] = outStr[pos + 1];

                        outStr[pos] = 0; // правильный обрез строки
                        outStrLen = strlen(outStr); // размер строки изменился
                        foundPos++; // позиция начала след. поиска изменилась
                }
                else
                        foundPos += 2; // позиция начала след. поиска изменилась

                if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
                        foundPos = strfind( outStr, "%i", false, foundPos ); // продолжим поиск
                else break; // иначе - остановим поиск и замену
        }
        // -------------------


        // SECOND
        // -------------------
        foundPos = 0; // поз начала поиска = 0
        foundPos = strfind( outStr, "%ss", false, foundPos ); // ищем первую позицию

        while ( foundPos != -1 )
        {
                format( tmpNumStr, 3, "%02d", s ); // tmpNumStr = строкое значение числа

                for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
                        outStr[foundPos + pos] = tmpNumStr[pos];

                // сдвиг назад на 1 дальнейшего контента строки
                for ( pos += foundPos; pos <= outStrLen; pos++ )
                        outStr[pos] = outStr[pos + 1];

                outStr[pos] = 0; // правильный обрез строки
                outStrLen = strlen(outStr); // размер строки изменился
                foundPos += 2; // позиция начала след. поиска изменилась

                if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
                        foundPos = strfind( outStr, "%ss", false, foundPos ); // продолжим поиск
                else break; // иначе - остановим поиск и замену
        }
        // -------------------


        // -------------------
        foundPos = 0; // поз начала поиска = 0
        foundPos = strfind( outStr, "%s", false, foundPos ); // ищем первую позицию

        while ( foundPos != -1 )
        {
                format( tmpNumStr, 3, "%d", s ); // tmpNumStr = строкое значение числа

                for ( pos = 0; tmpNumStr[pos] != 0 && pos < 2; pos++ ) // замена псевдонима на значение
                        outStr[foundPos + pos] = tmpNumStr[pos];

                // сдвиг назад на 1 дальнейшего контента строки
                if ( s < 10 )
                {
                        for ( pos += foundPos; pos <= outStrLen; pos++ )
                                outStr[pos] = outStr[pos + 1];

                        outStr[pos] = 0; // правильный обрез строки
                        outStrLen = strlen(outStr); // размер строки изменился
                        foundPos++; // позиция начала след. поиска изменилась
                }
                else
                        foundPos += 2; // позиция начала след. поиска изменилась

                if ( foundPos < outStrLen ) // если поз начала поиска меньше длины строки
                        foundPos = strfind( outStr, "%s", false, foundPos ); // продолжим поиск
                else break; // иначе - остановим поиск и замену
        }
        // -------------------


        return outStr;
}

[/aeva]

ЯРКИЙ ПРИМЕР - http://pastebin.mozilla-russia.org/103698

MX_Master 04/01/2010 07:40 PM

Re: Коллекция функций / макросов
 
Возможно, кому-то пригодится эта парочка макросов + полная инфа о всём транспорте игры. Получить нужную инфу по тачке можно, используя как ИД так и ее название.

Само инфо (типы, константы, массивы и 2 макроса в конце)
Code:

enum t_vType
{
        bike,
        sport,
        saloon,
        convertible,
        stationWagon,
        lowrider,
        offRoad,
        industrial,
        publicService,
        unique,
        helicopter,
        airplane,
        boat,
        trailer,
        rcVehicle
}

stock vTypeName [ t_vType ] [] =
{
        "Bike",
        "Sport",
        "Saloon",
        "Convertible",
        "Station Wagon",
        "Lowrider",
        "Off Road",
        "Industrial",
        "Public Service",
        "Unique",
        "Helicopter",
        "Airplane",
        "Boat",
        "Trailer",
        "RC Vehicle"
};




enum t_vModShop
{
        noneShop,
        transfender,
        locoLowCo,
        wheelArchAngels
}

stock vModShopName [ t_vModShop ] [] =
{
        "---",
        "Transfender",
        "Loco Low Co",
        "Wheel Arch Angels"
};




enum t_vSettings
{
        t_vType:        vType,
                        vName[30],
        t_vModShop:        vModShop
}

enum t_vName
{
        Landstalker,
        Bravura,
        Buffalo,
        Linerunner,
        Perenniel,
        Sentinel,
        Dumper,
        Firetruck,
        Trashmaster,
        Stretch,
        Manana,
        Infernus,
        Voodoo,
        Pony,
        Mule,
        Cheetah,
        Ambulance,
        Leviathan,
        Moonbeam,
        Esperanto,
        Taxi,
        Washington,
        Bobcat,
        Mr_Whoopee,
        BF_Injection,
        Hunter,
        Premier,
        Enforcer,
        Securicar,
        Banshee_Banger,
        Predator,
        Bus,
        Rhino,
        Barracks,
        Hotknife,
        Article_Trailer,
        Previon,
        Coach,
        Cabbie,
        Stallion,
        Rumpo,
        RC_Bandit,
        Romero,
        Packer,
        Monster,
        Admiral,
        Squallo,
        Seasparrow,
        Pizzaboy,
        Tram,
        Article_Trailer_2,
        Turismo,
        Speeder,
        Reefer,
        Tropic,
        Flatbed,
        Yankee,
        Caddy,
        Solair,
        Topfun,
        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,
        San_News_Maverick,
        Rancher,
        FBI_Rancher,
        Virgo,
        Greenwood,
        Jetmax,
        Hotring,
        Sandking,
        Blista_Compact,
        Police_Maverick,
        Boxville,
        Benson,
        Mesa,
        RC_Goblin,
        Hotring_Racer_1,
        Hotring_Racer_2,
        Bloodring_Banger,
        Ranchlure,
        Super_GT,
        Elegant,
        Journey,
        Bike,
        Mountain_Bike,
        Beagle,
        Cropduster,
        Stuntplane,
        Petrol_Tanker,
        Roadtrain,
        Nebula,
        Majestic,
        Buccaneer,
        Shamal,
        Hydra,
        FCR_900,
        NRG_500,
        Cop_Bike_HPV1000,
        Cement_Truck,
        Towtruck,
        Fortune,
        Cadrona,
        FBI_Truck,
        Willard,
        Forklift,
        Tractor,
        Combine_Harvester,
        Feltzer,
        Remington,
        Slamvan,
        Blade,
        Freight_Train,
        Brownstreak_Train,
        Vortex,
        Vincent,
        Bullet,
        Clover,
        Sadler,
        Firetruck_2,
        Hustler,
        Intruder,
        Primo,
        Cargobob,
        Tampa,
        Sunrise,
        Merit,
        Utility_Van,
        Nevada,
        Yosemite,
        Windsor,
        Monster_A,
        Monster_B,
        Uranus,
        Jester,
        Sultan,
        Stratum,
        Elegy,
        Raindance,
        RC_Tiger,
        Flash,
        Tahoma,
        Savanna,
        Bandito,
        Freight_Flat_Trailer_Train,
        Streak_Trailer_Train,
        Kart,
        Mower,
        Dune,
        Sweeper,
        Broadway,
        Tornado,
        AT400,
        DFT_30,
        Huntley,
        Stafford,
        BF_400,
        Newsvan,
        Tug,
        Petrol_Trailer,
        Emperor,
        Wayfarer,
        Euros,
        Hotdog,
        Club,
        Freight_Box_Trailer_Train,
        Article_Trailer_3,
        Andromada,
        Dodo,
        RC_Cam,
        Launch,
        Police_Car_LSPD,
        Police_Car_SFPD,
        Police_Car_LVPD,
        Ranger,
        Picador,
        SWAT,
        Alpha,
        Phoenix,
        Glendale_Shit,
        Sadler_Shit,
        Baggage_Trailer_A,
        Baggage_Trailer_B,
        Tug_Stairs_Trailer,
        Boxburg,
        Farm_Trailer,
        Utility_Trailer
}

stock vehicle [ t_vName ] [ t_vSettings ] =
{
        { offRoad,                        "Landstalker",                transfender },
        { saloon,                        "Bravura",                        transfender },
        { sport,                        "Buffalo",                        transfender },
        { industrial,                "Linerunner",                noneShop },
        { stationWagon,                "Perenniel",                transfender },
        { saloon,                        "Sentinel",                        transfender },
        { unique,                        "Dumper",                        noneShop },
        { publicService,        "Firetruck",                noneShop },
        { industrial,                "Trashmaster",                noneShop },
        { unique,                        "Stretch",                        transfender },
        { saloon,                        "Manana",                        transfender },
        { sport,                        "Infernus",                        transfender },
        { lowrider,                        "Voodoo",                        locoLowCo },
        { industrial,                "Pony",                                noneShop },
        { industrial,                "Mule",                                noneShop },
        { sport,                        "Cheetah",                        transfender },
        { publicService,        "Ambulance",                noneShop },
        { helicopter,                "Leviathan",                noneShop },
        { stationWagon,                "Moonbeam",                        transfender },
        { saloon,                        "Esperanto",                transfender },
        { publicService,        "Taxi",                                transfender },
        { saloon,                        "Washington",                transfender },
        { industrial,                "Bobcat",                        transfender },
        { unique,                        "Mr Whoopee",                noneShop },
        { offRoad,                        "BF Injection",                transfender },
        { helicopter,                "Hunter",                        noneShop },
        { saloon,                        "Premier",                        transfender },
        { publicService,        "Enforcer",                        noneShop },
        { unique,                        "Securicar",                noneShop },
        { sport,                        "Banshee Banger",        noneShop },
        { boat,                                "Predator",                        noneShop },
        { publicService,        "Bus",                                noneShop },
        { publicService,        "Rhino",                        noneShop },
        { publicService,        "Barracks",                        noneShop },
        { unique,                        "Hotknife",                        noneShop },
        { trailer,                        "Article Trailer",        noneShop },
        { saloon,                        "Previon",                        transfender },
        { publicService,        "Coach",                        noneShop },
        { publicService,        "Cabbie",                        transfender },
        { convertible,                "Stallion",                        transfender },
        { industrial,                "Rumpo",                        noneShop },
        { rcVehicle,                "RC Bandit",                noneShop },
        { unique,                        "Romero",                        transfender },
        { industrial,                "Packer",                        noneShop },
        { offRoad,                        "Monster",                        noneShop },
        { saloon,                        "Admiral",                        transfender },
        { boat,                                "Squallo",                        noneShop },
        { helicopter,                "Seasparrow",                noneShop },
        { bike,                                "Pizzaboy",                        noneShop },
        { unique,                        "Tram",                                noneShop },
        { trailer,                        "Article Trailer 2",        noneShop },
        { sport,                        "Turismo",                        transfender },
        { boat,                                "Speeder",                        noneShop },
        { boat,                                "Reefer",                        noneShop },
        { boat,                                "Tropic",                        noneShop },
        { industrial,                "Flatbed",                        noneShop },
        { industrial,                "Yankee",                        noneShop },
        { unique,                        "Caddy",                        noneShop },
        { stationWagon,                "Solair",                        transfender },
        { industrial,                "Topfun",                        noneShop },
        { airplane,                        "Skimmer",                        noneShop },
        { bike,                                "PCJ-600",                        noneShop },
        { bike,                                "Faggio",                        noneShop },
        { bike,                                "Freeway",                        noneShop },
        { rcVehicle,                "RC Baron",                        noneShop },
        { rcVehicle,                "RC Raider",                noneShop },
        { saloon,                        "Glendale",                        transfender },
        { saloon,                        "Oceanic",                        transfender },
        { bike,                                "Sanchez",                        noneShop },
        { helicopter,                "Sparrow",                        noneShop },
        { publicService,        "Patriot",                        noneShop },
        { bike,                                "Quad",                                noneShop },
        { boat,                                "Coastguard",                noneShop },
        { boat,                                "Dinghy",                        noneShop },
        { saloon,                        "Hermes",                        transfender },
        { sport,                        "Sabre",                        transfender },
        { airplane,                        "Rustler",                        noneShop },
        { sport,                        "ZR-350",                        transfender },
        { industrial,                "Walton",                        transfender },
        { stationWagon,                "Regina",                        transfender },
        { convertible,                "Comet",                        transfender },
        { bike,                                "BMX",                                noneShop },
        { industrial,                "Burrito",                        noneShop },
        { unique,                        "Camper",                        noneShop },
        { boat,                                "Marquis",                        noneShop },
        { unique,                        "Baggage",                        noneShop },
        { unique,                        "Dozer",                        noneShop },
        { helicopter,                "Maverick",                        noneShop },
        { helicopter,                "San News Maverick",        noneShop },
        { offRoad,                        "Rancher",                        transfender },
        { publicService,        "FBI Rancher",                noneShop },
        { saloon,                        "Virgo",                        transfender },
        { saloon,                        "Greenwood",                transfender },
        { boat,                                "Jetmax",                        noneShop },
        { sport,                        "Hotring",                        noneShop },
        { offRoad,                        "Sandking",                        noneShop },
        { sport,                        "Blista Compact",        transfender },
        { helicopter,                "Police Maverick",        noneShop },
        { industrial,                "Boxville",                        noneShop },
        { industrial,                "Benson",                        noneShop },
        { offRoad,                        "Mesa",                                transfender },
        { rcVehicle,                "RC Goblin",                noneShop },
        { sport,                        "Hotring Racer 1",        noneShop },
        { sport,                        "Hotring Racer 2",        noneShop },
        { saloon,                        "Bloodring Banger",        noneShop },
        { offRoad,                        "Ranchlure",                transfender },
        { sport,                        "Super GT",                        transfender },
        { saloon,                        "Elegant",                        transfender },
        { unique,                        "Journey",                        noneShop },
        { bike,                                "Bike",                                noneShop },
        { bike,                                "Mountain Bike",        noneShop },
        { airplane,                        "Beagle",                        noneShop },
        { airplane,                        "Cropduster",                noneShop },
        { airplane,                        "Stuntplane",                noneShop },
        { industrial,                "Petrol Tanker",        noneShop },
        { industrial,                "Roadtrain",                noneShop },
        { saloon,                        "Nebula",                        transfender },
        { saloon,                        "Majestic",                        transfender },
        { saloon,                        "Buccaneer",                transfender },
        { airplane,                        "Shamal",                        noneShop },
        { airplane,                        "Hydra",                        noneShop },
        { bike,                                "FCR-900",                        noneShop },
        { bike,                                "NRG-500",                        noneShop },
        { publicService,        "Cop Bike HPV1000",        noneShop },
        { industrial,                "Cement Truck",                noneShop },
        { unique,                        "Towtruck",                        noneShop },
        { saloon,                        "Fortune",                        transfender },
        { saloon,                        "Cadrona",                        transfender },
        { publicService,        "FBI Truck",                noneShop },
        { saloon,                        "Willard",                        transfender },
        { unique,                        "Forklift",                        noneShop },
        { industrial,                "Tractor",                        noneShop },
        { unique,                        "Combine Harvester",        noneShop },
        { convertible,                "Feltzer",                        transfender },
        { lowrider,                        "Remington",                locoLowCo },
        { lowrider,                        "Slamvan",                        locoLowCo },
        { lowrider,                        "Blade",                        locoLowCo },
        { unique,                        "Freight (Train)",        noneShop },
        { unique,                        "Brownstreak (Train)",        noneShop },
        { unique,                        "Vortex",                        noneShop },
        { saloon,                        "Vincent",                        transfender },
        { sport,                        "Bullet",                        transfender },
        { saloon,                        "Clover",                        transfender },
        { industrial,                "Sadler",                        noneShop },
        { publicService,        "Firetruck",                noneShop },
        { unique,                        "Hustler",                        transfender },
        { saloon,                        "Intruder",                        transfender },
        { saloon,                        "Primo",                        transfender },
        { helicopter,                "Cargobob",                        noneShop },
        { saloon,                        "Tampa",                        transfender },
        { saloon,                        "Sunrise",                        transfender },
        { saloon,                        "Merit",                        transfender },
        { industrial,                "Utility Van",                noneShop },
        { airplane,                        "Nevada",                        noneShop },
        { industrial,                "Yosemite",                        noneShop },
        { convertible,                "Windsor",                        transfender },
        { offRoad,                        "Monster 'A'",                noneShop },
        { offRoad,                        "Monster 'B'",                noneShop },
        { sport,                        "Uranus",                        wheelArchAngels },
        { sport,                        "Jester",                        wheelArchAngels },
        { saloon,                        "Sultan",                        wheelArchAngels },
        { stationWagon,                "Stratum",                        wheelArchAngels },
        { saloon,                        "Elegy",                        wheelArchAngels },
        { helicopter,                "Raindance",                noneShop },
        { rcVehicle,                "RC Tiger",                        noneShop },
        { sport,                        "Flash",                        wheelArchAngels },
        { lowrider,                        "Tahoma",                        locoLowCo },
        { lowrider,                        "Savanna",                        locoLowCo },
        { offRoad,                        "Bandito",                        noneShop },
        { trailer,                        "Freight Flat Trailer (Train)",        noneShop },
        { trailer,                        "Streak Trailer (Train)",        noneShop },
        { unique,                        "Kart",                                noneShop },
        { unique,                        "Mower",                        noneShop },
        { offRoad,                        "Dune",                                noneShop },
        { unique,                        "Sweeper",                        noneShop },
        { lowrider,                        "Broadway",                        locoLowCo },
        { lowrider,                        "Tornado",                        locoLowCo },
        { airplane,                        "AT400",                        noneShop },
        { industrial,                "DFT-30",                        noneShop },
        { offRoad,                        "Huntley",                        transfender },
        { saloon,                        "Stafford",                        transfender },
        { bike,                                "BF-400",                        noneShop },
        { industrial,                "Newsvan",                        noneShop },
        { unique,                        "Tug",                                noneShop },
        { trailer,                        "Petrol Trailer",        noneShop },
        { saloon,                        "Emperor",                        transfender },
        { bike,                                "Wayfarer",                        noneShop },
        { sport,                        "Euros",                        wheelArchAngels },
        { unique,                        "Hotdog",                        noneShop },
        { sport,                        "Club",                                transfender },
        { trailer,                        "Freight Box Trailer (Train)",        noneShop },
        { trailer,                        "Article Trailer 3",        noneShop },
        { airplane,                        "Andromada",                noneShop },
        { airplane,                        "Dodo",                                noneShop },
        { rcVehicle,                "RC Cam",                        noneShop },
        { boat,                                "Launch",                        noneShop },
        { publicService,        "Police Car (LSPD)",        noneShop },
        { publicService,        "Police Car (SFPD)",        noneShop },
        { publicService,        "Police Car (LVPD)",        noneShop },
        { publicService,        "Ranger",                        noneShop },
        { saloon,                        "Picador",                        transfender },
        { publicService,        "S.W.A.T.",                        noneShop },
        { sport,                        "Alpha",                        transfender },
        { sport,                        "Phoenix",                        transfender },
        { saloon,                        "Glendale Shit",        noneShop },
        { industrial,                "Sadler Shit",                noneShop },
        { trailer,                        "Baggage Trailer 'A'",        noneShop },
        { trailer,                        "Baggage Trailer 'B'",        noneShop },
        { trailer,                        "Tug Stairs Trailer",        noneShop },
        { industrial,                "Boxburg",                                noneShop },
        { trailer,                        "Farm Trailer",                noneShop },
        { trailer,                        "Utility Trailer",        noneShop }
};




#define getVehicleById[%0]        vehicle[ t_vName:(%0 - 400) ]
#define getVehicleByName[%0]        vehicle[%0]

пример по использованию
Code:

main()
{
        printf
        (
                "* vehicle: %s \n\
                * type: %s \n\
                * mod shop: %s \n\n\
\
                * vehicle: %s \n\
                * type: %s \n\
                * mod shop: %s",

                // получение данных тачки с помощью ее имени
                getVehicleByName        [ Taxi ] [ vName ],
                vTypeName                [ getVehicleByName[Taxi][vType] ],
                vModShopName                [ getVehicleByName[Taxi][vModShop] ],

                // получение данных тачки по ее ИДу
                getVehicleById                [ 420 ] [ vName ],
                vTypeName                [ getVehicleById[420][vType] ],
                vModShopName                [ getVehicleById[420][vModShop] ]
        );
}

Рабочий пример (как игровой режим) - http://pastebin.mozilla-russia.org/103712

Walk_M4n 10/01/2010 04:57 PM

Re: Коллекция функций / макросов
 
Code:

stock strrest(const string[], &index) // получаем оставшуюся часть строки, начиная с index-пробела
{
        new length = strlen(string);
        while ((index < length) && (string[index] <= ' ')) index++;
        new offset = index;
        new result[128];
        while ((index < length) && ((index - offset) < (sizeof(result) - 1)))
        {
                result[index - offset] = string[index];
                index++;
        }
        result[index - offset] = EOS;
        return result;
}


MX_Master 12/01/2010 09:02 AM

Re: Коллекция функций / макросов
 
более мощные версии трёх моих же функций для извлечения праметров из строк, разделенных каким-то символом

sparam - извлекает подстроку под указанным номером, по желанию и вместе с остатком строки
iparam - извлекает подстроку под указанным номером и возвращает ее численное значение
fparam - извлекает подстроку под указанным номером и возвращает ее дробное (Float) значение

код изменен так, чтобы при компиляции не было никаких предупреждений по поводу этих функций.
все работает как часы.

Code:

/*
  ОПИСАНИЕ

    Строка source будет разделена на несколько подстрок
    с помощью символа delimiter. Нужная подстрока под номером (индексом)
    substrIndex будет помещена в строку dest


  ПАРАМЕТРЫ

    dest    сюда будет помещена нужная подстрока

    maxSize    макс. размер подстроки, которая будет помещена в dest
          если длина подстроки больше maxSize, то она урежется

    source  исходная строка для разбиения и поиска в ней подстрок

    delimiter  символ, который будет делить исходную строку на подстроки

    substrIndex  порядковый номер (индекс) подстроки в исходной строке

    withRest  это логический флаг, если равен 1, то в dest
          будут помещены все подстроки, начиная с указанного
          индекса substrIndex. В том числе и все символы delimiter,
          которые стоят между подстроками также будут включены в dest


  ВОЗВРАЩАЕТ

    ничего


  ПРИМЕРЫ

    new dest[128] = "something";

    sparam( dest, 20, "/register 123456", ' ', 0 ); // dest = "/register"
    sparam( dest, 20, "/register 123456", ' ', 1 ); // dest = "123456"
    sparam( dest, 5, "/register 123456", ' ', 0 ); // dest = "/reg"
    sparam( dest, 4, "/register 123456", ' ', 1 ); // dest = "123"

    sparam( dest, 20, "/pm 29 Как дела, бро?", ' ', 0 );  // dest = "/pm"
    sparam( dest, 4, "/pm 29 Как дела, бро?", ' ', 1 );  // dest = "29"
    sparam( dest, 10, "/pm 29 Как дела, бро?", ' ', 2 );  // dest = "Как"
    sparam( dest, 50, "/pm 29 Как дела, бро?", ' ', 2, 1 ); // dest = "Как дела, бро?"
    sparam( dest, 10, "/pm 29 Как дела, бро?", ' ', 3 );  // dest = "дела,"
    sparam( dest, 50, "/pm 29 Как дела, бро?", ' ', 3, 1 ); // dest = "дела, бро?"
    sparam( dest, 10, "/pm 29 Как дела, бро?", ' ', 4 );  // dest = "бро?"

    sparam( dest, 20, "91.235.141.89", '.', 0 );  // dest = "91"
    sparam( dest, 20, "91.235.141.89", '.', 1 );  // dest = "235"
    sparam( dest, 20, "91.235.141.89", '.', 2 );  // dest = "141"
    sparam( dest, 20, "91.235.141.89", '.', 3 );  // dest = "89"
    sparam( dest, 20, "91.235.141.89", '.', 1, 1 ); // dest = "235.141.89"
    sparam( dest, 20, "91.235.141.89", '.', 2, 1 ); // dest = "141.89"

    sparam( dest, 20, "/register 123456", ' ', -1 ); // dest = "", т.к. подстроки с таким индексом нет
    sparam( dest, 20, "/register 123456", ' ', 7 ); // dest = "", т.к. подстроки с таким индексом нет
*/

stock sparam
(
  dest,      maxSize  = sizeof(dest),
  const source,  delimiter  = ' ',
  substrIndex = 0,  withRest  = 0
)
{
  dest[0] = 0; // очистим строку назначения

  for ( new cur, pre, i = -1; ; cur++ ) // пробежимся по каждому символу в строке source
  {
    if ( source[cur] == 0 ) // если текущий символ в source - это символ конца строки
    {
      if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
        // скопируем в dest нужную подстроку из source
        strmid( dest, source, pre, ( withRest ? strlen(source) : cur ), maxSize );

      goto sparam_end;
    }

    if ( source[cur] == delimiter ) // если текущий символ в source - это символ для разделения строки
    {
      if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
      {
        // скопируем в dest нужную подстроку из source
        strmid( dest, source, pre, ( withRest ? strlen(source) : cur ), maxSize );
        goto sparam_end;
      }

      pre = cur + 1;
    }
  }

  sparam_end:
  return; // завершим работу функции
}





/*
  ОПИСАНИЕ

    Строка source будет разделена на несколько подстрок
    с помощью символа delimiter. И нужная подстрока под номером (индексом)
    substrIndex будет возвращена функцией как число


  ПАРАМЕТРЫ

    source  исходная строка для разбиения и поиска в ней подстрок

    delimiter  символ, который будет делить исходную строку на подстроки

    substrIndex  порядковый номер (индекс) подстроки в исходной строке


  ВОЗВРАЩАЕТ

    целочисленное значение подстроки


  ПРИМЕРЫ

    new number = 555;

    number = iparam( "/givecash 23 50000", ' ', -1 ); // number = 0, т.к. подстроки с таким индексом нет
    number = iparam( "/givecash 23 50000", ' ', 0 ); // number = 0
    number = iparam( "/givecash 23 50000", ' ', 1 ); // number = 23
    number = iparam( "/givecash 23 50000", ' ', 2 ); // number = 50000
    number = iparam( "/givecash 23 50000", ' ', 3 ); // number = 0, т.к. подстроки с таким индексом нет
*/

stock iparam ( const source, delimiter = ' ', substrIndex = 0 )
{
  new dest[12], cur, pre, i = -1;

  for ( ; ; cur++ ) // пробежимся по каждому символу в строке source
  {
    if ( source[cur] == 0 ) // если текущий символ в source - это символ конца строки
    {
      if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
        strmid( dest, source, pre, cur, 12 ); // скопируем в dest нужную подстроку из source

      goto iparam_end;
    }

    if ( source[cur] == delimiter ) // если текущий символ в source - это символ для разделения строки
    {
      if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
      {
        strmid( dest, source, pre, cur, 12 );// скопируем в dest нужную подстроку из source
        goto iparam_end;
      }

      pre = cur + 1;
    }
  }

  iparam_end:
  return strval(dest); // завершим работу функции и вернем целочисленное значение подстроки
}





/*
  ОПИСАНИЕ

    Строка source будет разделена на несколько подстрок
    с помощью символа delimiter. И нужная подстрока под номером (индексом)
    substrIndex будет возвращена функцией как дробное число


  ПАРАМЕТРЫ

    source  исходная строка для разбиения и поиска в ней подстрок

    delimiter  символ, который будет делить исходную строку на подстроки

    substrIndex  порядковый номер (индекс) подстроки в исходной строке


  ВОЗВРАЩАЕТ

    дробное численное значение подстроки


  ПРИМЕРЫ

    new Float: float = 555.5;

    float = iparam( "/goto -157.2 1248.25 10", ' ', -1 ); // float = 0.0, т.к. подстроки с таким индексом нет
    float = iparam( "/goto -157.2 1248.25 10", ' ', 0 ); // float = 0.0, т.к. подстрока "/goto" это не число
    float = iparam( "/goto -157.2 1248.25 10", ' ', 1 ); // float = -157.2
    float = iparam( "/goto -157.2 1248.25 10", ' ', 2 ); // float = 1248.25
    float = iparam( "/goto -157.2 1248.25 10", ' ', 3 ); // float = 10.0
    float = iparam( "/goto -157.2 1248.25 10", ' ', 4 ); // float = 0.0, т.к. подстроки с таким индексом нет
*/

stock Float: fparam ( const source, delimiter = ' ', substrIndex = 0 )
{
  new dest[40], cur, pre, i = -1;

  for ( ; ; cur++ ) // пробежимся по каждому символу в строке source
  {
    if ( source[cur] == 0 ) // если текущий символ в source - это символ конца строки
    {
      if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
        strmid( dest, source, pre, cur, 40 ); // скопируем в dest нужную подстроку из source

      goto fparam_end;
    }

    if ( source[cur] == delimiter ) // если текущий символ в source - это символ для разделения строки
    {
      if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
      {
        strmid( dest, source, pre, cur, 40 );// скопируем в dest нужную подстроку из source
        goto fparam_end;
      }

      pre = cur + 1;
    }
  }

  fparam_end:
  return floatstr(dest); // завершим работу функции и вернем дробное значение подстроки
}



All times are GMT. The time now is 05:47 PM.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.