[CS GO] Вывод массива в Hud

ElectricStalin

Участник
Сообщения
24
Реакции
0
Добрый день.
У меня в плагине есть массив, в котором хранятся индексы оружия игрока clientsWeapon[client][35]. Я хочу выводить на экран содержимое массива и менять вывод при изменении содержимого. Также мне нужно выделять цветом одну из строк. Вот, что у меня получилось:
C-подобный:
public printBackpackHud(int client)
{
    int j;
    float x,y;
    x=0.0;
    y=0.1;
    char buffer[32];
    j=1;
    while(clientsWeapon[client][j]!=0)
    {
        SetHudTextParams(x, y, 9999.0, 255, 0, 0, 255);
        if(weaponInHand[client]==j)
        {
            SetHudTextParams(x, y, 9999.0, 0, 255, 0, 255);
        }
        GetEntityClassname(EntRefToEntIndex(clientsWeapon[client][j]),buffer,sizeof(buffer));
        ShowHudText(client, -1, "In slot %i -- %s",j,buffer);
        j++;
        y+=0.03;
    }
}
Это работает, но показывает максимум 5-6 элементов. Также иногда надписи перекрывают друг-друга. Может кто-то уже сталкивался с необходимостью выводить массив. Знаю, что есть спецсимвол новой строки \n , но как его использовать, если я делаю вывод в цикле?
Надеюсь на вашу помощь.
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,335
Объедините всё в одну строку, используя цикл и функцию Format. Пример для вывода массива целых чисел через символ '|' как одну строчку:
C-подобный:
public OnPluginStart()
{
    decl String:str_array[32];
    new int_array[] = {5, 2, 66, 45, 87};
  
    // decl без отчистки памяти, лучше обнулить первый символ
    str_array[0] = 0;
    for ( new i = 0; i < sizeof(int_array); ++i ) {
        Format(str_array, sizeof(str_array), "%s%d|", str_array, int_array[i]);
    }
    str_array[strlen(str_array)-1] = 0; // убираем последний символ '|'
}
 

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
966
Всего HudMsg поддерживает как раз эти 5-6 каналов. Лучше создай огромную строку и в неё выводи, разделяя значения с помощью \n
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980

ElectricStalin

Участник
Сообщения
24
Реакции
0
Тогда не получится сделать вот это::crazy:
Да, все верно. Пока решил сделать без этого.

К сожалению, строки лезут друг на друга. Вот, что у меня в коде:
C-подобный:
public printBackpackHud(int client)
{
    int j;
    float x,y;
    x=0.0;
    y=0.1;
    char buffer[32]; 
    char str_array[1024];
    SetHudTextParams(x, y, 9999.0, 255, 0, 0, 255);
    j=1;
    while(clientsWeapon[client][j]!=0)
    {
        GetEntityClassname(EntRefToEntIndex(clientsWeapon[client][j]),buffer,sizeof(buffer));      
        Format(str_array, sizeof(str_array), "В слоте %i -- %s \n", j, buffer);
        j++;
    }
    ShowHudText(client, -1, "В слоте %i -- %s",j,str_array);  
}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
public printBackpackHud(int client)
должно же быть public void printBackpackHud(int client)
строки лезут друг на друга
а скрин можно? Не должно такого быть, разве что у тебя в клиенте кастомный худ (шрифты изменены или параметры самого худа).
SetHudTextParams(x, y, 9999.0, 255, 0, 0, 255);
И что, реально 2 часа 46 минут и 39 секунд надпись висит и ты её не обновляешь?
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #9
@ElectricStalin, если синхронизированный худ использовать, то налезать не будет.
PHP:
public void printBackpackHud(int client) {
    static Handle hSyncHud = null;
    if (!hSyncHud) {
        hSyncHud = CreateHudSynchronizer();
        if (!hSyncHud) {
            SetFailState("Synchronization HUD not supported on this game.");
        }
    }

    char buffer[32]; 
    char str_array[1024];

    str_array[0] = 0;
    int j = 1;

    while(clientsWeapon[client][j]!=0) {
        GetEntityClassname(EntRefToEntIndex(clientsWeapon[client][j]), buffer, sizeof(buffer));

        Format(str_array, sizeof(str_array), "%sВ слоте %i -- %s \n", str_array, j, buffer);
        j++;
    }

    SetHudTextParams(0.0, 0.1, 9999.0, 255, 0, 0, 255);
    ShowSyncHudText(client, hSyncHud, "%s", str_array);  
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Kruzya, если канал -1, то старая надпись должна исчезать (если конечно больше ничего в худ не выводится) даже без ShowSyncHudText()
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #11
@Grey83, но не исчезает. Неоднократно сталкиваюсь с этим.
В TF2 например очень активно этот баг существует.
 

ElectricStalin

Участник
Сообщения
24
Реакции
0
Большое спасибо. Попробовал вариант Kruzya, отображается хорошо, меняется без рывков. Но, к сожалению, больше 6 строк отображать не хочет( Прикладываю срин.
image.png
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
к сожалению, больше 6 строк отображать не хочет
просто лимит на количество символов для этого элемента худа не 1к, как у крузи, а 512, емнип
просто сделай не Format(str_array, sizeof(str_array), "%sВ слоте %i -- %s \n", str_array, j, buffer), а Format(str_array, sizeof(str_array), "%s%i) %s\n", str_array, j, buffer)
Так чуть больше поместится
Ещё можно в названии оружия удалить weapon_, чтобы ещё сэкономить на количестве символов: добавить строку ReplaceString(buffer, sizeof(buffer), "weapon_", "") перед Format(...)
Можно попробовать ещё Format(str_array, sizeof(str_array), "%s%i) %s\n", str_array, j, buffer[7]) вместо этого, но я не уверен, что будет работать как надо
 

ElectricStalin

Участник
Сообщения
24
Реакции
0
просто лимит на количество символов для этого элемента худа не 1к, как у крузи, а 512, емнип
просто сделай не Format(str_array, sizeof(str_array), "%sВ слоте %i -- %s \n", str_array, j, buffer), а Format(str_array, sizeof(str_array), "%s%i) %s\n", str_array, j, buffer)
Так чуть больше поместится
Ещё можно в названии оружия удалить weapon_, чтобы ещё сэкономить на количестве символов: добавить строку ReplaceString(buffer, sizeof(buffer), "weapon_", "") перед Format(...)
Можно попробовать ещё Format(str_array, sizeof(str_array), "%s%i) %s\n", str_array, j, buffer[7]) вместо этого, но я не уверен, что будет работать как надо
Понял, спасибо. Оптимизирую длину строки.
Остался только вопрос, как при таком выводе, выделить определенную строку. Идеально-цветом. Нормально-каким-то символом.
 

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
966
Понял, спасибо. Оптимизирую длину строки.
Остался только вопрос, как при таком выводе, выделить определенную строку. Идеально-цветом. Нормально-каким-то символом.
Можно с помощью \t (выглядит как квадратик, ну в меню точно)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@ElectricStalin, в Format(...) добавить символ, например так:
PHP:
Format(str_array, sizeof(str_array), "%s%i) %s%s\n", str_array, j, weaponInHand[client] == j ? "☆ " : "", buffer[7]);
Так будет выводиться звёздочка между номером слота и названием оружия в нём
 
Сверху Снизу