Скриптование - Страница 638 - Скрипты / конфиги / движок - AMK Team
Перейти к контенту

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

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

Вот, кстати, оригинал всех этих ковырялок. И да, похоже, что-то где-то лишнее накручено. По крайней мере, оригинал ТЧ 1.0006 в данном случае вылета не предусматривает.

  • Нравится 1
  • Полезно 2

Ребята а подскажите как сделать простой счетчик времени. Т.е мне нужно через 12,14 и 16 часов игрового времени выполнять действие.

Пробовал через time_global() но у меня есть сон с прокруткой. 

time_global() я так понял это время не игровое.

Короче делаю индикатор сна на худе.

ОГСР движок

@Stalkersof , возьми ogse-таймеры. Там несложно адаптировать. Пользоваться тоже несложно.

  • Полезно 2

Здесь могла быть ваша реклама.

Ребята нужна помощь. Сделал я индикатор сна но есть одна проблема. Не могу сообразить как сделать плавный переход индикатора. т.е сейчас все работает. Но дело в том что сон у меня интервальный от 30 минут до 9-ти часов с шагом в зо минут. Работает все единственное сколько бы игрок не проспал хоть 30 минут хоть 9 часов все скидывается, индикатор скрывается.

Скрытый текст
local hud = get_hud()
local sleep_sound = xr_sound.get_safe_sound_object([[actor\sleepy]])
local sleep_z,sleep_g,sleep_k = 0,0,0

-- Время в часах через которое показываем индикаторы
local time_z = 12 -- зеленый индикатор 
local time_g = 14 -- желтый индикатор. 
local time_k = 16 -- красный индикатор. 

-- стартовое время в минутах
local sleep_time = level.get_time_days()*60*24+level.get_time_hours()*60+level.get_time_minutes() 

function update()
    -- текущее время в минутах
	local time_global = level.get_time_days()*60*24+level.get_time_hours()*60+level.get_time_minutes()
	--log1 (time_global)
	--log1 (sleep_time)
	if not ogsr_vars.get_value_safe( "sleep_time" ) then
	    ogsr_vars.set_value( "sleep_time", sleep_time)
	else	
	    sleep_time = ogsr_vars.get_value_safe( "sleep_time" )
	end	
	
	if (time_global > (sleep_time + time_z * 60)) and (time_global < (sleep_time + time_g * 60)) then
	--log1("z")
	    add_sleep_static("green")-- green
		db.actor.power = - 0.001
		if sleep_sound_pley and sleep_z == 0 then 
		    sleep_sound:play(db.actor, 0, sound_object.s2d) 
			sleep_z = 1 
		end
	elseif (time_global > (sleep_time + time_g * 60)) and (time_global < (sleep_time + time_k * 60)) then
	--log1("g")
	    add_sleep_static("yellow")-- yellow
		db.actor.power = - 0.003
		if sleep_sound_pley and sleep_g == 0 then 
		    sleep_sound:play(db.actor, 0, sound_object.s2d) 
			sleep_g = 1 
		end
	elseif (time_global > (sleep_time + time_k * 60)) then
	--log1("k")
	    add_sleep_static("red")-- red
		db.actor.power = - 0.005
		if sleep_sound_pley and sleep_k == 0 then 
		    sleep_sound:play(db.actor, 0, sound_object.s2d) 
			sleep_k = 1 
			level.add_pp_effector("peace_fade.ppe", 1973, false) 
		end
	end

end

-------------------------------------------------------------------------------------------------
function add_sleep_static(color)
	if color == "green" then
		hud:AddCustomStatic("can_sleep_static", true):wnd():SetColor(GetARGB(255,76,255,0))	
	elseif color == "yellow" then
		hud:AddCustomStatic("can_sleep_static", true):wnd():SetColor(GetARGB(255,255,216,0))	
	elseif color == "red" then
		hud:AddCustomStatic("can_sleep_static", true):wnd():SetColor(GetARGB(255,255,0,0))
	end
end

-- Функция запускается из крипта сна по окончании
function remove_sleep_static()
	if hud:GetCustomStatic("can_sleep_static") then
		hud:RemoveCustomStatic("can_sleep_static")
	end
	ogsr_vars.remove_value( "sleep_time" )
	sleep_time = level.get_time_days()*60*24+level.get_time_hours()*60+level.get_time_minutes()
	sleep_z = 0
	sleep_g = 0
	sleep_k = 0
end

-- Функция скрытия индикатора. Вызывается из скрипта
-- Скрытия индикаторов при использовании бинокля и опт. прицела
function remove_static()
	if hud:GetCustomStatic("can_sleep_static") then
		hud:RemoveCustomStatic("can_sleep_static")
	end
end

 

 

Может кто нибудь что то подскажет. Хоть саму логику. Голова уже не варит. Четыре дня бьюсь. Либо работает криво либо неработает. Перепробовал кучу вариантов.

 

В идеале получить на примере красного индикатора:

1)Если индикатор красный и игрок проспал от 30 минут до трех часов сменить индикатор на желтый.

2)Если индикатор красный и игрок проспал от 3-х до 6-ти часов сменить индикатор на зеленый.

3) если индикатор красный и игрок проспал от 6-ти до 9-ти часов скрыть индикатор обновить время.

 

Както так мне кажется должно бработать. Узнать время сколько игрок проспал я знаю как. Докумекать только не могу как это сделать.

1 час назад, Stalkersof сказал:

Может кто нибудь что то подскажет.

Функция "remove_sleep_static()". Переменная "sleep_time" получает текущее время, поэтому всё скидывается.

Здесь к нему нужно прибавлять количество минут которые проспал ГГ.

  • Нравится 1

S.T.A.L.K.E.R. CoP Objects (upd 15.11.24)

@WinCap Не мне кажется просто прибавлять время сна не получится. Много условий, во первых игрок может ложится спать и через час вывода статика и через 6 часов допустим. А это время не будет учитываться. Ну наверно да там надо что то думать. Но время сна надо учитывать это да. Я попробую что нибудь намутить, потом отпишусь о результате.

1 час назад, Stalkersof сказал:

время сна надо учитывать это да

 

Функция "remove_sleep_static():

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


-- Функция запускается из крипта сна по окончании
function remove_sleep_static()
	if hud:GetCustomStatic("can_sleep_static") then
		hud:RemoveCustomStatic("can_sleep_static")
	end
	sleep_time = sleep_time + сколько_проспал
	ogsr_vars.set_value("sleep_time", sleep_time)
	sleep_z = 0
	sleep_g = 0
	sleep_k = 0
end

 


 

 

  • Нравится 1

S.T.A.L.K.E.R. CoP Objects (upd 15.11.24)

@WinCap Не не получается так. Единственный плюс статики перестали прокручиваться во время сна. Т.е если зеленый статик на худе то после сна он и остается зеленым. Сколько бы ГГ не проспал.

@Stalkersof , для того, чтобы вывести нужный индикатор, тебе надо знать, сколько проспал ГГ. И в переменной "sleep_time" лучше хранить не время начала отсчёта, а само прошедшее время. Для этого нужно, напрмер, на net_spawn загружать эту переменную, а на save - сохранять.

Скрытый текст
local hud = get_hud()
local sleep_sound = xr_sound.get_safe_sound_object([[actor\sleepy]])
local sleep_z,sleep_g,sleep_k = 0,0,0

-- Время в минутах, через которое показываем индикаторы
local time_z = 12 * 60 -- зеленый индикатор 
local time_g = 14 * 60 -- желтый индикатор. 
local time_k = 16 * 60 -- красный индикатор. 

--=========================================================================
-- удаление пробелов по краям строки
string.trim = function (s)
	return (string.gsub(s, "^%s*(.-)%s*$", "%1"))
