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

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


Svoboда

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

(изменено)

Получаю безлоговый вылет при загрузке новой игры. Пытался создать новую модель поведения. Модель - достаточно простая, состоит из одного условия и одного действия.

 

Сам скрипт модели:

local scheme_status={}
local property_need_to_trade = 1821327

class "evaluator_need_to_trade" (property_evaluator)
function evaluator_need_to_trade:__init(name, storage) super (nil, name)
    self.st = storage
end

function evaluator_need_to_trade:evaluate()
    amk.ls_send_tip(self.object:character_name().." evaluate()")
    if self.st==nil or self.st.enabled~=true then
        -- модель поведения запрещена
        return false
    end

    if not db.actor then
        -- ГГ ещё не заспаунился
        return false
    end
    if self.object:best_enemy() then
         return false -- Блокирование во время боя
    end
    local npc = self.object
    --нет ни одной аптечки, нет всего набора хавчика, при том, что деньги ещё остались
    if npc:money() < 100 then return false end -- денег нет - и суда нет
    local vertex = get_nearest_trader_vertex()
    if npc:level_vertex_id() == vertex then disable_scheme(npc,"npc_want_trade") end --дошёл до торговца
    if (npc:object("medkit")==nil
        and npc:object("medkit_army")== nil
        and npc:object("medkit_scientic")==nil) then return true
    end

    if npc:object("bread") == nil or
        npc:object("kolbasa") == nil or
        npc:object("conserva") == nil then return true
    end

    return false
end

class "action_go_to_trader" (action_base)
function action_go_to_trader:__init(name, storage) super (nil, name)
    self.st=storage
end
function action_go_to_trader:initialize()
    action_base.initialize(self)
    local npc=self.object
    npc:set_desired_position()
    npc:set_desired_direction()
    npc:clear_animations()
    npc:set_detail_path_type(move.line)
    npc:set_body_state(move.standing)
    npc:set_movement_type(move.run)
    npc:set_path_type(game_object.level_path)
    npc:set_mental_state(anim.danger)
    npc:set_sight(look.danger, nil, 0)
    npc:remove_all_restrictions()
    self.offset=vector():set(math.random()*6-3,0,math.random()*6-3)
    self.offset:normalize()
end

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

function action_go_to_trader:finalize()
    action_base.finalize (self)
end

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

    manager:remove_evaluator(property_need_to_trade)
    manager:add_evaluator(property_need_to_trade, evaluator_need_to_trade("npc_want_trade",st))
    local action = this.action_go_to_trader("action_go_to_trader",st)
    action:add_precondition(world_property(stalker_ids.property_alive, true))
    action:add_precondition(world_property(property_wounded, false))
    if anomaly_evader then
        action:add_precondition (world_property(1099,false))
    end
    action:add_precondition(world_property(property_need_to_trade, true))
    action:add_effect (world_property(property_need_to_trade, false))
    xr_motivator.addCommonPrecondition(action)
    manager:add_action (action_go_to_trader, action)
    -- Теперь подкорректируем стандартные операторы, чтобы помощник не отвлекался на всякую ерунду.
    action=manager:action(stalker_ids.action_alife_planner)
    action:add_precondition(world_property(property_need_to_trade, false))
    action=manager:action(stalker_ids.action_combat_planner)
    action:add_precondition(world_property(property_need_to_trade, false))
    action=manager:action(stalker_ids.action_danger_planner)
    action:add_precondition(world_property(property_need_to_trade, false))
end

function set_need_trade(npc,ini)
    local st = xr_logic.assign_storage_and_bind(npc, ini, "npc_want_trade","npc_want_trade")
    st.enabled=true
    scheme_status[npc:id()]=true
end

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

function get_nearest_trader_vertex()
    return 64955--заглушка временная, для кордона
end

 

Зарегистрировал в modues.script

if npc_trade then -- в этой строке мы проверяем что наш скрипт действительно существует
    load_scheme("npc_trade", "npc_want_trade", stype_stalker)
end

 

Запускаю модель автоматом в xr_logic.script, в функции enable_generic_schemes(ini, npc, stype, section)

if npc_trade then npc_trade.set_need_trade(npc,ini) end

 

Деактивирую так же автоматом в xr_logic.script, в функции disable_generic_schemes(npc, stype)

if npc_trade then npc_trade.disable_scheme(npc,"npc_want_trade") end

 

В xr_motivator.script в функции addCommonPrecondition(action) чтобы заблокировать стандартные схемы поведения:

if npc_trade then
    action:add_precondition (world_property(npc_trade.property_need_to_trade,false))
end

 

Ну и последнее, в функцию xr_motivator.net_spawn()

if npc_trade then
    local manager = self.object:motivation_action_manager()
    manager:add_evaluator(npc_trade.property_need_to_trade, property_evaluator_const(false))
end

 

Где может быть ошибка? Может, ошибка не синтаксическая, а логическая?

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

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


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

 

 


В фунции add_to_binder надо вместо вызова функции xr_motivator.addCommonPrecondition просто скопировать ее содержимое, за исключением условия, которое приводит к вылету.

 

Попробовал, вылетает. Всё также безлогово

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


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

Замучался я с этой схемой. Жаль, что движок не выдаёт ошибок в действии модели поведения.

Может, у кого ещё есть идеи,  в чём ошибка?  А то я всё больше склоняюсь к мысли не мучаться с "правильными" методами реализации поведения сталкеров, как это делали разработчики, а просто написать код без классов, который будет делать тоже самое. Потому как послать сталкера к торговцу "по простому" у меня заняло 15 минут, а здесь неделю)

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


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

Кто-нибудь знает способ сохранения данных в ТЧ? Просто мне нужно при запуске(именно при запуске, т.е. в главном меню) игры узнать результат предыдущей (одну переменную). Пробовал через Lua io.open, но не получается (я так понял, эти функции есть только в ЗП и ЧН). Помог бы конечно amk.save_variable, но ведь она действует только при уже загруженной игре.

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


Ссылка на сообщение
(изменено)

Действительно, вариант Charsi работает, спасибо.

Кому понадобится, немного растолкую суть этого метода.

-- Сохранение данных в S.T.A.L.K.E.R. Тень Чернобыля
local value = 0 -- переменная, которую нужно сохранить-считать
local concomm ="sv_vote_enabled" -- строка в конфиге my_config.ltx, после которой будет значение нашей переменной
local con = get_console()

function var_load()
con:execute("cfg_load my_config") -- загружаем наш конфиг
value = con:get_string(concomm) -- получаем значение, котрое идёт после sv_vote_enabled
con:execute("cfg_load user")--загружаем стандартный конфиг user.ltx
end

function var_save()
con:execute("cfg_load my_config")-- загружаем наш конфиг
con:execute(concomm.." "..value) --сохраняем значение переменной
con:execute("cfg_save my_config") -- сохраняем конфиг
con:execute("cfg_load user") -- загружаем стандартный
end 

 

my_config будет лежать там же, где и user.ltx

Значение переменной vaue после загрузки будет не числовым, а строковым, и, к примеру, проверка её значения будет выглядеть так:

if value == '3' then -- do something
end

 

 

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

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


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

Кто нибудь отправлял НПС на другую локацию? 

utils.send_to_nearest_accessible_vertex( npc, vertex_id )
npc:set_dest_level_vertex_id(vertex_id)

действуют в пределах локации, т.к. требуется level_vertex текущей локации ГГ

Приходит на ум прописать сталкеру smart_terrain на другой локации,c помощью amk.write_stalker_params(), но метод какой-то криминальный).

Может, кто знает более легальный метод?

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


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

 

 


Требуется смарт, требуется прописать в него непися, требуется заранее подготовить пути.

Жаль конечно, что для массовки такой метод не подходит. Может быть тогда поступать как разработчики в ЗП, т.е. гнать НПС на край локации, как дойдёт - удалять его, заспавнив его же уже на другой локации. Но так, как я понимаю, НПС через 1 локацию не отправить, только на соседнюю.

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


Ссылка на сообщение
(изменено)

А если так:


(Упс, не заметил, что ТЧ, да не вижу, как удалить)
self.back = CUIStatic()
	self.back:SetWndRect(Frect():set(200,150,500,550))
    self.back:InitTexture("ui\\computer\\text_window_note")
    self.back:SetWndPos(vector2():set(200,150))
	self.back:SetWndSize(vector2():set(500,550))
	self.back:SetStretchTexture(true)	
    self:AttachChild(self.back)
Изменено пользователем dukekan

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


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

Кто-нибудь может подсказать, как подключить luaxml?

Я сделал просто, скопировал все файлы в bin, вот они: http://hkar.ru/HGkt

Потом на первом апдейте актора проверяю по примеру:

	require("LuaXML")
	-- load XML data from file "test.xml" into local table xfile
	local xfile = xml.load("test.xml")
	-- search for substatement having the tag "scene"
	local xscene = xfile:find("scene")
	-- if this substatement is found...
	if xscene ~= nil then
	  --  ...print it to screen
	  debug_info.stip("xml" .. xscene)
	  --  print attribute id and first substatement
	  debug_info.stip("xml" ..  tostring(xscene.id) .. tostring(xscene[1]) )
	  -- set attribute id
	  xscene["id"] = "newId"
	else
		debug_info.stip("xml nod not found")
	end 

Но апдейт вешается на строке с загрузкой xml.load.

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


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

Вот здесь : http://www.amk-team.ru/forum/topic/6185-skriptovanie/page-349#entry985779

есть упоминание о правке в XE о получениии (и установке) свойств артефактов по смещению. Никто не натыкался на похожее, только под ЗП?

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


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

Можно ли скриптово узнать, есть ли в шлеме/костюме ПНВ и какого он поколения (ЗП)?

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


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

Всем привет. У меня есть вопрос, кто может - подскажите пожалуйста.

Есть идея упростить адаптацию заранее правильно подготовленной модификации к другим, но не хватает знаний по устройству классов Lua.

 

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

 

А вот со скриптами - непонятно. Возможно ли наследование классов Lua от друг друга? Тогда можно будет переопределить к примеру метод update класса actor_binder в своём классе, в нём вызвать метод родителя, для правильной работы механизмов игры и чужих скриптов, а далее уже дописывать свои необходимые действия в этот метод. И чужое не ломаем, и своё дописали так, что работает и адаптировать этот скрипт просто - положили в папку scripts и готово. Возможно ли такое?

 

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


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

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

AMK-Team.ru

×
×
  • Создать...