Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 6 из 6
  1. #1
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,767
    Репутация:
    2256 ±

    ClearKillFeed - очистка списка убийств

    Описание:
    Очищает килл-лист указанного игрока (или всех игроков, если игрок не указан).

    Параметры:
    playerid - игрок, у которого будет очищен килл-лист (необязательный параметр)

    Возвращаемое значение:
    Если указан ID игрока, возвращает 0, если он не подключен. В остальных случаях возвращает 1.

    Плюсы реализации:
    • Простота в использовании.
    • Пониженное потребление пространства в стеке и меньшая нагрузка от функции на сервер за счёт использования #emit.
    • Работает даже тогда, когда подключены все игроки.

    Код:
    1. stock ClearKillFeed(playerid = INVALID_PLAYER_ID)
    2. {// by Londlem & Daniel_Cortez \\ pro-pawn.ru
    3. if((playerid != INVALID_PLAYER_ID) && (0 == IsPlayerConnected(playerid)))
    4. return 0;
    5. goto L_start;
    6. // avoid possible stack overflow (due to using push.* opcodes)
    7. {
    8. new dummy[16/(cellbits/charbits)];
    9. #emit const.pri dummy
    10. }
    11. #if __Pawn < 0x030A
    12. // optional sysreq.c bugfix
    13. SendDeathMessage(0, 0, 0),
    14. #endif
    15. L_start:
    16. const CKF_MAGIC_ID = INVALID_PLAYER_ID - 1;
    17. // this variable is also used as weaponid parameter
    18. new i = 5;
    19. // push killer and killee IDs
    20. #emit push.c CKF_MAGIC_ID
    21. #emit push.c CKF_MAGIC_ID
    22. if(playerid == INVALID_PLAYER_ID)
    23. {
    24. #emit push.c 12
    25. do{
    26. #emit sysreq.c SendDeathMessage
    27. }while(--i != 0);
    28. #emit stack 12
    29. }
    30. else
    31. {
    32. #emit push.s playerid
    33. #emit push.c 16
    34. do{
    35. #emit sysreq.c SendDeathMessageToPlayer
    36. }while(--i != 0);
    37. #emit stack 16
    38. }
    39. return 1;
    40. }


    Примечания:
    • Для очистки киллчата в качестве 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.


    Пример использования:
    1. CMD:cleardeaths(playerid, params[])
    2. {
    3. ClearKillFeed(playerid);
    4. return SendClientMessage(playerid, -1, "Список убийств очищен.");
    5. }



    Автор: Daniel_Cortez

    Благодарности:
    • Londlem - за идею с использованием INVALID_PLAYER_ID-1.
    • Kalcor - за то, что с каждым выпуском SA:MP плодит всё больше багов (в т.ч. и баг с возможностью юзать ID больше 999 в SendDeathMessage).


    Специально для Pro-Pawn.ru
    Копирование данной статьи на других ресурсах без разрешения автора запрещено!
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  2. 7 пользователя(ей) сказали cпасибо:
    #Vito (30.05.2015)$continue$ (21.05.2015)Astrakhan30 (27.05.2016)Desulaid (21.05.2015)L0ndl3m (22.05.2015)M1RoN (24.05.2015)wAx (21.05.2015)
  3. #2
    Аватар для Desulaid
    Младший сержант

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    660
    Репутация:
    235 ±
    Kalcor такой молодец. И баги у него все интереснее и интереснее.
    А так эта функция идеально подходит мне для разработки одного мода. Как раз лишней не будет

  4. #3
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    378
    Репутация:
    145 ±
    Как всегда, работа на уровне!

  5. #4
    Аватар для Desulaid
    Младший сержант

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    660
    Репутация:
    235 ±
    Ты предал свои же стандарты((9(
    PHP код:
    // ..
    do{
        
    #emit    sysreq.c    SendDeathMessage
    }while(--!= 0);
    // ..
    do{
        
    #emit    sysreq.c    SendDeathMessageToPlayer
    }while(--!= 0);
    // .. 

  6. #5
    Аватар для $continue$
    Заблокирован

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,467
    Репутация:
    265 ±
    Цитата Сообщение от Darge Посмотреть сообщение
    Ты предал свои же стандарты((9(
    PHP код:
    // ..
    do{
        
    #emit    sysreq.c    SendDeathMessage
    }while(--!= 0);
    // ..
    do{
        
    #emit    sysreq.c    SendDeathMessageToPlayer
    }while(--!= 0);
    // .. 
    Какие стандарты?

  7. #6
    Аватар для 123
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2014
    Сообщений
    73
    Репутация:
    8 ±
    После выхода, как я понял, килл-лист не очищается? Нужно очищать самостоятельно?

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •