[CSGO only] Текст в HUD

diller110

Добрая душа
Сообщения
353
Реакции
278
По просьбе: Есть ли замена HudMsg?
Вступление:
В Source движке есть несколько способов вывода информации на экран, но один из способов CCSUsrMsg_HudMsg, случайно или намеренно сломан в CSGO.
На место данного способа пришел более технологичный вывод важной информации, однако рассчитан он больше на локальное использование, что все равно почти не мешает использовать на серверах.

Сразу примеры:
Внимание трафик, будет много гифок с примерами
Default.gif
HLmod-Red.gif
HLmod-Black-Icon-Static.gif
Оффтоп

Реализация:
Вы можете скачать только include с функцией, или архив с плагином-примером. (только команда с чтением 11 аргументов, и всё.)
Итак 1 единственная функция для вывода:
C-подобный:
PrintHudText(char[] channel, int fromclient, int toclient, char[] message,
                        int timeout, int icon_type, char[] color, float offset,
                        float range, int flags, char[] bind, bool offscreen, bool force);
11 аргументов, 9 из которых можно опустить, не пугайтесь, функция может выглядеть и так:
C-подобный:
PrintHudText(_, 0, 0, "Добро пожаловать"); // Выведет всем живым игрокам "Добро пожаловать" по центру
char[] channel = HUDChannel_Plugin1
Channels-test.gif

Канал для вывода - уникальная строка, позволяющая группировать подобные сообщения, чтобы при появлении подобного сообщения оно заменяло существующее.
Рекомендую для каждого плагина использовать уникальные значения вроде: "hudtest-type1", "hudtest-type2".
Если все каналы(строчки) разные, то сообщения не будут заменяться, вместо этого они будут добавляться вниз, и тут важно не переборщить, сообщения центрируются в уходят вниз
Channels-max.gif

ВАЖНО: Каналы не привязаны к одной функции или вашему плагину, они существуют во всей игре. Очень важно, если вы выводите похожую, но разную информацию для множества игроков, выделять для каждого каналы, иначе сообщение покажется только у того, у кого оно отобразится последним.
Например: "pluginname-type01-userid", конечно желательно покороче: "pn-t1-01", "pn-t1-02"...
int fromclient = 0, int toclient = 0
Отправитель сообщения и получатель, 0 - сервер, 1+ - любая сущность.
Вот небольшая шпаргалка по выбору этих аргументов:
  • Над клиентом для всех: from = client, to = client, range = 0.0 (см. ниже)
  • Только клиенту в центре: from = client, to = client, range = 0.01
  • Всем: from = 0, to = 0, range = 0.0
Самое простое! Строка с выводимым текстом. Шрифт как видно из скриншотов крупный, поэтому ограничивайтесь 50-70 символами, делите сообщение на строки (см. channel).
Если строка не указана напишет "No caption specified", поэтому лучше указать пробел.
Тоже просто, время отображения, после окончания сообщение исчезнет, канал освободится. Если указать 0 с тем же каналом, можно стереть существующее сообщение.
963dd792051b764fed69f1dc483382e6.gif
Если указать одно из действительных значение слева от текста отобразится иконка, иначе просто останется промежуток перед сообщением. В ресурсах игры заложено около 20 иконок, почему-то доступно лишь несколько:
C-подобный:
    HUDIcon_None = 1,
    HUDIcon_BlackTip = 2,
    HUDIcon_WhiteTip = 3,
    HUDIcon_Arm = 8,
    HUDIcon_Door = 9,
    HUDIcon_Fire = 15,
    HUDIcon_Bind = 17
2
icon-2.gif

3
icon-3.gif

8
icon-8.gif

9
99e30f81b4384d0da1508a6be799bf4e.gif

15
6d51e42a49c843feda3bd9d83d15ac3c.gif

17 тип иконок особый. Используя данные из аргумента bind, отображаются иконки соответствующих кнопок, например +use обычно клавиша E, +jump пробел...
Совершенно случайно открыл, что если указывать последовательности биндов через ; то и иконки последовательно будут отображаться, дефолтное значение например отображает последовательность клавиш A-I-R
char[] color = "255,255,255"
RGB цвет, прозрачность не поддерживает, только red, green, blue.
Только через запятую, 3 числа от 0 до 255, если не подходит по формату, выведет белый.
C-подобный:
#define HUDColor_White "255,255,255"
#define HUDColor_Black "0,0,0"
#define HUDColor_Red "255,0,0"
#define HUDColor_Green "0,255,0"
#define HUDColor_Blue "0,0,255"
#define HUDColor_Gray "128,128,128"
#define HUDColor_Aircraft "33,156,197"
#define HUDColor_Yellow "221,221,0"
#define HUDColor_DarkRed "187,0,0"
#define HUDColor_DarkGreen "0,128,0"
#define HUDColor_DarkBlue "0,128,255"
#define HUDColor_Purple "127,3,193"
#define HUDColor_Orange "255,27,20"
66e4d48768556c153743e0e53964ec57.gif
bd5a326fc446b47617fc215b2fe603e6.gif
108b8a15e9fbe6e0a815dbd22b8ced33.gif
1a690bfee73e9a1a89431eff5c19ef79.gif
C-подобный:
enum // HUD Effects
{
    HUDEffect_Static = 0,    HUDEffect_Usual = 1,
    HUDEffect_Faster = 2,    HUDEffect_Slower = 3,
    HUDEffect_Fastest = 4,    HUDEffect_Blink = 8,
    HUDEffect_TurboBlink = 16,    HUDEffect_AnotherBlink = 32,
    HUDEffect_Shake = 64,    HUDEffect_TurboShake = 128
};
Флаги, заложенные в игру эффекты, их можно совмещать.
Например статичное мерцание будет 0+16=16
Или хардтряска 128+4=132
Оффтоп
39d5425e54a4910c7a687b64fdcf997e.gif
982637bc837abd7e17edf9d89c635d65.gif
efb0782e1e474b53b39db9c7f6282a8e.gif
34f92dd727f86c89c83b481a7fbf7cd6.gif
ec1fe194e2a780877f1b084cd7704d7f.gif
7c0e0f9779df59f09cc9a847b5e6a9b3.gif
char[] bind = "+moveleft;show_loadout_toggle;+reload;"
(см. icon_type)


Ограничения:
  • Не отображается мертвым или спектаторам
  • Не отображается если игрок находится в полёте или прыжке (не на земле)
  • Не отображается если у игрока в настройках отключены сообщения инструктора, или квар gameinstructor_enable 0, можно отловить значение и предупредить игрока.
Более технично и на английском, а также единственные источники данных по теме здесь и здесь.
 

Вложения

  • Hudtext.rar
    7.3 КБ · Просмотры: 101
  • hudtext.inc
    4.2 КБ · Просмотры: 63
Последнее редактирование:

Морковка

Котлетка ^^
Сообщения
878
Реакции
472
было бы круто если бы переложили готовое решение с событиями, ибо не разберется обычный простолюдин с бесовскими, вашими, языками
 

wayLANder

Где AlmazON?
Сообщения
1,742
Реакции
577
@hearest, там и так есть примеры, и спойлеры, что за что отвечает
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
А вальвы пишут, что доступно в Left 4 Dead 2, Portal 2 и Counter-Strike: Global Offensive
Правда для Portal 2 доступно только 1 сообщение одновременно, а в L4D2 доступно только для одного игрока (т.е. для каждого нужно создавать отдельно, а не одно на всех).
 
Последнее редактирование:

diller110

Добрая душа
Сообщения
353
Реакции
278
Пример использования, с двумя типами вывода:
При смерти любого игрока всем отображается сообщение: "-1 террорист", "-1 спецназ".
При вводе команды sm_hintdeath, вкл/выкл сообщение о смерти, при этом вам тоже приходит уведомление через HUD.

Для компиляции, разумеется, нужна библиотека из топ поста.
Оффтоп
 

Вложения

  • hint_death.sp
    3.1 КБ · Просмотры: 40
  • hint_death.smx
    5.7 КБ · Просмотры: 9

Webman

Nevermind
Сообщения
803
Реакции
330
HudMsg намеренно сломано. В CS:S не было HudMsg до 80 версии. Потом только додумались добавить включить его.
Оно есть везде, даже в 34:

9e5f86601533.jpg

Разработчики кс вообще крайне недоброжелательно относятся к серверным разработчикам. Никаких интересных плюшек (тот же hudmsg, который очень многим бы пригодился) не могут добавить. Нет, они только умеют урезать возможности серверной разработки (скины, например).
 
Сверху Снизу