1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  1. пазлик~

    пазлик~ Разработчик

    Регистрация:
    8 июн 2017
    Сообщения:
    82
    Симпатии:
    68
    Пол:
    Мужской
    Автор: pUzzlik
    Текущая версия: 1.4

    Описание:
    Ремейк одного очень старого плагина SpecList от FatalisDK (Spectator List 1.2a - AlliedModders)

    Особенности:
    • В плагине используется dhud.
    • Возможность настроить цвет списка.
    • Возможность настроить иммунитет для админов чтобы не было видно за кем они наблюдают.
    • Список игроков в отличие от оригинала выводиться только тому за кем наблюдают.
    • Поддержка amxx 1.8.2 и выше.
    Настройки:
    PHP:
    #define IMMUNITY_FLAG ADMIN_BAN    // Флаг с которым игрока не будет выводить в speclist, закомментируйте если хотите чтобы выводило всех.
    #define UPDATE 2.0                // Частота обновлений списка

    /*** Настройка цвета в RGB ***/
    #define RED 0        // Количество красного
    #define GREEN 255    // Количество зеленого
    #define BLUE 0        // Количество синего
    /*** Конец настройки цвета ***/

    Установка:
    • Скачиваете архив
    • Открываете исходник чтобы настроить на свое усмотрение
    • Заливаете все согласно папкам на сервер и прописываете плагин в plugins.ini
    • 1.2a - Оригинал плагина
    • 1.3 - Рефакторинг, избавления от не нужных функций, добавления ланг файла.
    • 1.4 - Оптимизация
    1. При компилировании на amxx 1.8.2 должен быть инклуд dhudmessage.inc
    2. Версию делал для себя, поэтому переделывать не буду кого не устраивает dhud исходник есть дерзайте, нужна будет помощь пишите в теме авось кто то откликнется.
    3. Плагин использует модуль fakemeta

    Благодарности:
    Mistrick
     

    Вложения:

    • speclist.zip
      Размер файла:
      1,9 КБ
      Просмотров:
      41
    • speclist_1.3.zip
      Размер файла:
      1,9 КБ
      Просмотров:
      22
    Последнее редактирование: 12 июн 2017
    ImbaSS нравится это.
  2. Mistrick

    Mistrick Разработчик

    Регистрация:
    8 июн 2017
    Сообщения:
    17
    Симпатии:
    3
    Пол:
    Мужской
    Я уже писал, что можно сделать через 2 цикла, а не цикл в цикле. Так что можно дальше пытаться оптимизировать.
     
  3. пазлик~

    пазлик~ Разработчик

    Регистрация:
    8 июн 2017
    Сообщения:
    82
    Симпатии:
    68
    Пол:
    Мужской
    Mistrick, Не знаю пересмотрел вчера я код и здравый смысл мне гласит что без цикла в цикле не обойтись, да шо там пересмотрев я даже парочку правок по пробовал и пришёл к выводу что это сделать не реально, будьте столь таки любезны подскажите как и я прошерстю весь код для большей оптимизации, а пока все что я могу это это вынести из цикла get_players чтобы не искать его для каждого ид по новой.
     
  4. Mistrick

    Mistrick Разработчик

    Регистрация:
    8 июн 2017
    Сообщения:
    17
    Симпатии:
    3
    Пол:
    Мужской
    пазлик~, Как-то так, но минусом идет увеличенный расход памяти. Работу не проверял.
    PHP:
    public ShowSpecList()
    {
        new 
    dead[MAX_PLAYERS], dCount;
        
    get_players(deaddCount"bch");
       
        new 
    spec_list[MAX_PLAYERS][512];
        new 
    len[MAX_PLAYERS 1];
        new 
    name[32];
       
        for(new 
    0idspecdCounti++)
        {
            
    id dead[i];
            
    spec pev(idpev_iuser2);
           
            if(
    spec == id || !is_user_alive(spec)) continue;
           
            
    get_user_name(specnamecharsmax(name));
            
    len[spec] += formatex(spec_list[spec 1][len[spec]], charsmax(spec_list[]) - len[spec], "&s^n"name);
        }
       
        new 
    players[MAX_PLAYERS], pnum;
        
    get_players(playerspnum"ch");
       
        for(new 
    iidspecpnumi++)
        {
            
    id players[i];
            
    spec pev(idpev_iuser2);
           
            if(!
    spec_list[spec 1][0]) continue;
           
            
    set_dhudmessage(REDGREENBLUE0.750.1500.0UPDATE-0.01);
            
    show_dhudmessage(id"%L:^n%s"LANG_PLAYER"SPECT"spec_list[spec 1]);
        }
    }
     
  5. пазлик~

    пазлик~ Разработчик

    Регистрация:
    8 июн 2017
    Сообщения:
    82
    Симпатии:
    68
    Пол:
    Мужской
    Mistrick, Ваш код как и мой компилируется но моментально уводит сервер в краш при уст. плагина, я от раньше пытался что то похожие сделать наброски ниже, поэтому я пришел к такому выводу, мб где то ошибаемся но что мой код что ваш крашит з одной и той же проблемой могу полный дамп дать если получиться узнать где косяк, а то я в них мало что кумекаю :)
    PHP:
    public ShowSpecList() {
        new 
    szDhud[MAX_PLAYERS][512]; //, iLen[MAX_PLAYERS];

        
    new iDead[MAX_PLAYERS], dCount;
        
    get_players(iDeaddCount"bch");

        for(new 
    iidspecdCounti++)
        {
            
    id iDead[i];
            
    spec pev(idpev_iuser2);
          
            if(
    spec == id) continue;

            
    /*
            new szName[16];
            get_user_name(id, szName, charsmax(szName));
            iLen[spec] += formatex(szDhud[spec][iLen[spec]], charsmax(szDhud[]) - iLen[spec], "%s^n", szName);
            */
          
            
    new szName[16], szReadName[20];
            
    get_user_name(idszNamecharsmax(szName));
            
    formatex(szReadNamecharsmax(szReadName), "%s^n"szName);
          
            
    add(szDhud[spec], charsmax(szDhud[]), szReadNamecharsmax(szReadName));
        }
      
        new 
    iAlive[MAX_PLAYERS], aCount;
        
    get_players(iAliveaCount"ach");

        for(new 
    iidaCounti++)
        {
            
    id iAlive[i];

            if(!
    szDhud[id][0] || !is_user_alive(id)) continue;

            
    set_dhudmessage(REDGREENBLUE0.750.1500.0UPDATE-0.01);
            
    show_dhudmessage(id"%L:^n%s"LANG_PLAYER"SPECT"szDhud[id]);
        }
    }
    Из кода можно понять что пытался и по вашему шаблону подкрутить есть строки которые закомментированные.
    --- Сообщения объединены 12 июн 2017 ---
    Mistrick, Вообщем разобрался дело в двумерному массиве [32] - игрока по [512] - байта да еще и таском видимо очень круто для сервера и он ложиться отдохнуть с ошибкой "Program terminated with signal 11, Segmentation fault."
     
    Последнее редактирование: 13 июн 2017
  6. Inline

    Inline Пользователь Разработчик

    Регистрация:
    8 июн 2017
    Сообщения:
    235
    Симпатии:
    80
    Пол:
    Мужской
    пазлик~, с помощью static двумерные массивы объяви или через #pragma dynamic увеличь стек. Ты через -d2 компилируешь? По идеи сервер не должен падать, а выдать stack error (поправьте, если где-то ошибаюсь).
     
  7. пазлик~

    пазлик~ Разработчик

    Регистрация:
    8 июн 2017
    Сообщения:
    82
    Симпатии:
    68
    Пол:
    Мужской
    Inline, Да я уже разобрался с этим, я без понятия что ему не нравиться но у меня каждую секунду через таск создавался новый двумерный массив с размерностью [32][512], код ошибок не имел в теории должен был работать но при тесте на сервере ложил его к чертям на первых секундах работы поэтому из за лени и малого количества времени я пришел к выводу что иначе не выйдет, потом мне отписали почти с идентичным кодом я его копирнул и вуаля то же самое тут я начал разбираться методом тыка и попал на массив, потом сделал в обход (Оптимизация хули хД) вынес его за пределы функции и просто обнуляю по выполнению своей работы. Если есть желание могу дать дамп поковыряешься, а то я в них мало шарю, а разбираться и изучать считаю не актуальным на данное время.
    --- Сообщения объединены 12 июн 2017 ---
    *** Обновлен первый пост ***
    • Текущая версия: 1.4
    • Переписан код для лучшей оптимизации.
    • Особая благодарность Mistrick
     
  8. Inline

    Inline Пользователь Разработчик

    Регистрация:
    8 июн 2017
    Сообщения:
    235
    Симпатии:
    80
    Пол:
    Мужской
    пазлик~, Дак зачем всё обнулять? szDhud[0] = '^0'; и всё
    А вот это
    PHP:
    get_user_name(idszNamecharsmax(szName));
    iLen[spec] += formatex(szDhud[spec][iLen[spec]], charsmax(szDhud[]) - iLen[spec], "%s^n"szName);
    Можешь таким "хакерским" способом заменить на это
    PHP:
    iLen[spec] += get_user_name(idszDhud[spec][iLen[spec]], charsmax(szDhud[]) - iLen[spec]);
    if((
    charsmax(szDhud[]) - iLen[spec]) >= 1)
    {
            
    szDhud[spec][iLen[spec]++] = '^n';          
            
    szDhud[spec][iLen[spec]++] = '^0';
    }
     
  9. пазлик~

    пазлик~ Разработчик

    Регистрация:
    8 июн 2017
    Сообщения:
    82
    Симпатии:
    68
    Пол:
    Мужской
    Inline, Почему все? создался массив с никами показали его игроку и тут же обнулили чтобы в будущем можно было опять создавать, "хакерский" метод не подойдет, т.к. я спецом ники обрезаю на 16 байт вместо 32, а хакерским методом обрезать не выйдет, да и прирост к работе не существенный.
     
  10. Mistrick

    Mistrick Разработчик

    Регистрация:
    8 июн 2017
    Сообщения:
    17
    Симпатии:
    3
    Пол:
    Мужской
    пазлик~, по мне вы сломали логику. Игроку нужно выводить худ, который заполнен для spec, а вы выводите для id.
    Есть 3 игрока, 1 живой и 2 наблюдают за первым. У первого id == spec, у остальных spec будет первый игрок. А вы будете выводить им dhud[id], в которых пусто.
    Хотя, вы там только для живых выводите. Тогда пойдет.
     
    Последнее редактирование: 14 июн 2017
  11. iOS

    iOS Пользователь

    Регистрация:
    9 июн 2017
    Сообщения:
    110
    Симпатии:
    16
    Пол:
    Мужской
    Может кто то переделать dhud на hud. И вырезать вот это: Список игроков в отличие от оригинала выводиться только тому за кем наблюдают.
    Чтоб список всем показывало..
     
  12. pakistan

    pakistan Пользователь

    Регистрация:
    14 июн 2017
    Сообщения:
    14
    Симпатии:
    1
    Пол:
    Мужской
    как насчёт того, чтобы сделать показ смотрителей на нажатие E (хотя бы вкл/выкл кваром), подобное реализовано в плагине speclist от UFPS
    Функция позволит не "мусорить" на экране очередной кучей информации, а получать её только по желанию игрока.
     
  13. пазлик~

    пазлик~ Разработчик

    Регистрация:
    8 июн 2017
    Сообщения:
    82
    Симпатии:
    68
    Пол:
    Мужской
    Mistrick, Да так изначально и задумал, еще из прошлых своих версий выводил список только тому за кем смотрят, для игрока адреналин когда ты видишь что за тобой смотрят, а остальным лишняя не нужная инфа на экране, лучше рекламу туда запилить вместо этого.
    pakistan,
    Это равносильно как устанавливать плагин или нет, если смотреть changelog можно заметить что из версии 1.3 убрал по моему мнению лишние хотя думаю добавить будет не сложно но посмотрим мб в будущем добавлю возможность откл. через чат но ремейк нацелен на оптимизацию своего рода lite версия можете и оригинальный использовать 1.2.a ссылка в описании на алени.

    iOS, Прочтите следующее [TUT] Работа с HUD и DHUD сообщениями • Русское сообщество по скриптингу AMXX/SM/Metamod вам будет полезно в данном случаи из dhud нужно убрать букву d и будет вам счастье примерно вот так
    PHP:
    set_dhudmessage(REDGREENBLUE0.750.1500.0UPDATE-0.01);
    show_dhudmessage(id"%L:^n%s"LANG_PLAYER"SPECT"szDhud[id]);
    >>>
    PHP:
    set_hudmessage(REDGREENBLUE0.750.1500.0UPDATE-0.01);
    show_hudmessage(id"%L:^n%s"LANG_PLAYER"SPECT"szDhud[id]);
    На счет список всем, исп. оригинальную версию, мое мнение можете прочитать выше, моя работа нацелена на оптимизацию, возможно когда то я выпущу отдельную версию для всех но это не точно.
     
  14. pakistan

    pakistan Пользователь

    Регистрация:
    14 июн 2017
    Сообщения:
    14
    Симпатии:
    1
    Пол:
    Мужской
    пазлик~, я имел ввиду не работу плагина, а сам функционал:
    Включить (1) возможность вызывать через Е или отключить (0)
     
  15. пазлик~

    пазлик~ Разработчик

    Регистрация:
    8 июн 2017
    Сообщения:
    82
    Симпатии:
    68
    Пол:
    Мужской
    pakistan, Вы не так выразились, скорей всего. Квары это переменные через которые мы управляем сервером, незя их присвоить отдельному игроку.
     
  16. Phantom

    Phantom Команда форума Администратор

    Регистрация:
    8 июн 2017
    Сообщения:
    57
    Симпатии:
    36
    :D класс
     
  17. LimBo

    LimBo Пользователь

    Регистрация:
    10 июл 2017
    Сообщения:
    33
    Симпатии:
    0
    Пол:
    Мужской
    размер слишком большой пол экрана занмает как можно изменить ????
     
  18. izzatillo

    izzatillo Пользователь

    Регистрация:
    8 июн 2017
    Сообщения:
    126
    Симпатии:
    45
    Пол:
    Мужской
    VKcom:
    musoxonov
    Telegram:
    @musaxonov
    LimBo, выше ответили как по меньше сделать

    Прочтите следующее [TUT] Работа с HUD и DHUD сообщениями • Русское сообщество по скриптингу AMXX/SM/Metamod вам будет полезно в данном случаи из dhud нужно убрать букву d и будет вам счастье примерно вот так
    PHP:
    set_dhudmessage(REDGREENBLUE0.750.1500.0UPDATE-0.01);
    show_dhudmessage(id"%L:^n%s"LANG_PLAYER"SPECT"szDhud[id]);
    >>>
    PHP:
    set_hudmessage(REDGREENBLUE0.750.1500.0UPDATE-0.01);
    show_hudmessage(id"%L:^n%s"LANG_PLAYER"SPECT"szDhud[id]);
     
    пазлик~ нравится это.