Помогите разобраться с лазерными лучами

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
259
Реакции
129
Помог
12 раз(а)
Изучаю плагины с лазерными минами и вижу что лучи реализованы либо с помощью msg TE_BEAMPOINTS , либо через entity .

1. Как пример плагин мин https://dev-cs.ru/resources/1442/ здесь через TE_BEAMPOINTS и когда смотришь на лучи они постоянно мигают , так как пересоздаются заново, что не очень приятно глазу.
2. В другом плагине создается через энтити "beam" с флагом FL_CUSTOMENTITY приблизительно так
Код:
new beam = rg_create_entity("beam")    
        
    if (is_nullent(beam))
        return 
    
    set_entvar(beam, var_origin, vecSrc)
    engfunc(EngFunc_SetModel, beam, get_entvar(ent,EV_TM_team) == 1 ? MODELS[RED] : MODELS[BLUE]);
    engfunc(EngFunc_SetSize, beam, vecMins, vecMaxs);
    
    set_entvar(beam, var_flags, get_entvar(beam, var_flags) | FL_CUSTOMENTITY);
    set_entvar(beam, var_scale, BEAM_WIDTH)
    set_entvar(beam, var_rendercolor, Float: {255.0, 255.0, 255.0})
    set_entvar(beam, var_rendermode, 0);     
    set_entvar(beam, var_animtime, 255.0)
    set_entvar(beam, var_renderamt, BEAM_BRIGHT)    
    set_entvar(beam, var_angles, vecOrigin)
    set_entvar(beam, var_owner,ent)
    set_entvar(beam, EV_TM_mineId,get_entvar(ent,EV_TM_mineId))
    set_entvar(beam, var_nextthink,get_gametime() + 0.1)

Так вот такой луч не мигает, глазу приятно смотреть. Но начиная с 65 луча он не отрисовывается на клиенте и отрисуется 65 , если какой то из предидущих уничтожить. Почему не знаю - но может кто знающий обьяснит почему так и можно ли это как то обойти.

Так же хотел еще попробовать создавать env_beam или env_laser, но немогу найти ни одного примера с реализацией рабочей ...
Нашел такую :
Код:
#include <amxmodx>
#include <fakemeta>
#include <engine>
#include <reapi>

#define PLUGIN "LaserTest"
#define VERSION "0.00001"
#define AUTHOR "Unnamed"

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    register_clcmd("spawn_laser", "create_laser")
}

public create_laser(id)
{
    new Float:vOrigin[3]
    get_entvar(id, var_origin, vOrigin)
    vOrigin[1] += 100.0
    new newent1 = create_entity("info_target")
    set_pev(newent1, pev_origin, vOrigin)
    DispatchKeyValue(newent1,"targetname","lasertarg1")
    DispatchSpawn( newent1 )

        
    new newent2 = create_entity("env_laser")
    
    vOrigin[1] += 400.0
    set_pev(newent2, pev_origin, vOrigin)
    DispatchKeyValue(newent2,"spawnflags","49")
    DispatchKeyValue(newent2,"targetname","my_laser")
    DispatchKeyValue(newent2,"renderfx","0")
    DispatchKeyValue(newent2,"LaserTarget","lasertarg1")
    DispatchKeyValue(newent2,"renderamt","188")
    DispatchKeyValue(newent2,"rendercolor","255 0 0")
    DispatchKeyValue(newent2,"Radius","256")
    DispatchKeyValue(newent2,"life","0")
    DispatchKeyValue(newent2,"Width","25")
    DispatchKeyValue(newent2,"NoiseAmplitude","0")
    DispatchKeyValue(newent2,"texture","sprites/laserbeam.spr")
    DispatchKeyValue(newent2,"TextureScroll","35")
    DispatchKeyValue(newent2,"framerate","0")
    DispatchKeyValue(newent2,"framestart","0")
    DispatchKeyValue(newent2,"StrikeTime","1")
    DispatchKeyValue(newent2,"damage","500")   
    DispatchSpawn( newent2 )

    client_print(0, print_chat, "Laser spawned")
    return PLUGIN_HANDLED
}

public plugin_precache()
    precache_model("sprites/laserbeam.spr")

Походу энтитя создается так как урон наносит и видно 2 конца с искорками, но сам луч не видно. Может у кого есть рабочий пример который можно было бы пощупать ? И так же вопрос почему не использут в минах эти энтити ?

Что бы вы рекомендовали использовать в качестве реализации луча и почему ?
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Лучше использовать энтити и не флудить мессагой каждые 0.1 (обычно).
Из багов энтити: если конец луча далеко (за пределами PVS), то луч будет смотреть в 0 0 0, так как эта энтити не передается на клиент, в игре отображается, что по карте рэндомные лучи разбросаны сквозь карту.
Фикс: поставить форс визабилити флаг в эффектах.
 
