Здесь задают вопросы и получают на них ответы. Прежде чем задать вопрос, воспользуйтесь поиском по разделу, ответ на него, вероятно, уже есть.
Если у вас произошёл вылет, проверьте лог и поищите информацию об ошибке в справочнике. Также будет полезно посмотреть справочник ошибок. Если у Вас вылетает какой-то мод, то следует написать в тему этого мода.
Грамотно оформляйте свой пост, чётко доносите суть своего вопроса (ответа).
Благодарность выражаем в личке или же ставим плюсик в историю репутации. Подобные посты будут удаляться.
Решил я создать скрипт на смену портрета ГГ в зависимости от одетой брони. Сделал тестовый скрипт Скрипт:
function update_portret() local actor = db.actor local set_portrait = db.actor:set_character_icon local o = db.actor:item_in_slot(7) -- get outfit section in slot local h = db.actor:item_in_slot(12) -- get helmet section in slot if o=="svoboda_light_outfit" then set_portrait("ui_inGame2_Freedom_2") end end
Функция db.actor:set_character_icon("icon_id") записана в движке, и проверялась на работоспособность. Функция рабочая. Сделал вызов в функции update (файл bind_stalker). вызов:
actor.update_portret()
И при на последней стадии загрузки игры (Загрузка уровня) вылетает с таким логом:
[error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : ..\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ...call of pripyat\gamedata\scripts\bind_stalker.script:440: attempt to index global 'actor' (a nil value)
Перепроверял функцию не один раз. Не понимаю в чём причина вылета. Сверил свой скрипт с модом Dynamic Helmets Mod, там почти тоже самое, но игра не вылетает. Пример из мода:
if otf==nil and helm==nil then db.actor:set_visual_name("actors\\stalker_hero\\stalker_hero_1") return end Я не понимаю, что делает функция return в LUA.
Сообщение отредактировал Winsor - Понедельник, 13.07.2020, 22:02
function update_portret() local actor = db.actor local outfit = actor:item_in_slot(7) if outfit~=nil and outfit:section()=="svoboda_light_outfit" then actor:set_character_icon("ui_inGame2_Freedom_2") end end
Вызов:
Код
actor.update_portret()
Сообщение отредактировал denis2000 - Вторник, 14.07.2020, 08:22
denis2000, Теперь вылетает с таким логом: Expression : !m_error_code Function : raii_guard::~raii_guard File : ..\xrServerEntities\script_storage.cpp Line : 748 Description : ...f pripyat\gamedata\scripts\inventory_upgrades.script:42: attempt to call method 'money' (a nil value)
Winsor, Возможно метод set_character_icon пере создает объект актора заново и переменная db.actor теряет актуальность и указывает на более не существующий объект. За комментариями обратитесь к автору данной движковой правки.
Ты спрашиваешь про ГГ, а ведь такое даже с неписями не работает.
Вроде как это дело легко чинится. По идее достаточно прописать фонарик в секцию keep_items в death_generic.ltx и тогда он не будет удаляться, в теории.
Вопрос. При прочтении spawn_sections_pripyat.ltx заметил, что некоторые персонажи имеют несколько секций, которые различаются лишь наличием строк иммунитета, например, лейтенант Подорожный имеет секции pri_a17_military_lieutenant_podorojniy и pri_a17_military_lieutenant_podorojniy_strong. Для чего вторая секция?
Почему исчезают отметки на карте? Я не редактировал файл ui_actor_hint_wnd. Поискал в интернете - решения не нашёл. Также пропадают метки на квестовых НПС.
Добавлено (16.07.2020, 14:10) --------------------------------------------- Проверил одну вещь: если использовать чистый движок игры и чистую gamedata, то проблем нет. Но если использовать чистый движок игры и правленную gamedata, то проблема появляется.
Добавлено (16.07.2020, 19:59) --------------------------------------------- Давно, когда карта была прописана в игру, на ней работали отметки.
Есть несколько объектов заспавненных через СДК. Надо убрать их из игры на время, а затем снова вернуть после выдачи поршня. Хотел реализовать через online - offline, но can_switch_offline всегда возвращает false.
Код
local sid = get_story_object_id("agr_liana1") local se_obj = sid and alife_object(sid) if se_obj then if (se_obj.online) then if se_obj:can_switch_offline() then -- тут всегда false se_obj:switch_offline() end end end
Я писал функции для увода в оффлайн и выхода обратно в онлайн для True Stalker, пользуюсь очень часто. Протести у себя.
Код
function ObjSetSwitchOnline(story_obj_id) local obj_id = nil local type_id = type(story_obj_id)
if type_id == "string" then obj_id = story_objects.get_story_objects_registry():get(story_obj_id) elseif type_id == "number" then obj_id = story_obj_id else printf("! Error type '%s' for 'story_obj_id' in function ObjSetSwitchOnline!", type_id) return end
if obj_id ~= nil then local sobj = alife():object(obj_id) if sobj ~= nil then alife():set_switch_online(sobj.id, true) alife():set_switch_offline(sobj.id, false) printf("& ObjSetSwitchOnline: %s", story_obj_id) else printf("! ObjSetSwitchOnline: 'sobj' == nil (%s)", story_obj_id) end else printf("! ObjSetSwitchOnline: 'obj_id' == nil (%s)", story_obj_id) end end
function ObjSetSwitchOffline(story_obj_id) local obj_id = nil local type_id = type(story_obj_id)
if type_id == "string" then obj_id = story_objects.get_story_objects_registry():get(story_obj_id) elseif type_id == "number" then obj_id = story_obj_id else printf("! Error type '%s' for 'story_obj_id' in function ObjSetSwitchOffline!", type_id) return end
if obj_id ~= nil then local sobj = alife():object(obj_id) if sobj ~= nil then alife():set_switch_online(sobj.id, false) alife():set_switch_offline(sobj.id, true) printf("& ObjSetSwitchOffline: %s", story_obj_id) else printf("! ObjSetSwitchOffline: 'sobj' == nil (%s)", story_obj_id) end else printf("! ObjSetSwitchOffline: 'obj_id' == nil (%s)", story_obj_id) end end
Можно передавать ID, можно story_id. Функция работает в обоих случаях.