[StatusIcon] Отображение в начале раунда

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
775
Реакции
293
Помог
11 раз(а)
Есть код:

Код:
stock SendStatusIcon(id)
{
    RemoveStatusIcon(id);
    
    message_begin(MSG_ALL , g_iMsgIdStatusIcon, .player = id)
    write_byte(STATUSICON_SHOW) // status: 0 - off, 1 - on, 2 - flash
    write_string("d_headshot") // sprite name in hud.txt
    write_byte(iColor_R)
    write_byte(iColor_G)
    write_byte(iColor_B)
    message_end()
}
,
который отображает иконку tna16Ld.png

Отображаем:

Код:
public CBasePlayer_Spawn_Post(const id)
{
    if( !is_user_alive(id) )
        return
    
    
    SendStatusIcon(id);
}
Удаляем:

Код:
public CBasePlayer_Killed_Post(pVictim, pAttacker, pGib)
{
    if(!is_user_connected(pVictim) || !is_user_connected(pAttacker))
        return;
    
    RemoveStatusIcon(pVictim);
}

public RoundEnd_Post(WinStatus:status, ScenarioEventEndRound:event, Float:tmDelay)
{
    for (new id = 1; id <= MaxClients; id++)
        RemoveStatusIcon(id);
}

stock RemoveStatusIcon(id) 
{
    message_begin(MSG_ONE,g_iMsgIdStatusIcon,{0,0,0},id)
    write_byte(STATUSICON_HIDE)
    write_string("d_headshot")
    message_end()
}
Проблема заключается в том, что если я не умру, у меня удалится иконка и в новом раунде больше не отобразится.
Бывают моменты, что проскакивает отображение, но тут же удаляется.

Не могу понять причину. Сразу скажу, что удаление я воткнул, после того как перестало отображать.
Но опять же, отображает в случае если я умру. (так было и до удаления)
23 Июл 2022
изначально в message_begin(MSG_ALL , g_iMsgIdStatusIcon, .player = id)

MSG_ONE_UNRELIABLE , я думал дело в нем из-за того что Сообщение одному игроку, без гарантии доставки
заменил на MSG_ONE - Сообщение одному игроку с гарантией доставки (результат не изменился)
и остановился пока на MSG_ALL - Сообщение с гарантией доставки всем игрокам
 
Сообщения
855
Реакции
532
Помог
13 раз(а)
Отправляй с задержкой
Скорее всего тебе ResetHud чистит экран
 
Сообщения
775
Реакции
293
Помог
11 раз(а)
BalbuR, это по этому
Код:
#include <amxmodx>

#define PLUGIN "Weapon Icon"
#define VERSION "1.2"
#define AUTHOR "hoboman313/Zenix"

#define MAX_PLAYERS 32

new iconstatus, pcv_iloc
new user_icons[MAX_PLAYERS+1][16]

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    register_event("CurWeapon", "update_icon", "be", "1=1")
    register_event("AmmoX", "draw_icon", "be")
    register_event("DeathMsg", "event_death", "a")
    
    pcv_iloc = register_cvar("amx_weapon_location", "1")
    
    check_icon_loc()
}

public update_icon(id)
{
    remove_weapon_icon(id)   
    check_icon_loc()
        
    if( get_pcvar_num(pcv_iloc) == 0 || is_user_bot(id) )
        return
        
    static sprite[16], iwpn, clip, ammo
    iwpn = get_user_weapon(id, clip, ammo)
    
    switch(iwpn)
    {
        case CSW_P228:             sprite = "d_p228"
        case CSW_SCOUT:         sprite = "d_scout"
        case CSW_HEGRENADE:     sprite = "d_grenade"
        case CSW_XM1014:        sprite = "d_xm1014"
        case CSW_MAC10:         sprite = "d_mac10"
        case CSW_AUG:             sprite = "d_aug"
        case CSW_SMOKEGRENADE:     sprite = "d_grenade"
        case CSW_ELITE:         sprite = "d_elite"
        case CSW_FIVESEVEN:     sprite = "d_fiveseven"
        case CSW_UMP45:         sprite = "d_ump45"
        case CSW_SG550:         sprite = "d_sg550"
        case CSW_GALIL:         sprite = "d_galil"
        case CSW_FAMAS:         sprite = "d_famas"
        case CSW_USP:             sprite = "d_usp"
        case CSW_MP5NAVY:         sprite = "d_mp5navy"
        case CSW_M249:             sprite = "d_m249"
        case CSW_M3:             sprite = "d_m3"
        case CSW_M4A1:             sprite = "d_m4a1"
        case CSW_TMP:             sprite = "d_tmp"
        case CSW_G3SG1:         sprite = "d_g3sg1"
        case CSW_FLASHBANG:        sprite = "d_grenade"
        case CSW_DEAGLE:         sprite = "d_deagle"
        case CSW_SG552:         sprite = "d_sg552"
        case CSW_AK47:             sprite = "d_ak47"
        case CSW_KNIFE:         sprite = "d_knife"
        case CSW_P90:             sprite = "d_p90"
        case CSW_GLOCK18:         sprite = "d_glock18"
        case CSW_AWP:             sprite = "d_awp"
        default:                 return
    }   
    user_icons[id] = sprite   
    draw_icon(id)
    
    return
}

public draw_icon(id)
{
    static iwpn, clip, ammo, icon_color[3]
    iwpn = get_user_weapon(id, clip, ammo)
    
    // ammo check, this is for the color of the icon
    if ((ammo == 0 && clip == 0))
        icon_color = {255, 0, 0} // outta ammo!
    else if ( ammo==0 && iwpn!=CSW_KNIFE)
        icon_color = {255, 160, 0} // last clip!
    else
        icon_color = {0, 160, 0}//green icon...decent ammo
      
    // draw the sprite itself
    message_begin(MSG_ONE,iconstatus,{0,0,0},id)
    write_byte(1) // status (0=hide, 1=show, 2=flash)
    write_string(user_icons[id]) // sprite name
    write_byte(icon_color[0]) // red
    write_byte(icon_color[1]) // green
    write_byte(icon_color[2]) // blue
    message_end()
}

public remove_weapon_icon(id)
{
    message_begin(MSG_ONE,iconstatus,{0,0,0},id)
    write_byte(0)
    write_string(user_icons[id])
    message_end()
}

public event_death()
{
    new id = read_data(2) // the dead player's ID (1-32)
    
    if (!is_user_bot(id))
        remove_weapon_icon(id)
}

public check_icon_loc()
{
    new value = get_pcvar_num(pcv_iloc)
    
    if (value == 1)
        iconstatus = get_user_msgid("StatusIcon")
    else if (value == 2)
        iconstatus = get_user_msgid("Scenario")
    else
        iconstatus = 0
    
    return PLUGIN_CONTINUE
}
тут не обнуляется
 
Сообщения
1,304
Реакции
2,303
Помог
57 раз(а)
Вообще в спавне её не совсем корректно сетать. Нужен как раз ResetHUD + задержка 0.1 (мб и нет, я не помню).
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
После спавна чистится. Хватает простого костыля с посылом спрайта через 0.1 сек
Код:
#include <amxmodx>
#include <reapi>

const TASK_INDEX = 0xA6123;
new const SPRITE_MSG_NAME[] = "d_headshot"; // Спрайт
new g_iMsgStatusIcon;

enum any:
{
    STATUS_HIDE, // 0
    STATUS_SHOW, // 1
    STATUS_FLASH, // 2
}

public plugin_init()
{
    RegisterHookChain(RG_CBasePlayer_OnSpawnEquip, "@CBasePlayer_OnSpawnEquip_Post", true);
    RegisterHookChain(RG_CBasePlayer_Killed, "@CBasePlayer_Killed_Post", true);
    RegisterHookChain(RG_RoundEnd, "@RoundEnd_Post");
}

@CBasePlayer_OnSpawnEquip_Post(pPlayer)
{
    set_task(0.1, "@task_send_msg_status_icon", TASK_INDEX + pPlayer);
}

@task_send_msg_status_icon(pPlayer)
{
    pPlayer -= TASK_INDEX;

    if(!is_user_alive(pPlayer))
        return;

    set_msg_status_icon(pPlayer, STATUS_SHOW, SPRITE_MSG_NAME, 0, 255, 0);
}

@CBasePlayer_Killed_Post(pVictim, any:...)
{
    set_msg_status_icon(pVictim, STATUS_HIDE, SPRITE_MSG_NAME);
}

@RoundEnd_Post()
{
    new pPlayers[MAX_PLAYERS], iCount;
    get_players(pPlayers, iCount, "ch");

    for(new i; i < iCount; i++)
        set_msg_status_icon(pPlayers[i], STATUS_HIDE, SPRITE_MSG_NAME);
}

stock set_msg_status_icon(pPlayer, iStatus, const sSprite[], iRed = 0, iGreen = 0, iBlue = 0)
{
    message_begin(MSG_ONE, g_iMsgStatusIcon, .player = pPlayer);
    write_byte(iStatus);
    write_string(sSprite);

    if(iStatus != STATUS_HIDE)
    {
        write_byte(iRed);
        write_byte(iGreen);
        write_byte(iBlue);
    }

    message_end();
}
Мб, нужно и после ResetHud. Я ограничивался таким костылём. Проблем не было.
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу