Guzerus 0 Опубликовано 24 Января 2010 Поделиться Опубликовано 24 Января 2010 (изменено) Galil,если я прав,то нельзя сделать изменение параметров ГГ. Сам пробовал,и на форуме ПЫС спрашивал,на что получил ответ,что невозможно. Так что увы... Labus, можно. function test() if db.actor:has_info ("ИМЯ_ПОРШНЯ") then start() end end А по поводу концепции-не согласен. От того,что человек в руки возьмёт документ,мышцы не увеличатся,а вот от тренировок-да. Изменено 24 Января 2010 пользователем Guzerus Мой ник читается гузерус. Ссылка на комментарий
Push85 4 Опубликовано 27 Января 2010 Поделиться Опубликовано 27 Января 2010 Labus, а откуда ты взял этот inv_weight? Такой функции не существует в природе, есть хороший файлик который называется lua_help.script поищи в классе game_object, авось найдешь что подходящее. А вот max_weight вообще нужно из конфига брать. Возможно всё, ну или почти всё. Ссылка на комментарий
DiXares 1 Опубликовано 29 Января 2010 Поделиться Опубликовано 29 Января 2010 Товарищи Сталкеры! Нужна помощь по такому поводу: Необходимо сделать проверку на предмет в определённом радиусе(по x,y,z,gvid,lvid) в онлайне(не инвентаре). И необходимо, что бы предмет был всегда в онли, даже если ты перешёл на другую локацию(такое возможно?). Может сделать что то вроде этого: function check() if прдмет в онли? then if item(предмет в зоне сферы?) then звук воспроизводится(s_play) else .... И ещё, код: this читает функцию из из самого файла, в котором она запускается? Ссылка на комментарий
Влад 9 Опубликовано 30 Января 2010 Поделиться Опубликовано 30 Января 2010 (изменено) как в ЗП вывести на экран секцию ствола,что у ГГ в руках? local actor = db.actor local active_slot = actor:active_slot() local wpn local text = "" if active_slot then wpn = actor:item_in_slot(active_slot) if wpn then text = "Ствол - "..wpn:section() end end постоянно выдаёт,что это граната,даже,если ёё нет! TREWKO this читает функцию из из самого файла, в котором она запускается да.остальное не знаю Изменено 30 Января 2010 пользователем Влад Мои работы Не бойтесь совершенства. Вам его не достичь. C. Дали Ссылка на комментарий
lekzd 1 Опубликовано 31 Января 2010 Поделиться Опубликовано 31 Января 2010 Влад, если math.ceil(db.actor:accuracy()*1000) = 1 - то игрок целится (для определения использования оптики юзай проверку device().fov) если больше, то уже не целится i-igroman.ru - Мой, принципиально новый сайт о компьютерных играх Ссылка на комментарий
Push85 4 Опубликовано 31 Января 2010 Поделиться Опубликовано 31 Января 2010 (изменено) Labus, если что то не работает, значит ты не правильно используешь функции этого класса, функции из этого класса можно вызывать не для всех game_object, для начала смотри как используется интересующая тебя функция в оригинальных скриптах, если ее там нет, значит пробуем метод научного тыка. В этом классе почти все, а скорее всего все функции используются в игре, в скриптах или в движке, так что не надо говорить, что они не работают. По теме: логически помысли. Задача: узнать вес всех предметов в инвентаре, решение: перебрать все предметы инвентаря и сложить их вес. Как узнать максимальный вес я уже говорил. Изменено 31 Января 2010 пользователем 8push5 Возможно всё, ну или почти всё. Ссылка на комментарий
Kolmogor 5 Опубликовано 31 Января 2010 Поделиться Опубликовано 31 Января 2010 не просто перебрать все предметы, а учесть неполные пачки патронов и навешанные на оружие глушители, прицелы и прочее Все реально, но кода получается много :ny_rolleyes: Ссылка на комментарий
DiXares 1 Опубликовано 31 Января 2010 Поделиться Опубликовано 31 Января 2010 (изменено) Товарищи! Возможно ли с помощью скрипта заменять текстуру? Например: Диалог--->xrTexture.smena() Сам скрипт: function smena(); wpn\wpn_gauss1--->wpn\wpn_gauss2(Старая текстура--->Новая текстура) Нужно сделать скрипт. Сообщение от модератора n6260 Можно скриптом подменить на модель с нужной текстурой (или конфигом), как у Кирага в "ночных прицелах". Изменено 31 Января 2010 пользователем n6260 Ссылка на комментарий
Push85 4 Опубликовано 31 Января 2010 Поделиться Опубликовано 31 Января 2010 TREWKO, нельзя, имя текстуры вшито в модель. Возможно всё, ну или почти всё. Ссылка на комментарий
DiXares 1 Опубликовано 31 Января 2010 Поделиться Опубликовано 31 Января 2010 (изменено) Понятно, просто хочу сделать смену времён года. Придётся через протоптанный путь. А вот ещё: Играл в сборку: AMK+NLC+HC3. И там было задание: По моему: Доставить на армейские склады рессивер от экологов на водонапорную башню в деревеньке. Насколько я понял, там есть скрипт на проверку установлен ли предмет? Только вот найти его не могу. Хочу сделать что то вроде этого: Отнёс предмет на нужное место, скрипт заработал, иначе не будет работать. Сообщение от модератора n6260 Это Сяковский квест. Спроси у него. Изменено 31 Января 2010 пользователем n6260 Ссылка на комментарий
Kolmogor 5 Опубликовано 31 Января 2010 Поделиться Опубликовано 31 Января 2010 (изменено) вывод на экран можно сделать через get_hud():GetCustomStatic get_hud():AddCustomStatic посмотри как эти функции используются в оригинальных скриптах и в АМК ну а подсчет веса вести для начала так же, как в АМК считают объем: ставить коллбеки на поднятие/выбрасывание предмета Изменено 31 Января 2010 пользователем Kolmogor Ссылка на комментарий
Влад 9 Опубликовано 31 Января 2010 Поделиться Опубликовано 31 Января 2010 lekzd ок,спасибо. а что насчёт второго вопроса? как в ЗП вывести на экран секцию ствола,что у ГГ в руках? local actor = db.actor local active_slot = actor:active_slot() local wpn local text = "" if active_slot then wpn = actor:item_in_slot(active_slot) if wpn then text = "Ствол - "..wpn:section() end end постоянно выдаёт,что это граната,даже,если ёё нет! в ТЧ таже фигня получается.. Мои работы Не бойтесь совершенства. Вам его не достичь. C. Дали Ссылка на комментарий
lekzd 1 Опубликовано 31 Января 2010 Поделиться Опубликовано 31 Января 2010 Влад, во первых эту функцию надо сунуть в апдейт во вторых код может быть по-короче local actor = db.actor local active_item = actor:active_item() local text = "" if active_item then text = "Ствол - "..active_item:section() end i-igroman.ru - Мой, принципиально новый сайт о компьютерных играх Ссылка на комментарий
Влад 9 Опубликовано 31 Января 2010 Поделиться Опубликовано 31 Января 2010 (изменено) lekzd надо сунуть в апдейт а я что сделал? это ведь итак ясно,не стал писать об этом.. может быть по-короче знаю,но работать он от этого не начинает.. может быть проблема в самом выводе инфы? function active_weapon() local hud = get_hud() local custom_static = hud:GetCustomStatic("ait") if custom_static == nil then local actor = db.actor local active_item = actor:active_item() local text = "" if active_item then text = "Ствол - "..active_item:section() end hud:AddCustomStatic("ait", true) hud:GetCustomStatic("ait"):wnd():TextControl():SetTextST(text) end end end Изменено 31 Января 2010 пользователем Влад Мои работы Не бойтесь совершенства. Вам его не достичь. C. Дали Ссылка на комментарий
lekzd 1 Опубликовано 31 Января 2010 Поделиться Опубликовано 31 Января 2010 (изменено) Влад, А! ну так конечно! никогда не инициализируй переменные в блоке с условиями - будут вылеты никогда не пытайся задать статику текст, в условии, что статика нет function active_weapon() local hud = get_hud() local custom_static = hud:GetCustomStatic("ait") local actor = db.actor local active_item = actor:active_item() local text = "" if custom_static == nil then hud:AddCustomStatic("ait", true) else if active_item then text = "Ствол - "..active_item:section() end hud:GetCustomStatic("ait"):wnd():TextControl():SetTextST(text) end end Ну вот, я не успел - вот тебе работающий пример: http://rghost.ru/916513 Изменено 31 Января 2010 пользователем lekzd i-igroman.ru - Мой, принципиально новый сайт о компьютерных играх Ссылка на комментарий
Влад 9 Опубликовано 31 Января 2010 Поделиться Опубликовано 31 Января 2010 (изменено) lekzd никогда не инициализируй переменные в блоке с условиями - будут вылеты никогда не пытайся задать статику текст, в условии, что статика нет ок,спасибо.буду знать. один end левый. всё равно гранату выводит.. апдейт ведь в function actor_binder:update(delta) делать? ура,всё заработало! lekzd,огромное спасибо.когда мне вручат плюсо-мёт,обязательно поставлю. Изменено 31 Января 2010 пользователем Влад Мои работы Не бойтесь совершенства. Вам его не достичь. C. Дали Ссылка на комментарий
DiXares 1 Опубликовано 1 Февраля 2010 Поделиться Опубликовано 1 Февраля 2010 (изменено) Товарищи Сталкеры! У меня проблема. Нужно совместить два скриптовых файла state_mgr.script ---------------------------------------------------------------------------------------------------------------------- -- Менеджер изменения состояния тела -- автор: Диденко Руслан (Stohe) -- TODO: ---------------------------------------------------------------------------------------------------------------------- function printf() end aim_ratio = 1000/50 min_ratio = 1500 --' Эвалуатор, который синхронизирует менеджер. --' Мы уже в безраличном состоянии idle или нет class "evaluator_state_mgr_idle" (property_evaluator) function evaluator_state_mgr_idle:__init(name, state_manager) super (nil, name) self.st = state_manager self.mgr = nil end function evaluator_state_mgr_idle:evaluate() if db.Dead2 == 0 then local t = self.st.target_state == "idle" and --not self.st.planner:evaluator(self.st.properties["locked"]):evaluate() and self.st.planner:evaluator(self.st.properties["movement"]):evaluate() and self.st.planner:evaluator(self.st.properties["animstate"]):evaluate() and self.st.planner:evaluator(self.st.properties["animation"]):evaluate() if t == true then if self.mgr == nil then self.mgr = self.object:motivation_action_manager() end if self.mgr:initialized() and self.mgr:current_action_id() == xr_actions_id.state_mgr + 1 then self.st.combat = true end end if self.st.combat == true then return true end return false end class "evaluator_state_mgr_idle_off" (property_evaluator) function evaluator_state_mgr_idle_off:__init(name, state_manager) super (nil, name) self.st = state_manager self.mgr = nil end function evaluator_state_mgr_idle_off:evaluate() local t = self.st.target_state == "idle" and self.st.planner:evaluator(self.st.properties["movement"]):evaluate() and self.st.planner:evaluator(self.st.properties["animstate"]):evaluate() and self.st.planner:evaluator(self.st.properties["animation"]):evaluate() and self.st.planner:evaluator(self.st.properties["bodystate"]):evaluate() and self.st.planner:evaluator(self.st.properties["weapon"]):evaluate() and self.st.planner:evaluator(self.st.properties["mental"]):evaluate() -- and -- self.st.planner:evaluator(self.st.properties["direction"]):evaluate() -- amk.mylog("Checking idleoff for "..self.object:name().." = "..tostring(t)) return t end --' Мы уже в безраличном состоянии idle или нет ()учет с проверкой alife class "evaluator_state_mgr_idle_alife" (property_evaluator) function evaluator_state_mgr_idle_alife:__init(name, state_manager) super (nil, name) self.st = state_manager self.t = nil end function evaluator_state_mgr_idle_alife:evaluate() if not self.object:alive() then return true end -- апдейт менеджера анимаций -- раньше он был тут, сейчас он вынесен из эвалуатора -- printf("SECTION %s", utils.to_str(db.storage[self.st.npc:id()].active_section)) mgr = self.object:motivation_action_manager() self.t = nil if mgr:initialized() then self.t = mgr:current_action_id() --printf("ACTION %s", utils.to_str(self.t)) if self.t ~= xr_actions_id.alife then self.st.alife = false end end if db.storage[self.st.npc:id()].active_section == nil then if xr_meet.is_meet(self.object) == false then local t = self.st.target_state == "idle" and not self.st.planner:evaluator(self.st.properties["locked"]):evaluate() and self.st.planner:evaluator(self.st.properties["movement"]):evaluate() and self.st.planner:evaluator(self.st.properties["animstate"]):evaluate() and self.st.planner:evaluator(self.st.properties["animation"]):evaluate() -- printf("%s", utils.to_str(self.st.target_state)) -- printf("%s", utils.to_str(self.st.planner:evaluator(self.st.properties["locked"]):evaluate())) -- printf("%s", utils.to_str(self.st.planner:evaluator(self.st.properties["movement"]):evaluate())) -- printf("%s", utils.to_str(self.st.planner:evaluator(self.st.properties["animstate"]):evaluate())) -- printf("%s", utils.to_str(self.st.planner:evaluator(self.st.properties["animation"]):evaluate())) if t == true then self.st.alife = true end if self.st.alife == true then return true end return t else return false end end return true end --' Переход в idle class "act_state_mgr_to_idle" (action_base) function act_state_mgr_to_idle:__init(name,state_manager) super (nil, name) self.st = state_manager end function act_state_mgr_to_idle:initialize() action_base.initialize(self) self.object:movement_enabled(true) if self.object:best_enemy() then self.st:set_state("idle", nil, nil, nil, {animation = true}) xr_sound.set_sound(self.object, nil) stop_play_sound(self.object) return end if self.object:best_danger() then self.st:set_state("idle", nil, nil, nil, {animation = true}) xr_sound.set_sound(self.object, nil) stop_play_sound(self.object) return end self.st:set_state("idle") end function act_state_mgr_to_idle:execute() action_base.execute(self) if self.object:best_enemy() then self.st:set_state("idle", nil, nil, nil, {animation = true}) return end if self.object:best_danger() then self.st:set_state("idle", nil, nil, nil, {animation = true}) return end self.st:set_state("idle") end function act_state_mgr_to_idle:finalize() -- По завершению перехода нужно записать -1 в указатель "на кого смотреть", -- чтобы при возврате было понятно что его нужно переинициализировать. self.st.current_object = -1 action_base.finalize(self) end --' Переход в idle class "act_state_mgr_to_off" (action_base) function act_state_mgr_to_off:__init(name,state_manager) super (nil, name) self.st = state_manager end function act_state_mgr_to_off:initialize() action_base.initialize(self) self.st:set_state("idle", nil, nil, nil, {animation = true}) xr_sound.set_sound(self.object, nil) stop_play_sound(self.object) -- amk.mylog("stmt for "..self.object:name().." is going off","stmt") end function act_state_mgr_to_off:execute() action_base.execute(self) -- self.st:set_state("idle", nil, nil, nil, {animation = true}) end function act_state_mgr_to_off:finalize() -- По завершению перехода нужно записать -1 в указатель "на кого смотреть", -- чтобы при возврате было понятно что его нужно переинициализировать. self.st.current_object = -1 self.object:movement_enabled(true) -- ui_rad.mylog("stmt for "..self.object:name().." has gone off","stmt") action_base.finalize(self) end --'------------------------------------------------------------------------------------- --' Эвалуаторы и экшены менеджера --'------------------------------------------------------------------------------------- --' Закончил ли менеджер свою работу class "eva_state_mgr_end" (property_evaluator) function eva_state_mgr_end:__init(name, st) super (nil, name) self.st = st self.mgr = nil end function eva_state_mgr_end:evaluate() if self.mgr == nil then self.mgr = self.object:motivation_action_manager() end if not self.mgr:initialized() then return false end local current_action_id = self.mgr:current_action_id() if current_action_id ~= stalker_ids.action_combat_planner and current_action_id ~= stalker_ids.action_danger_planner and current_action_id ~= stalker_ids.action_anomaly_planner then self.st.combat = false end return false end --' Залочен ли менеджер class "eva_state_mgr_locked" (property_evaluator) function eva_state_mgr_locked:__init(name, st) super (nil, name) self.st = st end function eva_state_mgr_locked:evaluate() --printf("npc %s", self.object:name()) --printf("weapon locked: %s", utils.to_str(self.st.planner:evaluator(self.st.properties["weapon_locked"]):evaluate())) --printf("direction locked: %s", utils.to_str(self.st.planner:evaluator(self.st.properties["direction_turning"]):evaluate())) --printf("animstate locked: %s", utils.to_str(self.st.planner:evaluator(self.st.properties["animstate_locked"]):evaluate())) --printf("animation locked: %s", utils.to_str(self.st.planner:evaluator(self.st.properties["animation_locked"]):evaluate())) --printf("combat[%s] alife[%s]", tostring(self.st.combat), tostring(self.st.alife)) if self.st.combat or self.st.alife then return true end return self.st.planner:initialized() and ( self.st.planner:evaluator(self.st.properties["weapon_locked"]):evaluate() or self.st.planner:evaluator(self.st.properties["animstate_locked"]):evaluate() or self.st.planner:evaluator(self.st.properties["animation_locked"]):evaluate() or self.st.planner:evaluator(self.st.properties["direction_turning"]):evaluate()) end --' Идловый экшн менеджера class "act_state_mgr_end" (action_base) function act_state_mgr_end:__init(name, st) super (nil, name) self.st = st end function act_state_mgr_end:initialize() action_base.initialize(self) end function act_state_mgr_end:execute() action_base.execute(self) -- if not self.st.planner:evaluator(self.st.properties["movement_stand_now"]):evaluate() then -- state_mgr_direction.update_movement_direction(self.object, self.st) -- end local wm = rx_wmgr and rx_wmgr.get_wm(self.object) local wpn = (wm and wm:get_weapon()) or self.object:best_weapon() if not wpn then return end local t = state_lib.states[self.st.target_state].weapon if t == "fire" or t == "sniper_fire" then --printf("[%s] shooting", self.object:name()) local sniper_aim = 3000 if self.st.look_object ~= nil then local look_object = level.object_by_id(self.st.look_object) if look_object == nil then self.st.look_object = nil return end if self.object:see(look_object) and (not IsStalker(look_object) or self.object:relation(look_object) == game_object.enemy) and look_object:alive() == true then if t == "sniper_fire" then sniper_aim = self.object:position():distance_to(look_object:position())*aim_ratio if sniper_aim <= min_ratio then self.object:set_item(object.fire1, wpn, 1, min_ratio) return end self.object:set_item(object.fire1, wpn, 1, sniper_aim) else self.object:set_item(object.fire1, wpn, state_mgr_weapon.get_queue_params(self.object, look_object)) end return else self.object:set_item(object.idle, wpn) return end end if self.st.look_position ~= nil and self.st.look_object == nil then if t == "sniper_fire" then self.object:set_item(object.fire1, wpn, 1, sniper_aim) else self.object:set_item(object.fire1, wpn, state_mgr_weapon.get_queue_params(self.object, nil)) end return else if self.st.target_state == "psy_shoot" then self.object:set_item(object.fire1, wpn) return end self.object:set_item(object.idle, wpn) return end return elseif t == "unstrapped" then --printf("[%s] not shooting", self.object:name()) self.object:set_item(state_mgr_weapon.get_idle_state(self.st.target_state), wpn) end end function act_state_mgr_end:finalize() action_base.finalize(self) end --' Лок менеджера class "act_state_mgr_locked" (action_base) function act_state_mgr_locked:__init(name, st) super (nil, name) self.st = st end function act_state_mgr_locked:initialize() action_base.initialize(self) end function act_state_mgr_locked:execute() action_base.execute(self) end function act_state_mgr_locked:finalize() action_base.finalize(self) end animation_reset_denied = { wounded = true, wounded_heavy = true, wounded_heavy_2 = true, wounded_heavy_3 = true, wounded_zombie = true } --' Сам менеджер class "state_manager" function state_manager:__init(npc) state_mgr_goap.goap_graph(self, npc) self.target_state = "idle" self.current_direction = nil self.target_position = nil self.current_object = nil self.combat = false self.alife = true self.emerg = {} self.synsound = nil self.yaw_delta = nil self.subanim = 0 self.need_reweapon = false end function state_manager:set_state(state_name, callback, timeout, target, emerg, synsound, extrakeys) printf("Set State called: for %s State: %s", self.npc:name(), state_name) if state_lib.states[state_name] == nil then abort("ERROR: ILLEGAL SET STATE CALLED!!! %s fo %s", tostring(state_name), self.npc:name()) end if target then if target.look_position then printf("look position: %s %s %s", target.look_position.x, target.look_position.y, target.look_position.z) else printf("look position: NIL") end if target.look_object then printf("look object: %s", target.look_object:name()) else printf("look object: NIL") end else printf("look target NIL") end --сперва устанавливаем цели if target ~= nil then self.look_position = target.look_position if target.look_object ~= nil then self.look_object = target.look_object:id() else self.look_object = nil end else self.look_position = nil self.look_object = nil end -- меняем угол точности. if extrakeys and extrakeys.yaw_delta ~= nil then self.yaw_delta = extrakeys.yaw_delta else self.yaw_delta = 5 end -- меняем глубину рекурсивности анимации. if extrakeys and extrakeys.subanim ~= nil then self.subanim = extrakeys.subanim else self.subanim = 0 end local switched = false local last_state = self.target_state if self.target_state ~= state_name then --' Если мы переключаемся из стреляющего состояния в нестреляющее - необходимо сразу же прекратить стрельбу if (state_lib.states[self.target_state].weapon == "fire" or state_lib.states[self.target_state].weapon == "sniper_fire") and (state_lib.states[state_name].weapon ~= "fire" and state_lib.states[state_name].weapon ~= "sniper_fire") then self.npc:set_item(state_mgr_weapon.get_idle_state(state_name), state_mgr_weapon.get_weapon(self.npc, state_name)) --printf("[%s] stop shooting", self.npc:name()) end --' Если мы переключаемся из идущего положения в стоящее - надо задизаблить перемещение if state_lib.states[self.target_state].movement ~= move.stand and state_lib.states[state_name].movement == move.stand then self.npc:movement_enabled(false) end self.target_state = state_name self.current_object = nil switched = true end if state_lib.states[state_name].reset == true then self.reset_state = true else self.reset_state = false end if switched and emerg ~= nil then if animation_reset_denied[last_state] ~= true then self.emerg.animation = emerg.animation self.emerg.animation_nout = emerg.animation_nout end end self.synsound = synsound self.callback = callback if timeout ~= nil and timeout >= 0 then self.callback.timeout = timeout self.callback.begin = nil else if self.callback then self.callback.func = nil self.callback.timeout = nil end end -- if switched == true then -- self:update() -- end end else printf("Set State called: for %s State: %s", self.npc:name(), state_name) if state_lib.states[state_name] == nil then abort("ERROR: ILLEGAL SET STATE CALLED!!! %s fo %s", tostring(state_name), self.npc:name()) end if target then if target.look_position then printf("look position: %s %s %s", target.look_position.x, target.look_position.y, target.look_position.z) else printf("look position: NIL") end if target.look_object then printf("look object: %s", target.look_object:name()) else printf("look object: NIL") end else printf("look target NIL") end --сперва устанавливаем цели if target ~= nil then self.look_position = target.look_position if target.look_object ~= nil then self.look_object = target.look_object:id() else self.look_object = nil end else self.look_position = nil self.look_object = nil end -- меняем угол точности. if extrakeys and extrakeys.yaw_delta ~= nil then self.yaw_delta = extrakeys.yaw_delta else self.yaw_delta = 5 end -- меняем глубину рекурсивности анимации. if extrakeys and extrakeys.subanim ~= nil then self.subanim = extrakeys.subanim else self.subanim = 0 end local switched = false local last_state = self.target_state if self.target_state ~= state_name then --' Если мы переключаемся из стреляющего состояния в нестреляющее - необходимо сразу же прекратить стрельбу if (state_lib.states[self.target_state].weapon == "fire" or state_lib.states[self.target_state].weapon == "sniper_fire") and (state_lib.states[state_name].weapon ~= "fire" and state_lib.states[state_name].weapon ~= "sniper_fire") then self.npc:set_item(state_mgr_weapon.get_idle_state(state_name), state_mgr_weapon.get_weapon(self.npc, state_name)) --printf("[%s] stop shooting", self.npc:name()) end --' Если мы переключаемся из идущего положения в стоящее - надо задизаблить перемещение if state_lib.states[self.target_state].movement ~= move.stand and state_lib.states[state_name].movement == move.stand then self.npc:movement_enabled(false) end self.target_state = state_name self.current_object = nil switched = true end if state_lib.states[state_name].reset == true then self.reset_state = true else self.reset_state = false end if switched and emerg ~= nil then if animation_reset_denied[last_state] ~= true then self.emerg.animation = emerg.animation self.emerg.animation_nout = emerg.animation_nout end end self.synsound = synsound self.callback = callback if timeout ~= nil and timeout >= 0 then self.callback.timeout = timeout self.callback.begin = nil else if self.callback then self.callback.func = nil self.callback.timeout = nil end end -- if switched == true then -- self:update() -- end end end function state_manager:get_state() return self.target_state end function state_manager:update() --printf("Update called") self.animstate:update() self.animation:update() self.planner:update() --self.planner:show("") end function set_state(npc, state_name, callback, timeout, target, emerg, synsound, extrakeys) if db.storage[npc:id()].state_mgr then db.storage[npc:id()].state_mgr:set_state(state_name, callback, timeout, target, emerg, synsound, extrakeys) end end function get_state(npc) if db.storage[npc:id()].state_mgr then return db.storage[npc:id()].state_mgr:get_state() end return nil end function bind_manager(object) local manager = object:motivation_action_manager() local properties = {} properties["state_mgr_idle_combat"] = xr_evaluators_id.state_mgr + 1 properties["state_mgr_idle_alife"] = xr_evaluators_id.state_mgr + 2 properties["state_mgr_idle_off"] = xr_evaluators_id.state_mgr + 3 local operators = {} operators["state_mgr_to_idle_combat"] = xr_actions_id.state_mgr + 1 operators["state_mgr_to_idle_alife"] = xr_actions_id.state_mgr + 2 operators["state_mgr_to_idle_off"] = xr_actions_id.state_mgr + 3 local state_manager = state_mgr.state_manager(object) manager:add_evaluator(properties["state_mgr_idle_combat"], evaluator_state_mgr_idle("state_mgr_idle_combat", state_manager)) manager:add_evaluator(properties["state_mgr_idle_alife"], evaluator_state_mgr_idle_alife("state_mgr_idle_alife", state_manager)) manager:add_evaluator(properties["state_mgr_idle_off"], evaluator_state_mgr_idle_off("state_mgr_idle_off", state_manager)) local action = this.act_state_mgr_to_idle("state_mgr_to_idle_combat", state_manager) action:add_precondition (world_property(properties["state_mgr_idle_combat"], false)) action:add_effect (world_property(properties["state_mgr_idle_combat"], true)) manager:add_action(operators["state_mgr_to_idle_combat"], action) -- Добавим ещё один тип отключения этого безобразия action = this.act_state_mgr_to_off("state_mgr_to_off", state_manager) action:add_precondition (world_property(properties["state_mgr_idle_off"], false)) action:add_effect (world_property(properties["state_mgr_idle_off"], true)) manager:add_action(operators["state_mgr_to_idle_off"], action) action = this.act_state_mgr_to_idle("state_mgr_to_idle_alife", state_manager) action:add_precondition (world_property(stalker_ids.property_enemy, false)) action:add_precondition (world_property(stalker_ids.property_danger,false)) action:add_precondition (world_property(properties["state_mgr_idle_alife"], false)) action:add_effect (world_property(properties["state_mgr_idle_alife"], true)) manager:add_action(operators["state_mgr_to_idle_alife"], action) action = manager:action(xr_actions_id.alife) action:add_precondition(world_property(properties["state_mgr_idle_alife"],true)) action = manager:action(stalker_ids.action_combat_planner) action:add_precondition(world_property(properties["state_mgr_idle_combat"],true)) action = manager:action(stalker_ids.action_anomaly_planner) action:add_precondition(world_property(properties["state_mgr_idle_combat"],true)) action = manager:action(stalker_ids.action_danger_planner) action:add_precondition(world_property(properties["state_mgr_idle_combat"],true)) action = manager:action(stalker_ids.action_gather_items) action:add_precondition(world_property(properties["state_mgr_idle_alife"],true)) return state_manager end ---------------------------------------------------------------------------------------------------------------------- -- Менеджер изменения состояния тела -- автор: Диденко Руслан (Stohe) -- TODO: ---------------------------------------------------------------------------------------------------------------------- function printf() end aim_ratio = 1000/50 min_ratio = 1500 --' Эвалуатор, который синхронизирует менеджер. --' Мы уже в безраличном состоянии idle или нет class "evaluator_state_mgr_idle" (property_evaluator) function evaluator_state_mgr_idle:__init(name, state_manager) super (nil, name) self.st = state_manager self.mgr = nil end function evaluator_state_mgr_idle:evaluate() if db.Dead2 == 0 then local t = self.st.target_state == "idle" and --not self.st.planner:evaluator(self.st.properties["locked"]):evaluate() and self.st.planner:evaluator(self.st.properties["movement"]):evaluate() and self.st.planner:evaluator(self.st.properties["animstate"]):evaluate() and self.st.planner:evaluator(self.st.properties["animation"]):evaluate() if t == true then if self.mgr == nil then self.mgr = self.object:motivation_action_manager() end if self.mgr:initialized() and self.mgr:current_action_id() == xr_actions_id.state_mgr + 1 then self.st.combat = true end end if self.st.combat == true then return true end return false end end --' Мы уже в безраличном состоянии idle или нет ()учет с проверкой alife class "evaluator_state_mgr_idle_alife" (property_evaluator) function evaluator_state_mgr_idle_alife:__init(name, state_manager) super (nil, name) self.st = state_manager self.t = nil end function evaluator_state_mgr_idle_alife:evaluate() if not self.object:alive() then return true end -- апдейт менеджера анимаций -- раньше он был тут, сейчас он вынесен из эвалуатора -- printf("SECTION %s", utils.to_str(db.storage[self.st.npc:id()].active_section)) mgr = self.object:motivation_action_manager() self.t = nil if mgr:initialized() then self.t = mgr:current_action_id() --printf("ACTION %s", utils.to_str(self.t)) if self.t ~= xr_actions_id.alife then self.st.alife = false end end if db.storage[self.st.npc:id()].active_section == nil then if xr_meet.is_meet(self.object) == false then local t = self.st.target_state == "idle" and not self.st.planner:evaluator(self.st.properties["locked"]):evaluate() and self.st.planner:evaluator(self.st.properties["movement"]):evaluate() and self.st.planner:evaluator(self.st.properties["animstate"]):evaluate() and self.st.planner:evaluator(self.st.properties["animation"]):evaluate() -- printf("%s", utils.to_str(self.st.target_state)) -- printf("%s", utils.to_str(self.st.planner:evaluator(self.st.properties["locked"]):evaluate())) -- printf("%s", utils.to_str(self.st.planner:evaluator(self.st.properties["movement"]):evaluate())) -- printf("%s", utils.to_str(self.st.planner:evaluator(self.st.properties["animstate"]):evaluate())) -- printf("%s", utils.to_str(self.st.planner:evaluator(self.st.properties["animation"]):evaluate())) if t == true then self.st.alife = true end if self.st.alife == true then return true end return t else return false end end return true end --' Переход в idle class "act_state_mgr_to_idle" (action_base) function act_state_mgr_to_idle:__init(name,state_manager) super (nil, name) self.st = state_manager end function act_state_mgr_to_idle:initialize() action_base.initialize(self) self.object:movement_enabled(true) if self.object:best_enemy() then self.st:set_state("idle", nil, nil, nil, {animation = true}) xr_sound.set_sound(self.object, nil) stop_play_sound(self.object) return end if self.object:best_danger() then self.st:set_state("idle", nil, nil, nil, {animation = true}) xr_sound.set_sound(self.object, nil) stop_play_sound(self.object) return end self.st:set_state("idle") end function act_state_mgr_to_idle:execute() action_base.execute(self) if self.object:best_enemy() then self.st:set_state("idle", nil, nil, nil, {animation = true}) return end if self.object:best_danger() then self.st:set_state("idle", nil, nil, nil, {animation = true}) return end self.st:set_state("idle") end function act_state_mgr_to_idle:finalize() -- По завершению перехода нужно записать -1 в указатель "на кого смотреть", -- чтобы при возврате было понятно что его нужно переинициализировать. self.st.current_object = -1 action_base.finalize(self) end --'------------------------------------------------------------------------------------- --' Эвалуаторы и экшены менеджера --'------------------------------------------------------------------------------------- --' Закончил ли менеджер свою работу class "eva_state_mgr_end" (property_evaluator) function eva_state_mgr_end:__init(name, st) super (nil, name) self.st = st self.mgr = nil end function eva_state_mgr_end:evaluate() if self.mgr == nil then self.mgr = self.object:motivation_action_manager() end if not self.mgr:initialized() then return false end local current_action_id = self.mgr:current_action_id() if current_action_id ~= stalker_ids.action_combat_planner and current_action_id ~= stalker_ids.action_danger_planner and current_action_id ~= stalker_ids.action_anomaly_planner then self.st.combat = false end return false end --' Залочен ли менеджер class "eva_state_mgr_locked" (property_evaluator) function eva_state_mgr_locked:__init(name, st) super (nil, name) self.st = st end function eva_state_mgr_locked:evaluate() --printf("npc %s", self.object:name()) --printf("weapon locked: %s", utils.to_str(self.st.planner:evaluator(self.st.properties["weapon_locked"]):evaluate())) --printf("direction locked: %s", utils.to_str(self.st.planner:evaluator(self.st.properties["direction_turning"]):evaluate())) --printf("animstate locked: %s", utils.to_str(self.st.planner:evaluator(self.st.properties["animstate_locked"]):evaluate())) --printf("animation locked: %s", utils.to_str(self.st.planner:evaluator(self.st.properties["animation_locked"]):evaluate())) --printf("combat[%s] alife[%s]", tostring(self.st.combat), tostring(self.st.alife)) if self.st.combat or self.st.alife then return true end return self.st.planner:initialized() and ( self.st.planner:evaluator(self.st.properties["weapon_locked"]):evaluate() or self.st.planner:evaluator(self.st.properties["animstate_locked"]):evaluate() or self.st.planner:evaluator(self.st.properties["animation_locked"]):evaluate() or self.st.planner:evaluator(self.st.properties["direction_turning"]):evaluate()) end --' Идловый экшн менеджера class "act_state_mgr_end" (action_base) function act_state_mgr_end:__init(name, st) super (nil, name) self.st = st end function act_state_mgr_end:initialize() action_base.initialize(self) end function act_state_mgr_end:execute() action_base.execute(self) -- if not self.st.planner:evaluator(self.st.properties["movement_stand_now"]):evaluate() then -- state_mgr_direction.update_movement_direction(self.object, self.st) -- end local t = state_lib.states[self.st.target_state].weapon local w = isWeapon(self.object:best_weapon()) if not w then return end if t == "fire" or t == "sniper_fire" then --printf("[%s] shooting", self.object:name()) local sniper_aim = 3000 if self.st.look_object ~= nil then local look_object = level.object_by_id(self.st.look_object) if look_object == nil then self.st.look_object = nil return end if self.object:see(look_object) ~= nil and (not IsStalker(look_object) or self.object:relation(look_object) == game_object.enemy) and look_object:alive() == true then if t == "sniper_fire" then sniper_aim = self.object:position():distance_to(look_object:position())*aim_ratio if sniper_aim <= min_ratio then self.object:set_item(object.fire1, self.object:best_weapon(), 1, min_ratio) return end self.object:set_item(object.fire1, self.object:best_weapon(), 1, sniper_aim) else self.object:set_item(object.fire1, self.object:best_weapon(), state_mgr_weapon.get_queue_params(self.object, look_object)) end return else self.object:set_item(object.idle, self.object:best_weapon()) return end end if self.st.look_position ~= nil and self.st.look_object == nil then if t == "sniper_fire" then self.object:set_item(object.fire1, self.object:best_weapon(), 1, sniper_aim) else self.object:set_item(object.fire1, self.object:best_weapon(), state_mgr_weapon.get_queue_params(self.object, nil)) end return else if self.st.target_state == "psy_shoot" then self.object:set_item(object.fire1, self.object:best_weapon()) return end self.object:set_item(object.idle, self.object:best_weapon()) return end return elseif t == "unstrapped" then --printf("[%s] not shooting", self.object:name()) self.object:set_item(state_mgr_weapon.get_idle_state(self.st.target_state), self.object:best_weapon()) end end function act_state_mgr_end:finalize() action_base.finalize(self) end --' Лок менеджера class "act_state_mgr_locked" (action_base) function act_state_mgr_locked:__init(name, st) super (nil, name) self.st = st end function act_state_mgr_locked:initialize() action_base.initialize(self) end function act_state_mgr_locked:execute() action_base.execute(self) end function act_state_mgr_locked:finalize() action_base.finalize(self) end animation_reset_denied = { wounded = true, wounded_heavy = true, wounded_heavy_2 = true, wounded_heavy_3 = true, wounded_zombie = true } --' Сам менеджер class "state_manager" function state_manager:__init(npc) state_mgr_goap.goap_graph(self, npc) self.target_state = "idle" self.current_direction = nil self.target_position = nil self.current_object = nil self.combat = false self.alife = true self.emerg = {} self.synsound = nil self.yaw_delta = nil self.subanim = 0 self.need_reweapon = false end function state_manager:set_state(state_name, callback, timeout, target, emerg, synsound, extrakeys) local is_zombied = self.npc:section() if is_zombied ~= "stalker_zombied" and db.Dead2 == 1 and Psy.Return_Q2NPC(self.npc,"l05_bar",123,140,18,30,-6,0) == 0 and Psy.Return_Q2NPC(self.npc,"l08_yantar",26,40,-279,-269,-16,0) == 0 then if state_name == state_name then if state_name ~= db.DState and state_name ~= "wounded_heavy_2" then state_name = db.DState end printf("Set State called: for %s State: %s", self.npc:name(), state_name) if state_lib.states[state_name] == nil then abort("ERROR: ILLEGAL SET STATE CALLED!!! %s fo %s", tostring(state_name), self.npc:name()) end if target then if target.look_position then printf("look position: %s %s %s", target.look_position.x, target.look_position.y, target.look_position.z) else printf("look position: NIL") end if target.look_object then printf("look object: %s", target.look_object:name()) else printf("look object: NIL") end else printf("look target NIL") end --сперва устанавливаем цели if target ~= nil then self.look_position = target.look_position if target.look_object ~= nil then self.look_object = target.look_object:id() else self.look_object = nil end else self.look_position = nil self.look_object = nil end -- меняем угол точности. if extrakeys and extrakeys.yaw_delta ~= nil then self.yaw_delta = extrakeys.yaw_delta else self.yaw_delta = 5 end -- меняем глубину рекурсивности анимации. if extrakeys and extrakeys.subanim ~= nil then self.subanim = extrakeys.subanim else self.subanim = 0 end local switched = false local last_state = self.target_state if self.target_state ~= state_name then --' Если мы переключаемся из стреляющего состояния в нестреляющее - необходимо сразу же прекратить стрельбу if (state_lib.states[self.target_state].weapon == "fire" or state_lib.states[self.target_state].weapon == "sniper_fire") and (state_lib.states[state_name].weapon ~= "fire" and state_lib.states[state_name].weapon ~= "sniper_fire") then self.npc:set_item(state_mgr_weapon.get_idle_state(state_name), state_mgr_weapon.get_weapon(self.npc, state_name)) --printf("[%s] stop shooting", self.npc:name()) end --' Если мы переключаемся из идущего положения в стоящее - надо задизаблить перемещение if state_lib.states[self.target_state].movement ~= move.stand and state_lib.states[state_name].movement == move.stand then self.npc:movement_enabled(false) end self.target_state = state_name self.current_object = nil switched = true end if state_lib.states[state_name].reset == true then self.reset_state = true else self.reset_state = false end if switched and emerg ~= nil then if animation_reset_denied[last_state] ~= true then self.emerg.animation = emerg.animation self.emerg.animation_nout = emerg.animation_nout end end self.synsound = synsound self.callback = callback if timeout ~= nil and timeout >= 0 then self.callback.timeout = timeout self.callback.begin = nil else if self.callback then self.callback.func = nil self.callback.timeout = nil end end -- if switched == true then -- self:update() -- end end else printf("Set State called: for %s State: %s", self.npc:name(), state_name) if state_lib.states[state_name] == nil then abort("ERROR: ILLEGAL SET STATE CALLED!!! %s fo %s", tostring(state_name), self.npc:name()) end if target then if target.look_position then printf("look position: %s %s %s", target.look_position.x, target.look_position.y, target.look_position.z) else printf("look position: NIL") end if target.look_object then printf("look object: %s", target.look_object:name()) else printf("look object: NIL") end else printf("look target NIL") end --сперва устанавливаем цели if target ~= nil then self.look_position = target.look_position if target.look_object ~= nil then self.look_object = target.look_object:id() else self.look_object = nil end else self.look_position = nil self.look_object = nil end -- меняем угол точности. if extrakeys and extrakeys.yaw_delta ~= nil then self.yaw_delta = extrakeys.yaw_delta else self.yaw_delta = 5 end -- меняем глубину рекурсивности анимации. if extrakeys and extrakeys.subanim ~= nil then self.subanim = extrakeys.subanim else self.subanim = 0 end local switched = false local last_state = self.target_state if self.target_state ~= state_name then --' Если мы переключаемся из стреляющего состояния в нестреляющее - необходимо сразу же прекратить стрельбу if (state_lib.states[self.target_state].weapon == "fire" or state_lib.states[self.target_state].weapon == "sniper_fire") and (state_lib.states[state_name].weapon ~= "fire" and state_lib.states[state_name].weapon ~= "sniper_fire") then self.npc:set_item(state_mgr_weapon.get_idle_state(state_name), state_mgr_weapon.get_weapon(self.npc, state_name)) --printf("[%s] stop shooting", self.npc:name()) end --' Если мы переключаемся из идущего положения в стоящее - надо задизаблить перемещение if state_lib.states[self.target_state].movement ~= move.stand and state_lib.states[state_name].movement == move.stand then self.npc:movement_enabled(false) end self.target_state = state_name self.current_object = nil switched = true end if state_lib.states[state_name].reset == true then self.reset_state = true else self.reset_state = false end if switched and emerg ~= nil then if animation_reset_denied[last_state] ~= true then self.emerg.animation = emerg.animation self.emerg.animation_nout = emerg.animation_nout end end self.synsound = synsound self.callback = callback if timeout ~= nil and timeout >= 0 then self.callback.timeout = timeout self.callback.begin = nil else if self.callback then self.callback.func = nil self.callback.timeout = nil end end -- if switched == true then -- self:update() -- end end end function state_manager:get_state() return self.target_state end function state_manager:update() --printf("Update called") self.animstate:update() self.animation:update() self.planner:update() --self.planner:show("") end function set_state(npc, state_name, callback, timeout, target, emerg, synsound, extrakeys) if db.storage[npc:id()].state_mgr then db.storage[npc:id()].state_mgr:set_state(state_name, callback, timeout, target, emerg, synsound, extrakeys) end end function get_state(npc) if db.storage[npc:id()].state_mgr then return db.storage[npc:id()].state_mgr:get_state() end return nil end function bind_manager(object) local manager = object:motivation_action_manager() local properties = {} properties["state_mgr_idle_combat"] = xr_evaluators_id.state_mgr + 1 properties["state_mgr_idle_alife"] = xr_evaluators_id.state_mgr + 2 local operators = {} operators["state_mgr_to_idle_combat"] = xr_actions_id.state_mgr + 1 operators["state_mgr_to_idle_alife"] = xr_actions_id.state_mgr + 2 local state_manager = state_mgr.state_manager(object) manager:add_evaluator(properties["state_mgr_idle_combat"], evaluator_state_mgr_idle("state_mgr_idle_combat", state_manager)) manager:add_evaluator(properties["state_mgr_idle_alife"], evaluator_state_mgr_idle_alife("state_mgr_idle_alife", state_manager)) local action = this.act_state_mgr_to_idle("state_mgr_to_idle_combat", state_manager) action:add_precondition (world_property(properties["state_mgr_idle_combat"], false)) action:add_effect (world_property(properties["state_mgr_idle_combat"], true)) manager:add_action(operators["state_mgr_to_idle_combat"], action) action = this.act_state_mgr_to_idle("state_mgr_to_idle_alife", state_manager) action:add_precondition (world_property(stalker_ids.property_enemy, false)) action:add_precondition (world_property(stalker_ids.property_danger,false)) action:add_precondition (world_property(properties["state_mgr_idle_alife"], false)) action:add_effect (world_property(properties["state_mgr_idle_alife"], true)) manager:add_action(operators["state_mgr_to_idle_alife"], action) action = manager:action(xr_actions_id.alife) action:add_precondition(world_property(properties["state_mgr_idle_alife"],true)) action = manager:action(stalker_ids.action_combat_planner) action:add_precondition(world_property(properties["state_mgr_idle_combat"],true)) action = manager:action(stalker_ids.action_anomaly_planner) action:add_precondition(world_property(properties["state_mgr_idle_combat"],true)) action = manager:action(stalker_ids.action_danger_planner) action:add_precondition(world_property(properties["state_mgr_idle_combat"],true)) action = manager:action(stalker_ids.action_gather_items) action:add_precondition(world_property(properties["state_mgr_idle_alife"],true)) return state_manager end Изменено 1 Февраля 2010 пользователем TREWKO Ссылка на комментарий
lekzd 1 Опубликовано 2 Февраля 2010 Поделиться Опубликовано 2 Февраля 2010 TREWKO, Неясна конкретная задача - хочешь, можно от балды сравнить два файла и добавить недостающие строки - работать будет навряд ли i-igroman.ru - Мой, принципиально новый сайт о компьютерных играх Ссылка на комментарий
DiXares 1 Опубликовано 2 Февраля 2010 Поделиться Опубликовано 2 Февраля 2010 (изменено) lekzd, это надо адаптировать PsyZones and Emission к AI паку. Вот ещё: Делаю проверку на броню: function check_armor() local wpn,arm local armor = db.actor:item_in_slot(6) local weapon = db.actor:item_in_slot(2) if weapon then wpn = weapon:section() else wpn = "no_weapon" end if armor then arm = armor:section() else arm = "no_armor" end if string:find(wpn,"wpn_pm") or string:find(wpn,"wpn_bm16") or string:find(wpn,"wpn_ak74") then -- через 'or' пиши сколько нужно стволов if (not string.find(arm, "exo" )) then db.actor:drop_item(weapon) local temp = alife():create("wpn_ak74",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),d b.actor:id()) db.actor:transfer_item(weapon,db.actor) alife():release(temp) news_manager.send_tip(db.actor,"Невозможно взять пулемёт в руки без экзы",nil,nil,10000) end end end end Скрипт из темы рядом. Всё это в скрипте DiVaresCheckArmor.script Апдейт в bind_stalker.script Но возникает ошибка: FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ...k.e.r.chernobyl\gamedata\scripts\bind_stalker.script:250: attempt to index global 'DiVaresCheckArmor' (a nil value) stack trace: Изменено 2 Февраля 2010 пользователем TREWKO Ссылка на комментарий
ZeeK 57 Опубликовано 2 Февраля 2010 Поделиться Опубликовано 2 Февраля 2010 Вроде здесь еще отвечают на вопросы, да и контекст моего вопроса подходит вроде.. Короче не могу заспавнить в ЗП НПС через поршень как например было в ТЧ, например если даю так <action>spawn_test.spawn_muzhik1</action> а в spawn_test: function spawn_muzhik1() alife():create("muzhik1",vector():set(31.494121551514,3.8283228874207,373.46026611328),1008321,59) то ничего не происходит, а если через биндер при старте игры то все работает, помогите разобраться! Не соответствует. N6260 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти