Daniel_Cortez
21.05.2015, 19:46
Описание:
Очищает килл-лист указанного игрока (или всех игроков, если игрок не указан).
Параметры:
playerid - игрок, у которого будет очищен килл-лист (необязательный параметр)
Возвращаемое значение:
Если указан ID игрока, возвращает 0, если он не подключен. В остальных случаях возвращает 1.
Плюсы реализации:
Простота в использовании.
Пониженное потребление пространства в стеке и меньшая нагрузка от функции на сервер за счёт использования #emit.
Работает даже тогда, когда подключены все игроки.
Код:
stock ClearKillFeed(playerid = INVALID_PLAYER_ID)
{// by Londlem & Daniel_Cortez \\ pro-pawn.ru
if((playerid != INVALID_PLAYER_ID) && (0 == IsPlayerConnected(playerid)))
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
SendDeathMessage(0, 0, 0),
SendDeathMessageToPlayer(0, 0, 0, 0);
#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, но этот вариант не работал.
В англоязычной документации (http://wiki.sa-mp.com/wiki/SendDeathMessage) сказано, что для работы функции нужно передать любой валидный ID убитого игрока (т.е. от 0 до 999).
Тем не менее, опытным путём было замечено, что ID от 1000 до INVALID_PLAYER_ID-1 тоже работают.
На самом деле это баг, но куй вряд ли исправит его - сервер из-за этого бага не крашит, да и игроки тоже, а значит можно, как всегда, забить.
Поскольку кол-во слотов с новыми релизами SA:MP может увеличиться, самым безопасным вариантом будет использовать наибольшее рабочее значение - INVALID_PLAYER_ID-1.
Пример использования:
CMD:cleardeaths(playerid, params[])
{
ClearKillFeed(playerid);
return SendClientMessage(playerid, -1, "Список убийств очищен.");
}
Автор: Daniel_Cortez (http://pro-pawn.ru/member.php?100-Daniel_Cortez)
Благодарности:
Londlem (http://pro-pawn.ru/member.php?2057-Londlem) - за идею с использованием INVALID_PLAYER_ID-1.
Kalcor - за то, что с каждым выпуском SA:MP плодит всё больше багов (в т.ч. и баг с возможностью юзать ID больше 999 в SendDeathMessage).
Специально для Pro-Pawn.ru (http://www.pro-pawn.ru)
Копирование данной статьи на других ресурсах без разрешения автора запрещено!
Очищает килл-лист указанного игрока (или всех игроков, если игрок не указан).
Параметры:
playerid - игрок, у которого будет очищен килл-лист (необязательный параметр)
Возвращаемое значение:
Если указан ID игрока, возвращает 0, если он не подключен. В остальных случаях возвращает 1.
Плюсы реализации:
Простота в использовании.
Пониженное потребление пространства в стеке и меньшая нагрузка от функции на сервер за счёт использования #emit.
Работает даже тогда, когда подключены все игроки.
Код:
stock ClearKillFeed(playerid = INVALID_PLAYER_ID)
{// by Londlem & Daniel_Cortez \\ pro-pawn.ru
if((playerid != INVALID_PLAYER_ID) && (0 == IsPlayerConnected(playerid)))
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
SendDeathMessage(0, 0, 0),
SendDeathMessageToPlayer(0, 0, 0, 0);
#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, но этот вариант не работал.
В англоязычной документации (http://wiki.sa-mp.com/wiki/SendDeathMessage) сказано, что для работы функции нужно передать любой валидный ID убитого игрока (т.е. от 0 до 999).
Тем не менее, опытным путём было замечено, что ID от 1000 до INVALID_PLAYER_ID-1 тоже работают.
На самом деле это баг, но куй вряд ли исправит его - сервер из-за этого бага не крашит, да и игроки тоже, а значит можно, как всегда, забить.
Поскольку кол-во слотов с новыми релизами SA:MP может увеличиться, самым безопасным вариантом будет использовать наибольшее рабочее значение - INVALID_PLAYER_ID-1.
Пример использования:
CMD:cleardeaths(playerid, params[])
{
ClearKillFeed(playerid);
return SendClientMessage(playerid, -1, "Список убийств очищен.");
}
Автор: Daniel_Cortez (http://pro-pawn.ru/member.php?100-Daniel_Cortez)
Благодарности:
Londlem (http://pro-pawn.ru/member.php?2057-Londlem) - за идею с использованием INVALID_PLAYER_ID-1.
Kalcor - за то, что с каждым выпуском SA:MP плодит всё больше багов (в т.ч. и баг с возможностью юзать ID больше 999 в SendDeathMessage).
Специально для Pro-Pawn.ru (http://www.pro-pawn.ru)
Копирование данной статьи на других ресурсах без разрешения автора запрещено!