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/
*Shoker* 322 Опубликовано 22 Сентября 2011 Поделиться Опубликовано 22 Сентября 2011 (изменено) Какая игра? По идее трупы монстров должны попадать в общий чистильщик (правда я не видел, где это происходит, так что не уверен, кто в курсе как именно игра их удаляет?) и пропадать по превышению определённого кол-ва тел. Функцию можешь такую: function clear_monster_corpses() for id = 1, 65534 do local obj = level.object_by_id(id) if obj~=nil and isMonster(obj) and not obj:alive() then local sobj = alife():object(id) alife():release(sobj, true) end end end Это грубый вариант, при его вызове будут удалены все трупы монстров, которые в данный момент в онлаине и есть на текущей локации. То же касается квестовых трупов монстров (хотя таковых в оригинале я не припомню ) Так что учти если что. Кстати, а существует ли способ удалить объект из игры, не получая его серверного объекта? SibireaStalker ЗП? Тогда квест вроде правильно вызываешь, а вообще стоит сперва попробовать самому вызвать в игре, а если не работает, то тогда уже писать тут. Изменено 22 Сентября 2011 пользователем *Shoker* Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-629705
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) *Shoker*, учитывая, что все монстры 'биндятся', а это значит, что заносятся в таблицу db.storage, итерировать по всему списку игровых ID расточительно. Достаточно: for id,v in pairs(db.storage) do if level.object_by_id(id) then local sobj = alife():object(id) if sobj and IsMonster(sobj) and not sobj:alive() then alife():release(sobj, true) end end end Добавлено через 4 мин.: Meller, имеются наработки модмейкеров по написанию 'чистильщиков' локаций, которые встречаются почти в каждом 'глобальном' моде. Не сложно взять из них часть относящуюся к монстрам и выделить в отдельную функцию с требуемым тебе результатом. Изменено 23 Сентября 2011 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-629755
лнкс 0 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 Можно ли как-то отключить удаление лута из инвентаря трупов, путём редактирования death_manager.script? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-629778
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 лнкс Разберись о чем говоришь и что отключать хочешь - тогда переформулируй вопрос. Loot - ограбление/грабить/мародерствовать В игре под 'лутом' подразумевается: удаление части предметов находящихся в трупе и доспавн в труп некоторого набора предметов, которых в трупе не было. Т.о. "удалить лут из инвентаря" невозможно, т.к. это действие (удаление+спавн). Игроки, часто употребояют под 'лутом' именно то, что доспавнивается в труп, что тем более удалить невозможно, т.к. еще и не спавнилось. Можно - а) не удалять предметы из трупа, можно - б) не спавнить предметы в труп, можно - с) и то и другое (т.е. отменить лут). Соответственно и пути решения различны. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-629792
лнкс 0 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 Удаляются ножи, пда, фонарики,детекторы и прочее. Меня интересует отмена этого удаления. Теперь понятно? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-629794
TimeShift 0 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) Как выдать квест через логику при вхождении в определенный смарт 1. Прочти п.6 в шапке темы. 2. Если ты ждешь готовой статьи или готового кода для твоего решения - думаю что врядли дождешься. Почитай на интересующую тебя тему статьи про логику, квесты ... И когда что-то начнешь делать и не будет получаться - задавай вопросы по сделанному тобою и по тому, что же не выходит. --/ Artos Изменено 23 Сентября 2011 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-629795
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) лнкс Для однозначного понимания вопроса нехватает еще малости - читаем в шапке: 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; Поэтому привожу только один вариант применительно к версии игры ТЧ: В скрипте 'death_manager.script' в строке 177 (в самом конце функции 'keep_item') закомментируй (поставь впереда строки '--') так: --alife():release(alife():object(item:id()), true) Если иная версия игры иль правленый файл (из мода) - делай по аналогии. Понятно? Изменено 23 Сентября 2011 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-629809
dark_stalker 2 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 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: ...hadow of chernobyl\gamedata\scripts\state_mgr.script:145: C stack overflow помогте опредилить почкму вылет? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-629839
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) dark_stalker Это один из трудно выявляемых типов ошибки. Поиск причины возможен только на конкретных кодах мода. Где-то в кодах у тебя образовалась зацикленность, что приводит к переполнению стека. Искать и разрывать цикл. Подспорьем может быть определение объекта (имени) в том эвалуаторе из 'state_mgr.script' на который указывает запись в логе и искать циклы связанные с этим объектом. Но, вполне возможно, что спавнится некий объект (НПС/моб) по некорректной позиции (типа "в стене") и не может выбраться ... Изменено 23 Сентября 2011 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-629844
dark_stalker 2 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) А какой имено обьект опредилить возможно? Это может быть из за того что я аи сетку изминил? Изменено 23 Сентября 2011 пользователем dark_stalker Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-629854
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) Не 'какой', а 'как'. Тебе нужен именно тот, для которого зациклились вызовы стейт-менеджера. Какой именно - только самому смотреть и анализировать. Выведи в лог имя объекта 'self.object:name()' в том эвалуаторе, к которому принадлежит строка указанного в логе ошибки - получишь всех, которые движутся. По часто и/или последнему упоминающемуся имени и ищи ... Ну и естественно, сменив сетку AI следует перепроверить/скорректировать все координаты ... Изменено 23 Сентября 2011 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-629856
_Призрак_ 11 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 Как узнать код клавиши из user.ltx? Поясню: Нужно чтобы при нажатии кнопки открытия второго слота активировалась функция. Функция для того чтобы отследить нажатие какой либо клавиши у меня есть, но я не знаю как узнать на какую клавишу игрок установил активирование второго оружейного слота Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-630036
Artos 99 Опубликовано 23 Сентября 2011 Поделиться Опубликовано 23 Сентября 2011 (изменено) _Призрак_ Прочитать файл 'user.ltx' и из него взять значение интересующего тебя параметра (bind wpn_2 k2). Можно это делать один раз на старте игры, но ... игрок в процессе игры может перебиндить - значит перечитывать стоит 'по выходу' из главного меню. function Read_ScreenResolution() get_console():execute("cfg_save tmp") --/ копия/запись настроек из 'user.ltx' в файл 'tmp.ltx' local f = getFS() --/ объект класса FS local oFile = f:exist("$app_data_root$","tmp.ltx") local iSize = oFile and oFile.size_real --/ размер файла (байт) if iSize and iSize > 0 and iSize < 8192 then --/ ограничитель размера 'читалки' local oReader = f:r_open(oFile.name) --/ объект/линк 'читалки файла' if oReader then local tSymbols,iByte,i = {},0,0 --/ временный массив и переменные для чтения --/ последовательно по-байтно читаем от начала и до конца файла (или до NULL) oReader:r_seek(0) --/ устанавливаем 'читалку' в начало for i=1,iSize do iByte = oReader:r_u8() --/ читаем текущий байт if iByte == 0 then --/ нуль-терминатор? (NULL == 0x00) break --/ прерываем чтение end table.insert(tSymbols, string.char(iByte)) --/ конвертируем байт в символ и добавляем в таблицу end local sStr = table.concat(tSymbols) --/ конкатенация всех символов в единую строку --/ вырезаем из строки файла значение искомого параметра local sVidMode = sStr:match('vid_mode%s*(%w+)') if sVidMode and sVidMode ~= "" then --/ обнаружен? print("Read_ScreenResolution:VidMode=[%s]:[%s]", sVidMode, sVidMode, ">") --/> Прочитали!!! end end f:file_delete(oFile.name) --/ удаляем tmp-файл end end Изменено 23 Сентября 2011 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-630051
Lagos 688 Опубликовано 26 Сентября 2011 Поделиться Опубликовано 26 Сентября 2011 (изменено) Здраствуйте. Вот создал нового торговца в ЗП, и прописал ему такую логику: [logic] prior = 200 active = remark danger = danger_ignore level_spot = trader can_select_weapon = false trade = misc\trade\trade_otshel.ltx [danger_ignore] ignore_distance = 5 [remark] no_move = true (Если я не ошибаюсь, то торговец должен торговать и стоять на месте.) Но при подходе к торговцу получаю вылет: Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ....e.r. - Cia I?eiyoe\gamedata\scripts\xr_logic.script:939: bad argument #1 to 'gfind' (string expected, got nil) (Опять же, как я правильно понял, это неверная логика.) Подскажите, в чём моя ошибка? Заранее спасибо. Изменено 26 Сентября 2011 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-630733
Ulman 5 Опубликовано 26 Сентября 2011 Поделиться Опубликовано 26 Сентября 2011 Всем доброго времени суток! У меня вот такая проблема, я уже писал про неё, но ответов так и не получил. Дело вот в чём, у меня стоит Медицинская резинка и спецназовские часы от Вергаса и я заметил такую "пакость" очень часто, когда я лечу раненных товарищей, то они благодарят, становятся друзьями, пытаются встать на ноги и сразу же падают, то есть их аптечка не вылечила. Вот как это исправить, очень нужно, заранее спасибо! P.S. Пытался обращаться к автору мода, но к сожалению его очень давно нет на форуме, с июня этого года. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-630836
Artos 99 Опубликовано 26 Сентября 2011 Поделиться Опубликовано 26 Сентября 2011 (изменено) Ulman, так ты будешь о-о-очень долго спрашивать. Ни версии игры не указал, ни что за солянку себе сделал. Если тебе знакома резиновая аптечка иль спец-часики, то кому-то они совершенно не знакомы, и не лишним бы были ссылки на коды этих примочек. Вот тогда, может и найдутся те, кто подскажет как исправлять. Ну а пока немного общей теории и далее ковыряй самостоятельно: В исходной игре, если дать раненому аптечку, то его здоровье должно увеличиться, схема ранения сбрасывается и НПС встает. Однако, если величина увеличения здоровья ('eat_health'), которую дает съеденная аптечка недостаточна для достижения порогового значения, по которому определяется ранен ли НПС - то вновь включится схема ранения и НПС примет соответствующую позу. "Резиновая аптечка", как помнится, именно и предназначена для затягивания процесса выздоравливания (хотя вроде только для актора). Если она (аптечка) в своем конфиге имеет малое значение 'eat_health' - то и не будет вылечивать 'за раз'. Добавлено через 16 мин.: zoidberg123456789, искать нужно в иных кодах, чем процитированная тобою логика. Строка лога ошибки: 'xr_logic.script:939: bad argument #1 to 'gfind' (string expected, got nil)' - говорит о том, что в функцию xr_logic.parse_condlist(npc, section, field, src) не был передан аргумент 'src' (т.е. некое значение параметра для некоей схемы). Попробуй в начало функции 'parse_condlist' поставить вывод в лог значений npc:name(), section, field - тогда сможешь понять, для какого НПС из какой схемы и в каком параметре у тебя ошибка. Изменено 26 Сентября 2011 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-630867
Zander_driver 10 348 Опубликовано 27 Сентября 2011 Поделиться Опубликовано 27 Сентября 2011 Ulman Из того что приходит в голову 1) В случае лечения нпс через диалог, вызывать функцию которая принудительно восстановит здоровье непися до нормы 2) При передаче "резиновой аптечки" нпсу, заменять ее на "обычную", которая восстанавливает здоровье как в чистой игре. У меня в своей реализации постепенно действующих аптечек сделано по второму методу function relocate_item_section(victim, section, type) if db.actor and victim then if type == "in" then --' Трансферить нужно только квестовые предметы. if quest_section[section] == true and victim:object(section) ~= nil then victim:transfer_item(victim:object(section), db.actor) else alife():create(section, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) end elseif type == "out" then if section == "two_medkit" then twoteam_usetime.relocate_medkit("two_medkit", "medkit", victim) elseif section == "two_medkit_army" then twoteam_usetime.relocate_medkit(section, "medkit_army", victim) elseif section == "two_medkit_scientic" then twoteam_usetime.relocate_medkit(section, "medkit_scientic", victim) else db.actor:transfer_item(db.actor:object(section), victim) end end news_manager.relocate_item(db.actor, type, section) end end function relocate_medkit(section, target_section, target) twoteam.set_rundrop_data(true) local medobj = db.actor:object(section) if medobj == nil then return end if alife() then local seobj = alife():object(medobj:id()) if seobj then alife():release(seobj, true) end spawn.inv(target_section, target:id()) end end Вместо set_rundrop_data у Варгаса, полагаю, что-то свое, если его способ реализации похож на мой (до сих пор в глаза не видел, так что понятия не имею), в любом случае трогать это ненадо, к делу не относится. Вопрос такой, при удалении методом alife():release некоторые объекты надо переводить в оффлайн, некоторые можно прямо из онлайна удалять. Кто-нибудь занимался сбором информации, какие надо а какие-нет? Понимаю, вопрос лениво выглядит, но нехватка свободного времени заставляет искать готовый ответ в виде по-возможности полного "справочника" какие надо переводить а какие нет. Заранее спасибо за ответ. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-630924
Artos 99 Опубликовано 27 Сентября 2011 Поделиться Опубликовано 27 Сентября 2011 Zander_driver Думаю нет и не будет потребного для тебя 'справочника' (по многим причинам). Критерием тут является то, что если клиентский объект оперирует и изменяет эксклюзивную информацию, которая критична и должна быть сообщена серверу - то такие объекты без предварительной синхронизации ссервером (считай перевод в оффлайн) - удалять нельзя. И раз уж нет такого единого 'справочника', то исходить следует от обратного: потребовалась работа с конкретным типом объектов - именно для этого типа выяснить все нюансы и из запомнить. И т.д. по каждому типу. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-630936
Lagos 688 Опубликовано 27 Сентября 2011 Поделиться Опубликовано 27 Сентября 2011 (изменено) Заспавнил торговца через смарт терраин. Получил вылет. Что не так вот здесь: squad_descr.ltx [darkscape_stalker]:online_offline_group faction = stalker sympathy = 1 npc = otshel target_smart = darkscape_stalker_smart spawn_point = zat_stalker_base_smart_spawn_barmen story_id = darkscape_stalker darkscape_stalker_smart.ltx [smart_terrain];darkscape_stalker_smart max_population = 1 [exclusive] ;darksape_stalker = darkscape\otshel_logic.ltx otshel_logic.ltx [logic@darksape_stalker] suitable = {=check_npc_name(otshel)} true trade = misc\trade\trade_otshel.ltx prior = 200 active = animpoint@bar_les can_select_weapon = false level_spot = trader [animpoint@bar_les] cover_name = zat_a2_sc_barmen avail_animations = animpoint_stay_table_no_rnd use_camp = false meet = meet combat_ignore_cond = true combat_ignore_keep_when_attacked = true invulnerable = true gather_items_enabled = false help_wounded_enabled = false corpse_detection_enabled = false simulation.ltx ;;;;;;;;;;;;;;;;;;;;;;;; darkscape ;;;;;;;;;;;;;;;;;;;;;;;;;;;; [start_position_darkscape] darkscape_stalker = darkscape_stalker_smart Секция спавна [124] ; cse_abstract properties section_name = smart_terrain name = darksape_stalker_smart position = 250.339569091797,-0.22316600382328,-195.362701416016 direction = 0.106533996760845,-1.49463295936584,0.104124002158642 ; cse_alife_object properties game_vertex_id = 0 distance = 9.80000019073486 level_vertex_id = 58518 object_flags = 0xffffff3e custom_data = <<END [smart_terrain] cfg = scripts\darkscape\smart\darksape_stalker_smart.ltx END ; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 20 ; cse_alife_space_restrictor properties restrictor_type = 3 ; se_smart_terrain properties Помогите. Бьюсь со смартами уже вторую неделю.... Направте на правильный путь. Вот лог вылета: Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ...e.r. - Cia I?eiyoe\gamedata\scripts\sim_board.script:226: attempt to index local 'spawn_smart' (a nil value) Заранее спасибо. А верcию и патч игры - нам всем Пушкин подскажет? --/ Artos Изменено 27 Сентября 2011 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-631066
_Призрак_ 11 Опубликовано 27 Сентября 2011 Поделиться Опубликовано 27 Сентября 2011 (изменено) zoidberg123456789, у тебя почему то нет смарта darkscape_stalker_smart. Проверь запаковал ли ты спавн, без ошибок запаковался ли спавн, не забыл ли ты его потом переименовать из all.spawn.new в all.spawn Указывай, плз, адресата в своем ответе. --/ Artos Изменено 27 Сентября 2011 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/140/#findComment-631074
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти