PDA

Просмотр полной версии : [Поиск] Макросы



Salvacore
14.05.2014, 00:03
Здесь будут храниться макросы, выложенные пользователями форума.

После добавления макроса, первый пост будет обновляться.


#define GivePVarInt(%1,%2,%3) SetPVarInt(%1, %2, GetPVarInt(%1, %2) + %3)

#define ABS(%0) (%0 < 0) ? (-(%0)) : (%0)

#define function %1(%2) forward %1(%2); public %1(%2)

#define SetTimerSec(%1,%2,%3) SetTimer(%1, 1000 * %2, %3)

#define DayOfWeek(%0,%1,%2) \
(7000 + (%2 + (%0 -= (14 - %1) / 12) + %0 / 4 - %0 / 100 + %0 / 400 + (31 * (%1 + 12 * (14 - %1) / 12 - 2)) / 12)) % 7
Пример использования

static const
DayNames[][] =
{
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
}
;

new
year,
month,
day
;

getdate(year, month, day);

print(DayNames[DayOfWeek(year, month, day)]);



#define WeaponRestrict(%0,%1,%2) \
GetPlayerWeapon(%0) == %1 && GetPlayerAmmo(%0) > %2 && GivePlayerWeapon(%0, %1, -GetPlayerAmmo(%0) + %2)
Пример

if(WeaponRestrict(playerid, 38, 500))
SendClientMessage(playerid, -1, "Запрещено носить с собой более чем 500 патронов от минигана.");

if(WeaponRestrict(playerid, WEAPON_DEAGLE, 120))
SendClientMessage(playerid, -1, "Запрещено носить с собой более чем 120 патронов от пустынного орла.");






wAx (http://pro-pawn.ru/member.php?2319-wAx)
DeimoS (http://pro-pawn.ru/member.php?2548-DeimoS)
Caypen (http://pro-pawn.ru/member.php?2830-Caypen)
Londlem (http://pro-pawn.ru/member.php?2057-Londlem)

DeimoS
14.05.2014, 09:11
По-моему, это дело сугубо индивидуальное. Кому-то удобнее писать "SCM", вместе "SendClientMessage", а кому-то наоборот (например, мне. Ибо в первом случае теряется вся читабельность)

wAx
14.05.2014, 13:02
#define give_int(%1,%2,%3) SetPVarInt(%1,%2,GetPVarInt(%1,%2)+%3)

Прибавляет к pvar типа integer, указанное значение.

wAx
14.05.2014, 13:34
#define SFCM(%0,%1,%2) do{new _s[256];format(_s,256,%2);SendClientMessage(%0,%1,_s) ;}while(false)

Позволяет форматировать сообщения для игрока в 1 строку!
P.S довольно старый, но полезный макрос

Пример:
SFCM(playerid, -1, "У вас на руках: $%d", GetPlayerMoney(playerid));

wAx
14.05.2014, 14:35
#define swap(%0,%1) %0^=%1;%1^=%0;%0^=%1;

Макрос для обмена значений переменных

Seregamil
14.05.2014, 14:39
new FALSE = false;
зачем?

#define SFCM(%0,%1,%2) do{new _s[256];format(_s,256,%2);SendClientMessage(%0,%1,_s) ;}while(FALSE)
а потом удивляемся, откуда берутся быдлокодеры.

wAx
14.05.2014, 14:43
#define SFCM(%0,%1,%2) do{new _s[256];format(_s,256,%2);SendClientMessage(%0,%1,_s) ;}while(false)

Где? ;)

DeimoS
14.05.2014, 15:51
#define SFCM(%0,%1,%2) do{new _s[256];format(_s,256,%2);SendClientMessage(%0,%1,_s) ;}while(false)

Позволяет форматировать сообщения для игрока в 1 строку!
P.S довольно старый, но полезный макрос

Пример:
SFCM(playerid, -1, "У вас на руках: $%d", GetPlayerMoney(playerid));

Эмм, при каждом использовании подробного макроса будет создаваться массив в 256 ячеек... Да и вообще, вряд ли Pawn прожуёт подобный код и не начнёт матюгаться




#define swap(%0,%1) %0^=%1;%1^=%0;%0^=%1;

Макрос для обмена значений переменных

Ну давайте теперь все инклюды от Y_Less'a разберём по строке

Salvacore
14.05.2014, 18:34
Update.

DOS-Protection
14.05.2014, 22:16
Delete.

Caypen
15.05.2014, 00:42
Эмм, при каждом использовании подробного макроса будет создаваться массив в 256 ячеек... Да и вообще, вряд ли Pawn прожуёт подобный код и не начнёт матюгаться


матюкатся то не будет, этот метод еще Рустам Рич придумал,но об оптимизации можно забыть.

DeimoS
15.05.2014, 06:40
Ну вот тогда вам макросец, возвращающий модуль числа

#define abs(%0) (%0 < 0 ) ? (-%0) : (%0)
Так же с макросами можно кучу всего сделать. Например, pVar преобразуем в вид массива

#define BanId[%0] GetPVarInt(%0, "BanId")
Или же как функцию

#define GetBanId(%0) GetPVarInt(%0, "BanId")
Всё ограничивается только вашей фантазией

Salvacore
15.05.2014, 09:03
update.

wAx
16.05.2014, 19:14
#define SetTimerSec(%1,%2,%3) SetTimer(%1,1000*%2,%3)

Запускает таймер с указанием времени в секундах

Salvacore
16.05.2014, 19:19
Update.

L0ndl3m
16.05.2014, 22:04
Получение дня недели.

#define DayOfWeek(%0,%1,%2) \
(7000 + (%2 + (%0 -= (14 - %1) / 12) + %0 / 4 - %0 / 100 + %0 / 400 + (31 * (%1 + 12 * (14 - %1) / 12 - 2)) / 12)) % 7

Пример использования:


static const
DayNames[][] =
{
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
}
;

new
year,
month,
day
;

getdate(year, month, day);

print(DayNames[DayOfWeek(year, month, day)]);


Автор макроса: Londlem

Salvacore
17.05.2014, 00:10
UPD//Londlem

Caypen
18.05.2014, 00:35
#define void%0(%1) forward%0(%1); public%0(%1)
Старый,но очень приятный макрос, не нужно делать форварды и публики а всего лишь 4 буквы которые тоже подсвечиваются в Pawno.

- - - Добавлено - - -

P.s. void на С++ как функция.

L0ndl3m
18.05.2014, 00:43
#define void%0(%1) forward%0(%1); public%0(%1)

Не всегда удобно, если паблик возвращает какое либо значение )

Caypen
18.05.2014, 01:19
Не всегда удобно, если паблик возвращает какое либо значение )
Почему же не удобно?

Salvacore
18.05.2014, 04:36
#define void%0(%1) forward%0(%1); public%0(%1)
Старый,но очень приятный макрос, не нужно делать форварды и публики а всего лишь 4 буквы которые тоже подсвечиваются в Pawno.

- - - Добавлено - - -

P.s. void на С++ как функция.


#define function %1(%2) forward %1(%2); public %1(%2)

Уже есть, но в твоей версии подсветочка :3

Caypen
18.05.2014, 11:54
#define function %1(%2) forward %1(%2); public %1(%2)

Уже есть, но в твоей версии подсветочка :3

Моя пиз... лучше так что ставь мою :D

ArtemkO
18.05.2014, 13:55
Мини-античит на деньги.

enum pInfo:
{
pMoney,
}
new Player[MAX_PLAYERS][pInfo];

#define GiveMoney(%1, %2) Player[%1][pMoney]+=%2; GivePlayerMoney(%1, %2)

Seregamil
18.05.2014, 18:03
Мини-античит на деньги.

enum pInfo:
{
pMoney,
}
new Player[MAX_PLAYERS][pInfo];

#define GiveMoney(%1, %2) Player[%1][pMoney]+=%2; GivePlayerMoney(%1, %2)

Работать не будет.

Salvacore
18.05.2014, 20:18
UPD//Caypen

DeimoS
18.05.2014, 21:19
Мини-античит на деньги.

enum pInfo:
{
pMoney,
}
new Player[MAX_PLAYERS][pInfo];

#define GiveMoney(%1, %2) Player[%1][pMoney]+=%2; GivePlayerMoney(%1, %2)

Тогда уж

new g_player_money[MAX_PLAYERS];
stock GivePlayerMoneyEx(playerid, money)
{
g_player_money[playerid] += money;
ResetPlayerMoney(playerid);
return GivePlayerMoney(playerid, g_player_money[playerid]);
}
#define GivePlayerMoney(%0,%1) GivePlayerMoneyEx(%0, %1)
#define ReloadPlayerMoney(%0) GivePlayerMoneyEx(%0, 0)
#define SetPlayerMoney(%0,%1) GivePlayerMoneyEx(%0, %1-g_player_money[%0])//Хотя этот макрос вряд ли будет работать правильно

Hidden
19.05.2014, 23:01
#define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
Нажатие кнопки.

Пример использования:

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(PRESSED(KEY_JUMP | KEY_SPRINT) && (GetPlayerState(playerid) != 2)) ClearAnimations(playerid);
return true;
}

DeimoS
20.05.2014, 05:22
#define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
Нажатие кнопки.

Пример использования:

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(PRESSED(KEY_JUMP | KEY_SPRINT) && (GetPlayerState(playerid) != 2)) ClearAnimations(playerid);
return true;
}

Отсюда взял? :D
http://wiki.sa-mp.com/wiki/OnPlayerKeyStateChange

Hidden
20.05.2014, 11:49
Отсюда взял? :D
http://wiki.sa-mp.com/wiki/OnPlayerKeyStateChange
Вроде да :D Где-то полгода назад дело было.

DeimoS
26.05.2014, 00:32
Мой макросец заменить стоит на этот

#define ABS(%0) (%0 < 0) ? (-(%0)) : (%0)

Salvacore
26.05.2014, 00:50
Update.

Seregamil
29.05.2014, 07:29
Мой макросец заменить стоит на этот

#define ABS(%0) (%0 < 0) ? (-(%0)) : (%0)

Может не будем велосипед изобретать?
http://wiki.sa-mp.com/wiki/Floatabs

L0ndl3m
31.05.2014, 17:10
Ограничение количества патронов на оружие (автоматическая установка патронов на указанное количество в 3 параметре).


#define WeaponRestrict(%0,%1,%2) \
GetPlayerWeapon(%0) == %1 && GetPlayerAmmo(%0) > %2 && GivePlayerWeapon(%0, %1, -GetPlayerAmmo(%0) + %2)


Пример использования:


if(WeaponRestrict(playerid, 38, 500))
SendClientMessage(playerid, -1, "Запрещено носить с собой более чем 500 патронов от минигана.");

if(WeaponRestrict(playerid, WEAPON_DEAGLE, 120))
SendClientMessage(playerid, -1, "Запрещено носить с собой более чем 120 патронов от пустынного орла.");


Автор макроса: Londlem

Salvacore
01.06.2014, 16:48
Update.

Salvacore
08.08.2014, 18:34
Update.

L0ndl3m
08.08.2014, 23:00
Update.
Диалог скрываться не будет.

Salvacore
14.11.2014, 17:10
Update.
Предлагаем новые (а главное интересные ) макросы.
Удалил один макрос, ибо он не работал.

Unreal
14.11.2014, 19:44
1.
#define min(%0) (%0*60)

Пример:

AddStaticVehicleEx(420,1062.4160000,-1737.3077000,13.1495000,-90.0000000,6,6,min(15));

2.
#define RandomEx(%1,%2) (random(%2-%1)+%1)

Пример:

if(RandomEx(0,25) == 3) print("Random равен 3");

3.
#define IsName(%0,%1) (strcmp(PlayerName[%0],%1,true) == 0)

Пример:

CMD:test(playerid)
{
if(!IsName(playerid,"Admin_Adminovich") return true;
print("Команда /test");
return true;
}
P.S: PlayerName замените на свой

Sersoftin
14.11.2014, 21:14
Проверяет пароль на соответствие. Необходим плагин regex.

#define IsValidPassword(%1) regex_match(%1, "^[a-zA-Z0-9_]{8,32}$")
Проверяет email на валидность по стандартам RFC. Необходим плагин regex.

#define IsValidEmail(%1) regex_match(%1, "^[a-zA-Z0-9_]{3,64}@[a-zA-Z0-9-]{2,250}\\.[a-zA-Z]{2,4}$")
Бесконечное значение

#define INFINITE_VALUE 0x7F800000

Может пригодится кому-нибудь эта байда)

- - - Добавлено - - -



#define void%0(%1) forward%0(%1); public%0(%1)
Старый,но очень приятный макрос, не нужно делать форварды и публики а всего лишь 4 буквы которые тоже подсвечиваются в Pawno.

- - - Добавлено - - -

P.s. void на С++ как функция.

void в с++ это не функция. Это означает, что функция ничего не возвращает.

Desulaid
23.04.2016, 15:29
Костыли для zcmd


#if defined _zcmd_included
// by Untonyst
#define zcmd::%0(%1)\
CallLocalFunction(#cmd_%0, !"is", %1)
#define ZALT:%0:%1;\
forward cmd_%1(playerid, params[]);\
public cmd_%1(playerid, params[])\
return cmd_%0(playerid, params);
#endif



Вызов команды с параметрами

zcmd::КОМАНДА(для кого вызываем команду, параметры);
Альтернативное имя для команды

ZALT:КОМАНДА:АЛЬТЕРНАТИВНОЕ_ИМЯ;

pawnoholic
24.01.2018, 17:04
Пару интересных макросов из YSI:

native bool:IS_IN_RANGE(value, lower, upper);

#define IS_IN_RANGE(%0,%1,%2) (((%0)-((%1)+cellmin))<((%2)-((%1)+cellmin)))

native bool:NOT_IN_RANGE(value, lower, upper);

#define NOT_IN_RANGE(%0,%1,%2) (((%0)-((%1)+cellmin))>=((%2)-((%1)+cellmin)))

Автор: Alex "Y_Less" Cole.

pawnoholic
24.01.2018, 19:25
Бесконечный цикл:


#define forever() for(;;)