Просмотр полной версии : [Поиск] Макросы
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)
По-моему, это дело сугубо индивидуальное. Кому-то удобнее писать "SCM", вместе "SendClientMessage", а кому-то наоборот (например, мне. Ибо в первом случае теряется вся читабельность)
#define give_int(%1,%2,%3) SetPVarInt(%1,%2,GetPVarInt(%1,%2)+%3)
Прибавляет к pvar типа integer, указанное значение.
#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));
#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)
а потом удивляемся, откуда берутся быдлокодеры.
#define SFCM(%0,%1,%2) do{new _s[256];format(_s,256,%2);SendClientMessage(%0,%1,_s) ;}while(false)
Где? ;)
#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.
Эмм, при каждом использовании подробного макроса будет создаваться массив в 256 ячеек... Да и вообще, вряд ли Pawn прожуёт подобный код и не начнёт матюгаться
матюкатся то не будет, этот метод еще Рустам Рич придумал,но об оптимизации можно забыть.
Ну вот тогда вам макросец, возвращающий модуль числа
#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.
#define SetTimerSec(%1,%2,%3) SetTimer(%1,1000*%2,%3)
Запускает таймер с указанием времени в секундах
Salvacore
16.05.2014, 19:19
Update.
Получение дня недели.
#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
#define void%0(%1) forward%0(%1); public%0(%1)
Старый,но очень приятный макрос, не нужно делать форварды и публики а всего лишь 4 буквы которые тоже подсвечиваются в Pawno.
- - - Добавлено - - -
P.s. void на С++ как функция.
#define void%0(%1) forward%0(%1); public%0(%1)
Не всегда удобно, если паблик возвращает какое либо значение )
Не всегда удобно, если паблик возвращает какое либо значение )
Почему же не удобно?
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
#define function %1(%2) forward %1(%2); public %1(%2)
Уже есть, но в твоей версии подсветочка :3
Моя пиз... лучше так что ставь мою :D
Мини-античит на деньги.
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
Мини-античит на деньги.
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])//Хотя этот макрос вряд ли будет работать правильно
#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;
}
#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
Отсюда взял? :D
http://wiki.sa-mp.com/wiki/OnPlayerKeyStateChange
Вроде да :D Где-то полгода назад дело было.
Мой макросец заменить стоит на этот
#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
Ограничение количества патронов на оружие (автоматическая установка патронов на указанное количество в 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.
Update.
Диалог скрываться не будет.
Salvacore
14.11.2014, 17:10
Update.
Предлагаем новые (а главное интересные ) макросы.
Удалил один макрос, ибо он не работал.
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(;;)
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot