Модостроение. Редактирование и создание скриптов
|
|
denis2000 | Дата: Пн, 10.10.2011, 21:17 | Сообщение # 1 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Редактирование и создание скриптов Редактирование и создание скриптов на языке LUA Если у вас появились вопросы по применению скриптов в игре. Задавайте их в этой теме - умные головы, модосторители и просто разбирающиеся в программировании люди вам ответят.
Много интересного материала здесь (wiki), Lua_help.script, Help из SDK 0.7
Сборник модостроения ЗП v10.10.11 (автор: XOBAH): *.CHM, *.HTML [cut noguest=Если у вас не открывается файл CHM]Если у вас не открывается файл: 1. Запустите [Пуск]=>[Выполнить] (либо хот-кей [WIN]+[R]) 2. Введите команду (без кавычек) "regsvr32 %windir%\system32\hhctrl.ocx" 3. Если вылезло окно об успешном завершении вы все сделали правильно и можете перезагружать компьютер (а может и не надо) Также: файлы МОГУТ не открываться если в пути к файлу есть: символы кириллицы, "_", "#" Также: есть не стандартные программы-просмоторщики CHM файлов. Например: FBReader[/cut]
[cut=Где найти лог игры после вылета]Что такое LOG ошибки, и как мне его найти? Это система отладки происходивших вылетов, которая подается игрой в форме текста, хотя не всегда. Для того чтоб найти LOG необходимо зайти вот сюда:
В Win хр лог находится:
C:\Documents and Settings\All Users\Документы\S.T.A.L.K.E.R. - Зов Припяти\logs
Затем открываете первый файл в формате TXT, и в нем отбираете с низу 25 строчек. После кидаете эти 25 строчек в сообщение на форум.
В Win7 лог находится C:\Users\Public\Documents\S.T.A.L.K.E.R. - Зов Припяти\logs
Путь к папке с логом можно найти открыв файл fsgame.ltx который находится в корневой директории ЗП, за это отвечает строка: ... $app_data_root$ = true | false| $fs_root$| users\(тут мы указываем что папка пользователя, будет хранится рядом с Fsgame.ltx) ... $logs$ = true| false| $app_data_root$| logs\(а тут мы указываем что в папке пользователя, в подпапке Logs будут храниться наши логи) ... [/cut][cut=Получение более подробной информации о вылете (ХОВАН)] Открываем файл _g.script и ищем такую функцию: function abort(fmt, ...) Там есть заккомментированная строчка "--error_log(reason)", ее и надо расскомментировать, должно получиться вот так: Code function abort(fmt, ...) local reason = string.format(fmt, ...) error_log(reason) end Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией
Первый: Code Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ....a.l.k.e.r. - Зов Припяти\gamedata\scripts\_g.script:478: bad argument #2 to 'format' (string expected, got nil) Второй: Code Expression : 0 Function : ErrorLog File : D:\prog_repository\sources\trunk\xrServerEntities\script_engine_script.cpp Line : 49 Description : 'Attempt to read a non-existant string field 'path_walk' in section 'walker@mechanic' [/cut]
Перед тем, как задать вопрос в этой теме, прочтите все предыдущие страницы, статьи в wiki по ссылке из шапки и соседнюю тему "Курс молодого бойца", возможно Ваш вопрос уже рассматривался.
Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки. Помните чем подробнее вопрос, тем точнее ответ.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Азазель | Дата: Вт, 02.10.2012, 11:34 | Сообщение # 106 |
Новичок
Пользователи
Сообщений: 77
| denis2000, Да но ковырятся в СГМ не имею возможности и посмотреть скрипт. Да и там автор хозяин. Могли бы вы его скинуть ? Или написать что то подобное. Сам я не скриптер как уже говорил ранее. Насчет большого количества. Врятли. Я полностью убрал схемы апгрейдов. И продумал новую. Апгрейдов на каждый ствол будет ну максимум 3 штуки. Плюс на возможность поставить прицел или глушитель.
|
|
|
Эти 0 пользователя(ей) поблагодарили Азазель за это полезное сообщение: |
|
|
denis2000 | Дата: Вт, 02.10.2012, 20:05 | Сообщение # 107 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Азазель, Привести все функции не представляется возможным, смотрите сами, да и автор там хозяин.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Den5688 | Дата: Ср, 03.10.2012, 15:22 | Сообщение # 108 |
Удаленные
| такая проблема - у меня стоит SGM 2.2 + сборка Albor + все фиксы. у меня в игре есть любимый автомат но получаю я его где-то в середине игры а подствольник к нему я вообще не нашел. поставил повелителя зоны + чит-мод от сюда - http://sigerous.ru/forum/15-221-740554-16-1336236511 но автомата и подствольника там нет и добавлять сам пытался ( в списке объектов их тоже нет) можно ли как-то их добавить?
В каких либо 3D редакторах работаете? denis2000
|
|
|
Эти 0 пользователя(ей) поблагодарили Den5688 за это полезное сообщение: |
|
|
Red-Bull | Дата: Вс, 07.10.2012, 12:04 | Сообщение # 109 |
Командир агит отряда, Дипломат Вольных
Пользователи
Сообщений: 779
| Подскажите, что нужно изменить в скриптах, чтобы пропал выброс в ЧН?
|
|
|
Эти 0 пользователя(ей) поблагодарили Red-Bull за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 07.10.2012, 12:19 | Сообщение # 110 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Red-Bull, Попробуй в файле xr_surge_hide.script в функции surge_can_be_started(level) закоментировать строки кроме return nil. Вот так: [cut]Code function surge_can_be_started(level) --[[if levels_surge_table[level] ~= nil then local condlist = xr_logic.parse_condlist(nil, "xr_surge_hide", "condlist", levels_surge_table[level].condlist) if db.actor then local cond = xr_logic.pick_section_from_condlist(db.actor, db.actor, condlist) if cond == "true" and not surge_activated then local surge = math.random(100) if surge <= cur_prop then cur_prop = base_prop return math.random(levels_surge_table[level].surge_time-10, levels_surge_table[level].surge_time+10) else cur_prop = cur_prop + add_prop end end end end]] return nil end [/cut] Другой вариант в том же файле в таблице levels_surge_table закоментировать элементы, так как это сделано для элемента marsh - ведь на Болотах выброса нет, кроме сюжетных естественно. Вот так: [cut]Code levels_surge_table = { -- marsh = {condlist="{+mar_story_go_to_escape_done} true", surge_time=30}, -- escape = {condlist="{+esc_bring_habar_complete} true", surge_time=40}, -- garbage = {condlist="{+gar_story_got_info_from_digger -val_deliver_pda_done} true, {+agr_garbage_end} true", surge_time=45}, -- darkvalley = {condlist="{+val_deliver_pda_done} true", surge_time=45}, -- agroprom = {condlist="{+agru_go_out_end_task_complete} true", surge_time=30}, -- red_forest = {condlist="{+red_strelok_task_end -red_bridge_scene_begin} true, {+red_bridge_finished} true, {+red_bridge_actor_fail} true", surge_time=30}, -- military = {condlist="{+mil_actor_go_to_limansk} true", surge_time=30}, } [/cut]
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Red-Bull | Дата: Вс, 07.10.2012, 12:37 | Сообщение # 111 |
Командир агит отряда, Дипломат Вольных
Пользователи
Сообщений: 779
| denis2000, большое спасибо. Оба твоих варианта убирают выбросы навсегда и со всех локаций?
Да. denis2000
|
|
|
Эти 0 пользователя(ей) поблагодарили Red-Bull за это полезное сообщение: |
|
|
sergej5500 | Дата: Пн, 08.10.2012, 11:59 | Сообщение # 112 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Всем Добрый День! Возник вопрос, можно ли использовать функцию release_objects_by_section в SGM 2.2 для удаления сквадов?
Однозначно - нет! Для этого есть функция в xr_effects.script -> remove_squad(actor, obj, p) denis2000
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
ted80 | Дата: Вт, 09.10.2012, 23:08 | Сообщение # 113 |
Гражданский
Пользователи
Сообщений: 15
| Здравствуйте ! написал такой скриптик - спам - на выдачу сообщений о смерти семецкого )))
[cut noguest]--------------------------------------------------------------------------------------
-- Где умер Семецкий local gde = { "Кордон", "Свалка", "НИИ Агропром", "Подземелье НИИ Агропром", "Тёмная долина", "Лаборатория X-18", "Бар", "Дикая территория", "Арм.склады", "Янтарь", "Лаборатория X-16", "Лаборатория X-10", "Радар", "Припять", "ЧАЭС", "Саркофаг" }
-- как он умер local kak = { "Огнестрел", "Ножевое ранение", "Отравился консервами", "Умер от кровопотери", "Стая тушканов", "Умер от голода", "Умер от холода", "Интоксикация алкоголем", "Пси-излучение", "Контроллер", "Жарка", "Кровосос", "Псевдопес", "Слепой пес", "Бюрер", "Излом", "Трамплин", "Карусель", "Кисель", "Воронка", "Электра", "Псевдогигант", "Кабан", "Полтергейст", "СУИЦИД" }
local ant_spam ={ "Погиб сталкер !!! \\nИмя: Юрий Семецкий \\nГруппировка: Легенда ЗОНЫ \\nЛокация: "..gde[math.random(#gde)].." \\nПричина: "..kak[math.random(#kak)].."" }
time_news = 0
function time_update_spam() local time = time_global() if time_news < time then time_news = time + 20000 spam.update_spam() end end
function update_spam() news_manager.send_tip(db.actor, (ant_spam[math.random(#ant_spam)]), nil, nil, 15000) end[/cut]
[cut noguest=Cкриншот][/cut]
------------------------------------------------------------------------------------------------------ сообшения должны быть рандомными но меняются они только про старте игры потом это сообшение зацикливается до бесконечности ((( в чем проблем ?
Сообщение отредактировал ted80 - Вт, 09.10.2012, 23:18 |
|
|
Эти 0 пользователя(ей) поблагодарили ted80 за это полезное сообщение: |
|
|
denis2000 | Дата: Ср, 10.10.2012, 16:21 | Сообщение # 114 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| ted80, Проблема в том, что таблица ant_spam, состоит всего из одного элемента, который динамически формируется при инициализации скрипта, отсюда бесконечное количество одинаковых сообщений, а чтобы получить новое нужна новая игра (или загрузка сейва).
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Wyvern | Дата: Ср, 21.11.2012, 12:36 | Сообщение # 115 |
Гражданский
Пользователи
Сообщений: 19
| В одном из топиков возник вот такой вопрос (но кажется там это оффтоп):
Quote (harly9) Но есть одно большое НО. Если автор приближает игру к реальности, то нужно это делать во всем. Оружие не может быть с одинаковой убойностью, это НЕ РЕАЛЬНО. Это главная проблема этой (и не только) игры На самом деле человека можно надежно убить и из ПМ-а и из 12,7мм "Корда"...тут дело в другом....и я не знаю реализуемо ли это вообще Предположим, что мы делим все патроны и оружие под них на 4 группы: 1. ДО 500Дж (пистолеты и ПП) 2. От 500Дж до 1500Дж (9х39; 5,45;5,56) 3. От 1500Дж до 2500Дж (все 7,62 и дробовики) 4. Overkill свыше 2500 Дж (.308LP; 12,7; 14,5...) ПРИ ПРОБИТИИ БРОНЕЖИЛЕТА!!! назначаем каждому типу РАНДОМНЫЙ HIT 1. От 0,1 до 1,0 2. От 0,5 до 1,0 3. От 0,8 до 1,0 4. 1,0 Естетсвенно, при попадании в голову и пробитии шлЁма Hit всегда = 1,0 В идеале - величина изменяется с дистанцией.... Смысл надеюсь ясен, да?
Кажется -мне, по крайней мере -что это очень сложно в реализации...но тем не менее: как то я поправил степень изношенности брони снимаемой с трупов, что бы результат был интересней (от 0,1 до 0,99 рандомно, как я понимаю) И ОШИБСЯ: назначил меньшую величину больше большей... И начались вылеты при каждой перестрелке в пределах а_лайфа Т.е. программа каждый раз, при смерти любого НПС вычисляла какую броню может с трупа снять ГГ А ведь это и есть практически то, что надо...нет?
Добавлено (21.11.2012, 12:36) --------------------------------------------- Можно ли поставить значение hit_power = math.random(0.5,1.0)? Или через переменную? Или как? Или получится, что hit_power будет определятся случайно в начале игры?
Сообщение отредактировал Wyvern - Ср, 21.11.2012, 12:50 |
|
|
Эти 0 пользователя(ей) поблагодарили Wyvern за это полезное сообщение: |
|
|
denis2000 | Дата: Чт, 22.11.2012, 00:27 | Сообщение # 116 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Wyvern, Создатель игрового движка ограничен многими факторами: временем, бюджетом, технологиями, железом потребителей и т.п. Модостроитель же ограничен возможностями движка. В файлах *.ltx находятся константы обрабатываемые движком или скриптами. А константа в переводе с латыни - неизменное.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Wyvern | Дата: Ср, 28.11.2012, 22:01 | Сообщение # 117 |
Гражданский
Пользователи
Сообщений: 19
| Quote (denis2000) В файлах *.ltx находятся константы обрабатываемые движком или скриптами. А константа в переводе с латыни - неизменное.
Не поверите - я это знаю Просто я криво сформулировал: Как и главное где объявить новую переменную, получаемую при помощи math.random(,), назовем ее Doom, для метода hit_callbeck для подстановки в формулу для расчета урону здоровью ....
Определите переменную в своем скрипте, в котором вы планируете делать расчет урона здоровью. denis2000
Ага, спасибо. Еще вопрос: а стандартно этот скрипт существует? Если да - то где он?
Готового нет. denis2000
|
|
|
Эти 0 пользователя(ей) поблагодарили Wyvern за это полезное сообщение: |
|
|
ConstantineAO | Дата: Пн, 03.12.2012, 02:34 | Сообщение # 118 |
Гражданский
Пользователи
Сообщений: 1
| Здравствуйте! Меня интересует реально ли перенести из sigerous mod 2.2 CoP фишку с отображением надписи "Хедшот" в левом верхнем углу при выстреле врагам в голову на Сталкер ТЧ мод Нар. Солянка? Совсем недавно начал изучать скриптинг, если вам не составит труда, объясните по доходчивей где находятся нужные мне функции. Заранее благодарю.
|
|
|
Эти 0 пользователя(ей) поблагодарили ConstantineAO за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 03.12.2012, 12:58 | Сообщение # 119 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| ConstantineAO, Только начали изучать и уже беретесь за довольно сложную задачу. [cut]Смотрите как это сделано в SGM На получение повреждения НПС выдается колбек в скрипте xr_motivator.script функция function motivator_binder:hit_callback(obj, amount, local_direction, who, bone_index) из нее вызывается обработка повреждения НПС средствами SGM sgm_callbacks.on_stalker_hit(obj,amount,local_direction,who,bone_index) Аналогично для монстров скрипт bind_monster.script функция function generic_object_binder:hit_callback(obj, amount, local_direction, who, bone_index) вызов sgm_callbacks.on_monster_hit(obj,amount,local_direction,who,bone_index) В скрипте sgm_callbacks.script в функциях on_stalker_hit и on_monster_hit проверяется нанес ли повреждение ГГ в какую часть тела и т.п. Попутно решаються задачи ведения статистики и выдачи достижений, выдача же сообщения о хедшоте выдается вызовом функции congratulate_with_headshot_event("add",4500,1) из скрипта _g.script. Функция congratulate_with_headshot_event выводит сообщение, проигрывает звук и запускает таймер по окончании работы которого сообщение убирается с экрана. И это самый минимум, только во верхам. [/cut]
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
tromm | Дата: Пн, 31.12.2012, 03:08 | Сообщение # 120 |
Отмычка
Пользователи
Сообщений: 28
| denis2000 я попробовал отредактировать в файле inventory_upgrades.script функцию function how_much_repair( item_name, item_condition ) сделал так[cut noguest]local function how_much_repair( item_name, item_condition ) local ltx = system_ini() local cost = 0 local class = ltx:r_string(item_name, "class") local cof = 0.8 if class == "E_STLK" then cof = 0.5 else cof = 0.8 end return math.floor(cost*(1-item_condition)*cof) end[/cut] В игре механики стали брать 0 рублей за ремонт(но это не совсем то что я хотел), а как сделать привязку, чтобы когда гг вступает в группировку и механик данной группировки не брал денег за ремонт костюмов и оружия, а другой брал, по примеру проводников в guiders.script, там есть такие строчки[cut noguest]if actor_in_faction() == npc:character_community() then cost = 0[/cut] Только сколько я не редактировал inventory_upgrades.script, получаю вылеты[cut noguest]Expression : ai().script_engine().functor( functor_str, m_desc.functr ) Function : inventory::upgrade::Property::construct File : E:\priquel\sources\engine\xrGame\inventory_upgrade_property.cpp Line : 47 Description : Failed to get upgrade property functor in section[prop_ammo_size], functor[inventory_upgrades.property_functor_a]
[/cut] Надо как-то грамотно отредактировать этот скрипт, или может в другой какой скрипт надо использовать функцию function how_much_repair( item_name, item_condition )(я пробовал вставлять строкиif actor_in_faction() == npc:character_community() then cost = 0 в inventory_upgrades.script только этот скрипт надо похоже по другому как-то редактировать ), только не понятно что и как там менять
Всё что мы есть - это результат наших мыслей
Сообщение отредактировал tromm - Пн, 31.12.2012, 03:17 |
|
|
Эти 0 пользователя(ей) поблагодарили tromm за это полезное сообщение: |
|
|
|