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

[SoC] Ковыряемся в файлах

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

Всем доброго времени суток!
Возникла такая проблема:
Заспавнил БТР (На новой локации), прописал такую логику:

 

 

[logic]
active = ph_car1


[ph_car1]
target = none
on_info = {+hit_pred_post_nato}ph_car2


[ph_car2]
target = actor 

 

 

 

 

 

[11507]
; cse_abstract properties
section_name = m_car
name = predbannik_btr_0001
position = -549.025146484375,15.1510124206543,263.254852294922
direction = 0,2.98080086708069,0


; cse_alife_object properties
game_vertex_id = 3870
distance = 0
level_vertex_id = 7
object_flags = 0xffffff3a
custom_data = <<END
[logic]
cfg = scripts\blockpost_btr.ltx
END
; cse_visual properties
visual_name = physics\vehicles\btr\veh_btr_script_u_01


; cse_ph_skeleton properties


; cse_alife_car properties
health = 1

 

 

Выдаю значит ему инфопоршень (пробовал всеми различными способами выдавать),выдал, но он как не стрелял так и не стреляет.

 

P.S. Боюсь что это из-за неполадок с xr_logic.script, так что скину и его.

 

 

function configure_schemes(npc, ini, ini_filename, stype, section_logic, gulag_name)
	--printf("DEBUG: enable_scripts: npc:name()=%s", npc:name())

	local npc_id = npc:id()
	local st     = db.storage[npc_id]

	-- если какая-то схема была до этого активна, деактивировать её
	if st.active_section then
		issue_event(npc, st[st.active_scheme], "deactivate", npc)
	end

	local actual_ini
	local actual_ini_filename
	if not ini:section_exist(section_logic) then
		if not gulag_name then
			-- Общие схемы должны работать и без logic:
			actual_ini_filename = ini_filename
			actual_ini = ini -- персонаж не обязательно должен иметь секцию logic
		else
			-- Иначе это персонаж Gulag-а и ему не задали работу:
			abort("ERROR: object '%s': unable to find section '%s'", npc:name(), section_logic)
		end
	else
		local filename = utils.cfg_get_string(ini, section_logic, "cfg", npc, false, "")
		if filename then
			printf("_bp: enable_scripts: object '%s' has external configuration file '%s'", npc:name(), filename)
			-- Рекурсивно обработать конфигурационный файл, на который ссылается поле cfg
			actual_ini_filename = filename
			actual_ini = ini_file(filename)
			return configure_schemes(npc, actual_ini, actual_ini_filename, stype, section_logic, gulag_name)
			--[[
			if actual_ini:line_count(section_logic) == 0 then
				abort("file '%s' does not exist or is empty, or has no section '%s'",
					filename, section_logic)
			end
			--]]
		else
			printf("_bp: enable_scripts: object '%s' has NO external configuration file, using '%s'", npc:name(), ini_filename)
			actual_ini_filename = ini_filename
			actual_ini = ini
		end
	end

	-- Поскольку в момент активации схемы могли работать ранее установленные общие схемы, нужно их все отключить:
	disable_generic_schemes(npc, stype)
	-- Включаем все общие схемы (раненный, коллбек на попадание и т.д.):
	enable_generic_schemes(actual_ini, npc, stype, section_logic)

	-- Инициализация торговли
	if stype == modules.stype_stalker or
	   npc:clsid() == clsid.script_trader
	then
		local trade_ini = utils.cfg_get_string(actual_ini, section_logic, "trade", npc, false, "", "misc\\trade_generic.ltx")
		trade_manager.trade_init(npc, trade_ini)
	end
	
	st.active_section = nil
	st.active_scheme = nil
	if gulag_name then
		st.gulag_name = gulag_name
	else
		st.gulag_name = ""
	end
	st.stype = stype
	st.ini = actual_ini
	st.ini_filename = actual_ini_filename
	st.section_logic = section_logic

	return st.ini
end

-- Вызывается биндером с целью определить первую активную схему
function determine_section_to_activate(npc, ini, section_logic, actor)
	if not ini:section_exist(section_logic) then
		return "nil"
	end

	-- Распарсить строку выбора активной секции с учетом команд, заключенных в %%
	local active_section_cond = cfg_get_condlist(ini, section_logic, "active", npc)
	local active_section
	if not active_section_cond then
		abort("object '%s': section '%s': unable to find field 'active'", npc:name(), section_logic)
	else
		active_section = pick_section_from_condlist(actor, npc, active_section_cond.condlist)
		if not active_section then
			abort("object '%s': section '%s': section 'active' has no conditionless else clause",
				npc:name(), section_logic)
		end
	end
	return active_section
end

------------------------------------------------------------------------------------------------------------
-- ВНОСЯ ИЗМЕНЕНИЯ В ЭТУ ФУНКЦИЮ, НЕ ЗАБЫВАЙТЕ ДОБАВЛЯТЬ СООТВЕТСТВУЮЩИЕ СТРОКИ И В enable_generic_schemes
------------------------------------------------------------------------------------------------------------
function disable_generic_schemes(npc, stype)
	if stype == modules.stype_stalker then    
            xr_combat.disable_scheme(npc, "combat")  
            xr_use.disable_scheme(npc, "use")
		    xr_hit.disable_scheme(npc, "hit")
		    xr_meet.disable_scheme(npc, "actor_dialogs")
		    xr_heli_hunter.disable_scheme(npc, "heli_hunter")
		    xr_combat_ignore.disable_scheme(npc, "combat_ignore")
	    if ogsm_hideout then
			ogsm_hideout.disable_scheme(npc, "ogsm_hideout")
		end
        if rx_ai then 
            rx_ai.disable_schemes(npc, stype) 
        end  
    elseif stype == modules.stype_mobile then
		    mob_combat.disable_scheme(npc, "mob_combat")
		    mob_trade.disable_scheme(npc, "mob_trade")
	elseif stype == modules.stype_item then
		   ph_on_hit.disable_scheme(npc, "ph_on_hit")
	elseif stype == modules.stype_heli then
		   xr_hit.disable_scheme(npc, "hit")
	end
end

------------------------------------------------------------------------------------------------------------
-- ВНОСЯ ИЗМЕНЕНИЯ В ЭТУ ФУНКЦИЮ, НЕ ЗАБЫВАЙТЕ ДОБАВЛЯТЬ СООТВЕТСТВУЮЩИЕ СТРОКИ И В disable_generic_schemes
------------------------------------------------------------------------------------------------------------
function enable_generic_schemes(ini, npc, stype, section)
	if stype == modules.stype_stalker then
		
        --xr_reactions.set_reactions(npc, ini, "reactions", section)
		xr_danger.set_danger(npc, ini, "danger", "danger")

		local combat_section = utils.cfg_get_string(ini, section, "on_combat", npc, false, "")
		xr_combat.set_combat_checker(npc, ini, "combat", combat_section)

		local use_section = utils.cfg_get_string(ini, section, "on_use", npc, false, "")
		if use_section then
			xr_use.set_use_checker(npc, ini, "use", use_section)
		end
		local info_section = utils.cfg_get_string(ini, section, "info", npc, false, "")
		if info_section then
			stalker_generic.set_npc_info(npc, ini, "info", info_section)
		end

		local hit_section = utils.cfg_get_string(ini, section, "on_hit", npc, false, "")
		if hit_section then
			xr_hit.set_hit_checker(npc, ini, "hit", hit_section)
		end

		local actor_dialogs_section = utils.cfg_get_string (ini, section, "actor_dialogs", npc, false, "")
		if actor_dialogs_section then
			xr_meet.set_actor_dialogs(npc, ini, "actor_dialogs", actor_dialogs_section)
		end

		local wounded_section = utils.cfg_get_string (ini, section, "wounded", npc, false, "")
		xr_wounded.set_wounded (npc, ini, "wounded", wounded_section)

		xr_abuse.set_abuse(npc, ini, "abuse", section)

		local meet_section = utils.cfg_get_string (ini, section, "meet", npc, false, "")
		xr_meet.set_meet (npc, ini, "meet", meet_section)

		local death_section = utils.cfg_get_string (ini, section, "on_death", npc, false, "")
		xr_death.set_death (npc, ini, "death", death_section)

		local heli_hunter_section = utils.cfg_get_string(ini, section, "heli_hunter", npc, false, "")
		xr_heli_hunter.set_scheme(npc, ini, "heli_hunter", heli_hunter_section)

		local combat_ignore_section = utils.cfg_get_string(ini, section, "combat_ignore", npc, false, "")
		if combat_ignore_section then
			printf("combat_ignore_section= '%s'", combat_ignore_section )
			xr_combat_ignore.set_combat_ignore_checker(npc, ini, "combat_ignore", combat_ignore_section)
		end
	    if rx_ai then 
            rx_ai.enable_schemes(ini,npc) 
        end
        if ogsm_hideout then
			ogsm_hideout.enable_scheme(npc, ini, "ogsm_hideout", section)
		end  
    elseif stype == modules.stype_mobile then
		local combat_section = utils.cfg_get_string(ini, section, "on_combat", npc, false, "")
		if combat_section then
			mob_combat.set_scheme(npc, ini, "mob_combat", combat_section)
		end

		local death_section = utils.cfg_get_string(ini, section, "on_death", npc, false, "")
		mob_death.set_scheme(npc, ini, "mob_death", death_section)

		local trade_section = utils.cfg_get_string(ini, section, "on_trade", npc, false, "")
		if trade_section then
			mob_trade.set_scheme(npc, ini, "mob_trade", trade_section)
		end

		local hit_section = utils.cfg_get_string(ini, section, "on_hit", npc, false, "")
		if hit_section then
			xr_hit.set_hit_checker(npc, ini, "hit", hit_section)
		end

		mob_panic.set_scheme(npc, ini, "mob_panic")

	elseif stype == modules.stype_item then
		local hit_section = utils.cfg_get_string(ini, section, "on_hit", npc, false, "")
		printf("HIT SECTION [%s]", tostring(hit_section))
		if hit_section then
			ph_on_hit.set_scheme(npc, ini, "ph_on_hit", hit_section)
		end

	elseif stype == modules.stype_heli then
		local hit_section = utils.cfg_get_string(ini, section, "on_hit", npc, false, "")
		if hit_section then
			xr_hit.set_hit_checker(npc, ini, "hit", hit_section)
		end
	end
end

function activate_by_section(npc, ini, section, loading)
	printf("DEBUG: object '%s': activate_by_section: looking for section '%s'", npc:name(), section)

	if loading == nil then
		abort("xr_logic: activate_by_section: loading field is nil, true or false expected")
	end

	local npc_id = npc:id()
	if db.storage[npc_id].active_section then
		abort("xr_logic: activate_by_section: while processing section '%s': character '%s': trying to " ..
			"activate more than one schemes at once (section '%s' is active)",
			section, npc:name(), db.storage[npc_id].active_section)
	end

	if not loading then
		db.storage[npc_id].activation_time = time_global()
		-- GAMETIME added by Stohe.
		db.storage[npc_id].activation_game_time = game.get_game_time()
	end

	if section == "nil" then
		db.storage[npc_id].overrides = nil
		reset_generic_schemes_on_scheme_switch(npc, "nil", "nil")
		db.storage[npc_id].active_section = nil
		db.storage[npc_id].active_scheme = nil
--'		db.storage[npc_id].pstor = nil
		return
	end

	if ini:section_exist(section) then
		local scheme = utils.get_scheme_by_section(section)
		if scheme == nil then
			abort("object '%s': unable to determine scheme name from section name '%s'",
				npc:name(), section)
		end

		-- Загрузить оверрайды:
		db.storage[npc_id].overrides = cfg_get_overrides(ini, section, npc)

		-- Сбросить общие схемы:
		reset_generic_schemes_on_scheme_switch(npc, scheme, section)

		-- schemes[scheme] даст имя файла (модуля), в котором реализована схема
		-- _G[] даст указатель на неймспейс (таблицу) этого модуля
		local filename = schemes[scheme]
		if filename == nil then
			abort("xr_logic: scheme '%s' is not registered in modules.script", scheme)
		end
		printf("_bp: calling module('%s')", filename)
		if not _G[filename] then
			abort("xr_logic: can't call %s.set_scheme() - a nil value", filename)
		end
		_G[filename].set_scheme(npc, ini, scheme, section, db.storage[npc_id]["gulag_name"])
		--printf("DEBUG: activate_by_section: scheme '%s' activated from section '%s'", scheme, section)
		db.storage[npc_id].active_section = section
		db.storage[npc_id].active_scheme = scheme
--'		if not loading then
--'			db.storage[npc_id].pstor = nil
--'		end

		if db.storage[npc_id].stype == modules.stype_stalker then
			-- чтобы избежать дальнейшего движения по пути при установке рестрикторов
			utils.send_to_nearest_accessible_vertex(npc, npc:level_vertex_id())

			issue_event(npc, db.storage[npc_id][scheme], "activate_scheme", loading, npc)
		else
			issue_event(npc, db.storage[npc_id][scheme], "reset_scheme", loading, npc)
		end
	else
		abort("object '%s': activate_by_section: section '%s' does not exist",
			npc:name(), section)
	end
end

--[[
-- Предназначение:
--	Производит сброс состояния объекта (снимает коллбеки, отключает разговор) непосредственно перед включением
--	новой схемы.
--]]
function reset_generic_schemes_on_scheme_switch(npc, scheme, section)
	printf("_bp: reset_generic_schemes_on_scheme_switch: npc:name()='%s'", npc:name())
	local st = db.storage[npc:id()]

	if not st.stype then
		return
	end

	if st.stype == modules.stype_stalker then
		--xr_reactions.reset_reactions(npc, scheme, st, section)
		xr_meet.dialog_manager_reset(npc, st.stype)
		xr_meet.reset_meet(npc, scheme, st, section)		
		xr_abuse.reset_abuse(npc, scheme, st, section)
		xr_wounded.reset_wounded(npc, scheme, st, section)
		xr_death.reset_death(npc, scheme, st, section)
		xr_danger.reset_danger(npc, scheme, st, section)
		stalker_generic.reset_threshold(npc, scheme, st, section)
		stalker_generic.reset_show_spot(npc, scheme, st, section)

	elseif st.stype == modules.stype_mobile then
		--printf("_bp: disabling talk")
		--npc:disable_talk() -- теперь делается в dialog_manager_reset
		xr_meet.dialog_manager_reset(npc, st.stype)
		mob_release(npc)
		if get_clsid(npc) == clsid.bloodsucker_s then
			if scheme == "nil" then
				npc:set_manual_invisibility(false)
			else
				npc:set_manual_invisibility(true)
				-- Видимый или нет определяет схема, которая возьмет его под контроль:
				--npc:set_invisible(false)
			end
		end

		mob_panic.reset_panic(npc, scheme, st, section)

	elseif st.stype == modules.stype_item then
		npc:set_callback(callback.use_object, nil)
		npc:set_nonscript_usable(true)
		if get_clsid(npc) == clsid.car then
			-- Другие объекты под скрипт не берутся, поэтому для них не надо сбрасывать
			npc:destroy_car()
			mob_release(npc)
		end
	end
end

function assign_storage_and_bind(npc, ini, scheme, section)
	local npc_id = npc:id()
	local st

	if not db.storage[npc_id][scheme] then
		db.storage[npc_id][scheme] = {}
		st = db.storage[npc_id][scheme]

		st["npc"] = npc

		-- Схема стартует впервые - прибиндить
		--printf("DEBUG: assign_storage_and_bind: bind scheme: '%s'", scheme)
		_G[schemes[scheme]].add_to_binder(npc, ini, scheme, section, st)
	else
		st = db.storage[npc_id][scheme]
	end

	st["scheme"] = scheme
	st["section"] = section
	st["ini"] = ini

	return st
end

function subscribe_action_for_events(npc, storage, new_action)
	--printf("DEBUG: registering new action for reset event (npc:name() = '%s')", npc:name())

	if not storage.actions then
		storage.actions = {}
	end

	storage.actions[new_action] = true
end

function unsubscribe_action_from_events(npc, storage, new_action)
	if not storage.actions then
		storage.actions = {}
	end

	storage.actions[new_action] = nil
end

-- st - storage активной схемы
function issue_event(npc, st, event_fn, ...)
	if not st or not st.actions then
		return
	end

	local activation_count = 0
	local action_ptr, is_active = 0, 0

	for action_ptr, is_active in pairs(st.actions) do
		if is_active and action_ptr[event_fn] then
			action_ptr[event_fn](action_ptr, ...)
			activation_count = activation_count + 1
		end
	end

--	if activation_count == 0 and
--		event_fn == "activate_scheme"
--	then
--		abort("xr_logic: issue_event: activate_scheme handler not found, active_scheme is '%s'", db.storage[npc:id()].active_scheme)
--	end
end

function pick_section_from_condlist(actor, npc, condlist)
	local rval = nil -- math.random(100)
	--printf("_bp: pick_section_from_condlist: rval = %d", rval)

	local newsect = nil
	local infop_conditions_met
	for n, cond in pairs(condlist) do
		infop_conditions_met = true -- изначально считаем, что все условия переключения удовлетворены
		for inum, infop in pairs(cond.infop_check) do
			if infop.prob then
				if not rval then
					rval = math.random(100)
				end
				if infop.prob < rval then
					infop_conditions_met = false -- инфопоршен есть, но он не должен присутствовать
					break
				end
			elseif infop.func then
				--printf("_bp: infop.func = %s", infop.func)
				if not xr_conditions[infop.func] then
					abort("object '%s': pick_section_from_condlist: function '%s' is " ..
						"not defined in xr_conditions.script", npc:name(), infop.func)
				end
				--if xr_conditions[infop.func](actor, npc) then
				if infop.params then
					if xr_conditions[infop.func](actor, npc, infop.params) then
						if not infop.expected then
							infop_conditions_met = false -- инфопоршен есть, но не должен присутствовать
							break
						end
					else
						if infop.expected then
							infop_conditions_met = false -- инфопоршен есть, но не должен присутствовать
							break
						end
					end
				else
					if xr_conditions[infop.func](actor, npc) then
						if not infop.expected then
							infop_conditions_met = false -- инфопоршен есть, но не должен присутствовать
							break
						end
					else
						if infop.expected then
							infop_conditions_met = false -- инфопоршен есть, но не должен присутствовать
							break
						end
					end
				end
			elseif has_alife_info(infop.name) then
				if not infop.required then
					--'printf("FAILED: actor has infop '%s', which is NOT needed [%s]", infop.name, tostring(has_alife_info(infop.name)))
					infop_conditions_met = false -- инфопоршен есть, но он не должен присутствовать
					break
				else
					--'printf("PASSED: actor has infop '%s', which is needed [%s]", infop.name, tostring(has_alife_info(infop.name)))
				end
			else
				if infop.required then
					--'printf("FAILED: actor has NO infop '%s', which is needed [%s]", infop.name, tostring(has_alife_info(infop.name)))
					infop_conditions_met = false -- инфопоршена нет, но он нужен
					break
				else
					--'printf("PASSED: actor has NO infop '%s', which is not needed [%s]", infop.name, tostring(has_alife_info(infop.name)))
				end
			end
		end
		--printf("_bp: infop_cond_met = %s", utils.to_str(infop_conditions_met))
		if infop_conditions_met then
			-- Условия выполнены. Независимо от того, задана ли секция, нужно проставить требуемые
			-- infoportions:
			for inum, infop in pairs(cond.infop_set) do
				if db.actor == nil then
					abort("TRYING TO SET INFOS THEN ACTOR IS NIL")
				end
				if infop.func then
					if not xr_effects[infop.func] then
						abort("object '%s': pick_section_from_condlist: function '%s' is " ..
							"not defined in xr_effects.script", if_then_else(npc, npc:name(), "nil"), infop.func)
					end
					if infop.params then
						xr_effects[infop.func](actor, npc, infop.params)
					else
						xr_effects[infop.func](actor, npc)
					end
				elseif infop.required then
					if not has_alife_info(infop.name) then
						actor:give_info_portion(infop.name)
					end
				else
					if has_alife_info(infop.name) then
						actor:disable_info_portion(infop.name)
					end
				end
			end
			if cond.section == "never" then
				return nil
			else
				return cond.section
			end
		end
	end

	--printf("_bp: pick_section_from_condlist: nil")
	return nil
end

-- Выполняет переключение на указанную секцию, если задана.
-- Если section == nil, остается работать старая секция.
function switch_to_section(npc, st, section)
	if section == nil or section == "" then
		return false
	end
	local active_section = db.storage[npc:id()].active_section
	if active_section == section then
		return false
	end

	-- call scheme::finalize()
	if active_section then
		issue_event(npc, db.storage[npc:id()][db.storage[npc:id()].active_scheme], "deactivate", npc)
	end

	db.storage[npc:id()].active_section = nil
	db.storage[npc:id()].active_scheme = nil
	activate_by_section(npc, st.ini, section, false)
	return true
end

function see_actor(npc)
	return npc:alive() and npc:see(db.actor)
end

function cond_name(cond, etalon)
	return string.find( cond, "^"..etalon.."%d*$" ) ~= nil
end

function try_switch_to_another_section(npc, st, actor)
	local l = st.logic
	local npc_id = npc:id()

	if not actor then
		abort("try_switch_to_another_section(): error in implementation of scheme '%s': actor is nil", st.scheme)
		return
	end

	if not l then
		abort("Can't find script switching information in storage, scheme '%s'", st.active_scheme)
	end

	local switched = false
	for n, c in pairs(l) do
		--printf("_bp: %d: %s", time_global(), c.name)
		if cond_name(c.name, "on_actor_dist_le") then
			--printf("_bp: dist=%d (need <= %d), see_actor: %s", distance_between(actor, npc), c.v1, utils.to_str(see_actor(npc)))
			if see_actor(npc) and distance_between(actor, npc) <= c.v1 then
				--printf("_bp: conditions met")
				switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist))
			end
		elseif cond_name(c.name, "on_actor_dist_le_nvis") then
			if distance_between(actor, npc) <= c.v1 then
				switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist))
			end
		elseif cond_name(c.name, "on_actor_dist_ge") then
			--printf("_bp: dist=%d (need <= %d), see_actor: %s", distance_between(actor, npc), c.v1, utils.to_str(see_actor(npc)))
			-- ТУТ УМЫШЛЕННО >, А НЕ >=, потому что оно составляет пару с on_actor_dist_le, где <=
			if see_actor(npc) and distance_between(actor, npc) > c.v1 then
				--printf("_bp: conditions met")
				switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist))
			end
		elseif cond_name(c.name, "on_actor_dist_ge_nvis") then
			-- ТУТ УМЫШЛЕННО >, А НЕ >=, потому что оно составляет пару с on_actor_dist_le_nvis, где <=
			if distance_between(actor, npc) > c.v1 then
				switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist))
			end
		elseif cond_name(c.name, "on_signal") then
			--printf("_bp: on_signal (c.v1 = %s)", c.v1)
			if st.signals and st.signals[c.v1] then
			    printf("_bp: on_signal (c.v1 = %s) signalled [%s]", c.v1, npc:name())
				--printf("_bp: signalled")
				switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist))
			end
		-- FIXME: не дублировать тут имена, оставить один on_info, но добавлять несколько его экземпляров в список
		elseif cond_name(c.name, "on_info") then
			switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist))
		elseif cond_name(c.name, "on_timer") then
			--printf("_bp: on_timer: %d >= %d", time_global(),
			--	db.storage[npc_id].activation_time + c.v1)
			if time_global() >= db.storage[npc_id].activation_time + c.v1 then
				switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist))
			end

		-- GAMETIME added by Stohe.
		elseif cond_name(c.name, "on_game_timer") then
			if  game.get_game_time():diffSec(db.storage[npc_id].activation_game_time) >= c.v1 then
				switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist))
			end

		elseif cond_name(c.name, "on_actor_in_zone") then
			if utils.npc_in_zone(actor, db.zone_by_name[c.v1]) then
				switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist))
			end
		elseif cond_name(c.name, "on_actor_not_in_zone") then
			if not utils.npc_in_zone(actor, db.zone_by_name[c.v1]) then
				switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist))
			end
		elseif cond_name(c.name, "on_npc_in_zone") then
			if utils.npc_in_zone(level.object_by_id(c.npc_id), db.zone_by_name[c.v2]) then
				switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist))
			end
		elseif cond_name(c.name, "on_npc_not_in_zone") then
			if not utils.npc_in_zone(level.object_by_id(c.npc_id), db.zone_by_name[c.v2]) then
				switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist))
			end
		elseif cond_name(c.name, "on_actor_inside") then
			if utils.npc_in_zone(actor, npc) then
--				printf("_bp: TRUE")
				switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist))
			end
		elseif cond_name(c.name, "on_actor_outside") then
			if not utils.npc_in_zone(actor, npc) then
				switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist))
			end
		else
			abort(
				"WARNING: object '%s': try_switch_to_another_section: unknown condition '%s' encountered",
				npc:name(), c.name)
		end

		if switched then
			--printf("_SWITCHED")
			break
		end
	end

	return switched
end

function is_active(npc, st)
	if st.section == nil then
		abort("npc '%s': st.section is nil, active section is '%s'",
			npc:name(), utils.to_str(db.storage[npc:id()].active_section))
	end
	local is_act = (st.section == db.storage[npc:id()].active_section)

	-- Текущая секция активна и не сработало ни одно из условий переключения на другие секции
	return is_act
end


function abort_syntax_error_in_cond(npc, section, field)
	abort("object '%s': section '%s': field '%s': syntax error in switch condition",
		npc:name(), section, field)
end

-- На входе имеем пустой массив и строку вида "  +infop1  -infop2 +infop3 ... "
-- Заполнить массив:
-- { "infop_name" = true/false }.
function parse_infop1(rslt, str)
	--printf("_bp: parse_infop: %s", utils.to_str(str))
	if str then
		local infop_name, sign
		local infop_n = 1
		for s in string.gfind(str, "%s*([%-%+%~%=%!][^%-%+%~%=%!%s]+)%s*") do
			--printf("_bp: parse_infop: s=%s", utils.to_str(s))
			sign = string.sub(s, 1, 1)
			infop_name = string.sub(s, 2)
			if sign == "+" then
				rslt[infop_n] = { name = infop_name, required = true }
			elseif sign == "-" then
				rslt[infop_n] = { name = infop_name, required = false }
			elseif sign == "~" then
				rslt[infop_n] = { prob = tonumber(infop_name) }
			elseif sign == "=" then
				rslt[infop_n] = { func = infop_name, expected = true }
			elseif sign == "!" then
				rslt[infop_n] = { func = infop_name, expected = false }
			else
				abort_syntax_error_in_cond(npc, section, field)
			end
			infop_n = infop_n + 1
		end
	end
end

function parse_func_params(str)
	local lst = {}
	local n
	for par in string.gfind(str, "%s*([^:]+)%s*") do
		n = tonumber(par)
		if n then table.insert(lst, n)
		else table.insert(lst, par) end
	end
	return lst
end

function parse_infop(rslt, str)
	--printf("_bp: parse_infop1: %s", utils.to_str(str))
	if str then
		local infop_name, sign
		local infop_n = 1
		local at, params
		for s in string.gfind(str, "%s*([%-%+%~%=%!][^%-%+%~%=%!%s]+)%s*") do
			--printf("_bp: parse_infop: s=%s", utils.to_str(s))
			sign = string.sub(s, 1, 1)
			infop_name = string.sub(s, 2)
			params = nil

			-- парсим параметры функций
			at = string.find(infop_name, "%(")
			if at then
				if string.sub(infop_name, -1) ~= ")" then
					abort("wrong condlist %s", str)
				end
				if at < string.len(infop_name) - 1 then
					params = parse_func_params(string.sub(infop_name, at + 1, -2))
				else
					params = {}
				end
				infop_name = string.sub(infop_name, 1, at - 1)
			end

			if sign == "+" then
				rslt[infop_n] = { name = infop_name, required = true }
			elseif sign == "-" then
				rslt[infop_n] = { name = infop_name, required = false }
			elseif sign == "~" then
				rslt[infop_n] = { prob = tonumber(infop_name) }
			elseif sign == "=" then
				--printf("_bp: n = %s; r = %s", infop_name, utils.to_str(params))
				rslt[infop_n] = { func = infop_name, expected = true, params = params }
			elseif sign == "!" then
				--printf("_bp: n = %s; r = %s", infop_name, utils.to_str(params))
				rslt[infop_n] = { func = infop_name, expected = false, params = params }
			else
				abort_syntax_error_in_cond(npc, section, field)
			end
			infop_n = infop_n + 1
		end
	end
end

-- Распарсивает строку src вида:
-- {+infop1} section1 %-infop2%, {+infop3 -infop4} section2 ...
-- в таблицу:
-- {
--   1 = { infop_check = { 1 = {"infop1" = true} }, infop_set = { 1 = {"infop2" = false } }, section = "section1" },
--   2 = { infop_check = { 1 = {"infop3" = true}, 2 = {"infop4" = false} }, infop_set = {}, section = "section2" },
-- }
function parse_condlist(npc, section, field, src)
	local lst = {}

	-- 1) Разбиваем на разделенные запятыми части:
	local at, to, infop_check_lst, remainings, infop_set_lst, newsect

	--printf("_bp: src = %s", src)

	local n = 1
	for fld in string.gfind(src, "%s*([^,]+)%s*") do
		-- Здесь fld это набор infoportions в {} и имя секции, на которую переключиться.
		lst[n] = {}
		--printf("_bp: iter %d: fld = %s", n, fld)

		-- Выделяем список infoportions для проверки:
		at, to, infop_check_lst = string.find(fld, "{%s*(.*)%s*}")
		if infop_check_lst then
			--printf("_bp: infop_check_lst: [%s]", infop_check_lst)

			-- Выделяем оставшуюся часть поля, т.е. имя секции плюс список infoportions для установки:
			remainings = string.sub(fld, 1, at - 1) .. string.sub(fld, to + 1)
		else
			-- Список infoportions для проверки не был задан, следовательно, ничего не удаляем:
			remainings = fld
		end
		--printf("_bp: remainings: %s", remainings)

		-- Выделяем список infoportions для установки из remainings:
		at, to, infop_set_lst = string.find(remainings, "%%%s*(.*)%s*%%")
		if infop_set_lst then
			-- Выделяем оставшуюся часть поля, т.е. имя секции:
			newsect = string.sub(remainings, 1, at - 1) .. string.sub(remainings, to + 1)
		else
			-- Список infoportions для установки не был задан, следовательно, remainings и есть имя секции.
			newsect = remainings
		end
		--printf("_bp: newsect: %s", newsect)

		-- И сразу trim имя секции:
		at, to, newsect = string.find(newsect, "%s*(.*)%s*")
		if not newsect then
			abort_syntax_error_in_cond(npc, section, field)
		end

		-- Имя секции теперь можно сохранить:
		lst[n].section = newsect

		-- Теперь нужно распарсить infoportions в строке infop_check_lst и
		-- заполнить массив infop_check: { "infop_name" = true/false }.
		-- На входе имеем строку вида "  +infop1  -infop2 +infop3 ... "
		lst[n].infop_check = {}
		parse_infop(lst[n].infop_check, infop_check_lst)

		-- То же самое для устанавливаемых infoportions:
		lst[n].infop_set = {}
		parse_infop(lst[n].infop_set, infop_set_lst)

		n = n + 1
	end

	return lst
end

function cfg_get_number_and_condlist(ini, section, field, npc)
	local str = utils.cfg_get_string(ini, section, field, npc, false, "")
	if not str then
		return nil
	end

	local par = utils.parse_params(str)
	if not par[1] or not par[2] then
		abort_syntax_error_in_cond(npc, section, field)
	end

	local t = {}

	t.name = field
	t.v1 = tonumber(par[1])
	t.condlist = parse_condlist(npc, section, field, par[2])

	return t
end

function cfg_get_string_and_condlist(ini, section, field, npc)
	local str = utils.cfg_get_string(ini, section, field, npc, false, "")
	if not str then
		return nil
	end

	local par = utils.parse_params(str)
	if not par[1] or not par[2] then
		abort_syntax_error_in_cond(npc, section, field)
	end

	local t = {}

	t.name = field
	t.v1 = par[1]
	t.condlist = parse_condlist(npc, section, field, par[2])

	return t
end

function cfg_get_two_strings_and_condlist(ini, section, field, npc)
	local str = utils.cfg_get_string(ini, section, field, npc, false, "")
	if not str then
		return nil
	end

	local par = utils.parse_params(str)
	if not par[1] or not par[2] or not par[3] then
		abort_syntax_error_in_cond(npc, section, field)
	end

	local t = {}

	t.name = field
	t.v1 = par[1]
	t.v2 = par[2]
	t.condlist = parse_condlist(npc, section, field, par[3])

	return t
end

function cfg_get_condlist(ini, section, field, npc)
	local str = utils.cfg_get_string(ini, section, field, npc, false, "")
	if not str then
		return nil
	end

	local par = utils.parse_params(str)
	if not par[1] then
		abort_syntax_error_in_cond(npc, section, field)
	end

	local t = {}

	t.name = field
	t.condlist = parse_condlist(npc, section, field, par[1])

	return t
end

function add_condition(lst, at, cond)
	if cond then
		lst[at] = cond
		return at + 1
	end
	return at
end


function cfg_get_switch_conditions(ini, section, npc)
	local l = {}
	local t
	local n = 1

	local function add_conditions(func, cond)
		local i = 1
		local c = func(ini, section, cond, npc)

		while c ~= nil do
			n = add_condition(l, n, c, npc)

			i = i + 1

			c = func(ini, section, cond..i, npc)
		end
	end

	add_conditions( cfg_get_number_and_condlist, "on_actor_dist_le"      )
	add_conditions( cfg_get_number_and_condlist, "on_actor_dist_le_nvis" )
	add_conditions( cfg_get_number_and_condlist, "on_actor_dist_ge"      )
	add_conditions( cfg_get_number_and_condlist, "on_actor_dist_ge_nvis" )
	add_conditions( cfg_get_string_and_condlist, "on_signal"             )
	add_conditions( cfg_get_condlist           , "on_info"               )
	add_conditions( cfg_get_number_and_condlist, "on_timer"              )
	add_conditions( cfg_get_number_and_condlist, "on_game_timer"         )
	add_conditions( cfg_get_string_and_condlist, "on_actor_in_zone"      )
	add_conditions( cfg_get_string_and_condlist, "on_actor_not_in_zone"  )
	add_conditions( cfg_get_condlist           , "on_actor_inside"       )
	add_conditions( cfg_get_condlist           , "on_actor_outside"      )
	add_conditions( cfg_get_npc_and_zone       , "on_npc_in_zone"        )
	add_conditions( cfg_get_npc_and_zone       , "on_npc_not_in_zone"    )

	return l
end

function cfg_get_overrides(ini, section, npc)
	local l = {}

--	l.meet_enabled      = utils.cfg_get_bool(ini, section, "meet_enabled", npc, false)
--	l.meet_talk_enabled = utils.cfg_get_bool(ini, section, "meet_talk_enabled", npc, false)
--	l.meet_dialog       = utils.cfg_get_string(ini, section, "meet_dialog", npc, false, "")
--	l.meet_state        = utils.cfg_get_string(ini, section, "meet_state", npc, false, "")
--	l.reactions         = parse_names(utils.cfg_get_string(ini, section, "reactions", npc, false, "", ""))

	local tmp			= utils.cfg_get_string(ini, section, "heli_hunter", npc, false, "")
	if tmp then
		l.heli_hunter	= xr_logic.parse_condlist(npc, section, "heli_hunter", tmp)
	end

--	l.wounded_enabled   = utils.cfg_get_bool(ini, section, "wounded_enabled", npc, false)
	l.combat_ignore     = cfg_get_condlist(ini, section, "combat_ignore_cond", npc)
	l.combat_ignore_keep_when_attacked = utils.cfg_get_bool(ini, section, "combat_ignore_keep_when_attacked", npc, false)
	l.combat_type       = cfg_get_condlist(ini, section, "combat_type", npc)
	l.on_combat         = cfg_get_condlist(ini, section, "on_combat", npc)
	l.companion_enabled = utils.cfg_get_bool(ini, section, "companion_enabled", npc, false)

	if string.find(section, "kamp") ~= nil then
		l.soundgroup		= utils.cfg_get_string(ini, section, "center_point", npc, false, "")
	else
		l.soundgroup		= utils.cfg_get_string(ini, section, "soundgroup", npc, false, "")
	end


	return l
end

function cfg_get_npc_and_zone(ini, section, field, npc)
	local t = cfg_get_two_strings_and_condlist(ini, section, field, npc)

	if t then
		local sim = alife()
		if sim then
			local se_obj = sim:story_object(tonumber(t.v1))
			if se_obj then
				t.npc_id = se_obj.id
			else
				t.npc_id = -1
				abort("object '%s': section '%s': field '%s': there is no object with story_id '%s'",
				            npc:name(), section, field, t.v1)
			end
		else
			t.npc_id = -1
			printf("WARNING: object '%s': section '%s': field '%s': can't use story_id without simulation!",
			        npc:name(), section, field)
		end
	end

	return t
end

-- Возвращает ссылку на оверрайды, зарегистрированные в активной на данный момент секции,
-- либо nil, если ни одна из секций не активна, или оверрайдов нет.
function generic_scheme_overrides(npc)
	return db.storage[npc:id()].overrides