Сообщения
75
Реакции
36
Помог
4 раз(а)
Вот удобный инк для работы с лучами, можешь вбивать название стоков в гугле и так найдешь примеры использования
 

Вложения

Сообщения
259
Реакции
129
Помог
12 раз(а)
CSBishop, так я и тот кусочек создания ентити с beams.inc считай и выдрал , только без визабилити. Но у меня затык когда кол-во лучей превышает 64 - они не отображаются, может я что то еще пропустил.
Ну и все же интересно узнать о env_beam или env_laser , может как то можно и с помощью них сделать - ну например в лазере же искорки есть , а так придется месагой досылать. Видимо что то с ними не так раз не используют ...
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
CSBishop, так я и тот кусочек создания ентити с beams.inc считай и выдрал , только без визабилити. Но у меня затык когда кол-во лучей превышает 64 - они не отображаются, может я что то еще пропустил.
Ну и все же интересно узнать о env_beam или env_laser , может как то можно и с помощью них сделать - ну например в лазере же искорки есть , а так придется месагой досылать. Видимо что то с ними не так раз не используют ...
Не используют скорее всего потому что сложная технология. А искры рил могут не работатьь.
 
Сообщения
75
Реакции
36
Помог
4 раз(а)
murlemur, возможно дело в том что кол-во энтов которое отображается игроку превысило лимит (на сколько я помню это клиентские лимиты и игрок не может видеть одновременно больше N кол-ва энтити одновременно, возможно не прав)
 
Сообщения
259
Реакции
129
Помог
12 раз(а)
У меня есть одна догадка насчет этого - возможно это максимальное число энтитей с флагом FL_CUSTOMENTITY которые одновременно может отобразить клиент.
А без этого флага не получается "beam" создать , да с этим флагом можно вместо
rg_create_entity("beam") другие ентити писать все равно будет выглядеть так же ...

На счет env_beam и env_laser вычитал что env_beam пробивает через другие энтити - так что точно не наш вариант. А вот на счет env_laser возможно еще не используется потому что к нему обязательно в пару создавать target энтитю.
 
Сообщения
259
Реакции
129
Помог
12 раз(а)
В общем путем проб и ошибок таки получилось заспавнить env_laser и оставить искру только в конце луча - выглядит как то так :
env_laser.jpg

Но у меня не получается на re переписать, свою неудачную попытку я закоментил ...

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

#define PLUGIN "LaserTest"
#define VERSION "0.00001"
#define AUTHOR "Unnamed"

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    register_clcmd("spawn_laser", "create_laser")
}

public create_laser(id)
{
    new Float:vOrigin[3]
    get_entvar(id, var_origin, vOrigin)
    vOrigin[1] += 100.0
    new newent1 = create_entity("info_target")
    set_pev(newent1, pev_origin, vOrigin)
    DispatchKeyValue(newent1,"targetname","lasertarg1")
    DispatchSpawn( newent1 )

    vOrigin[1] += 200.0
    
/*     new beam = rg_create_entity("env_laser")   
    
    set_entvar(beam, var_origin, vOrigin)
    
    set_entvar(beam, var_spawnflags, 33)
    set_entvar(beam, var_renderamt, 255.0)
    set_entvar(beam, var_rendercolor, Float: {255.0, 0.0, 0.0})   
    engfunc(EngFunc_SetModel, beam, "sprites/laserbeam.spr")
    set_entvar(beam, var_framerate, 35.0)
    set_entvar(beam, var_takedamage, 0.0)
    set_entvar(beam, var_scale, 1.0)
    set_entvar(beam, var_targetname, "lasertarg1") */

    
     new newent2 = create_entity("env_laser")
    
    set_pev(newent2, pev_origin, vOrigin)
    
    DispatchKeyValue(newent2,"spawnflags","33")
    DispatchKeyValue(newent2,"renderamt","200")
    DispatchKeyValue(newent2,"rendercolor","255 0 0")
    DispatchKeyValue(newent2,"texture","sprites/laserbeam.spr")
    DispatchKeyValue(newent2,"TextureScroll","35")
    DispatchKeyValue(newent2,"damage","0")
    DispatchKeyValue(newent2,"width","15")
    DispatchKeyValue(newent2,"LaserTarget","lasertarg1")
    DispatchSpawn( newent2 )

    client_print(0, print_chat, "Laser spawned")
    return PLUGIN_HANDLED
}

public plugin_precache()
    precache_model("sprites/laserbeam.spr")
 
Сообщения
839
Реакции
519
Помог
12 раз(а)
DLLFunc_Spawn где потерял

24 строка у тебя спавнит объект, а в своем примере ты ничего не спавнишь

спавн и создание объект - разные вещи если что
при первом варианте подгружаются данные из геймлибы/движка, которые обрабатывают стандартно-заданную логику объекта, до этого момента объект является простой болванкой
 
