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

Простенькие ф-ии для интерьеров

pawn Код:
// Запрещает наносить урон, находясь в интерьерах
DisableApplyDamageInInterior(playerid, interiorid)
{
    if (interiorid != 0)
    {
        SetPlayerTeam(playerid, 0);
    }
    else
    {
        SetPlayerTeam(playerid, NO_TEAM);
    }
}

// Запрещает доставать оружие, находясь в интерьерах
DisableTakeWeaponsInInterior(playerid)
{
    if (GetPlayerInterior(playerid) != 0)
    {
        SetPlayerArmedWeapon(playerid, 0);
    }
}

// Использование в колбеках

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
    #pragma unused oldinteriorid
    DisableApplyDamageInInterior(playerid, newinteriorid);
    return 1;
}

public OnPlayerUpdate(playerid)
{
    DisableTakeWeaponsInInterior(playerid);
    return 1;
}
Reply

А с AllowInteriorWeapons(); что?
Reply

Эта ф-ия не работает, тестил её)
Причём в a_samp.inc не помечена как не рабочая/удалённая
Reply

Quote:
Originally Posted by Mcc
Посмотреть сообщение
А с AllowInteriorWeapons(); что?
Стыдно ченджлог не читать.
Reply

Quote:
Originally Posted by Diman777
Посмотреть сообщение
Причём в a_samp.inc не помечена как не рабочая/удалённая
При запуске сервера она должна помечаться удалённой.
Reply

Увы, этого не случилось при старте)
Reply

Костыли для zcmd

Код:
// by Untonyst
#if defined _zcmd_included
	// call command with parameters
	#define zcmd::%0(%1)\
		CallLocalFunction(#cmd_%0, !"is", %1)
	// add alternative name of the command
	#define ZALT:%0:%1;\
		forward cmd_%1(playerid, params[]);\
		public cmd_%1(playerid, params[])\
		return cmd_%0(playerid, params);
#endif
Reply

Quote:
Originally Posted by 1Darge
Посмотреть сообщение
Искал вариант создания рандомного месева из букв и цифр, но не нашел. Написаю простую функцию, которая сделает мне это месево.

PHP код:
stock random_abc(array[])
// Функция для получения рандомных букв и цифр.
// by Untonyst (old nickname Darge).
{
    
format(array, 7"%c%c%d%c%d%c"65 random(26), 97 random(26), random(10), 65 random(26), random(10), 65 random(26));

Пример использования:
PHP код:
new str[7];
random_abc(str);
printf("%s"str); 
Как-то писал:

PHP код:
/*
rand_string(len = sizeof(str), mem_type = 1, caps = 1, start_symbol = "")
len - длина генерируемой строки ( максимальный размер - 100 )
mem_type - "запоминающаяся строка", генерация по слогам
caps - учет регистра ( 0 - маленький регистр, 1 - большой, 2 - смешанный )
start_symbols[] - начальная строка ( по умолчанию пуста )
*/  
rand_string(lenmem_type 1caps 1start_symbols[] = "")
{
    new 
str[100], dynamic_cell = -1symbol[2], _cellvowels_arr[6] = {65,69,73,79,85,89};
    if(
strlen(start_symbols)) len += strlen(start_symbols);
    
#define vowels  65,69,73,79,85,89,97,101,105,111,117,121
    
do
    {
        
start:
        if(
dynamic_cell == -&& strlen(start_symbols))
        {
            
strcat(strstart_symbolslen+1), dynamic_cell 0;
            goto 
start;
        }
        
rerandom_cell = ((caps) ? (caps 65+random(25) : 65) : 97) + random(25);
        if((
90 _cell 97) || (_cell == str[dynamic_cell])) goto rerandom;
        if(
mem_type && dynamic_cell 1)
        {
            switch(
str[dynamic_cell] | str[dynamic_cell-1])
            {
                case 
vowels: goto next;
                default: 
_cell = (caps) ? (vowels_arr[random(sizeof(vowels_arr))]) : (32+vowels_arr[random(sizeof(vowels_arr))]);
            }
        }
        
nextformat(symbol,2,"%c",_cell);
        
strcat(strsymbollen+1);
        
dynamic_cell++;
    }
    while(
dynamic_cell len);
    
#undef vowels
    
return str;
}  
// Пример использования:
public Test()
{
    
printf("%s"rand_string(51_"GEO_"));
    return 
true;
}
// Пример полученного: GEO_VINIE 
Reply

Те, что в ядре сравнивают только пару переменных (у автора почти произвольное кол-во, ограниченное макс числом аргументов функции), хотя их всё-равно можно вставить в его код.
PHP код:
#define PROTECT_GETMAXMIN
GetIntMin(...) {
    new 
=  numargs()-1;
#if defined PROTECT_GETMAXMIN
    
if(i==-1){return 0;}
#endif
    
new val getarg(i);
    while(
i--) {val min(val,getarg(i));}
    return 
val;

GetIntMax(...) { 
    new 
=  numargs()-1;
#if defined PROTECT_GETMAXMIN
    
if(i==-1){return 0;}
#endif
    
new val getarg(i);
    while(
i--) {val max(val,getarg(i));}
    return 
val;

В таком виде при большом кол-ве итераций должен быть выигрыш по времени выполнения, т.к. меньше операций с памятью в пределах p-кода... хотя стоит проверить.

SoNikMells, твой код будет неадекватным в случае, если будут заданы только отрицательные числа.
Reply

Quote:
Originally Posted by Mutha_X
Посмотреть сообщение
Те, что в ядре сравнивают только пару переменных (у автора почти произвольное кол-во, ограниченное макс числом аргументов функции), хотя их всё-равно можно вставить в его код.
PHP код:
#define PROTECT_GETMAXMIN
GetIntMin(...) {
    new 
=  numargs()-1;
#if defined PROTECT_GETMAXMIN
    
if(i==-1){return 0;}
#endif
    
new val getarg(i);
    while(--
i) {val min(val,getarg(i));}
    return 
val;

GetIntMax(...) { 
    new 
=  numargs()-1;
#if defined PROTECT_GETMAXMIN
    
if(i==-1){return 0;}
#endif
    
new val getarg(i);
    while(--
i) {val max(val,getarg(i));}
    return 
val;

В таком виде при большом кол-ве итераций должен быть выигрыш по времени выполнения, т.к. меньше операций с памятью в пределах p-кода... хотя стоит проверить.

SoNikMells, твой код будет неадекватным в случае, если будут заданы только отрицательные числа.
Твоя функция сфейлилась на [10, 0, -5], но у меня и SoNikMells сфейлились на [-10, -2, -5].
Reply

поправил (--i -> i--)
Reply

Не знаю, выкладывались ли здесь до этого подобные функции (скорее всего да), но вот мой вариант функции fwrite, которая может корректно записывать в файл строку с русскими символами (в режиме ASCII). Синтаксис абсолютно тот-же, что и в обычной fwrite

Код:
stock fwriteASCII(File:fhandle, const string[])
{
	if(!fhandle) return 0;
	new stringlen = strlen(string);
	for(new i; i < stringlen; i++) fputchar(fhandle, string[i], false);
	return stringlen;
}
Использование:
Код:
new File:hfile = fopen("random.txt");
if(hfile)
{
	fwriteASCII(hfile, "Я просто текст");
	fclose(hfile);
}
Для подмены стандартной fwrite сразу после функции fwriteASCII вставьте следующее:
Код:
#if defined _ALS_fwrite
	#undef fwrite
#else
	#define _ALS_fwrite
#endif
#define fwrite fwriteASCII
Reply

Все давно на fputchar'ах сделали...
Reply

Quote:
Originally Posted by OstGot
Посмотреть сообщение
Не знаю, выкладывались ли здесь до этого подобные функции (скорее всего да), но вот мой вариант функции fwrite, которая может корректно записывать в файл строку с русскими символами (в режиме ASCII). Синтаксис абсолютно тот-же, что и в обычной fwrite
Просто эту проблему все решили сразу после её появления (с момента выхода 0.3a), тогда не то что этой темы, а даже русского раздела на этом форуме не было.
Reply

Quote:
Originally Posted by ZiGGi
Посмотреть сообщение
Просто эту проблему все решили сразу после её появления (с момента выхода 0.3a), тогда не то что этой темы, а даже русского раздела на этом форуме не было.
В fixes я, кстати, этого исправления не увидел. Видел только действительно старую тему с неким подобием, но там в параметрах функции указывалось лишь название файла и строка, которую нужно туда записать. Понятное дело, использовать каждый раз такую функцию с постоянным открытием и закрытием файла не есть хорошо, потому и сделал аналогом обычного fwrite.
Reply

Quote:
Originally Posted by OstGot
Посмотреть сообщение
В fixes я, кстати, этого исправления не увидел.
Да ему там делать нечего, я бы это даже багом не назвал - это скорее особенность. Функцию fwriteASCII лучше вызывать только для строк, в которых может находиться кириллица, а не для всех сразу. Не многим нужно обычный вызов fwrite заменять на множественные вызовы fputchar ради читаемых файлов (напомню, что fread прекрасно справляется со строками с кириллицей, сохранёнными с помощью fwrite).
Reply

Несколько макросов, позволяющих сделать гораздо быстрее то, что обычно делается циклом.

PHP код:
//обменивает содержимое массивов - swap_arrays(array_1[], array_2[], arrays_size)
#define swap_arrays(%0,%1,%2); \
                                
{ new _bf_[%2];\
                                
memcpy(_bf_, %00, (%2) * 4, %2);\
                                
memcpy(%0, %10, (%2) * 4, %2);\
                                
memcpy(%1_bf_0, (%2) * 4, %2); }
//очищает массив - clean_array(array[], size)
#define clean_array(%0,%1); \
                                
{ new _tpl_[%1]; \
                                
memcpy(%0_tpl_0, (%1) * 4, %1); }
//копирует содержимое массива в другой массив - copy_array(source[], destination[], size)
#define copy_array(%0,%1,%2) memcpy(%1, %0, 0, (%2) * 4, %2)
//заполняет ячейки массива указанной константой - fill_array(array[], value, size)
#define fill_array(%0,%1,%2); \
                                
{ new _tpl_[%2] = { %1, ... }; \
                                
memcpy(%0_tpl_0, (%2) * 4, %2); } 
Reply

Недавно кто-то спрашивал, как можно сделать функцию, в которой передаваемое в аргумент значение со знаком + или - позволяло бы сразу отнимать или прибавлять некой другой переменной это значение. И вот как-то случайно вспомнил сейчас об этом, найдя один интересный макрос (на примере PVar'ов):
PHP код:
#define GivePVarInt(%0,%1,%2) SetPVarInt(%0, %1, GetPVarInt(%0, %1) %2) 
Использовать его можно таким образом:
PHP код:
GivePVarInt(playerid"SomeVar", +1); //Прибавит к PVar'у 1
GivePVarInt(playerid"SomeVar", -1); //Отнимет от PVar'а 1
GivePVarInt(playerid"SomeVar", *2); //Умножит значение PVar'а на 2
GivePVarInt(playerid"SomeVar", /2); //Разделит значение PVar'а на 2 
И хотя это не позволит при вводе значения без знаков +-*/% его сразу присвоить (что тоже было одним из условий работы такой "универсальной" функции), но я думаю это можно было бы как-то сделать, улучшив этот макрос с помощью препроцессорных парсеров.
Reply

Интересная идея, можно провернуть и с переменными:
PHP код:
#define UpdateVariable(%0,%1) (%0=%0%1); 
PHP код:
UpdateVariable(playerid, +1); //Прибавит 1 
UpdateVariable(playerid, -1); //Отнимет 1 

UpdateVariable(playerid,  *2); //Умножит значение на 2 
UpdateVariable(playerid,  /2); //Разделит значение на 2 
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)