Русское сообщество по скриптингу

Иконка статуса

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

Иконка статуса

Сообщение DJ_WEST » 02 окт 2009, 08:35

Автор: SAMURAI16
Перевод и редактирование: DJ_WEST

Иконка статуса - это HUD иконка, которая располагается на экране игрока и используется в определенных случаях для определения статуса игрока. В данной статье мы рассмотрим способ создания такой иконки. За данную иконку отвечает сообщение с названием StatusIcon.
Структура данного сообщения:
Status byte Статус сообщения
SpriteName string Название спрайта
ColorR byte Цвет R (красный)
ColorG byte Цвет G (зеленый)
ColorB byte Цвет B (синий)

Статус сообщения может быть следующим:
  • 0 - спрятать иконку
  • 1 - показать иконку
  • 2 - обновить иконку
Если статус равен 0, то посылать цвет не нужно.

Итак, начнем:
1. Прежде всего нам необходимо создать глобальную переменную для хранения ID сообщения, которое отвечает за такого рода иконку:
Код: Выделить всё

new g_IconStatus 

2. В plugin_init мы получаем ID сообщения и сохраняем его в переменную g_IconStatus :
Код: Выделить всё

g_IconStatus  
= get_user_msgid("StatusIcon")
 

3. Для того чтобы отобразить иконку статуса, нам необходимо создать сообщение следующим образом:
Код: Выделить всё

message_begin
(MSG_ONE_UNRELIABLE, g_IconStatus, {0,0,0}, id) 
 

4. Дальше нам необходимо передать байт, отвечающий за статус сообщения:
Код: Выделить всё

write_byte
(1)
 

1 - означает показ иконки.
5. Затем необходимо передать название спрайта:
Код: Выделить всё

write_string
("имя спрайта")
 

6. Теперь нам нужно передать цвет иконки:
Код: Выделить всё

write_byte
(r)
write_byte(g)
write_byte(b) 
 

7. Завершаем сообщение следующим образом:
Код: Выделить всё

message_end
() 
 


Примерный плагин:
Код: Выделить всё
#include <amxmodx>
#include <fakemeta>

new g_IconStatus

public plugin_init
() 
{
    register_plugin("Status Icon", "0.1", "SAMURAI")
    
    register_forward
(FM_PlayerPreThink, "Pre_Think")
    
    g_IconStatus 
= get_user_msgid("StatusIcon")   
}

public Pre_Think(id)
{
    if (!(pev(id,pev_button) & FL_ONGROUND))
    {    
        message_begin
(MSG_ONE_UNRELIABLE, g_IconStatus, {0,0,0}, id)
        write_byte(1)
        write_string("dmg_poison")
        write_byte(0)
        write_byte(255)
        write_byte(0)
        message_end()
    }   
}  


[align=center]
item_longjump.jpg
item_battery.jpg
dmg_shock.jpg
dmg_rad.jpg
dmg_heat.jpg
dmg_gas.jpg
dmg_drown.jpg
dmg_cold.jpg
dmg_bio.jpg
[/align]


Список названий спрайтов, которые могут быть использованы:
Код: Выделить всё

selection           
bucket1               
bucket2               
bucket3               
bucket4               
bucket5               
bucket0               
dmg_bio               
dmg_poison           
dmg_chem           
dmg_cold       
dmg_drown           
dmg_heat           
dmg_gas               
dmg_rad               
dmg_shock           
number_0           
number_1           
number_2         
number_3           
number_4           
number_5           
number_6           
number_7           
number_8           
number_9           
divider               
cross               
dollar               
minus               
plus               
c4               
defuser             
stopwatch           
smallskull             
smallc4             
smallvip               
buyzone               
rescue               
escape           
vipsafety           
suit_full           
suit_empty           
suithelmet_full           
suithelmet_empty     
flash_full           
flash_empty           
flash_beam           
train_back         
train_stop           
train_forward1           
train_forward2           
train_forward3         
autoaim_c           
title_half           
title_life           
d_knife                   
d_ak47                 
d_awp                     
d_deagle           
d_flashbang           
d_fiveseven           
d_g3sg1               
d_glock18           
d_grenade           
d_m249               
d_m3               
d_m4a1               
d_mp5navy           
d_p228               
d_p90               
d_scout               
d_sg550               
d_sg552               
d_ump45         
d_usp               
d_tmp               
d_xm1014           
d_skull               
d_tracktrain           
d_aug                   
d_mac10               
d_elite               
d_headshot               
item_battery           
item_healthkit           
item_longjump           
radar
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3649
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2174 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Иконка статуса

Сообщение Lt.RAT » 02 окт 2009, 11:12

Неуж-то надо еще цвет (RGB) посылать, если я хочу спрятать иконку (status == 0)?
Показывание иконки "defuser" в КСе реализовано через "StatusIcon" или "ItemStatus"?
Аватара пользователя
Lt.RAT
 
Сообщения: 301
Зарегистрирован: 30 сен 2009, 01:44
Благодарил (а): 4 раз.
Поблагодарили: 150 раз.
Языки программирования: Counter-Strike 1.6

Re: Иконка статуса

Сообщение DJ_WEST » 02 окт 2009, 11:32

Неуж-то надо еще цвет (RGB) посылать, если я хочу спрятать иконку (status == 0)?

Нет, цвет только если статус не 0. Подправил.
Показывание иконки "defuser" в КСе реализовано через "StatusIcon" или "ItemStatus"?

Через ItemStatus.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3649
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2174 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Иконка статуса

Сообщение KORD_12.7 » 02 окт 2009, 12:09

А как в Half-Life 1 иконку вывести?
Описанный здесь способ не подходит =(

Код: Выделить всё
L 10/02/2009 - 19:07:51: Info (map "crossfire") (file "addons/amxmodx/logs/error_20091002.log")
L 10/02/2009 - 19:07:51: Plugin called message_begin with an invalid message id (0).
L 10/02/2009 - 19:07:51: [AMXX] Displaying debug trace (plugin "Untitled.amxx")
L 10/02/2009 - 19:07:51: [AMXX] Run time error 10: native error (native "message_begin")
L 10/02/2009 - 19:07:51: [AMXX]    [0] Untitled.sma::Pre_Think (line 19)

_http://aghl.ru/ - Half-Life и Adrenaline Gamer: за пределами возможного
Аватара пользователя
KORD_12.7
Скриптер
 
Сообщения: 298
Зарегистрирован: 28 сен 2009, 10:14
Откуда: Владивосток
Благодарил (а): 141 раз.
Поблагодарили: 251 раз.
Опыт программирования: Больше трех лет
Языки программирования: Half-Life
Opposing Force
Adrenaline Gamer
Counter-Strike

Re: Иконка статуса

Сообщение Lt.RAT » 02 окт 2009, 12:23

DJ_WEST писал(а):Через ItemStatus.

Получается это тоже своеобразная "Иконка статуса", может стоит добавить?
Хотя не надо, данного обсуждения будет достаточно тем кто это будет использовать :)


KORD_12.7 писал(а):А как в Half-Life 1 иконку вывести?
Описанный здесь способ не подходит =(

Совершенно верно, сообщения StatusIcon, не существует в ХЛ...

Пожалуй приведу список сообщений, который там присутствуют: все svc_* сообщения и
Код: Выделить всё

 StatusValue
 StatusText
 TeamNames
 AmmoX
 ScreenFade
 ScreenShake
 ShowMenu
 SetFOV
 HideWeapon
 ItemPickup
 WeapPickup
 AmmoPickup
 ServerName
 MOTD
 GameMode
 TeamScore
 TeamInfo
 ScoreInfo
 DeathMsg
 GameTitle
 InitHUD
 ResetHUD
 WeaponList
 TextMsg
 SayText
 HudText
 HudTextPro
 Train
 Battery
 Damage
 Health
 FlashBat
 Flashlight
 Geiger
 CurWeapon
 SelAmmo
 ReqState
 VoiceMask

Как видно из списка, сообщений при помощи которых можно выводить такие иконки не предусмотренно...
Аватара пользователя
Lt.RAT
 
Сообщения: 301
Зарегистрирован: 30 сен 2009, 01:44
Благодарил (а): 4 раз.
Поблагодарили: 150 раз.
Языки программирования: Counter-Strike 1.6

Re: Иконка статуса

Сообщение KORD_12.7 » 02 окт 2009, 13:10

Ну так в игре при ударе током появляется спрайт dmg_shock, при воздействи радиации dmg_rad, ну и т.д.

_http://aghl.ru/ - Half-Life и Adrenaline Gamer: за пределами возможного
Аватара пользователя
KORD_12.7
Скриптер
 
Сообщения: 298
Зарегистрирован: 28 сен 2009, 10:14
Откуда: Владивосток
Благодарил (а): 141 раз.
Поблагодарили: 251 раз.
Опыт программирования: Больше трех лет
Языки программирования: Half-Life
Opposing Force
Adrenaline Gamer
Counter-Strike

Re: Иконка статуса

Сообщение Lt.RAT » 02 окт 2009, 13:41

KORD_12.7 писал(а):Ну так в игре при ударе током появляется спрайт dmg_shock, при воздействи радиации dmg_rad, ну и т.д.

Не знаю, возможно отрисовка происходит по приходу svc_damage или "Damage" пакета...
Аватара пользователя
Lt.RAT
 
Сообщения: 301
Зарегистрирован: 30 сен 2009, 01:44
Благодарил (а): 4 раз.
Поблагодарили: 150 раз.
Языки программирования: Counter-Strike 1.6

Re: Иконка статуса

Сообщение DJ_WEST » 02 окт 2009, 17:29

А как в Half-Life 1 иконку вывести?

В HL1 нет StatusIcon.
Получается это тоже своеобразная "Иконка статуса", может стоит добавить?

Там совсем другая структура, у IteamStatus:
ItemsBitSum byte Бит

Код: Выделить всё

1   (1<<0)  -  nightvision
2   (1<<1)  -  defusal kit

То есть по сравнению с StatusIcon возможностей меньше.
Ну так в игре при ударе током появляется спрайт dmg_shock, при воздействи радиации dmg_rad, ну и т.д.

Как видишь тут иконка cниpу, у StatusIcon расположение иконки в CS 1.6 на уровне иконки покупки. Эту иконку рисует Damage сообщение, как и предположил Lt.RAT. Вот для теста:
Код: Выделить всё

    message_begin
(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), {0,0,0}, id)
    write_byte(0)
    write_byte(1) // кол-во HP, которое снимает
    write_long(262144) // тип урона, в данном случае радиация
    write_coord(0)
    write_coord(0)
    write_coord(0)
    message_end()
 
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3649
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2174 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Иконка статуса

