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

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

Есть такая функция из xr_codition.script

 

-- true если у актора одет шлем указанной секции
function actor_wear_helmet(actor, npc, p)
    return p[1] ~= nil and actor:object( p[1] ) ~= nil and actor:item_in_slot(10) ~= nil and actor:item_in_slot(10):section() == p[1]
end

 

Как сделать тоже самое только для проверки предмета который находится на поясе?

 

P.S почему то не получается с телефона поместить под спойлер.

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

@I am Dead я гугли, но везде, увы, только проверки на наличие предмета и тому подобное, что мне сейчас не надо (

В ютубе пока не смотрел, ибо нет возможности. 

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

@Biblia Пример можешь поглядеть в новом арсенале 6, там есть скрипт на озвучивание подбираемого предмета по его классу( самое первое что пришло где можно подглядеть пример использования).

  • Спасибо 1
  • Полезно 2
Ссылка на комментарий
25.04.2021 в 23:16, Biblia сказал(а):

Естественно, прописывать такое для каждого из предметов - глупо

С чего ты это взял?) Даже в таком сложном в функциональном плане моде, как Dead Air, сделано для каждого предмета отдельно. 

Вот:

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

outfit = {
		[0] = "actor_effects.use_weapon(0)",
		[1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)",
		[2] = "xr_effects.play_inv_repair_sewing_kit()",
		[378] = "actor_effects.use_helmet(0)",
		[379] = "xr_effects.disable_nv(db.actor, nil)",
		[380] = "xr_effects.disable_ui_inventory(db.actor, nil)",
		[550] = "level.add_cam_effector('camera_effects\\\\item_use_fast.anm', 8063, false,'')",
		[2900] = "level.add_pp_effector('surge_fade.ppe', 8023, false)",
		[3020] = "level.add_cam_effector('camera_effects\\\\item_use_slow.anm', 8064, false,'')",
		
		
		[6000] = "level.remove_pp_effector(8023)",
		[7001] = "xr_effects.enable_ui_lite(db.actor, nil)",
		[7002] = "actor_effects.use_helmet(1)",
		[7003] = "xr_effects.enable_nv_and_imput(db.actor, nil)",
		[7004] = "actor_effects.use_weapon(1)"
	},
	
	helm = {
		[0] = "actor_effects.use_weapon(0)",
		[1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)",
		[2] = "xr_effects.disable_nv(db.actor, nil)",
		[3] = "actor_effects.use_helmet(0)",
		[4] = "xr_effects.disable_nv(db.actor, nil)",
		
		
		[5] = "level.add_cam_effector('camera_effects\\\\item_use_fast.anm', 8053, false,'')",
	--	[6] = "xr_effects.play_inv_repair_sewing_kit()",
		[7] = "level.add_cam_effector('camera_effects\\\\item_use_slow.anm', 8054, false,'')",
		[380] = "xr_effects.disable_ui_inventory(db.actor, nil)",
		
		
		[1700] = "actor_effects.use_helmet(1)",
		[1701] = "xr_effects.enable_ui_lite(db.actor, nil)",
		[2500] = "xr_effects.enable_imput(db.actor, nil)",
		[2503] = "actor_effects.use_weapon(1)"
	},

	gun_oil_dummy = {
		[0] = "actor_effects.use_weapon(0)",
		[1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)",
--		[378] = "actor_effects.use_helmet(0)",
--		[379] = "xr_effects.disable_nv(db.actor, nil)",
		[550] = "level.add_cam_effector('camera_effects\\\\item_use.anm', 8053, false,'')",
		[1040] = "xr_effects.disable_ui_inventory(db.actor, nil)",
		[1460] = "xr_effects.play_inv_repair_spray_oil()",
		[4351] = "xr_effects.enable_ui_lite(db.actor, nil)",
--		[5450] = "actor_effects.use_helmet(1)",
		[6050] = "xr_effects.enable_imput(db.actor, nil)",
		[6650] = "actor_effects.use_weapon(1)"
	},
	gun_oil_2_dummy = {
		[0] = "actor_effects.use_weapon(0)",
		[1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)",
--		[378] = "actor_effects.use_helmet(0)",
--		[379] = "xr_effects.disable_nv(db.actor, nil)",
		[550] = "level.add_cam_effector('camera_effects\\\\item_use.anm', 8053, false,'')",
		[1040] = "xr_effects.disable_ui_inventory(db.actor, nil)",
		[1460] = "xr_effects.play_inv_repair_spray_oil()",
		[4351] = "xr_effects.enable_ui_lite(db.actor, nil)",
--		[5450] = "actor_effects.use_helmet(1)",
		[6050] = "xr_effects.enable_imput(db.actor, nil)",
		[6650] = "actor_effects.use_weapon(1)"
	},	
	cleaning_kit_p_dummy = {
		[0] = "actor_effects.use_weapon(0)",
		[1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)",
--		[378] = "actor_effects.use_helmet(0)",
--		[379] = "xr_effects.disable_nv(db.actor, nil)",
		[550] = "level.add_cam_effector('camera_effects\\\\item_use_fast.anm', 8063, false,'')",
		[1040] = "xr_effects.disable_ui_inventory(db.actor, nil)",
		[1460] = "xr_effects.play_inv_repair_brushes()",
		[3020] = "level.add_cam_effector('camera_effects\\\\item_use.anm', 8064, false,'')",
		[7681] = "xr_effects.enable_ui_lite(db.actor, nil)",
--		[8480] = "actor_effects.use_helmet(1)",
		[9080] = "xr_effects.enable_imput(db.actor, nil)",
		[9680] = "actor_effects.use_weapon(1)"
	},
	cleaning_kit_p_2_dummy = {
		[0] = "actor_effects.use_weapon(0)",
		[1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)",
--		[378] = "actor_effects.use_helmet(0)",
--		[379] = "xr_effects.disable_nv(db.actor, nil)",
		[550] = "level.add_cam_effector('camera_effects\\\\item_use_fast.anm', 8063, false,'')",
		[1040] = "xr_effects.disable_ui_inventory(db.actor, nil)",
		[1460] = "xr_effects.play_inv_repair_brushes()",
		[3020] = "level.add_cam_effector('camera_effects\\\\item_use.anm', 8064, false,'')",
		[7681] = "xr_effects.enable_ui_lite(db.actor, nil)",
--		[8480] = "actor_effects.use_helmet(1)",
		[9080] = "xr_effects.enable_imput(db.actor, nil)",
		[9680] = "actor_effects.use_weapon(1)"
	},
	cleaning_kit_p_3_dummy = {
		[0] = "actor_effects.use_weapon(0)",
		[1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)",
--		[378] = "actor_effects.use_helmet(0)",
--		[379] = "xr_effects.disable_nv(db.actor, nil)",
		[550] = "level.add_cam_effector('camera_effects\\\\item_use_fast.anm', 8063, false,'')",
		[1040] = "xr_effects.disable_ui_inventory(db.actor, nil)",
		[1460] = "xr_effects.play_inv_repair_brushes()",
		[3020] = "level.add_cam_effector('camera_effects\\\\item_use.anm', 8064, false,'')",
		[7681] = "xr_effects.enable_ui_lite(db.actor, nil)",
--		[8480] = "actor_effects.use_helmet(1)",
		[9080] = "xr_effects.enable_imput(db.actor, nil)",
		[9680] = "actor_effects.use_weapon(1)"
	},
--И далее для всех-всех-всех предметов, которые используют анимации

 

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

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

function use_item_stack(s_obj,obj)

-- DRUGS USE
	-- caffeine x5
	if(s_obj)and(s_obj:section_name()=="caffeine_5")then
    	alife():create("caffeine_4", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
		local sleep_ch = system_ini():r_float(s_obj:section_name(), "eat_sleep")
		ui_sleep_dialog.set_sleep(sleep_ch)
    	items_animation.drugs_anims()
	end
	if(s_obj)and(s_obj:section_name()=="caffeine_4")then
    	alife():create("caffeine_3", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
		local sleep_ch = system_ini():r_float(s_obj:section_name(), "eat_sleep")
		ui_sleep_dialog.set_sleep(sleep_ch)
    	items_animation.drugs_anims()
	end
	if(s_obj)and(s_obj:section_name()=="caffeine_3")then
    	alife():create("caffeine_2", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
		local sleep_ch = system_ini():r_float(s_obj:section_name(), "eat_sleep")
		ui_sleep_dialog.set_sleep(sleep_ch)
    	items_animation.drugs_anims()
	end
	if(s_obj)and(s_obj:section_name()=="caffeine_2")then
    	alife():create("caffeine", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
		local sleep_ch = system_ini():r_float(s_obj:section_name(), "eat_sleep")
		ui_sleep_dialog.set_sleep(sleep_ch)
    	items_animation.drugs_anims()
	end
	if(s_obj)and(s_obj:section_name()=="caffeine")then
		local sleep_ch = system_ini():r_float(s_obj:section_name(), "eat_sleep")
		ui_sleep_dialog.set_sleep(sleep_ch)
		items_animation.drugs_anims()
	end
			-- DRUGS
		-- drug_charcoal x5
	if(s_obj)and(s_obj:section_name()=="drug_charcoal_5")then
    	alife():create("drug_charcoal_4", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
    	items_animation.drugs_anims()
	end
	if(s_obj)and(s_obj:section_name()=="drug_charcoal_4")then
    	alife():create("drug_charcoal_3", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
    	items_animation.drugs_anims()
	end
	if(s_obj)and(s_obj:section_name()=="drug_charcoal_3")then
    	alife():create("drug_charcoal_2", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
    	items_animation.drugs_anims()
	end
	if(s_obj)and(s_obj:section_name()=="drug_charcoal_2")then
    	alife():create("drug_charcoal", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
    	items_animation.drugs_anims()
	end
	if(s_obj)and(s_obj:section_name()=="drug_charcoal")then
		items_animation.drugs_anims()
	end
		-- drug_coagulant x5
	if(s_obj)and(s_obj:section_name()=="drug_coagulant_5")then
    	alife():create("drug_coagulant_4", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
		items_animation.drugs_anims()
	end

и т.д. для всех предметов.

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

-- в конфиге:
[kolbasa]:booster, food_base
$spawn 				= "food and drugs\kolbasa"
visual				= dynamics\devices\dev_kolbasa\dev_kolbasa.ogf
description			= st_kolbasa_descr

inv_name			= st_kolbasa
inv_name_short			= st_kolbasa
inv_weight			= 0.4

inv_grid_width		= 1
inv_grid_height		= 1
inv_grid_x			= 35
inv_grid_y			= 18
cost				= 960

attach_angle_offset		= 0.440521, 1.378287, -0.644026
attach_position_offset	= 0.104196, -0.010821, 0.076969
attach_bone_name		= bip01_r_hand
auto_attach				= false

eat_satiety				= 0.646
eat_radiation				= 0.0
eat_alcohol				= 0.100
eat_health			= -0.05

use_sound			= interface\inv_eat_paperwrap
anim_type 			= food --тип анимации

--в скрипте:
	local anim_type = ini:r_string(obj:section(), "anim_type")
	if anim_type == "food" then
		--запускаешь камеру и всё, что нужно
	elseif anim_type == "drug" then
	...
	end

 

И в дополнение, запускать функцию на проверку типа анимации предмета надо из bind_stalker.script таким образом:

--функция:

function actor_binder:use_inventory_item(obj)
	--в конце её, перед последним end, пишешь:
	items_manager.use_item_stack(obj) -- твоя функция (я вставил свою для примера)
end

 

26.04.2021 в 07:33, I am Dead сказал(а):

Как сделать тоже самое только для проверки предмета который находится на поясе?

Добавлять в движке итератор для пояса и с его помощью проверять наличие предмета нужной секции. Иначе никак.

Ссылка на комментарий
49 минут назад, ARTLantist сказал(а):

Добавлять в движке итератор для пояса и с его помощью проверять наличие предмета нужной секции. Иначе никак.

Подсказали функцию которая замечательно работает.

 

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

function actor_has_item_on_belt(actor, npc, p)
    local obj = actor:object(p[1])
    return obj and actor:is_on_belt(obj)
end

 

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

@ARTLantist Тогда вопрос уже другой, как эту функцию переделать под огср.

 

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

-- переносим все вещи из ящика с указанным story_id
function transfer_from_box(box_sid)
    local box = level_object_by_sid(box_sid)
    if box then
        box:iterate_inventory_box(function(item) box:transfer_item(item, db.actor) end)
    end
end

 

С такой функцией у меня идет ругань на iterate_inventory_box так как в движке его нету, происходит вылет.

 

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

Рнебята пытаюсь прикрутить гуи окно с двумя кнопками к функции обыска монстров.

function generic_object_binder:use_callback(obj, who)
	if self.use_flag == nil and self.object:section()~="m_trader" then
		self.object:set_nonscript_usable(false)
		self.use_flag = true
	end
	--------------------------
	--------------------------
	--------------------------
	NewUI4.main()
	--self:mutanter_use(obj,who)
	   
end

Разделил функцию на две. Где self:mutanter_use(obj,who) это все действия по обыску трупов. NewUI4.main() это собственно окно с двумя кнопками. Если вызываю из окна при нажатии кнопки скрипт валиться из за отсутствия переменных. Если функцию без окна запускаю все работает. Вызываю собственно так.

function NewUI4:button1_button_clicked()
	 bind_monster.generic_object_binder:mutanter_use()
	 --bind_monster.generic_object_binder:mutanter_use(obj,who)
	 self:Hide()
end

 

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

@Stalkersof Попробуй так сделать:

 

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

function generic_object_binder:use_callback(obj, who)
	if self.use_flag == nil and self.object:section()~="m_trader" then
		self.object:set_nonscript_usable(false)
		self.use_flag = true
	end
	--------------------------
	--------------------------
	--------------------------
    level.start_stop_menu(NewUI4.main(), true)
	--self:mutanter_use(obj,who)
	   
end

 

Ссылка на комментарий
44 минуты назад, I am Dead сказал(а):

@Stalkersof Попробуй так сделать:

 

  Показать



function generic_object_binder:use_callback(obj, who)
	if self.use_flag == nil and self.object:section()~="m_trader" then
		self.object:set_nonscript_usable(false)
		self.use_flag = true
	end
	--------------------------
	--------------------------
	--------------------------
    level.start_stop_menu(NewUI4.main(), true)
	--self:mutanter_use(obj,who)
	   
end

 

Не а не получается. NewUI4.main() это скрипт и функция в нем. Окно появляется и кнопки и все. 

function main()
	local hud = NewUI4(get_hud())
	level.start_stop_menu(hud, true) 
end

Попытаюсь еще раз объяснить проблему функция self:mutanter_use(obj,who) вызываемая непосредственно в скрипте. Прекрасно работает. Комментирую ее и пытаюсь вызвать при нажатии кнопки вылет. Либо не корректные параметры либо отсутствие параметров. Т.е вот это (obj,who)я не могу передать из другого скрипта.

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

@Stalkersof заведомо безнадёжная идея делать так, как сделано у тебя. При смерти мутанта в биндере он отлавливается и все действия относятся к нему, а когда ты хочешь заупустить из другой функции что-то из биндера монстров, ты уже теряешь этого монстра. Используй логические переменные и пересылай их в свой скрипт с ГУИ окном, там после нажатия кнопки делай true и в апдейте биндера монстров отлавливай момент, когда эта переменная true, выполняй нужные действия.

  • Нравится 1
Ссылка на комментарий
2 минуты назад, ARTLantist сказал(а):

@Stalkersof заведомо безнадёжная идея делать так, как сделано у тебя. При смерти мутанта в биндере он отлавливается и все действия относятся к нему, а когда ты хочешь заупустить из другой функции что-то из биндера монстров, ты уже теряешь этого монстра. Используй логические переменные и пересылай их в свой скрипт с ГУИ окном, там после нажатия кнопки делай true и в апдейте биндера монстров отлавливай момент, когда эта переменная true, выполняй нужные действия.

Вроде с переменными тоже пробовал. Хорошо еще раз попробую.

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

@I am Dead ну, либо лезть в движок, либо костыльно как-то перебирать все предметы в ящике.

Как вариант, попробуй так:

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

local cnt = box:object_count()
	for i=0, cnt-1 do
		local item = box:object(i)
		--нужные действия
	end

 

Сразу говорю, что не ручаюсь за работоспособность у inventory_box, я эту функцию раньше использовал только для актора

@Stalkersof и вообще, зачем тебе обратно ссылаться на биндер монстров? Можно же в скрипте с ГУИ выдать все нужные предметы и не забивать себе голову.

Изменено пользователем ARTLantist
Ссылка на комментарий
11 минут назад, ARTLantist сказал(а):

 

@Stalkersof и вообще, зачем тебе обратно ссылаться на биндер монстров? Можно же в скрипте с ГУИ выдать все нужные предметы и не забивать себе голову.

У меня там не только предметы(запчасти) чтение конфига монстра, удар ножом, хит монстру и анимация. Мне вот это и актор нужен там и монстр(obj,who) надо. 

Ссылка на комментарий
1 минуту назад, Stalkersof сказал(а):

и актор нужен там и монстр(obj,who)

Перешли их в скрипт с ГУИ окном:

NewUI4.main(obj,who)

и там уже устанавливай в той функции

function main(obj,who)
	self.actor = who
	self.monstr = obj
	--и далее нужное

и всё.

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

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

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

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

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

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

Войти

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

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

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