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

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

Статьи или фрагменты кода для новичков и уже опытных скриптеров по 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
Администратор
 
Сообщения: 3747
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2165 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

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

Сообщение DJ_WEST » 18 июл 2012, 21:18

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

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

Сообщение zippel » 07 фев 2013, 14:04

[pawn]
  1. cs_set_user_money(killer, cs_get_user_money(id) + 100, 1)
[/pawn]
хочу сделать бонус за килл, но при убийстве показывает только 300 по дефолту. мой бонус не отображается в худе, однако суммируется.
Аватара пользователя
zippel
 
Сообщения: 178
Зарегистрирован: 03 апр 2011, 20:01
Благодарил (а): 33 раз.
Поблагодарили: 1 раз.
Опыт программирования: Больше трех лет
Языки программирования: Java, C++

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

Сообщение navigator » 06 дек 2016, 11:27

А как называется иконка динамика когда включаешь микрофон, и можно ли отловить событие когда она появляется?
Аватара пользователя
navigator
 
Сообщения: 48
Зарегистрирован: 03 фев 2011, 21:35
Откуда: Уфа.
Благодарил (а): 12 раз.
Поблагодарили: 2 раз.
Опыт программирования: Меньше месяца
Языки программирования: Counter-Strike 1.6

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

Сообщение SISA » 06 дек 2016, 20:05

Она на клиенте рисуется. Отловить со стороны сервера невозможно, без АПИ от VTC.
Аватара пользователя
SISA
 
Сообщения: 252
Зарегистрирован: 28 ноя 2009, 01:46
Благодарил (а): 19 раз.
Поблагодарили: 111 раз.
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Team Fortress II
Left 4 Dead

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

Сообщение navigator » 07 дек 2016, 01:05

SISA писал(а):Она на клиенте рисуется. Отловить со стороны сервера невозможно, без АПИ от VTC.

Да API от VTC немного не подходит для моих целей хотя им пока и пользуюсь, мне нужно по нажатию кнопки разговора в микро или появлению иконки, выводить сообщение даже если игрок не чего в него не сказал, а
Код: Выделить всё
VTC_IsClientSpeaking(clientIndex)
и
VTC_OnClientStartSpeak
(clientIndex

срабатывает когда в микро идет хоть какой-то сигнал, неужели не как нельзя отловить появление иконки?
Аватара пользователя
navigator
 
Сообщения: 48
Зарегистрирован: 03 фев 2011, 21:35
Откуда: Уфа.
Благодарил (а): 12 раз.
Поблагодарили: 2 раз.
Опыт программирования: Меньше месяца
Языки программирования: Counter-Strike 1.6

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

Сообщение Subb98 » 07 дек 2016, 01:09

navigator писал(а):неужели не как нельзя отловить появление иконки?

Хз, хз. Но без бубна и курения ресурсов тут не обойтись..
«Сразу скажу разбираться кто виноват не требуется» © Radius
Аватара пользователя
Subb98
Модератор
 
Сообщения: 4174
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1198 раз.
Поблагодарили: 1990 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn, PHP

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

Сообщение KPOCT » 07 дек 2016, 02:59

navigator писал(а):немного не подходит для моих целей

Извините, а можно поинтересоваться, какие цели Вы преследуете?
Возможно, Вам и не обязательно отлавливать саму иконку.
(2*b) || !(2*b)
Аватара пользователя
KPOCT
 
Сообщения: 65
Зарегистрирован: 21 фев 2016, 23:33
Благодарил (а): 21 раз.
Поблагодарили: 7 раз.
Опыт программирования: Больше трех лет
Языки программирования: C, C++, C#, Pawn, VBS

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

Сообщение navigator » 07 дек 2016, 05:42

KPOCT писал(а):
navigator писал(а):немного не подходит для моих целей

Извините, а можно поинтересоваться, какие цели Вы преследуете?
Возможно, Вам и не обязательно отлавливать саму иконку.

Цель у меня показать сообщение игроку когда пытается говорить в микро, который не набрал нужное количество фрагов чтобы разговаривать в микрофон (дабы избежать флуда от тех кто первый раз зашел на сервер пофлудить в микро), я добился этого путем использования API VTC но при отлове этого игрока путем
Код: Выделить всё
VTC_OnClientStartSpeak(clientIndex)
и выставления ему
Код: Выделить всё
VTC_MuteClient(clientIndex
и показа сообщения он успевает вякнуть хоть и доли секунды, после этого запускается таск через 10 сек. на снятие мута, и все по новой :-)
Аватара пользователя
navigator
 
Сообщения: 48
Зарегистрирован: 03 фев 2011, 21:35
Откуда: Уфа.
Благодарил (а): 12 раз.
Поблагодарили: 2 раз.
Опыт программирования: Меньше месяца
Языки программирования: Counter-Strike 1.6

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

Сообщение KPOCT » 07 дек 2016, 09:48

navigator писал(а):Цель у меня показать сообщение игроку когда пытается говорить в микро, который не набрал нужное количество фрагов чтобы разговаривать в микрофон (дабы избежать флуда от тех кто первый раз зашел на сервер пофлудить в микро)


В "Voice Control By CsStats" это реализовано с применением FM_Voice_SetClientListening:
Код: Выделить всё
/*
    Voice Control By CsStats это:
        + Защита от школоты, которая не умеет играть и заходит лишь чтобы поорать в микро
        + Защита от фейк-ботов, которые заходят на сервер и начинают орать в Voice чат, тем самым залагивая сервер
        + Совместимость с статистикой от Скальпеля
*/

#include <amxmodx>
#include <csstats>


#define ADMIN_NONE -1

#define FRAGS 50         // Cколько минимум фрагов надо для доступа к Voice чату
//#define CS_MYSQL        // CsStats MySQL by Скальпель
#define IMMUNITY ADMIN_NONE    // Флаг иммунитета к функциям плагина. ADMIN_NONE выключает иммунитет
//#define ENGINE        // Если нет плагинов типа voice management рекомендуется раскомментировать

#if defined ENGINE
    #include <engine>
    #define PLUGIN_VERSION "1.3[Engine]"
#else
#include <fakemeta>
    #define PLUGIN_VERSION "1.3[FakeMeta]"
    #define    GetBit(%1,%2)        (%1 & (1 << (%2 & 31)))
    #define    SetBit(%1,%2)        %1 |= (1 << (%2 & 31))
    #define    ResetBit(%1,%2)        %1 &= ~(1 << (%2 & 31))
    new g_bBlockVoice;
#endif

#if defined CS_MYSQL
native csstats_get_user_stats(id, stats[22]);
public plugin_natives() set_native_filter("native_filter");
public native_filter(const name[], index, trap) return !trap ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
#endif

public plugin_init()
{
    register_plugin("VoiceControl by CsStats", PLUGIN_VERSION, "neygomon");
    register_logevent("LeRoundEnd", 2, "1=Round_End");
#if !defined ENGINE    
    register_forward(FM_Voice_SetClientListening, "fwdSetClientListening");
#endif    
}

public client_putinserver(id)
    CheckStatsAndSetVoice(id);

public LeRoundEnd()
    CheckStatsAndSetVoice(0);

CheckStatsAndSetVoice(index)
{
    static players[32], pnum;
    if(index > 0)
    {
        players[0] = index;
        pnum = 1;
    }
    else get_players(players, pnum);
#if defined CS_MYSQL    
    new stats[22];
#else
    new stats[8], bh[8];
#endif
    for(new i; i < pnum; i++)
    {
#if IMMUNITY !=    ADMIN_NONE
        if(get_user_flags(players[i]) & IMMUNITY)
        {
#if defined ENGINE
            set_speak(players[i], SPEAK_NORMAL);
#else        
            ResetBit(g_bBlockVoice, players[i]);
#endif            
            continue;
        }
#endif
#if defined CS_MYSQL    
        csstats_get_user_stats(players[i], stats);
#else        
        get_user_stats(players[i], stats, bh);
#endif        
        if(stats[0] >= FRAGS) 
#if defined ENGINE
            set_speak(players[i], SPEAK_NORMAL);
#else        
            ResetBit(g_bBlockVoice, players[i]);
#endif    
        else
        
{
#if defined ENGINE
            set_speak(players[i], SPEAK_MUTED);
#else        
            SetBit(g_bBlockVoice, players[i]);
#endif        
            ChatColor(players[i], "^3* ^1[^4Voice Control^1] ^4Для доступа к голосовому чату осталось ^3[%d/%d] ^4фрагов.", stats[0], FRAGS);
        }    
    
}
}
#if !defined ENGINE
public fwdSetClientListening(receiver, sender)
{
    if(receiver != sender && GetBit(g_bBlockVoice, sender))
    {
        engfunc(EngFunc_SetClientListening, receiver, sender, false);
        return FMRES_SUPERCEDE;
    }
    return FMRES_IGNORED;
}
#endif
stock ChatColor(const id, const szMessage[], any:...)
{
    static szMsg[190], IdMsg; 
    vformat
(szMsg, charsmax(szMsg), szMessage, 3);
    if(!IdMsg) IdMsg = get_user_msgid("SayText");
    
    if
(!is_user_connected(id)) return 0;
    message_begin(MSG_ONE, IdMsg, .player = id);
    write_byte(id);
    write_string(szMsg);
    message_end();
    return 1;
}

Так почему Вас, говорите, не устраивает этот форвард?
(2*b) || !(2*b)
Аватара пользователя
KPOCT
 
Сообщения: 65
Зарегистрирован: 21 фев 2016, 23:33
Благодарил (а): 21 раз.
Поблагодарили: 7 раз.
Опыт программирования: Больше трех лет
Языки программирования: C, C++, C#, Pawn, VBS

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

Сообщение navigator » 07 дек 2016, 14:42

KPOCT писал(а):В "Voice Control By CsStats" это реализовано с применением FM_Voice_SetClientListening:
Так почему Вас, говорите, не устраивает этот форвард?

В плагине даже и близко нет того что мне нужно, я же написал вывод сообщения когда пытается говорить в микро, а в плагине это сообщение выводится в конце раунда это совсем не то!!!
А форвард не устраивает тем что вызывается 3500 раз в секунду если мне память не изменяет, уж лучше API VTC юзать, что я и сделал, но как я уже писал выше это тоже немного не то.
Можешь зайти и все поймешь
81.30.223.250:27027

Не забудь нажать на микрофон и что нибудь сказать пока не набрал 5 фрагов
Аватара пользователя
navigator
 
Сообщения: 48
Зарегистрирован: 03 фев 2011, 21:35
Откуда: Уфа.
Благодарил (а): 12 раз.
Поблагодарили: 2 раз.
Опыт программирования: Меньше месяца
Языки программирования: Counter-Strike 1.6

Пред.

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

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

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