• Пожалуйста, создайте название темы отражающее ее смысл
  • Для ускорения решения Вашего вопроса заполните обязательные поля и подробно опишите возникшую проблему

Помощь Как правильно разделить спрайты дыма

pollfank

Участник
Сообщения
167
Решения
1
Реакции
32
Баллы
28
Всем доброго дня.
Может кто нибудь поможет по данному вопросу.
Суть такова.
Есть плагин (устаревший) "Nade Health", "1.21", "medusa".

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

#define GIVE_HEALTH 50                 //Сколько ХП восстанавливать
#define EXPLODE_TIME 1.5             //Через сколько секунд взорвется граната
#define HEAL_RADIUS 250.0             //Радиус
#define GENERAL_EXPLODE             //Включить основной спрайт взрыва
#define TWO_EXPLODE                 //включить дополнительные осколки от взрыва
#define SHOKWAVE                     //Включить Shokwave вокруг гранаты при взрыве
#define SCREENFADE                     //Включить скринфейд
#define STATUSICON                     //показывать иконку
#define TOUCH_EXPLODE                 //Взрываться ли сразу при соприкосновении с обьектами
#define ACCESS_FLAGS ADMIN_LEVEL_H

#define V_MODEL    "models/v_health_grenade.mdl"
#define P_MODEL    "models/p_health_grenade.mdl"
#define W_MODEL    "models/w_health_grenade.mdl"

#if defined GENERAL_EXPLODE
#define EXPLODE_SPRITE    "sprites/heal_explode.spr"
#endif

#if defined TWO_EXPLODE
#define EXPLODE_SPRITE2    "sprites/heal_shape.spr"
#endif

#define HEAL_SOUND    "woomen_expr.wav"

#if defined GENERAL_EXPLODE
new ExplSpr;
#endif

#if defined TWO_EXPLODE
new ExplSpr2;
#endif

#if defined SHOKWAVE
new g_iSpriteCircle;
#endif

#if defined STATUSICON
new g_IconStatus;
#endif

new const g_sound_explosion[] = "weapons/sg_explode.wav";
new const g_classname_grenade[] = "grenade";
//new g_eventid_createsmoke;

public plugin_init()
{
    register_plugin("Nade Health", "1.21", "medusa");

    #if defined STATUSICON
    g_IconStatus = get_user_msgid("StatusIcon");
    #endif

    register_forward(FM_EmitSound, "FMForward_EmitSound");
    //register_forward(FM_PlaybackEvent, "FMForward_PlaybackEvent");
    register_event("CurWeapon", "EVCurWeapon", "be", "1=1");
    register_forward(FM_SetModel, "FMForward_SetModel", 1);

    register_think("grenade", "FMForward_Think" )

    #if defined TOUCH_EXPLODE
    register_touch("grenade", "*", "FMForward_Touch")
    #endif
    //g_eventid_createsmoke = engfunc(EngFunc_PrecacheEvent, 1, "events/createsmoke.sc");
}

public plugin_precache()
{
    #if defined GENERAL_EXPLODE
    ExplSpr = precache_model(EXPLODE_SPRITE);
    #endif

    #if defined TWO_EXPLODE
    ExplSpr2 = precache_model(EXPLODE_SPRITE2);
    #endif

    precache_model(V_MODEL);
    precache_model(W_MODEL);
    precache_model(P_MODEL);
    
    precache_sound("nade_health/holywater_deploy.wav");
    precache_sound("nade_health/holywater_pinpul.wav");
    precache_sound(HEAL_SOUND);

    #if defined SHOKWAVE
    g_iSpriteCircle = precache_model("sprites/shockwave.spr");
    #endif
}

public EVCurWeapon(id)
{
    if(is_user_alive(id) && (get_user_flags(id) & ACCESS_FLAGS))
    {
        if(get_user_weapon(id) == CSW_SMOKEGRENADE)
        {
            set_pev(id, pev_viewmodel2, V_MODEL);
            set_pev(id, pev_weaponmodel2, P_MODEL);

            #if defined STATUSICON
            message_begin(MSG_ONE_UNRELIABLE, g_IconStatus, {0,0,0}, id);
            write_byte(2)
            write_string("cross");
            write_byte(0);
            write_byte(255);
            write_byte(0);
            message_end();
            #endif
        }
        #if defined STATUSICON
        else
        {
            message_begin(MSG_ONE_UNRELIABLE, g_IconStatus, {0,0,0}, id);
            write_byte(0)
            write_string("cross");
            message_end();
        }
        #endif
    }
}

public FMForward_SetModel(entity, const model[])
{
    if(!pev_valid(entity))
        return FMRES_IGNORED;

    if(!(get_user_flags(pev(entity, pev_owner)) & ACCESS_FLAGS))
        return FMRES_IGNORED;
    
    if(equal(model, "models/w_smokegrenade.mdl"))
    {
        engfunc(EngFunc_SetModel, entity, W_MODEL);
        set_pev(entity, pev_dmgtime, get_gametime() + EXPLODE_TIME);
    }
    return FMRES_IGNORED;
}

#if defined TOUCH_EXPLODE
public FMForward_Touch(entity)
{
    if(~get_pdata_int(entity, 114) & (1<<1))
        return;
        
    if(!(get_user_flags(pev(entity, pev_owner)) & ACCESS_FLAGS))
        return;

    set_pev(entity, pev_dmgtime, get_gametime());
}
#endif

public FMForward_Think(entity)
{
    if(~get_pdata_int(entity, 114) & (1<<1))
        return;
 
    if(!(get_user_flags(pev(entity, pev_owner)) & ACCESS_FLAGS))
        return;
    
    set_pev( entity, pev_flags, FL_ONGROUND )
}

public FMForward_EmitSound(entity, channel, const sound[])
{
    if (!equal(sound, g_sound_explosion) || !is_grenade(entity))
        return FMRES_IGNORED;

    static Float:origin[3];
    static id; id = pev(entity, pev_owner);

    if(!(get_user_flags(id) & ACCESS_FLAGS))
        return FMRES_IGNORED;

    pev(entity, pev_origin, origin);
    engfunc(EngFunc_EmitSound, entity, CHAN_WEAPON, HEAL_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);

    #if defined GENERAL_EXPLODE
    message_begin(MSG_PVS,SVC_TEMPENTITY,{0,0,0});
    write_byte(TE_EXPLOSION);
    write_coord(floatround(origin[0]));
    write_coord(floatround(origin[1]));
    write_coord(floatround(origin[2])+65);
    write_short(ExplSpr);
    write_byte(30);
    write_byte(20);
    write_byte(TE_EXPLFLAG_NOSOUND|TE_EXPLFLAG_NOPARTICLES);
    message_end();
    #endif
    
    #if defined TWO_EXPLODE
    message_begin(MSG_ALL,SVC_TEMPENTITY,{0,0,0});
    write_byte(TE_SPRITETRAIL);
    write_coord(floatround(origin[0]));
    write_coord(floatround(origin[1]));
    write_coord(floatround(origin[2])+20);
    write_coord(floatround(origin[0]));
    write_coord(floatround(origin[1]));
    write_coord(floatround(origin[2])+80);
    write_short(ExplSpr2);
    write_byte(20);
    write_byte(20);
    write_byte(4);
    write_byte(20);
    write_byte(10);
    message_end();
    #endif

    #if defined SHOKWAVE
    message_begin(MSG_ALL, SVC_TEMPENTITY, {0,0,0});
    write_byte(TE_BEAMCYLINDER);
    write_coord(floatround(origin[0]));
    write_coord(floatround(origin[1]));
    write_coord(floatround(origin[2]));
    write_coord(floatround(origin[0]));
    write_coord(floatround(origin[1]));
    write_coord(floatround(origin[2] + HEAL_RADIUS));
    write_short(g_iSpriteCircle);
    write_byte(0);
    write_byte(1);
    write_byte(5);
    write_byte(30);
    write_byte(1);
    write_byte(10);
    write_byte(255);
    write_byte(40);
    write_byte(255);   
    write_byte(5);
    message_end();
    #endif
    
    new user
    while((user = find_ent_in_sphere(user,origin,HEAL_RADIUS)) != 0)
    {
        if(is_user_alive(user) && get_user_team(user) == get_user_team(id))
        {
            #if defined SCREENFADE
            message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, user);
            write_short(1<<10);
            write_short(1<<10);
            write_short(0x0000);
            write_byte(170);
            write_byte(255);
            write_byte(0);
            write_byte(75);
            message_end();
            #endif
        
            new health[32];
            health[user] = get_user_health(user);

            if (health[user] <= 100 - GIVE_HEALTH)
                set_user_health(user,health[user] + GIVE_HEALTH);
            else if(health[user] > 100 - GIVE_HEALTH)
                set_user_health(user,100);
        }
    }

    return FMRES_SUPERCEDE;
}

/*public FMForward_PlaybackEvent(flags, invoker, eventindex) {
    if(eventindex == g_eventid_createsmoke && (get_user_flags(invoker) & ACCESS_FLAGS))
        return FMRES_SUPERCEDE;

    return FMRES_IGNORED;
}*/

bool:is_grenade(entity)
{
    if (!pev_valid(entity))
        return false;

    static classname[sizeof g_classname_grenade + 1]
    pev(entity, pev_classname, classname, sizeof g_classname_grenade);

    if (equal(classname, g_classname_grenade))
        return true;

    return false;
}

Есть выдача вместо дыма тем у кого есть ВИП. Но вот беда, еще и захватывается спрайт дыма вместе со спрайтом хилки. Для обыкновенных игроков все работает ок.
Может кто нибудь подскажет как все таки убрать дым, при использовании лечебной гранаты.
Уже читал на других форумах, что за ф-цию разделения дыма отвечает FMForward_PlaybackEvent в данном примере. Но как пока сделать не знаю. Или хотя бы какой то пример...
 
Назад
Сверху