Norman Eisenherz 355 Опубликовано 1 Марта 2020 @abramcumner Нет – я проверял, что во временный нетпакет успешно переносятся данные из UPDATE-пакета исходного объекта; проблема возникает на следующей стадии – при переносе данных из временного пакета в новый объект. Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 1 Марта 2020 @abramcumner В UPDATE-пакете нового оружия будут дефолтные данные класса + то, что совпадает со STATE-пакетом: например, будет один патрон, если была заряжена граната. Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 2 Марта 2020 Здрасьте. 1. В X-Ray Extensions есть функции get/set_inventory_item_int16, которые позволяют менять флаги состояния предметов. Судя по комментарию "-- extra flags added in x-ray extensions" в списке ii_flags, флаги до 11-го бита (is_quest_item = 2048) существуют у объектов и в оригинальной игре. 2. Есть класс flags16, работа с которым вроде как похожа на работу с нетпакетом: • создать контейнер x = flags16(); • заполнить контейнер флагами объекта через ?:get(); • изменить отдельные флаги через x:set(#, true/false); • назначить новые флаги объекту через ?:assign(x). Примеров использования этого класса очень мало, и составить полную картину не получается. В частности, неясно, как выполняется привязка контейнера к объекту для чтения/записи флагов. Конечный вопрос: можно ли, используя только функции класса flags16, повторить работу функций get/set_inventory_item_int16? Другими словами, являются ли эти функции более удобным представлением того, что уже есть в движке, или делают что-то полностью новое? Нашел в файлах XRE код, но как он работает, я без знания языка понять не могу. Spoiler CScriptGameObject__SetInventoryItemInt16 proc pos = dword ptr 8 value = dword ptr 0Ch push ebp mov ebp, esp push edx ;--- call CScriptGameObject__CInventoryItem mov ecx, [ebp + pos] mov edx, [ebp + value] mov [eax+ecx], dx ;--- pop edx mov esp, ebp pop ebp retn 08h CScriptGameObject__SetInventoryItemInt16 endp CScriptGameObject__GetInventoryItemInt16 proc stub = dword ptr 8 pos = dword ptr 0Ch push ebp mov ebp, esp and esp, 0FFFFFFF8h push [ebp + pos] push [ebp + pos] call CScriptGameObject__GetInventoryItemInt and eax, 0FFFFh mov esp, ebp pop ebp retn 8 CScriptGameObject__GetInventoryItemInt16 endp Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 2 Марта 2020 @naxac Я имел в виду примеры применения функций именно базового класса flags16. Но, раз без правок XRE получить флаги для последующей обработки нельзя, примеры ничего не дадут. Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 5 Марта 2020 Здрасьте. [m_netpk.script] Функция r_chunk, насколько можно судить по коду, читает простую таблицу, в которой len записей типа u8, даже если значение len указано как 3*4 или 4*4 (то есть, матрица все равно читается как вектор). Что читает эта функция в варианте _r_l8u16v, когда вместо числового размера таблицы указано pk:r_u8(), а тип значения – u16? Таблицу размером 1 байт, в которой хранится 2-байтовое значение? Еще один непонятный вариант – _r_l32szv, где размер указан как pk:r_s32(), а тип – stringZ. Это должна быть одна строка с длиной строго 4 байта, или это таблица из таких строк? Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 6 Марта 2020 Здрасьте. Вывод таблицы данных нетпакета через table.concat(k .. v, "\\n"): назначаю для определенной строки цвет – пропадает перенос в конце строки. Пока в строке только переменные и текст, перенос есть. В чем причина? https://drive.google.com/open?id=1XU6jeaOI_HrNxm90ZiR6M6L3UTPXm0cC Spoiler local pk_dump = {} for k, v in pairs(data) do if type(v) ~= "table" then table.insert(pk_dump, k .. " = " .. v) else if next(v) == nil then table.insert(pk_dump, k .. "%c[gray]" .. " = empty" .. "%c[default]") -- table.insert(pk_dump, k .. " = empty") else for i = 1, #v do table.insert(pk_dump, k .. "_" .. i .. " = " .. v[i]) end end end end news_manager.send_tip(act, table.concat(pk_dump, "\\n")) Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 6 Марта 2020 @Kirgudu Точно не то – один слеш в скриптовых текстах "съедается" как спецсимвол. По поводу повтора – хочется разобрать, а не открывать один черный ящик другим. @naxac Да, так работает. Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 19 Марта 2020 @nasar75 Скобки и дефис считаются модификаторами поиска – добавить к ним % для перевода в обычный текст: string.gsub(v, "%{\%-aes_arrive_to%}", "true") 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 21 Марта 2020 Делаю уведомление об открытом проходе под мостом на Кордоне: https://drive.google.com/open?id=1Ef-NJFJJ81tLlasRHkCOgLiK_VE0Lxoo Проблема: уведомление скрывается при переходе на другую локацию, хотя инфо-поршень "esc_bridge_pass_on" и значения в pstor точно остаются. В чем может быть причина? Spoiler -- // actor_binder:info_callback(npc, info_id) // -- function set(info_id) if info_id == "esc_bridge_pass_on" then local time_hr = level.get_time_hours() + 1 if time_hr == 24 then time_hr = 0 end local time_min = level.get_time_minutes() xr_logic.pstor_store(db.actor, "time_hr", time_hr) xr_logic.pstor_store(db.actor, "time_min", time_min) show() end end -- // actor_binder:info_callback(npc, info_id) // -- function clear(info_id) if info_id == "esc_bridge_pass_off" then local st = get_hud():GetCustomStatic("bridge_pass") if st then get_hud():RemoveCustomStatic("bridge_pass") end xr_logic.pstor_store(db.actor, "time_hr", false) xr_logic.pstor_store(db.actor, "time_min", false) end end -- // actor_binder:net_spawn(data) // -- function show() local t_hr = xr_logic.pstor_retrieve(db.actor, "time_hr") local t_min = xr_logic.pstor_retrieve(db.actor, "time_min") if t_hr and t_min then local st = get_hud():GetCustomStatic("bridge_pass") if not st then get_hud():AddCustomStatic("bridge_pass") caption() end end end function caption() local st = get_hud():GetCustomStatic("bridge_pass") local t_hr = xr_logic.pstor_retrieve(db.actor, "time_hr") local t_min = xr_logic.pstor_retrieve(db.actor, "time_min") local time_end = string.format("%02d:%02d", t_hr, t_min) local text = "Проход до " .. time_end st:wnd():SetText(text) end На всякий случай, файлы для чистой ТЧ: https://drive.google.com/open?id=1nJ7BeQSSaLx6EFGwWKhU2NYnOqvQShdg Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 21 Марта 2020 @WinCap При перезагрузке на Кордоне уведомление остается. Вроде такая же последовательность net_destroy / net_spawn… Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 22 Марта 2020 Потестил еще: на Кордоне уведомление отображается всегда после 1-й загрузки, на Свалке или после перехода Кордон > Свалка > Кордон всегда после 2-й загрузки. В обоих случаях тестил с выходом из игры и с обычной перезагрузкой. Сделал add_call на прогрузку ГГ – уведомление отображается каждый раз. (Инфо-поршень "esc_bridge_pass_off", как выяснилось, вообще не выдается до возврата на Кордон, но это уже другой вопрос). @naxac "Первый апдейт" – привязаться к actor_binder:update(delta) и остановить выполнение после однократного выведения статика, или речь о чем-то другом? Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 24 Марта 2020 Здрасьте. Попадалась информация о старой версии мода "Худ рук", в которой текстура рук подменялась за счет классов то ли оружия, то ли брони. Кто-нибудь помнит, как этот мод работал? Хочется назначить 3–4 вида перчаток без полной замены моделей рук и перехода на правозатворное оружие. Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 24 Марта 2020 @naxac А новая версия правит движок, чтобы позволить прямую замену текстур… Тогда все, снимаю вопрос. Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 28 Марта 2020 Здрасьте. ТЧ 1.0006, Армейские склады: сообщение "Сталкер, ты подходишь к барьеру" выдается дважды. В описании рестриктора только одно сообщение, в [xr_effects] такого сообщения нет. Где искать лишнюю копию? Spoiler [alife_l07_military.ltx] name = mil_actor_blockpost -- текст сообщения type = tips -- тип сообщения: "send_tip" on_info = {=mil_actor_enemy_freedom} nil -- проверка друг/враг on_actor_inside = %+mil_blockpost_free_task% -- инфо "mil_blockpost_free_task" (+ задание "mil_blockpost_job") on_info2 = {+mil_blockpost_free_task} sr_sound_act -- звуковое сообщение при получении инфо-поршня sender = freedom -- отправитель текстового сообщения on_signal = tip_sended | sr_idle -- ? (деактивация рестриктора) Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 1 Апреля 2020 On 3/28/2020 at 9:37 PM, WinCap said: @Norman Eisenherz, забыли добавить single = true, наверное. Мне кажется, правильным будет такой вариант: [sr_tip1] (Reveal hidden contents) [sr_tip1] name = mil_actor_blockpost type = tips sender = freedom on_info = {=mil_actor_enemy_freedom} nil on_actor_inside = sr_sound_act %+mil_blockpost_free_task% Добрался, наконец, попробовать: просто "single = true" в имеющейся логике убирает второй текст, но затыкает и звук, и задачу. Без "single = true" сообщений, как ни крути, выдается два. В итоге, вот такой порядок дает нужный результат: Spoiler [alife_l07_military.ltx] name = mil_before_blockpost_restriktor … [logic] active = sr_idle [sr_idle] on_info = {=mil_actor_enemy_freedom} nil on_actor_inside = %+mil_blockpost_free_task% on_info2 = {+mil_blockpost_free_task} sr_tip [sr_tip] name = mil_actor_blockpost type = tips sender = freedom single = true on_signal = tip_sended | sr_sound_act [sr_sound_act] snd = characters_voice\scenario\military\pda\mil_pda_7 on_signal = sound_end | nil 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 2 Апреля 2020 Здрасьте. Есть ли какой-то фикс для меток, которые остаются после сюжетных заданий (АТП, X-16, РГ-6)? Пробовал удалять метки по инфо-поршням завершения заданий – удаление срабатывает через раз, как будто инфо-поршни не выдаются, хотя сами задания засчитываются стабильно. ТЧ 1.0006 Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 19 Апреля 2020 Здрасьте. Как добиться спавна лута на разбиваемых металлических ящиках, чтобы избежать клиппинга сквозь ближайшую поверхность? [scripts\xr_box.script] position.y = obj:position().y + math.random(30,50)/100 Пробовал задавать вместо исходных 0,3–0,5 метров 1–2 метра над ящиком – все равно лут проваливается, особенно если ящик лежит на крыше (Г-образное здание на Кордоне, около ж/д моста). Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 22 Апреля 2020 Здрасьте. [ТЧ 1.0006] Задача: добавить в инвентарь кнопку. Проблема на стадии вывода нового окна. Ориентируюсь на следующие инструкции: On 11/14/2010 at 11:31 PM, Kolmogor said: Алгоритм простой: - ждешь пока откроется инвентарь, ловишь ui_inventory в info_callback - получаешь его окно через level.main_input_receiver() - аттачишь свое окно AttachChild и On 2/3/2019 at 1:54 PM, Graff46 said: запускаем диалог level.start_stop_menu(dlg, true/false) или так dlg:GetHolder():start_stop_menu(dlg, true/false) разницы никакой, это фактически одна и та же функция Добавляю окно (+ статик с текстурой для заметности), приклеиваю к инвентарю: никакой реакции. Вывожу то же окно отдельно через level.start_stop_menu() – условная кнопка отображается при открытом инвентаре, но игра вылетает через пару секунд. Вывожу окно через GetHolder() – вылет уже при обращении к инвентарю, ошибка "attempt to index a nil value". Spoiler [bind_stalker.script] function actor_binder:info_callback(npc, info_id) if info_id == "ui_inventory" then local w = CUIScriptWnd() w:Init(0, 0, 70, 25) local b = CUIStatic() b:Init(0, 0, 70, 25) b:InitTexture("ui_button_ordinary_d") b:SetStretchTexture(true) w:AttachChild(b) -- local inv = level.main_input_receiver() -- inv:AttachChild(w) level.start_stop_menu(w, true) -- w:GetHolder():start_stop_menu(w, true) end Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 23 Апреля 2020 1. Значит, не только CUIStatic() от этого страдает… 2. Осталась проблема с инвентарем: как приклеить новое окно именно к нему? Строки local inv = level.main_input_receiver() inv:AttachChild(w) никакого эффекта не дают. Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение
Norman Eisenherz 355 Опубликовано 23 Апреля 2020 @Zander_driver Видел расширенное описание оконных классов из lua_help и обсуждение с Garry_Geller по поводу удаления дочерних окон. Это то, что понимается под "подробно" или еще какая-то информация есть? Может, где-то есть уроки уровня "окно с одной кнопкой", а не просто ссылка "смотри numpad"? Мини-моды: ТЧ ЧН ЗП Шпаргалка Поделиться этим сообщением Ссылка на сообщение