Убрать свечение игрока при использовании фонарика

hANSON

Пользователь
Регистрация
22 Июн 2017
Сообщения
5
Симпатии
3
Пол
Мужской
Всем привет!
Озадачился убрать свечение вокруг игрока при использовании фонарика (impulse 100).Причина думаю всем известна - на маломощных видеокартах начинаются лаги.
Попробовал вывод мессаги TE_DLIGHT через client_PreThink, но стало жалко процессор. Подскажите, есть ли альтернативные варианты убрать свечение вокруг игрока при использовании фонарика?
Код:
/* **************************** CUSTOMIZATION AREA ******************************** */

new const SOUND_FLASHLIGHT_ON[] = "items/flashlight1.wav"
new const SOUND_FLASHLIGHT_OFF[] = "items/flashlight1.wav"

/* ******************************************************************************** */

#define MAX_PLAYERS   32


new g_iMaxPlayers

new bool:g_bFlashLight[MAX_PLAYERS+1]

new g_msgidFlashlight

new g_iShowAll = 0
new g_iRadius = 4
new g_iDistanceMax = 2000

public plugin_precache()
{
    precache_sound(SOUND_FLASHLIGHT_ON)
    precache_sound(SOUND_FLASHLIGHT_OFF)
}

public plugin_init()
{
    register_plugin( PLUGIN, VERSION, AUTHOR )
    
    
    register_impulse(100, "Impulse_100")
    g_msgidFlashlight = get_user_msgid("Flashlight")
    
    register_event("HLTV", "Event_HLTV_newround", "a", "1=0", "2=0")
    register_event("DeathMsg", "Event_DeathMsg", "a")
    
}

public client_putinserver(id)
{
    reset(id)
}

public Event_HLTV_newround()
{
    for(new id=1; id<=g_iMaxPlayers; id++)
    {
        reset(id)
    }
}

public Event_DeathMsg()
{
    reset(read_data(2))
}

reset(id)
{
    if( 1 <= id <= g_iMaxPlayers )
    {
        g_bFlashLight[id] = false
    }
}

public Impulse_100( id )
{

    if(is_user_alive(id))
    {
        if( g_bFlashLight[id] ) FlashlightTurnOff(id)
        else FlashlightTurnOn(id)
    }
    
    return PLUGIN_CONTINUE
}

public client_PreThink(id)
{
    if(g_bFlashLight[id])
    {
        Make_FlashLight(id)
    }
}

Make_FlashLight(id)
{
    static iOrigin[3], iAim[3], iDist
    get_user_origin(id, iOrigin, 1)
    get_user_origin(id, iAim, 3)
    
    iDist = get_distance(iOrigin, iAim)
    
    if( iDist > g_iDistanceMax )
    return
    
    static iDecay, iAttn
    
    iDecay = iDist * 255 / g_iDistanceMax
    iAttn =256 + iDecay * 5 // barney/dontaskme
    
    if( g_iShowAll )
    {
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    }
    else
    {
        message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, id)
    }
    write_byte( TE_DLIGHT )
    write_coord( iAim[0] )
    write_coord( iAim[1] )
    write_coord( iAim[2] )
    write_byte( g_iRadius )
    write_byte( 255  )
    write_byte( 255  )
    write_byte( 255  )
    write_byte( 1 )
    write_byte( iDecay )
    message_end()
}

FlashlightTurnOff(id)
{
    emit_sound(id, CHAN_WEAPON, SOUND_FLASHLIGHT_OFF, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    
    g_bFlashLight[id] = false
    
    FlashlightHudDraw(id, 0)
    
}

FlashlightTurnOn(id)
{
    emit_sound(id, CHAN_WEAPON, SOUND_FLASHLIGHT_ON, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)   
    g_bFlashLight[id] = true   
    FlashlightHudDraw(id, 1)   
}

FlashlightHudDraw(id, iFlag)
{
        if( g_iShowAll )
        {
                emessage_begin(MSG_ONE_UNRELIABLE, g_msgidFlashlight, _, id)
                ewrite_byte(iFlag)
                ewrite_byte(100)
                emessage_end()
            }
        else
        {
                message_begin(MSG_ONE_UNRELIABLE, g_msgidFlashlight, _, id)
                write_byte(iFlag)
                write_byte(100)
                message_end()
            }
}
 

To be or not to be

Пользователь
Регистрация
9 Июн 2017
Сообщения
1.215
Симпатии
304
hANSON, зарегай переменную, хукай импульс 100, выставляй значение true/false, и сразу проверку на значение.
 

hANSON

Пользователь
Регистрация
22 Июн 2017
Сообщения
5
Симпатии
3
Пол
Мужской
hANSON, зарегай переменную, хукай импульс 100, выставляй значение true/false, и сразу проверку на значение.
Не совсем понял мысль. Сейчас так и реализовано (см исходник). Мне нужно добиться не просто блокировки impulse 100, а ансетить свечение вокруг игрока (чтобы другие игроки не видели подсветку вокруг игрока когда у него включен фонарь), но при этом чтобы у игрока вызывался TE_DLIGHT в месте, куда он смотрит.
 
Сверху Снизу