Remake Spectators List [1.4]

пазлик~

Скриптер
Скриптер
Регистрация
8 Июн 2017
Сообщения
235
Симпатии
134
Пол
Мужской
Автор: 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
 

Вложения

Последнее редактирование:

Mistrick

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

пазлик~

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

Mistrick

Разработчик
Регистрация
8 Июн 2017
Сообщения
47
Симпатии
25
Пол
Мужской
пазлик~, Как-то так, но минусом идет увеличенный расход памяти. Работу не проверял.
PHP:
public ShowSpecList()
{
    new dead[MAX_PLAYERS], dCount;
    get_players(dead, dCount, "bch");
   
    new spec_list[MAX_PLAYERS][512];
    new len[MAX_PLAYERS + 1];
    new name[32];
   
    for(new i = 0, id, spec; i < dCount; i++)
    {
        id = dead[i];
        spec = pev(id, pev_iuser2);
       
        if(spec == id || !is_user_alive(spec)) continue;
       
        get_user_name(spec, name, charsmax(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(players, pnum, "ch");
   
    for(new i, id, spec; i < pnum; i++)
    {
        id = players[i];
        spec = pev(id, pev_iuser2);
       
        if(!spec_list[spec - 1][0]) continue;
       
        set_dhudmessage(RED, GREEN, BLUE, 0.75, 0.15, 0, 0.0, UPDATE-0.01);
        show_dhudmessage(id, "%L:^n%s", LANG_PLAYER, "SPECT", spec_list[spec - 1]);
    }
}
 

пазлик~

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

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

    for(new i, id, spec; i < dCount; i++)
    {
        id = iDead[i];
        spec = pev(id, pev_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(id, szName, charsmax(szName));
        formatex(szReadName, charsmax(szReadName), "%s^n", szName);
      
        add(szDhud[spec], charsmax(szDhud[]), szReadName, charsmax(szReadName));
    }
  
    new iAlive[MAX_PLAYERS], aCount;
    get_players(iAlive, aCount, "ach");

    for(new i, id; i < aCount; i++)
    {
        id = iAlive[i];

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

        set_dhudmessage(RED, GREEN, BLUE, 0.75, 0.15, 0, 0.0, UPDATE-0.01);
        show_dhudmessage(id, "%L:^n%s", LANG_PLAYER, "SPECT", szDhud[id]);
    }
}
Из кода можно понять что пытался и по вашему шаблону подкрутить есть строки которые закомментированные.
[doublepost=1497291339,1497285713][/doublepost]Mistrick, Вообщем разобрался дело в двумерному массиве [32] - игрока по [512] - байта да еще и таском видимо очень круто для сервера и он ложиться отдохнуть с ошибкой "Program terminated with signal 11, Segmentation fault."
 
Последнее редактирование:

Inline

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

пазлик~

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

Inline

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

пазлик~

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

Mistrick

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

iOS

Команда форума
Модератор
Регистрация
9 Июн 2017
Сообщения
506
Симпатии
148
Пол
Мужской
Telegram
@pogorelov_ios
Может кто то переделать dhud на hud. И вырезать вот это: Список игроков в отличие от оригинала выводиться только тому за кем наблюдают.
Чтоб список всем показывало..
 

pakistan

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

пазлик~

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

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

pakistan

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

пазлик~

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

LimBo

Только чтение
Заблокированные
Пользователь
Регистрация
10 Июл 2017
Сообщения
112
Симпатии
3
Предупреждения
200
Пол
Мужской
Mistrick, Да так изначально и задумал, еще из прошлых своих версий выводил список только тому за кем смотрят, для игрока адреналин когда ты видишь что за тобой смотрят, а остальным лишняя не нужная инфа на экране, лучше рекламу туда запилить вместо этого.


pakistan,
Это равносильно как устанавливать плагин или нет, если смотреть changelog можно заметить что из версии 1.3 убрал по моему мнению лишние хотя думаю добавить будет не сложно но посмотрим мб в будущем добавлю возможность откл. через чат но ремейк нацелен на оптимизацию своего рода lite версия можете и оригинальный использовать 1.2.a ссылка в описании на алени.

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

izzatillo

Пользователь
Регистрация
8 Июн 2017
Сообщения
247
Симпатии
85
Пол
Мужской
ВКонтакте
musoxonov
Telegram
@musaxonov
LimBo, выше ответили как по меньше сделать

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

Vesuvius

НЕ СКРИПТЕР!!!
Команда форума
Администратор
Регистрация
8 Июн 2017
Сообщения
1.598
Симпатии
570
Пол
Мужской
а можно добавить команду... чтоб игрок мог отключить для себя ????
с возможностью запоминания вибора игрока?
 

AlexButs

Пользователь
Регистрация
8 Июн 2017
Сообщения
120
Симпатии
15
Пол
Мужской
можно пожалуйста скрин плагина
 
Сверху Снизу