Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Показано с 1 по 6 из 6
  1. #1
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

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

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

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

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

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

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

    Код:
    PHP код:
    stock ClearKillFeed(playerid INVALID_PLAYER_ID)
    {
    // by Londlem & Daniel_Cortez \\ pro-pawn.ru
        
    if((playerid != INVALID_PLAYER_ID) && (== 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(000),
        
    SendDeathMessageToPlayer(0000);
    #endif
    L_start:
        const 
    CKF_MAGIC_ID INVALID_PLAYER_ID 1;
        
    // this variable is also used as weaponid parameter
        
    new 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(--!= 0);
            
    #emit    stack    12
        
    }
        else
        {
            
    #emit    push.s    playerid
            #emit    push.c    16
            
    do{
                
    #emit    sysreq.c    SendDeathMessageToPlayer
            
    }while(--!= 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.


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


    Автор: 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)Londlem (22.05.2015)M1RoN (24.05.2015)untonyst (21.05.2015)wAx (21.05.2015)
  3. #2
    Аватар для untonyst
    Младший сержант

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    664
    Репутация:
    234 ±
    Kalcor такой молодец. И баги у него все интереснее и интереснее.
    А так эта функция идеально подходит мне для разработки одного мода. Как раз лишней не будет
    Младший сержант Стяжкин | ЧСВ группа в ВКонтакте NEW

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

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

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

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

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

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

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

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

 

 

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

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

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

Ваши права

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