Norman Eisenherz 316 Опубликовано 23 Апреля 2021 Поделиться Опубликовано 23 Апреля 2021 Здрасьте. [ЗП 1.6.02] Проблема: при каждом повторе сейва и загрузки добавляется примерно 10 секунд реального времени к значению game.time(). Дельта постоянная – время в главном меню при создании сейва и время ожидания на экране загрузки не влияют. Пример: вывод внутреннего таймера в сообщение, сразу же сейв и загрузка – начальное время 35 653 секунд, время после загрузки – 35 665 секунд. Как с этим бороться? Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
AndreySol 215 Опубликовано 23 Апреля 2021 Поделиться Опубликовано 23 Апреля 2021 @Norman Eisenherz Попробовать в движке поправить... Ссылка на комментарий
Norman Eisenherz 316 Опубликовано 23 Апреля 2021 Поделиться Опубликовано 23 Апреля 2021 Снимаю вопрос. Через pstor-запись в момент сейва и сравнение на первом апдейте разница ловится достаточно точно. Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
BFG 7 582 Опубликовано 24 Апреля 2021 Поделиться Опубликовано 24 Апреля 2021 @Norman Eisenherz если хочешь прям конкретно узнать, что грузит время сейва, то надо юзать утилитку filemon. Щас она не юзается на 7ке. Есть другая. Поиском найдешь. Главная сложность это настроить фильтр на определенную папку. Утиль тебе в лог запишет, что, когда и где и за какое время читаются файлы. Именно так я искал время загрузки текстур и звуков, для НС, по заданию Сапсана. В результате была сделана оптимизация и время загрузки сократилось с полутора минут, до 10-18 секунд. Но там после, уже скритово было сделано. Но утиль полезный, правда настраивать его тяжко. Но если ты уж так заморочился, оно того стоит. 1 3 "Кругом зомби.....у меня кончаются патроны...." Ссылка на комментарий
Norman Eisenherz 316 Опубликовано 24 Апреля 2021 Поделиться Опубликовано 24 Апреля 2021 @BFG game.time() – счетчик времени в активном сейве, и этот счетчик должен обновляться только при апдейте актера, который начинается после загрузки сейва и отключения меню. Или не совсем так? Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Баба ЯГА 7 Опубликовано 24 Апреля 2021 Поделиться Опубликовано 24 Апреля 2021 Написал меню: class "menu" (CUIScriptWnd) function menu:__init() super() self:InitControls() end function menu:__finalize() end -- и т.д. открываю прямо в игре из инвентаря, всё работает. Вопрос: как его отловить из другого скрипта (когда это меню открыто)? Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... © Ссылка на комментарий
AndreySol 215 Опубликовано 24 Апреля 2021 Поделиться Опубликовано 24 Апреля 2021 @Баба ЯГА Код покажи, которым ты открываешь свое окно. Ссылка на комментарий
Баба ЯГА 7 Опубликовано 24 Апреля 2021 Поделиться Опубликовано 24 Апреля 2021 16 минут назад, AndreySol сказал(а): @Баба ЯГА Код покажи, которым ты открываешь свое окно. открываю так level.start_stop_menu( ui_my_menu.menu(), true ) -- открываю меню Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... © Ссылка на комментарий
Капрал Хикс 534 Опубликовано 24 Апреля 2021 Поделиться Опубликовано 24 Апреля 2021 Наткнулся на один очень странный и неприятный вылет. Платформа RMA mod v1.1.5 + Shadows Addon v0.8.5 + Патч lvg_brest v3.5... При быстром сохранении и загрузке с него вылет вида: Скрытый текст FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression>[error]Arguments : LUA error: ... of chernobyl\gamedata\scripts\dialog_manager.script:880: attempt to compare number with nil stack trace: Собственно строка: if ver >= 7 then Идёт проверка патча, верно? В system.ltx указан шестой патч, т.е. current_server_entity_version = 7 А вот при попытке поставить затычку перед строкой if ver >= 7 then -> if not ver then ver = 8 end... (вся функция ниже под спойлером) Скрытый текст function load(npc, reader, ver) if selected_phrase_by_id == nil then selected_phrase_by_id = { intro = {}, cool_info = {}, action_info = {} } end local flag = nil if not ver then ver = 8 end if ver >= 7 then flag = reader:r_stringZ() else flag = tostring(reader:r_s16()) end if flag ~= "-1" then selected_phrase_by_id.intro[npc:id()] = {phrase = flag, count = 0} else selected_phrase_by_id.intro[npc:id()] = nil end if ver >= 7 then flag = reader:r_stringZ() else flag = tostring(reader:r_s16()) end if flag ~= "-1" then selected_phrase_by_id.cool_info[npc:id()] = {phrase = flag, count = 0} else selected_phrase_by_id.cool_info[npc:id()] = nil end if ver >= 7 then flag = reader:r_stringZ() else flag = tostring(reader:r_s16()) end if flag ~= "-1" then selected_phrase_by_id.action_info[npc:id()] = {phrase = flag, count = 0} else selected_phrase_by_id.action_info[npc:id()] = nil end end ...начинаются вылеты вида: Скрытый текст Синхронизация... * phase time: 4 ms * phase cmem: 225135 K * [win32]: free[2698856 K], reserved[466984 K], committed[1028400 K] * [ D3D ]: textures[298939 K] * [x-ray]: crt heap[225135 K], process heap[464336 K], game lua[27948 K], engine lua[217 K], render[4108 K] * [x-ray]: economy: strings[6773 K], smem[8222 K] stack trace: 0023:05185AF0 xrGame.dll [error][ 87] : Параметр задан неверно. Но! С ручных сейвов всё грузится. Мало того. Стоит переименовать квиксейв в папке сейвов вручную, игра послушно грузится с него тоже. Какая-то хаффовщина, честное слово. То ли это проблема движка с правками x-ray extensions, то ли я не знаю. Ссылка на комментарий
AndreySol 215 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 @Капрал Хикс Ну так у тебя же четко написано: попытка сравнить число с nil. Т.е. в переменной ver у тебя nil. Вот и раскапывай всю цепочку инициализации этой переменной и ищи место где она не инициализируется правильным значением. @Баба ЯГА Сделай так: wnd = nil -- объявили глобальную переменную далее wnd = ui_my_menu.menu() level.start_stop_menu(wnd, true) В переменной wnd будет объект класса твоего окна. Глобальная переменная будет доступна из любого иного места. 1 Ссылка на комментарий
Капрал Хикс 534 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 1 час назад, AndreySol сказал(а): Вот и раскапывай всю цепочку инициализации этой переменной и ищи место где она не инициализируется правильным значением. В том-то и дело, что эта переменная встречается только в этом скрипте и только в этой функции, с оригинала так. Где она инициализируется - непонятно. Ссылка на комментарий
ted.80 272 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 10 часов назад, Капрал Хикс сказал(а): [error]Arguments : LUA error: ... of chernobyl\gamedata\scripts\dialog_manager.script:880: attempt to compare number with nil У вас LUA ругается на: 3 часа назад, AndreySol сказал(а): четко написано: попытка сравнить число с nil. Т.е. в переменной ver у тебя nil. И вместо того чтоб попытаться проверить чему-же равна ver, вы пытаетесь подменить её 10 часов назад, Капрал Хикс сказал(а): А вот при попытке поставить затычку перед строкой if ver >= 7 then -> if not ver then ver = 8 end... причём на ver = 8, хотя 10 часов назад, Капрал Хикс сказал(а): В system.ltx указан шестой патч, т.е. current_server_entity_version = 7 На что уже движок начинает ругаться 10 часов назад, Капрал Хикс сказал(а): 0023:05185AF0 xrGame.dll [error][ 87] : Параметр задан неверно. Думаю логичнее было бы затычку сделать так If ver == nil or ver == "nil" then ver = 7 end Хотя чукча е програмист и может ошибаться Личный АРХИВ по S.T.A.L.K.E.R Ссылка на комментарий
Space.Marine 466 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 Приветствую ! Платформа ЗП. Попробовал перенести из мода на ТЧ скрипт на лечение раненых врагов. Собственно, вот что получилось: Скрытый текст local iTimer local npc_save function start_timer() iTimer = time_global() + 1*1000 end function timer_update() if iTimer and iTimer < time_global() then iTimer = nil npc_out_gulag(npc_save) end end function enemies_dialog_rep(first_speaker, second_speaker) local com = second_speaker:character_community() if com == "stalker" then db.actor:set_character_rank(db.actor:character_rank() + 40) elseif com == "killer" or com == "bandit" then second_speaker:set_character_community("stalker", 0, 0) db.actor:set_character_rank(db.actor:character_rank() + 30) npc_save = second_speaker start_timer() elseif second_speaker:character_community() == "dolg" then db.actor:set_character_rank(db.actor:character_rank() + 40) elseif second_speaker:character_community() == "freedom" then db.actor:set_character_rank(db.actor:character_rank() + 40) else second_speaker:set_character_community("stalker", 0, 0) db.actor:set_character_rank(db.actor:character_rank() + 30) end if second_speaker ~= nil then if com == "stalker" or com == "bandit" or com == "dolg" or com == "freedom" or com == "killer" then second_speaker:set_relation(game_object.friend, first_speaker) end end end function npc_out_gulag(second_speaker) local obj = alife():object(second_speaker:id()) local unreg_id = obj:smart_terrain_id() if unreg_id ~= 65535 and second_speaker:alive() then local unreg = alife():object(unreg_id) if unreg then unreg:unregister_npc(obj) end end npc_save = nil end meh.timer_update() - висит на апдейте в bind_stalker. enemies_dialog_rep(first_speaker, second_speaker) - вызывается из dialogs.script: Скрытый текст function transfer_medkit(first_speaker, second_speaker) if first_speaker:object("medkit") ~= nil then dialogs.relocate_item_section(second_speaker, "medkit", "out") --alife():release(alife():object(second_speaker:object("medkit"):id()), true) elseif first_speaker:object("medkit_army") ~= nil then dialogs.relocate_item_section(second_speaker, "medkit_army", "out") --alife():release(alife():object(second_speaker:object("medkit_army"):id()), true) else dialogs.relocate_item_section(second_speaker, "medkit_scientic", "out") --alife():release(alife():object(second_speaker:object("medkit_scientic"):id()), true) end alife():create("medkit_script", second_speaker:position(), second_speaker:level_vertex_id(), second_speaker:game_vertex_id(), second_speaker:id()) -- Тут надо анлочить аптечку для использования. xr_wounded.unlock_medkit(second_speaker) -- Лечение врагов if second_speaker:relation(first_speaker) == game_object.enemy then meh.enemies_dialog_rep(first_speaker, second_speaker) end first_speaker:change_character_reputation(10); end Всё, вроде, работает. Прошу проверить "грамотность" meh.script. Вопрос возник потому, что узнал, что неписей после принудительной смены community необходимо выводить из гулага. Раньше просто прям в dialogs.script было следующее: Скрытый текст if second_speaker:relation(first_speaker) == game_object.enemy then second_speaker:set_relation(game_object.friend, first_speaker) second_speaker:set_character_community("stalker", 0, 0) first_speaker:set_relation(game_object.friend, second_speaker) end first_speaker:change_character_reputation(10); end И также всё работало нормально. Просветите, пожалуйста, стоило вообще заморачиваться с meh.script или можно оставить всё как было без unregister_npc. P.S. Сам ни в коей мере не программист... Ссылка на комментарий
Баба ЯГА 7 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 @AndreySol Помогло. Копнул дальше по твоему примеру, и оказалось, что можно и так тоже было: local MyMenu = ui_my_menu.menu() -- > type = userdata local menuIsShown = MyMenu:IsShown() -- > type = userdata local w = MyMenu:GetWidth() -- > type = number -> 1024 local mm_btn = MyMenu:GetButton("knopka"):GetWidth() -- > type = number -> 127 -- т.е. любой GET - работает отлично, и для самого меню, и для -- его елементов; если параметр был задан изначально - -- то вернёт значение, если небыло параметра изначально - то вернёт = nil -- а вот любой SET - не работает, увы... -- SET - всегда возвращает NIL и никакие параметры не меняются, а жаль... MyMenu:GetButton("knopka"):SetText( "меняю на другой" ) -- NIL жаль, думал можно получить меню, и в реальном времени менять координаты кнопок, цвет текста и т.д., но оказалось - нельзя... Хотя, возможно, я всё-же что-то делаю не так?... 1 Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... © Ссылка на комментарий
AndreySol 215 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 11 часов назад, Капрал Хикс сказал(а): встречается только в этом скрипте и только в этой функции Не правда. В аргументе ф-ции эта переменная - смотрите дальше, где вызывается эта ф-ция, и как передается соответствующий аргумент ф-ции. 1 Ссылка на комментарий
I am Dead 916 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 @Капрал Хикс Вот так твоя проблема решается: Скрытый текст function motivator_binder:load(reader) self.loaded = true printf("motivator_binder:load(): self.object:name()='%s'", self.object:name()) object_binder.load(self, reader) printf("motivator_binder:object_binder.load(): self.object:name()='%s'", self.object:name()) if reader:r_eof() then abort("[xr_motivator.script]SAVE FILE IS CORRUPT") end self.treasure_processed = reader:r_bool() xr_logic.load_obj(self.object, reader) if system_ini():r_u32("script","current_server_entity_version") > 6 then -- патч 6 self.npc_script_version = alife():object(self.object:id()).script_version dialog_manager.load(self.object, reader, self.npc_script_version) else -- патч 4 dialog_manager.load(self.object, reader) end trade_manager.load(self.object, reader) end А свои затычки из dialog_manager убери оставив лишь такой код: Скрытый текст function load(npc, reader, ver) if selected_phrase_by_id == nil then selected_phrase_by_id = { intro = {}, cool_info = {}, action_info = {} } end local flag = nil if ver >= 7 then flag = reader:r_stringZ() else flag = tostring(reader:r_s16()) end if flag ~= "-1" then selected_phrase_by_id.intro[npc:id()] = {phrase = flag, count = 0} else selected_phrase_by_id.intro[npc:id()] = nil end if ver >= 7 then flag = reader:r_stringZ() else flag = tostring(reader:r_s16()) end if flag ~= "-1" then selected_phrase_by_id.cool_info[npc:id()] = {phrase = flag, count = 0} else selected_phrase_by_id.cool_info[npc:id()] = nil end end 1 1 Ссылка на комментарий
Капрал Хикс 534 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 1 час назад, AndreySol сказал(а): смотрите дальше, где вызывается эта ф-ция, и как передается соответствующий аргумент ф-ции. Вот он, единственный вызов в xr_motivator: dialog_manager.load(self.object, reader) Так в оригинале. dialog_manager.load(self.object, reader, self.npc_script_version) Так в RMA. Простите, для меня неочевидно, что self.npc_script_version = alife():object(self.object:id()).script_version Это ver тот самый (если это и имелось в виду). @I am Dead от души! Не думал, что аж так оно тянется. Ссылка на комментарий
Biblia 4 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 Здравствуйте. Хотел бы задать вопросец(платформа CoP) : Поставил мод на анимированные медикаменты. Решил я добавить использование эффектов камеры при приеме медикаментов. Естественно, прописывать такое для каждого из предметов - глупо, потому я попробовал просто добавить проверку на параметра,но столкнулся с проблемой, что анимации срабатывает лишь раз, а потом все предметы используются так, как в ванильноме ЗП. Вопрос: есть ли функция для проверки использования не именно отдельного предмета, а просто? Ибо, я думаю, если сначала сделать проверку на использование, а потом на наличие параметра - все должно сработать. Ссылка на комментарий
I am Dead 916 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 @Biblia Сделай проверку на класс предмета. Ссылка на комментарий
Баба ЯГА 7 Опубликовано 25 Апреля 2021 Поделиться Опубликовано 25 Апреля 2021 Подхожу к тайнику, открываю его, вопрос: как узнать ID именно этого рюкзака, который сейчас открыт? Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... © Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти