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

Сообщения
248
Реакции
125
Помог
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
 
Сообщения
821
Реакции
510
Помог
12 раз(а)
убрать SetThink и задать pev_spawnflags = SF_SPRITE_ONCE
3 Авг 2024
спрайт, который ты присоединяешь к игроку всегда будет ЗА view моделью
увы, иначе никак
попроси моделлеров сделать эффекты в модели
 
Сообщения
248
Реакции
125
Помог
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) естественно убирается.

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

Вложения

Сообщения
635
Реакции
534
Предупреждения
2
Помог
9 раз(а)
p_ моделью нужно дополнительно создать entity и цеплять
Ничего дополнительно создать и цеплять не надо. Энтити оружие и так цепляются к игроку (остаётся только убрать nodraw и установить моделку)
 
Сообщения
248
Реакции
125
Помог
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 ?
 
Сообщения
248
Реакции
125
Помог
12 раз(а)
убрать SetThink и задать pev_spawnflags = SF_SPRITE_ONCE
3 Авг 2024
спрайт, который ты присоединяешь к игроку
Поидее после проигрывания анимации установится флаг EF_NODRAW, но сама ентитя не удалиться же.
И раз она не удалиться можно ли как то потом снова ее использовать, кроме как запустить вручную синк в котором менять фреймы ?
И как такой вариант будет по производительности ? То есть что лучше держать одну приатаченую энтитю и проигрывать ей анимации при выстрелах, или же каждый раз создавать атачить энтитю и убивать после проигрывания анимации ?

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

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

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

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

Просто видел в дискорде что вы эту тему обсуждали и оппонент рекомендовал не использовать синки для переключения фреймов музлфлеша, а отдать это на откуп движку - но примера он не привел и у я хз как правильно сделать
 
Сообщения
821
Реакции
510
Помог
12 раз(а)
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;
    }
Вчера в 18:02
BalbuR, Ну я в предидущем посте пробовал взять для примера тот же charger5 и закомментил тот кусочек кода в синке и оно перестает работать значит не удаляется ...
Или может у тебя есть какой-то пример рабочий с CUSTOM MUZZLEFLASH под рукой есть где удаляется само, может там еще какие-то нюансы есть ?

Просто видел в дискорде что вы эту тему обсуждали и оппонент рекомендовал не использовать синки для переключения фреймов музлфлеша, а отдать это на откуп движку - но примера он не привел и у я хз как правильно сделать
реализация не важна, главное не засрать клиенту канал в моменте
 
Сообщения
248
Реакции
125
Помог
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:
 
Сообщения
821
Реакции
510
Помог
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:
ED_FreeEdict хукни и посмотри удаление объектов
 

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

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