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

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

 

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

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/

@Капрал Хикс 

Ну так у тебя же четко написано: попытка сравнить число с nil. Т.е. в переменной ver у тебя nil. Вот и раскапывай всю цепочку инициализации этой переменной и ищи место где она не инициализируется правильным значением.

 

@Баба ЯГА 

Сделай так:

    wnd = nil -- объявили глобальную переменную

далее

    wnd = ui_my_menu.menu()
    level.start_stop_menu(wnd, true)

В переменной wnd будет объект класса твоего окна. Глобальная переменная будет доступна из любого иного места.

  • Полезно 1
1 час назад, AndreySol сказал(а):

Вот и раскапывай всю цепочку инициализации этой переменной и ищи место где она не инициализируется правильным значением.

В том-то и дело, что эта переменная встречается только в этом скрипте и только в этой функции, с оригинала так. Где она инициализируется - непонятно.

10 часов назад, Капрал Хикс сказал(а):

[error]Arguments     : LUA error: ... of chernobyl\gamedata\scripts\dialog_manager.script:880: attempt to compare number with nil

У вас LUA ругается на:

3 часа назад, AndreySol сказал(а):

четко написано: попытка сравнить число с nil. Т.е. в переменной ver у тебя nil.

 

И вместо того чтоб попытаться проверить чему-же равна ver, вы пытаетесь подменить её

10 часов назад, Капрал Хикс сказал(а):

А вот при попытке поставить затычку перед строкой if ver >= 7 then -> if not ver then ver = 8 end...

причём на ver = 8, хотя 

 

10 часов назад, Капрал Хикс сказал(а):

В system.ltx указан шестой патч, т.е. current_server_entity_version = 7

На что уже движок начинает ругаться

10 часов назад, Капрал Хикс сказал(а):

0023:05185AF0 xrGame.dll
 [error][      87]    : Параметр задан неверно.

 

Думаю логичнее было бы затычку сделать так 

If ver == nil or ver == "nil" then ver = 7 end

 

Хотя чукча е програмист и может ошибаться

Приветствую !

Платформа ЗП. Попробовал перенести из мода на ТЧ скрипт на лечение раненых врагов. Собственно, вот что получилось:
 

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

local iTimer
local npc_save

function start_timer()
     iTimer = time_global() + 1*1000
end

function timer_update()
     if iTimer and iTimer < time_global() then
	iTimer = nil
	npc_out_gulag(npc_save)
     end
end

function enemies_dialog_rep(first_speaker, second_speaker)
local com = second_speaker:character_community()
     if com == "stalker" then
	db.actor:set_character_rank(db.actor:character_rank() + 40)
     elseif com == "killer" or com == "bandit" then
	second_speaker:set_character_community("stalker", 0, 0)
	db.actor:set_character_rank(db.actor:character_rank() + 30)
	npc_save = second_speaker
	start_timer()
     elseif second_speaker:character_community() == "dolg" then
	db.actor:set_character_rank(db.actor:character_rank() + 40)
     elseif second_speaker:character_community() == "freedom" then
	db.actor:set_character_rank(db.actor:character_rank() + 40)
     else
	second_speaker:set_character_community("stalker", 0, 0)
	db.actor:set_character_rank(db.actor:character_rank() + 30)
end
     if second_speaker ~= nil then
	if com == "stalker" or com == "bandit" or com == "dolg" or com == "freedom" or com == "killer" then
	second_speaker:set_relation(game_object.friend, first_speaker)
	end
     end
end

function npc_out_gulag(second_speaker)
local obj = alife():object(second_speaker:id())
local unreg_id = obj:smart_terrain_id()    
	if unreg_id ~= 65535 and second_speaker:alive() then      
		local unreg = alife():object(unreg_id)
		if unreg then
			unreg:unregister_npc(obj) 
		end  
	end
	npc_save = nil
end

 

meh.timer_update() - висит на апдейте в bind_stalker. 
enemies_dialog_rep(first_speaker, second_speaker) - вызывается из dialogs.script:
 

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

function transfer_medkit(first_speaker, second_speaker)
	if first_speaker:object("medkit") ~= nil then

		dialogs.relocate_item_section(second_speaker, "medkit", "out")
		--alife():release(alife():object(second_speaker:object("medkit"):id()), true)

	elseif first_speaker:object("medkit_army") ~= nil then

		dialogs.relocate_item_section(second_speaker, "medkit_army", "out")
		--alife():release(alife():object(second_speaker:object("medkit_army"):id()), true)

	else

		dialogs.relocate_item_section(second_speaker, "medkit_scientic", "out")
		--alife():release(alife():object(second_speaker:object("medkit_scientic"):id()), true)

	end

	alife():create("medkit_script", second_speaker:position(), second_speaker:level_vertex_id(), second_speaker:game_vertex_id(), second_speaker:id())

	-- Тут надо анлочить аптечку для использования.
	xr_wounded.unlock_medkit(second_speaker)

	-- Лечение врагов
	if second_speaker:relation(first_speaker) == game_object.enemy then
		meh.enemies_dialog_rep(first_speaker, second_speaker)
	end
	        first_speaker:change_character_reputation(10);
        end

 

Всё, вроде, работает. Прошу проверить "грамотность" meh.script. Вопрос возник потому, что узнал, что неписей после принудительной смены community необходимо выводить из гулага. Раньше просто прям в dialogs.script было следующее:
 

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

	if second_speaker:relation(first_speaker) == game_object.enemy then
		second_speaker:set_relation(game_object.friend, first_speaker)
		second_speaker:set_character_community("stalker", 0, 0)
		first_speaker:set_relation(game_object.friend, second_speaker)
	end
	        first_speaker:change_character_reputation(10);
        end

 

И также всё работало нормально. Просветите, пожалуйста, стоило вообще заморачиваться с meh.script или можно оставить всё как было без unregister_npc. 
P.S. Сам ни в коей мере не программист...

@AndreySol  Помогло. Копнул дальше по твоему примеру, и оказалось, что можно и так тоже было:

local MyMenu = ui_my_menu.menu() -- > type = userdata
local menuIsShown = MyMenu:IsShown() -- > type = userdata
local w = MyMenu:GetWidth() -- > type = number -> 1024
local mm_btn = MyMenu:GetButton("knopka"):GetWidth() -- > type = number -> 127
-- т.е. любой GET - работает отлично, и для самого меню, и для
-- его елементов; если параметр был задан изначально -
-- то вернёт значение, если небыло параметра изначально - то вернёт = nil
-- а вот любой SET - не работает, увы...
-- SET - всегда возвращает NIL и никакие параметры не меняются, а жаль...
MyMenu:GetButton("knopka"):SetText( "меняю на другой" ) -- NIL

жаль, думал можно получить меню, и в реальном времени менять координаты кнопок, цвет текста и т.д., но оказалось - нельзя... Хотя, возможно, я всё-же что-то делаю не так?...  :russian_ru:

  • Полезно 1

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

11 часов назад, Капрал Хикс сказал(а):

встречается только в этом скрипте и только в этой функции

Не правда. В аргументе ф-ции эта переменная - смотрите дальше, где вызывается эта ф-ция, и как передается соответствующий аргумент ф-ции.

  • Сомнительно 1

@Капрал Хикс Вот так твоя проблема решается:

 

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

function motivator_binder:load(reader)
  self.loaded = true

  printf("motivator_binder:load(): self.object:name()='%s'", self.object:name())
  object_binder.load(self, reader)
  printf("motivator_binder:object_binder.load(): self.object:name()='%s'", self.object:name())

  if reader:r_eof() then
    abort("[xr_motivator.script]SAVE FILE IS CORRUPT")
  end


  self.treasure_processed = reader:r_bool()

  xr_logic.load_obj(self.object, reader)
    if system_ini():r_u32("script","current_server_entity_version") > 6 then    -- патч 6
        self.npc_script_version = alife():object(self.object:id()).script_version
        dialog_manager.load(self.object, reader, self.npc_script_version)
    else    -- патч 4
        dialog_manager.load(self.object, reader)
    end
  trade_manager.load(self.object, reader)
end

А свои затычки из dialog_manager убери оставив лишь такой код:

 

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

function load(npc, reader, ver)
    if selected_phrase_by_id == nil then
        selected_phrase_by_id = {
            intro = {},
            cool_info = {},
            action_info = {}
        }
    end
    
    
    local flag = nil
    if ver >= 7 then
        flag = reader:r_stringZ()
    else
        flag = tostring(reader:r_s16())
    end
    
    if flag ~= "-1" then
        selected_phrase_by_id.intro[npc:id()] = {phrase = flag, count = 0}
    else
        selected_phrase_by_id.intro[npc:id()] = nil
    end

    if ver >= 7 then
        flag = reader:r_stringZ()
    else
        flag = tostring(reader:r_s16())
    end
    if flag ~= "-1" then
        selected_phrase_by_id.cool_info[npc:id()] = {phrase = flag, count = 0}
    else
        selected_phrase_by_id.cool_info[npc:id()] = nil
    end
    
end

 

  • Спасибо 1
  • Полезно 1
1 час назад, AndreySol сказал(а):

смотрите дальше, где вызывается эта ф-ция, и как передается соответствующий аргумент ф-ции.

Вот он, единственный вызов в xr_motivator:

    dialog_manager.load(self.object, reader)

Так в оригинале.

    dialog_manager.load(self.object, reader, self.npc_script_version)

Так в RMA.

Простите, для меня неочевидно, что 

self.npc_script_version = alife():object(self.object:id()).script_version

Это ver тот самый (если это и имелось в виду).

@I am Dead от души! Не думал, что аж так оно тянется.

Здравствуйте. Хотел бы задать вопросец(платформа CoP) :

Поставил мод на анимированные медикаменты. 

Решил я добавить использование эффектов камеры при приеме медикаментов. 

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

Вопрос: есть ли функция для проверки использования не именно отдельного предмета, а просто?

 

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

Подхожу к тайнику, открываю его, вопрос: как узнать ID именно этого рюкзака, который сейчас открыт?

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Есть такая функция из 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 почему то не получается с телефона поместить под спойлер.

@Biblia Блин, я сейчас не у компьютера поэтому не могу наизусть пример написать. Тем более в интернета полно уроков на эту тему.

@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

@I am Dead а какая платформа? Просто на чистой зп ни в скриптах (_g.script), ни в движке нет такой функции

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

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

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

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

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

Войти

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

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

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