SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Русский/Russian

Reply
 
Thread Tools Display Modes
Old 02/01/2010, 08:13 PM   #1
MX_Master
Huge Clucker
 
Join Date: Jul 2007
Posts: 390
Reputation: 5
Default Коллекция функций / макросов

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

* Желательно не более 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 is offline   Reply With Quote
Old 03/01/2010, 12:41 PM   #2
MX_Master
Huge Clucker
 
Join Date: Jul 2007
Posts: 390
Reputation: 5
Default 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
MX_Master is offline   Reply With Quote
Old 03/01/2010, 03:54 PM   #3
[JIeXa]
Little Clucker
 
Join Date: Jul 2008
Posts: 44
Reputation: 0
Default 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. в С++ конечно предпочтение отдаю второму варианту.
[JIeXa] is offline   Reply With Quote
Old 03/01/2010, 06:11 PM   #4
Serafim_sd
Little Clucker
 
Join Date: Jul 2008
Posts: 41
Reputation: 7
Default 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;
}
ЗЫ нинада драца, давайте травите что у вас там есть)
Serafim_sd is offline   Reply With Quote
Old 03/01/2010, 07:02 PM   #5
[JIeXa]
Little Clucker
 
Join Date: Jul 2008
Posts: 44
Reputation: 0
Default 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] is offline   Reply With Quote
Old 03/01/2010, 07:04 PM   #6
[JIeXa]
Little Clucker
 
Join Date: Jul 2008
Posts: 44
Reputation: 0
Default 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;
}
[JIeXa] is offline   Reply With Quote
Old 04/01/2010, 06:07 AM   #7
MX_Master
Huge Clucker
 
Join Date: Jul 2007
Posts: 390
Reputation: 5
Default 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 is offline   Reply With Quote
Old 04/01/2010, 07:40 PM   #8
MX_Master
Huge Clucker
 
Join Date: Jul 2007
Posts: 390
Reputation: 5
Default 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
MX_Master is offline   Reply With Quote
Old 10/01/2010, 04:57 PM   #9
Walk_M4n
Little Clucker
 
Join Date: Apr 2009
Location: Russia
Posts: 42
Reputation: 0
Default 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;
}
Walk_M4n is offline   Reply With Quote
Old 12/01/2010, 09:02 AM   #10
MX_Master
Huge Clucker
 
Join Date: Jul 2007
Posts: 390
Reputation: 5
Default 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); // завершим работу функции и вернем дробное значение подстроки
}

Last edited by MX_Master; 01/12/2010 at 02:47 PM.
MX_Master is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
SA-MP для Anderius, Criminal Russia, United и Gostown6 dimonml Русский/Russian 1002 07/07/2017 06:56 PM
Проблема с прорисовкой некоторых объект& ONIXS Русский/Russian 29 23/11/2011 04:24 PM
Символы, буковки, горячая замена ^Woozie^ Русский/Russian 23 27/02/2010 01:25 PM


All times are GMT. The time now is 03:27 PM.


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