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/
Artos 99 Опубликовано 3 Августа 2011 Поделиться Опубликовано 3 Августа 2011 (изменено) *Shoker* Уничерсальная функция вывода в лог-файл любой строки с параметрами выглядит например так: --/------------------------------------------------------------------- --/ Functions for Print-Log --/------------------------------------------------------------------- function printf(fmt,...) --/ вывод в лог-файл --/ локальная функция перевода в стринг иных типов переменных function to_string(val) local sType = type(val) if sType == "string" then return val --/> elseif sType == "number" then return tostring(val) --/> elseif sType == "boolean" then return tostring(val) --/> elseif sType == "table" and type(val.x) == "number" and type(val.y) == "number" and type(val.z) == "number" then return string.format("x=%d:y=%d:z=%d", val.x, val.y, val.z) --/> elseif sType == "userdata" and type(val.x) == "number" and type(val.y) == "number" and type(val.z) == "number" then return string.format("%d:%d:%d", val.x, val.y, val.z) --/> end return string.format("<%s>",sType) --/> end --/ основная функция if fmt ~= nil then fmt = to_string(fmt) if fmt:match("%\%s") then --/ имеются патерны local tArg = {...} --/ список аргументов if tArg and next(tArg) then --/ имеются аргументы for i=1,#tArg do fmt = fmt:gsub("%\%s",to_string(tArg[i]),1) --/ последовательно заменяем по одному патерну end end end fmt = fmt:gsub("%\%s","<<<NOT_arg!>>>") --/заглушка от отсутствующих аргументов fmt = fmt:gsub("%s",'\160')--/ замена обычных пробелов (sym_space='\032') на печатные ('\160') fmt = "*INFO:"..fmt:sub(1,250) --/ ограничение (первые 250 символов) длины строки выводимой в лог-файл (опционально) else --/ отсутствует информационная строка fmt = '*INFO:<zero_string>' end --/ для SHoC get_console():execute( fmt ) get_console():execute( "flush" ) --/ 'фиксация' (запись) строки в лог-файле (опционально) --/ для CS или SCoP --error_log( fmt ) end --/------------------------------------------------------------------- Позволяет выводить в лог осмысленную строку при любой комбинации входных параметров, попутно переводя векторы в значения координат (x:y:z) и др.. Замена пробелов, по которым отсекается дальнейший вывод в лог в оригинальном коде НЕ на символ подчеркивания ('_') а на печатный пробел ('\160) позволяет читать строку в том виде, который задан в исходном коде. Небольшая подстройка последних строк позволяет использовать в CS или SCoP, а исходный вариант расчитан на SHoC. В вашем конкретном примере исходная строка из функции 'get_last_IDS(...)' скрипт-файла 'xr_sound.script': printf("LAST INTO ID for [%s] = [%s], max [%s]", theme, last_table[snd_table.into_id], snd_table.into_max) была изменена, хотя корректные параметры и не были использованы, что и затрудняет поиск. Инструмент нужно подбирать не абы какой, а ... каКчественный! :-) Изменено 3 Августа 2011 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-614356
*Shoker* 322 Опубликовано 3 Августа 2011 Поделиться Опубликовано 3 Августа 2011 (изменено) А я вот хотел спросить, как сильно такие функции нагружают систему? Я например иногда ставлю такие вещи на апдейт (постоянный вывод сообщения) Это конечно само по себе грузит систему, но насколько сильное оно будет грузить если например использовать твой вариант с кучей if? Изменено 3 Августа 2011 пользователем *Shoker* Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-614468
Malandrinus 615 Опубликовано 3 Августа 2011 Поделиться Опубликовано 3 Августа 2011 Artos, в качестве дополнения. В ЗП функция error_log рушит систему (как вероятно и задумывалось). Да и незачем заморачиваться в ЧН или ЗП с игровым логом, который тормозной и с ограничениями, при том, что можно выводить в произвольный файл через пространство имён io. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-614471
*Shoker* 322 Опубликовано 3 Августа 2011 Поделиться Опубликовано 3 Августа 2011 А какие ограничения есть в ЧН на игровой лог? В принципе там использую error_log, и всё нормально, включая то, что поддерживает печатный пробел и русские символы. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-614473
Artos 99 Опубликовано 4 Августа 2011 Поделиться Опубликовано 4 Августа 2011 (изменено) malandrinus, все же это уже 'технические' моменты и естественно конкретные варианты фиксации в общий лог-файл или еще куда могут быть самыми различными и зависить от конкретных задач. При поиске проблем/ошибок, ИМХО, важно иметь синхронизированный вывод 'своих' технологических строк с основным игровым логом. Это помогает понять когда/что/из-за чего ... При наличии достаточно рабочего варианта луа-перехватчика (by alpet) это уже довольно тривиально и не требует особых усилий, но(!) как раз завязано на парсинг общего игрового лога. Единственное о чем забыл упомянуть ранее - так это о желательности доработать саму функцию 'abort()', дабы строка причины с аргументами так же не канули в лету из-за заблогированной оригинальной 'log()'. *Shoker* Различные 'if', грузят систему ровно настолько насколько ума вложил в них кодер ... :-) Уж поверь, сотня 'if' в предложенном варианте грузит систему не более чем одна строка 'get_console():execute("flush")'. Твой вариант ловить ошибки, засовывая вывод в лог-файл в апдейт актору с обязательной фиксацией каждой выводимой строки, конечно может использоваться, но ... как раз и имеет огромный недостаток по сжиранию ресурсов игры и созданию лагов. Еще АМК в своем 1.3 придумали 'watchdog', позволяющий разложить подобный поиск ошибок на этапы, не применяя сплошного вывода в лог. Да и в оригинальных кодах видны следы от разработчиков, позволявшие им не сильно напрягать ресурсы, подвергая дебагам отдельные скрипты/схемы/группы, а не сплошняком ... Изменено 4 Августа 2011 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-614658
*Shoker* 322 Опубликовано 4 Августа 2011 Поделиться Опубликовано 4 Августа 2011 Ну на апдейт я их ставлю в крайнем случае, когда надо проверить работает ли скрипт вообще, или где происходит затык, потом убираю. А вот про watchdog интересно, как он должен работать? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-614667
abramcumner 1 229 Опубликовано 5 Августа 2011 Поделиться Опубликовано 5 Августа 2011 А вот про watchdog интересно, как он должен работать? Вотчдог следит за тем не завис ли биндер ГГ. Работа основана на том, что вызовы апдейта для биндеров ГГ и НПЦ идут поочередно. Поэтому в начале actor_binder:update инициализируем какую-либо переменную (amk.oau_watchdog) значением 100 и после вызова функции или группы функций присваиваем меньшее значение. В конце actor_binder:update присваиваем этой переменной 0. В апдейте биндера НПЦ motivator_binder:update проверяем эту переменную на 0. Если биндер ГГ завис, то апдейт до конца не дойдет и переменная будет не нулевая. По значению переменной можно определить место зависания. Такую же шнягу можно провернуть и для биндеров НПЦ. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-614890
Artos 99 Опубликовано 6 Августа 2011 Поделиться Опубликовано 6 Августа 2011 Чуть дополню о сути watchdog'а, раз уж заикнулся и опять заглянул сюда. Понятие 'watchdog' довольно непростое, но суть: сделить за работой чего-то и в случае несоответствия заданных критериев - предпринимать некие действия. Например подобное используется в серверных системах, котоорые контролируют работту различных систем и в случае сбоя/зависания - дают команду на жесткий ресет/рестарт сервера. Т.о. обеспечивается относительная безперебойность работы системы. Касательно скриптов и конкретного варианта применения принципа watchdog'а в АМК-скриптах: Наверное уже многим известно, что в игре движок и скрипты работают по некоему циклу, который по определению постоянно повторяется. Именно методы update() и работают в этих циклах, в том числе и апдейт актора ( function actor_binder:update(delta) ). На этот апдейт и разработчиками игры уже понавешано немало доп.вызовов сторонних функций и модмейкеры добавляют в меру иль без меры ... Основная масса вероятных ошибок возникает именно в части цикла апдейта актора. abramcumner, выше уже описал суть применения и использования watchdog'а применительно к этой части. В motivator_binder:update() стоит проверка условия корректного завершения работы апдейта актора, а если нет - выводится информация (если модмейкер озаботился) о причине и месте (по индексу переменной). Это позволяет при сбоях/зависаниях треда (потока) апдейта актора локализовать место сбоя и далее разбираться в этом скрипте/функции. Однако, следует помнить, что весь цикл не ограничивается только апдейтом актора. Далее отрабатывают свои куски апдейты NPC, монстров, иных объектов, которые зарегистрированы в биндерах. Работают для этих объектов различные схемы (xr_, sr_, hp_, ...). В этих местах также нередко при модификациях возникают ошибки/коллизии. Если и в подобные места расставить нечто подобное watchdog'у, то локализация и поиск проблем может занимать гораздо меньше и времени и ресурсов, чем при тотальном расставлении выводов строк в лог-файл или поиск причины методом 'тыка'. Однако(!) на 'обустройство' требуется и время и все же знания, готовых вариантов, охватывающих 'все и вся' нет. Все эти watchdog'и конечно же не требуются для процесса игры и естественно несколько нагружают процессор и съедают некоторую долю ресурсов, поэтому применять следует на этапе разработки и отладки кодов. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-615080
panzyuza 53 Опубликовано 6 Августа 2011 Поделиться Опубликовано 6 Августа 2011 (изменено) А как изменить функцию printf, что бы в лог на каждой локации мне выдавалось следующее: СЕКЦИЯ ОБЬЕКТА - ИМЯ ОБЬЕКТА Для всех обьектов на локации!!!И желательно бы еще секции с неправильным названием! Изменено 6 Августа 2011 пользователем panzyuza Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-615174
*Shoker* 322 Опубликовано 6 Августа 2011 Поделиться Опубликовано 6 Августа 2011 Никак. Во первых эта функция отвечает за вывод отладочных сообщений, а их уже составляет сам кодер и ставит там где нужно. Во вторых - что подразумевается под не правильным названиями? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-615185
panzyuza 53 Опубликовано 6 Августа 2011 Поделиться Опубликовано 6 Августа 2011 (изменено) У меня проблема в том, что в Рыжем Лесу в одном и том же месте вылетает с ссылкой на то, что не может открыть секцию "''".Я проверил весь спавн-файл локации, соответствие каждой секции описанию в конфигах ,все норм.А вылетает все равно.Вот и нужно,что бы выводил каждую секцию, и ее имя,что бы узнать,из за чего вылет, из за какой секции?Просто использовал скрипт printf сверху, результата ноль. Добавлено через 102 мин.: Разобралься в чем дело.Просто, как ни странно, проблема была в кровососах и полтергейстах, которые спавнились при получении поршня в рестрикторе.Удалил их всех и рестрикторы, и все заработало.Причин вылетов с именем секции я не вижу. Изменено 6 Августа 2011 пользователем panzyuza Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-615188
*Shoker* 322 Опубликовано 6 Августа 2011 Поделиться Опубликовано 6 Августа 2011 Не совсем та тема, но думаю сойдёт. По идее всё новое оружие нужно прописывать в mp_ranks, но я вот не обращал раньше внимания, оригинального оружия та там нету. Это получается, что оно в движок что ле в ранговую систему прописано? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-615288
speczadanie 0 Опубликовано 7 Августа 2011 Поделиться Опубликовано 7 Августа 2011 Как заставить пистолет переместиться из слота в рюкзак? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-615345
weas 0 Опубликовано 7 Августа 2011 Поделиться Опубликовано 7 Августа 2011 Народ! Кто знает как создать точку респауна? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-615350
Desertir 202 Опубликовано 7 Августа 2011 Поделиться Опубликовано 7 Августа 2011 weas, слово "респавн" применимо только для мультиплеера (в некоторых играх и для сингла, но не для сталкера). Если ты имеешь ввиду точку спавна в начале игры, это нужно разбирать all.spawn и менять координаты, что есть на вики. Это получается, что оно в движок что ле в ранговую систему прописано? Вроде недавно кто то писал тут на форуме, что да Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-615370
weas 0 Опубликовано 7 Августа 2011 Поделиться Опубликовано 7 Августа 2011 (изменено) Кароче по русски : Как создать точку, в которой буду спавнится НПС многократно? Строгое предупреждение от модератора ColR_iT 2.4. Запрещено оставлять сообщения заглавными или жирными буквами. И вот еще: слово "респавн" применимо только для мультиплеераэто не так! Вот секция респавна на Кордоне: Изменено 7 Августа 2011 пользователем ColR_iT Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-615372
Kirag 39 Опубликовано 7 Августа 2011 Поделиться Опубликовано 7 Августа 2011 Как заставить пистолет переместиться из слота в рюкзак? local obj = db.actor:item_in_slot(1) local sect = obj:section() local id = obj:id() db.actor:drop_item(obj) local temp = alife():create(sect,vector(),0,0,db.actor:id()) db.actor:transfer_item(obj,db.actor) alife():release(temp,true) Если сильно хочешь, в alife():create вместо vector(),0,0 поставь валидные координаты актора, но вообще - прокатит и так, проверено. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-615381
speczadanie 0 Опубликовано 7 Августа 2011 Поделиться Опубликовано 7 Августа 2011 (изменено) При попытке вызова: Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ....l.k.e.r.-1-1\gamedata\scripts\test.script:13: attempt to index local 'obj' (a nil value) Изменено 7 Августа 2011 пользователем speczadanie Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-615396
*Shoker* 322 Опубликовано 7 Августа 2011 Поделиться Опубликовано 7 Августа 2011 (изменено) У тебя слот пустой? Надо чтобы в нём что то было. Нужно поставить такую проверку: local obj = db.actor:item_in_slot(1) if obj then local sect = obj:section() local id = obj:id() db.actor:drop_item(obj) local temp = alife():create(sect,vector(),0,0,db.actor:id()) db.actor:transfer_item(obj,db.actor) alife():release(temp,true) end А вообще скопируй 13 строчку из твоего скрипта, если ты ещё не менял там ничего, иначе номер строки уже другой будет. Изменено 7 Августа 2011 пользователем *Shoker* Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-615406
speczadanie 0 Опубликовано 7 Августа 2011 Поделиться Опубликовано 7 Августа 2011 13 строка = local sect = obj:section() В слоте был артефакт (у меня есть активация артефактов). Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/115/#findComment-615459
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти