Перейти к контенту

Скриптование


Svoboда

Рекомендуемые сообщения

Всем привет.
Решил для себя изучить модели поведения персонажей.
В качестве эксперимента, была выбрана доработка существующего скрипта 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

 

Изменено пользователем AkkurDev

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...