Exvilux 0 Опубликовано 26 Июня 2013 (изменено) Всем привет, написал схему поведения "напарник", по работе 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> Ну вроде бы все написал. Так, а вопрос состоит в следующем, почему схема перестала деактивироваться? Функция в диалоге присутствует, и ошибок в ней нет, до меня не доходит, это( Изменено 26 Июня 2013 пользователем Exvilux Поделиться этим сообщением Ссылка на сообщение
Exvilux 0 Опубликовано 7 Июля 2013 La'Rento , а почему бы тебе не пользоваться get_time_hours()? пользуйся тем что в сутках 24 часа, а вернее от 0 до 23, к примеру так if level.get_time_hours()>=23 then --запустил смену работы, тем самым тебе не нужно будет проверять дни, как только стукнуло 11 часов вечера, нпс сменили вид --деятельности --//ну или так if level.get_time_hours<=1 then --и то же самое, только схема поменяется рано утром Поделиться этим сообщением Ссылка на сообщение