Спрайт дыма по флагу доступа

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
143
Реакции
68
Помог
1 раз(а)
Дорогие знатоки.
Может кто нибудь сможет помочь.
Хочу убрать спрайт дыма для ВИП игроков.
То есть чтобы для обыкновенных игроков дым работал, а для ВИП дым блокировался.
Вот что пытался сделать, как бы работает, но так не правильно.

Код:
#include <amxmodx>
#include <engine>
#include <fakemeta>

new g_Enebled;
new g_smoke;
new g_CreateSmoke;

public plugin_init()
{
    register_plugin("Blocked Smoke", "1.0", "X-Team");
    unregister_forward(FM_PrecacheEvent, g_smoke, 1);
    register_forward(FM_PlaybackEvent, "FwdPlaybackEvent");
}

public plugin_precache( )
{
    g_smoke = register_forward(FM_PrecacheEvent, "FwdPrecacheEvent", 1);
}

public client_putinserver(id)
{   
    if(get_user_flags(id) & ADMIN_LEVEL_H){
        g_Enebled = 1;
    }else{
    g_Enebled = 0;
    }
}

public FwdPlaybackEvent( iFlags , iEntity , iEventindex, Float:fDelay, Float:vOrigin[3], Float:vAngles[3], Float:fParam1, Float:fParam2, iParam1, iParam2, iBparam1, iBparam2 )
{
    if(iEventindex != g_CreateSmoke || !g_Enebled)
        return FMRES_IGNORED;

    return FMRES_SUPERCEDE;
}

public FwdPrecacheEvent(type, const name[])
{
    if (equal("events/createsmoke.sc", name))
    {
        g_CreateSmoke = get_orig_retval();
        return FMRES_HANDLED;
    }

    return FMRES_IGNORED;
}
В данном примере все работает как бы сказать по вкл/выкл. Зашел игрок (проверило флаг доступа) переключило, и т.д. Поэтому если несколько игроков на сервере будет творится ерунда.
 
Сообщения
2,288
Реакции
1,740
Помог
31 раз(а)
Сообщения
143
Реакции
68
Помог
1 раз(а)
Pokemoshka, нет. Замысел таков, что для ВИП другой спрайт будет.
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
roten, массив сделай в g_Enebled для ид игроков.
20 Апр 2020
Pokemoshka, а как тебе правка трейса с выставлением на хитбокс головы, чтобы все пули летели в голову, и не важно куда попадешь?!))))
 
Сообщения
2,288
Реакции
1,740
Помог
31 раз(а)
Minni, О таком слышал, но не приходилось видеть
 
Сообщения
443
Реакции
319
Помог
13 раз(а)
1587415013400.png
 
Последнее редактирование:
  • Lol
Реакции: Ayk
Сообщения
594
Реакции
350
Предупреждения
1
Помог
9 раз(а)
Shel, в 1.6 тоже самое
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
roten, массив сделай в g_Enebled для ид игроков.
20 Апр 2020
Если я правильно понял. Надо сделать так

Код:
new g_Enebled[33];
Код:
public client_putinserver(id)
{   
    if(get_user_flags(id) & ADMIN_LEVEL_H){
        g_Enebled[id] = 1;
    }else{
    g_Enebled[id] = 0;
    }
}
Но теперь вопрос как зарегистрировать [id] здесь
Код:
public FwdPlaybackEvent ( iFlags , iEntity , iEventindex, Float:fDelay ...
new id; или public FwdPlaybackEvent (id, iFlags , iEntity , iEventindex ...
так компилируется но не работает
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
roten, if(iEventindex != g_CreateSmoke || !g_Enebled[iEntity])
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
Minni, так не сработает. Будет ошибка. Но спасибо, пока только Вы помогаете.
Ошибка ,,переменная выходит за пределы массива ,,
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
Minni, а может проще будет с помощью ReAPI как то сделать.
Может есть примеры где то.
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
roten, да проще заюзать кастомный дым и от него уже плясать с тем, кому отправлять TE_FIREFIELD.
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
Minni, вот как бы на подобии

Код:
public burnit(id)
{
        new spriteorigin[3]
        get_user_origin(id, spriteorigin);
        message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
        write_byte( TE_FIREFIELD );
        write_coord( spriteorigin[0] ); //coord coord coord (position)
        write_coord( spriteorigin[1] );
        write_coord( spriteorigin[2] );
        write_short( 500 ); //Radius
        write_short( fire );
        write_byte( 100 ); // count
        write_byte( 2 ); //flags
        write_byte( 10 ); // duration in sec.
        message_end();

        return PLUGIN_HANDLED
}
public plugin_precache()
{
    fire = precache_model("sprites/fire.spr");
    
    return PLUGIN_HANDLED;
}
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
roten, да, но через MSG_ONE с индексом игрока, которому нужно отправить эту мессагу. И лучше для нее сделать синк, чтобы дым обновлялся. Посмотри для примера, как реализован кастомный дым от bionext
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
Minni, на сколько я понял. По логике, сначала в любом случае надо заблокировать спрей оригинал. А потом уже по проверке подставлять свои спреи.
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
Где-то лежало, автор the_swank


Код:
public fw_playback_event(const flags, const invoker, const event, const Float:delay, const Float:origin[3], const Float:angles[3], const Float:fparam1, const Float:fparam2, const iparam1, const iparam2, const bparam1, const bparam2) {
    if (event != g_smoke_event) {
        return FMRES_IGNORED
    }

    for (new i = 1; i <= get_maxplayers(); i++) {
        if (g_player_smoke_disable[i]) {
            continue
        }

        fm_playback_event(flags | FEV_HOSTONLY, i, event, delay, origin, angles, fparam1, fparam2, iparam1, iparam2, bparam1, bparam2)
    }

    return FMRES_SUPERCEDE
}
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
w0w, з данного примера ,,i,, можно использовать как ,,id,, ?
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
roten, это название переменной, может быть какое угодно. id неуместно лексически, хотя это и есть id, просто как итератор игроков в цикле.
 
Статус
В этой теме нельзя размещать новые ответы.

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

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