Разработчик
Моделлер
Участник
Пользователь
- Сообщения
- 133
- Реакции
- 154
Всех приветствую!
При написании функции прыжков для NPC столкнулся с такой проблемой: функция работает, NPC без проблем запрыгивают на ящики, однако с лестницами (которые ступенчатые) у них проблемы: первые несколько ступенек они преодолевают без каких-либо трудностей, однако на последнюю - вообще подняться не могут. Не могу понять, в чем причина. Код, отвечающий за прыжки, прикладываю
1) в Plugin Init было добавлено
2) Вот код самого "виновника торжества"
3) Функция origin_infront
При написании функции прыжков для 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
}
}
}
}
Код:
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)
}
Последнее редактирование: