Кольцо

Сообщения
1,549
Реакции
1,554
Помог
2 раз(а)
Вопрос к знатокам )

Вот я вешаю pev_aiment на спрайтовое кольцо
Мне нужно в любом случаи, что-бы кольцо постоянно следовало за моделью

Дело в том,что в таком случаи я абсолютно не могу приподнять кольцо кодом и оно крепится за моделью и я вижу его в игре вкопаное в землю ровно в половину его размера

Я пошёл на хитрость - и попросту увеличил низ рисунка вот так

123.jpg

Получил в игре следующее

cstrike 2022-04-10 00-44-29-18.jpg

Модель бомбы я то подниму в центр кольца...

Но потом при ближней позиции я вижу его вот так - ну тут понятно, что из за того черного добавленного низа

cstrike 2022-04-10 00-44-47-61.jpg

И вопрос таков: Как мне сохранить pev_aiment и не редактируя спрайт кольца сделать его нормальной видимостью с близкого расстояния,что-бы оно было постоянно в центре бомбы? ?

С моделью вместо спрайта - там проще и никаких проблем нет.
Но как быть со спрайтом?
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
MayroN, можно черную область не использовать в спрайте, там как-то можно через оффсет выставить в файле спрайта. А по сабжу, попробуй Parallel Upright флаг, либо центрировать модель. https://www.the303.org/tutorials/gold_sprite.htm
 
Сообщения
1,549
Реакции
1,554
Помог
2 раз(а)
fl0wer,
Спасибо - буду идти до победного ?
 
Сообщения
1,549
Реакции
1,554
Помог
2 раз(а)
попробуй Parallel Upright флаг
Конечно это не совсем то,я уже знал к чему здесь готовится - но,если сравнивать с предыдущим вариантом,то это решает проблему,но сам понимаешь какой вид будет сверху

cstrike 2022-04-10 02-03-14-83.jpg

либо центрировать модель
тоже самое получится,если я правильно тебя понял - поднимаем модель - двигается автоматом и сам спрайт - далее уже подвласно с чёрным низом или
через оффсет выставить в файле спрайта
Мне бы Параллельно закрыть нюанс с этим отдалением

Или

Убрать aiment - всё чётко,но потом с плагином физика оружия...Хотя стой же )))

Если я всё правильно сообразил - можна сделать следующее
Убираем aiment,оставляем оригинальный спрайт без чёрного низа - всё чётко как мы хотели,и потом кольцо рисовать только как бомба коснулась земли со всеми значениями по центру + выключать полностью "физику оружия" для backpack - прижки по земле,стрельбу и взрыв с гранаты.

Радуемся,правда?)
 
Сообщения
397
Реакции
221
Помог
13 раз(а)
MayroN, ну вообще по логике зачем тебе тут *_aiment?
Если тебе требуется отобразить спрайт на пачке --лови ёё дроп, вешай think, в теле think`a смотри, чтобы она была на земле. Как только коснулась земли создавай "вещественный" спрайт и удаляй think. В нём смысла больше нет. При создании "вещественного" спрайта выставляй уже как тебе надо:

-Размер
-Координаты
-Цвет
И т.п.

Ну а удалить спрайт можно в момент когда пачку подняли или закончился раунд
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
лови ёё дроп, вешай think, в теле think`a смотри, чтобы она была на земле
Проще будет повесить touch, как только коснется поверхности - задать спрайт единожды, без всяких think'ов и проверок на то, что она находится на земле.

Но потом при ближней позиции я вижу его вот так - ну тут понятно, что из за того черного добавленного низа
Спрайт 2д-объект же, иначе ты его и не увидишь.
Если есть различные сценарии расположения спрайта - создавай несколько кадров, при определенных условиях выставляй нужный кадр.
 
