Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 14
  1. #1
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

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

    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
    Копирование данной статьи на других ресурсах без разрешения автора запрещено!
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. 8 пользователя(ей) сказали 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) punkochel (26.10.2020) wAx (21.05.2015)
  3. #2
    Аватар для Desulaid
    лесоруб продакшен

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

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

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

  5. #4
    Аватар для Desulaid
    лесоруб продакшен

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

  6. #5
    Аватар для $continue$
    Пользователь

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

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

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

  8. #7
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Быть может сделать версию для оператора __emit без всяких workarounds.

  9. #8
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Быть может сделать версию для оператора __emit без всяких workarounds.
    Не вижу смысла. От вызова IsPlayerConnected() не избавиться, SendDeathMessageToPlayer() возвращает 1 даже когда игрок не подключен. Объявление массива тоже нужно, чтобы компилятор правильно подсчитал использование стека при вызове нативных функций (не уверен, возможно ли заставить оператор emit считать его самостоятельно). Единственное, что можно убрать - это пустые вызовы SendDeathMessage() и SendDeathMessageToPlayer() - и только ради этого вместо стокового компилятора требовать новую версию? Едва ли стоит того.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  10. #9
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Кстати, а почему в инструкциях stack значения равные размеру переданных элементов в стеке? Там же должно быть на 4 больше,ибо пушим размер аргументов в стеке.

  11. #10
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Кстати, а почему в инструкциях stack значения равные размеру переданных элементов в стеке? Там же должно быть на 4 больше,ибо пушим размер аргументов в стеке.
    Потому что одним из аргументов (ID оружия) для SendDeathMessage(ToPlayer) является переменная i - таким образом, в неё совмещено сразу два назначения. А поскольку она уже есть в стеке, нет смысла копировать её значение туда ещё раз.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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