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

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

Господа, подскажите добрым советом, как проиграть звук? Задумка такая: в определенные часы будут от лица ГГ (типа по рации) проигрываться рандомные звуки, обрывки чьих-то фраз и тд, и всё это дело НПС будут комментировать в чат текстом, типа: "Что это было?" или "Вы тоже это слышали?"

Так вот, помогите пожалуйста по возможности с построением ф-ции с проигрыванием рандомного ogg из папки? Нужно только проигрывание рандомного звука...


Подарки

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

    @_Sk8_AsTeR_

    Скрытый текст
    
    do
    	local lastIdx
    	function name ()
    		local sndTblPath = ["", "", ""] -- список путей до файлов со свуками
    		local idx = math.random(0, table.getn(sndTblName))
          	
          	if idx ~= lastIdx then
    			local sndPath = sndTblName[)]
    			local snd = xr_sound.get_safe_sound_object(sndPath) -- путь до звукового файла
    			snd:play_no_feedback(db.actor, sound_object.s2d, 1, vector(), 1.0)
          	else
          		for i=1,100 do 2+2*5 end
          		return name ()
         	end
    	end
    end

     

     

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

    Я опять встрял, и не могу понять, во что именно… Есть две функции: одна привязана к "info_callback" и спавнит предмет в момент начала торговли, другая запускается после спавна предмета и должна получить его id. Как только я пытаюсь добавить в аргументы второй функции "info_id" для дальнейших действий на основании инфо-поршней из основного колбэка, функция перестает видеть созданный объект, хотя вызывается строго после его создания. Может ли проблема быть в том. что в первой функции создаются два объекта, а колбэк только на одном?

    Код ниже, требуется передать (info_id) в функцию "transfer".

    Spoiler


    
    function box_id(sect)
    	for i = 0, 65535 do
    		local obj = level.object_by_id(i)
    		if obj and obj:section() == sect then
    			return obj:id()
    		end
    	end
    end
    
    function box_spawn(info_id)
    	local act = db.actor
    	if info_id == "ui_trade" then
    		local act_pos = act:position()
    
    		alife():create( "box_ex", vector():set( (act_pos.x + 1), (act_pos.y), (act_pos.z) ),
    			act:level_vertex_id(), act:game_vertex_id() )
    
    		local spawn = alife():create( "box_eq", vector():set( (act_pos.x), (act_pos.y), (act_pos.z + 1) ),
    			act:level_vertex_id(), act:game_vertex_id() )
    		level.client_spawn_manager():add(spawn.id, -1, transfer)
    	end
    end
    
    function transfer()
    	local act = db.actor
    	local box_1 = box_id("box_eq")
    	local box_2 = box_id("box_ex")
    
    	if box_1 and box_2 then
    		news_manager.send_tip(act, "spawned")
    	else
    		news_manager.send_tip(act, "missing")
    	end
    end

     

     

     

    Переделал вызовы так, чтобы "info_id" читался непосредственно в "bind_stalker", а функция, зависящая от спавна, только перебрасывала предметы. С одной коробкой работает, с двумя – не переносятся предметы из второй коробки, хотя id второй коробки читается правильно и предметы _в_ эту коробку точно переносятся, если что-нибудь купить (коробки на время теста не удаляются). Посмотрите, пожалуйста, кто-нибудь, где я косячу: https://drive.google.com/open?id=1ak0_jspeRXxoTxxHIDLCe-J0-Psp41DS

    Мини-моды: ТЧ ЧН ЗП

    Шпаргалка

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

    @Norman Eisenherz, у тебя id заспавненных предметов есть уже сразу после спавна. Зачем корячить ещё и какой-то поиск по десяткам тысяч объектов?

    local spawn1 = alife():create( "box_ex", vector():set( (act_pos.x + 1), (act_pos.y), (act_pos.z) ), act:level_vertex_id(), act:game_vertex_id() )
    local spawn2 = alife():create( "box_eq", vector():set( (act_pos.x), (act_pos.y), (act_pos.z + 1) ), act:level_vertex_id(), act:game_vertex_id() )
    local box_1_id = spawn1.id
    local box_2_id = spawn2.id

    Возможно, требуется сделать что-то другое, кроме как получить id предметов (например: заспавнить 2 предмета, дождаться выхода в онлайн обоих, после чего что-то сделать с их клиентскими объектами), но тогда опиши человеческим языком, что именно.

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

    @Kirgudu Не "возможно", а так и есть – надо дождаться выхода в онлайн, чтобы потом переносить объекты в созданные коробки. Ссылку на id я могу передать только на один объект в одном колбэке, поэтому второй все равно придется искать через перебор (если только колбэк не понимает две пары аргументов "id, obj"). Во втором посте как раз вариант с прямой передачей одного id вместо ссылки на info_id общего колбэка.

    Мини-моды: ТЧ ЧН ЗП

    Шпаргалка

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

    Ссылку на id я могу передать только на один объект в одном колбэке

    Не правда... Учи луа и экспортированные ф-ции движка:508:

    Аргументом в ф-ции кэллбэка может быть и таблица, в которую можно без проблем положить идентификаторы любого кол-ва объектов...

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

    Создал свою текстуру, например: moy_textura.dds , её надо где-то регистрировать? Или можно так использовать? 

    • Смешно 1

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

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

    @Баба ЯГА, Причём здесь тема скриптования ? Строгое предупреждение за оффтоп.

    Текстуру можешь регить, можешь нет. Движок всё равно её обсчитает. Загляни файл textures.ltx и всё поймешь. Остальное есть в профильных темах и на Сталкер-Вики.

    "Кругом зомби.....у меня кончаются патроны...."

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

    @BFG, однако, спасибо за подсказку и наводку! :73: 

    Ушёл курить :puffy:  textures.ltx (я, отчего-то решил, что любое ковыряние в игре, это - скриптование ... ну, как говорится: "и на старуху - бывает проруха".)

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

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

    @AndreySol Попробовал создать два объекта в одной функции – получается два тестовых сообщения с разными id объектов. Это предполагаемый результат, или как-то можно передать две пары "id, obj" в одном вызове функции?

    Spoiler
    
    function drop_check(obj) -- [bind_stalker] on_item_drop(obj)
    	if obj:section() == "hand_radio" then
    		spawn()
    	end
    end
    
    function spawn()
    	local act = db.actor 
    	local item = { "bandage", "medkit" }
    	for k, v in pairs(item) do
    		local spawn = alife():create(v, act:position(), act:level_vertex_id(), act:game_vertex_id())
    		level.client_spawn_manager():add(spawn.id, -1, test_msg)
    	end
    end
    
    function test_msg(id, obj)
    	news_manager.send_tip(db.actor, "obj: " .. obj:section() .. ", id: " .. id)
    end

     

    Мини-моды: ТЧ ЧН ЗП

    Шпаргалка

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

    @Norman Eisenherz, разных способов можно придумать. Например:

    Скрытый текст
    
    local spawned = {}
    
    function spawn()
    	local act = db.actor
    	local item = { "bandage", "medkit" }
    	for _,v in ipairs(item) do
    		local spawn = alife():create(v, act:position(), act:level_vertex_id(), act:game_vertex_id())
    		table.insert(spawned, {id = spawn.id, obj = spawn})
    		level.client_spawn_manager():add(spawn.id, -1, test_msg)
    	end
    end
    
    function test_msg(id, obj)
    	if #spawned == 2 then
    		for _,v in ipairs(spawned) do
    			news_manager.send_tip(db.actor, "obj_section: " .. v.obj:section() .. ", v.id: " .. v.id)
    		end
    	end
    end

     

    Кроме того, существует перегрузка метода:

    level.client_spawn_manager ():add(spawn.id, -1, spawn_callback, arg)

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

    Тогда колбэк будет выглядеть так:

    function spawn_callback(arg, id, obj)
    	-- переданный дополнительный аргумент идёт первым
    end

     

    Изменено пользователем Kirgudu
    • Полезно 1
    Ссылка на комментарий

    Кто знает, как проверить момент, когда ГГ берёт в руки труп? или ящик? и т.д. Именно в руки. Например, ГГ взял в руки труп и в этот момент в лог должно вывести сообщение, что ГГ взял в руки какой-то там obj:name() ну или любое сообщение. Как отловить это действо? Перепробовал всё что было в bind_stalker - не нашёл отклика. Может не там смотрю? :dash2:

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

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

    Вопрос по функции transfer_item: ссылка дается на секцию предмета, и если в инвентаре несколько предметов с одинаковыми секциями, часто передается не тот, что в слоте. Попытка сослаться на id() вместо секции (как в варианте alife():release) делает функцию "пустышкой" – вылета нет, но и эффекта тоже никакого. Какую проверку можно ввести для точного определения предмета?

    Spoiler
    
    function items_out(box_id)
    	local act = db.actor
    	local box = level.object_by_id(box_id)
    	local n = {1, 2, 6}
    	for k, v in pairs(n) do
    		local slot = act:item_in_slot(v)
    		if slot then
    			act:transfer_item( act:object( slot:section() ), box ) -- здесь ошибка
    		end
    	end
    end

     

     

    Мини-моды: ТЧ ЧН ЗП

    Шпаргалка

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

    @Norman Eisenherz

    52 минуты назад, Norman Eisenherz сказал:

    act:object( slot:section()

    Это зачем ???

    У тебя же в переменной slot уже находится объект из соответствующего слота, ее и используй в transfer_item.

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

    @AndreySol Есть контакт. Уже не помню, где я нашел образец с секцией, но это явно сбило меня с толку.

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

    Мини-моды: ТЧ ЧН ЗП

    Шпаргалка

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

    Времени доброго, знатоки! Подскажите по возможности, как, каким образом перебрать нетпакеты всех живых НПС, чтобы выдернуть имя абсолютно случайного живого НПС?


    Подарки

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

    Здрасьте.

     

    При использовании скрипта для исключения экипированных предметов на время торговли/обыска случается вылет со ссылкой на слоты экипировки в порядке "пистолет > автомат > броня" (при наличии), если открыть и тут же закрыть труп или контейнер. Можно ли эту ошибку обойти в самом коде?

    Триггер скрипта – info_callback в [bind_stalker.script]

    Spoiler

    Expression    : e_entity->ID_Parent == id_parent
    Function      : xrServer::Process_event_reject
    File          : E:\stalker\sources\trunk\xr_3da\xrGame\xrServer_process_event_reject.cpp
    Line          : 23
    Description   : wpn_sig22029705
    Arguments     : single_player

    Spoiler
    
    local act = db.actor
    local box_1 = 0
    local box_2 = 0
    
    
    -- // проверка наличия активного противника в радиусе охвата мини-карты // --
    function enemy()
    	for i = 0, 65535 do
    		local obj = level.object_by_id(i)
    		if obj and obj:alive()
    		and ( obj:relation(act) == game_object.enemy or IsMonster(obj) )
    		and obj:position():distance_to( act:position() ) < 30 then
    			return true
    		end
    	end
    	return false
    end
    
    
    -- // спавн коробок и отслеживание ввода в онлайн // --
    function spawn_box_1(info_id)
    	if info_id == "ui_trade" or info_id == "ui_car_body" then
    		local act_pos = act:position()
    		local spawn = alife():create( "box_eq", vector():set( (act_pos.x + 1), (act_pos.y), (act_pos.z + 1) ),
    			act:level_vertex_id(), act:game_vertex_id() )
    		level.client_spawn_manager():add(spawn.id, -1, transfer_out)
    	end
    end
    
    function spawn_box_2(info_id)
    	if info_id == "ui_trade_hide" or info_id == "ui_car_body_hide" then
    		local act_pos = act:position()
    		local spawn = alife():create( "box_ex", vector():set( (act_pos.x + 1), (act_pos.y), (act_pos.z + 1) ),
    			act:level_vertex_id(), act:game_vertex_id() )
    		level.client_spawn_manager():add(spawn.id, -1, transfer_back)
    	end
    end
    
    
    -- // перенос предметов // --
    function transfer_out(id, obj)
    	box_1 = id
    --	news_manager.send_tip(act, "out_1: " .. box_1)
    	items_out(box_1)
    end
    
    function transfer_back(id, obj)
    	box_2 = id
    --	news_manager.send_tip(act, "out_2: " .. box_2)
    	items_out(box_2)
    --	news_manager.send_tip(act, "back_1:" .. box_1)
    	items_back(box_1)
    	spawn_dl()
    end
    
    function spawn_dl() -- костыль для задержки на время переноса предметов в доп. коробку
    	local act_pos = act:position()
    	local spawn = alife():create( "box_dl", vector():set( (act_pos.x + 1), (act_pos.y), (act_pos.z + 1) ),
    			act:level_vertex_id(), act:game_vertex_id() )
    		level.client_spawn_manager():add(spawn.id, -1, transfer_end)
    end
    
    function transfer_end(id, obj)
    	alife():release( alife():object(id) )	-- удаление костыля
    --	news_manager.send_tip(act, "back_2:" .. box_2)
    	items_back(box_2)
    
    	if enemy() == false then
    --		news_manager.send_tip(act, "все тихо, выбор болта")
    		act:activate_slot(5)
    	elseif enemy() == true and act:item_in_slot(2):section() == "wpn_vintorez" and act:item_in_slot(1) then
    		act:activate_slot(2)		-- небольшая правка - винторез стабильно пролетает в слоты до пистолетов
    	end
    end
    
    
    -- // перенос предметов в коробку // --
    function items_out(box_id)
    	local box = level.object_by_id(box_id)
    	local n = {1, 2, 6}
    	for k, v in pairs(n) do
    		local slot = act:item_in_slot(v)
    		if slot then
    			act:transfer_item(slot, box)
    		end
    	end
    end
    
    -- // перенос предметов из коробки и ее удаление // --
    function items_back(box_id)
    	local box = level.object_by_id(box_id)
    	local storage = {}
    
    	for i = 0, 65535 do
    		local obj = level.object_by_id(i)
    		if obj and obj:parent() and obj:parent():id() == box_id then
    			table.insert(storage, i)
    		end
    	end
    
    	if next(storage) ~= nil then
    		for k, v in pairs(storage) do
    			local item = level.object_by_id(v)
    			box:transfer_item(item, act)
    		end
    --	else news_manager.send_tip(act, "empty box")
    	end
    
    	alife():release( alife():object(box_id) )
    end

     

     

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

    Мини-моды: ТЧ ЧН ЗП

    Шпаргалка

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

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

    А нет-пакеты зачем тебе ? Достаточно просто перебрать все объекты, и для тех из них, кто является сталкером, получить имя:

    for i = 1, 65535 do
        local obj = alife():object(i)
        if obj and IsStalker(obj) then
            local text = obj:name() -- тут и есть имя сталкера       
        end
    end

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

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

    @AndreySol, возможно имелось ввиду игровое емя, которое высвечивается в диалоге, такое имя можно получить вроде как только у клиентского объекта или в нет пакете

    Ссылка на комментарий
    В 15.04.2019 в 00:07, AndreySol сказал:

    local text = obj:name() -- тут и есть имя сталкера 

     Сделал функцию, чтобы на экран игровой выводилось значение переменной text

    Возвращается что-то типа esc_stalker_01_784766

    А как можно добиться именно игрового имени? "Андрей Блатной", "Сережа Жыжа" и тдтп?

    Пробовал извращаться с get_npc_name(obj), но тщетно :(


    Подарки

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

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

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

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

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

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

    Войти

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

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

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

    AMK-Team.ru

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