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

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

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

@Капрал Хикс @RayTwitty, а точно нужно использовать функцию "GetSelectedItem"?

local index = list:GetSelectedItem()
if index == 4294967295 then return end

Она же возвращает Item.

  • Полезно 1

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

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

@WinCap скорее всего некорректное название. GetSelectedIndex правильнее было бы. А вот GetItem уже возвращает юзердату.

 

Можно там конечно дописать что-то типа if not list:GetItem(index) then return end, но это будет затычка. Мне кажется там проблема в чем-то другом. Скрипт кстати правленный, -1 заменено на 4294967295 как минимум, скорее всего оно было написано для другого движка. Как я уже писал выше, надо дебажить.

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

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

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

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

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

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

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

ОГСР движок

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

Ребята нужна помощь. Сделал я индикатор сна но есть одна проблема. Не могу сообразить как сделать плавный переход индикатора. т.е сейчас все работает. Но дело в том что сон у меня интервальный от 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
Ссылка на комментарий

[Судьба Зоны 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
  • Нравится 2

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

naxac.gif

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

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

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

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

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

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

Войти

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

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

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