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/
_g.script 3 668 Опубликовано 8 Сентября 2022 Поделиться Опубликовано 8 Сентября 2022 @Pir@t@s Скрытый текст local item = db.actor:item_in_slot("номер слота") if item and item:condition() ... 1 1 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1437799
VladKhabarovsk 0 Опубликовано 8 Октября 2022 Поделиться Опубликовано 8 Октября 2022 Доброго времени суток господа Сталкеры! Подскажите, пожалуйста, как "зациклить" данный простой квест? Сделать так, чтобы его можно было бы выполнять неограниченное количество раз? В строке "condlist" необходимо прописать условие? Знающие люди, помогите, заранее благодарю! [quest_vodka_give] icon = ui_inGame2_Put_v_pripyat prior = 2 storyline = false title = {=actor_has_item(vodka)}vodka_barmen_prinesti_name, vodka_barmen_naiti_name descr = vodka_barmen_descr target = {=actor_has_item(vodka)}zat_a2_stalker_barmen _0 = {+quest_vodka_done} complete Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1439609
_g.script 3 668 Опубликовано 22 Октября 2022 Поделиться Опубликовано 22 Октября 2022 (изменено) Есть код. Скрытый текст --// Перебрать инвентарь по секциям и вытряхнуть наружу local tActorItems = {} function drop_all_items() local f = function(dummy,item) table.insert(tActorItems,item:section()) end db.actor:iterate_inventory(f,nil) drop_items() for i=1, #tActorItems do table.remove(tActorItems) end end function drop_items() local dropped for i=1, #tActorItems do -- "Огласите весь список, пожалуйста!.." dropped = tActorItems[i] log3(dropped) if dropped ~= "bolt" then local death_ini = ini_file("misc\\death_generic.ltx") local n = death_ini:line_count("keep_items") for i=0, n-1 do local keep_item = death_ini:r_line("keep_items",i,"","") if dropped ~= keep_item then db.actor:drop_item(db.actor:object(dropped)) end end end end end И есть вопрос. Скрытый текст Не выкидываются все предметы. Всегда остаются одни и те же, их можно удалить, повторно выполнив код. На поясе ничего нет. Скрытый текст Могу обойтись другим кодом, но просто интересно - почему так? Изменено 23 Октября 2022 пользователем Murarius Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1440951
Norman Eisenherz 354 Опубликовано 22 Октября 2022 Поделиться Опубликовано 22 Октября 2022 (изменено) Таблица tActorItems пишется в переменную dropped целиком на каждой итерации сброса предметов. Возможно, должно быть dropped = tActorItems[ i ]? Нужна ли сама таблица, если в процессе перебора инвентаря можно сверить секцию предмета со списком keep items и сразу сбросить предмет при отсутствии совпадения? И еще непонятно, зачем чистить таблицу построчно после сброса предметов вместо полного обнуления tActorItems = {}. Если задача скрипта сбросить всё, кроме квестовых и специальных предметов (болт, КПК), достаточно обойти инвентарь через inventory_for_each(). Изменено 23 Октября 2022 пользователем Norman Eisenherz 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1440964
_g.script 3 668 Опубликовано 23 Октября 2022 Поделиться Опубликовано 23 Октября 2022 7 часов назад, Norman Eisenherz сказал: должно быть dropped = tActorItems[ i ] Конечно же. Куда то потерялось, пока сюда нёс, иначе бы дальше вылета дело не пошло. 7 часов назад, Norman Eisenherz сказал: Нужна ли сама таблица Нет, есть такая возможность Скрытый текст local actor = db.actor local cnt = actor:object_count() for i=0, cnt-1 do actor:drop_item(actor:object(i)) end Но интересно стало, так сказать, для общего развития. 7 часов назад, Norman Eisenherz сказал: вместо полного обнуления tActorItems = {} Как именно? Моего опыта с таблицами на большее не хватает. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1440969
Chypakabra 673 Опубликовано 23 Октября 2022 Поделиться Опубликовано 23 Октября 2022 13 минут назад, mole venomous сказал: Как именно? Моего опыта с таблицами на большее не хватает. именно так tActorItems = {} закрытые фигурные скобки обнуляют таблицу 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1440971
_g.script 3 668 Опубликовано 23 Октября 2022 Поделиться Опубликовано 23 Октября 2022 5 минут назад, ted.80 сказал: именно так tActorItems = {} Ок. А ваш Кэп подумал, её так лишь объявляют перед кодом... Всех благодарю, но 12 часов назад, mole venomous сказал: Не выкидываются все предметы 12 часов назад, mole venomous сказал: почему так? так и не ясно. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1440973
Chypakabra 673 Опубликовано 23 Октября 2022 Поделиться Опубликовано 23 Октября 2022 7 минут назад, mole venomous сказал: её так лишь объявляют перед кодом Точно так, не существующая до этого таблица создаётся, а существующая очищается Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1440975
Kirgudu 1 328 Опубликовано 23 Октября 2022 Поделиться Опубликовано 23 Октября 2022 (изменено) 13 часов назад, mole venomous сказал: почему так Потому что db.actor:object(dropped) ищет не конкретный предмет, а первый попавшийся предмет с секцией, равной секции dropped. Ты заметил, что после первого выкидывания остаются в инвентаре только те предметы, количество которых больше 1? Можно предположить, например, что функция drop_item удаляет предмет не одномоментно, а с некоторым запаздыванием, и когда ты ищешь следующий предмет с такой же секцией, всё время находится первый из них, который уже должен был удалиться к тому времени. Чтобы этого избежать, можно попробовать перейти на работу с идентификаторами вместо секций: table.insert(tActorItems,item:id()) -- запоминаем идентификатор вместо секции db.actor:drop_item(level.object_by_id(dropped)) -- ищем объект по идентификатору В остальном код будет идентичным. Изменено 23 Октября 2022 пользователем Kirgudu 1 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1440977
Chypakabra 673 Опубликовано 23 Октября 2022 Поделиться Опубликовано 23 Октября 2022 1 час назад, mole venomous сказал: Не выкидываются все предметы попробуй вот так: function dropall() for i=0,db.actor:object_count()-1 do local item = db.actor:object(i) if item and item:section() ~= "bolt" and item:section() ~= "device_pda" and item:section() ~= "device_torch" then local death_ini = ini_file("misc\\death_generic.ltx") local n = death_ini:line_count("keep_items") for i=0, n-1 do local keep_item = death_ini:r_line("keep_items",i,"","") if item:section() ~= keep_item then db.actor:drop_item(item) end end end end end 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1440981
_g.script 3 668 Опубликовано 23 Октября 2022 Поделиться Опубликовано 23 Октября 2022 5 минут назад, ted.80 сказал: for i=0,db.actor:object_count()-1 do Так делал - всё хорошо. А сейчас решил через 14 часов назад, mole venomous сказал: db.actor:iterate_inventory и таблицу. Опять же, 2 часа назад, mole venomous сказал: для общего развития Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1440982
dsh 3 824 Опубликовано 23 Октября 2022 Поделиться Опубликовано 23 Октября 2022 2 hours ago, Kirgudu said: Можно предположить, например, что функция drop_item удаляет предмет не одномоментно, а с некоторым запаздыванием Даже и предполагать не нужно. Это так и есть. На следующем апдейте предмет будет выброшен. А пока только помечен к выбрасыванию и это можно проверить методом dropped_mark или как-то так. Я вечно названия забываю. 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1440989
Norman Eisenherz 354 Опубликовано 23 Октября 2022 Поделиться Опубликовано 23 Октября 2022 (изменено) @mole venomous 1. При построчном чтении конфига выводятся три переменных: пустышка, имя параметра, значение. 2. Конфиг [keep_items] достаточно вычитать один раз – см. последний пример. Spoiler function drop_all_items() local function fx(item) db.actor:drop_item(item) end db.actor:inventory_for_each(fx) -- кроме квестовых и специальных предметов end Spoiler local t = {} function drop_all_items() local function fx(dummy, item) t[#t +1] = item -- можно заносить в таблицу сами предметы – drop_item позволяет обходить пустышки end db.actor:iterate_inventory(fx, nil) for i = 1, 5 do -- несколько случайных предметов local k = math.random(#t) -- случайный ключ db.actor:drop_item( t[k] ) table.remove(t, k) -- построчная очистка end end Spoiler local keep = {} -- полный список; заполняется один раз keep.bolt = true keep.device_torch = true keep.device_pda = true local death_ini = ini_file("misc\\death_generic.ltx") local n = death_ini:line_count("keep_items") for i = 0, n -1 do local dummy, sect, bool = death_ini:r_line("keep_items", i, "" , "") -- три переменных: пустышка, параметр, значение (в данном случае true для всех) keep[sect] = bool end local items = {} function drop_all_items() local function list(dummy, item) if not keep[ item:section() ] then -- сверка по ключу (вместо перебора) items[#items +1] = item -- можно заносить в таблицу сами предметы – drop_item позволяет обходить пустышки без вылета -- items[#items +1] = item:id() -- вариант с id end end db.actor:iterate_inventory(list, nil) for i = 1, #items do db.actor:drop_item( items[i] ) -- db.actor:drop_item( level.object_by_id( items[i] ) ) -- вариант с id end items = {} -- полная очистка end Изменено 23 Октября 2022 пользователем Norman Eisenherz 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1440991
Norman Eisenherz 354 Опубликовано 7 Ноября 2022 Поделиться Опубликовано 7 Ноября 2022 Нашел упоминания о том, что функции, доступные в скриптах, можно временно подменять своими:https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/13/#comment-657328https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#comment-994377 Ради эксперимента попытался изменить условия прохода под мостом в ТЧ: пробовал как показано ниже, пробовал указывать в безымянной функции аргументы и дописывать к исходной функции _G. – никакой реакции. Spoiler escape_dialog.has_soldiers_bribe = function() return actor:money() >= 1 end escape_dialog.give_soldiers_bribe = function() dialogs.relocate_money(npc, 1, "out") end Есть ли разница, в каком именно скрипте указан код с подменой функций? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1442140
Kirgudu 1 328 Опубликовано 7 Ноября 2022 Поделиться Опубликовано 7 Ноября 2022 5 часов назад, Norman Eisenherz сказал: Есть ли разница, в каком именно скрипте указан код с подменой функций? Есть разница в том, в каком порядке загружаются и инициализируются твой скрипт и целевой. Если целевой скрипт, в котором находится подменяемая функция, загружается первым, тогда твоя подмена сработает. А вот если вторым - всё, что ты наприсваивал предварительно в своём скрипте, будет полностью переписано в _G исходным кодом целевого скрипта, когда до него дойдёт очередь. Об этом. кстати, уже написано в постах по приведённым ссылкам. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1442171
Norman Eisenherz 354 Опубликовано 7 Ноября 2022 Поделиться Опубликовано 7 Ноября 2022 Назвал новый скрипт последней буквой алфавита – вызова новых функций все равно нет. Опять же, пробовал добавлять _G. перед старыми именами и указывать аргументы при замене. Каким должен быть правильный формат записи? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1442173
Kirgudu 1 328 Опубликовано 7 Ноября 2022 Поделиться Опубликовано 7 Ноября 2022 Правильный формат описан в тех постах. Используй вызов prefetch("модуль_с_подменяемой_функцией") в _g.start_game_callback() для принудительной заблаговременной загрузки. И вообще убедись путём логирования в консоль, что выполнение происходит в нужном тебе порядке. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1442174
Norman Eisenherz 354 Опубликовано 8 Ноября 2022 Поделиться Опубликовано 8 Ноября 2022 (изменено) В тех постах указано два разных формата: script.fx = function() без аргументов и _G.script.fx = function(аргументы) с какой-то промежуточной подменой (если я правильно понял, это сохранение старой функции и вызов ее как есть перед новыми действиями). Сработал в итоге вариант script.fx = function(аргументы), но только через prefetch нового скрипта. Теперь главный вопрос: какие дополнительные возможности дает подмена на ходу по сравнению с прямым редактированием исходных скриптов? Изменено 8 Ноября 2022 пользователем Norman Eisenherz Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1442189
Kirgudu 1 328 Опубликовано 8 Ноября 2022 Поделиться Опубликовано 8 Ноября 2022 1 час назад, Norman Eisenherz сказал: какие дополнительные возможности дает подмена на ходу по сравнению с прямым редактированием исходных скриптов? Редактирование исходного скрипта - постоянно, до конца игры изменённый функционал, подмена на лету - изменённый функционал автоматически откатывается к стандартному при ближайшей загрузке. Нужно это или нет в конкретном моде, можно решить самостоятельно. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1442193
Norman Eisenherz 354 Опубликовано 8 Ноября 2022 Поделиться Опубликовано 8 Ноября 2022 Другими словами, кроме сохранения исходных файлов разницы нет, так как изменения в скриптах учитываются только при перезагрузке, но не в процессе игры? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/594/#findComment-1442196
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти