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/
antreg 179 Опубликовано 7 Июля 2011 Поделиться Опубликовано 7 Июля 2011 (изменено) Kirag, Да, всё так. Ещё раз спасибо за участие в нашей проблеме! Но, вроде бы, такой конструкции там нет: alife():create(N). Там конструкции строго на стори_айди - alife():story_object(N) или я чего то пропустил? А стори_айди у нас как раз и не совпадали. Вот и спавнился "воздух". Изменено 7 Июля 2011 пользователем antreg Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-607475
Kirag 39 Опубликовано 7 Июля 2011 Поделиться Опубликовано 7 Июля 2011 antreg Ну, вот например, из 2-й функции: --спавним аномалии --initial_spawn() local obj = alife():story_object(6000) if not obj then alife():create(2) obj = alife():story_object(6000) end Функция проверяет наличие объекта со стори ИД = 6000, если не находит - создает из алл.спавна. Что там получилось в алл.спавне за номером 2 после перекомпиляции - кто ж его знает. Но врядли это остался тот самый объект, у которого 6000-й СИД. И таких моментов несколько... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-607523
antreg 179 Опубликовано 8 Июля 2011 Поделиться Опубликовано 8 Июля 2011 (изменено) Kirag, Artos, После "чистки" от неиспользуемых у нас условий и функций, с функцией first_run() теперь всё в норме. Сложнее оказалось с функцией check_spawn() После того, как убрали все неиспользуемые в нашей сборке условия и прочее, остался вот такой массив: function check_spawn() amk_anoms.init() spawn_unspawned_respawners() if (news_main) then news_main.init() end if (amk_offline_alife) then amk_offline_alife.init() end if (amk_corpses) then amk_corpses.init() end if (amk_objects) then amk_objects.init() end if amk.load_variable("freeplay",0)==1 then amk.save_variable("freeplay",2) elseif amk.load_variable("freeplay",0)==2 and (not has_alife_info("cit_fail_first_task")) then db.actor:give_info_portion("cit_fail_first_task") end --level_changers section local lname = level.name() local sname = amk.load_variable("level_on_save","") if (amk_offline_alife) then amk_offline_alife.update_npc_tables() end if (amk_corpses) then amk_corpses.update_all_corpses() end if lname ~= sname and amk_objects then amk_objects.update() end -- Выдадим сообщения при переходе на уровень. if news_main then if (lname ~= sname and sname ~= "") then if (news_main.isIsolatedLevel(lname)== true and news_main.isIsolatedLevel(sname) == false) then -- Спустились под землю. news_main.on_disconnect() elseif (news_main.isIsolatedLevel(lname) == false and news_main.isIsolatedLevel(sname) == true) then -- Выбрались из-под земли. news_main.on_connect() end if (amk_offline_alife) then amk_offline_alife.update_trade() end end end if weather_types[lname]==0 then w=amk.load_variable("dynweather",nil) or level.get_weather() else w=level.get_weather() end if amk.load_variable("blowout",0)>0 then amk.save_variable("weather",level.get_weather()) end level.set_weather("amk_for_blow",true) game.start_tutorial("restore_sun") if amk.load_variable("blowout",0)>0 and amk.load_variable("blowout",0)<4 then local bt=blowout_type() level.add_cam_effector("camera_effects\\earthquake.anm", 2002, true, "") if bt<1 then level.set_weather("amk_for_blow",true) level.add_pp_effector("vibros.ppe", 2001, true) blowout_psy_sound("start") end end if db.actor and not has_alife_info("game_over") then local flame = db.actor:object("wpn_flame") if flame then db.actor:iterate_inventory( function(dummy,item) if item:section()=="wpn_flame" then alife():release(alife():object(item:id())) end end ,db.actor) end end end Комментирование оставшихся составляющих массива функции check_spawn() для того, чтобы отловить проблемную функцию, приводит к вылету при сэйв/лоад с логом: ! Unknown command: ZAMET:start_game_callback___called FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: d:\st\008_tt2_final\gamedata\scripts\_g.script:1245: attempt to index global 'amk' (a nil value) Получается, что тут, как бы, вторая ступень коллбэков. И непонятно, куда дальше "копать", откуда идёт вызов тех функций и условий, что остались. Возможно, эта задача, что мы хотим решить, не имеет решения, а возможно и имеет. К сожалению, я не имею навыков в прочтении таких функций. 1) Можно ли расшифровать оставшиеся составляющие функции check_spawn() для дальнейшей работы по отлову проблемного в нашем случае места? И второй вопрос: комментирование коллбэка на всю функцию check_spawn() целиком, в файле бинд_сталкер.скрипт к каким последствиям приведёт в дальнейшем? Чего мы лишаемся в этом случае? Изменено 8 Июля 2011 пользователем antreg Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-607655
_Призрак_ 11 Опубликовано 8 Июля 2011 Поделиться Опубликовано 8 Июля 2011 [error]Arguments : LUA error: d:\st\008_tt2_final\gamedata\scripts\_g.script:1245: attempt to index global 'amk' (a nil value) Указывает на то что синтаксическая ошибка в файле амк.скрипт. Скачай lua_cheker или скрипт_синтаксис_чекер и проверь скрипт на наличие ошибок Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-607718
antreg 179 Опубликовано 8 Июля 2011 Поделиться Опубликовано 8 Июля 2011 _Призрак_, Если ты внимательно прочитал сообщения выше, то там написано, что данный вылет с таким логом происходит после комментирования одной из функций. И ключевой, в логе вылета, является строка: start_game_callback___called, указывающая на то, что мы искусственно создали условие для вылета, закомментировав одну из функций массива, нарушив стартовый вызов (колбэк), т.е. специально создали ошибку. В этом и есть вопрос, как теперь расшифровать те функции и условия, которые невозможно закомментировать для отлова проблемы. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-607786
KD87 720 Опубликовано 8 Июля 2011 Поделиться Опубликовано 8 Июля 2011 (изменено) antreg, этот вылет всегда означает ровно одно - синтаксическая ошибка в amk.script, в результате которой скрипт не может корректно подгрузиться. Применительно к твоим условиям - закомментил лишний end или, наоборот, чего-то недокомментил. Что толку искать функции и условия, если испортили синтаксис? Изменено 8 Июля 2011 пользователем KD87 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-607795
antreg 179 Опубликовано 8 Июля 2011 Поделиться Опубликовано 8 Июля 2011 KD87, Конечно, но вопрос то совсем в другом был. То, что я искусственно создал такой вылет - это и так понятно. Комментирование функции с вызовом через колбэк конечно вызовет синтаксическую ошибку. Вопрос то совсем не в этом. Это только последствия последовательных действий поиска проблемы, с целью найти причину, мешающую нам адаптировать то, что задумано. Поиск проблемы адаптации пока зашёл в тупик, так как пропала возможность путём "тыка" (комментирования) найти некорректный контент, мешающий адаптации. Если кто-то может реально помочь, прошу поучаствовать в решении. Только прошу, вникните вначале в суть вопроса. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-607813
Kirag 39 Опубликовано 8 Июля 2011 Поделиться Опубликовано 8 Июля 2011 antreg Попробуй МНТ, план Б. Если не полчается комментировать, добавь тестовый вывод после... Ну, для начала, после каждого законченного фрагмента кода. У меня для этого в _g.script есть функция: function qqq(n,o) local scr = true local con = true if o then if o == 1 or o == 0 then scr = false end if o == 2 or o == 0 then con = false end end local k = "debug data QQQ "..tostring(n) if scr then if db.actor then news_manager.send_tip(db.actor, k, nil, nil, 5000) end end if con then get_console():execute ("load "..k) get_console():execute ("flush") end end Выкидывает сообщение на экран и в лог, второй параметр необязателен, он позволяет указать явно, куда нужен вывод инфы. Расставь qqq("mark 1")...qqq("mark N") в функции check_spawn(), и после вылета посмотри, какое сообщение прошло последним. Проблема должна быть между последним сработавшим qqq и следующим за ним. Так ты хотя бы область поиска сузишь. Потом можешь в этом фрагменте поставить qqq почаще, может, с точностью до строки найдешь проблему... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-607821
KD87 720 Опубликовано 8 Июля 2011 Поделиться Опубликовано 8 Июля 2011 antreg, не понял. Как ты комментируешь? Если закоментировать строчку mod_call("check_spawn") такого вылета не будет. check_spawn же в amk_mod.script, а вылет у тебя по amk.script. Давай тогда и amk.script выкладывай. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-607823
Buusty 387 Опубликовано 9 Июля 2011 Поделиться Опубликовано 9 Июля 2011 Кто-нибудь выкладывал логику неписей, чтобы ходили по Зоне сквадом/группой, т.е. чтобы не разбредались по одиночке - "кто куда". В принципе, не важно куда они пойдут и зачем, пусть шарохаются по Зоне, но вместе. Просто задумал сделать несколько таких спец.групп, гуляющих по Зоне. По задумке, они являются некими "карателями" для ГГ, и очень бы хотелось сделать встречу с ними случайной/рандомной, а, соответственно, внезапной для ГГ - можно нарваться на них, а можно и разминуться. Мод - "Народная Солянка". Если можно, то желательно без редактированния all.spawn. Знаю только, чтобы их не засосал какой-нибудь гулаг, нужно прописать - [smart_terrains] none = true ---------------- По большому счету, на этом мои познания в логике неписей и заканчиваются )). Если кто-то сможет помочь с этим вопросом, буду весьма благодарен! Можно в личку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-607894
PavelSnork 3 Опубликовано 9 Июля 2011 Поделиться Опубликовано 9 Июля 2011 Как проверить, используется широкоформатное или обычное разрешение экрана? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-608023
Kirag 39 Опубликовано 9 Июля 2011 Поделиться Опубликовано 9 Июля 2011 PavelSnork Вот так: local ar = device().aspect_ratio if ar <= 0.75 then -- WIDE SCREEN else -- NORMAL SCREEN end Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-608031
Miller 10 Опубликовано 10 Июля 2011 Поделиться Опубликовано 10 Июля 2011 (изменено) Ребят,а возможно ли заспавнить НПС,который спавнится через all.spawn, в другом месте без разбора спавна? Изменено 10 Июля 2011 пользователем Miller Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-608123
Disord 1 Опубликовано 10 Июля 2011 Поделиться Опубликовано 10 Июля 2011 Miller, xrSpawner только. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-608132
Miller 10 Опубликовано 10 Июля 2011 Поделиться Опубликовано 10 Июля 2011 (изменено) Таак.Ок. Другой вопрос:насколько я знаю,ACDC для НарСоли нет в общем доступе (или есть?).Существует ли другой ACDC,которым можно распаковать all.spawn Соли?Универсальный какой-нибудь,чтоли. --- И можно ли удалить гулаг с локации?Или отключить его? Изменено 10 Июля 2011 пользователем Miller Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-608134
Disord 1 Опубликовано 10 Июля 2011 Поделиться Опубликовано 10 Июля 2011 Miller, тоже удаляй смарттеррейн из спавна и, если у неписей в логике прописан этот гулаг - просто убери им его с логики, поставь другой или вообще запрети быть в гулагах. Ещё можно отредактировать скрипт с гулагом, чтобы возвращало неписям всегда состояние другое, которое не прописано в работах, которого вообще нет, должны тоже разбежаться. Ну это у меня так сделали. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-608136
Miller 10 Опубликовано 10 Июля 2011 Поделиться Опубликовано 10 Июля 2011 А если не удается найти секцию НПС через xrSpawner (Звездочет,например),значит его спавн идет через скрипт? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-608138
Disord 1 Опубликовано 10 Июля 2011 Поделиться Опубликовано 10 Июля 2011 Miller, если его там точно нет, значит да, через скрипт. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-608145
KD87 720 Опубликовано 10 Июля 2011 Поделиться Опубликовано 10 Июля 2011 Miller, есть такой ACDC, так и называется - universal_acdc В последней редакции умеет разбирать/собирать спавны от модов. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-608187
*Shoker* 322 Опубликовано 10 Июля 2011 Поделиться Опубликовано 10 Июля 2011 Разбирает по готовым базам или автоматом определяет новые секции? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/108/#findComment-608193
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти