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

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

Ребята, есть какой-то способ принудительного обновления диалогов такого типа? В НЛС они формируются при первой загрузке сейва, что мне не подходит...

 

	<dialog id="vergas_repair_dialog" priority="-1">
		<precondition>dialogs.is_not_wounded</precondition>
		<init_func>sak_dialog.vergas_repair_dlg</init_func>
	</dialog>		

 

Скрытый текст
local vergas_tbl = {}
local vergas_bad_tbl = {}

function generate_vergas_tbl()
	local items = get_shadow_inv():get_content( true ) 
	for i, rec in items:ipairs() do	
		local sect = sak_inventory.dyn_art_base( rec.sect )
		if	(
				( 
					rec.obj:is_weapon() 
					and rec.obj:condition() >= 0.65 and rec.obj:condition() < 1 
					and not ( str_in_tab( sect, { "wpn_binoc", "wpn_knife", "wpn_flame", "wpn_rpg7", "wpn_pkm", "wpn_gm94", "wpn_ak74_m1" } ) ) 
				)
			or  ( 
					rec.obj:is_outfit() 
					and rec.obj:condition() >= 0.59 and rec.obj:condition() < 1
					and not ( str_in_tab( sect, { "_q_", "bandit_veteran_", "bandit_master_", "exo" } ) ) 
				) 
			)  	
		then		
			local cfg = this.repair_config[ r_vergas ] 	
			if not cfg then
				wprintf( "[~T].~C0C #ERROR(uniform_repair_cost):~C07 not specified configuration for repairer~C0A %s~C07", r_vergas )
				misc.dump_table( this.repair_config )
				return 
			end        			
			local item_repair_cost = this.calc_repair_cost( rec.obj, this.get_margin( r_vergas ) )	
			local time_need_repair = this.uniform_time_repair( item_repair_cost, rec.obj:cost(), cfg.price_coefs, cfg.time_repair )
			local time_rep = this.time_desc( time_need_repair )       
			
			local cost_phrase = "list_trader_repair_" .. lua_random( 1, 7 )			
			local text = 
				translate( cost_phrase ) .. 
				" %c[255,238,155,23]" .. 
				item_repair_cost .. 
				" %c[255,216,186,140]рублей. " .. 
				time_rep .." ".. translate( "list_time_repair_2" ) 
			
			table.insert( vergas_tbl, { obj = rec.obj:id(), sect = sect, cost = item_repair_cost, time_need = time_need_repair, text = text } )			
			-- misc.dump_table( vergas_tbl )
		elseif 
				( 
					   ( rec.obj:is_weapon() and rec.obj:condition() < 0.65 ) 
					or ( rec.obj:is_outfit() and rec.obj:condition() < 0.59 ) 
				) 
				or str_in_tab( sect, { "wpn_flame", "wpn_rpg7", "wpn_pkm", "wpn_gm94", "wpn_ak74_m1", "_q_", "bandit_veteran_", "bandit_master_", "exo" } ) 
		then	
			table.insert( vergas_bad_tbl, sect )
			misc.dump_table( vergas_bad_tbl )
		end
		
	end
end
	
function show_not_available()
	if #vergas_bad_tbl < 1 then return end
	local text = ""
	local colour = "%c[ 255, 255, 255, 255 ]"	
	for kk, vv in pairs( vergas_bad_tbl ) do
		if kotovod.have_selected_item( vv, 1 ) then  
			text = text .. "   • " .. colour .. get_inv_name( vv ) .. "\\n" .. "%c[default]"
		end	
	end
	local last = "Так-с, ну... В общем, могу подлатать всё, кроме этих экземпляров: \\n" .. text .. ""
	db.actor:give_talk_message( last, "ui\\ui_iconsTotal", Frect():set( 0, 0, 0, 0), "simple_answer_item" )	
	vergas_bad_tbl = {}	
end



function vergas_repair_items( dlg )
	local phr = task_manager.Dlg_AddPhrase( dlg, "Здравствуй, не мог бы ты подсобить с ремонтом?", "0", "", -10000 )
	local phrase_script = phr:GetPhraseScript()	
	phrase_script:AddAction( "sak_dialog.generate_vergas_tbl" )			
	
	phr = task_manager.Dlg_AddPhrase( dlg, "Давай посмотрим, что там у тебя.", "1", "0", -10000 )
	phrase_script = phr:GetPhraseScript()	
	phrase_script:AddDontHasInfo( "vergas_repair_starting" )	
	phrase_script:AddPrecondition( "sak_dialog.klava_done()" )	
	phrase_script:AddAction( "sak_dialog.show_not_available" )		
	
	for k, v in pairs( vergas_tbl ) do 
	-- Наличие и название предмета
		phr = task_manager.Dlg_AddPhrase( dlg, "".. get_inv_name ( v.sect ) ..".", k + 1, "1", -10000 )
		phrase_script = phr:GetPhraseScript()	
		phrase_script:AddPrecondition( "kotovod.have_selected_item( \"".. v.sect .."\", 1 )" )		

	-- Цена составит
		phr = task_manager.Dlg_AddPhrase( dlg, v.text, k + 100, k + 1, -10000 )
		phrase_script = phr:GetPhraseScript()		

	-- Согласен
		phr = task_manager.Dlg_AddPhrase( dlg, "Хорошо, я согласен. Вот деньги.", k + 1000, k + 100, -10000 )
		phrase_script = phr:GetPhraseScript()		
		phrase_script:AddPrecondition( "sak_dialog.money_have( ".. v.cost .." )" )
		phrase_script:AddAction( "sak_dialog.relocate_money( ".. v.cost ..", 'out' )" )
		phrase_script:AddAction( "sak_dialog.vergas_repair_start( ".. v.time_need ..", \"".. v.sect .."\", ".. v.obj .." )" )

	-- Отказ
		phr = task_manager.Dlg_AddPhrase( dlg, "Может в другой раз...", k + 2000, k + 100, -10000 )
		phrase_script = phr:GetPhraseScript()	
		phrase_script:AddAction( "dialogs.break_dialog" )			
	end
	
	
	phr = task_manager.Dlg_AddPhrase( dlg, "Я немного занят. Ты лучше попозже загляни...", "200", "0", -10000 )
	phrase_script = phr:GetPhraseScript()	
	phrase_script:AddHasInfo( "vergas_repair_starting" )	
	phrase_script:AddPrecondition( "sak_dialog.klava_done()" )	

	phr = task_manager.Dlg_AddPhrase( dlg, "Позже, так позже...", "201", "200", -10000 )
	phrase_script = phr:GetPhraseScript()		
	phrase_script:AddAction( "dialogs.break_dialog" )		
	
	
	phr = task_manager.Dlg_AddPhrase( dlg, "А мне вроде кто-то обещал за блокнот починенный что-то? Слово держать нужно.", "300", "0", -10000 )
	phrase_script = phr:GetPhraseScript()	
	phrase_script:AddPrecondition( "sak_dialog.not_klava_done()" )		
	
	phr = task_manager.Dlg_AddPhrase( dlg, "Ну ладно, будет тебе \"что-то\".", "301", "300", -10000 )
	phrase_script = phr:GetPhraseScript()		
	phrase_script:AddAction( "dialogs.break_dialog" )	
end


function vergas_repair_start( time_need, sect, obj )
--	log2( "time_need is %s, sect is %s, obj is %s", tostring( time_need ), tostring( sect ), tostring( obj ) )
	
	local cfg = this.repair_config[ r_vergas ] 			
	if cfg.info_start then db.actor:give_info_portion( cfg.info_start ) end		
		
	if t_repair[ r_vergas ] == nil then
		t_repair[ r_vergas ] = {}
	end		

	sak.relocate_item( "out", sect, 1 )	
	
	t_repair[ r_vergas ].time_need = time_need
	t_repair[ r_vergas ].time_end  = misc.game_time_minutes() + time_need
	t_repair[ r_vergas ].section   = sect	
	
	local obj = client_obj( obj )

	if obj:is_outfit() then 
		misc.release_obj( obj )
	else
		kotovod.release_addons_new( obj, sect, obj ) 	
		misc.release_obj( obj )
	end	
end


function vergas_repair_dlg( dlg )		vergas_repair_items( dlg ) 		end

 

 

Ссылка на комментарий
08.02.2022 в 11:22, Котовод сказал:

Ребята, есть какой-то способ принудительного обновления диалогов такого типа?

Есть.

Называется - движок OGSR.

Читать вики.

  • Полезно 2

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Доброго времени суток, господа.

 

Благодарю за внимание, и попрошу сильно не пинать, (Заранее извиняюсь за возможный оффтоп, если уже было(а я не знал))

Как сделать такую картину: ГГ открывает инвентарь, и убирает все оружие (по открытию инвентаря, все оружие в активных слотах, убирается),

Потому как, у меня пока получились только:

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

Тени Чернобыля, Версия игры 1.0004 

 

Сделал так: 

Скрытый текст

 Создал отдельный файл и вписал ф-ию: 

 

 function inv()
 if active_slot~=inventory_slots.NO_ACT_SLOT then
local gg = db.actor
local item = gg:item_in_slot(1),(2),(3),(4),(5) then
      if item and item:section() == "item" then
     db.actor:hide_weapon()
      end
end

 

И две другие ниже (из фикса оп.2.1 "фикс - убирания оружия при открытии инвентаря")

 (убрал комментарии)


    -- Апдейт прятание оружия игрока во время диалога
    if weapon_hide == true or self.object:is_talking() then
        if self.weapon_hide == false then
            self.object:hide_weapon()
            self.weapon_hide = true
        end
    else
        if self.weapon_hide == true then
            self.object:restore_weapon()
            self.weapon_hide = false
        end
    end    


--function start()
hide_and_disable=function()
    local active_slot=db.actor:active_slot()
    keyvals():set("active_weapon_slot",active_slot) --ключ в контейнере по умолчанию
    if active_slot~=inventory_slots.NO_ACT_SLOT then
    db.actor:activate_slot(inventory_slots.NO_ACT_SLOT,true) --спрячем с анимацией активное оружие
    end
    db.actor:hide_weapon() --запретим использование слотов
end
show_and_enable=function()
    db.actor:clear_blocked_slots() --разрешим использование слотов
    local stored_slot=keyvals():get("active_weapon_slot",inventory_slots.NO_ACT_SLOT) --ключ в контейнере по умолчанию
    if stored_slot~=inventory_slots.NO_ACT_SLOT then
    db.actor:activate_slot(stored_slot,true) --активируем с анимацией сохраненный слот
    end
end
    need_update = true
end

 

При запуске любой из них , под любым предлогом и условием, либо вылет, либо не рабочие двери/диалоги (Все что юзается на клавишу)

Подключал к bind_stalker.script к actor:reinit , в начале. 

Поправьте меня пожалуйста, потому что эффект "третьей руки", хочется пофиксить у себя в сборочке.  

 

Поправьте/направьте, подскажите как, где и с чем это едят, желательно ткните носом.

Поиск по форуму, мне мало что дал, может я карлан и мало что знаю (Не там ищу). 

 

Изменено пользователем EGER.OVERKILL WF
Ссылка на комментарий
35 минут назад, EGER.OVERKILL WF сказал:

ГГ открывает инвентарь, и убирает все оружие

В файле inventory.script:

Скрытый текст

-- Открытие/закрытие инвентаря
function on_inventory_info(info_id)

    if info_id == "ui_inventory" then
        inventory_open = true
        if debug == true then get_console():execute("inventory_open") end
        bind_stalker.hide_weapon()   -- убираем ствол
    elseif info_id == "ui_inventory_hide" then
        inventory_open = false
        need_update = true
        if debug == true then get_console():execute("inventory_close") end
        bind_stalker.restore_weapon()
    end
end

 

Здесь могла быть ваша реклама.

Ссылка на комментарий
2 часа назад, mole venomous сказал:

В файле inventory.script:

  Показать

-- Открытие/закрытие инвентаря
function on_inventory_info(info_id)

    if info_id == "ui_inventory" then
        inventory_open = true
        if debug == true then get_console():execute("inventory_open") end
        bind_stalker.hide_weapon()   -- убираем ствол
    elseif info_id == "ui_inventory_hide" then
        inventory_open = false
        need_update = true
        if debug == true then get_console():execute("inventory_close") end
        bind_stalker.restore_weapon()
    end
end

 

Спасибо, а подскажи пожалуйста, где его искать, потому что я по путям config/scripts , и scripts не нашел ничего похожего.

 

Добавлено  Опричник,

Изучите "Правила цитирования".

 

Ссылка на комментарий
3 часа назад, EGER.OVERKILL WF сказал:

где его искать

del

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

Здесь могла быть ваша реклама.

Ссылка на комментарий
1 час назад, mole venomous сказал:

Если там нет, распакуй последние архивы gamedata.db... или обратись сюда.  

Распаковал, к сожалению, такого файла у меня нет. 

Спасибо, надеюсь найду то что ищу.

Ссылка на комментарий
5 часов назад, mole venomous сказал:

В файле inventory.script:

 Я конечно дико извиняюсь,  а по точнее можно про этот файл?

 

Скрытый текст

eaylO.png

 

Ссылка на комментарий
1 час назад, ted.80 сказал:

по точнее можно про этот файл

del

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

Здесь могла быть ваша реклама.

Ссылка на комментарий
50 минут назад, ted.80 сказал:

а по точнее можно про этот файл?

Я просто надеюсь, что быть может он подумал из-за названии функции (fuction inv), так и обозвал этот файл. (потому как у меня файл в котором это все написано, называется по другому)

Но тем не менее, тогда наклевывается следующий: к чему подключать это в bind_stalker.script (если это вообще, к нему отношение имеет). 

3 минуты назад, mole venomous сказал:

Расширение .script

Я же указал.

 

А это точно тч? Может версия другая, ну потому как я на голой игре, и в распакованных .db архивах , его не вижу

(Аналогично по пути gamedata/config/scripts) , а по запросу в гугле, выдает вообще картинки, с инвентарем ЗП

11 минут назад, mole venomous сказал:

Значит, его нет в оригинале.

Тогда, у меня предсказуемо, выходит еще один вопрос:

 А где мне его тогда взять, и к чему подключать?

 

Какой-то  непонятный совет получился.

 Скажи хоть откуда ты его взял-то. 

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

@EGER.OVERKILL WF 

В бинд_сталкер на коллбек actor_binder:info_callback повесь вызов 

function actor_binder:info_callback(npc, info_id)

...

    inventory.on_inventory_info(info_id)

...

end

А вот файл, поправь его под себя, если надо inventory

12 минут назад, EGER.OVERKILL WF сказал:

Скажи хоть откуда ты его взял-то

Моя ошибка. Забыл, что файл не из оригинала. Скинул на диск, думаю, разберёшься.

  • Нравится 1

Здесь могла быть ваша реклама.

Ссылка на комментарий
8 минут назад, mole venomous сказал:

поправь его под себя, если надо inventory

Признателен, за файл и за пояснения.

 

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

@mole venomous

Не-а, Не фурычит. 

И с поршнями инвентаря игрался , взятые с gameplay/info_portions 

Скрытый текст

    <info_portion id="ui_trade">
        <disable>ui_trade_hide</disable>
    </info_portion>
    <info_portion id="ui_trade_hide">
        <disable>ui_trade</disable>
    </info_portion>

И к коллбекам подключил , без вылетов, но ничего не происходит.

Как ни прыгал, ни тужился, ничего , абсолютно. 

1 час назад, EGER.OVERKILL WF сказал:

Как ни прыгал, ни тужился, ничего , абсолютно. 

Исключая возможность своей болезни "кривых рук", 

Проверял только что на своем квесте, при/после взятия квеста пушку достать нельзя.

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

 

Что-то либо с кодом ф-ции, либо в подключении.

  • Жуть! 1
Ссылка на комментарий

@EGER.OVERKILL WF Привет, всё намного проще, никакие доп. файлы и скрипты не нужны,

в bind_stalker.script  уже есть проверка - скрыто ли оружие при диалоге (в апдейте)

Скрытый текст
	-- Апдейт прятание оружия игрока во время диалога
	if weapon_hide == true or self.object:is_talking() then
		if self.weapon_hide == false then
			self.object:hide_weapon()
			self.weapon_hide = true
		end
	else
		if self.weapon_hide == true then
			self.object:restore_weapon()
			self.weapon_hide = false
		end
	end	

 

 

нужно лишь добавить в нее - всё что нам нужно - просто замени этот кусок кода - вот так:

 

Скрытый текст
	-- Апдейт прятание оружия игрока во время диалога
	if  weapon_hide == true or
		self.object:is_talking() or
		db.actor:has_info("ui_inventory") or 
		db.actor:has_info("ui_trade") or
		db.actor:has_info("ui_car_body") or
		db.actor:has_info("ui_pda") or
		db.actor:has_info("ui_pda_jobs") then
		if self.weapon_hide == false then
			self.object:hide_weapon()
			self.weapon_hide = true
			level.set_time_factor(1)
		end
	else
		if self.weapon_hide == true then
			self.object:restore_weapon()
			self.weapon_hide = false
			level.set_time_factor(10)
		end
	end	

 

 

:good2: пользуйся

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

Всем привет)

Делаю в ЗП условно заскриптованную симуляцию жизни на базе с фиксированным режимом дня для каждого НПС. В целом всё работает, но хочется внести немного разнообразия и рандомности. Есть ли функция, вызываемая через логику, которая проверяет, занят ли в данный момент какой-то из смарткаверов? В частности - тот, что мы укажем в логике в скобках, например. Конечно, можно всё это завязать на инфопоршни, но не уверен в работоспособности такой схемы на "дальней дистанции", выход в оффлайн и непредвиденные обстоятельства могут всё поломать. Существует, конечно, animpoint_reached, но это ведь для того, в который НПС уже направляется, либо занял его.

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

А есть где-то на просторах интернета/форумов "пособие" по скриптовым настройкам диалогов? Т.е. то, как например реализованы рандомные фразы у НПС в оригинале (истории, про работу и т.п., которые настраиваются в dialog_manager.script). Т.е. то, как добавлять эти диалоги НПС и актору скриптами. Вроде когда-то видел, но точно не помню, а поисковики выдают только обычные диалоги. Желательно для ЗП, если там вообще есть разница в функциях :)

@Seraph Прописывай логику для всех НПС в смарте (в том числе для дефолтов), ставь, к примеру, таймер, или условие через xr_condition.script, и по достижению поставленной цели (условие или таймер), переключай логику на другую работу. Для разных работ ночью и днём, используй в suitable функцию is_day.

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

@ARTLantist Ты не понял мой вопрос)

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

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

А можно как то скриптом получить значение фпс в игре. В Судьбе Зоны как то получают значение. Мнеб тоже так сделать (изменять радиус алайфа) т.к уровни имеют разный фпс.

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

@Stalkersof , если по старинке (OGSE+), то как-то так. И посмотреть куда оно по "сигнальной" схеме подключается.

  • Спасибо 1
  • Нравится 1
  • Полезно 1
  • Жуть! 1
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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