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

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


Svoboда

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

Всем привет, написал схему поведения "напарник", по работе red75, но вот незадача, после ее модифицирования, странным образом она перестала деактивироваться, сталкер после слов "спасибо, дальше я один" и тп, продолжает бегать за нами...
вот весь код...
S.T.A.L.K.E.R. ShoC v1.0004(с погодой амк)


 
property_faraway = 1000
act_stay_close = property_faraway+1
function i_am_friend(talker,target)
  return target:relation(talker)==game_object.friend
end

function weather_f()
local l=0
local w={"clear","pasmurno","rain","groza"}
local t=level.get_time_hours()
for i=1,#w do
if level.get_weather() == "amk_groza_"..w[i].."_"..t then
l=1 
end
end
return l==1
end
                   

function weather_g()
local l=0
local w = {"clear","pasmurno","rain","groza"}
local t=level.get_time_hours()
for i=1,#w do
if level.get_weather() ~= "amk_groza_"..w[i].."_"..t then
l=1 
end
end
return l==1
end

function night_n()
return  level.get_time_hours() < 22 or  level.get_time_hours() > 4 
end

function night_y()
return level.get_time_hours() > 22 or  level.get_time_hours() < 4 
end

-- За основу этой функции взята функция dialogs.actor_have_medkit
function npc_have_medkit(talker, target)
  return talker:object("medkit") ~= nil or
       talker:object("medkit_army") ~= nil or
       talker:object("medkit_scientic") ~= nil
end
function npc_havent_medkit(talker, target)
  return not npc_have_medkit(talker,target)
end


local scheme_status={}
function scheme_is_active(talker,target)
  return scheme_status[target:id()]==true 
end

function scheme_is_not_active(talker,target)
  return not scheme_is_active(talker,target)
end

function activate_scheme(talker,target)
  set_help(talker,talker:spawn_ini())
  scheme_status[talker:id()]=true
end

function deactivate_scheme(talker,target)
  disable_scheme(talker,"actor_need_help")
  scheme_status[talker:id()]=false
end

class "evaluator_faraway" (property_evaluator)

function evaluator_faraway:__init(name, storage) super (nil, name)
  self.st = storage
end


local min_faraway_dist=10
local max_faraway_dist=30
local min_dist = 5
local faraway_dist = 10

function evaluator_faraway:evaluate()
  local actor=db.actor
  if not actor then
  -- ГГ ещё не заспаунился
    return false
  end
  local dist=actor:position():distance_to(self.object:position())
  if dist > min_dist and dist < faraway_dist*20 then
  self.st.faraway=true
  elseif dist < min_dist or dist > faraway_dist*20then
  self.st.faraway=false
  end
  return self.st.faraway==true
end

 class "action_stay_close" (action_base)

function action_stay_close:__init(name, storage) super (nil, name)
  self.st=storage
end

function action_stay_close:initialize()
  local npc=self.object
  get_console():execute("Est' init")
  -- Не знаю зачем эти две функции, но они используются во всех операторах
  npc:set_desired_position()
  npc:set_desired_direction()
  -- Сбрасываем текущие анимации
  npc:clear_animations()
  -- Задаём параметры движения
  npc:set_detail_path_type(move.line)
  npc:set_body_state(move.standing)
  npc:set_movement_type(move.run)
  npc:set_path_type(game_object.level_path)
  -- Эксперименты показали, что эта функция устанавливает скорость движения (anim.danger - 
--минимальная скорость, anim.free - нормальная, anim.panic - максимальная)
  npc:set_mental_state(anim.panic)
  -- Повышаем зоркость NPC
  npc:set_sight(look.danger, nil, 0)
  -- Освободим сталкера от всех идиотских ограничений
  npc:remove_all_restrictions()
-- Зададим смещение точки назначения, чтобы помощники не сбивались в кучу
  self.offset=vector():set(math.random()*6-3,0,math.random()*6-3)
  self.offset:normalize()
  self.state_change_time=time_global()+3500
  self.last_v_id=npc:level_vertex_id()
  --get_console():execute("Finish")
end

function action_stay_close:execute()
  action_base.execute(self)
--  mylog("action exec")
  local npc=self.object
  local actor=db.actor
  if not actor then
  -- Хм, что-то не так. Может быть ГГ перешёл на другой уровень? Запрещаем схему поведения
    self.st.enabled=false
  end
  if self.delay and self.delay>time_global() then
    return
  end
  self.delay=time_global()+1000

  -- Получаем ближайшую доступную точку в 5 метрах от ГГ
  local vertex_id=level.vertex_in_direction(actor:level_vertex_id(),self.offset,5)

  if self.state_change_time<time_global() then
    self.state_change_time=time_global()+3500
    if self.last_v_id==npc:level_vertex_id() then
      state_mgr.set_state(npc,"sprint")
      npc:set_dest_level_vertex_id(self.last_v_id)
      self.last_v_id=0
      self.st.temp_disable=time_global()+3500
      return
    elseif self.st.dist then 
if self.st.dist<max_faraway_dist and self.st.dist>min_faraway_dist  then
      state_mgr.set_state(npc,"sprint",nil,nil,nil,{animation=true})
    elseif self.st.dist<max_faraway_dist and self.st.dist<min_faraway_dist then
      state_mgr.set_state(npc,"sprint",nil,nil,nil,{animation=true})
elseif self.st.dist>max_faraway_dist then
      state_mgr.set_state(npc,"fast_sprint",nil,nil,nil,{animation=true})
    end
    self.last_v_id=npc:level_vertex_id()
  end
  end

--  npc:set_detail_path_type(move.line)
  if vertex_id then
    npc:set_dest_level_vertex_id(vertex_id)
  end
end

 function add_to_binder(object, char_ini, scheme, section, st)
  local manager = object:motivation_action_manager()
  local property_wounded = xr_evaluators_id.sidor_wounded_base

  -- Удаляем эвалуатор, так как в xr_motivator мы установили его в property_evaluator_const
  manager:remove_evaluator(property_faraway)
  -- и заменяем его нашим
  manager:add_evaluator(property_faraway, evaluator_faraway("evaluator_faraway",st))
    -- Создаём оператор
  local action = action_stay_close("action_stay_close",st)
    -- и настраиваем предусловия. 1. Сталкер жив
  action:add_precondition(world_property(stalker_ids.property_alive, true))
  -- 2. Сталкер не ранен
  action:add_precondition(world_property(property_wounded, false))
  -- Я использую свой мод для обхода аномалий, иначе от помощников мало толку.
  if anomaly_evader then
  -- 3. Рядом нет аномалий
    action:add_precondition (world_property(1099,false))
  end
 -- 4. Сталкер слишком далеко от ГГ
   action:add_precondition(world_property(property_faraway, true))
  action:add_effect (world_property(property_faraway, false))
  -- Добавляем оператор в планировшик
  manager:add_action (act_stay_close, action)
  -- Теперь подкорректируем стандартные операторы, чтобы помощник не отвлекался на всякую ерунду.
  action=manager:action(stalker_ids.action_alife_planner)
  action:add_precondition(world_property(property_faraway, false))
  action=manager:action(stalker_ids.action_combat_planner)
  action:add_precondition(world_property(property_faraway, false))
  action=manager:action(stalker_ids.action_danger_planner)
  action:add_precondition(world_property(property_faraway, false))
end


 function set_help(npc, ini)
  local st = xr_logic.assign_storage_and_bind(npc, ini, "actor_need_help")
  st.enabled=true
end

function disable_scheme(npc, scheme)
  local st = db.storage[npc:id()][scheme]
  if st then
    st.enabled = false
  end
end
 

 

 

--//функция - net_spawn()
local manager = self.object:motivation_action_manager()
manager:add_evaluator(actor_need_help.property_faraway, property_evaluator_const(false))
--//функция -addCommonPrecondition(action)
action:add_precondition (world_property(actor_need_help.property_faraway,false))

 



load_scheme("actor_need_help", "actor_need_help", stype_stalker)

 

 

<?xml version="1.0" encoding="windows-1251" standalone="yes" ?>
<game_dialogs>
    <dialog id="actor_will_need_help">
        <precondition>actor_need_help.i_am_friend</precondition>
        <precondition>actor_need_help.scheme_is_not_active</precondition>
        <phrase_list>
            <phrase id="0">
                <text>Выдвигаемся.</text>
                <next>11</next>
                <next>12</next>
				<next>13</next>
				<next>14</next>
            </phrase>
            <phrase id="11">
			    <precondition>actor_need_help.weather_g</precondition>
			    <precondition>actor_need_help.night_n</precondition>
                <text>Конечно.</text>
				<next>15</next>
               
            </phrase>
			
			<phrase id="15">
			    <text>За мной.</text>
				<next>16</next>          
			</phrase>
			<phrase id="16">
			    <text>Уже иду.</text>
				<action>actor_need_help.activate_scheme</action>
                          
			</phrase>
            <phrase id="12">
			    <precondition>actor_need_help.weather_g</precondition>
			    <precondition>actor_need_help.night_y</precondition>
				<text>Нее, я в такую темень не пойду.</text>
            </phrase>
			<phrase id="13">
			    <precondition>actor_need_help.night_n</precondition>
			    <precondition>actor_need_help.weather_f</precondition>
                <text>В грозу, куда то идти? Не, брат.</text>
            </phrase>
			<phrase id="14">
			    <precondition>actor_need_help.night_y</precondition>
			    <precondition>actor_need_help.weather_f</precondition>
                <text>Ты что? Темнота такая, да еще и льет как из ведра!</text>
            </phrase>
			
        </phrase_list>
    </dialog>
    <dialog id="actor_will_not_need_help">
        <precondition>actor_need_help.i_am_friend</precondition>
        <precondition>actor_need_help.scheme_is_active</precondition>
        <phrase_list>
            <phrase id="0">
                <text>Спасибо, друг, теперь я сам справлюсь.</text>
                <next>21</next>
            </phrase>
            <phrase id="21">
                <text>Да не за что, ты мне помог, я - тебе.</text>
                <action>actor_need_help.deactivate_scheme</action>
            </phrase>
        </phrase_list>
    </dialog>
</game_dialogs> 

 

 

 

Ну вроде бы все написал. Так, а вопрос состоит в следующем, почему схема перестала деактивироваться? Функция в диалоге присутствует, и ошибок в ней нет, до меня не доходит, это(

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

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


Ссылка на сообщение

La'Rento , а почему бы тебе не пользоваться get_time_hours()? пользуйся тем что в сутках 24 часа, а вернее от 0 до 23, к примеру так

if level.get_time_hours()>=23 then
--запустил смену работы, тем самым тебе не нужно будет проверять дни, как только стукнуло 11 часов вечера, нпс сменили вид 
--деятельности
--//ну или так
if level.get_time_hours<=1 then 
--и то же самое, только схема поменяется рано утром 

 

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


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

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