Последнее редактирование:
Сообщения
839
Реакции
519
Помог
12 раз(а)
Проще будет повесить touch, как только коснется поверхности - задать спрайт единожды, без всяких think'ов и проверок на то, что она находится на земле.
а потом какой-нибудь hl weapon physics пнет твою бомбу за тридевять земель
лучше конечно проверять
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
а потом какой-нибудь hl weapon physics пнет твою бомбу за тридевять земель
лучше конечно проверять
Не было речи об использовании подобных плагинов. Я говорю как нужно делать в самом стандартном случае. Если есть какие-то вещи, изменяющие стандартную физику, то будьте добры сами учитывать их.
 
Сообщения
1,549
Реакции
1,554
Помог
2 раз(а)
Ну вот поэтому,мне был изначально и нужен aiment,потому что плагин физики оружий стоит.Потом понял,что можно сделать по-другому - выключить отдельно для пачки физику...

Там ещё не только нужно учитывать касание земли,а ещё и стены,причём стены не ровные могут быть,ибо потом происходит дублирование спрайтов кольца

Там мне делал один код парень с Оленей - но это был не достаточно харош вариант для меня - всёравно,там при стрельбе к примеру по бомбе,когда она отскакивала,кольцо было в изначальной позиции,а потом уже в нужной при касании с землёй, задержка этого таска..ну такое себе

Но плагин вызывал Краш : Ed_alloc: No Free Edicts


Код:
#pragma semicolon 1

#include <amxmodx>
#include <fakemeta>
#include <engine>
#include <xs>

new g_Backpack_SmokeSprite;

#define BOMB_PACK_ICON        "sprites/backpack_smoke/backpack_ring.spr"
#define RING_CLASSNAME        "Bomb_Ring"

#define RING_BOMB_ENTITY    pev_iuser1

new Float:fColor[][3] =
{
    {255.0, 0.0, 0.0},
    {0.0, 0.0, 255.0},
    {0.0, 255.0, 0.0},
    {255.0, 255.0, 6.0},
    {255.0, 0.0, 255.0}
};

public plugin_init()
{  
    register_touch("worldspawn", "weaponbox", "weaponboxTouch");
    register_think(RING_CLASSNAME, "ringThink");
}

public plugin_precache()
{
    g_Backpack_SmokeSprite = precache_model("sprites/backpack_smoke/backpack_smoke.spr");
    precache_model(BOMB_PACK_ICON);
}

public weaponboxTouch(iWorldSpawn, iBombEntity)
{
    if(!pev_valid(iBombEntity))
        return PLUGIN_HANDLED;
       
    static szBombModel[32];
    pev(iBombEntity, pev_model, szBombModel, charsmax(szBombModel));
    if(containi(szBombModel, "w_backpack") == -1)
        return PLUGIN_HANDLED;
       
    if(pev(iBombEntity, pev_flags) & ~FL_ONGROUND)
        return PLUGIN_HANDLED;
       
    static Float:vecOrigin[3];
    pev(iBombEntity, pev_origin, vecOrigin);
       
    // lie flat code ^^
    static Float:fTraceTo[3], Float:fFraction;
    xs_vec_sub(vecOrigin, Float:{0.0, 0.0, 10.0}, fTraceTo);
   
    engfunc(EngFunc_TraceLine, vecOrigin, fTraceTo, IGNORE_MONSTERS, iBombEntity, 0);
    get_tr2(0, TR_flFraction, fFraction);
    if(fFraction == 1.0)
        return PLUGIN_HANDLED;
       
    static bombEntity;bombEntity = pev(iBombEntity, RING_BOMB_ENTITY);
    if(bombEntity)
    {
        if(bombEntity > get_maxplayers())
        {
            remove_task(iBombEntity);
            set_task(0.5, "makeBombFloat", iBombEntity);
        }
        return PLUGIN_HANDLED;
    }
    switch(random_num(0, 1))  
    {
        case 0:
        {
            remove_task(iBombEntity);
           
            set_pev(iBombEntity, RING_BOMB_ENTITY, pev(iBombEntity, pev_owner));
            smokeEffect(iBombEntity);
        }
        case 1:  
        {      
            new iEnt = create_entity("env_sprite");
            if(pev_valid(iEnt))
            {
                set_pev(iBombEntity, RING_BOMB_ENTITY, iEnt);
               
                remove_task(iBombEntity);
                set_task(0.5, "makeBombFloat", iBombEntity);
            }
        }
    }
    return PLUGIN_HANDLED;
}

public makeBombFloat(iBombEntity)
{
    if(!pev_valid(iBombEntity))
        return;
       
    static Float:vecOrigin[3], iRingEntity;iRingEntity = pev(iBombEntity, RING_BOMB_ENTITY);
    pev(iBombEntity, pev_origin, vecOrigin);
    vecOrigin[2] += 30.0;
    engfunc(EngFunc_SetOrigin, iBombEntity, vecOrigin);
   
    // use this to change the ring origin, so you can make the bomb be right in the middle
    vecOrigin[2] += 0.0;
    engfunc(EngFunc_SetOrigin, iRingEntity, vecOrigin);

    set_pev(iRingEntity, pev_classname, RING_CLASSNAME);
    engfunc(EngFunc_SetOrigin, iRingEntity, vecOrigin);
    engfunc(EngFunc_SetModel, iRingEntity, BOMB_PACK_ICON);
    set_pev(iRingEntity, pev_solid, SOLID_NOT);
    set_pev(iRingEntity, pev_movetype, MOVETYPE_FLY);
    set_pev(iRingEntity, pev_nextthink, get_gametime());
    set_pev(iRingEntity, RING_BOMB_ENTITY, iBombEntity);
    set_pev(iRingEntity, pev_rendercolor, fColor[random_num(0, charsmax(fColor))]);
}

public smokeEffect(iBombEntity)
{
    if(!pev_valid(iBombEntity))
        return;
   
    static Float:vecOrigin[3];
    pev(iBombEntity, pev_origin, vecOrigin);
   
    engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vecOrigin, 0);
    write_byte(TE_FIREFIELD);
    engfunc(EngFunc_WriteCoord, vecOrigin[0]);
    engfunc(EngFunc_WriteCoord, vecOrigin[1]);
    engfunc(EngFunc_WriteCoord, vecOrigin[2] += 15.0);
    write_short(2);
    write_short(g_Backpack_SmokeSprite);
    write_byte(1);
    write_byte(TEFIRE_FLAG_ALLFLOAT | TEFIRE_FLAG_ALPHA);
    write_byte(10);
    message_end();
   
    set_task(0.3, "smokeEffect", iBombEntity);
}

public ringThink(ent)  
{
    if(!pev_valid(ent))
        return;
   
    if(!pev_valid(pev(ent, RING_BOMB_ENTITY)))  
    {
        remove_entity(ent);
        return;
    }
   
    set_pev(ent, pev_nextthink, get_gametime() + 0.5);
}

Потом я подумал,что может сделать так лучше с сохранением физики для всех оружий,но выключением для пачки - и тогда убираем аимент и кольцо такое,как нам нужно без редактирования
Если я всё правильно сообразил - можна сделать следующее
Убираем aiment,оставляем оригинальный спрайт без чёрного низа - всё чётко как мы хотели,и потом кольцо рисовать только как бомба коснулась земли со всеми значениями по центру + выключать полностью "физику оружия" для backpack - прижки по земле,стрельбу и взрыв с гранаты
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
MayroN, не проще модель кольца сделать? Как раз и смещение координат по пачке своей верное сделаешь.
Там ещё не только нужно учитывать касание земли,а ещё и стены,причём стены не ровные могут быть,ибо потом происходит дублирование спрайтов кольца
Ограничивать переменной или обрубать тач.
Там мне делал один код парень с Оленей - но это был не достаточно харош вариант для меня - всёравно,там при стрельбе к примеру по бомбе,когда она отскакивала,кольцо было в изначальной позиции,а потом уже в нужной при касании с землёй, задержка этого таска..ну такое себе
Обрабатывать лучше уже в think'e тогда уж. В коде глупое сочетание fm и engine, что мягко намекает на небрежность автора кода.
10 Апр 2022
А падает сервер, судя по ошибке, из-за большого количества созданных энтити или из-за невозможности высвободить память при удалении энтити.
 
