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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/
_Sk8_AsTeR_ 122 Опубликовано 10 Июня 2021 Поделиться Опубликовано 10 Июня 2021 @WinCap проблема оказалась весьма специфична. Когда мы грузим сейв, то xr_gulag сразу берёт на себя всех НПС, что были в работе гулага в момент сохранения. И сразу же выдаёт им работу при условии, что они не находятся дальше контрольной точки гулага больше чем на 50 игровых метров. В такмо случае все НПС в момент загрузки сейва моментально получают работу и начинают её выполнение, без возможности сдвинуться с места (за исключением патрульных, у которых зацикленный набор вейпоинтов). Пробовал отключать перехват xr_gulag'а, в таком случае нпс доходят до точных координат, но работу не начинают. Казалось бы - вот он, выход из ситуации, задать небольшой таймер, чтобы гулаг сразу не перехватывал неписей, а давал им возможность дойти до точной координаты, чтобы после красиво сесть на стульчик, например. Но в таком случае все те НПС, которые сидели у костра, вдруг начинают одновременно ломиться в одну единственную точку, толпой. Видимо именно поэтому в ЧН были введены смарткаверы, которые, судя по всему, имели приоритет над работами гулагов типа, не знаю. Эх Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1385877
AndreySol 215 Опубликовано 10 Июня 2021 Поделиться Опубликовано 10 Июня 2021 @_Sk8_AsTeR_ Откуда вообще уверенность, что перезапуск работы даст нужный результат? Ты ведь понятия не имеешь, как в движке работает алгоритм размещения моба на точке пути - что в приоритете: координата точки или аи-ноды, близкие этой координате. Точку пути ты в СДК ставил? Может она попала на границу двух аи-нод и движок периодически выбирает разные ноды для размещения объекта. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1385882
_Sk8_AsTeR_ 122 Опубликовано 10 Июня 2021 Поделиться Опубликовано 10 Июня 2021 @AndreySol ну я проверял опытным путём. Там оказалось всё хитрее даже, чем я предполагал. Те НПС, которые приходят из вне гулага, они регистрируются и спокойно проходят к тем вейпоинтам, которые заданы в path_walk, анимация отыгрывается верно. А вот если нпс уже занимался новой работой, мы сохранились и загрузились, то бывает такое что нпс по какой-то причине в момент загрузки сейва вдруг сместился на пару игровых метров в сторону. Но игра считает, то он стоит правильно и xr_gulag сразу же заставляет его работать ту работу, которой он занимался до сейвлоада. Я просто ковырял хр_гулаг и отключал обработку нпс во время загрузки сейва. В этом случае тот нпс, который при загрузке сместился, действительно отправился строго в ту точку, которую я прописал в path_walk, я отслеживал этот момент прям с точностью до ноль-десятых координат с помощью g_vertex_debug (OGSR). Когда нпс приходит на точку он замирает, ожидая когда его обработает заранее мною отключенный xr_gulag. Ну, так и продолжает стоять. Выходит что именно xr_gulag и заставляет всех нпс во время загрузки сейва моментально и без вариантов сразу приниматься за работу, не давая неписям даже шаг в сторону сделать (за исключением тех нпс. у кого в path_walk цепь вейпоинтов). Ну, по крайней мере я именно такое заключение для себя сделал, ковыряя всю эту систему. Если я где-то неправ, то поправь меня пожалуйста, буду очень признателен! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1385883
AndreySol 215 Опубликовано 10 Июня 2021 Поделиться Опубликовано 10 Июня 2021 @_Sk8_AsTeR_ 4 часа назад, _Sk8_AsTeR_ сказал(а): в момент загрузки сейва вдруг сместился на пару игровых метров в сторону Ну так ты должен понимать, что спавн объектов делает движок, а не xr_gulag. Соответственно бесполезно дрючить xr_gulag, пытаясь в нем разрулить движковую проблему. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1385905
_Sk8_AsTeR_ 122 Опубликовано 11 Июня 2021 Поделиться Опубликовано 11 Июня 2021 @AndreySol Не спорю, что спавн объекта идет через движок, всё правильно. Но по поводу xr_gulag: из net_spawn при загрузке сейва идет вызов ф-ций в xr_gulag, после чего в этом же самом xr_gulag идет работа с нетпакетами, где проверяется работал ли НПС во время сейва. И если работал, то xr_gulag моментально заставляет этого НПС возобновить работату, не давая возможности сначала вернутсья на вейпоинт, если он немного сместился при сейв\лоаде. Вот что я наблюдал) То есть проблема именно в том, что xr_gulag просто не дает возможности НПС подойти вернуться к вейпоинту, моментально выдавая ему работу (нпс начинает играть анимацию). Есть нпс, которые находятся вне логики гулага, а стоят на своих личных path_walk'ax и path_look'ах, прописанных в саму логику непися. Они всегда со 100% вероятностью будут правильно отыгрывать анимацию в строго заданных координатах, всегда. Если при загрузке сейва они сместятся, то они сначала вернутся на вейпоинт. Потому что их не обрабатывает xr_gulag Опять таки, это всё лично мое наблюдение и мои выводы, которые я построил в результате экспериментов и изучения когда скрипта xr_gulag. Скрытый текст -- сохранения общего состояния гулага function gulag:save_common( packet ) packet:w_u8( self.casualities ) packet:w_u8( self.state ) utils.w_CTime( packet, self.stateBegin or smart_terrain.CTime_0 ) packet:w_u8(self.population) packet:w_u8(self.population_comed) packet:w_u8(self.population_non_exclusive) packet:w_u8( #self.Job ) for i, job in ipairs( self.Job ) do packet:w_u32( job.begin or 0 ) packet:w_u32( job.fill_idle or 0 ) packet:w_u32( job.idle_after_death_end or 0 ) end end -- восстановление общего состояния гулага function gulag:load_common( packet ) self.casualities = packet:r_u8() self.state = packet:r_u8() self.stateBegin = utils.r_CTime( packet ) self.population = packet:r_u8() self.population_comed = packet:r_u8() self.population_non_exclusive = packet:r_u8() local n = packet:r_u8() local job for i = 1, n do job = {} table_insert( self.JobLoaded, job ) job.begin = packet:r_u32() job.fill_idle = packet:r_u32() job.idle_after_death_end = packet:r_u32() if job.fill_idle == 0 then job.fill_idle = nil end if job.idle_after_death_end == 0 then job.idle_after_death_end = nil end end end -- сохранение информации об объекте function gulag:save_obj( packet, obj_id ) packet:w_bool ( self.Object_begin_job[obj_id] ) packet:w_bool ( self.Object_didnt_begin_job[obj_id] ) packet:w_u8 ( self.ObjectJob[obj_id] or 0 ) end -- восстановление информации об объекте function gulag:load_obj( packet, obj_id ) self.Object[obj_id] = true self.Object_begin_job[obj_id] = packet:r_bool() --self.Object_didnt_begin_job[obj_id] = packet:r_bool() local jobN = packet:r_u8() if jobN ~= 0 then self.ObjectJob[obj_id] = jobN end end Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1385970
WinCap 323 Опубликовано 11 Июня 2021 Поделиться Опубликовано 11 Июня 2021 (изменено) @_Sk8_AsTeR_, а функции save_obj/load_obj из xr_gulag используются где-нибудь? В них какой-то "непорядок" - сохраняются 3 переменные, а загружаются только 2. Изменено 11 Июня 2021 пользователем WinCap Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1385987
naxac 2 571 Опубликовано 11 Июня 2021 Поделиться Опубликовано 11 Июня 2021 (изменено) @_Sk8_AsTeR_ , не там копаешь. Сохранение и загрузка гулага тут ни при чём. Неписи в баре сделаны с индивидуальной логикой, и они так же глючат порой. Тут либо вейпоинт-каллбэк рано срабатывает в move_mgr при загрузке, не давая неписю дойти до нужной точки, либо непись смещается уже после спавна на загрузке и срабатывания этого каллбэка. Или ещё что-то. В общем, в move_mgr смотреть надо. Изменено 11 Июня 2021 пользователем naxac 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1386022
_Sk8_AsTeR_ 122 Опубликовано 11 Июня 2021 Поделиться Опубликовано 11 Июня 2021 @naxac чёт я думал что в баре работы гулага. Хотя там же квестовики... Окей, мерси за подсказку, буду мув менеджер ковырять) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1386053
Colder 12 Опубликовано 12 Июня 2021 Поделиться Опубликовано 12 Июня 2021 (изменено) Хотел добавить 2 кнопки при обыске трупов и ящиков! 1 кнопка выход(работает) в оригинале ее нету, 2 кнопка переместить всё из инвентаря ГГ в ящик\труп(не работает), нажимаю "переместить всё" результат 0 и вылетов нету. Может кто глянуть\посмотреть вот сам скрипт https://yadi.sk/d/dQ-plbh3CFkHSA Изменено 12 Июня 2021 пользователем Colder Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1386094
WinCap 323 Опубликовано 12 Июня 2021 Поделиться Опубликовано 12 Июня 2021 @Colder, в вашем скрипте: 1. Функция BodyAllclose - что это за переменная id? 2. Функция get_items_from_box - переменная box откуда? 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1386095
Colder 12 Опубликовано 12 Июня 2021 Поделиться Опубликовано 12 Июня 2021 (изменено) Не получаеться( или мозгов не хватает! Делаю так: Скрытый текст function transfer_all_to_box() local level_obj_by_id = level.object_by_id local box = level_obj_by_id(id) db.actor:iterate_inventory(function(actor, item) db.actor:transfer_item(item, box) end, db.actor) end Звук есть что перекладывает, но не чего не происходит. Изменено 12 Июня 2021 пользователем Colder Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1386096
Space.Marine 466 Опубликовано 12 Июня 2021 Поделиться Опубликовано 12 Июня 2021 (изменено) 7 часов назад, Colder сказал(а): Хотел добавить 2 кнопки Так в ЗП "взять всё" на кнопке Х забиндена, а в ТЧ легко в xml указывается кнопка на которой можно взять всё. Не проще ли посмотреть уже имеющееся в оригинале решение? Или это движковая фишка? Изменено 12 Июня 2021 пользователем Space.Marine Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1386110
Norman Eisenherz 354 Опубликовано 13 Июня 2021 Поделиться Опубликовано 13 Июня 2021 Здрасьте. Задача: отсечь часть строки и преобразовать в число. При записи tonumber(str:gsub(…)) или tonumber(string.gsub(str, …)) вылет "bad argument #2 to 'tonumber' (base out of range)", при раздельной обработке ожидаемый результат – число. В чем причина? Spoiler local str = "abc_123" local id = tonumber( str:gsub("abc_", "") ) -- вылет local id = tonumber( string.gsub(str, "abc_", "") ) -- вылет local id = str:gsub("abc_", "") id = tonumber(id) -- ок Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1386355
_Sk8_AsTeR_ 122 Опубликовано 13 Июня 2021 Поделиться Опубликовано 13 Июня 2021 Господа, а как бы с помощью level.add_call(ф1,ф2) передать вместе с ф1 и ф2 параметры функций? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1386363
Norman Eisenherz 354 Опубликовано 14 Июня 2021 Поделиться Опубликовано 14 Июня 2021 @_Sk8_AsTeR_ вложенной безымянной функцией: function() fx(p1, p2) end 1 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1386366
phalcor 60 Опубликовано 14 Июня 2021 Поделиться Опубликовано 14 Июня 2021 Приветствую! Есть простой вопрос - как в скрипте получить сытость актора (ОП 2.1)? - вариант 1: log(db.actor:get_satiety()) -- вызывает краш - нет такого метода! - вариант 2: log(db.actor.satiety) -- тут всегда nil - вариант 3: ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1386432
naxac 2 571 Опубликовано 14 Июня 2021 Поделиться Опубликовано 14 Июня 2021 @Norman Eisenherz , вторым аргументом в tonumber передаётся основание системы счисления (двоичная - 2, шестнадцатиричная -16 и т.д). string.gsub же вторым аргументом возвращает количество замен. Тут нужно отсечь второй аргумент, например так: tonumber( (string.gsub(str, …)) ) 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1386509
Norman Eisenherz 354 Опубликовано 14 Июня 2021 Поделиться Опубликовано 14 Июня 2021 @phalcor Сытость – свойство, так что 2-й вариант правильный, но он не привязан в скриптах: в ТЧ/ЧН всегда дает nil, в ЗП всегда дает 1. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1386557
Colder 12 Опубликовано 14 Июня 2021 Поделиться Опубликовано 14 Июня 2021 (изменено) Есть у кого нибуть пример как вывести в гуи окне, полоску состояния оружия? Есть вот такая фунция но незнаю как её использовать: Скрытый текст function repair_dialog:DrawConditionRemBar(de_item, x, y) if x == nil then x = 0 end if y == nil then y = 0 end local cond_rem_bar_width = 0 if de_item then cond_rem_bar_width = (math.floor(de_item:condition()*100)*1.1) x = x - 55 --(cond_rem_bar_width/2) local c = self.cond_rem_bar if not c then self.cond_rem_bar = CUIStatic() c = self.cond_rem_bar c:SetWindowName("cond_rem_bar") c:SetAutoDelete(true) c:InitTexture("ui\\cop\\ui_cop_hint_wnd") c:SetOriginalRect(678,153,110,7) c:SetStretchTexture(true) self:AttachChild(c) end if cond_rem_bar_width > 109 then cond_rem_bar_width = 109 elseif cond_rem_bar_width <= 0 then cond_rem_bar_width = 1 end c:SetOriginalRect(677+cond_rem_bar_width,153,1,7) c:Init(x,y,cond_rem_bar_width,7) else c:Init(0,0,0,0) end end Изменено 14 Июня 2021 пользователем Colder Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1386562
dsh 3 824 Опубликовано 14 Июня 2021 Поделиться Опубликовано 14 Июня 2021 @Colder мне кажется, лучше использовать уже готовое. 1. описать progress bar в xml. Например <bar_frame1 x="47" y="164" width="100" height="8" horz="1" min="0" max="100" pos="1"> <background> <texture r="196" g="18" b="18">ui_mg_progress_efficiency_full</texture> </background> <progress> <texture>ui_mg_progress_efficiency_full</texture> </progress> <min_color r="41" g="203" b="60"/> <middle_color r="41" g="203" b="60"/> <max_color r="41" g="203" b="60"/> </bar_frame1> 2. инициализировать его. Например self.item1_progress = xml:InitProgressBar( "bar_frame1", self.item1 ) 3. установить длину. Например self.item1_progress:SetProgressPos( self.item:condition() * 100 ) 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/562/#findComment-1386564
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти