DiXares 1 Опубликовано 27 Августа 2009 Сталкеры, а есть скрипт, который отлавливает из консоли строчку(текст)? Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 29 Января 2010 Товарищи Сталкеры! Нужна помощь по такому поводу: Необходимо сделать проверку на предмет в определённом радиусе(по x,y,z,gvid,lvid) в онлайне(не инвентаре). И необходимо, что бы предмет был всегда в онли, даже если ты перешёл на другую локацию(такое возможно?). Может сделать что то вроде этого: function check() if прдмет в онли? then if item(предмет в зоне сферы?) then звук воспроизводится(s_play) else .... И ещё, код: this читает функцию из из самого файла, в котором она запускается? Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 31 Января 2010 (изменено) Товарищи! Возможно ли с помощью скрипта заменять текстуру? Например: Диалог--->xrTexture.smena() Сам скрипт: function smena(); wpn\wpn_gauss1--->wpn\wpn_gauss2(Старая текстура--->Новая текстура) Нужно сделать скрипт. Сообщение от модератора n6260 Можно скриптом подменить на модель с нужной текстурой (или конфигом), как у Кирага в "ночных прицелах". Изменено 31 Января 2010 пользователем n6260 Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 31 Января 2010 (изменено) Понятно, просто хочу сделать смену времён года. Придётся через протоптанный путь. А вот ещё: Играл в сборку: AMK+NLC+HC3. И там было задание: По моему: Доставить на армейские склады рессивер от экологов на водонапорную башню в деревеньке. Насколько я понял, там есть скрипт на проверку установлен ли предмет? Только вот найти его не могу. Хочу сделать что то вроде этого: Отнёс предмет на нужное место, скрипт заработал, иначе не будет работать. Сообщение от модератора n6260 Это Сяковский квест. Спроси у него. Изменено 31 Января 2010 пользователем n6260 Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 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 Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 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 Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 2 Февраля 2010 (изменено) lekzd. Sorry, the file you requested is not available. Вот что пишет. А всё, скачал с другого. Вот что он у меня нашёл: Checking D:\S.T.A.L.K.E.R.Chernobyl\gamedata\scripts\DiVaresCheckArmor.script: DiVaresCheckArmor.script (22): mismatched input 'b' expecting ')' DiVaresCheckArmor.script (22): mismatched input ')' expecting 'end' Found 2 errors. Оказалось, проблема была в табуляции. Было так: local temp = alife():create("wpn_ak74",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),d b.actor:id()) А надо так: local temp = alife():create("wpn_ak74",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) Но даже после этого та же ошибка. Изменено 2 Февраля 2010 пользователем TREWKO Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 4 Февраля 2010 Сталкеры! Вот у меня есть код: function intr() local htime = level.get_time_hours() if htime == 12 and level.get_weather("default") then local sactor = alife():actor() local cactor = level.object_by_id(sactor.id) cactor:give_game_news( "%c[255,255,1,1]Система\\n%c[255,1,255,1]Тест", "ui\\ui_iconstotal", Frect():set(498,141,83,47), math.random(1000, 3000), 50000 ) end end Я её забиндил. Теперь в 12 часов выходит сообщение. Но! Это сообщение приходит целый час. То есть целая куча. Пробовал вместо 12 писать 12:00:00 но выходит ошибка. Помогите пожалуйста. Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 6 Февраля 2010 malandrinus, а можно пример этого флажка? Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 11 Февраля 2010 кровоSTALKER. А зачем if lck3_auto then ? Надо просто: function actor_binder:update(delta) ... chimera_mod.vvod_antirada() Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 13 Февраля 2010 (изменено) Товарищи! Как сделать одиночное выполнение функции? Функция спавна. Засунут в биндер. И ещё: Enable = 1 function test() if Enable == 1 then local dtime = level.get_time_days() local htime = level.get_time_hours() local mtime = level.get_time_minutes() if dtime == 1 and htime == 0 and mtime == 0 then функция спавна... end end end Как правильно записать дату? Пишу например: dtime == 1.02.2012, но происходит вылет. Изменено 14 Февраля 2010 пользователем TREWKO Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 20 Февраля 2010 А есть ли функция, что то вроде этой: function test() if дистанция между двумя графпойнтами (game_grpah_1 и game_grpah_2) == 1000 метров(или 1 км) then моя функция... end end Дак вот, надо написать это: дистанция между двумя графпойнтами (game_grpah_1 и game_grpah_2) == 1000 метров(или 1 км) в виде Lua, но как? Может у кого есть предложения? Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 21 Февраля 2010 (изменено) RvP. А vid1 и vid2 это названия грфпойнотов? return game_graph():vertex(vid1):game_point():distance_to(game_graph():vertex(vid2):gam e_point()) Это сравнение? И как сделать константу дистанции? Типа: if distance == 1000 then ... end Изменено 21 Февраля 2010 пользователем TREWKO Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 21 Февраля 2010 (изменено) И ещё вопросец, как можно скриптом заглушить звук? Знаю, что есть скрипт воспроизведения, остановки, а заглушения есть? И как будет дистанция между графпойнтом и актором? Так: game_graph():vertex(vid1):game_point():distance_to(db:actor())? Расстояние в метрах? Изменено 21 Февраля 2010 пользователем TREWKO Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 21 Февраля 2010 (изменено) 8push5, RvP, спасибо вам огромное! Вот ещё: function outfit_hud() local outfit = db.actor:item_in_slot(6) if outfit ~= nil then local hudoutfit = outfit:section() if hudoutfit=="exo_div_outfit" then local hud = get_hud() hud:AddCustomStatic("hud_cop_static", true) elseif hudoutfit==nil then local hud = get_hud() hud:RemoveCustomStatic("hud_cop_static", false) end end end end Нужно выполнить проверку надетого костюма. А если костюм тот, который нужен, то вывести на худ текстуру. А если костюм не тот, то удалить с худа текстуру. Вроде сделал, но не так работает. Надел костюм, появилась текстура на худе. Снял костюм, текстура осталась, хотя должна была скрыться. Одел другой костюм, исчезла. Помогите пожалуйста. Изменено 21 Февраля 2010 пользователем TREWKO Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 21 Февраля 2010 (изменено) 8push5, спасибо! Заработало! Изменено 21 Февраля 2010 пользователем TREWKO Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 21 Февраля 2010 Это опять я)) Каким методом можно узнать состояние предмета? Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 3 Марта 2010 (изменено) Каким методом, скриптом добавить диалог нпс? Что бы, вроде: local push = true local item = db.actor:object("wpn_pm") function test() if item and push then добавить диалог... Выдать мессагу... push = false end end Мессагу знаю как сделать. Но как про диалог? И не подскажете чтение ini файла и запись, посредством Lua? Изменено 3 Марта 2010 пользователем TREWKO Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 7 Марта 2010 Помогите пожалуйста: function test() local obj = "scaner_anm" if obj:position():distance_to(db.actor:position()) == 10 then level.add_pp_effector ("proba.ppe", 1974, false) end end Где ошибка? А то вылет получаю. Поделиться этим сообщением Ссылка на сообщение
DiXares 1 Опубликовано 7 Марта 2010 (изменено) А как получить объект? Это типа: if obj ~= nil then ...? Вот лог: 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: ....l.k.e.r.chernobyl\gamedata\scripts\divaresix.script:56: attempt to call method 'position' (a nil value) stack trace: Lua.script нет. Есть lua_help.script Изменено 7 Марта 2010 пользователем TREWKO Поделиться этим сообщением Ссылка на сообщение