Сообщение KORD_12.7 » 03 окт 2009, 05:04

Вот для теста:

Спасибо, работает.
А где узнать остальные типы урона для write_long() ?

_http://aghl.ru/ - Half-Life и Adrenaline Gamer: за пределами возможного
Аватара пользователя
KORD_12.7
Скриптер
 
Сообщения: 298
Зарегистрирован: 28 сен 2009, 10:14
Откуда: Владивосток
Благодарил (а): 141 раз.
Поблагодарили: 251 раз.
Опыт программирования: Больше трех лет
Языки программирования: Half-Life
Opposing Force
Adrenaline Gamer
Counter-Strike

Re: Иконка статуса

Сообщение PomanoB » 03 окт 2009, 11:13

Код: Выделить всё

// Instant damage values for use with gmsgDamage 3rd value write_long(BIT)
#define DMG_GENERIC                     0           // Generic damage was done
#define DMG_CRUSH                       (1<<0)      // Crushed by falling or moving object
#define DMG_BULLET                      (1<<1)      // Shot
#define DMG_SLASH                       (1<<2)      // Cut, clawed, stabbed
#define DMG_BURN                        (1<<3)      // Heat burned
#define DMG_FREEZE                      (1<<4)      // Frozen
#define DMG_FALL                        (1<<5)      // Fell too far
#define DMG_BLAST                       (1<<6)      // Explosive blast damage
#define DMG_CLUB                        (1<<7)      // Crowbar, punch, headbutt
#define DMG_SHOCK                       (1<<8)      // Electric shock
#define DMG_SONIC                       (1<<9)      // Sound pulse shockwave
#define DMG_ENERGYBEAM                  (1<<10)     // Laser or other high energy beam
#define DMG_NEVERGIB                    (1<<12)     // With this bit OR'd in, no damage type will be able to gib victims upon death
#define DMG_ALWAYSGIB                   (1<<13)     // With this bit OR'd in, any damage type can be made to gib victims upon death.
#define DMG_DROWN                       (1<<14)     // Drowning
#define DMG_PARALYZE                    (1<<15)     // Slows affected creature down
#define DMG_NERVEGAS                    (1<<16)     // Nerve toxins, very bad
#define DMG_POISON                      (1<<17)     // Blood poisioning
#define DMG_RADIATION                   (1<<18)     // Radiation exposure
#define DMG_DROWNRECOVER                (1<<19)     // Drowning recovery
#define DMG_ACID                        (1<<20)     // Toxic chemicals or acid burns
#define DMG_SLOWBURN                    (1<<21)     // In an oven
#define DMG_SLOWFREEZE                  (1<<22)     // In a subzero freezer
#define DMG_MORTAR                      (1<<23)     // Hit by air raid (done to distinguish grenade from mortar)
#define DMG_TIMEBASED                   (~(0x3fff)) // Mask for time-based damage
Аватара пользователя
PomanoB
 
Сообщения: 21
Зарегистрирован: 30 авг 2009, 19:41
Благодарил (а): 5 раз.
Поблагодарили: 12 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

След.

Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2