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 Ссылка на комментарий
Labus 0 Опубликовано 17 Октября 2014 Поделиться Опубликовано 17 Октября 2014 (изменено) Здравствуйте. Простите, если помешал. Кто-нибудь может рассказать, как заставить неписей игнорировать очевидный для них денжер? PS: ТЧ 1.0004Поправить ошибку со storage в xr_danger.script, и прописать соответствующий игнор в логике ? dc Изменено 17 Октября 2014 пользователем Dennis_Chikin Ссылка на комментарий
Zander_driver 10 345 Опубликовано 20 Октября 2014 Поделиться Опубликовано 20 Октября 2014 код (Показать) local vacant_pos = {1,2,... короче куча цифр} local ind = math.random(#vacant_pos) table.remove(vacant_pos,ind)local vacant_pos = {1,2,... короче куча цифр} local ind = math.random(#vacant_pos) table.remove(vacant_pos,ind) Вот такая катавасия творится у меня в цикле, из таблицы удаляются рандомно взятые элементы, до некоторого предела. Все бы хорошо, но исходная таблица vacant_pos бывает разной. И периодически это приводит к вылетам bad argument #1 to 'random' (interval is empty)При том что заведомо неизвестно какие там вообще элементы в таблице еще остались, как мне проверить что рандом для нее вызывать еще можно, и "интервал" пустым не будет? Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Desertir 202 Опубликовано 20 Октября 2014 Поделиться Опубликовано 20 Октября 2014 (изменено) @Zander_driver, это прикол?) Проверяй #vacant_pos на 0, если равно, брекай свой цикл - таблица пуста. Смысл в том, что в рандом нельзя передать 0. Может быть можно ранее до цикла проверить длину и сравнить с тем, сколько элементов надо удалить, будет мини-оптимизация. Изменено 20 Октября 2014 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Карлан 1 050 Опубликовано 20 Октября 2014 Поделиться Опубликовано 20 Октября 2014 while #tbl > 0 do table.remove(tbl, math.random(#tbl)) end Ссылка на комментарий
Zander_driver 10 345 Опубликовано 25 Октября 2014 Поделиться Опубликовано 25 Октября 2014 (изменено) @nego, Ну для этого требуется сделать две относительно несложные вещи. 1. Реализовать механизм, позволяющий скриптом влиять на переносимый вес. Напрямую это делать нельзя. Один из обходных вариантов - На каждый комбез сделать серию подвидов, внешне неотличимых, но с разным переносимым весом. И скриптом менять в зависимости от желаемого результата, не забывая озаботиться сохранением состояния комбеза при его замене. 2. На апдейте скриптом выяснять, какие артефакты находятся на поясе ГГ, читать их конфиги, и если в них найдется строчка отвечающая за переносимый вес, читать ее значение и с этим значением запускать механизм из пункта 1. Это все как вариант. Безусловно могут быть и другие пути реализации. Задачей "для начинающего" я бы это не назвал. Вопрос к знатокам - что происходит с юзердатой клиентского объекта, при ее длительном хранении в переменной в скрипте? Судя по моим данным, неизменной она не остается, хотя и нельзя однозначно сказать, что с ней происходит. История: тык (Показать) Получаем юзердату методом level.object_by_id(number) Проверяем что она не равна nil, сохраняем в переменную. Там она лежит энное время, в моем случае - несколько секундЗатем некий другой скрипт берет эту юзердату, применяет на ней метод obj:section() и пытается читать из полученной секции конфига. пока я не сообразил проверять, чему равна эта секция и существует ли она вообще, в качестве результатов был целый букет явлений. Иногда все работало исправно - читались данные оттуда откуда надо, все норм. Иногда были безфатальные вылеты - как я теперь понимаю, из-за того что секция оказывалась nil. и иногда, происходили вылеты с забавным логом вроде такого Expression : fatal error Function : CInifile::r_section File : E:\stalker\patch_1_0004\xrCore\Xr_ini.cpp Line : 342 Description : <no expression> Arguments : Can't open section 'ю«в`яя'Expression : fatal error Function : CInifile::r_section File : E:\stalker\patch_1_0004\xrCore\Xr_ini.cpp Line : 342 Description : <no expression> Arguments : Can't open section 'ю«в`яя' Изменено 25 Октября 2014 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Dennis_Chikin 3 663 Опубликовано 25 Октября 2014 Поделиться Опубликовано 25 Октября 2014 (изменено) По п1 - не надо ни какого апдейта. Кстати, кто там просил примеров с info и окном диалога - тоже см. сюда. bind_stalker.script (Показать) local t_info, t_info_any, t_info_n = {}, {}, 0 function add_on_info( f, nfo ) -- ( функция, инфо ), либо f для любых инфо if nfo then local t = t_info[nfo] if t then table_insert( t, f ) else t_info[nfo] = { f } end else t_info_n = t_info_n + 1; t_info_any[t_info_n] = f end end function actor_binder:info_callback( npc, nfo ) for i = 1, t_info_n do t_info_any[i]( nfo, npc ) end local t = t_info[nfo] if t then for i = 1, #t do t[i]( nfo, npc ) end end ltasks_proceed() -- Сюжет ltasks_process_info( nfo ) -- Отметки на карте endlocal t_info, t_info_any, t_info_n = {}, {}, 0 function add_on_info( f, nfo ) -- ( функция, инфо ), либо f для любых инфо if nfo then local t = t_info[nfo] if t then table_insert( t, f ) else t_info[nfo] = { f } end else t_info_n = t_info_n + 1; t_info_any[t_info_n] = f end end function actor_binder:info_callback( npc, nfo ) for i = 1, t_info_n do t_info_any[i]( nfo, npc ) end local t = t_info[nfo] if t then for i = 1, #t do t[i]( nfo, npc ) end end ltasks_proceed() -- Сюжет ltasks_process_info( nfo ) -- Отметки на карте end ваш скрипт (Показать) function init()... local add_on_info = bind_stalker.add_on_info add_on_info( inv_open, "ui_inventory" ) add_on_info( inv_open, "ui_trade" ) add_on_info( inv_open, "ui_car_body" ) add_on_info( inv_closed, "ui_inventory_hide" ) add_on_info( inv_closed, "ui_trade_hide" ) add_on_info( inv_closed, "ui_car_body_hide" ) ... return true end function inv_open() actor_data.inv_open = true end local on_closed_t = {} local on_closed_n = #on_closed_t function add_inv_closed( f ) on_closed_n = on_closed_n + 1 on_closed_t[on_closed_n] = f end function inv_closed() actor_data.inv_open = false chk_belt_add() for i = 1, on_closed_n do -- коллбэки всех, кому интересны изменения if on_closed_t[i] then on_closed_t[i]() end end end -- actor_data и chk_belt_add - ваши данные и проверки.function init()... local add_on_info = bind_stalker.add_on_info add_on_info( inv_open, "ui_inventory" ) add_on_info( inv_open, "ui_trade" ) add_on_info( inv_open, "ui_car_body" ) add_on_info( inv_closed, "ui_inventory_hide" ) add_on_info( inv_closed, "ui_trade_hide" ) add_on_info( inv_closed, "ui_car_body_hide" ) ... return true end function inv_open() actor_data.inv_open = true end local on_closed_t = {} local on_closed_n = #on_closed_t function add_inv_closed( f ) on_closed_n = on_closed_n + 1 on_closed_t[on_closed_n] = f end function inv_closed() actor_data.inv_open = false chk_belt_add() for i = 1, on_closed_n do -- коллбэки всех, кому интересны изменения if on_closed_t[i] then on_closed_t[i]() end end end -- actor_data и chk_belt_add - ваши данные и проверки. Вместо 100500 модификаций костюмов актор элементарно с самого начала загружается невидимым балластом, например. А потом балласт убирается. 2. пока объект, полученный через level.object_by_id() существует - он существует. А вот если ушел в оффлайн или уничтожен (что, в принципе, одно и тоже), результаты будут забавные, да. Изменено 25 Октября 2014 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Zander_driver 10 345 Опубликовано 25 Октября 2014 Поделиться Опубликовано 25 Октября 2014 беда видимо в том что уничтожение объекта в игре - не уничтожает всяческие юзердаты на него ссылающиеся, которые где-то в скриптах в каких-то там переменных валяются с каких-то времен.потому вывод - не хранить объекты таким образом. гораздо удобнее сохранять айди, а уж из него при необходимости получать level.object_by_id, заодно тут же проверяя а существует ли он. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Dennis_Chikin 3 663 Опубликовано 25 Октября 2014 Поделиться Опубликовано 25 Октября 2014 (изменено) Юзердаты, на него ссылающиеся, после этого показывают на что попало. Да, пользоваться ими нельзя, следовательно, и хранить тоже бессмысленно. Есть, кстати, замечательный глюк в xr_conditions, где происходит обращение к сохраненной неизвестно когда, кем, и зачем юзердате. Изменено 25 Октября 2014 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Struck 61 Опубликовано 25 Октября 2014 Поделиться Опубликовано 25 Октября 2014 Zander_driver писал(а): 1. Реализовать механизм, позволяющий скриптом влиять на переносимый вес. Напрямую это делать нельзя. Один из обходных вариантов - На каждый комбез сделать серию подвидов, внешне неотличимых, но с разным переносимым весом. И скриптом менять в зависимости от желаемого результата, не забывая озаботиться сохранением состояния комбеза при его замене. 2. На апдейте скриптом выяснять, какие артефакты находятся на поясе ГГ, читать их конфиги, и если в них найдется строчка отвечающая за переносимый вес, читать ее значение и с этим значением запускать механизм из пункта 1. Я не спорю - это красиво будет смотреться, но по моему проще балласт с отрицательным весом спавнить (смотреться будет хуже, зато геморроя куда меньше). Цитата гораздо удобнее сохранять айди Самое верное решение. @Dennis_Chikin, а я вообще назначения некоторых функций в xr_conditions не понимаю. Особенно непонятны конструкции: function rad_pass_time(actor, npc) return true endfunction rad_pass_time(actor, npc) return true end Да и в остальном видно что не особо парились при создании логики в игре. Ссылка на комментарий
Zander_driver 10 345 Опубликовано 26 Октября 2014 Поделиться Опубликовано 26 Октября 2014 Не особо парились при разработке в целом игры, так верней уж. Всяческих непонятных конструкций во всех "сферах" - хватает. 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Dennis_Chikin 3 663 Опубликовано 26 Октября 2014 Поделиться Опубликовано 26 Октября 2014 (изменено) Ну а что вы хотите от студенческих курсовых ? По поводу идеи с рефакторингом - ну вот я занимаюсь. Но на базе соли. По тому что там проблемы очевидно повылазили раньше, чем где-то еще, по тому что в общем приличный набор карт, хотя и глючных, и по тому что туда уже добавлено много сторонних поделий, которые тоже надо перелопачивать сразу. Начинать в очередной раз все с нуля - не хочу. Да, модули Артоса на мой взгляд чрезмерно академичны. Этим и не нравятся. Вот допилю новый формат сохранений в гулагах - выложу очередную демосборку. А если кто хочет помочь - то, кстати, посмотрите смысл job.fill_idle на предмет смысла значений, отличных от -1 и -2 в xr_gulag - где, зачем и для чего в принципе это может использоваться. Struck писал(а): function rad_pass_time(actor, npc) return true end Это запчасть от убиения актора, если он сунулся на радар без записки или в неподходящее время. Изменено 26 Октября 2014 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Struck 61 Опубликовано 26 Октября 2014 Поделиться Опубликовано 26 Октября 2014 Цитата Начинать в очередной раз все с нуля - не хочу. И не нужно. Я считаю, что рефакторинг скриптов (тем более полный), будет для всех, и ни для кого. Многие его требуют, но дай его им, они не поймут как им пользоваться, посмотрят, поохают, и положат на полку. Сколько сейчас модов на 4 патче базируются на баг-фиксе, а? Ссылка на комментарий
RayTwitty 532 Опубликовано 26 Октября 2014 Поделиться Опубликовано 26 Октября 2014 (изменено) Zander_driver писал(а): сделать серию подвидов, внешне неотличимых, но с разным переносимым весом Zander_driver писал(а): какие артефакты находятся на поясе ГГ, читать их конфиги, и если в них найдется строчка отвечающая за переносимый вес Dennis_Chikin писал(а): Вместо 100500 модификаций костюмов актор элементарно с самого начала загружается невидимым балластом, например. А потом балласт убирается. На дворе 2014 год, а люди до сих пор подобные вещи делают через "переспавн костюмов" и невидимый "баласт" X-Ray extensions и методы get_actor_max_weight/set_actor_max_weight, get_actor_max_walk_weight/set_actor_max_walk_weight и get_inventory_weight в помощь. З.Ы. а еще лучше скачать исходники и сделать сразу как надо. Изменено 26 Октября 2014 пользователем Shadows 1 Ссылка на комментарий
Dennis_Chikin 3 663 Опубликовано 26 Октября 2014 Поделиться Опубликовано 26 Октября 2014 Вообще согласен, но на изучение и нормальную сборку из исходников тоже некоторое время нужно. Так что сразу - не получится. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Struck 61 Опубликовано 26 Октября 2014 Поделиться Опубликовано 26 Октября 2014 В любом случае, если по уму делать, то надо брать последнюю ревизию 7 патча (сейчас это 174), и на ее основе уже переписывать коды. Кто тут сильно жаждет, можете начать, сделать обвязку новых методов и свойств с описанием, это, я думаю, будет востребовано. Может кто и подхватит это дело. Лично мое мнение, храй экстеншн морально устарел. Ссылка на комментарий
antihumanist 0 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 Всем доброго времени ссуток. После прохождения SoC(1.0006) мне захотелось сделать некоторые не архисложные модификации игры : Начну с того что проходя вышеупомянутую часть сталкера мне не удалось заполучить одну редкую винтовку.. Уже после прохождения игры я наткнулся на тутор как прописать игроку в рюкзак предметы скриптом. Теперь внимание вопрос: Как игра подключает скрипты ? т.е. как заинклюдить свой пользовательский файл со скриптом чтобы он был виден из других скриптов ? Чтобы вызвать его к примеру из S.T.A.L.K.E.R - Shadow of Chernobyl\gamedata\scripts\ui_main_menu.script -- if dik == DIK_keys.DIK_S then-- self:OnButton_load_spawn() -- else if dik == DIK_keys.DIK_Q then self:OnMessageQuitWin()--после этого elseif db.actor~=nil and dik==DIK_keys.DIK_F4 then add_all_Wpn()--Моя функция которую я хочу иметь в своем скрипте а не дописывать их в конец уже имеющегося игрового скрипта, так как такой способ я считаю неправильным или просто нехорошим P.S.Я тут новенький так что если что не так то прошу тапками не кидать.Туторы читал и там не нашел такой инфы. Ссылка на комментарий
Dennis_Chikin 3 663 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 Мдя, пример выбран... Ну вот только случайно и можно. Скрипты подключаются "на лету". Вот есть, допустим, my_kew1.script, а в нем функция my_kew1_function(), то если где-то написать my_kew1.my_kew1_function() - как до нее дойдет, так сразу и подключится. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
stalk9r 135 Опубликовано 4 Ноября 2014 Поделиться Опубликовано 4 Ноября 2014 (изменено) Всем Привет! Задача: спавнить различные наборы предметов Работающий вариант - множество таких функций: (Показать) -- спавн каждого набора отделной функцией function pokup:pokup51()local object_names = {"bread","vodka","kolbasa"}local a = vector()local vid, gvid, i, aid, se_namea = db.actor:position()vid = db.actor:level_vertex_id()gvid = db.actor:game_vertex_id()aid = db.actor:id()for i, se_name in ipairs(object_names) doalife():create(se_name, a, vid, gvid, aid)endaem_manager.manage_money(1, "out")end Требуется: только определять в каждой функции набор, а спавнить отдельной функцией А вот такая конструкция не работает: (Показать) -- вызов дополнительной функции для спавнаfunction pokup:pokup51()self.pokupka({"bread","vodka","kolbasa"})endfunction pokup:pokupka(objects)local object_names = objectslocal a = vector()local vid, gvid, i, aid, se_namea = db.actor:position()vid = db.actor:level_vertex_id()gvid = db.actor:game_vertex_id()aid = db.actor:id()for i, se_name in ipairs(object_names) doalife():create(se_name, a, vid, gvid, aid)endaem_manager.manage_money(1, "out")end вылет с ошибкой bad argument #1 to 'ipairs' (table expected, got nil) Подскажите, как правильно передать аргументы? Изменено 4 Ноября 2014 пользователем stalk9r Есть хабар - пойдёт базар Ссылка на комментарий
Dennis_Chikin 3 663 Опубликовано 4 Ноября 2014 Поделиться Опубликовано 4 Ноября 2014 self.pokupka({"bread","vodka","kolbasa"}) - а это вообще как ? И зачем ? function pokupka( t ) for i, v in ipairs ( t ) do alife():create( v, vector(), 0, 0, 0 ) end end Вызывать: pokupka( {"bread","vodka","kolbasa"} ) Причем я не понял: зачем вообще делать отдельной функцией ? Дабы сильнее тормозило ? Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Barmolini 1 Опубликовано 4 Ноября 2014 Поделиться Опубликовано 4 Ноября 2014 (изменено) @Dennis_Chikin, это как бы класс. В котором есть метод спавна набора объектов. И есть методы в которых задаются разные наборы. Зачем - это другой вопрос. Да и работать должно же по идее. Изменено 4 Ноября 2014 пользователем Barmolini Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти