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

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

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

Так вот, помогите пожалуйста по возможности с построением ф-ции с проигрыванием рандомного 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), но тщетно :(

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

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

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

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

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

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

Войти

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

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

AMK-Team.ru

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