end
-- разбивка строки по символу
string.explode = function ( str, div, clear )
	local ret = {}
	for s in string.gmatch( str, "([^"..div.."]+)" ) do
		ret[ #ret+1 ] = ( clear and string.trim( s ) or s )
	end
	return ret
end
-- Функции времени из АМК - чтобы не сбивалось время при смене месяца
local StartTime
function getStartTime()
	if StartTime == nil then
		local t = string.explode(system_ini():r_string("alife", "start_time"), ":", true)
		local d = string.explode(system_ini():r_string("alife", "start_date"), ".", true)
		StartTime = game.CTime()
		StartTime:set( tonumber(d[3]), tonumber(d[2]), tonumber(d[1]),	-- year.month.day
			tonumber(t[1]), tonumber(t[2]), tonumber(t[3]), 0 )			-- hours:minutes:seconds:milliseconds
	end
	return StartTime
end

function game_milliseconds()
	if StartTime == nil then
		getStartTime()
		if StartTime == nil then
			return 0
		end
	end
	local gtime = game.get_game_time()
	local seconds = gtime:diffSec(StartTime)
	local y,m,d,h,min,sec,ms = gtime:get()
	return (seconds * 1000 + ms)
end

function game_seconds()
	if StartTime == nil then
		getStartTime()
		if StartTime == nil then
			return 0
		end
	end
	return game.get_game_time():diffSec(StartTime)
end

function game_minutes()
	return math_floor(game_seconds() / 60)
end

function game_hours()
	return math_floor(game_seconds() / 3600)
end

function game_days()
	return math_floor(game_seconds() / 86400)
end
--=========================================================================

local sleep_time
local last_time = 0

-- вызывается из функции actor_binder:update(?)
function update()
	--log1 (sleep_time)
    -- текущее время в минутах
	local time_now = game_minutes()
	if last_time ~= 0 then
		sleep_time = sleep_time + time_now - last_time
	end

	if sleep_time > time_k then
	--log1("k")
		db.actor.power = - 0.005
		add_sleep_static("red")-- red
		if sleep_k == 0 then 
		    sleep_sound:play(db.actor, 0, sound_object.s2d) 
			sleep_k = 1 
			level.add_pp_effector("peace_fade.ppe", 1973, false) 
		end
	elseif sleep_time > time_g then
	--log1("g")
		db.actor.power = - 0.003
		add_sleep_static("yellow")-- yellow
		if sleep_g == 0 then 
		    sleep_sound:play(db.actor, 0, sound_object.s2d) 
			sleep_g = 1 
		end
	elseif sleep_time > time_z then
	--log1("z")
		db.actor.power = - 0.001
		add_sleep_static("green")-- green
		if sleep_z == 0 then 
		    sleep_sound:play(db.actor, 0, sound_object.s2d) 
			sleep_z = 1 
		end
	end

	last_time = time_now
end

-- вызывается из функции actor_binder:net_spawn
function net_spawn()
	getStartTime()
	sleep_time = (ogsr_vars.get_value_safe( "sleep_time" )) or 0
end
-- вызывается из функции actor_binder:save - вызов надо ставить в самое начало функции
function pre_save()
	ogsr_vars.set_value( "sleep_time", sleep_time)
end

-------------------------------------------------------------------------------------------------
local current_color
local colors = {
	green = GetARGB(255,76,255,0),
	yellow = GetARGB(255,255,216,0),
	red = GetARGB(255,255,0,0)
}
function add_sleep_static(clr)
	if current_color == clr then return end -- чтобы постоянно не обновлялось одно и то же
	local w = hud:AddCustomStatic("can_sleep_static", true):wnd()
	w:SetColor( colors[clr] )
	current_color = clr
end

-- Функция запускается из скрипта сна по окончании
-- Сюда надо передать время в минутах, которое проспали
function remove_sleep_static(sleep_minutes)
	if hud:GetCustomStatic("can_sleep_static") then
		hud:RemoveCustomStatic("can_sleep_static")
	end
	sleep_time = math.max(sleep_time - sleep_minutes, 0)
	sleep_z = 0
	sleep_g = 0
	sleep_k = 0
	current_color = nil
end

-- Функция скрытия индикатора. Вызывается из скрипта
-- Скрытия индикаторов при использовании бинокля и опт. прицела
function remove_static()
	if hud:GetCustomStatic("can_sleep_static") then
		hud:RemoveCustomStatic("can_sleep_static")
		current_color = nil
	end
end

 

Ничего не проверял, но вроде должно работать. Ещё бы интервал обновления задать, чтобы не апдейтилось постоянно.

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

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

naxac.gif

@naxac Не могу проверить у себя вылет в начале игры при синхронизации.

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

[error]Expression    : FATAL ERROR
[error]Function      : CScriptEngine::lua_pcall_failed
[error]File          : D:\a\OGSR-Engine\OGSR-Engine\ogsr_engine\COMMON_AI\script_engine.cpp
[error]Line          : 52
[error]Description   : [CScriptEngine::lua_pcall_failed]: d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\ui_hud_sleep.script:61: attempt to call global 'math_floor' (a nil value)

[07.07.25 04:59:01.279] ***************************[ScriptCrashHandler]**********************************
[07.07.25 04:59:01.279] stack traceback:
    [C]: in function 'math_floor'
    d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\ui_hud_sleep.script:61: in function 'game_minutes'
    d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\ui_hud_sleep.script:80: in function 'update'
    d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\bind_stalker.script:465: in function <d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\bind_stalker.script:341>
[07.07.25 04:59:01.279]     Locals: 
[07.07.25 04:59:01.279]      string (*temporary) : d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\ui_hud_sleep.script:61: attempt to call global 'math_floor' (a nil value)
[07.07.25 04:59:01.279]     End
[07.07.25 04:59:01.279]     Locals: 
[07.07.25 04:59:01.279]      nil (*temporary) : [not available]
[07.07.25 04:59:01.279]      number (*temporary) : 4.000000
[07.07.25 04:59:01.279]      number (*temporary) : 4.690834
[07.07.25 04:59:01.279]      number (*temporary) : 0.000000
[07.07.25 04:59:01.280]      string (*temporary) : attempt to call global 'math_floor' (a nil value)
[07.07.25 04:59:01.280]     End
[07.07.25 04:59:01.280]     Locals: 
[07.07.25 04:59:01.280]     End
[07.07.25 04:59:01.280]     Locals: 
[07.07.25 04:59:01.280]      Userdata: self
[07.07.25 04:59:01.280]              boolean self.bCheckStart : false
[07.07.25 04:59:01.280]              number self.next_restrictors_update_time : 39550.000000
[07.07.25 04:59:01.280]              Userdata: self.am
[07.07.25 04:59:01.280]                      table self.am.slots_in_process : [...]
[07.07.25 04:59:01.280]                      table self.am.signals : [...]
[07.07.25 04:59:01.280]                      string self.am.mgr_name : global
[07.07.25 04:59:01.280]              boolean self.weapon_hide : false
[07.07.25 04:59:01.280]              Table: self.st
[07.07.25 04:59:01.280]              Userdata: self.weather_manager
[07.07.25 04:59:01.280]                      table self.weather_manager.cycles : [...]
[07.07.25 04:59:01.280]                      number self.weather_manager.cycle_time : 0.000000
[07.07.25 04:59:01.280]                      table self.weather_manager.trans_times : [...]
[07.07.25 04:59:01.280]                      string self.weather_manager.dyn_weather : cloudy_dark
[07.07.25 04:59:01.280]                      string self.weather_manager.default_cycle_id : 4
[07.07.25 04:59:01.280]                      number self.weather_manager.next_time : 600.000000
[07.07.25 04:59:01.280]                      number self.weather_manager.last_time : 540.000000
[07.07.25 04:59:01.280]                      userdata self.weather_manager.ini : (ini_file): 0000022547BF7900
[07.07.25 04:59:01.280]                      table self.weather_manager.trans_lists : [...]
[07.07.25 04:59:01.280]                      number self.weather_manager.next_time_idx : 8.000000
[07.07.25 04:59:01.280]                      number self.weather_manager.last_time_idx : 7.000000
[07.07.25 04:59:01.280]                      string self.weather_manager.cur_weather : cloudy_dark
[07.07.25 04:59:01.280]                      number self.weather_manager.time : 544.000000
[07.07.25 04:59:01.280]                      string self.weather_manager.lvl_weather : default
[07.07.25 04:59:01.280]                      table self.weather_manager.cycle_idx : [...]
[07.07.25 04:59:01.280]              Userdata: self.actor_detector
[07.07.25 04:59:01.280]                      number self.actor_detector.init_time : -1.000000
[07.07.25 04:59:01.280]      number delta : 0.000000
[07.07.25 04:59:01.280]      number time : 39350.000000
[07.07.25 04:59:01.280]      number minute : 4.000000
[07.07.25 04:59:01.280]      number gtime : 1984.000000
[07.07.25 04:59:01.280]     End
[07.07.25 04:59:01.280] *********************************************************************************
[07.07.25 04:59:01.280] ********************************************************************************
[07.07.25 04:59:01.280] !![LogStackTrace] Thread: [X-RAY Primary thread]
[07.07.25 04:59:01.304] !!stack trace:
 

 

local math_floor = math.floor

Это такое соляночное кеширование :biggrin:.

local math_floor = math.floor
local string_sub = string.sub
local string_find = string.find
local string_byte = string.byte
local string_char = string.char
local string_len = string.len

---

@Stalkersof, зря, кстати, смеёшься. Это оно и есть. Глянь любопытства ради код Солянок или ОП-ов. Кто первым придумал ответить затрудняюсь, гораздо интересней суть действа.

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

@naxac Протестировал один раз, изменил время для появления статиков для зеленого один час, для желтого три часа, для красного пять часов(для теста чтоб побыстрее) Статики показывает интервал сохранен в два часа. В итоге получилось тоже самое что мы сделали с товарищем @WinCap . Если статик выведен на худ и гг спит, статик не меняется. Допустим был зеленый остается зеленым, был красным остается красным. Меня уже терзают смутные сомнения а возможно ли както статики интегрировать со сном который имеет промежутки времени , т.е интервальный.

 

Может я както не так время сна узнаю??? Сон от Рай Твити из инвентаря.

В начале сна узнаю сколько игрок выбрал времени для сна. Вот так.

sk_prospal = self.sleep_time * 60

self.sleep_time - это время в чах сколько выбрал игрок для сна в инвентаре

В конце сна вызываю функцию ui_hud_sleep.remove_sleep_static(sk_prospal)

 

Или может лучше скрипт сна скинуть?

 

@Stalkersof ты что хочешь сделать? Сонливость? Так зачем этот надмозг с таймерами городить. Сонливость - это почти тоже самое, что и другие состояния ГГ, сытость, радиация и т.д. Вот и пляши от этого.
Введи для начала параметр сонливости ГГ и меняй его на апдейте - просто прибавляй какой-то коэффициент, по аналогии с другими. Выведи параметры в конфиги в секцию ГГ, чтобы удобно было менять. Далее твоя задача сохранить это все между загрузками игры - тут вариантов масса + в каждой платформе свои ништяки. Ну и все, основное ты считай сделал. Далее привязывайся к параметру сонливости - достиг условно 0.5 - показываешь зеленый индикатор, 0.7 - желтый и т.д. Туда же доп. эффекты типа зевков, уменьшения выносливости и прочее. При этом также легко будет намутить бустеры - всякие кофие и энергетики, которые просто будут уменьшать значение сонливости, а остальное (индикаторы) изменится само под воздействием внешних факторов. Туда же монстры - усыпляющие кошаки и аномалии, простор для творчества большой.

  • Нравится 2
  • Согласен 3

Telegram-канал RayTwitty Space

[Судьба Зоны 0.8.1]

Проблема: опция "разрешить быструю зарядку магазина", которая делает авто-подстановку пустых магазинов в слот [7], ловит любые магазины, которые есть в инвентаре, и не реагирует на частично заполненные магазины. (Ну, и еще иногда зависает без действия.)

 

Хочу сделать так, чтобы только что извлеченный из оружия магазин (reload + item_take) ставился в слот и был готов для наполнения патронами без промежуточных действий в инвентаре, то есть должно получиться "перезарядка (+ подстановка магазина в слот) – переключение на слот магазина – действия с магазином".

Действие db.actor:move_to_slot(wmag_obj) приводит к тому, что магазин ставится в первый найденный карман разгрузки, а не в слот [7] (в скриптах #8). Сброс и поднятие магазина с пола через transfer_item просто возвращает магазин в инвентарь.

Есть ли еще какой-то способ перенести магазин именно в слот?

 

Если это важно, извлечение магазина через HUD делается двойным нажатием "перезарядки" – так старый магазин попадает в инвентарь, а не в разгрузку, даже если еще не пуст.

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

Шпаргалка

Вот блин проблема. Почему то в скрипте в функции enable_backlight(enabled) поиск текстур  texture_find("crosshair\\*") не работает, возвращает пустую таблицу, хотя текстуры прицелов закинул. Пробовал и жестко забивать текстуры, и менять путь к существующим папкам с текстурами. Возвращает пустую таблицу, из-за этого скрипт не работает. Хотя скрипт при замене текстур на руках при надевании костюмов работает. Версия движка 2.1.181

 

Скрытый текст
local sm = ogse_signals.get_mgr()
function attach( sm )
    sm:subscribe({ signal = "on_key_down", fun = this.on_key_down })
    sm:subscribe({ signal = "on_first_update", fun = this.on_first_update })
end

local var = script_name().."scopes_backlight_enabled"

if not _G.XVARS then
    _G.XVARS = get_stored_vars()
end


local function actor_keeps_wpn_with_optical_sight() --Держит ли актор в руках оружие с оптическим прицеломприцелом
    local wpn = db.actor:active_item()

    return wpn and wpn:is_weapon_magazined() and ( bit_and(wpn:get_addon_flags(), 1) ~= 0 or system_ini():r_u32(wpn:section(), "scope_status") == 1 )
end

local function enable_backlight(enabled)

    local textures_found = texture_find("crosshair\\*")
    --local textures_found = {"crosshair\\crosshair_pso1sn"}
    log3("~~textures_found is %s", textures_found)

    for name, tex in pairs(textures_found) do
        local backlight_name = tex:gsub('crosshair\\', 'crosshair_light\\')
        log3("--backlight_name is [%s]", backlight_name)
        if getFS():exist("$game_textures$", backlight_name..".dds") then
            tex:load(enabled and backlight_name or tex)
        end
    end    
end


function on_first_update()
    --log3("~~XVARS.var: [%s]", not not XVARS.var)
    level.add_call(function() return actor_keeps_wpn_with_optical_sight() end, function() enable_backlight(not not XVARS.var) end)
end

function on_key_down(key, bind)
    if bind ~= key_bindings.kSWITCH_SCOPE_BACKLIGHT then return end
    if not db.actor:zoom_mode() then return end
    if level.main_input_receiver() then return end
    if not actor_keeps_wpn_with_optical_sight() then return end

    local enabled = not XVARS.var
    XVARS.var = enabled
    enable_backlight(enabled)
    local snd = xr_sound.get_safe_sound_object([[weapons\nv_intensity]])
    snd:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 0.3)    
        local anm_name = "camera_effects\\usp_shoot_empty.anm"
        --game.play_hud_anm(anm_name, 2, 0.9, 1, false)
        level.add_cam_effector("camera_effects\\usp_shoot_empty.anm", 1900, false, "")
end

 

Вообще можно менять обычные сетки прицелов?

 

Пс. Методом тыка выяснил что таблица заполняется если текстура натянута на модель. В случае с обычными сетками прицелов это не работает. По моему так. Печаль и боль. Я уже и кнопку забиндил и в настройки занес. И скрипт работает, только нельзя менять текстуры без модели.

Пара странных вопросов (движок OGSR): 

1. Как скриптово узнать g-l_vertex для неких разных a-life объектов НЕ снимая предварительно координаты? Это вообще возможно?

2. А если у объекта есть story_id и он перемещается?

@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

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

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

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

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

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

Войти

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

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

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