Прыжкок для NPC

Сообщения
133
Реакции
154
Всех приветствую!
При написании функции прыжков для NPC столкнулся с такой проблемой: функция работает, NPC без проблем запрыгивают на ящики, однако с лестницами (которые ступенчатые) у них проблемы: первые несколько ступенек они преодолевают без каких-либо трудностей, однако на последнюю - вообще подняться не могут. Не могу понять, в чем причина. Код, отвечающий за прыжки, прикладываю

1) в Plugin Init было добавлено

Код:
     // ZB_CLASSNAME - класснейм NPC
    register_touch("worldspawn", ZB_CLASSNAME, "npc_jump") 
    register_touch("func_brush", ZB_CLASSNAME, "npc_jump")
    register_touch("func_breakable", ZB_CLASSNAME, "npc_jump") 
    register_touch("func_wall",ZB_CLASSNAME,"npc_jump")


2) Вот код самого "виновника торжества"

Код:
public npc_jump(crap, entity)
{
new victim = FindClosesEnemy(entity)
if(is_user_alive(victim))
    {                   
        if(g_entity_jumpdelay[entity] < get_gametime())                        
        {                                                 
            g_entity_jumpdelay[entity] = (get_gametime() + 1.0)
                                                                
            new Float:entity_origin[3], Float:entity_angle[3]
            pev(entity, pev_origin, entity_origin)                   
            entity_origin[2]-=32.0 // Checking origin from the feet (not sure value is correct)     
            pev(entity, pev_v_angle, entity_angle)

                                                                                           
            // Get the origin in front of the player, and see if something is standing between the 2 points     
            new Float:futur_origin[3]                                                                          
                                                    
            origin_infront(entity_angle, entity_origin, 100.0, futur_origin)

            static Float:vecAngles[3]
                  
            new trace_handle = create_tr2()                                                     
            engfunc(EngFunc_TraceLine, entity_origin, futur_origin, IGNORE_MONSTERS, victim, trace_handle)
            get_tr2(trace_handle, TR_vecEndPos, futur_origin)                            
                                                                       
            if(get_distance_f(entity_origin, futur_origin) < 100.0)
            {   in_jump_state[entity]=1
                                                                  
                engfunc(EngFunc_MakeVectors, entity_angle)                         
                new Float:forward_vector[3]
                get_global_vector(GL_v_forward, forward_vector)

                entity_angle[0] = forward_vector[0] * 900.0
                entity_angle[1] = forward_vector[1] * 900.0
                entity_angle[2] = 3000.0                
                              
                set_pev(entity, pev_velocity, entity_angle)
                in_jump_state[entity]=0             
               
            }  
        }

    }

}
3) Функция origin_infront

Код:
origin_infront(Float:vAngles[3], Float:vecOrigin[3], Float:flDistance, Float:vecOutput[3]) // By Exolent
{
    static Float:vecAngles[3]
    xs_vec_copy(vAngles, vecAngles)

    engfunc(EngFunc_MakeVectors, vecAngles)
    global_get(glb_v_forward, vecAngles)

    xs_vec_mul_scalar(vecAngles, flDistance, vecAngles)

    xs_vec_add(vecOrigin, vecAngles, vecOutput)
}
 
Последнее редактирование:
Сообщения
708
Реакции
476
Помог
10 раз(а)
а что они делают в конце?
лучше бы видео сделал поведения
 
Сообщения
133
Реакции
154
BalbuR, ты прав, сейчас прикреплю
20 Ноя 2021
1) Поведение на лестнице:


2) Поведение с ящиками:
 
Сообщения
453
Реакции
255
Помог
9 раз(а)
Тут наверное стоит посмотреть код ботов - zbot, podbot, может получится. Тема очень интересная на самом деле
 

d3m37r4

111111
Сообщения
1,429
Реакции
1,169
Помог
10 раз(а)
А мог бы npc из заложей сделать)
 
Сообщения
133
Реакции
154
d3m37r4, боюсь совместимость у мода тогда не со всеми играми на goldsource будет(
 
Сообщения
1,498
Реакции
1,496
Помог
2 раз(а)
однако с лестницами (которые ступенчатые) у них проблемы:
А как дела у их "func_ladder" мне от очень интересно ?

У меня к примеру если нож застрял у лестнице,то при касании ,если я вхожу / выхожу с лестницы - не всегда берётся он в руки
Ну это я уже ранее скидывал видео

 
Сообщения
133
Реакции
154
MayroN, с такими лестницами работать я их пока не "учил", да и есть ли в этом вообще смысл. Сейчас заметил такой странный эффект: если игрок стоит на каком-то очень высоком препятствии, то зомби образуют что-то наподобие живой лестницы. Когда их много это выглядит эпично, прямо как в какой-то "Войне миров Z" )

В твоем же случае.... можно попробовать сделать размер entity побольше, при таче, как по мне, в таком случае шанс поднять выше будет
 
Сообщения
1,498
Реакции
1,496
Помог
2 раз(а)
если игрок стоит на каком-то очень высоком препятствии, то зомби образуют что-то наподобие живой лестницы.
У SIS'ы такое на Зомби Моде тоже есть)
В твоем же случае.... можно попробовать сделать размер entity побольше, при таче, как по мне, в таком случае шанс поднять выше будет
Видишь как хорошо получилось - твоя тема послужила мне поводом вернутся "назад в будущее" и пересмотреть этот нюанс,о котором я забыл уже как год назад.

P.S.Я случайно не скидывал тебе видео,там где научили НПС,вскарабкаться на ящики - ну прям залазить,как это делает человек в реальной жизни?
Также было дело ползком вместо приседания,там где не возможно пролезть... о то да...
 
Последнее редактирование:
Сообщения
133
Реакции
154
MayroN, неа, не скидывал. Скинешь - буду благодарен)
 
Сообщения
1,498
Реакции
1,496
Помог
2 раз(а)
MayroN, неа, не скидывал. Скинешь - буду благодарен)
Вот посмотри.
Также можешь да и вообще все его видео пересмотреть - там можно покусать немного локти )))
Может,как закончишь со своим - перейдёшь на эту реализацию )
Правда тут нужны уже точно такие анимации для НПС само собой
https://dev-cs.ru/threads/16075/#post-108040
 
Сообщения
133
Реакции
154
MayroN, о! я видел эту фигню! даже с разрабами связывался, но турки меня послали куда подальше. Насколько я помню, это у нас Nexon Zombies, используются там модели как в 1.6, одной проблемой меньше) Попадалась мне уже реализация функций, которые могли бы пригодиться при разработке подобного, например проверка, находится ли игрок в вентиляции и так далее. А про вскарапкивание на ящик - это получается прыжок в 2 этапа: 1й этап, проверяем высоту и расстояние, на котором игрок находится от NPC. если понятно, что игрок именно на ящике - даем ускорение по ОZ, какое-то время заставляем зомби быть на этой высоте и проигрываем вторую анимацию, не забываем про доп ускорение. А может и вообще всё можно делать в один прогон, это зависит от самой анимации. Надеюсь, NZ за ночь скачается, там и проверим (если сервер живой)
 
Сообщения
708
Реакции
476
Помог
10 раз(а)
BalbuR, ты прав, сейчас прикреплю
20 Ноя 2021
1) Поведение на лестнице:


2) Поведение с ящиками:
тач проверь, вообще идет вызов? есть подозрение что нет
имеется ввиду, что на последней лесенке тач пропадает
 
Сообщения
133
Реакции
154
Таки переделал функцию прыжков. Теперь зомби худо-бедно преодолевают ящики, стены, на лестницах у них теперь проблем не возникает. Однако есть один нюанс: реализовано это всё максимально костыльно. Но работает.
Код:
public npc_jump(crap, entity)
{                         
new max_tryheight = 200.0 //можно запихать в глобальную переменную
new victim = FindClosesEnemy(entity)   
new Float: VicOrigin[3]
new Float: EntOrigin[3]
pev(entity,pev_origin,EntOrigin)    
pev(victim,pev_origin,VicOrigin)                                    
if(is_user_alive(victim))                                  
    {                                                                                                                                     
        if(g_entity_jumpdelay[entity] < get_gametime()&& VicOrigin[2]-EntOrigin[2]<=max_tryhight)                        
        {
          g_entity_jumpdelay[entity] = (get_gametime() + 0.4)                                    
          new Float: ent_origin[3] 
                                
          for(new i=0; i<=30; i++){         
              pev(entity,pev_origin,ent_origin)  
              ent_origin[2]+=1.0
              set_pev(entity,pev_origin,ent_origin)    
          }                      
        }                         
                                             
    }   
      
}
 
Последнее редактирование:
Сообщения
73
Реакции
60
Помог
1 раз(а)
@Islingiton_G,я для своих зомбиков нпс делал как: если зомби стоит на месте, но имеет цель для атаки, я просто имитировал векторами прыжок (z+N), работало нормально без багов. С лестницами... ну можно проверять, касается ли зомбик лестницы и поднимать опять же ему Z velocity. А поднятие по ступенькам я делал уже для титана управляемого. Там уже проверял по прицелу, есть ли уступ (за 0.1 секунду примерно когда титан будет двигаться вперёд) и если fraction маленький, значит есть уступ и я сразу поднимал Z+ на дистанцию от стартовой точки (прицел + ANGLE FORWARD) и до точки которая уходит вниз, как-то так. Может будет инфа полезная. Так же Movetype punshment (как то так, вроде оно) само моднимает обьект, но там если уступ большой все равно надо вручную поднимать

скрин со ступеньками скинул, там конечно не идеально, но сделал как смог додуматься. С этим вариантом нпс не будет взлетать вверх а имитировать поднятие как у игрока
 

Вложения

Последнее редактирование:
Сообщения
148
Реакции
193
Помог
5 раз(а)
Islingiton_G, я не работаю с кс плагинами, поэтому не могу знать специфики языка, но программирую в других сферах.
Что мне показалось странным, так этот фрагмент:
if(get_distance_f(entity_origin, futur_origin) < 100.0)
{ in_jump_state[entity]=1

engfunc(EngFunc_MakeVectors, entity_angle)
new Float:forward_vector[3]
get_global_vector(GL_v_forward, forward_vector)

entity_angle[0] = forward_vector[0] * 900.0
entity_angle[1] = forward_vector[1] * 900.0
entity_angle[2] = 3000.0

set_pev(entity, pev_velocity, entity_angle)
in_jump_state[entity]=0

}

Если учесть, что время между началом условия и его концом стремится к нулю, то:
1) зачем менять состояние in jump, если внутри условия оно не используется?
2) хватает ли движку игры времени, чтобы применить прыжок, если в конце условия состояние переходит в 0?

Может стоит изменить состояние через примерно 0.1 секунды?
Или, как вариант, я бы пытался задавать вектор на четверть роста выше ориджина игрока, если тот находится выше.
 

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

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