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

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

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

@mmindwork , если объекты из all.spawn, то у них есть уникальное имя, тогда можно получить объект:

local obj = alife():object("object_name")

А потом вертексы:

local lv, gv = obj.m_level_vertex_id, obj.m_game_vertex_id

Если есть story_id, то объект можно получить:

local obj = alife():story_object(story_id)

А затем и вертексы: см. выше.

Перемещается он или нет, роли не играет. 

  • Спасибо 1
  • Нравится 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO

naxac.gif

Привет всем живым!

Если я запускаю любой партикл (к примеру так: p = particles_object( "путь"); p:play_at_pos(npc:position()),

НУЖНО ЛИ как-то удалять? Я не про p:stop(), а про то, чтобы он не сохранился у меня в сейве.

Т.е. ещё проще: сохраняется ли запущенный партикл в сейве, или после load его как ни бывало? 

Спасибо!

@phalcor в сейве точно ничего не сохраняется. Чтобы партикл удалился сам, достаточно просто не оставить ссылку на него, сборщик мусора lua затрет. При выгрузке уровня, очевидно, все ссылки затираются. Хотя наверняка там грохаются и все партиклы отдельно, не дожидаясь никаких GC, ведь есть и еще всякие движковые партиклы, типа аномалий.

  • Спасибо 1

Telegram-канал RayTwitty Space

Здравствуйте помогите пожалуйста вот в этот скрипт добавить таблицу:
 

function actor_binder:key_hold(key)
if has_alife_info("item_id_used") then
	if not has_alife_info("test_work_start") and key == DIK_keys.DIK_W then
	test_script.test_func()
	end
end
end

что бы key == DIK_keys.DIK_W перебирал значения т.е DIK_S, DIK_A, DIK_D, DIK_W 

«Если долго мучиться, что-нибудь получится»
Охотник за артефактами|Crow Game Killer
img.php?nick=Pavel2000&sert=2&text=t0

@Pavel_2000 

local keys = {
	[DIK_keys.DIK_W] = true,
	[DIK_keys.DIK_A] = true,
	[DIK_keys.DIK_S] = true,
	[DIK_keys.DIK_D] = true
}
function actor_binder:key_hold(key)
	if has_alife_info("item_id_used") then
		if not has_alife_info("test_work_start") and keys[key] == true then
			test_script.test_func()
		end
	end
end

 

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

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

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

Спасибо большое. А как сделать что бы функция

4 часа назад, Kirgudu сказал:
test_script.test_func()

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

скрипт  который вызывается когда отпускаешь кнопку
ну и тут получается что нужно что бы скрипт не вызывался при отпускании кнопки пока одна из кнопок зажата в скрипте который ловит что  кнопка нажата и зажата

function actor_binder:key_release(key)
	if has_alife_info("item_id_used") then
		if has_alife_info("test_work_start") and keys[key] == true then
			test_script.test_func_release_key()
		end
	end
end

 
в скрипте test_script.test_func() который вызывается при нажатии выдаётся test_work_start
в скрипте test_script.test_func_release_key() который вызывается при отпускании стоит таймер по истечению которого забирается test_work_start
инфопорции возможно и не нужны, просто без них у меня не получалось вообще то что мне нужно

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

«Если долго мучиться, что-нибудь получится»
Охотник за артефактами|Crow Game Killer
img.php?nick=Pavel2000&sert=2&text=t0

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

  • Полезно 2

Telegram-канал RayTwitty Space

@RayTwitty попытался понять как у движка узнать state гг. не получилось. зато нашёл как у движка узнать скорость гг и повесил на апдейт ту функцию

    local vec = db.actor:get_movement_speed()
    local cur_speed = math.sqrt(vec.x*vec.x+vec.y*vec.y+vec.z*vec.z)
    if has_alife_info("item_id_used") and cur_speed>0 then
	    if not has_alife_info("test_work_start") then
		    test_script.test_func_on_run()
			--news_manager.send_tip(db.actor, "moving", nil, "information_dealer", 50)
			db.actor:give_info_portion("test_work_start")
	    end
    end
	if has_alife_info("item_id_used") and cur_speed==0 then
	    if has_alife_info("test_work_start") then
            test_script.test_func_on_stay()
			--news_manager.send_tip(db.actor, "staying", nil, "information_dealer", 50)
			db.actor:disable_info_portion("test_work_start")
        end
    end

и всё заработало как я хотел

«Если долго мучиться, что-нибудь получится»
Охотник за артефактами|Crow Game Killer
img.php?nick=Pavel2000&sert=2&text=t0

@Pavel_2000 эта тема скорее всего не прокатит, так как функция сработает при пинках ГГ другими объектами (аномалии, монстры и т.д.).

 

У тебя в движке есть коллбеки на события клавиатуры, значит почти наверняка есть метод получения стейта ГГ - какой-нибудь db.actor:actor_body_state(). Смотри документацию по движку.

  • Полезно 1

Telegram-канал RayTwitty Space

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

  • Согласен 1
  • Смешно 1

Всем доброго здравия. Нужен совет, как не убить ГГ. В двух словах - в xr_effects есть function kill_actor(actor, npc). Она убивает ГГ по любому поводу. Мне нужно её изменить так, что бы например, если в рюкзаке ГГ есть предмет N, то он оставался бессмертен. Если его нет, тогда функция работает в обычном режиме. Что то подобное делал давно(по моему через ельсе - выбор или), но подзабыл. И можно ли его применить на основной функции, тоже не знаю. П.С, ЧН 1.5.10 Движок не трогал, кроме рамок авто-захвата. 

Chypakabra Точно ! Вот пинка то мне и не хватало. Благодарю.

Изменено пользователем VVV32768
  • Нравится 1

Безглючная работа компа и модов, зависит от присутствия у юзера драйверов mozgi.sys и pryami_hands.vxd.

 

@VVV32768, простая проверка на присутствие предмета.

 

if db.actor:object(N) then
  -- предмет есть гг живой
  else
  -- тут предмета нет - гг нужно убить
 end

 

  • Спасибо 1
  • Нравится 1

Всем доброго! Вопрос такой - как отследить, что предмет выбросили в аномалию? К биндеру аномалии как-то подрубиться? Платформа ЧН.

Всем доброго! К вопросу выше, попытался через item_pos:distance_to(anomaly_pos) определить, но если выбросить\поднять предмет отойти от аномалии и снова выбросить код все равно считает что предмет рядом с аномалией, я так понимаю это связано с клиентским\серверным объектом? Собственно вопрос рабочий ли вариант? И как правильно получить позицию итема который выбросили на землю? 

@Chizha нет, это связано с нахождением определяемого объекта в контейнере. Если ты подобрал предмет и пытаешься определить его координаты - они будут такими, какими были непосредственно перед взятием в инвентарь, на какое бы расстояние ты ни отошёл после этого. Соответственно, для того, чтобы получить истинные координаты объекта, необходимо понимать, где он находится в этот момент времени:
- сам по себе: берём координаты самого объекта obj;

- внутри любого контейнера, в том числе в инвентаре ГГ: берём родительский объект по свойству серверного объекта obj.parent_id, и уже у него берём координаты.
Ну и не забываем, что для того, чтобы свойства серверного объекта обновились. Например, если пытаться брать координаты сразу в том участке кода, в котором выбросили предмет из инвентаря, то они будут ещё такими, как будто бы предмет до сих пор в инвентаре. Нужно пропустить апдейт.

  • Спасибо 1

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

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

  • Неравнодушный сталкер

@Kirgudu Отвечу со своего истинного аккаунта(Chizha в топку:crazy2:). Да я разобрался уже походу, еще были проблемы в принципе определить что предмет именно выбросили, а не съели\переложили\продали\зарядили.

Накидал вот такое
 

Скрытый текст
DROPPED_ITEMS = {}
TIME_UPDATE = nil

function on_item_drop_to_level(obj)
	-- чета делаем
end

function on_item_drop(obj)
	if not db.actor or not db.actor:alive() then
		return false
	end
	table.insert(DROPPED_ITEMS, obj:id())
	TIME_UPDATE = time_global() + 200
end


function check_drop_to_level()
	if not db.actor or not db.actor:alive() then
		return false
	end
	
	if TIME_UPDATE~=nil and #DROPPED_ITEMS > 0 and TIME_UPDATE < time_global() then
		TIME_UPDATE = nil
			for key, value in pairs(DROPPED_ITEMS) do
				local obj = level.object_by_id(value)
				if obj and not obj:parent() then
					on_item_drop_to_level(obj)
				end
				DROPPED_ITEMS[key] = nil
			end
	end
end

 

 

 

Скрытый текст
function actor_binder:on_item_drop (obj)		
  --code
  _slm_drop_to_level.on_item_drop(obj)
  --code
end

function actor_binder:update(delta)
  --code
  _slm_drop_to_level.check_drop_to_level()
  --code
end

 

 

Ну а дальше уже через  item_pos:distance_to(anomaly_pos)

Изменено пользователем vampirnik77
  • Нравится 1
  • Смешно 1

Вернулся получается...

@vampirnik77 вот это уже знакомый ник. )

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

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

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

  • Неравнодушный сталкер

Что касается "выбросили в аномалию" в дополнение к моему предыдущему посту, вдруг кому полезно будет.

 

Добавляем биндер для [base_zone]
 

Скрытый текст
[zone_base]
idle_light_volumetric 	= false
idle_light_shadow		= true
effective_radius		= 0.75
pick_dof_effector		= true
idle_light_r1			= true
;bolt_entrance_particles	= anomaly2\anomaly_entrance
script_binding      = bind_anomaly.bind

[zone_base_noshadow]:zone_base
idle_light_shadow		= false
idle_light_r1			= true

 

 

Скрытый текст
ANOMALIES = {}

function check_drop_to_anomaly(obj)
	if not db.actor or not db.actor:alive() or not obj then
		return false
	end

	local nearest	
	local dist_nearest
	
	for key, value in pairs(ANOMALIES) do
		local anomaly_pos, item_pos, find_dist = value.object:position(), obj:position(), 2.5
		local dist_to_anomaly = item_pos:distance_to(anomaly_pos)
		--Если рядом с предметом есть аномалии находим самую близкую
		if dist_to_anomaly <= find_dist then
			if not nearest or dist_to_anomaly < dist_nearest then
				nearest = value
				dist_nearest = dist_to_anomaly
			end
		end
	end
	
	-- и считаем что бросили в нёё
	if nearest then 
		nearest:on_drop_to_anomaly(obj)
	end
	
	return true
end

function bind(obj)
	obj:bind_object(anomaly_binder(obj))
end

class "anomaly_binder" (object_binder)
function anomaly_binder:__init(obj) super(obj)

end

function anomaly_binder:net_spawn(server_object)
	if not object_binder.net_spawn(self, server_object) then
		return false
	end

	ANOMALIES[self.object:id()] = self
	
	return true
end

function anomaly_binder:update(delta)
	object_binder.update(self, delta)
end



function anomaly_binder:on_drop_to_anomaly(obj)
--чета  делаем
end

 

 

Ну и check_drop_to_anomaly вызывается в on_item_drop_to_level.
Это всё для ЧН(в ЗП думаю тоже примерно так, насчёт ТЧ не уверен)

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

Вернулся получается...

  • Неравнодушный сталкер

Всем доброго! Нужен совет\подсказка, можно ли как-то заспавнить в оффлайне(на другой локации например) рюкзак(аля стационарный тайник) по координатам и наполнить его предметами?

UPD. И еще вопрос:crazy2: как можно определить что нпс торговец или техник? Торговца вроде через clsid можно определить, а с техником как быть...

Вернулся получается...

14.12.2025 в 07:08, vampirnik77 сказал:

как можно определить что нпс торговец или техник? Торговца вроде через clsid можно определить, а с техником как быть...

Прямого свойства или свойства нет-пакета не припомню. Но можно попробовать зайти через текущую логику и отображение в зависимости от неё точки на миникарте: для ЧН см. подсказки в stalker_generic.reset_show_spot(). Я бы так попробовал.
Что же касается спавна на другой локации и наполнения контейнера, то проблем тут на первый взгляд не видно. Сначала нужные координаты и вертексы, затем спавн по id.

  • Спасибо 1

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

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

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

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

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

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

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

Войти

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

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

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