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

Эффект плавного исчезания Модели  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Эффект плавного исчезания Модели

Сообщение MayroN » 17 сен 2018, 00:47

Есть плагин
Код: Выделить всё
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>

#pragma semicolon 1

// Шансы и количества

#define HK_FULL_CHANCE 10 // Процент вероятности выпадение полной аптечки (0 - никогда, 100 - всегда)
#define HK_FULL_HEALTH 100 // Сколько восстанавливает полная аптечка? (Лимит не привышаем)
#define HK_HEADSHOT_CHANCE 100 // Процент вероятности выпадения аптечки при убийстве в голову (0 - никогда, 100 - всегда)
#define HK_HEADSHOT_HEALTH 30 // Сколько восстанавливает аптечка при убийстве в голову? (Лимит не привышаем)
#define HK_NORMAL_CHANCE 100 // Процент вероятности выпадения простой аптечки 0 - никогда, 100 - всегда)
#define HK_NORMAL_HEALTH 15 // Сколько восстанавливает простая аптечка? (Лимит не привышаем)
#define HK_LIMIT_HEALTH 100 // Сколько максимум HP может быть у игроков?

// Эффекты

#define HK_HEALTHKIT_GLOW 1 // Подсвечивать аптечки? (0 - нет, 1 - да)
#define HK_PLAYER_FADE 1 // Затемнять игроку экран при поднятии аптечки? (0 - нет, 1 - да)
#define HK_PLAYER_HUD 1 // Показывать игроку HUD сообщение при поднятии аптечки? (0 - нет, 1 - да)
#define HK_PLAYER_SOUND 1 // Проигрывать звук при поднятии аптечки? (0 - нет, 1 - да)
#define HK_HEALTHKIT_EFFECT 1 // Включить эффект плавного исчезания аптечки? (0 - нет, 1 - да)

// Другое

#define HK_TOGGLE 1 // Разрешать игрокам отключать и включать поднятие аптечек командой /hk? (0 - нет, 1 - да)
#define HK_ROUND_REMOVE 1 // Убирать аптечки в начале раунда? (0 - нет, 1 - да)
#define HK_LIFE_TIME 60 // Сколько секунд может лежать аптечка? (0 - бесконечно)
#define HK_OWNER_ONLY 0 // Только убийца может подобрать аптечку? (0 - нет, 1 - да, но после смерти или выхода могут все, 2 - да, но после смерти или выхода убрать аптечки, 3 - всегда, но после выхода могут все, 4 - всегда, но после выхода убрать аптечки) [Не советовал бы ставить 1 или 2]

// Дальше трогаем только если есть хоть чутка мозгов

#define min_ex(%1,%2) (%1 <= %2 ? %1 : %2)

new msg_pickup, bool:ham_registred;

#if HK_PLAYER_FADE == 1
    new msg_fade;
#endif

#if HK_TOGGLE == 1
    new toggle;
    #define is_bit(%1) (toggle & (1 << (%1 - 1)))
    #define add_bit(%1) (toggle |= (1 << (%1 - 1)))
    #define remove_bit(%1) (toggle &= ~(1 << (%1 - 1)))
#endif

public plugin_init()
{
    register_plugin("Healthkit", "3.3.1", "Tuty ft. Sho0ter");
    #if HK_ROUND_REMOVE == 1
        register_event("HLTV", "ev_start", "a", "1=0", "2=0");
    #endif
    register_event("DeathMsg", "ev_death", "a", "1>0");
    #if HK_PLAYER_FADE == 1
        msg_fade = get_user_msgid("ScreenFade");
    #endif
    msg_pickup = get_user_msgid("ItemPickup");
    #if HK_TOGGLE == 1
        register_clcmd("say /hk", "cmd_toggle");
        register_clcmd("say_team /hk", "cmd_toggle");
    #endif
    return PLUGIN_CONTINUE;
}

#if HK_TOGGLE == 1
    public client_putinserver(client_id)
    {
        if(!is_bit(client_id))
        {
            add_bit(client_id);
        }
        return PLUGIN_CONTINUE;
    }
    
    public cmd_toggle
(client_id)
    {
        if(!is_bit(client_id))
        {
            add_bit(client_id);
            client_cmd(client_id, "spk activated");
        }
        else
        
{
            remove_bit(client_id);
            client_cmd(client_id, "spk deactivated");
        }
        return PLUGIN_HANDLED;
    }
#endif

public plugin_precache()
{
    #if HK_PLAYER_SOUND == 1
        precache_sound("items/smallmedkit1.wav");
    #endif
    return precache_model("models/w_medkit.mdl");
}

public ev_death()
{
    #if HK_OWNER_ONLY > 0
        new killer_id = read_data(1);
        #if HK_TOGGLE == 1
            if(!is_bit(killed_id))
            {
                killed_id = 0;
            else
            
{
        #endif
        if(!is_user_connected(killer_id))
        {
            killer_id = 0;
        }
        #if HK_TOGGLE == 1
            }
        #endif
    #endif
    new type, victim_id = read_data(2), chance = random_num(1, 100);
    #if HK_OWNER_ONLY == 1 || HK_OWNER_ONLY == 2
        remove_owner(victim_id);
    #endif
    if(chance <= HK_FULL_CHANCE)
    {
        type = 1;
    }
    else if(read_data(3))
    {
        if(chance <= HK_HEADSHOT_CHANCE)
        {
            type = 2;
        }
        else
        
{
            return PLUGIN_CONTINUE;
        }
    }
    else if(chance <= HK_NORMAL_CHANCE)
    {
        type = 3;
    }
    else
    
{
        return PLUGIN_CONTINUE;
    }
    new entity;
    if(!pev_valid((entity = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target")))))
    {
        return PLUGIN_CONTINUE;
    }
    set_pev(entity, pev_classname, "healthkit_entity");
    #if HK_OWNER_ONLY > 0
        set_pev(entity, pev_owner, killer_id);
    #endif
    set_pev(entity, pev_iuser1, 0);
    engfunc(EngFunc_SetSize, entity, Float:{-23.160000, -13.660000, -0.050000}, Float:{11.470000, 12.780000, 6.720000});
    set_pev(entity, pev_solid, SOLID_TRIGGER);
    set_pev(entity, pev_movetype, MOVETYPE_TOSS);
    new Float:angles[3] = {0.0, 0.0, 0.0};
    angles[1] = float(random_num(0, 180));
    set_pev(entity, pev_angles, angles);
    new Float:origin[3];
    pev(victim_id, pev_origin, origin);
    engfunc(EngFunc_SetOrigin, entity, origin);
    engfunc(EngFunc_SetModel, entity, "models/w_medkit.mdl");
    #if HK_HEALTHKIT_GLOW == 1
        set_pev(entity, pev_renderfx, kRenderFxGlowShell);
        set_pev(entity, pev_rendercolor, type == 1 ? (Float:{255.0, 0.0, 0.0}) : (type == 2 ? (Float:{0.0, 255.0, 0.0}) : (Float:{0.0, 0.0, 255.0})));
        set_pev(entity, pev_rendermode, kRenderFxNone);
        set_pev(entity, pev_renderamt, 25.0);
    #endif
    set_pev(entity, pev_health, type == 1 ? float(HK_FULL_HEALTH) : (type == 2 ? float(HK_HEADSHOT_HEALTH) : float(HK_NORMAL_HEALTH)));
    #if HK_LIFE_TIME > 0
        set_pev(entity, pev_nextthink, get_gametime() + float(HK_LIFE_TIME));
    #endif
    if(!ham_registred)
    {
        #if HK_LIFE_TIME > 0
            RegisterHamFromEntity(Ham_Think, entity, "ham_think", 1);
        #endif
        RegisterHamFromEntity(Ham_Touch, entity, "ham_touch", 1);
        ham_registred = true;
    }
    return PLUGIN_CONTINUE;
}

public ham_touch(entity, touch_id)
{
    #if HK_TOGGLE == 1
        if(!is_bit(touch_id))
        {
            return HAM_IGNORED;
        }
    #endif
    if(!pev_valid(entity) || !is_user_connected(touch_id))
    {
        return HAM_IGNORED;
    }
    #if HK_OWNER_ONLY > 0
        new owner = pev(entity, pev_owner);
        if(owner && owner != touch_id)
        {
            return HAM_IGNORED;
        }
    #endif
    new current_hp = pev(touch_id, pev_health);
    if(current_hp >= HK_LIMIT_HEALTH)
    {  
        return HAM_IGNORED
;
    }
    new healthkit_value = pev(entity, pev_health);
    #if HK_HEALTHKIT_EFFECT == 1
        if(!healthkit_value)
        {
            return HAM_IGNORED;
        }
    #endif
    #if HK_PLAYER_HUD == 1
        switch(healthkit_value)
        {
            case HK_FULL_HEALTH: set_hudmessage(255, 0, 0, -1.0, 0.80, 0, 1.0, 1.0, 1.0, 1.0);
            case HK_HEADSHOT_HEALTH: set_hudmessage(0, 255, 0, -1.0, 0.80, 0, 1.0, 1.0, 1.0, 1.0);
            case HK_NORMAL_HEALTH: set_hudmessage(0, 0, 255, -1.0, 0.80, 0, 1.0, 1.0, 1.0, 1.0);
        }
        show_hudmessage(touch_id, "+ %d HP", healthkit_value);
    #endif
    set_pev(touch_id, pev_health, float(min_ex(current_hp + healthkit_value, HK_LIMIT_HEALTH)));
    #if HK_PLAYER_SOUND == 1
        emit_sound(touch_id, CHAN_ITEM, "items/smallmedkit1.wav", VOL_NORM, ATTN_NORM , 0, PITCH_NORM);
    #endif
    message_begin(MSG_ONE_UNRELIABLE, msg_pickup, _, touch_id);
    write_string("item_healthkit");
    message_end();
    #if HK_PLAYER_FADE == 1
        message_begin(MSG_ONE_UNRELIABLE, msg_fade , _, touch_id);
        write_short(<< 10);
        write_short(<< 10);
        write_short(0x0000);
        write_byte(healthkit_value == HK_FULL_HEALTH ? 255 : 0);
        write_byte(healthkit_value == HK_HEADSHOT_HEALTH ? 255 : 0);
        write_byte(healthkit_value == HK_NORMAL_HEALTH ? 255 : 0);
        write_byte(100);
        message_end();
    #endif
    #if HK_HEALTHKIT_EFFECT == 1
        return ham_think(entity);
    #else
        return remove_entity(entity);
    #endif
}

public ham_think(entity)
{
    if(!pev_valid(entity))
    {
        return HAM_IGNORED;
    }
    #if HK_HEALTHKIT_EFFECT == 1
        if(pev(entity, pev_rendermode) != kRenderTransAlpha)
        {
            set_pev(entity, pev_solid, SOLID_NOT);
            set_pev(entity, pev_health, 0.0);
            set_pev(entity, pev_rendercolor, Float:{0.0, 0.0, 0.0});
            set_pev(entity, pev_rendermode, kRenderTransAlpha);
            set_pev(entity, pev_renderamt, 250.0);
        }
        else
        
{
            new amount = pev(entity, pev_renderamt);
            if(amount <= 10)
            {
                return engfunc(EngFunc_RemoveEntity, entity);
            }
            set_pev(entity, pev_renderamt, float(amount - 10));
        }
        return set_pev(entity, pev_nextthink, get_gametime() + 0.1);
    #else
        return engfunc(EngFunc_RemoveEntity, entity);
    #endif
}

#if HK_ROUND_REMOVE == 1
    public ev_start()
    {
        new entity;
        while((entity = engfunc(EngFunc_FindEntityByString, entity, "classname", "healthkit_entity")))
        {
            engfunc(EngFunc_RemoveEntity, entity);
        }
        return PLUGIN_CONTINUE;
    }
#endif

#if HK_OWNER_ONLY > 0
    public client_disconnect(client_id)
    {
        return remove_owner(client_id);
    }
    
    stock remove_owner
(client_id)
    {
        new entity;
        while((entity = engfunc(EngFunc_FindEntityByString, entity, "classname", "healthkit_entity")))
        {
            if(pev(entity, pev_owner) == client_id)
            {
                #if HK_OWNER_ONLY == 1 || HK_OWNER_ONLY == 3
                    set_pev(entity, pev_owner, 0);
                #else
                    #if HK_HEALTHKIT_EFFECT == 1
                        ham_think(entity);
                    #else
                        engfunc(EngFunc_RemoveEntity, entity);
                    #endif
                #endif
            }
        }
        return PLUGIN_CONTINUE;
    }
#endif         


В нём имееться код плавного исчезания Модели, а также через сколько удалять обьект
#define HK_LIFE_TIME 60 // Сколько секунд может лежать аптечка? (0 - бесконечно)
#define HK_HEALTHKIT_EFFECT 1 // Включить эффект плавного исчезания аптечки? (0 - нет, 1 - да)


Пожалуйста,сделайте исчезание и плавное удаление модели в етом плагине ( или роскажите что чем заменить )
А я уже пойду дальше и подстрою на остальные плагины из взаимодействием моделей


Код: Выделить всё
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>

#define Medkit_1                "models/medkit_wc/medkit_wc_1.mdl"
#define Medkit_2                "models/medkit_wc/medkit_wc_2.mdl"

new const gMedKitClassname[]="kit_ent"
new gToggleKitEnable,gToggleGlowShow,gGMsgFade,gToggleFadeEnable
new gToggleDelRespawn
,gKitPickMode,gKitHPCvar,gLimitHPCvar,gGMsgItemPickup

public plugin_init
()
{
    register_plugin("Death Medkit Drop","4.2","tuty; 731; Midnight Kid")
    register_event("DeathMsg","dropkit","a")
    register_logevent("logevent",2,"1=Round_Start")
    register_touch("kit_ent","player","forward_FM_Touch")
    gToggleKitEnable=register_cvar("kit_enable","1")
    gToggleGlowShow=register_cvar("kit_glow","0")
    gToggleFadeEnable=register_cvar("kit_fade","1")
    gToggleDelRespawn=register_cvar("kit_del","1")
    gKitPickMode=register_cvar("kit_pick","0")
    gKitHPCvar=register_cvar("kit_hp","15")
    gLimitHPCvar=register_cvar("kit_limit_hp","200")
    gGMsgFade=get_user_msgid("ScreenFade")
}

public plugin_precache()
{
    precache_model(Medkit_1)
    precache_model(Medkit_2)
}

public dropkit()
{
    if(!get_pcvar_num(gToggleKitEnable))
        return PLUGIN_HANDLED

    new num 
= random_num(0,5)
    if(num > 1 || num < 0)
        return PLUGIN_HANDLED
        
    new gVic 
= read_data(2), Float:flOrigin[3]
    pev(gVic, pev_origin, flOrigin)
    
    new ent
=engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
    
    engfunc
(EngFunc_SetOrigin,ent,flOrigin)
    
    switch
(random_num(0,1))
    {
        case 0: engfunc(EngFunc_SetModel, ent, Medkit_1)
        case 1: engfunc(EngFunc_SetModel, ent, Medkit_2)
    }

    set_pev(ent,pev_classname,gMedKitClassname)
    set_pev(ent, pev_sequence, 0)
    set_pev(ent, pev_framerate, 1.0)
    dllfunc(DLLFunc_Spawn,ent)
    set_pev(ent,pev_solid,SOLID_TRIGGER)
    set_pev(ent,pev_movetype,MOVETYPE_PUSHSTEP)
    engfunc(EngFunc_SetSize,ent,Float:{-23.160000,-13.660000,-0.050000},Float:{11.470000,12.780000,6.720000})

    new KitPick=get_pcvar_num(gKitPickMode)
    new Vic=get_user_team(gVic)
    if(get_pcvar_num(gToggleGlowShow))
    {
        switch(KitPick)
        {
            case 0: fm_set_rendering(ent,kRenderFxGlowShell,255,255,255,kRenderFxNone,27)
            case 1:
            {
                switch(Vic)
                {
                    case 1:
                    {
                        fm_set_rendering(ent,kRenderFxGlowShell,0,0,255,kRenderFxNone,27)
                        entity_set_int(ent,EV_INT_team,1)
                    }
                    case 2:
                    {
                        fm_set_rendering(ent,kRenderFxGlowShell,255,0,0,kRenderFxNone,27)
                        entity_set_int(ent,EV_INT_team,2)
                    }
                }
            }
            case 2:
            {
                switch(Vic)
                {
                    case 1:
                    {
                        fm_set_rendering(ent,kRenderFxGlowShell,255,0,0,kRenderFxNone,27)
                        entity_set_int(ent,EV_INT_team,1)
                    }
                    case 2:
                    {
                        fm_set_rendering(ent,kRenderFxGlowShell,0,0,255,kRenderFxNone,27)
                        entity_set_int(ent,EV_INT_team,2)
                    }
                }
            }
        }
    }
    
    new Float
:velocity[3]

    velocity[0] = random_float(50.0, 100.0)
    velocity[1] = random_float(50.0, 100.0)
    velocity[2] = random_float(200.0, 250.0)    
    
    set_pev
(ent, pev_velocity, velocity) 
    
    return PLUGIN_HANDLED
}

public forward_FM_Touch(ent,id)
{
    if(!pev_valid(ent)||!get_pcvar_num(gToggleKitEnable))
    {
        return FMRES_IGNORED
    
}
    new KitPick=get_pcvar_num(gKitPickMode)
    new own_team=get_user_team(id)
    new find_team=entity_get_int(ent,EV_INT_team)
    switch(KitPick)
    {
        case 1:
        {
            if(find_team==own_team)
            {
                return FMRES_IGNORED
            
}
        }
        case 2:
        {
            if(find_team!=own_team)
            {
                return FMRES_IGNORED
            
}
        }
    }
    new szClassname[32]
    pev(ent,pev_classname,szClassname,charsmax(szClassname))
    if(!equal(szClassname,gMedKitClassname))
    {
        return FMRES_IGNORED
    
}
    new userHP=get_user_health(id)
    new cvarHP=get_pcvar_num(gKitHPCvar)
    new maxHP=get_pcvar_num(gLimitHPCvar)
    if(userHP>=maxHP)
    {
        return FMRES_IGNORED
    
}
    if(maxHP-userHP<cvarHP&&maxHP-userHP>0)
    {
        fm_set_user_health(id,maxHP)
    }
    else
    
{
        fm_set_user_health(id,userHP+cvarHP)
    }
    client_cmd(id, "spk sound/items/smallmedkit1.wav")
    if(get_pcvar_num(gToggleFadeEnable))
    {
        if(KitPick==0)
        {
            message_begin(MSG_ONE_UNRELIABLE,gGMsgFade,_,id)
            write_short(1<<10)
            write_short(1<<10)
            write_short(0x0000)
            write_byte(200)
            write_byte(150)
            write_byte(0)
            write_byte(75)
            message_end()
        }
        if(KitPick==1||KitPick==2)
        {
            switch(own_team)
            {
                case 1:
                {
                    message_begin(MSG_ONE_UNRELIABLE,gGMsgFade,_,id)
                    write_short(1<<10)
                    write_short(1<<10)
                    write_short(0x0000)
                    write_byte(255)
                    write_byte(150)
                    write_byte(0)
                    write_byte(75)
                    message_end()
                }
                case 2:
                {
                    message_begin(MSG_ONE_UNRELIABLE,gGMsgFade,_,id)
                    write_short(1<<10)
                    write_short(1<<10)
                    write_short(0x0000)
                    write_byte(255)
                    write_byte(150)
                    write_byte(0)
                    write_byte(75)
                    message_end()
                }
            }
        }
    }
    engfunc(EngFunc_RemoveEntity,ent)
    if(KitPick==0)
    {
        return PLUGIN_CONTINUE
    
}
    return FMRES_IGNORED
}

public logevent()
{
    if(get_pcvar_num(gToggleDelRespawn))
    {
        new entity=FM_NULLENT
        while
((entity=fm_find_ent_by_class(entity,gMedKitClassname)))
        {
            engfunc(EngFunc_RemoveEntity,entity)
        }
    }
}

stock UTIL_Send_PickMess(const id,const szItemName[])
{
    message_begin(MSG_ONE_UNRELIABLE,gGMsgItemPickup,_,id)
    write_string(szItemName)
    message_end()
}


Да Большое спасибо за помощь :thumbs_up
МультиМод CS
Аватара пользователя
MayroN
 
Сообщения: 673
Зарегистрирован: 10 окт 2010, 18:23
Откуда: Украина, г. Белая Церковь
Благодарил (а): 149 раз.
Поблагодарили: 86 раз.
Опыт программирования: Около года
Языки программирования: На которых говорю...

Re: Эффект плавного исчезания Модели  [Решено]

Сообщение nahuyaqa » 17 сен 2018, 01:36

Процент прозрачности от оставшегося времени жизни просто задаёшь и всё, а плавность зависеть от квантования по времени будет. Чем меньше интервалы тем плавнее.
Аватара пользователя
nahuyaqa
 
Сообщения: 102
Зарегистрирован: 19 авг 2014, 22:05
Благодарил (а): 21 раз.
Поблагодарили: 23 раз.
Языки программирования: Counter-Strike 1.6
С#
С++

Re: Эффект плавного исчезания Модели

Сообщение MayroN » 17 сен 2018, 04:13

Очень всё подробно и понятно : )
МультиМод CS
Аватара пользователя
MayroN
 
Сообщения: 673
Зарегистрирован: 10 окт 2010, 18:23
Откуда: Украина, г. Белая Церковь
Благодарил (а): 149 раз.
Поблагодарили: 86 раз.
Опыт программирования: Около года
Языки программирования: На которых говорю...


Вернуться в Скриптинг

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

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