Сообщения
259
Реакции
129
Помог
12 раз(а)
Потестил на количество лучей env_laser и могу сказать такие штуки :

1) Да, ограничение видимости есть тоже в 64 луча , но если отойти в другую часть карты, то там новые лучи видно.
2) Это ограничение действует именно на лучи, причем не важно как луч создавался либо env_laser либо beam. То есть вы создали в одном месте 64 луча через env_laser, и если далее создавать что beam, что laser они не отобразятся в этой области карты, пока не уничтожить предидущие лучи. Но тем не менее в этой же области другие ентити, к примеру func_breakable, будут без проблем создаваться видимыми.

3) Еще одно наблюдение если создавать через msg SVC_TEMPENTITY лучи , ну и указать там 0 в lifetime то таких лучей можно наштамповать и более 64 штук в одном месте. Но их нужно будет обновлять так, как если отойти на расстояние то видимость у них пропадет , и сама не вернется.
Вот тут у меня тоже кстати вопрос к опытным скриптерам , понятно по таймеру можно засылать обновляющие месаги, но можно ли как то это делать "умнее" ? (типо плеер вошел в зону с лучами - и нужному плееру пошли месаги ...) - я пока такой возможности не вижу ...
 
Сообщения
259
Реакции
129
Помог
12 раз(а)
Ограничение в 64 луча насколько я вычитал, это в самом клиенте есть параметр MAX_BEAMS , и в кастомных клиентах он может быть и увеличен.
Почему не испульзуется env_laser я понял когда попробовал сделать с помощью него забор - но лучи как то не совсем корректно упираются в преграду, в каком то месте работает а в каком то нет и они - то ли огибают толи просачиваются через игрока.

Хотя может для чего то другого этот объект и пригодиться. Если создать несколько меток с одинаковым именем и указать целью для лазера то он сам будет между ними переключаться ...

В общем если кому будет интересно поиграться с env_laser оставляю переписаный пример без engine :

Код:
#include <amxmodx>
#include <fakemeta>
#include <fakemeta_util>
#include <reapi>
#include <xs>

public plugin_init() {
    register_plugin("Test laser ent", "1.0", "MurLemur")
    register_clcmd("spawn_laser", "create_laser")
}   

public create_laser(id)
{
    new Float:vOrigin[3]
    _get_forward_origin(id, vOrigin, 245.0)
    
    new it = rg_create_entity("info_target")
    set_entvar(it, var_origin, vOrigin)
    set_entvar(it, var_targetname, fmt("target%d",it))
    dllfunc(DLLFunc_Spawn, it)

    _get_forward_origin(id, vOrigin, 50.0)
    
      new beam = rg_create_entity("env_laser")   
    
    set_entvar(beam, var_origin, vOrigin)
    
    set_entvar(beam, var_spawnflags, 33)  // можно указать доп параметры , как пример наличие искр в начальной или конечной точке ентити
    set_entvar(beam, var_renderamt, 255.0)
    set_entvar(beam, var_rendercolor, Float: {255.0, 0.0, 0.0})   
    engfunc(EngFunc_SetModel, beam, "sprites/laserbeam.spr")
    set_entvar(beam, var_framerate, 35.0)
    set_entvar(beam, var_dmg, 150.0)
    set_entvar(beam, var_scale, 15.0)
    fm_set_kvd(beam, "LaserTarget",fmt("target%d",it) )   
    
    dllfunc(DLLFunc_Spawn, beam)

    client_print(0, print_chat, "Laser spawned")
    return PLUGIN_HANDLED
}

public plugin_precache()
    precache_model("sprites/laserbeam.spr") 
    
stock _get_forward_origin(id, Float: forward_origin[3], Float: dist)
{
    static Float:origin[3], Float:view_ofs[3]
    pev(id, pev_origin, origin)
    pev(id, pev_view_ofs, view_ofs)

    static Float:view_pos[3]
    xs_vec_add(origin, view_ofs, view_pos)

    static Float:v_angle[3]
    pev(id, pev_v_angle, v_angle)

    engfunc(EngFunc_MakeVectors, v_angle)

    static Float:v_vector[3]
    global_get(glb_v_forward, v_vector)

    xs_vec_add_scaled(view_pos, v_vector, dist, forward_origin)
}
18 Сен 2023
После этих экспериментов у меня появилась новая идея и в связи с этим и новый вопрос.
Если создавать луч энтитей beam либо через месагу крепить к энтите info_target приходится еще засылать TE_SPARK на конец луча.

Можно ли программно прикрутить к энтите event 5002 (spark effect) потипу того как цепляют в mdl моделях через qc MuzzleFlash и звуки ?
 
Статус
В этой теме нельзя размещать новые ответы.

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

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