end

function mob_release(mob)
	if mob:get_script() then
		mob:script(false, script_name())
	end
end

function mob_capture(mob, reset_actions)
	if reset_actions == nil then
		abort("mob_capture: reset_actions parameter's value is not specified")
	end

	if reset_actions then
		reset_action(mob, script_name())
	else
		if not mob:get_script() then
			mob:script(true, script_name())
		end
	end
end

function mob_captured(mob)
	return mob:get_script()
end

function save_logic(obj, packet)
	local npc_id = obj:id()
	local cur_tm = time_global()

	local activation_time = db.storage[npc_id].activation_time
	if not activation_time then
		activation_time = 0
	end
 	packet:w_s32(activation_time - cur_tm)

	-- GAMETIME added by Stohe.
	utils.w_CTime(packet, db.storage[npc_id].activation_game_time)
end

function load_logic(obj, reader)
	local npc_id = obj:id()
	local cur_tm = time_global()

	db.storage[npc_id].activation_time = reader:r_s32() + cur_tm

	-- GAMETIME added by Stohe.
	db.storage[npc_id].activation_game_time = utils.r_CTime(reader)
end

local pstor_number = 0
local pstor_string = 1
local pstor_boolean = 2

function pstor_is_registered_type(tv)
	if tv ~= "boolean" and tv ~= "string" and tv ~= "number" then
		return false
	end
	return true
end

function pstor_store(obj, varname, val)
	local npc_id = obj:id()
	
	if db.storage[npc_id].pstor == nil then
		db.storage[npc_id].pstor = {}
	end
	local tv = type(val)
	if not pstor_is_registered_type(tv) then
		abort("xr_logic: pstor_store: not registered type '%s' encountered", tv)
	end
	db.storage[npc_id].pstor[varname] = val
end

function pstor_retrieve(obj, varname, defval)
	local npc_id = obj:id()
	
	if db.storage[npc_id].pstor ~= nil then
		local val = db.storage[npc_id].pstor[varname]
		if val ~= nil then
			return val
		end
	end
	if defval ~= nil then
		return defval
	end
	return nil
--'	abort("xr_logic: pstor_retrieve: variable '%s' does not exist", varname)
end

function pstor_save_all(obj, packet)
	local npc_id = obj:id()
	local pstor = db.storage[npc_id].pstor
	if not pstor then
		pstor = {}
		db.storage[npc_id].pstor = pstor
	end

	local ctr = 0
	for k, v in pairs(pstor) do
		ctr = ctr + 1
	end
	packet:w_u32(ctr)

	for k, v in pairs(pstor) do
		printf("_bp: pstor_save_all: saving [%s]='%s'", utils.to_str(k), utils.to_str(v))
 		packet:w_stringZ(k)
		local tv = type(v)
		if tv == "number" then
			packet:w_u8(pstor_number)
	 		packet:w_float(v)
	 	elseif tv == "string" then
			packet:w_u8(pstor_string)
	 		packet:w_stringZ(v)
	 	elseif tv == "boolean" then
			packet:w_u8(pstor_boolean)
	 		packet:w_bool(v)
		else
			abort("xr_logic: pstor_save_all: not registered type '%s' encountered", tv)
		end
	end
end

function pstor_load_all(obj, reader)
	local npc_id = obj:id()
	local pstor = db.storage[npc_id].pstor
	if not pstor then
		pstor = {}
		db.storage[npc_id].pstor = pstor
	end
	local ctr = reader:r_u32()

	for i = 1, ctr do
		local varname = reader:r_stringZ()
		local tn = reader:r_u8()
		if tn == pstor_number then
			pstor[varname] = reader:r_float()
		elseif tn == pstor_string then
			pstor[varname] = reader:r_stringZ()
		elseif tn == pstor_boolean then
			pstor[varname] = reader:r_bool()
		else
			abort("xr_logic: pstor_load_all: not registered type N %d encountered", tn)
		end
		printf("_bp: pstor_load_all: loaded [%s]='%s'", varname, utils.to_str(pstor[varname]))
	end
end

function save_obj(obj, packet)
	printf("save_obj: obj:name()='%s'", obj:name())

	local npc_id = obj:id()
	local st = db.storage[npc_id]

	printf("save_obj: ini_filename='%s'", utils.to_str(st.ini_filename))
	printf("save_obj: section_logic='%s'", utils.to_str(st.section_logic))
	printf("save_obj: active_section='%s'", utils.to_str(st.active_section))
	printf("save_obj: gulag_name='%s'", utils.to_str(st.gulag_name))

	if st.ini_filename then
		packet:w_stringZ(st.ini_filename)
	else
		packet:w_stringZ("")
	end

	if st.section_logic then
		packet:w_stringZ(st.section_logic)
	else
		packet:w_stringZ("")
	end

	if st.active_section then
		packet:w_stringZ(st.active_section)
	else
		packet:w_stringZ("")
	end

	--if st.active_scheme then
	--	packet:w_stringZ(st.active_scheme)
	--else
	--	packet:w_stringZ("")
	--end

	if st.gulag_name then
		packet:w_stringZ(st.gulag_name)
	else
		packet:w_stringZ("")
	end

	--packet:w_s32(st.stype)

	save_logic(obj, packet)

	if st.active_scheme then
		issue_event(obj, db.storage[npc_id][st.active_scheme], "save")
	end

	pstor_save_all(obj, packet)
end

function load_obj(obj, reader)
	printf("load_obj: obj:name()='%s'", obj:name())
	local npc_id = obj:id()
	local st = db.storage[npc_id]

	local ini_filename = reader:r_stringZ()
	if ini_filename == "" then
		ini_filename = nil
	end

	local section_logic = reader:r_stringZ()
	if section_logic == "" then
		section_logic = nil
	end

	local active_section = reader:r_stringZ()
	if active_section == "" then
		-- В activate_by_section нужно передать строку "nil", а не nil, чтобы не активировать ни одной из схем.
		-- При этом реальная active_section станет равной nil.
		active_section = "nil"
	end

	--local active_scheme = reader:r_stringZ()
	--if active_scheme == "" then
	--	active_scheme = nil
	--end

	local gulag_name = reader:r_stringZ()
	if gulag_name == "" then
		gulag_name = nil
	end

	--local stype = reader:r_s32()

	st.loaded_ini_filename = ini_filename
	st.loaded_section_logic = section_logic
	st.loaded_active_section = active_section
	--st.loaded_active_scheme = active_scheme
	st.loaded_gulag_name = gulag_name
	--st.loaded_stype = stype

	printf("load_obj: ini_filename='%s'", utils.to_str(st.loaded_ini_filename))
	printf("load_obj: section_logic='%s'", utils.to_str(st.loaded_section_logic))
	printf("load_obj: active_section='%s'", utils.to_str(st.loaded_active_section))
	--printf("load_obj: active_scheme='%s'", utils.to_str(st.loaded_active_scheme))
	printf("load_obj: gulag_name='%s'", utils.to_str(st.loaded_gulag_name))

	load_logic(obj, reader)

	pstor_load_all(obj, reader)
end

function get_customdata_or_ini_file(npc, filename)
--	printf( "get_customdata_or_ini_file: filename=%s", filename )

	if filename == "<customdata>" then
		local ini = npc:spawn_ini()
		if ini then
			return ini
		else
			return ini_file([[scripts\dummy.ltx]])
		end
	elseif string.find( filename, "*" ) == 1 then
		-- динамический ltx
		local p = string.find( filename, "*", 2 )
		return gulag_tasks.loadLtx( string.sub(filename, 2, p-1), string.sub(filename, p+1) )
	else
		return ini_file(filename)
	end
end

