Всем привет.
Решил для себя изучить модели поведения персонажей.
В качестве эксперимента, была выбрана доработка существующего скрипта xr_kamp.
Идея: NPC во время дождя должны перемещаться в укрытие, а не сидеть пятой точкой в грязи; при этом, если дождь слабый, они двигаются в укрытие пешком, а если сильный - бегом. Все, как у людей, в общем.
Добавил оператор, эвалуатор: пока оператор пустой, корректно отрабатывает переключение со схемы на схему.
Стоило добавить в оператор логику смены положения - нпс начали втыкать: просто встают, стоят и смотрят в одну точку; более того - переключение схем не происходит.
Предваряя вопросы: укрытие возвращается корректно, не nil, lvid выводится корректно.
Хочется знать, что я забыл добавить или наоборот добавил лишнего в операторе перемещения на точку.
Спасибо.
Код:
-- Персонаж бежит в укрытие, если начался дождь
class "action_move_to_cover" (action_base)
function action_move_to_cover:__init (npc_name,action_name,storage) super (nil,action_name)
self.a = storage
end
function action_move_to_cover:initialize()
action_base.initialize(self)
-- Эти строки во всех схемах
self.object:set_desired_position()
self.object:set_desired_direction()
-- Очищаю анимации жратвы и бряцанья на гитаре (как минимум, надеюсь, что корректно очищаются)
self.object:clear_animations()
-- Разрешаю движение
self.object:movement_enabled(true)
-- Двигаться линейно
self.object:set_detail_path(move.line)
-- не знаю, что это, во всех схемах есть
self.object:set_path_type(game_object.level_path)
-- Меняю состояние тела на бегущее (мб, неправильно?)
self.object:set_body_state(move.run)
-- Тип движения - бег (пока идет отладка, позже планировал добавить и шаг)
self.object:set_movement_type(move.run)
-- Бежит спокойно, без паники
self.object:set_mental_state(anim.free)
-- не знаю, что это, на разных форумах по AI рекомендовано, не знаю - нужно ли тут
self.object:remove_all_restrictions()
-- Запрещаю нпс издавать звуки и вступать в диалог с ГГ
xr_sound.set_sound(self.object, nil)
stop_play_sound(self.object)
self.object:disable_talk()
end
function action_move_to_cover:execute ()
action_base.execute (self)
local npc = self.object
if npc then
-- Получил ближайшее укрытие к персонажу
local cover = ogsm_respawn.get_nearest_hide(npc)
if cover then
-- Получил данные об укрытии
local area = cover.obj
local lvid = area:level_vertex_id()
-- Отправляю NPC на указанную точку
state_mgr.set_state(npc,"raid")
utils.send_to_nearest_accessible_vertex(npc, lvid)
end
end
end
function action_move_to_cover:finalize ()
action_base.finalize (self)
end