Добро пожаловать,
Сталкер!
|
Прохождение Народная Солянка +ООП + МАК + ЧШ + Аддон Очаг Семьи
(1 чел.) (1) гость
|
Прохождение Народная Солянка +ООП + МАК + ЧШ + Аддон Очаг Семьи
27.02.2017 22:18
#220082
ПРОХОЖДЕНИЕ Народная Солянка + ООП + МАК + ЧШ + Аддон Очаг Семьи Зона Отчуждения переполнена слухами и байками о каком-то кровавом маньяке, о его злодеяниях и о его страшных тайниках... кто-то не верит и посмеивается... кто-то воспринимает эти слухи всерьез. И только Главному Герою предстоит узнать всю правду об этом страшном человеке, идти по его следам, теряя друзей и обретая новых врагов, пройти через предательство и искушение, оказаться не в выгодном свете в глазах соратников, потерять доверие Свободовцев и даже Долговцев и еще больше разозлить Слуг Монолита! Но иногда надо жертвовать репутацией, платить по счетам и крутиться, как белка в колесе, чтобы хоть на сантиметр приблизится к истине. Истина где-то рядом... но каждый раз, когда кажется, что Шахматист уже на крючке, правда ускользает от Меченого, как лесная гадюка в мокрой зеленой траве. Кто выиграет эту последнюю шахматную партию? Меченый или Шахматист? Кто чудом выживет, а кто погибнет от рук злодея? Вы это узнаете, если пройдете эту квестовую ветку, не сломаетесь и не свернете с правильного пути! ОПИСАНИЕ МОДА и ССЫЛКИ НА СКАЧИВАНИЕ
Вы сможете на Гид по Поиску Чернобыльского Шахматиста 1. Идем на разговор к Акиму, попутно говорим с Вороном и обязательно с Прапором на Свалке. Из общения со Сталкерами понимаем, что в "Баре 100 рентген", кто-то владеет более интересной и детальной информацией. 2. Идем в Бар, говорим с Фрименом, который с большого будуна и с Лысым, который не верит ни в какого Шахматиста, и понимаем, что дыма без огня не бывает, а значит в пещере что-то есть! 3. Как и у многих, у Меченого на пещеру невыносимая аллергия, но что поделать? Идти-то надо! Хорошо еще, что не в Лабиринт! 4. Идем в пещеру и в ее закоулках находим первый Диктофон Шахматиста. Вставляем его в пистолетный слот и, прослушав аудиозапись, понимаем, что надо идти к Шахтеру, который даст нам подсказку на первый тайник! 5. Идем к Шахтеру, старик рассказывает нам душещипательную историю про ностальгическое прошлое и в разговоре, сам того не понимая, намекает на местонахождение первого Тайника Шахматиста. Меченый не умеет играть в Шахматы и Шахтер рекомендует в первую очередь категорически поговорить с Костей. Тот в шахматах дока и поэтому мы направляемся к Косте на переговоры! 6. После того, как Костя соглашается вместо Меченого играть шахматную партию, идем в Центральную Припять искать злополучный первый Тайник Шахматиста! 7. В Ц.Припяти находим тайник и внимательно осматриваем его содержимое, читаем описания предметов, берем диктофон (прослушиваем) и шахматный ход (его советую брать в последнюю очередь, чтобы прочитать переговоры Меченого с Костей о дальнейших событиях на шахматной доске, в ПДА в разделе Журнал откроется новая тема "Шахматная партия"), видим непонятные предметы и среди них ПДА Костяна. Что за фокусы? Значит надо опять идти к Косте на АС, чтобы прояснить ситуацию в целом. Идем на АС к другану Косте! Справочник вылетов Вылет: 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: ...\ֽׁ+־ֿ+׳״+־קאד ׁול�ט\gamedata\scripts\amk_mod.script:2469: attempt to call field 'biodetectorRemove' (a nil value) Решение: Цитата открой файл gamegata\scripts\amk_mod.script, найди в нем строку: biodetector.biodetectorRemove() -- alen-fantom и поставьте перед ней два знака "минус": "--". Должно получиться вот так: -- biodetector.biodetectorRemove() -- alen-fantom Ну это как вариант. И прежде чем править, сохрани оригинальный файл. Вылет: FATAL ERROR
[error]Expression : no_assert
[error]Function : CXML_IdToIndex<class CPhraseDialog>::GetById
[error]File : e:\stalker\sources\trunk\xr_3da\xrgame\xml_str_id_loader.h
[error]Line : 112
[error]Description : item not found, id
[error]Arguments : history_doctor Решение: Установить чистую игру с патчем 1.0004 Вылет: FATAL ERROR
[error]Expression : no_assert
[error]Function : CALifeStoryRegistry::add
[error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\alife_story_registry.cpp
[error]Line : 30
[error]Description : Specified story object is already in the Story registry! Решение: Обычно вылет происходит при переходе между локациями. Загрузите предпоследний сейв (сейв до перехода на ту локацию, где начало вылетать с Specified story object is...) переждите выброс и тогда переходите куда вам нужно. Вылет: Expression : fatal error
Function : IRender_Visual::Load
File : E:\stalker\patch_1_0004\xr_3da\FBasicVisual.cpp
Line : 58
Description : <no expression>
Arguments : Invalid visual Причина: Ошибка модели какого-то объекта. Лечение: Найти объект и либо исправить модель, либо заменить, или же удалить сам объект. Правки Адаптация под широкоформат, 100% выпадение частей мутантов, улучшенная графика от Вспышка Правка по вылету "biodetectorRemove" Видимые телепорты Сокращено количество аномалий для слабых ПК Список квестовых предметов в аддоне Очаг семьи. Составил Старый ВНИМАНИЕ: СПОЙЛЕР!
Газовый баллон --- gas_cylinder
Газовая плита --- gas_fire
Холодильник --- household_refrigerator
Диван --- sofa_bed
Стол деревянный --- table_wooden
Стол металлический --- table_metal
Табуретка --- stool_wooden
Компьютерный стул --- stool_computer
Чайник --- green_teapot
Кастрюля --- kitchen_pan
Тарелка --- table_plate
Кружка --- alyuminivy_mug
Ложка --- alyuminivy_spoon
Телевизор Горизонт --- tv_hero
Радиоприемник Горизонт--- receiver_horizon
Кальян --- smoking_hookah
Бильярд --- billiard_table
Видеомагнитафон --- videotape_recorder
Глобус --- geography_globe
Кактус (Вазон)--- flowerpot_cactus
Книга Афоризмов --- reference_book
Видеокассета --- video_cartridge
Подушка --- sleeping_pillow
Диванная подушка --- small_pillow
Полосатый ковер --- carpet_striped
Зеленый ковер --- green_carpet
Настольная лампа --- desk_lamp
Абажур --- lamp_shade
Красная чашка --- red_cup
Женские часики --- watch_anniversary
Уголовное дело №1 --- person_underinvestigation
Записки на полях --- marginal_notes
Предупреждение --- prevention_lawyer
Тетрис --- toy_tetris
Охотничий нож --- hunting_knife
Военный планшет --- military_tablet
Шахматы --- chess_casket
Деревянная лошадка --- horse_castors
Старинная картина --- girl_picture
Часы с цепочкой --- hours_chain
Фото в рамке (Путин) --- photo_politician
Церковные иконы --- church_icon_1..._2..._3
Коллекционные монеты --- collection_coin_1....._12
Газета ТV Антенна --- publicity_material
Последняя фотография --- foto_father
Плейбой Валентайн --- playboy_12
Дополнительная ссылка на скачивание с ЯДиска Удачного прохождения! |
|
Изменено: 09.10.2020 16:57 от zima59.
|
25.05.2017 05:53
#227098
lisin, пост я удалил, потому что уже надоело говорить, что бы лог вылета скрывали спойлером. А по вылетам у тебя похоже логика рухнула. \gamedata\scripts\xr_logic.script:1513: attempt to call field '?' (a nil value) Попробуй закомментить 1513 строку в xr_logiс.script. Каким образом у тебя свободовцы стали зомби? Description : item not found, id
Arguments : warlab_u_bochek_camp_freedom6_zombi . Значит не зачищаешь Барьер наверное на АС. А там часто контролер появляется. Ищи сохранку, где этого не было и переигрывай. |
|
|
25.05.2017 08:14
#227105
zima59 , спасибо, но у меня свободовцы не зомби, а по прежнему добрые друзья .А как скрыть спойлером лог вылета ? Если честно- то не знаю.
Что бы скрыть текст под спойлер, нужно выделить текст и нажать на значок спойлер. А вылет, связанный с зомбированием одного из свободовцев возможно и рандомный, т.е. может и исчезнуть. zima59 благодарю. Два контролёра было на АС . Два ! Грохнул их - и вроде бы пока идет игра. |
|
Изменено: 25.05.2017 17:14 от zima59.
|
25.05.2017 16:54
#227135
Всем привет ! Или я и вправду не нашел, или у меня опять проблема со спавном. Не могу найти настольную лампу. Весь росток перерыл. Может после чего-то она должна появиться?
|
|
|
25.05.2017 16:56
#227136
zima59 а как бороться с таким вылетом :
ВНИМАНИЕ: СПОЙЛЕР! Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...НС+ОП+ЧШ+Очаг Семьи\gamedata\scripts\xr_logic.script:1513: attempt to call field '?' (a nil value) Ты мне отвечал " закомментить 1513"- что это означает ? Это означает, что в xr_logic.script нужно найти строку 1513 и в начале поставить -- (два тире) |
|
Изменено: 25.05.2017 17:18 от zima59.
|
25.05.2017 17:50
#227140
lisin почему -то не удаётся найти строку 1513: attempt to call field '?' (a nil value) в файле xr_logic.script. Ни с помощью программы поиска ни простым поиском . Может так быть, что его там нет ?
Сам с собой разговариваешь? Не строку с текстом attempt to call field '?' (a nil value) нужно искать, а просто строку 1513. Не забывай делать копию этого файла. Что бы потом все вернуть на место. И не делай посты подряд! Жми на кнопку ИЗМЕНИТЬ в своем посте и добавляй новую информацию. |
|
Изменено: 25.05.2017 18:59 от zima59.
|
25.05.2017 19:04
#227144
lisin, лог не может ссылаться на файл, который не существует.
1513: attempt to call field '?' (a nil value) В строке 1513 attempt to call field '?' (a nil value) не написано, это попытка вызова из другой функции. Ни с помощью программы поиска ни простым поиско Что это за программы? Скачай редактор Notepade++, открой с его помощью файл xr_logic.script и просто найди строку под номером 1513. |
|
Изменено: 25.05.2017 19:07 от Tirbah.
|
26.05.2017 16:46
#227213
Tirbah к сожалению и указанный тобой текстовой редактор сказал, что строки 1513 нет. Как быть ?
Я могу под спойлером прислать весь файл - лично я не смог найти такой строки. ВНИМАНИЕ: СПОЙЛЕР! ---------------------------------------------------------------------------------------------------- -- Script switching logic ---------------------------------------------------------------------------------------------------- -- Разработчик: Andrey Fidrya (Zmey) Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript ---------------------------------------------------------------------------------------------------- --[ ---------------------------------------------------------------------------------------------------- -- ФУНКЦИИ, КОТОРЫЕ РАЗРЕШЕНО ВЫЗЫВАТЬ ИЗ ДРУГИХ СКРИПТОВ ---------------------------------------------------------------------------------------------------- Активация схем производится с помощью функций: function gulag_activate(npc, ini, section, gulag_name, death, combat, actor_dialogs, trade, hit) Предназначение: активирует заданную схему, используется схемой гулаг. Тип скрипта определяется автоматически по имени секции. Здесь: npc - персонаж, для которого будет активирована схема ini - его customdata section - имя секции, которая должна быть активирована gulag_name - имя гулага, которое будет добавлено спереди к именам путей death, combat, actor_dialogs, trade, hit - имена секций, задающих поведение при смерти и в бою function assign_storage_and_bind(npc, ini, scheme, section) Предназначение: Вызывает функцию add_to_binder схемы, а также создает (если его еще нет) и возвращает ссылку на storage для схемы. Примечание: в storage при этом могут оставаться старые данные, схема должна очистить его самостоятельно. function subscribe_action_for_events(npc, storage, new_action) Предназначение: Регистрирует класс для получения нотификаций о таких событиях как сброс схемы, сохранение и т.д. Класс реализует соответствующие функции (reset_scheme() и т.д.), которые будут вызываться из xr_logic в нужные моменты. function pick_section_from_condlist(actor, npc, condlist) Предназначение: Проверяет условия condlist, и если они успешны - ставит указанные infoportions и возвращает текст. Если условия не выполняются - возвращает nil. function try_switch_to_another_section(npc, st, actor) Предназчанение: Используя настройки xr_logic из storage персонажа, пытается переключить его на другую схему, если хоть одно из условий переключения сработало. Обычно вызывается из метода update класса персонажа. function is_active(npc, st) Предназначение: Вызывается из evaluator-а (или в самом начале update у предметов и монстров) для проверки, что данная схема сейчас активна (схема определяется по данным в storage). function cfg_get_switch_conditions(ini, section, npc) Предназначение: Считывает все возможные условия переключения схем. function parse_condlist(npc, section, field, src) Предназначение: Распарсивает условия вида: {+infop1} section1 %-infop2%, {+infop3 -infop4} section2 ... в таблицу. Параметры section и field используются только в сообщениях об ошибках. Если строка src считана не из файла, а передается в эту функцию гулагом, то нужно задать следующие параметры: --]] -- section = "[[gulag_tasks.script]]]" -- field = "[[gulag_name=имя_гулага]]]" --[ ---------------------------------------------------------------------------------------------------- -- ПРИВАТНЫЕ ФУНКЦИИ ---------------------------------------------------------------------------------------------------- function activate_by_section(npc, ini, section, loading) Предназначение: Активирует указанную секцию. Если в данный момент какая-либо секция уже активирована, сообщает об ошибке. function switch_to_section(npc, st, section) Предназначение: Выполняет переключение с одной секции на другую, если новая секция не nil. Если же она nil, остается активной старая секция. function abort_syntax_error_in_cond(npc, section, field) Предназначение: Сообщает о синтаксической ошибке в условиях переключения схем секции section и поля field, и останавливает игру. function parse_infop(rslt, str) Предназначение: Распарсивает условия вида " +infop1 =func -infop2 " и т.д. (все не перечислены) в таблицу. function cfg_get_number_and_condlist(ini, section, field, npc) function cfg_get_string_and_condlist(ini, section, field, npc) function cfg_get_condlist(ini, section, field, npc) Предназначение: Считывает из customdata различные условия переключения схем. function add_condition(lst, at, cond) Предназначение: Добавляет условие в список условий переключения схем. function cfg_get_overrides(ini, section, npc) Предназначение: Считывает настройки для схем общего поведения. function generic_scheme_overrides(npc) Предназначение: Возвращает ссылку на настройки схем общего поведения, актуальные для работающей в данный момент схемы, либо nil, если ни одна из секций не активна, либо настройки не заданы. --]] --[ -- Предназначение: -- вызывается при включении набора скриптов через секцию logic у персонажа. Если в секции logic присутствует только -- поле cfg, использует конфигурационный файл, заданный в этом поле, и возвращает новый ini file. -- Здесь: -- npc - персонаж, для которого будет активирована схема -- ini - его customdata -- stype - тип скрипта. Поскольку имя секции все еще неизвестно, его нужно задавать явно. Допустимые значения -- перечислены в файле modules.script. -- section - имя секции logic -- gulag_name - имя гулага, если скрипт включается гулагом, а не биндером --]] local tabl_netpda_varnames={ -- Proper70 Strelok ["s_teleport0_1"] = true, ["s_teleport1_2"] = true, --["s_teleport1_3_1"] = true, --["s_teleport1_3_2"] = true, --["s_teleport1_4"] = true, --["s_teleport1_5"] = true, ["s_teleport3_2"] = true, ["s_teleport4_1"] = true, -- Proper70 kostya ["t_teleport1_1"] = true, --["t_teleport1_2"] = true, --["t_teleport4_1"] = true, --["x_teleport1"] = true, --["x_teleport2"] = true, --["x_teleport3"] = true, --["x_teleport3_1"] = true, --["x_teleport3_2"] = true, --["x_teleport3_3"] = true, -- Proper70 end -- Proper72 K ["val_teleport_1"] = true, -- Proper72 end ["m_teleport_6"] = true, ["m_teleport_26"] = true, ["m_teleport_35"] = true, ["m_teleport_36"] = true, ["m_teleport_37"] = true, ["m_teleport_38"] = true, ["m_teleport_39"] = true, ["m_teleport_40"] = true, ["m_teleport_41"] = true, ["m_teleport_42"] = true, ["m_teleport_43"] = true, ["m_teleport_44"] = true, ["m_teleport_45"] = true, ["m_teleport_46"] = true, ["m_teleport_47"] = true, ["m_teleport_48"] = true, ["m_teleport_49"] = true, ["m_teleport_50"] = true, ["m_teleport_51"] = true, ["m_teleport_52"] = true, ["m_teleport_53"] = true, ["m_teleport_54"] = true, ["gps_labels"] = true, ["lim_zone_teleport1"] = true, ["lim_zone_teleport2"] = true, ["zone_teleport_new"] = true, ["zone_teleport_new_out"] = true, ["flame_start"] = true, ["flame_reload"] = true, ["flame_reload_count"] = true, ["sak_teleport"] = true, ["glushitel_reload"] = true, ["repair_box"] = true, ["repair_item_outfit"] = true, ["repair_item_weapon"] = true, --[["af_simbion_activation"] = true, ["artmod_activation_info_artmod_electra_flash_zharka"] = true, ["artmod_activation_info_artmod_ameba_slime_zharka"] = true, ["artmod_activation_info_artmod_gravi_zharka"] = true, ["artmod_activation_info_artmod_night_star_zharka"] = true, ["artmod_activation_info_artmod_electra_moonlight_zharka"] = true, ["artmod_activation_info_artmod_dummy_battery_zharka"] = true, ["artmod_activation_info_artmod_fireball_galant"] = true, ["artmod_activation_info_artmod_cristall_flower_galant"] = true, ["artmod_activation_info_artmod_ameba_mica_galant"] = true, ["artmod_activation_info_artmod_electra_moonlight_galant"] = true, ["artmod_activation_info_artmod_gold_fish_galant"] = true, ["artmod_activation_info_artmod_dummy_spring_galant"] = true, ["artmod_activation_info_artmod_medusa_galant"] = true, ["artmod_activation_info_artmod_rusty_kristall_buzz"] = true, ["artmod_activation_info_artmod_rusty_thorn_buzz"] = true, ["artmod_activation_info_artmod_fireball_buzz"] = true, ["artmod_activation_info_artmod_cristall_buzz"] = true, ["artmod_activation_info_artmod_night_star_buzz"] = true, ["artmod_activation_info_artmod_fuzz_kolobok_buzz"] = true, ["artmod_activation_info_artmod_vyvert_buzz"] = true, ["artmod_activation_info_artmod_cristall_flower_mincer"] = true, ["artmod_activation_info_artmod_drops_mincer"] = true, ["artmod_activation_info_artmod_rusty_kristall_mincer"] = true, ["artmod_activation_info_artmod_electra_moonlight_mincer"] = true, ["artmod_activation_info_artmod_ameba_slug_mincer"] = true, ["artmod_activation_info_artmod_dummy_glassbeads_mincer"] = true, ["artmod_activation_info_artmod_mincer_meat_mosquito_bald"] = true, ["artmod_activation_info_artmod_electra_sparkler_mosquito_bald"] = true, ["artmod_activation_info_artmod_ameba_slug_mosquito_bald"] = true, ["artmod_activation_info_artmod_cristall_mosquito_bald"] = true, ["artmod_activation_info_artmod_rusty_sea-urchin_mosquito_bald"] = true, ["artmod_activation_info_artmod_dummy_dummy_mosquito_bald"] = true, ["artmod_activation_info_artmod_ameba_slug_gravi_zone"] = true, ["artmod_activation_info_artmod_ameba_slime_gravi_zone"] = true, ["artmod_activation_info_artmod_electra_flash_gravi_zone"] = true, ["artmod_activation_info_artmod_night_star_gravi_zone"] = true, ["artmod_activation_info_artmod_soul_gravi_zone"] = true, ["artmod_activation_info_artmod_dummy_pellicle_gravi_zone"] = true, ["artmod_activation_life_heart_final"] = true]] } function configure_schemes(npc, ini, ini_filename, stype, section_logic, gulag_name) --printf("DEBUG: enable_scripts: npc:name()=%s", npc:name()) local npc_id = npc:id() local st = db.storage[npc_id] -- если какая-то схема была до этого активна, деактивировать её if st.active_section then issue_event(npc, st[st.active_scheme], "deactivate", npc) end local actual_ini local actual_ini_filename if not ini:section_exist(section_logic) then if not gulag_name then -- Общие схемы должны работать и без logic: actual_ini_filename = ini_filename actual_ini = ini -- персонаж не обязательно должен иметь секцию logic else -- Иначе это персонаж Gulag-а и ему не задали работу: abort("ERROR: object '%s': unable to find section '%s'", npc:name(), section_logic) end else local filename = utils.cfg_get_string(ini, section_logic, "cfg", npc, false, "") if filename then printf("_bp: enable_scripts: object '%s' has external configuration file '%s'", npc:name(), filename) -- Рекурсивно обработать конфигурационный файл, на который ссылается поле cfg actual_ini_filename = filename actual_ini = ini_file(filename) return configure_schemes(npc, actual_ini, actual_ini_filename, stype, section_logic, gulag_name) --[ if actual_ini:line_count(section_logic) == 0 then abort("file '%s' does not exist or is empty, or has no section '%s'", filename, section_logic) end --]] else printf("_bp: enable_scripts: object '%s' has NO external configuration file, using '%s'", npc:name(), ini_filename) actual_ini_filename = ini_filename actual_ini = ini end end -- Поскольку в момент активации схемы могли работать ранее установленные общие схемы, нужно их все отключить: disable_generic_schemes(npc, stype) -- Включаем все общие схемы (раненный, коллбек на попадание и т.д.): enable_generic_schemes(actual_ini, npc, stype, section_logic) -- Инициализация торговли if stype == modules.stype_stalker or npc:clsid() == clsid.script_trader then local trade_ini = utils.cfg_get_string(actual_ini, section_logic, "trade", npc, false, "", "misc\\trade_generic.ltx") trade_manager.trade_init(npc, trade_ini) end st.active_section = nil st.active_scheme = nil if gulag_name then st.gulag_name = gulag_name else st.gulag_name = "" end st.stype = stype st.ini = actual_ini st.ini_filename = actual_ini_filename st.section_logic = section_logic return st.ini end -- Вызывается биндером с целью определить первую активную схему function determine_section_to_activate(npc, ini, section_logic, actor) if not ini:section_exist(section_logic) then return "nil" end -- Распарсить строку выбора активной секции с учетом команд, заключенных в %% local active_section_cond = cfg_get_condlist(ini, section_logic, "active", npc) local active_section if not active_section_cond then abort("object '%s': section '%s': unable to find field 'active'", npc:name(), section_logic) else active_section = pick_section_from_condlist(actor, npc, active_section_cond.condlist) if not active_section then abort("object '%s': section '%s': section 'active' has no conditionless else clause", npc:name(), section_logic) end end if active_section and db.storage[npc:id()].stype and db.storage[npc:id()].stype<=1 and db.storage[npc:id()].stype~=stypes[utils.get_scheme_by_section(active_section)] then -- Блокируем активацию схемы для зверушек в человеческих гулагах. Dirty Hack. return "nil" else return active_section end end ------------------------------------------------------------------------------------------------------------ -- ВНОСЯ ИЗМЕНЕНИЯ В ЭТУ ФУНКЦИЮ, НЕ ЗАБЫВАЙТЕ ДОБАВЛЯТЬ СООТВЕТСТВУЮЩИЕ СТРОКИ И В enable_generic_schemes ------------------------------------------------------------------------------------------------------------ function disable_generic_schemes(npc, stype) if stype == modules.stype_stalker then xr_combat.disable_scheme(npc, "combat") if xrs_ai then xrs_ai.disable_schemes(npc, stype) end if rx_ai then rx_ai.disable_schemes(npc, stype) end xr_use.disable_scheme(npc, "use") xr_hit.disable_scheme(npc, "hit") xr_meet.disable_scheme(npc, "actor_dialogs") xr_heli_hunter.disable_scheme(npc, "heli_hunter") xr_combat_ignore.disable_scheme(npc, "combat_ignore") elseif stype == modules.stype_mobile then mob_combat.disable_scheme(npc, "mob_combat") mob_trade.disable_scheme(npc, "mob_trade") elseif stype == modules.stype_item then ph_on_hit.disable_scheme(npc, "ph_on_hit") elseif stype == modules.stype_heli then xr_hit.disable_scheme(npc, "hit") end end ------------------------------------------------------------------------------------------------------------ -- ВНОСЯ ИЗМЕНЕНИЯ В ЭТУ ФУНКЦИЮ, НЕ ЗАБЫВАЙТЕ ДОБАВЛЯТЬ СООТВЕТСТВУЮЩИЕ СТРОКИ И В disable_generic_schemes ------------------------------------------------------------------------------------------------------------ function enable_generic_schemes(ini, npc, stype, section) if stype == modules.stype_stalker then if blowout_scheme then blowout_scheme.set_hide(npc,ini,"blowout_scheme",section) end --xr_reactions.set_reactions(npc, ini, "reactions", section) xr_danger.set_danger(npc, ini, "danger", "danger") local combat_section = utils.cfg_get_string(ini, section, ">, А НЕ >=, потому что оно составляет пару с on_actor_dist_le, где <= if see_actor(npc) and distance_between(actor, npc) > c.v1 then --printf("_bp: conditions met") switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist)) end elseif cond_name(c.name, "on_actor_dist_ge_nvis") then -- ТУТ УМЫШЛЕННО >, А НЕ >=, потому что оно составляет пару с on_actor_dist_le_nvis, где <= if distance_between(actor, npc) > c.v1 then switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist)) end elseif cond_name(c.name, "on_signal") then --printf("_bp: on_signal (c.v1 = %s)", c.v1) if st.signals and st.signals[c.v1] then printf("_bp: on_signal (c.v1 = %s) signalled [%s]", c.v1, npc:name()) --printf("_bp: signalled") switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist)) end -- FIXME: не дублировать тут имена, оставить один on_info, но добавлять несколько его экземпляров в список elseif cond_name(c.name, "on_info") then switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist)) elseif cond_name(c.name, "on_timer") then --printf("_bp: on_timer: %d >= %d", time_global(), -- db.storage[npc_id].activation_time + c.v1) if time_global() >= db.storage[npc_id].activation_time + c.v1 then switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist)) end -- GAMETIME added by Stohe. elseif cond_name(c.name, "on_game_timer") then if game.get_game_time():diffSec(db.storage[npc_id].activation_game_time) >= c.v1 then switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist)) end elseif cond_name(c.name, "on_actor_in_zone") then if utils.npc_in_zone(actor, db.zone_by_name[c.v1]) then switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist)) end elseif cond_name(c.name, "on_actor_not_in_zone") then if not utils.npc_in_zone(actor, db.zone_by_name[c.v1]) then switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist)) end elseif cond_name(c.name, "on_npc_in_zone") then if utils.npc_in_zone(level.object_by_id(c.npc_id), db.zone_by_name[c.v2]) then switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist)) end elseif cond_name(c.name, "on_npc_not_in_zone") then if not utils.npc_in_zone(level.object_by_id(c.npc_id), db.zone_by_name[c.v2]) then switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist)) end elseif cond_name(c.name, "on_actor_inside") then if utils.npc_in_zone(actor, npc) then -- printf("_bp: TRUE") switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist)) end elseif cond_name(c.name, "on_actor_outside") then if not utils.npc_in_zone(actor, npc) then switched = switch_to_section(npc, st, pick_section_from_condlist(actor, npc, c.condlist)) end else abort( "WARNING: object '%s': try_switch_to_another_section: unknown condition '%s' encountered", npc:name(), c.name) end if switched then --printf("_SWITCHED") break end end return switched end function is_active(npc, st) if st.section == nil then abort("npc '%s': st.section is nil, active section is '%s'", npc:name(), utils.to_str(db.storage[npc:id()].active_section)) end local is_act = (st.section == db.storage[npc:id()].active_section) -- Текущая секция активна и не сработало ни одно из условий переключения на другие секции return is_act end function abort_syntax_error_in_cond(npc, section, field) abort("object '%s': section '%s': field '%s': syntax error in switch condition", npc:name(), section, field) end -- На входе имеем пустой массив и строку вида " +infop1 -infop2 +infop3 ... " -- Заполнить массив: -- { "infop_name" = true/false }. function parse_infop1(rslt, str) --printf("_bp: parse_infop: %s", utils.to_str(str)) if str then local infop_name, sign local infop_n = 1 for s in string.gfind(str, "%s*([%-%+%~%=%!][^%-%+%~%=%!%s]+)%s*") do --printf("_bp: parse_infop: s=%s", utils.to_str(s)) sign = string.sub(s, 1, 1) infop_name = string.sub(s, 2) if sign == "+" then rslt[infop_n] = { name = infop_name, required = true } elseif sign == "-" then rslt[infop_n] = { name = infop_name, required = false } elseif sign == "~" then rslt[infop_n] = { prob = tonumber(infop_name) } elseif sign == "=" then rslt[infop_n] = { func = infop_name, expected = true } elseif sign == "!" then rslt[infop_n] = { func = infop_name, expected = false } else abort_syntax_error_in_cond(npc, section, field) end infop_n = infop_n + 1 end end end function parse_func_params(str) local lst = {} local n for par in string.gfind(str, "%s*([^:]+)%s*") do n = tonumber(par) if n then table.insert(lst, n) else table.insert(lst, par) end end return lst end function parse_infop(rslt, str) --printf("_bp: parse_infop1: %s", utils.to_str(str)) if str then local infop_name, sign local infop_n = 1 local at, params for s in string.gfind(str, "%s*([%-%+%~%=%!][^%-%+%~%=%!%s]+)%s*") do --printf("_bp: parse_infop: s=%s", utils.to_str(s)) sign = string.sub(s, 1, 1) infop_name = string.sub(s, 2) params = nil -- парсим параметры функций at = string.find(infop_name, "%(") if at then if string.sub(infop_name, -1) ~= ")" then abort("wrong condlist %s", str) end if at < string.len(infop_name) - 1 then params = parse_func_params(string.sub(infop_name, at + 1, -2)) else params = {} end infop_name = string.sub(infop_name, 1, at - 1) end if sign == "+" then rslt[infop_n] = { name = infop_name, required = true } elseif sign == "-" then rslt[infop_n] = { name = infop_name, required = false } elseif sign == "~" then rslt[infop_n] = { prob = tonumber(infop_name) } elseif sign == "=" then --printf("_bp: n = %s; r = %s", infop_name, utils.to_str(params)) rslt[infop_n] = { func = infop_name, expected = true, params = params } elseif sign == "!" then --printf("_bp: n = %s; r = %s", infop_name, utils.to_str(params)) rslt[infop_n] = { func = infop_name, expected = false, params = params } else abort_syntax_error_in_cond(npc, section, field) end infop_n = infop_n + 1 end end end -- Распарсивает строку src вида: -- {+infop1} section1 %-infop2%, {+infop3 -infop4} section2 ... -- в таблицу: -- { -- 1 = { infop_check = { 1 = {"infop1" = true} }, infop_set = { 1 = {"infop2" = false } }, section = "section1" }, -- 2 = { infop_check = { 1 = {"infop3" = true}, 2 = {"infop4" = false} }, infop_set = {}, section = "section2" }, -- } function parse_condlist(npc, section, field, src) local lst = {} -- 1) Разбиваем на разделенные запятыми части: local at, to, infop_check_lst, remainings, infop_set_lst, newsect --printf("_bp: src = %s", src) local n = 1 for fld in string.gfind(src, "%s*([^,]+)%s*") do -- Здесь fld это набор infoportions в {} и имя секции, на которую переключиться. lst[n] = {} --printf("_bp: iter %d: fld = %s", n, fld) -- Выделяем список infoportions для проверки: at, to, infop_check_lst = string.find(fld, "{%s*(.*)%s*}") if infop_check_lst then --printf("_bp: infop_check_lst: [%s]", infop_check_lst) -- Выделяем оставшуюся часть поля, т.е. имя секции плюс список infoportions для установки: remainings = string.sub(fld, 1, at - 1) .. string.sub(fld, to + 1) else -- Список infoportions для проверки не был задан, следовательно, ничего не удаляем: remainings = fld end --printf("_bp: remainings: %s", remainings) -- Выделяем список infoportions для установки из remainings: at, to, infop_set_lst = string.find(remainings, "%%%s*(.*)%s*%%") if infop_set_lst then -- Выделяем оставшуюся часть поля, т.е. имя секции: newsect = string.sub(remainings, 1, at - 1) .. string.sub(remainings, to + 1) else -- Список infoportions для установки не был задан, следовательно, remainings и есть имя секции. newsect = remainings end --printf("_bp: newsect: %s", newsect) -- И сразу trim имя секции: at, to, newsect = string.find(newsect, "%s*(.*)%s*") if not newsect then abort_syntax_error_in_cond(npc, section, field) end -- Имя секции теперь можно сохранить: lst[n].section = newsect -- Теперь нужно распарсить infoportions в строке infop_check_lst и -- заполнить массив infop_check: { "infop_name" = true/false }. -- На входе имеем строку вида " +infop1 -infop2 +infop3 ... " lst[n].infop_check = {} parse_infop(lst[n].infop_check, infop_check_lst) -- То же самое для устанавливаемых infoportions: lst[n].infop_set = {} parse_infop(lst[n].infop_set, infop_set_lst) n = n + 1 end return lst end function cfg_get_number_and_condlist(ini, section, field, npc) local str = utils.cfg_get_string(ini, section, field, npc, false, "") if not str then return nil end local par = utils.parse_params(str) if not par[1] or not par[2] then abort_syntax_error_in_cond(npc, section, field) end local t = {} t.name = field t.v1 = tonumber(par[1]) t.condlist = parse_condlist(npc, section, field, par[2]) return t end function cfg_get_string_and_condlist(ini, section, field, npc) local str = utils.cfg_get_string(ini, section, field, npc, false, "") if not str then return nil end local par = utils.parse_params(str) if not par[1] or not par[2] then abort_syntax_error_in_cond(npc, section, field) end local t = {} t.name = field t.v1 = par[1] t.condlist = parse_condlist(npc, section, field, par[2]) return t end function cfg_get_two_strings_and_condlist(ini, section, field, npc) local str = utils.cfg_get_string(ini, section, field, npc, false, "") if not str then return nil end local par = utils.parse_params(str) if not par[1] or not par[2] or not par[3] then abort_syntax_error_in_cond(npc, section, field) end local t = {} t.name = field t.v1 = par[1] t.v2 = par[2] t.condlist = parse_condlist(npc, section, field, par[3]) return t end function cfg_get_condlist(ini, section, field, npc) local str = utils.cfg_get_string(ini, section, field, npc, false, "") if not str then return nil end local par = utils.parse_params(str) if not par[1] then abort_syntax_error_in_cond(npc, section, field) end local t = {} t.name = field t.condlist = parse_condlist(npc, section, field, par[1]) return t end function add_condition(lst, at, cond) if cond then lst[at] = cond return at + 1 end return at end function cfg_get_switch_conditions(ini, section, npc) local l = {} local t local n = 1 local function add_conditions(func, cond) local i = 1 local c = func(ini, section, cond, npc) while c ~= nil do n = add_condition(l, n, c, npc) i = i + 1 c = func(ini, section, cond..i, npc) end end add_conditions( cfg_get_number_and_condlist, "> 10 and tostring(obj:name()) ~= "single_player" and npc_id ~= db.actor:id() and npc_id~=netpacket_pda_create.create_pda() then -- максимум 10 итераций - у неписей пишется 5 переменных, у техники - 7, пусть 10 будет -- если у вас в пстор что-то свое пишется, ориентируйтесь на свои значения -- и обязательно убираем из проверки актора - у него очень толстый пстор, и к тому же -- если уж поврежденным будет его пстор, то тут точно уже ничего не поможет remove_zavis.remove_obj(obj) ctr = 0 end for i = 1, ctr do local varname = reader:r_stringZ() local tn = reader:r_u8() if tn == pstor_number then pstor[varname] = reader:r_float() elseif tn == pstor_string then pstor[varname] = reader:r_stringZ() elseif tn == pstor_boolean then pstor[varname] = reader:r_bool() elseif tn == pstor_custom then local classname = reader:r_stringZ() if classname == "" then classname = varname -- pstor[varname] = nil end if pstor ~= nil then pstor[varname] = pstor_custom_impl[classname]() pstor[varname]:load(reader) else local text = obj:name().." id: "..npc_id.." ctr: "..tonumber(ctr).." i="..i.." pstor_custom пуст!" get_console():execute("load ~#I#: pstor==nil:"..string.format(text)) end else -- не надо пытаться вылетать - просто не пишем поврежденные данные -- при этом обязательно удалять саму переменную - в результате записи -- мусора в пстор одно только ее название может повесить загрузку pstor[varname] = nil end end end function save_obj(obj, packet) printf("save_obj: obj:name()='%s'", obj:name()) local npc_id = obj:id() local st = db.storage[npc_id] printf("save_obj: ini_filename='%s'", utils.to_str(st.ini_filename)) printf("save_obj: section_logic='%s'", utils.to_str(st.section_logic)) printf("save_obj: active_section='%s'", utils.to_str(st.active_section)) printf("save_obj: gulag_name='%s'", utils.to_str(st.gulag_name)) if st.ini_filename then packet:w_stringZ(st.ini_filename) else packet:w_stringZ("") end if st.section_logic then packet:w_stringZ(st.section_logic) else packet:w_stringZ("") end if st.active_section then packet:w_stringZ(st.active_section) else packet:w_stringZ("") end --if st.active_scheme then -- packet:w_stringZ(st.active_scheme) --else -- packet:w_stringZ("") --end if st.gulag_name then packet:w_stringZ(st.gulag_name) else packet:w_stringZ("") end --packet:w_s32(st.stype) save_logic(obj, packet) if st.active_scheme then issue_event(obj, db.storage[npc_id][st.active_scheme], "save") end pstor_save_all(obj, packet) end function load_obj(obj, reader) printf("load_obj: obj:name()='%s'", obj:name()) local npc_id = obj:id() local st = db.storage[npc_id] local ini_filename = reader:r_stringZ() if ini_filename == "" then ini_filename = nil end local section_logic = reader:r_stringZ() if section_logic == "" then section_logic = nil end local active_section = reader:r_stringZ() if active_section == "" then -- В activate_by_section нужно передать строку "nil", а не nil, чтобы не активировать ни одной из схем. -- При этом реальная active_section станет равной nil. active_section = "nil" end --local active_scheme = reader:r_stringZ() --if active_scheme == "" then -- active_scheme = nil --end local gulag_name = reader:r_stringZ() if gulag_name == "" then gulag_name = nil end --local stype = reader:r_s32() st.loaded_ini_filename = ini_filename st.loaded_section_logic = section_logic st.loaded_active_section = active_section --st.loaded_active_scheme = active_scheme st.loaded_gulag_name = gulag_name --st.loaded_stype = stype printf("load_obj: ini_filename='%s'", utils.to_str(st.loaded_ini_filename)) printf("load_obj: section_logic='%s'", utils.to_str(st.loaded_section_logic)) printf("load_obj: active_section='%s'", utils.to_str(st.loaded_active_section)) --printf("load_obj: active_scheme='%s'", utils.to_str(st.loaded_active_scheme)) printf("load_obj: gulag_name='%s'", utils.to_str(st.loaded_gulag_name)) load_logic(obj, reader) pstor_load_all(obj, reader) end function get_customdata_or_ini_file(npc, filename) -- printf( "get_customdata_or_ini_file: filename=%s", filename ) if filename == "<customdata>" then local ini = npc:spawn_ini() if ini then return ini else return ini_file([scripts\dummy.ltx]]) end elseif string.find( filename, "*" ) == 1 then -- динамический ltx local p = string.find( filename, "*", 2 ) return gulag_tasks.loadLtx( string.sub(filename, 2, p-1), string.sub(filename, p+1) ) else return ini_file(filename) end end function initialize_obj(obj, st, loaded, actor, stype, inifile) if not loaded then local ini_filename = inifile or "<customdata>" local ini = get_customdata_or_ini_file(obj, ini_filename) ini = xr_logic.configure_schemes(obj, ini, ini_filename, stype, "logic", nil) local sect = xr_logic.determine_section_to_activate(obj, ini, "logic", actor) xr_logic.activate_by_section(obj, ini, sect, false) else local ini_filename = st.loaded_ini_filename if ini_filename then local ini = get_customdata_or_ini_file(obj, ini_filename) ini = xr_logic.configure_schemes(obj, ini, ini_filename, stype, st.loaded_section_logic, st.loaded_gulag_name) printf( "initialize_obj: loaded" ) xr_logic.activate_by_section(obj, ini, st.loaded_active_section, true) end -- if st.active_scheme then -- issue_event(obj, db.storage[obj:id()][st.active_scheme], "load") -- end end end |
|
Изменено: 26.05.2017 17:49 от lisin.
|
26.05.2017 17:07
#227214
Всем привет. Скажите, при установке правки Уменьшенное количество аномалий для стареньких ПК, новая игра нужна?.
|
|
|
26.05.2017 17:22
#227215
lisin, хм, странно... Выложи файл xr_logic.script.
Stalker79, привет, там ридми нет? Обычно НИ нужна, если в правке затрагивается all.spawn. Кто правку делал? -------------------------------------- указанный тобой текстовой редактор сказал, что строки 1513 нет. Ну как нет, если есть ВНИМАНИЕ: СПОЙЛЕР! -------------------------------------- Stalker79, я не особо разбираюсь в скриптах, но, судя по правке, не нужна. _______________________ pstor[varname] = pstor_custom_impl[classname]() lisin, эта строка, она есть в коде, который ты выложил. |
|
Изменено: 26.05.2017 18:40 от Tirbah.
|
26.05.2017 17:42
#227217
Бродяги. Помогите. Не нашел 15-ю часть карты коллекционера. Некоторое время не играл а эту Соль, дошел до поисков записок Шахматиста и больше не играл. Сейчас возобновил дальнейшее прохождение, кое-что забыл. Части карты искал по видео и Ютуба. Дошёл до Юпитера, Затона, но там ничего нет. Ранее пост выкладывал. По сюжету на Затоне и Юпитере их нет. Что и где я мог пропустить?... Сейв не всякий случай выкладываю.
ВНИМАНИЕ: СПОЙЛЕР! Tirbah Ридми нет. Правку взял в шапке темы. |
|
Изменено: 26.05.2017 18:57 от Stalker79.
|
|
Время создания страницы: 0.85 секунд