ClearKillFeed - очистка списка убийств
Описание:
Очищает килл-лист указанного игрока (или всех игроков, если игрок не указан).
Параметры:
playerid - игрок, у которого будет очищен килл-лист (необязательный параметр)
Возвращаемое значение:
Если указан ID игрока, возвращает 0, если он не подключен. В остальных случаях возвращает 1.
Плюсы реализации:
- Простота в использовании.
- Пониженное потребление пространства в стеке и меньшая нагрузка от функции на сервер за счёт использования #emit.
- Работает даже тогда, когда подключены все игроки.
Код:
stock ClearKillFeed(playerid = INVALID_PLAYER_ID)
{// by Londlem & Daniel_Cortez \\ pro-pawn.ru
return 0;
goto L_start;
// avoid possible stack overflow (due to using push.* opcodes)
{
new dummy[16/(cellbits/charbits)];
#emit const.pri dummy
}
#if __Pawn < 0x030A
// optional sysreq.c bugfix
#endif
L_start:
const CKF_MAGIC_ID = INVALID_PLAYER_ID - 1;
// this variable is also used as weaponid parameter
new i = 5;
// push killer and killee IDs
#emit push.c CKF_MAGIC_ID
#emit push.c CKF_MAGIC_ID
if(playerid == INVALID_PLAYER_ID)
{
#emit push.c 12
do{
#emit sysreq.c SendDeathMessage
}while(--i != 0);
#emit stack 12
}
else
{
#emit push.s playerid
#emit push.c 16
do{
#emit sysreq.c SendDeathMessageToPlayer
}while(--i != 0);
#emit stack 16
}
return 1;
}
Примечания:- Для очистки киллчата в качестве ID убитого игрока используется значение INVALID_PLAYER_ID-1.
Значение это получено опытным путём благодаря Londlem'у.
Можно было использовать ID любого неподключенного игрока от 0 до 999, но такая реализация была бы ненадёжной, т.к. всё равно оставалась бы вероятность, что подключены будут все 1000 игроков и свободных слотов для SendDeathMessage не останется.
Также был вариант использовать INVALID_PLAYER_ID, но этот вариант не работал.
В англоязычной документации сказано, что для работы функции нужно передать любой валидный ID убитого игрока (т.е. от 0 до 999).
Тем не менее, опытным путём было замечено, что ID от 1000 до INVALID_PLAYER_ID-1 тоже работают.
На самом деле это баг, но куй вряд ли исправит его - сервер из-за этого бага не крашит, да и игроки тоже, а значит можно, как всегда, забить.
Поскольку кол-во слотов с новыми релизами SA:MP может увеличиться, самым безопасным вариантом будет использовать наибольшее рабочее значение - INVALID_PLAYER_ID-1.
Пример использования:
CMD:cleardeaths(playerid, params[])
{
ClearKillFeed(playerid);
}
Автор: Daniel_Cortez
Благодарности:- Londlem - за идею с использованием INVALID_PLAYER_ID-1.
- Kalcor - за то, что с каждым выпуском SA:MP плодит всё больше багов (в т.ч. и баг с возможностью юзать ID больше 999 в SendDeathMessage).
Копирование данной статьи на других ресурсах без разрешения автора запрещено!