function initialize_obj(obj, st, loaded, actor, stype)
	if not loaded then
		local ini_filename = "<customdata>"
		local ini = get_customdata_or_ini_file(obj, ini_filename)
		ini = xr_logic.configure_schemes(obj, ini, ini_filename, stype, "logic", nil)
		local sect = xr_logic.determine_section_to_activate(obj, ini, "logic", actor)
		xr_logic.activate_by_section(obj, ini, sect, false)
	else
		local ini_filename = st.loaded_ini_filename
		if ini_filename then
			local ini = get_customdata_or_ini_file(obj, ini_filename)
			ini = xr_logic.configure_schemes(obj, ini, ini_filename, stype, st.loaded_section_logic, st.loaded_gulag_name)
			printf( "initialize_obj: loaded" )
			xr_logic.activate_by_section(obj, ini, st.loaded_active_section, true)
		end

--		if st.active_scheme then
--			issue_event(obj, db.storage[obj:id()][st.active_scheme], "load")
--		end
	end
end

 

 

Пытаюсь создать глобальный мод с новым сюжетом,буду рад любой оказанной помощи

Ссылка на комментарий

Полная сборка всех AI-паков от xStream, Bak и Monnoroch для ТЧ, ЧН, ЗП. Для ТЧ, как для оригинала, так и для чистого АМК 1.4.1. Есть также Full_AI_edition_Super (xStream+Bak+Monnoroch). Читай ридми, адаптируй. Ссылка - http://rusfolder.com/44084384

 

Большое спасибо, скачал, вырезал только то что надо мне, адаптировал к Р.М,А., поставил звуки из ЗП, всё работает без проблем.

Тестировал на кордоне, на блокпосту вояк, выдал им ПМ с холостыми, чтоб от пуль своих не дохли и выдал 50 штук ф1 гранат, настроил группировку вояк чтоб не трогали ГГ, а друг друга валили, ух они там и устроили фейерверк, порадовало)).

И кстати довольно прицельно кидаются, несколько раз тестил, ещё никто не подорвался на своей же гранате.

 

 

Сейчас попробовал: вбил "AI пак для ТЧ SoC" - 153 тыс. результатов на Яндексе... Включая и то, о чем BFG уже написал.

 

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

 

 

Вот ещё вопрос появился у меня - поставил модели нпс от 

http://www.amk-team.ru/forum/index.php?showtopic=4304&page=4#entry775149

Облегчённый экзоскелет нейтрала и монолитовца, выдал нпс по аналогии с профилями в ЧН и ЗП.

Внешне всё вроде нормально, только есть одно но, они убиваются почти с 1й пули пм.

Пробовал копировать из ЗП configs\models\capture 

human_captures.ltx

stalker_monolith_3.ltx

stalker_neutral_3.ltx

но это не помогло, так же с 1й пули дохнут.

В чём причина "картонной" брони? Нужно что-то добавить мне в конфигах? или же автор неправильно перенес модели?

 

Так же у меня стоят модели сталкеров в противогазах из ЗП, но параметры защиты у них нормальные, хотя я кроме .ogf модели и текстуры не ставил больше ничего.

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

NFSNeedForSpirt.gif

Ссылка на комментарий
то мы услышим его голос даже на улице и так, будто он стоит перед нами

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

 

если отвернуться от Сидора, то он продолжит базарить, но не будет отыгрывать анимацию, т. е. анимацию он отыгрывает только тогда, когда мы на него смотрим. При этом, пока он не отыграет анимацию, мы с ним не сможем заговорить. Как это исправить?

Ну, может не стоит по... пятой точкой к собеседнику поворачиваться ;)  ?

А если очень надо, то опять-же в вышеуказанной схеме смотреть, где происходит эта рассинхронизация и править как себе хочется.

Изменено пользователем UnLoaded
Ссылка на комментарий
он как не стрелял так и не стреляет.

А попробуй секции логики назвать не ph_car1, ph_car2, а ph_car@1, ph_car@2.

Ну и до кучи добавь на всяк случай...

auto_fire    = true

 

Ооо! И вынеси пока логику из олл_спавна, на время корректировки...

Изменено пользователем _Val_
Ссылка на комментарий

@_Val_, попробовал, не работает, пробовал [ph_car@2] ставить в активную - прекрасно работает.
Я больше склоняюсь к мысли что не работает "переключатель" on_info.  

Пытаюсь создать глобальный мод с новым сюжетом,буду рад любой оказанной помощи

Ссылка на комментарий

@плащ, переключатель написан правильно, к бабке не ходи. Значит поршень не выдаётся...

Эмм...Желательно иметь контроль выданных поршней либо в консоли, либо с записью в лог. Но это уже к скриптерам))

Как-то так вроде.

function info_cal(info_id)
    local actor = db.actor
    if info_id and actor and string.sub(info_id, 1, 3) ~= "ui_" then
        get_console():execute(string.format('load ~[ex_test] Получен инфопоршень: %s',info_id))
    end
end

И вешаешь это на бинд_сталкер.

твой_скрипт.info_cal(info_id)
Изменено пользователем _Val_
Ссылка на комментарий

Я пока что отпишусь сюда, так как вряд ли это проблема чистого АМК.
Буквально вчера накатил АИ-пак, ссылка на который была дана выше. Одну проблему решил сам, но вот вылезшую фигню при первом проходе Припяти несу сюды:
 

FATAL ERROR
 
[error]Expression    : vertex || show_restrictions(m_object)
[error]Function      : CPatrolPathManager::select_point
[error]File          : E:\stalker\patch_1_0004\xr_3da\xrGame\patrol_path_manager.cpp
[error]Line          : 155
[error]Description   : any vertex in patrol path [pri_wave2_rsniper_2_walk] in inaccessible for object [pri_wave2_monolith3_rsniper2]
 

stack trace:

Была ещё парочка логов, подобных этому, но там менялись только номера снайперов. Дальность видимости в игре уменьшал, но проканывает только тогда, когда идёшь совсем уж позади основной группы прорывающихся, а в этом случае остаётся только "лут" собирать с убиенных. Стоит приблизиться к основной группе и при появлении очередного снайпера на крыше происходит вылет. Я так понял, что где-то для каких-то НПС заданы неверно координаты перемещения? Либо это попытки снайперов сорваться убежать/подлечить раненого/скосплеить камикадзе. Может кто пояснит какой файл править или как безболезненно отключить на время какое-то поведение? Может даже пошагово... :) Если вернуть старую геймдату, то сейвы не грузятся с матом на

FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CInifile::r_section
[error]File          : E:\stalker\patch_1_0004\xrCore\Xr_ini.cpp
[error]Line          : 342
[error]Description   : <no expression>
[error]Arguments     : Can't open section 'rx_attach_bandage'
 

Но в действительности хочется решить траблу без отключения АИ-пака, ибо намного веселее с ним.

--------------------

Ах, да, по поводу первой же проблемы, которая возникла после добавления пака:

! Invalid ogg-comment version, file:  d:\spl\stlk_weapon\gamedata\sounds\weapons\sd\nato_sd.ogg
! Unknown command:  mil_stalker_respawn_223607
 
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: d:\spl\stlk_weapon\gamedata\scripts\mon_trade.script:429: attempt to index field 'target' (a nil value)
 

stack trace:

Видимо кто-то кому-то чаго-то не могёт продать. Важно: строка в скрипте не 429 а 427! Просто я при поиске проблемы сделал так:
 

 

Также может быть причина в том, что в логике у какого-то АИ что-то неправильно указано. Для исправления рекомендую вставить строчку перед 116: get_console():execute(self.object:name()). То имя в логе, которое будет последним после вылета, указывает на персонажа с кривой логикой.

А перед вставляемой строкой сделал камент для себя - чтобы запомнить место и причину вставки. Так что в исходном скрипте строка 427.

Изменено пользователем Vier_E
Ссылка на комментарий

Подскажите, пожалуйста, что значат строчки:
discovery_dependency, $prefetch и script_binding в секциях предметов?
Я так понимаю, 1-ая вообще движком не читается, но что она делает?

Ссылка на комментарий

Заметил один косяк: во время езды на машине у ГГ тратятся силы, где косяк зарыт? В конфиге машины или еще где?

Ранее был известен под ником BoBaH_671.

Ссылка на комментарий
any vertex in patrol path [pri_wave2_rsniper_2_walk]

Проверь этот путь: или в СДК или ACDC распакуй all.spawn и посмотри гейм и левел вертексы, возможно не валидные...

 

Кстати, нашел следующее:

[pri_wave2_wsniper_1_walk]
points = p0
p0:name = wp00|outr=pri_wave2_restr2|starti=pri_wave2_start|deathi=pri_wave2_monolith2_dead|ib
p0:flags = 0x1
p0:position = -13.1291389465332,2.96178436279297,-168.986785888672
p0:game_vertex_id = 2181
p0:level_vertex_id = 85877

Что за флаги такие: outr, starti, deathi, ib ???

Изменено пользователем UnLoaded
Ссылка на комментарий

@UnLoaded, по моему догадаться можно интуитивно, смотри gulag_pripyat.script, свойства поинтов.

 

Проверь этот путь: или в СДК или ACDC распакуй all.spawn и посмотри гейм и левел вертексы, возможно не валидные...

Дело не в этом. При невалидных вертексах другие ошибки, см. ЗП например. Я описывал решение этого вылета.

 

@Vadyanchikus, первое по моему вообще можно вырезать, я тоже не нашел где это используется. Второй это префетч визуала, что-то уходящее прежзагрузку помоему, я так и не успел с этим разобратся, возможно кто-то тут проходящий ответит, а третье это биндер объекта, простым языком привязка предмета к скриптовому обработчику.

Ссылка на комментарий

@UnLoaded,

Оно конечно неплохо и в аллспавне поковыряццо, но это ж новую игру придёццо начинать после правок, не? Хотелось бы не так радикально, ибо если данная проблема проявилась после установки пака, то значит где-то что-то добавилось в точки маршрута и для этих юнитов. Может проблема подобная Выбросу на Припяти, ну когда неписи должны бежать в укрытие, а снайпера этого сделать не могут, увы?

 

@Карлан,

Подробнее можно по поводу решения? Я в скрипты стараюсь не лезть, так как их не особо понимаю. Конфиги как-то понятнее :)

Изменено пользователем Vier_E
Ссылка на комментарий

Либо это попытки снайперов сорваться убежать/подлечить раненого/скосплеить камикадзе. Может кто пояснит какой файл править или как безболезненно отключить на время какое-то поведение?

Добавь прекондишны в схему, ну или прямо в эвалуаторы. Вылет этот вообще плохой, я его отключил в движке, пока вроде глюков после него не происходило, можешь тоже попробовать.

 

Оно конечно неплохо и в аллспавне поковыряццо, но это ж новую игру придёццо начинать после правок, не? Хотелось бы не так радикально, ибо если данная проблема проявилась после установки пака, то значит где-то что-то добавилось в точки маршрута и для этих юнитов. Может проблема подобная Выбросу на Припяти, ну когда неписи должны бежать в укрытие, а снайпера этого сделать не могут, увы?

После правок путей не надо начинать новую игру.

 

Подробнее можно по поводу решения? Я в скрипты стараюсь не лезть, так как их не особо понимаю. Конфиги как-то понятнее

Конфигами это не сделать, как и скриптами к слову, так что в таком случае я не помощник.
Ссылка на комментарий

@Карлан,

Давай про прекондишны и прочие заумные вещи подробнее, если не затруднит? Я пока вообще слабо представляю что, куда и зачем добавлять. Если это где-то уже описано, то можно ссылку? Ну или как в движке что-то отключить. Нехай себе непись не может куда-то пройти - её проблемы :)

  • Нравится 1
Ссылка на комментарий

Может кто подскажет, столкнулся на Янтаре вот  с таким вылетом: стреляю в зомби и получаю креш игры.

! Unknown command:  HIT_CALLBACK:_yantar_gulag_zombies_01_amount=0.71699976921082_bone=10
* Log file has been saved successfully!
 
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: f:\stalker4\gamedata\scripts\xr_wounded.script:521: attempt to index field '?' (a nil value)
 

stack trace:

виновник явно вот этот жмур, yantar_gulag_zombies_01 два раза проверял, но что не так, не пойму.

Intrel Core i5 9400F, msi gtx 1660 super ventus, RAM 16g-DDR4, HD 2000g, Win 10x64, SSD 256g, SSD m2 500g.

Ссылка на комментарий

@Хемуль36рус

загляни в эту тему http://www.amk-team.ru/forum/index.php?showtopic=8760&page=1возможно, там найдёшь причину.


Подарки

  • Ссылка на комментарий

     

     

    но что не так, не пойму

    Так вроде-ж конкретно указано в логе на xr_wounded.script на 521 строку в нем. Пробовал у себя глянуть, что там в 521 строке - но оказалось что у меня строк всего 488(это ТЧ 1.0006). Смотри, что у тебя в районе той строки.

    Ссылка на комментарий

    Саня...На всяк случай.

    Начиная с 520-й строки...

    if smart and smart:is_gulag_available() and smart.gulag_working then
    if string.find(level,string.sub(kk,1,3)) then
    table.insert(smarts_avail,smart)
    end

     

     

    у меня строк всего 488(это ТЧ 1.0006).

    Хех...Это же АМК-мод  :rtfm: ...

    Ссылка на комментарий

    Привет всем.
    Ситуация: может, кто знает, что в некоторых сборках перед началом диалога с Сидором ГГ показывался сон, типа убей Стрелка, красный фон и раскаты грома. Так вот, я хочу эту штуку вставить к себе, но тут есть проблема - я не знаю, какая функция запускает этот же видос в сборке. Я осмотрел все скрипты, но ничего не нашёл. Сборка 2571.
    Кое-что я поменял в файлах, но это только подготовка. Может, поможет:
    xr_effects.script:

    function start_escape_dream(actor,npc)
    	game.start_tutorial("escape_dream")
    end
    

    И ui_movies.xml:

    	<escape_dream>
    		<play_each_item>1</play_each_item>
    		<global_wnd x="0" y="0" width="1024" height="768">
    			<auto_static x="0" y="0" width="1024" height="768" stretch="1">
    				<window_name>back</window_name>
    				<texture>intro\intro_back</texture>
    			</auto_static>
    		</global_wnd>
    		<item type="video">
    			<sound>characters_voice\scenario\video\intro_kill</sound>
    			<pause_state>on</pause_state>
    			<can_be_stopped>on</can_be_stopped>
    			<video_wnd x="0" y="0" width="1024" height="768" stretch="1">
    				<texture x="0" y="1" width="512" height="286">intro\intro_kill</texture>
    			</video_wnd>
    		</item>
    	</escape_dream>
    

    Я просто никак не пойму, как заставить этот видос воспроизводиться.

    Изменено пользователем Vadyanchikus
    Ссылка на комментарий

    Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

    Комментарии могут оставлять только зарегистрированные пользователи

    Создать аккаунт

    Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

    Зарегистрировать новый аккаунт

    Войти

    Есть аккаунт? Войти.

    Войти
    • Недавно просматривали   0 пользователей

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

    AMK-Team.ru

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