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

СОЛЯНКА v.2.8 (ЗП)


Дормидонт

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

Скачал мод, установил, вылет из-за нехватки памяти, уменьшил настройки, в точности статическая освещения и всё равно, как то не устойчиво. Очень большие требования с ОЗУ не меньше 4 ГБ, ну или хотя бы 3 ГБ. Может совсем облегчить мод, что бы на 2 ГБ тянуло нормально. Кстати, я скачал облегчённую версию. На сколько xrGame.dll от оригинала отличается, можно ли заменить на от XRay-Extensions?

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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


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

Скачал этот вариант, установил, запустил, поначалу всё нормально. Но ловлю стабильный вылет в квесте логово кровососов, двух на верху убили, а дальше когда идём, Глухарь начинает обследовать трупы, заканчивает и тут вылет.

 

rx_utils.script: 474
rx_ff.script: 205
rx_ff.script: 205
rx_ff.script: 196
rx_utils.script: 474
rx_ff.script: 196
rx_utils.script: 474
rx_ff.script: 196
rx_utils.script: 474
rx_ff.script: 205
rx_ff.script: 205
rx_ff.script: 196
rx_utils.script: 474

FATAL ERROR

[error]Expression : !m_error_code
[error]Function : raii_guard::~raii_guard
[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line : 748
[error]Description : ... - Зов припяти szm\gamedata\scripts\state_mgr.script:259: C stack overflow


stack trace:

 

Сверху это я вставил метки, так как до этого, ещё другой вылет был, из-за не правильной имени кости в методе bone_position. Я так понял, вылет из-за переполнения стэка из-за интенсивной работы скриптовых схем. Вылет происходит и с xrGame.dll из архива, так и с моей правкой.

  • Спасибо 1

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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


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

Короче, так как самая активная схема перед вылетом была xr_ff.script, я её отключил в rx_ai.script.

Вылет из-за переполнения пропал.

Но есть устойчивый вылет:

 

action_facer:execute(): target - chimera_normal10372
rx_utils.script: 474: npc_name - 'chimera_normal10372', bone - bip01_neck
stack trace:

001B:04B70CC3 xrGame.dll, CDialogHolder::CDialogHolder()

 

Это значит у модели химеры нет кости bip01_neck, тут можно скрипт доработать, например  заменить target:center().

Правда, я не понял, для чего эта схема(rx_facer.script) используется.

ЗЫ

Вылет 001B:0***0CC3 xrGame.dll, CDialogHolder::CDialogHolder() означает что использовался метод: obj:bone_position(bone), и у obj нет кости bone.

Изменено пользователем НаноБот
  • Спасибо 1

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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


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

Можно отключить, но практичней доработать, например заменить косточкой которая есть у всех мутантов, или сделать проверку, если это химера, то берём ту кость которая у неё точно есть.

stack trace:
0023:099D0CC3 xrGame.dll, CDialogHolder::CDialogHolder()

Это как раз то, химера виновата.

Ещё можно скрипт оптимизировать xr_ff, что бы не переполняло стек. Забавно, я как то пытался доработать и оптимизировать скрипт экстрим где НПС гранаты кидают, да к бросил это не благодарное дело, замучили вылеты из-за переполнения стека.

ЗЫ

Админам, инфу по вылету 00**:0***0CC3 xrGame.dll, CDialogHolder::CDialogHolder() можно залить куда полагается.

Изменено пользователем НаноБот
  • Полезно 1

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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


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

Не править модель не к чему, лучше доработать сам скрипт.

 

 

function safe_bone_pos(npc,bone)
	local pos
	local cls = npc:clsid()
	if cls == clsid.burer_s then
		pos = npc:position()
		pos.y = pos.y+1
	elseif cls == clsid.gigant_s then
--		log1("rx_utils.script:  471")
		pos = npc:bone_position("bip01_spine")
	elseif cls == clsid.chimera_s then
--		log1("rx_utils.script:  471")
		pos = npc:bone_position("neck_r")
	else
--		log1("rx_utils.script:  474: npc_name - '"..npc:name().."',  bone - "..tostring(bone))
		pos = npc:bone_position(bone or "bip01_spine")
	end
	return pos
end 

 

 

Типа так.

PS

Теперь надо доработать rx_ff.script.

Изменено пользователем НаноБот
  • Спасибо 1
  • Полезно 1

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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


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

Оптимизировал скрипт rx_ff.script

 

 

---- Rulix aka Bak --- 29.7.2009
---- Доработка НаноБот		23.12.2015
---- оптимазация по памяти и быстродействию
---- для xrGame.dll XRay-Extensions rev233

function printf(s,...)
--	rx_ai.printf("ff:"..s,...)
--	get_console():execute("flush")
end

local ff_ini = ini_file("misc\\rx_ff.ltx")
local ff_sets = {forbiddens = {factions = {}, npcs = {}},
				check_prd = rx_utils.read_from_ini(ff_ini, "main","check_period", 200),
				enabled = rx_utils.read_from_ini(ff_ini, "main","enabled", true, 0)}

local good_acts = {[xr_actions_id.smartcover_action] = true,[xr_actions_id.smartcover_action+2] = true}

function init()
	ff_sets.forbiddens.factions = rx_utils.parse_list(ff_ini, "main","forbidden_factions", true)
	ff_sets.forbiddens.npcs = rx_utils.parse_list(ff_ini, "main","forbidden_npcs", true)
	ff_sets.inited = true
	ff_ini = nil
end

class "evaluator_dont_shoot" (property_evaluator)
function evaluator_dont_shoot:__init(npc,name,storage) super (nil,name)
	self.st = storage
--self.tm_id = timing_scripts.register_binder("rx_ff", nil)
end
function evaluator_dont_shoot:evaluate()
	local npc = self.object
	if good_acts[npc:motivation_action_manager():current_action_id()] then
--timing_scripts.binder_update_end("rx_ff", self.tm_id)
		return false
	end
	local enemy = npc:best_enemy()
	local res = false
	if enemy and npc:see(enemy) and not xr_wounded.is_wounded(enemy) then
		local enemy_id = enemy:id()
		if rx_knife and rx_knife.targets[enemy_id] and rx_knife.targets[enemy_id] ~= npc:id() then
			local hunter = level.object_by_id(rx_knife.targets[enemy_id])
			if hunter and npc:relation(hunter) ~= game_object.enemy and npc:see(hunter) then
				local n_dist = npc:position():distance_to(enemy:position())
				local h_dist = hunter:position():distance_to(enemy:position())
				if h_dist < 3.5 and h_dist < n_dist then
					res = true
					self.st.vdist = 5
				end
			end
		else
--			timing_scripts.binder_update_start("rx_ff", self.tm_id)
			local f, d = friends_on_fire_line(npc)
--			timing_scripts.binder_update_end("rx_ff", self.tm_id)
--			printf("eva[%s]:%s",npc:character_name(),tostring(f))
			res = f
			self.st.vdist = d
		end
	end
--	printf("enemy[%s]: %s",npc:character_name(),tostring(enemy~=nil))
	return res
end

class "action_verso" (action_base)
function action_verso:__init (npc,action_name,storage) super (nil,action_name)
	self.st = storage
end
function action_verso:initialize()
	action_base.initialize(self)
	local npc = self.object
	npc:set_desired_position()
	npc:set_desired_direction()
	npc:set_mental_state(anim.danger)
	npc:set_item(object.aim1, npc:active_item())
	local enemy = npc:best_enemy()
	if enemy then
		npc:set_sight(look.fire_point,rx_utils.safe_bone_pos(enemy))
	end
	self.vertex = get_vertex(npc, self.st.vdist)
	self.timer = time_global()+800*self.st.vdist
--	printf("act2[%s]:init vertex = %s, vdist = %s",npc:character_name(),tostring(self.vertex),self.st.vdist)
	state_mgr.set_state(npc,"assault")
end
function action_verso:execute()
	action_base.execute(self)
	local npc = self.object
	local enemy = npc:best_enemy()
	if enemy then
		npc:set_sight(look.fire_point, rx_utils.safe_bone_pos(enemy))
	end
	npc:set_item(object.aim1, npc:active_item())
	if self.vertex then
		npc:set_dest_level_vertex_id(self.vertex)
	end
	if not self.vertex or npc:level_vertex_id() == self.vertex or self.timer < time_global() then
--		printf("act2[%s]:vertex re",npc:character_name())
		self.vertex = get_vertex(npc, self.st.vdist)
		self.timer = time_global()+700*self.st.vdist
	end
end
function action_verso:finalize()
    action_base.finalize(self)
--	printf("act2[%s]:fin",self.object:character_name())
end

evid_dont_shoot = rx_ai.base_id+25
actid_dont_shoot = evid_dont_shoot

function add_to_binder(npc, ini, scheme, section,storage)
	if not ff_sets.inited then
		init()
	end
	local manager = npc:motivation_action_manager()
	if not (ff_sets.enabled and not ff_sets.forbiddens.factions[npc:character_community()] and not ff_sets.forbiddens.npcs[npc:name()]) then
		manager:add_evaluator(evid_dont_shoot,property_evaluator_const(false))
		return
	else
		manager:add_evaluator(evid_dont_shoot,evaluator_dont_shoot(npc,"eva_dont_shoot",storage))
	end
	local action = action_verso(npc,"act_dont_shoot",storage)
	action:add_precondition(world_property(stalker_ids.property_alive,true))
	action:add_precondition(world_property(xr_evaluators_id.sidor_wounded_base,false))
	if rx_bandage then
		action:add_precondition(world_property(rx_bandage.evid_bandage,false))
	end
	if rx_gl then
		action:add_precondition(world_property(rx_gl.evid_gl_reload,false))
	end
	if rx_facer then
		action:add_precondition(world_property(rx_facer.evid_facer,false))
	end
	if rx_knife then
		action:add_precondition(world_property(rx_knife.evid_knife_attack,false))
	end
	if xrs_grenade and xrs_grenade.evid_aaa_grenade then
--		action:add_precondition(world_property(xrs_grenade.evid_crazy_grenadier,false))
		action:add_precondition(world_property(xrs_grenade.evid_aaa_grenade,false))
	end
	if blowout_scheme and blowout_scheme.evid_outside then
		action:add_precondition(world_property(blowout_scheme.evid_outside,false))
	end
	action:add_precondition(world_property(evid_dont_shoot,true))
	action:add_effect(world_property(evid_dont_shoot,false))
	manager:add_action(actid_dont_shoot,action)
	action = manager:action(stalker_ids.action_combat_planner)
	action:add_precondition(world_property(evid_dont_shoot,false))
--	action = manager:action(xr_actions_id.alife)
--	action:add_precondition(world_property(evid_dont_shoot,false))
end

function get_vertex(npc,dist)
	local rnd1, ang = math.random(100)
	if rnd1 < 43 then
		ang = math.random(50,60)
	elseif rnd1 < 58 then
		ang = math.random(160,200)
	else
		ang = math.random(300,310)
	end
	local dir = vector_rotate_y(npc:direction(), ang)
	return npc:vertex_in_direction(npc:level_vertex_id(), dir, dist)
end

function npc_update(npc)
end

function set_scheme(npc,ini,scheme,section)
	local st = xr_logic.assign_storage_and_bind(npc,ini,scheme,section)
end

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

function friends_on_fire_line(npc)
	local st = rx_ai.get_storage(npc:id(), "friends_on_fire_line")
	if (st.wait or 0) >= time_global() then
		return st.f, st.d
	end
	st.wait = time_global() + ff_sets.check_prd
	st.f = false
	st.d = 4
	local npc_pos = npc:bone_position("bip01_l_finger02")
	local dir_vrag = npc:best_enemy():center():sub(npc_pos)
	local vrag_dist = dir_vrag:magnitude()
	if vrag_dist > 2 then
		for o in npc:memory_visible_objects() do
			local obj = o:object()
			if obj and obj:alive() and obj:id() ~= npc:id() and obj:is_stalker() and npc:relation(obj) ~= game_object.enemy then
				local dir_friend = obj:bone_position("bip01_spine"):sub(npc_pos)
				local friend_dist = dir_friend:magnitude()-0.5
				if friend_dist < vrag_dist then
					local vec_e = dir_vrag:set_length(friend_dist)
					local vec_f = dir_friend:set_length(friend_dist)
--					log1(string.format("vec_e=%s, vec_f=%s", rx_utils.vec_to_str(vec_e), rx_utils.vec_to_str(vec_f)))
					local er = 1
					if friend_dist < 1.6 then
						er = 0
					end
					if vec_f:similar(vec_e, er) == 1 then
						st.f = true
						st.d = 4*vrag_dist/(vrag_dist-friend_dist)
						if st.d > 25 then
							st.d = 25
						end
						break
					end
				end
			end
		end
	end
    return st.f, st.d
end
 

 

 

Вылеты прекратились, немного быстрей начал работать.

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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


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

Если используете xrGame.dll из мода, то в файле rx_ff.script метод obj:is_stalker() смените на оригинальный IsStalker(obj), или используйте ревизию 238, за одно про тестируете мою ревизию.

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

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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


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

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

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