PDA

Просмотр полной версии : [Info] Полезные функции/макросы



Иван Бубнов
19.03.2016, 19:53
Здесь будут выложены множества полезных функций/макросов.

Список таких работ:


#define FlipVehicle(%0) new Float:A; GetVehicleZAngle(%0, A); SetVehicleZAngle(%0, A);


Переворачивает машину обратно на колеса (изменение угла поворота транспорта ставит транспорт на колеса).

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

CMD:flip(playerid, params[])
{
if(GetPlayerState(playerid) == 2)
FlipVehicle(GetPlayerVehicleID(playerid));
return 1;
}
многие сталкивались с проблемой когда при спавне игрок проваливался сквозь пол, из за того что не прогрузились объекты. Можно сделать обычный фриз, но не всем игрокам с хорошим интернетом нравится ждать 2 -3 секунды когда все сразу прогружается.


#define spawnFreezeTime(%0); SetPVarInt(%0,"spawnFreezeTime", gettime()+(GetPlayerPing(%0) < 101) ? (1) : ((GetPlayerPing(%0) > 100 && GetPlayerPing(%0) < 201) ? (2) : (3))), TogglePlayerControllable(%0,false);

В секундный таймер:

if(GetPVarInt(playerid, "spawnFreezeTime") >= gettime()) ClearAnimations(playerid), TogglePlayerControllable(playerid, true), DeletePVar(playerid, "spawnFreezeTime");

Автор: Шуруп (LC)Узнаем никнейм игрока через символ @[ид игрока]

ParseReferences(const text[], output[], size = sizeof(output))
{ // by Daniel_Cortez \\pro-pawn.ru
static size_m_1, nickname_pos1, nickname_pos2, ref_id, pos1, pos2, c;
size_m_1 = size - 1;
pos1 = 0, pos2 = strlen(output);
for(;;)
{
if(text[pos1] == '@')
{
nickname_pos1 = pos1, nickname_pos2 = pos2;
ref_id = 0;
while('0' <= (c = text[++pos1]) <= '9')
ref_id = ref_id * 10 + (c - '0');
if ((pos1 == nickname_pos1+1) || (0 == IsPlayerConnected(ref_id)))
output[pos2++] = '@', pos1 = nickname_pos1 + 1;
else
pos2 += GetPlayerName(
ref_id,
output[nickname_pos2],
size - nickname_pos2
);
}
else if((output[pos2++] = text[pos1++]) == '\0')
break;
if(pos2 == size_m_1)
{
output[pos2] = '\0';
break;
}
}
}

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

public OnPlayerText(playerid, text[])
{
new PlayerName[MAX_PLAYER_NAME];
for(new i = strfind(text, "@", true), a = 0, tmp[4]; i != -1; i = strfind(text, "@", true, i))
{
++i, a = 0;
while(48 <= text[i] <= 57 && a != 4) tmp[a++] = text[i++];
if(tmp[0] == EOS) continue;
GetPlayerName(strval(tmp), PlayerName, sizeof(PlayerName));
strdel(text, i - a - 1, i);
strins(text, PlayerName, i - a - 1, 128);
}
GetPlayerName(playerid, PlayerName, sizeof(PlayerName));
format(text, 128, "%s: {FFFFF}%s", PlayerName, text);
SendClientMessageToAll(GetPlayerColor(playerid), text);
return 0;
}
#define IsVehicleInRangeOfPoint(%0,%1,%2,%3,%4) %1 >= GetVehicleDistanceFromPoint(%0,%2,%3,%4) ? true : false

stock IsPlayerInWater(playerid)
{ //Узнает в воде ли человек //by Sd
new anim = GetPlayerAnimationIndex(playerid);
if (((anim >= 1538) && (anim <= 1542)) || (anim == 1544) || (anim == 1250)) return 1;
return 0;
}
stock SetVehicleSpeed(vehicleid, Float:speed)
{//by HoRRoR
new Float:cr[4];
GetVehicleZAngle(vehicleid, cr[0]);
GetVehicleVelocity(vehicleid, cr[1], cr[2], cr[3]); //чтобы сохранить Z велосити.
SetVehicleVelocity(vehicleid, floatsin(-cr[0],degrees)*(speed/99), floatcos(-cr[0],degrees)*(speed/99), cr[3]);
return 1;
}
bool:fwriterus(File:wr, string[])
{//by Владокс
if(!wr) return false; //если файл не открыт возвращаем ложь
for(new i; string[i]; i++)
{
fputchar(wr, string[i], false); //кладем в файл с выключенным utf8
}
return 1; //успешно записали, возвращаем правду
}


stock GetMaxPassengers(vModel)
{//by Владокс
if(0 <= (vModel -= 400) <= 211)
{
static seekBlock_vSeats[27] =
{
0x10331113, 0x11311131, 0x11331313, 0x80133301, 0x1381F110, 0x10311103,
0x10001F10, 0x11113311, 0x13113311, 0x31101100, 0x30001301, 0x11031311,
0x11111331, 0x10013111, 0x01131100, 0x11111110, 0x11100031, 0x11130221,
0x33113311, 0x11111101, 0x33101133, 0x101001F0, 0x03133111, 0xFF11113F,
0x13330111, 0xFF131111, 0x0000FF3F
};

return ((seekBlock_vSeats[vModel >>> 3] >>> ((vModel & 7) << 2)) & 15);
}
return 15;
}
Если ваш код содержит не более чем 20-и строк, то Welcome!



Тема находится под властью правил форума (http://pro-pawn.ru/showthread.php?9968) и правил этого раздела (http://pro-pawn.ru/showthread.php?10841-%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0-%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B0)!

$continue$
19.03.2016, 19:55
Где то была подобная темка.
В #1 посте strlen будет вызываться от 0 до n'ое, то есть при каждой итерации цикла.

Иван Бубнов
19.03.2016, 20:14
Не нашел.

Иван Бубнов
19.03.2016, 20:35
#define ClearDeathMessages() for(new f; f<6;f++)SendDeathMessage(INVALID_PLAYER_ID, INVALID_PLAYER_ID, WEAPONSTATE_UNKNOWN)

#define ClearDeathMessageToPlayer(%0) for(new f; f<6;f++)SendDeathMessageToPlayer(%0, INVALID_PLAYER_ID, INVALID_PLAYER_ID, WEAPONSTATE_UNKNOWN)

Автор: sk47

stock randomEx(...)
{
new result,rand = random(numargs());
for(new i; i<numargs(); i++)
{
if(i == rand) result = getarg(i);
}
return result;
}
Пример использования:

main()
printf("Результат: %i", randomEx(2, 3, 6, 10));

Выведет в консоль одно из чисел 2, 3, 6, 10


stock GetXYInFrontOfPoint(Float:x, Float:y, &Float:x2, &Float:y2, Float:A, Float:distance)
{
x2 = x + (distance * floatsin(-A, degrees));
y2 = y + (distance * floatcos(-A, degrees));
}

TheMallard
20.03.2016, 10:36
fwriterus реализовывал через макрос MX_Master.

Иван Бубнов
21.03.2016, 16:50
fwriterus реализовывал через макрос MX_Master.

Но Владокс указал что он и есть автор.

m1n1vv
22.03.2016, 04:12
stock GetClosestObj(playerid, Float: dist)
{
new Float:x, Float:y, Float:z;
for(new i = 0; i < MAX_OBJECTS; i++)
{
if(GetObjectModel(i) == 0) continue;
GetObjectPos(i,x,y,z);
if(IsPlayerInRangeOfPoint(playerid,dist,x,y,z))
return i;
}
return -1;
}

stock GetClosestCar(playerid, Float: dist)
{
new Float: x, Float: y, Float: z;
for(new i = 0; i < MAX_VEHICLES; i++)
{
if(GetVehicleModel(i) == 0) continue;
GetVehiclePos(i, x, y, z);
if(IsPlayerInRangeOfPoint(playerid, dist, x, y, z))
return i;
}
return -1;
}

stock GetPlayerTurn(playerid, &Float: x, &Float: y, &Float: z, Float: distance ,turn)
{
new Float: angle, Float: dis;
dis = dis/2 - distance;
GetPlayerPos(playerid, x, y, z),GetPlayerFacingAngle(playerid, angle);
x += (dis * floatsin(-angle+turn, degrees)),y += (dis * floatcos(-angle+turn, degrees));
return 1;
}

stock SetPlayerPosAndAngle(playerid, Float: x, Float: y, Float: z, Float: a)
{
SetPlayerPos(playerid, x, y, z);
SetPlayerFacingAngle(playerid, a);
}

DeimoS
22.03.2016, 06:55
Лучше бы добавляли новые функции прямо в шапку темы и как-то их сортировали для удобства поиска нужных

Иван Бубнов
23.03.2016, 23:19
Лучше бы добавляли новые функции прямо в шапку темы и как-то их сортировали для удобства поиска нужных

Представь какой список будет допустим через год если я вообще буду через год здесь сидеть?

DeimoS
24.03.2016, 06:25
Представь какой список будет допустим через год если я вообще буду через год здесь сидеть?

Ну а представь сколько тут страниц получится через год и как удобно среди них будет искать нужную функцию... Для того тебе и даны спойлеры ведь. Можешь делать не одну-две вкладки, а больше, делая подгруппы в группах. Либо же попроси модератора почистить тему и закрыть, а сам для каждой группы создай отдельный пост и уже с отдельными постами работай. Но если твои сообщения с функциями будут на разных страницах, да ещё и вперемешку с обсуждениями, типа этого - тема вообще нечитабельна будет

Seregamil
24.03.2016, 21:04
Ну а представь сколько тут страниц получится через год и как удобно среди них будет искать нужную функцию... Для того тебе и даны спойлеры ведь. Можешь делать не одну-две вкладки, а больше, делая подгруппы в группах. Либо же попроси модератора почистить тему и закрыть, а сам для каждой группы создай отдельный пост и уже с отдельными постами работай. Но если твои сообщения с функциями будут на разных страницах, да ещё и вперемешку с обсуждениями, типа этого - тема вообще нечитабельна будет
Да почти все функции находятся в теме на офе. тупо поиск по теме вбиваешь и там тьма вариантов. А эта тема подобие той. Причем подобие не самого лучшего качества.

Nexius_Tailer
02.06.2016, 16:13
Лови тогда:

Более безопасный аналог "AbsoluteAngle" (высчитывание угла поворота в пределах 0.0 - 360.0 градусов)

stock Float:AbsoluteAngle(Float:angle) return floatround(angle, floatround_floor) % 360 + floatfract(angle);
Автор: Mrucznik

Рандом с процентами

// число, процент ..... число, процент
// общее количество процентов неважно, соотношение вычисляется автоматом
// new v = rand(5,10, 7,90, 76,150); - вычтет из 250%
stock rand(...)
{
new c, n = numargs();
if(n % 2) return -1;
for(new i; i < n; i+=2) c += getarg(i+1);
new s, v, r = random(c);
for(new i = 1; i < n; i+=2)
{
v = getarg(i);
if(s <= r <= s + v) return getarg(i-1);
s += v;
}
return -1;
}
Автор: SoNik))

Узнаёт центр гангзоны

stock Float:GetCenterOfGangZone(Float:MinX, Float:MinY, Float:MaxX, Float:MaxY, &Float:X, &Float:Y)
{
X = ((MinX + MaxX) / 2);
Y = ((MinY + MaxY) / 2);
}
Автор: Slice


Полезные функциИ/макросы

Иван Бубнов
15.06.2016, 21:41
Лови тогда:

Полезные функциИ/макросы

Спс)

Модераторы, просьба переименовать тему :)

Excel_Smit.
04.10.2016, 12:03
#define GivePVarInt(%0, %1, %2) SetPVarInt(%0, %1, GetPVarInt(%0, %1)+%2)

)))

Desulaid
04.10.2016, 16:47
Поменять значения между двумя переменными.


#define exch(%0,%1) (%0 = %0 + %1 - (%1 = %0))