Remake Spectators List

пазлик~

Разработчик
Регистрация
8 Июн 2017
Сообщения
142
Симпатии
89
Пол
Мужской
#1
Автор: 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
Сообщения
23
Симпатии
7
Пол
Мужской
#2
Я уже писал, что можно сделать через 2 цикла, а не цикл в цикле. Так что можно дальше пытаться оптимизировать.
 

пазлик~

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

Mistrick

Разработчик
Регистрация
8 Июн 2017
Сообщения
23
Симпатии
7
Пол
Мужской
#4
пазлик~, Как-то так, но минусом идет увеличенный расход памяти. Работу не проверял.
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
Сообщения
142
Симпатии
89
Пол
Мужской
#5
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
Сообщения
233
Симпатии
77
Пол
Мужской
#6
пазлик~, с помощью static двумерные массивы объяви или через #pragma dynamic увеличь стек. Ты через -d2 компилируешь? По идеи сервер не должен падать, а выдать stack error (поправьте, если где-то ошибаюсь).
 

пазлик~

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

Inline

Пользователь
Регистрация
8 Июн 2017
Сообщения
233
Симпатии
77
Пол
Мужской
#8
пазлик~, Дак зачем всё обнулять? 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
Сообщения
142
Симпатии
89
Пол
Мужской
#9
Inline, Почему все? создался массив с никами показали его игроку и тут же обнулили чтобы в будущем можно было опять создавать, "хакерский" метод не подойдет, т.к. я спецом ники обрезаю на 16 байт вместо 32, а хакерским методом обрезать не выйдет, да и прирост к работе не существенный.
 

Mistrick

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

iOS

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

pakistan

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

пазлик~

Разработчик
Регистрация
8 Июн 2017
Сообщения
142
Симпатии
89
Пол
Мужской
#13
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
Сообщения
19
Симпатии
5
Пол
Мужской
#14
пазлик~, я имел ввиду не работу плагина, а сам функционал:
Включить (1) возможность вызывать через Е или отключить (0)
 

пазлик~

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

LimBo

Пользователь
Регистрация
10 Июл 2017
Сообщения
115
Симпатии
2
Пол
Мужской
#17
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
Сообщения
190
Симпатии
69
Пол
Мужской
#18
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
Сообщения
127
Симпатии
20
Пол
Мужской
#19
а можно добавить команду... чтоб игрок мог отключить для себя ????
с возможностью запоминания вибора игрока?
 

AlexButs

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