Прохождение Народная Солянка +ООП + МАК + ЧШ + Аддон Очаг Семьи
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- lisin
- Не в сети
- ОПЫТНЫЙ
- Сообщений: 247
- Спасибо получено: 41
Function : CXML_IdToIndex<class CSpecificCharacter>::GetById
File : e:\stalker\patch_1_0004\xr_3da\xrgame\xml_str_id_loader.h
Line : 112
Description : item not found, id
Arguments : warlab_u_bochek_camp_freedom6_zombi
Заранее куча благодарностей ! Lisin.
Ещё такой вопрос : в видеопрохождении есть эпизод, когда спасена Эльза и ГГ идет на Янов, чтобы встретиться с Затворником, вроде бы на него указывал Каланча. В диалоге с Каланчой я ничего такого не встретил и на Янове пусто. Может быть, я где - то нарушил логику игры ?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- ebbot
- Не в сети
- ЗНАТОК ЗОНЫ
- Сообщений: 254
- Спасибо получено: 202
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- fedul
- Не в сети
- ПРИБЫВШИЙ
- Сообщений: 25
- Спасибо получено: 2
Смотри за цистерной, которая рядом с разломом.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- sergeus
- Не в сети
- НОВИЧОК
- Сообщений: 81
- Спасибо получено: 122
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- zima59
- Не в сети
- МОДЕРАТОР
- ЛЕГЕНДА ЗОНЫ
- Сообщений: 4513
- Спасибо получено: 29729
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- fruktosha
- Не в сети
- ОПЫТНЫЙ
- Сообщений: 204
- Спасибо получено: 61
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\rx_wmgr.script:587: C stack overflow
Попробовал через АС на ДТ, тоже вылет, но уже лог другой.
Function : CALifeSwitchManager::add_online
File : E:\stalker\patch_1_0004\xr_3da\xrGame\alife_switch_manager.cpp
Line : 64
Description : Invalid vertex for object
Arguments : wpn_lr30033811
Что это значит?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- zima59
- Не в сети
- МОДЕРАТОР
- ЛЕГЕНДА ЗОНЫ
- Сообщений: 4513
- Спасибо получено: 29729
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- lisin
- Не в сети
- ОПЫТНЫЙ
- Сообщений: 247
- Спасибо получено: 41
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- zima59
- Не в сети
- МОДЕРАТОР
- ЛЕГЕНДА ЗОНЫ
- Сообщений: 4513
- Спасибо получено: 29729
Arguments : warlab_u_bochek_camp_freedom6_zombi . Значит не зачищаешь Барьер наверное на АС. А там часто контролер появляется. Ищи сохранку, где этого не было и переигрывай.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- lisin
- Не в сети
- ОПЫТНЫЙ
- Сообщений: 247
- Спасибо получено: 41
Что бы скрыть текст под спойлер, нужно выделить текст и нажать на значок спойлер. А вылет, связанный с зомбированием одного из свободовцев возможно и рандомный, т.е. может и исчезнуть.
zima59 благодарю. Два контролёра было на АС . Два ! Грохнул их - и вроде бы пока идет игра.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- ebbot
- Не в сети
- ЗНАТОК ЗОНЫ
- Сообщений: 254
- Спасибо получено: 202
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- lisin
- Не в сети
- ОПЫТНЫЙ
- Сообщений: 247
- Спасибо получено: 41
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 и в начале поставить -- (два тире)
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- lisin
- Не в сети
- ОПЫТНЫЙ
- Сообщений: 247
- Спасибо получено: 41
Сам с собой разговариваешь? Не строку с текстом attempt to call field '?' (a nil value) нужно искать, а просто строку 1513. Не забывай делать копию этого файла. Что бы потом все вернуть на место. И не делай посты подряд! Жми на кнопку ИЗМЕНИТЬ в своем посте и добавляй новую информацию.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Tirbah
- Не в сети
- ВЕТЕРАН ЗOНЫ
- Сообщений: 600
- Спасибо получено: 3342
В строке 1513 attempt to call field '?' (a nil value) не написано, это попытка вызова из другой функции.1513: attempt to call field '?' (a nil value)
Что это за программы? Скачай редактор Notepade++, открой с его помощью файл xr_logic.script и просто найди строку под номером 1513.Ни с помощью программы поиска ни простым поиско
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- lisin
- Не в сети
- ОПЫТНЫЙ
- Сообщений: 247
- Спасибо получено: 41
Я могу под спойлером прислать весь файл - лично я не смог найти такой строки.
-- Script switching logic
-- Разработчик: Andrey Fidrya (Zmey) Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен 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
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Stalker79
- Не в сети
- МАСТЕР
- Сообщений: 375
- Спасибо получено: 1211
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Tirbah
- Не в сети
- ВЕТЕРАН ЗOНЫ
- Сообщений: 600
- Спасибо получено: 3342
Stalker79, привет, там ридми нет? Обычно НИ нужна, если в правке затрагивается all.spawn. Кто правку делал?
Ну как нет, если естьуказанный тобой текстовой редактор сказал, что строки 1513 нет.
Stalker79, я не особо разбираюсь в скриптах, но, судя по правке, не нужна.
_______________________
pstor[varname] = pstor_custom_impl[classname]()
lisin, эта строка, она есть в коде, который ты выложил.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Stalker79
- Не в сети
- МАСТЕР
- Сообщений: 375
- Спасибо получено: 1211
Tirbah Ридми нет. Правку взял в шапке темы.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Сталкеров в Зоне
|