Сообщения
91
Реакции
141
Помог
1 раз(а)
Если нужно поднять спрайт который будет следовать за игроком, но при этом ты не можешь ему поменять никак высоту (да через тот же origin например), достаточно декомпильнуть спрайт с .qc файлом и там будет у каждого фрейма свой origin и size, вот первое нам и надо.
Пример ниже, 2 одних и тех же спрайта, однако у одного из них я изменил origin в самом .qc файле спрайта и затем в игре спрайт стоит на нормальном месте.

Чтобы при декомпиле спрайта получить его исходник .qc, можешь использовать Sprite Viewer от сюда https://dev-cs.ru/threads/222/page-10#post-85659
Также и компилировать Sprite Maker с этого же архива и будет тебе счастье
 

Download all Attachments

Сообщения
1,549
Реакции
1,554
Помог
2 раз(а)
t3rkecorejz,
Хорошо - попробуем и твой вариант
Скопировал спрайт в папку со всем тем добром
Получил qc - изменил с 32 на 64
Код:
$spritename    backpack_ring
$type          vp_parallel
$texture       indexalpha
$load        backpack_ring000001
$frame        -32   64   64   64
Компильнул и получил вообще другое
Код:
$spritename    backpack_ring
$type          vp_parallel_upright
$texture       normal
$load        backpack_ring000001
$frame        -32   32   64   64
Но..Ты хочешь сказать,что я не буду наблюдать его отделение от ближней позиции + видом сверху,как я скинул пример в первом посте на последнем скриншоте и будет мне счастье?)

не проще модель кольца сделать?
То всёравно - вид сверху меня не устраивает
Оно же будет моделью сверху вот так показывать

1649613372246.png
 
Последнее редактирование:
Сообщения
494
Реакции
341
Помог
11 раз(а)
То всёравно - вид сверху меня не устраивает
Смотря какой угол для энтити задашь.
Спрайт с любой позиции отображается одинаково, потому что он объект 2д, модель же 3д, в распоряжении получает третью координату, что дарит ей визуальную объёмность.
 
Сообщения
1,549
Реакции
1,554
Помог
2 раз(а)
bizon,
да я уже решил - прейдётся убирать этот не нужный аимент и делать с тачем с тем всем что говорил в 4м посте в самом конце
Потому,что даже с тем вариантом,что скинул t3rkecorejz - спрайт смотрится также с отклонениями вбок при ближней позиции,а сверху вообще на земле лежит - по сути тоже самое,что и я дорисовывал чёрный низ...
Такие дела

В любом случаи - всем спасибо за ответы
 
Сообщения
3,579
Реакции
1,569
Помог
137 раз(а)
Если нужно поднять спрайт который будет следовать за игроком, но при этом ты не можешь ему поменять никак высоту (да через тот же origin например), достаточно декомпильнуть спрайт с .qc файлом и там будет у каждого фрейма свой origin и size, вот первое нам и надо.
Пример ниже, 2 одних и тех же спрайта, однако у одного из них я изменил origin в самом .qc файле спрайта и затем в игре спрайт стоит на нормальном месте.

Чтобы при декомпиле спрайта получить его исходник .qc, можешь использовать Sprite Viewer от сюда https://dev-cs.ru/threads/222/page-10#post-85659
Также и компилировать Sprite Maker с этого же архива и будет тебе счастье
Сделал всё как ты описал, но спрайт не меняет origin при компиляции. Почему так может быть? После компиляции, при просмотре через HL Texture Tools остается такой же origin, как до редактирования, хотя в .qc вообще другой.
 
Сообщения
91
Реакции
141
Помог
1 раз(а)
Nordic Warrior, нужно переделать origin во всем .qc файле, затем скомпилировать спрайт по .qc файлу, то есть сама команда в консоль будет такова:
Код:
Sprite_Maker.exe -qc <qc_file>
 
Сообщения
3,579
Реакции
1,569
Помог
137 раз(а)
t3rkecorejz, а, так вот оно что. Я компилировал просто перенося qc на программу. Через консоль всё нормально. Спасибо.
 

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

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