Если у вас появились вопросы по применению скриптов в игре. Задавайте их в этой теме - умные головы, модосторители и просто разбирающиеся в программировании люди вам ответят.
Сборник модостроения ЗП 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 за это полезное сообщение:
sergej5500, в повелителе зоны я добавил возможность вступать в СБУ (agent), и всe группировки становятся нейтральными. Наёмники и спецназ в результате нейтралы, но у них нет диалогов привествия, типа: "Привет брат, здавия желаю и т.д." так же, как и у ренегатов с враждебными бандитами.
По поводу рассветовцев - в их диалогах у меня притензий нет, но я бы хотел добавить им диалоги как у сталкеров, типо: "Подскажи мне насчет одного дела, кто мог-бы предложить работу и т.д."
По поводу военных -я и удалял, и комментировал строчку по поводу военных в travel mаnаger, но в результате получаю вылет при попытке поговорить с ними вот в такой форме:
В ней указано, что отвечать на вопрос этой фразой могут сталкеры на Затоне (npc_community = stalker level = zaton), если не выдана инфопорция zat_b38_disappearance_stalkers_get_out_from_den_of_the_bloodsucker_give.
2. Диалоги dm_anomalies_ отвечают на вопросы об артефактах. Секция
Здравствуйте! Подскажите, пожалуйста как для inventory_box с конкретным стори_ид: 1) получить содержимое (имена секций?); 2) ограничить вместимость, например тремя штуками предметов? P.S. Помню, что где-то было что-то похожее, но найти не смог. Смотрел treasure_manager.script, ничего не понял. Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение:
sergej5500, по поводу travel_manager: Вот что оригинально
if squad ~= nil and squad:commander_id() ~= npc:id() then return false end if npc:character_community() == "bandit" then --/ SGM in --return false --/ SGM out end --/ SGM in if level.name()=="jupiter_underground" or level.name()=="agroprom_underground" or level.name()=="l04u_labx18" or level.name()=="red_forest" then return false end --/ SGM out if npc:character_community() == "army" then return false end
Вот что удалил
if squad ~= nil and squad:commander_id() ~= npc:id() then return false end if npc:character_community() == "bandit" then --/ SGM in --return false --/ SGM out end --/ SGM in if level.name()=="jupiter_underground" or level.name()=="agroprom_underground" or level.name()=="l04u_labx18" or level.name()=="red_forest" then return false --/ SGM out end
function uni_traveler_precond(actor, npc) local squad = get_object_squad(npc) if squad ~= nil and squad:commander_id() ~= npc:id() then return false end if level.name()=="jupiter_underground" or level.name()=="agroprom_underground" or level.name()=="l04u_labx18" or level.name()=="red_forest" then return false end local smart = xr_gulag.get_npc_smart(npc) if (smart) then if smart:name() == "jup_b41" then return false end end return true end
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение:
Здравствуйте! А как можно запустить функцию ПОСЛЕ закрытия инвентарного ящика? В схеме [ph_idle] параметр on_use срабатывает на открытие. Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение:
NIV, Могу предложить отслеживать закрытие окна обыска трупа/ящика. "Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение:
NIV, в файле actor_menu.script, как только вы открываете ящик,то в функции dead_body_search_wnd_opened устанавливается флаг dead_body_searching = true Как только закрываете ящик, то флаг в функции dead_body_search_wnd_closed сбрасывается в false: dead_body_searching = false Есть одно неудобство. Этот флаг также устанавливается и сбрасывается при обыске мертвых тел. А так как нам нужен только инвентарный ящик, то делаем следующее.
Добавляем в файл свой флаг, например,
open_inventory_box = false и инициализируем его в файле.
Теперь в метод action_idle:use_callback(obj, actor) в файле ph_idle.script пишем
if obj:clsid() == clsid.inventory_box then actor_menu.open_inventory_box = true end
Ящик открыт - флаг "поднят".
Теперь отследим его закрытие. Для этого в файле actor_menu.script в функции dead_body_search_wnd_closed пишем
if open_inventory_box == true then ТРА-ТА-ТА open_inventory_box = false end
Вместо ТРА-ТА-ТА Ваша функция, которая выполняется при закрытии ящика. И сброс флага в false. Терпение...... И все получится!
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение:
makdm, идея понятна, но где-то есть проблемы. Если вписать выполняемую функцию в функцию dead_body_search_wnd_closed, то она выполняется отлично. Но если сделать, как у вас, проверку на open_inventory_box == true, то она не выполняется, как будто значение флага не поменялось. Если флаг инициализировать, как true, то проверка проходит успешно. И потом, я хотел, чтобы эта функция выполнялась только при закрытии одного конкретного ящика. Пробовал менять значение флага в файле bind_physic_object.script, функция generic_physics_binder:use_callback. После слов local box_name = obj:name(), вписал
Код
if box_name == ("jup_b43_machine_inv_box") then actor_menu.open_inventory_box = true end
эффекта нет. Может у вас есть ещё идеи, где можно поменять флаг? Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение:
NIV, сами то как думаете? Если у вас флаг не принимает значение true ни в скриптах, что я вам предложил, ни в скриптах разработчиков stalkera, то возможно причина в чем-то другом? Терпение...... И все получится!
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение:
Если говорить о моих домыслах, то мне кажется, проблема в том, что каждый раз при обращении к actor_menu.script переменная open_inventory_box сбрасывается в false (при инициализации), и ей плевать на то, как её меняли в других функциях. В отличие от неё, переменная dead_body_searching принимает значение true в функции "открытие окна обыска" ВНУТРИ файла actor_menu.script, и меняется на false в функции "закрытие окна". Скорее всего, я не прав. Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение:
function destroy_object(actor, obj, p) local sobj if p == nil then sobj = alife():object(obj:id()) else if p[1] == nil or p[2] == nil then abort("Wrong parameters in destroy_object function!!!") end local target_str = nil if p[3] ~= nil then target_str = p[1].."|"..p[2]..","..p[3] else target_str = p[1].."|"..p[2] end local target_position, target_id, target_init = xr_remark.init_target(obj, target_str) if target_id == nil then printf("You are trying to set non-existant target [%s] for object [%s] in section [%s]", tostring(target_str), tostring(obj:name()), tostring(db.storage[obj:id()].active_section)) end sobj = alife():object(target_id) end if sobj == nil then return end printf("releasing object ["..sobj:name().."]") alife():release(sobj, true) end
Допустим, мы применили эту функцию к какому либо объекту. Объект удалился. При повторном вызове функции к этому же объекту следует вылет.
FATAL ERROR [error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ...les 1\Зов Припяти\gamedata\scripts\xr_effects.script:1266: attempt to index local 'obj' (a nil value) stack trace:
Строка 1266: printf("You are trying to set non-existant target [%s] for object [%s] in section [%s]", tostring(target_str), tostring(obj:name()), tostring(db.storage[obj:id()].active_section))
Возможно ли подправить функцию так, чтобы при отсутствии объекта она не давала вылетов? Допустим, что сохранение произошло сразу после удаления объекта и рестриктор еще не переключился. Тогда после загрузки сейва возможен вызов функции к уже удаленному объекту. Желательно иметь "страховку" на этот случай.
Награда: + в репутацию.
Сообщение отредактировал sergej5500 - Вт, 18.02.2014, 18:32
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: