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

Внимание. На форуме проводятся технические работы с боковым меню.

_Val_ _Val_

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

Тема для обсуждения скриптов всего и всех в серии игр 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/

@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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

Кто знает, как проверить момент, когда ГГ берёт в руки труп? или ящик? и т.д. Именно в руки. Например, ГГ взял в руки труп и в этот момент в лог должно вывести сообщение, что ГГ взял в руки какой-то там 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), но тщетно :(

Разрядность, 2 в 16 степени (65 536) + сдвиг на 1 назад с учетом отсчета от 0

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

Шпаргалка

@_Sk8_AsTeR_, когда создаётся новый объект, ему присваивается свободный id. 

Диапозон id от 0 до 65535, что ограничивает число одновременно существующих объектов.

При этом 0 - actor, 65535 - ничей, имеет специальное значение. 

 

  • Спасибо 1
  • Полезно 2

⠀

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

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

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

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

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

Войти

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

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

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