Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий
WinCap 323 Опубликовано 26 Июня Поделиться Опубликовано 26 Июня @Капрал Хикс @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) Ссылка на комментарий
RayTwitty 558 Опубликовано 26 Июня Поделиться Опубликовано 26 Июня @WinCap скорее всего некорректное название. GetSelectedIndex правильнее было бы. А вот GetItem уже возвращает юзердату. Можно там конечно дописать что-то типа if not list:GetItem(index) then return end, но это будет затычка. Мне кажется там проблема в чем-то другом. Скрипт кстати правленный, -1 заменено на 4294967295 как минимум, скорее всего оно было написано для другого движка. Как я уже писал выше, надо дебажить. 1 1 Ссылка на комментарий
Купер 3284 Опубликовано 27 Июня Поделиться Опубликовано 27 Июня Вот, кстати, оригинал всех этих ковырялок. И да, похоже, что-то где-то лишнее накручено. По крайней мере, оригинал ТЧ 1.0006 в данном случае вылета не предусматривает. 1 2 Ссылка на комментарий
Это популярное сообщение. RayTwitty 558 Опубликовано 27 Июня Это популярное сообщение. Поделиться Опубликовано 27 Июня При наличии SetSelectedItem (в оригинале ТЧ нет, но есть в ХЕ и вроде бы в ЗП), можно и навигацию стрелками по элементам списка сделать. Я у себя в исходниках еще давно убрал это все под капот (со всеми проверками на вшивость), сделав два метода - выбрать следующий и предыдущий элемент списка. Помимо выбора возвращает успешность попытки (если например дошли до конца, то делать ничего не надо). -- навигация по списку с клавиатуры if keyboard_action == ui_events.WINDOW_KEY_PRESSED then local list = self:GetListWnd("list_window") if dik == DIK_keys.DIK_UP then if list:SelectLastItem() then self:OnListItemClicked() end elseif dik == DIK_keys.DIK_DOWN then if list:SelectNextItem() then self:OnListItemClicked() end elseif dik == DIK_keys.DIK_DELETE then self:OnButton_del_clicked() elseif dik == DIK_keys.DIK_RETURN then self:OnButton_load_clicked() end end Теперь подумываю изменить (добавить перегрузку, чтобы сохранить обратную совместимость) метод GetItem, чтобы без аргументов он сразу возвращал выбранный элемент списка (если есть). Тогда не придется городить эти все if index ~= -1 then return end и прочие: сразу local item = list:GetItem() if item then ... end P.S. Для ванильного (и ХЕ) движка давно юзаю обертку: function _G.validate_list(list) if list:GetSize() ~= 0 then local index = list:GetSelectedItem() return index ~= -1 and list:GetItem(index) end end Юзается так: self:AddCallback("list", ui_events.LIST_ITEM_CLICKED, self.on_list_item_clicked, self) function CUIMyWnd:on_list_item_clicked() if validate_list(self.list) then -- тут 100% есть выбранный item local item = self.list:GetItem(self.list:GetSelectedItem()) end end 2 4 Ссылка на комментарий
Stalkersof 198 Опубликовано 1 Июля Поделиться Опубликовано 1 Июля Ребята а подскажите как сделать простой счетчик времени. Т.е мне нужно через 12,14 и 16 часов игрового времени выполнять действие. Пробовал через time_global() но у меня есть сон с прокруткой. time_global() я так понял это время не игровое. Короче делаю индикатор сна на худе. ОГСР движок Freeplay Graphic Mod(FGM) Ссылка на комментарий
mole venomous 3655 Опубликовано 1 Июля Поделиться Опубликовано 1 Июля @Stalkersof , возьми ogse-таймеры. Там несложно адаптировать. Пользоваться тоже несложно. 2 Здесь могла быть ваша реклама. Ссылка на комментарий
Stalkersof 198 Опубликовано 5 Июля Поделиться Опубликовано 5 Июля Ребята нужна помощь. Сделал я индикатор сна но есть одна проблема. Не могу сообразить как сделать плавный переход индикатора. т.е сейчас все работает. Но дело в том что сон у меня интервальный от 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-ти часов скрыть индикатор обновить время. Както так мне кажется должно бработать. Узнать время сколько игрок проспал я знаю как. Докумекать только не могу как это сделать. Freeplay Graphic Mod(FGM) Ссылка на комментарий
WinCap 323 Опубликовано 5 Июля Поделиться Опубликовано 5 Июля 1 час назад, Stalkersof сказал: Может кто нибудь что то подскажет. Функция "remove_sleep_static()". Переменная "sleep_time" получает текущее время, поэтому всё скидывается. Здесь к нему нужно прибавлять количество минут которые проспал ГГ. 1 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
Stalkersof 198 Опубликовано 5 Июля Поделиться Опубликовано 5 Июля @WinCap Не мне кажется просто прибавлять время сна не получится. Много условий, во первых игрок может ложится спать и через час вывода статика и через 6 часов допустим. А это время не будет учитываться. Ну наверно да там надо что то думать. Но время сна надо учитывать это да. Я попробую что нибудь намутить, потом отпишусь о результате. Freeplay Graphic Mod(FGM) Ссылка на комментарий
WinCap 323 Опубликовано 5 Июля Поделиться Опубликовано 5 Июля 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) Ссылка на комментарий
Stalkersof 198 Опубликовано 5 Июля Поделиться Опубликовано 5 Июля @WinCap Не не получается так. Единственный плюс статики перестали прокручиваться во время сна. Т.е если зеленый статик на худе то после сна он и остается зеленым. Сколько бы ГГ не проспал. Freeplay Graphic Mod(FGM) Ссылка на комментарий
naxac 2570 Опубликовано 7 Июля Поделиться Опубликовано 7 Июля (изменено) @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 Ничего не проверял, но вроде должно работать. Ещё бы интервал обновления задать, чтобы не апдейтилось постоянно. Изменено 7 Июля пользователем naxac 1 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Ссылка на комментарий
Stalkersof 198 Опубликовано 7 Июля Поделиться Опубликовано 7 Июля @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: Freeplay Graphic Mod(FGM) Ссылка на комментарий
Купер 3284 Опубликовано 7 Июля Поделиться Опубликовано 7 Июля local math_floor = math.floor Это такое соляночное кеширование . 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 Ссылка на комментарий
Stalkersof 198 Опубликовано 7 Июля Поделиться Опубликовано 7 Июля @naxac Протестировал один раз, изменил время для появления статиков для зеленого один час, для желтого три часа, для красного пять часов(для теста чтоб побыстрее) Статики показывает интервал сохранен в два часа. В итоге получилось тоже самое что мы сделали с товарищем @WinCap . Если статик выведен на худ и гг спит, статик не меняется. Допустим был зеленый остается зеленым, был красным остается красным. Меня уже терзают смутные сомнения а возможно ли както статики интегрировать со сном который имеет промежутки времени , т.е интервальный. Может я както не так время сна узнаю??? Сон от Рай Твити из инвентаря. В начале сна узнаю сколько игрок выбрал времени для сна. Вот так. sk_prospal = self.sleep_time * 60 self.sleep_time - это время в чах сколько выбрал игрок для сна в инвентаре В конце сна вызываю функцию ui_hud_sleep.remove_sleep_static(sk_prospal) Или может лучше скрипт сна скинуть? Freeplay Graphic Mod(FGM) Ссылка на комментарий
RayTwitty 558 Опубликовано 7 Июля Поделиться Опубликовано 7 Июля @Stalkersof ты что хочешь сделать? Сонливость? Так зачем этот надмозг с таймерами городить. Сонливость - это почти тоже самое, что и другие состояния ГГ, сытость, радиация и т.д. Вот и пляши от этого. Введи для начала параметр сонливости ГГ и меняй его на апдейте - просто прибавляй какой-то коэффициент, по аналогии с другими. Выведи параметры в конфиги в секцию ГГ, чтобы удобно было менять. Далее твоя задача сохранить это все между загрузками игры - тут вариантов масса + в каждой платформе свои ништяки. Ну и все, основное ты считай сделал. Далее привязывайся к параметру сонливости - достиг условно 0.5 - показываешь зеленый индикатор, 0.7 - желтый и т.д. Туда же доп. эффекты типа зевков, уменьшения выносливости и прочее. При этом также легко будет намутить бустеры - всякие кофие и энергетики, которые просто будут уменьшать значение сонливости, а остальное (индикаторы) изменится само под воздействием внешних факторов. Туда же монстры - усыпляющие кошаки и аномалии, простор для творчества большой. 2 3 Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 10 Июля Поделиться Опубликовано 10 Июля [Судьба Зоны 0.8.1] Проблема: опция "разрешить быструю зарядку магазина", которая делает авто-подстановку пустых магазинов в слот [7], ловит любые магазины, которые есть в инвентаре, и не реагирует на частично заполненные магазины. (Ну, и еще иногда зависает без действия.) Хочу сделать так, чтобы только что извлеченный из оружия магазин (reload + item_take) ставился в слот и был готов для наполнения патронами без промежуточных действий в инвентаре, то есть должно получиться "перезарядка (+ подстановка магазина в слот) – переключение на слот магазина – действия с магазином". Действие db.actor:move_to_slot(wmag_obj) приводит к тому, что магазин ставится в первый найденный карман разгрузки, а не в слот [7] (в скриптах #8). Сброс и поднятие магазина с пола через transfer_item просто возвращает магазин в инвентарь. Есть ли еще какой-то способ перенести магазин именно в слот? Если это важно, извлечение магазина через HUD делается двойным нажатием "перезарядки" – так старый магазин попадает в инвентарь, а не в разгрузку, даже если еще не пуст. Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Stalkersof 198 Опубликовано 11 Августа Поделиться Опубликовано 11 Августа Вот блин проблема. Почему то в скрипте в функции 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 Вообще можно менять обычные сетки прицелов? Пс. Методом тыка выяснил что таблица заполняется если текстура натянута на модель. В случае с обычными сетками прицелов это не работает. По моему так. Печаль и боль. Я уже и кнопку забиндил и в настройки занес. И скрипт работает, только нельзя менять текстуры без модели. Freeplay Graphic Mod(FGM) Ссылка на комментарий
mmindwork 47 Опубликовано 13 Августа Поделиться Опубликовано 13 Августа Пара странных вопросов (движок OGSR): 1. Как скриптово узнать g-l_vertex для неких разных a-life объектов НЕ снимая предварительно координаты? Это вообще возможно? 2. А если у объекта есть story_id и он перемещается? Ссылка на комментарий
naxac 2570 Опубликовано 13 Августа Поделиться Опубликовано 13 Августа @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 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти