Вопросы по работе со спрайтами.

Сообщения
260
Реакции
129
Помог
12 раз(а)
Игрался с реализацией trinity гранаты , худо бедно получилось - но остались вопросы c muzzleflash спрайтами возможно с которыми коммьюнити поможет :

1. Создаю env_sprite приатачиваю его гранатке и потом в синке по достижении последнего фрейма удаляю спрайт. Вопрос: удалять приатаченный спрайт обязательно самому или есть какой-то способ что бы спрайт проиграл анимацию до конца и самоудалился ?
2. Точка аттача у меня в центре модели гранатки, и idle, transform спрайты (свойства спрайта vp_parallel, additive) при спавне находятся как бы за моделью гранаты. Но в оригинале они должны находиться аккурат перед моделью - каким способом этого добиваются ? Сначала я думал просто вытащить точку аттача что бы она вылезла из модели ближе к игроку - но фигня какая то получается и скорее всего там как то по другому сделано. Что это может быть - какой флаг или еффект у ентити или же тип спрайта другой - кто знает подскажите плз.

Код:
public MakeMuzzleFlash(id, iBody, Float:scale, model_index)
{
    static iMuz
    iMuz = rg_create_entity("env_sprite")
    
    if(is_nullent(iMuz))
        return
    
    set_entvar(iMuz, var_movetype, MOVETYPE_FOLLOW)
    set_entvar(iMuz, var_owner, id)
    engfunc(EngFunc_SetModel, iMuz, MODELS[model_index])
    set_entvar(iMuz, var_classname, "ef_sticky")
    set_entvar(iMuz, var_solid, SOLID_BBOX)
    set_entvar(iMuz, var_body, iBody)
    set_entvar(iMuz, var_owner, id)
    set_entvar(iMuz, var_rendermode, kRenderTransAdd)
    set_entvar(iMuz, var_renderamt, 255.0)
    set_entvar(iMuz, var_aiment, id)
    set_entvar(iMuz, var_scale, scale)
    set_entvar(iMuz, var_frame, 0.0)
    
    set_entvar(iMuz, var_nextthink, get_gametime() + 0.01)
    
    SetThink(iMuz,"MF_Think")
    dllfunc(DLLFunc_Spawn, iMuz)
}
trinity_sprite.jpg
 
Сообщения
847
Реакции
530
Помог
13 раз(а)
убрать SetThink и задать pev_spawnflags = SF_SPRITE_ONCE
3 Авг 2024
спрайт, который ты присоединяешь к игроку всегда будет ЗА view моделью
увы, иначе никак
попроси моделлеров сделать эффекты в модели
 
Сообщения
260
Реакции
129
Помог
12 раз(а)
Arabas, не ну это круто, вот даже не представляю как такое сделать. У меня это было в 3 v моделях 3 спрайта трансформации и 2 idle, а тут все вместе совмещено.
Теперь у меня появился еще вопрос : а что с p моделью там тоже что то придумано ? У меня 3 штуки и я их переключаю при трансформации через var_weaponmodel. Например с w шкой там вопросов нету - просто var_skin можно поменять.
 
Сообщения
25
Реакции
27
Помог
1 раз(а)
murlemur, Да, с p_ моделью как и с w_ - меняется skin. Но с p_ моделью нужно дополнительно создать entity и цеплять её к игроку с помощью aiment. Default модель(var_weaponmodel2) естественно убирается.

Для ознакомления
 

Вложения

Сообщения
658
Реакции
563
Предупреждения
8
Помог
9 раз(а)
p_ моделью нужно дополнительно создать entity и цеплять
Ничего дополнительно создать и цеплять не надо. Энтити оружие и так цепляются к игроку (остаётся только убрать nodraw и установить моделку)
 
Сообщения
260
Реакции
129
Помог
12 раз(а)
убрать SetThink и задать pev_spawnflags = SF_SPRITE_ONCE
3 Авг 2024
спрайт, который ты присоединяешь к игроку всегда будет ЗА view моделью
увы, иначе никак
попроси моделлеров сделать эффекты в модели
В гранатке тогда получилось все через модель сделать и потому как то со спрайтом дальше не разбирался.
Но сейчас решил все таки и с спрайтом muzzleflash для себя понять можно ли все таки без синков обойтись.

Вот хотел для примера в каком то оружии глянуть - https://github.com/S3xTy/AMXX-New-Y...ra-Item - CHARGER-5/zp_weapon_charger5_re.sma

Но тут хоть и ставится pev_spawnflags = SF_SPRITE_ONCE но, все равно в синке делается переключение фреймов и удаление спрайта :

Код:
#if defined CUSTOM_MUZZLEFLASH
            if(FClassnameIs(pSprite, MUZZLEFLASH_CLASSNAME))
            {
                static Float: flFrame; get_entvar(pSprite, var_frame, flFrame);
                if(flFrame >= get_entvar(pSprite, var_max_frame))
                {
                    UTIL_KillEntity(pSprite);
                    return;
                }

                set_entvar(pSprite, var_nextthink, get_gametime());
            }
        #endif
То есть спрайт не самоудаляется, поэтому вопрос - так не получиться сделать вообще ? Или именно в этом случае есть какой-то долнительный нюанс. Или может есть где то готовый пример где без синка удаляется ентитя спрайта muzzleflash ?
 
Сообщения
260
Реакции
129
Помог
12 раз(а)
убрать SetThink и задать pev_spawnflags = SF_SPRITE_ONCE
3 Авг 2024
спрайт, который ты присоединяешь к игроку
Поидее после проигрывания анимации установится флаг EF_NODRAW, но сама ентитя не удалиться же.
И раз она не удалиться можно ли как то потом снова ее использовать, кроме как запустить вручную синк в котором менять фреймы ?
И как такой вариант будет по производительности ? То есть что лучше держать одну приатаченую энтитю и проигрывать ей анимации при выстрелах, или же каждый раз создавать атачить энтитю и убивать после проигрывания анимации ?

Есть ли разница при атаче между MOVETYPE_FLY и MOVETYPE_FOLLOW ?
 
Сообщения
847
Реакции
530
Помог
13 раз(а)
у MOVETYPE_FLY можно один угол крутить в var_angles, у MOVETYPE_FOLLOW нет

Поидее после проигрывания анимации установится флаг EF_NODRAW, но сама ентитя не удалиться же
должна удаляться

кроме как запустить вручную синк в котором менять фреймы
если хочешь можешь, только зачем

И как такой вариант будет по производительности ? То есть что лучше держать одну приатаченую энтитю и проигрывать ей анимации при выстрелах, или же каждый раз создавать атачить энтитю и убивать после проигрывания анимации ?
практически никакой разницы
это оба аттача, данные засылаются об объектах в любом случае
оба так же не критичны (если ты конечно не засираешь pev_* новой инфой каждую милисекунду)
 
Сообщения
260
Реакции
129
Помог
12 раз(а)
BalbuR, Ну я в предидущем посте пробовал взять для примера тот же charger5 и закомментил тот кусочек кода в синке и оно перестает работать значит не удаляется ...
Или может у тебя есть какой-то пример рабочий с CUSTOM MUZZLEFLASH под рукой есть где удаляется само, может там еще какие-то нюансы есть ?

Просто видел в дискорде что вы эту тему обсуждали и оппонент рекомендовал не использовать синки для переключения фреймов музлфлеша, а отдать это на откуп движку - но примера он не привел и у я хз как правильно сделать
 
Сообщения
847
Реакции
530
Помог
13 раз(а)
PHP:
    stock UTIL_DrawAttachment(const pPlayer, const szModel[], const iAttachment = 2, const Float: flScale = 0.07, const Float: flColor[3] = { 0.0, 0.0, 0.0 }, const Float: flBrightness = 255.0)
    {
        if (!strlen(szModel))
            return NULLENT;
        
        if (g_iMaxEntities - engfunc(EngFunc_NumberOfEntities) <= LOWER_LIMIT_OF_ENTITIES)
            return NULLENT;

        new pSprite = rg_create_entity(ATTACHMENT_REFERENCE);
        
        if (is_nullent(pSprite))
            return NULLENT;

        set_entvar(pSprite, var_classname, ATTACHMENT_CLASSNAME);
        set_entvar(pSprite, var_spawnflags, SF_SPRITE_ONCE);
        set_entvar(pSprite, var_rendermode, kRenderTransAdd);
        set_entvar(pSprite, var_rendercolor, flColor);
        set_entvar(pSprite, var_renderamt, flBrightness);
        set_entvar(pSprite, var_scale, flScale);
        set_entvar(pSprite, var_owner, pPlayer);
        set_entvar(pSprite, var_aiment, pPlayer);
        set_entvar(pSprite, var_body, iAttachment);
        
        engfunc(EngFunc_SetModel, pSprite, szModel);
        dllfunc(DLLFunc_Spawn, pSprite);
        
        set_entvar(pSprite, var_effects, get_entvar(pSprite, var_effects) | EF_OWNER_NO_VISIBILITY);

        return pSprite;
    }
17 Окт 2024
BalbuR, Ну я в предидущем посте пробовал взять для примера тот же charger5 и закомментил тот кусочек кода в синке и оно перестает работать значит не удаляется ...
Или может у тебя есть какой-то пример рабочий с CUSTOM MUZZLEFLASH под рукой есть где удаляется само, может там еще какие-то нюансы есть ?

Просто видел в дискорде что вы эту тему обсуждали и оппонент рекомендовал не использовать синки для переключения фреймов музлфлеша, а отдать это на откуп движку - но примера он не привел и у я хз как правильно сделать
реализация не важна, главное не засрать клиенту канал в моменте
 
Сообщения
260
Реакции
129
Помог
12 раз(а)
BalbuR,
Код:
stock UTIL_DrawMuzzleFlash(const pPlayer, const szModel[], const iAttachment = 1, const Float: flScale = 0.08, const Float: flFramerateMlt = 2.0, const Float: flColor[3] = { 0.0, 0.0, 0.0 }, const Float: flBrightness = 255.0)
 {
        if (!strlen(szModel))
            return NULLENT;
        
        if (gl_iMaxEntities - engfunc(EngFunc_NumberOfEntities) <= LOWER_LIMIT_OF_ENTITIES)
            return NULLENT;

        new pSprite = rg_create_entity(MUZZLEFLASH_REFERENCE);
        
        if (is_nullent(pSprite))
            return NULLENT;
        

        set_entvar(pSprite, var_classname, MUZZLEFLASH_CLASSNAME);
        set_entvar(pSprite, var_spawnflags, SF_SPRITE_ONCE);
        
+        new Float: flFrames = float(engfunc(EngFunc_ModelFrames, engfunc(EngFunc_ModelIndex, szModel)))
+        set_entvar(pSprite, var_framerate, flFrames * flFramerateMlt);
        
        set_entvar(pSprite, var_rendermode, kRenderTransAdd);
        set_entvar(pSprite, var_rendercolor, flColor);
        set_entvar(pSprite, var_renderamt, flBrightness);
        set_entvar(pSprite, var_scale, flScale);
        set_entvar(pSprite, var_owner, pPlayer);
        set_entvar(pSprite, var_aiment, pPlayer);
        set_entvar(pSprite, var_body, iAttachment);
        
        engfunc(EngFunc_SetModel, pSprite, szModel);
        dllfunc(DLLFunc_Spawn, pSprite);
        
-       set_entvar(pSprite, var_effects, get_entvar(pSprite, var_effects) | EF_OWNER_NO_VISIBILITY);

        return pSprite;
    }
EF_OWNER_NO_VISIBILITY убрал - так как с ним спрайт вообще не отображается (непонятно зачем это) и добавил var_framerate , так как без него у меня анимация не стартует - и по общему кву ентитей вижу что они у меня не удаляются :dntknw:
 
Сообщения
847
Реакции
530
Помог
13 раз(а)
BalbuR,
Код:
stock UTIL_DrawMuzzleFlash(const pPlayer, const szModel[], const iAttachment = 1, const Float: flScale = 0.08, const Float: flFramerateMlt = 2.0, const Float: flColor[3] = { 0.0, 0.0, 0.0 }, const Float: flBrightness = 255.0)
{
        if (!strlen(szModel))
            return NULLENT;
       
        if (gl_iMaxEntities - engfunc(EngFunc_NumberOfEntities) <= LOWER_LIMIT_OF_ENTITIES)
            return NULLENT;

        new pSprite = rg_create_entity(MUZZLEFLASH_REFERENCE);
       
        if (is_nullent(pSprite))
            return NULLENT;
       

        set_entvar(pSprite, var_classname, MUZZLEFLASH_CLASSNAME);
        set_entvar(pSprite, var_spawnflags, SF_SPRITE_ONCE);
       
+        new Float: flFrames = float(engfunc(EngFunc_ModelFrames, engfunc(EngFunc_ModelIndex, szModel)))
+        set_entvar(pSprite, var_framerate, flFrames * flFramerateMlt);
       
        set_entvar(pSprite, var_rendermode, kRenderTransAdd);
        set_entvar(pSprite, var_rendercolor, flColor);
        set_entvar(pSprite, var_renderamt, flBrightness);
        set_entvar(pSprite, var_scale, flScale);
        set_entvar(pSprite, var_owner, pPlayer);
        set_entvar(pSprite, var_aiment, pPlayer);
        set_entvar(pSprite, var_body, iAttachment);
       
        engfunc(EngFunc_SetModel, pSprite, szModel);
        dllfunc(DLLFunc_Spawn, pSprite);
       
-       set_entvar(pSprite, var_effects, get_entvar(pSprite, var_effects) | EF_OWNER_NO_VISIBILITY);

        return pSprite;
    }
EF_OWNER_NO_VISIBILITY убрал - так как с ним спрайт вообще не отображается (непонятно зачем это) и добавил var_framerate , так как без него у меня анимация не стартует - и по общему кву ентитей вижу что они у меня не удаляются :dntknw:
ED_FreeEdict хукни и посмотри удаление объектов
 
Сообщения
260
Реакции
129
Помог
12 раз(а)
BalbuR, Вот написал упрощенный плагин для теста и у меня кво ентитей растет и видно что во фри едикт музлы не попадают.

Можешь указать действительный путь к спрайту и у себя попробовать скомпилить и пострелять с калаша что будет.


Код:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <reapi>

new const MUZZLEFLASH_REFERENCE[] = "env_sprite"
new const MUZZLEFLASH_CLASSNAME[] = "test_custom_mf"
new const MUZZLEFLASH_SPRITE[] =     "sprites/x_re/muzzleflash63.spr"
new gl_iMaxEntities
#define LOWER_LIMIT_OF_ENTITIES            100
#define UPDATE 1.0
new bool:g_isdeletemf

public plugin_init() {
    register_plugin("Test custom muzzleflash","1.0.0","MurLemur")
    RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_ak47", "Ham_Weapon_PrimaryAttack_Post", true)
    RegisterHookChain(RH_ED_Free, "Edict_Free")
    set_task(UPDATE, "ShowInfo", .flags="b")
    gl_iMaxEntities = global_get(glb_maxEntities)
}

public plugin_precache()
    engfunc(EngFunc_PrecacheModel, MUZZLEFLASH_SPRITE)

public Edict_Free(iEnt)
{
    if(FClassnameIs(iEnt, MUZZLEFLASH_CLASSNAME))
        g_isdeletemf = true
}

public Ham_Weapon_PrimaryAttack_Post(iItem)
{
    static iPlayer
    iPlayer = get_member(iItem, m_pPlayer)
    UTIL_DrawMuzzleFlash(iPlayer, MUZZLEFLASH_SPRITE)
}

stock UTIL_DrawMuzzleFlash(const pPlayer, const szModel[], const iAttachment = 1, const Float: flScale = 0.08, const Float: flFramerateMlt = 2.0, const Float: flColor[3] = { 0.0, 0.0, 0.0 }, const Float: flBrightness = 255.0)
 {
        if (!strlen(szModel))
            return NULLENT;
        
        if (gl_iMaxEntities - engfunc(EngFunc_NumberOfEntities) <= LOWER_LIMIT_OF_ENTITIES)
            return NULLENT;

        new pSprite = rg_create_entity(MUZZLEFLASH_REFERENCE);
        
        if (is_nullent(pSprite))
            return NULLENT;
        

        set_entvar(pSprite, var_classname, MUZZLEFLASH_CLASSNAME);
        set_entvar(pSprite, var_spawnflags, SF_SPRITE_ONCE);
        
        new Float: flFrames = float(engfunc(EngFunc_ModelFrames, engfunc(EngFunc_ModelIndex, szModel)))
        set_entvar(pSprite, var_framerate, flFrames * flFramerateMlt);
        
        set_entvar(pSprite, var_rendermode, kRenderTransAdd);
        set_entvar(pSprite, var_rendercolor, flColor);
        set_entvar(pSprite, var_renderamt, flBrightness);
        set_entvar(pSprite, var_scale, flScale);
        set_entvar(pSprite, var_owner, pPlayer);
        set_entvar(pSprite, var_aiment, pPlayer);
        set_entvar(pSprite, var_body, iAttachment);
        
        engfunc(EngFunc_SetModel, pSprite, szModel);
        dllfunc(DLLFunc_Spawn, pSprite);
        
        //set_entvar(pSprite, var_effects, get_entvar(pSprite, var_effects) | EF_OWNER_NO_VISIBILITY);

        return pSprite;
   }   

public ShowInfo() {
    set_dhudmessage(0, 255, 255, 0.0, 0.0, _, _, UPDATE)
    show_dhudmessage(0, "Is delete MF: %s ^nEntity count: %d ", g_isdeletemf ? "true" : "false", engfunc(EngFunc_NumberOfEntities))
}
 
Сообщения
847
Реакции
530
Помог
13 раз(а)
C#:
set_entvar(pSprite, var_dmgtime, flFrames/flFramerateMlt);
добавь вот это
 
Сообщения
260
Реакции
129
Помог
12 раз(а)
BalbuR, добавил, но ничего не поменялось.
 
Сообщения
260
Реакции
129
Помог
12 раз(а)
BalbuR, Что не удаляется сам спрайт уже прояснили. Теперь еще немного хочу упорядочить кашу в голове ... Фреймы даже в этом случае сервер же переключает, а не клиент ? То есть избавляться от синка особо и нету смысла , и еще раз так то и вместо env_sprite может лучше использовать info_target или это точно без разницы. Просто хочу несколько оружий себе переписать и определиться как оптимальнее музлики организовать.
 
Сообщения
847
Реакции
530
Помог
13 раз(а)
Фреймы даже в этом случае сервер
сервер

вместо env_sprite может лучше использовать info_target
на info_target конечно можно, но тогда при спавне он не будет работать как env_sprite (логики не будет очевидно)
а как болванка очень даже хорошо
 

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

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