НаноБот 742 Опубликовано 26 Декабря 2015 (изменено) https://yadi.sk/d/dZNjgRAtinEjU Вер. 1.14 Скрипт для тайминга скриптов имеющий апдейт. Для ТЧ(1.000*), ЧН(1.5.*), ЗП(1.6.*). Для ТЧ возможно может работать и в предрелизных билдах, на лост альфе не тестировался. Для определения общей загрузки скриптами ЦП, используется алгоритм следующий: в начале фрейма самый первый скрипт (апдейт актора) запускает общий таймер и каждый следующий скрипт отработав, запоминает время, и если в тайминг включён скрипт который выполнился самым последним (как правило это сам апдейт этого скрипта) , то фиксируем общее время выполнения скриптовой части движка. Время обычно это не мало, 40-60%, а на пустом уровне 12%(ТЧ), не зря разработчики жаловались на движок XRay, что слишком за скриптован. Замеченные проблемы, может конфликтовать с некоторыми скриптами отрабатывающие эффекты поедание съедобных предметов. https://yadi.sk/d/sdLew6XKqLuzF Вер. 1.15 Тайминг скриптов. Устранил вылет из-за отсутствия функции round в моде OGSE 0693, заменена на math.floor. Немного возросло быстродействия скрипта. Изменено 21 Августа 2017 пользователем НаноБот объединил посты 1 1 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 13 Марта 2017 (изменено) Возможно кому то понадобиться. --[[--------------------------------------------------------------------------- Различные утилиты. Для С.Т.А.Л.К.Е.Р. Тень Чернобыля. (с) НаноБот 19.11.2016 --]]--------------------------------------------------------------------------- --------------------------Вывод текста на экран.------------------------------- local x_text, y_text, time_update, hud local hud_text, outtext_count, outtext_num local hud_textxy, outtextxy_count, outtextxy_num local color, height_font, type_font --- создать текстовый вывод: x, y - координата начала вывода function create_hud_outtext(...) local args = {...} x_text = args[1] or 0 y_text = args[2] or 0 color = args[3] or {255, 225, 215, 0} -- золотистый ц. height_font = args[4] or 20 type_font = args[5] or GetFontLetterica16Russian() align_text = args[6] or CGameFont.alLeft y_text = y_text - height_font hud = get_hud() time_update = 0 outtext_count = 0 hud_text = {} outtextxy_count = 0 hud_textxy = {} end --- удалить тестовый вывод: is_del - надо ли удалять function destroy_hud_outtext(is_del) if is_del then if hud_text then for i = 1, outtext_count do hud:RemoveDialogToRender(hud_text[i]) end hud_text = nil outtext_count = nil outtext_num = nil end if hud_textxy then for i = 1, outtextxy_count do hud:RemoveDialogToRender(hud_textxy[i]) end hud_textxy = nil outtextxy_count = nil outtextxy_num = nil end x_text = nil y_text = nil hud = nil time_update = nil color = nil height_font = nil type_font = nil end end --- вывести текст на экран: out - надо ли выводить, txt - текст, ... - параметры function hud_outtext(out, txt, ...) if out and hud_text then if time_update ~= time_global() then -- new update outtext_num = 0 time_update = time_global() end outtext_num = outtext_num + 1 if outtext_num > outtext_count then -- new outtext outtext_count = outtext_num hud_text[outtext_num] = CUIStatic() hud_text[outtext_num]:Init(x_text, outtext_num*height_font+y_text, 1, 1) hud_text[outtext_num]:SetFont(type_font) hud_text[outtext_num]:SetTextAlign(align_text) hud_text[outtext_num]:SetTextColor(color[1], color[2], color[3], color[4]) hud:AddDialogToRender(hud_text[outtext_num]) end hud_text[outtext_num]:SetText(string.format(txt, ...)) end end --- вывести текст на экран в нужную координату: out - надо ли выводить, x, y - координаты, txt - текст, ... - параметры function hud_outtext_xy(out, x, y, txt, ...) if out and hud_textxy then if time_update ~= time_global() then -- new update outtextxy_num = 0 time_update = time_global() end outtextxy_num = outtextxy_num + 1 if outtextxy_num > outtextxy_count then -- new outtext outtextxy_count = outtextxy_num hud_textxy[outtextxy_num] = CUIStatic() hud_textxy[outtextxy_num]:Init(x, y, 1, 1) hud_textxy[outtextxy_num]:SetFont(type_font) hud_textxy[outtextxy_num]:SetTextAlign(align_text) hud_textxy[outtextxy_num]:SetTextColor(color[1], color[2], color[3], color[4]) hud:AddDialogToRender(hud_textxy[outtextxy_num]) else hud_textxy[outtextxy_num]:SetTextX(x) hud_textxy[outtextxy_num]:SetTextY(y) end hud_textxy[outtextxy_num]:SetText(string.format(txt, ...)) end end ------------------------------------------------------------------------------- Делал по мотивам билда 1098, выводится отладочный текст на экран. Типа так. _unb.hud_outtext(out, "mYawVelocity: %.6f, dt: %.3f", self.mYawVelocity, dt) Перед использованием надо создать текстовой вывод, а потом, так же, надо не забывать удалять вывод, если уровень делает destroy. Изменено 13 Марта 2017 пользователем НаноБот 3 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 3 Января 2018 (изменено) Командное меню.https://yadi.sk/d/JaMDyEHy3RCEHs Используется для управление напарниками, нанокостюмом, хенами и так далее. Управление в игре: Нажмите клавишу вызова конкретного меню, далее выберете номер команды цифрами на основной клавиатуре. Повторное нажатие на клавишу открытия меню, закрывает меню без вызова команды. Управление сходно с движковым меню. В скритах номера меню и команд задаётся от 1. Так же можно задать озвучку команды, по легенде ГГ даёт команды напарникам именно по радио голосом, через радиогарнитуру, которую используют СпН. Как подключить?, смотрите в файле Подключения.txt Изменено 4 Января 2018 пользователем НаноБот ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 20 Ноября 2021 (изменено) Опять монкикод, про ООП не слышали? Не? Нафига тут bind_stalker.script? Если нужен скрипт отлова выстрелов, смотрите мою ракетницу. А если мне надо отследить выстрел НПС! Тут это работает? А вообще, лезем в исходники и добавляем колбек на выстрел. - Ту куда полез? - Смотри WeaponFire.cpp метод CWeapon::FireTrace - Или ShootingObject.cpp метод CShootingObject::FireBullet - В первом колбек будет приходить в классы от CWeaponMagazined, во втором на всё что стреляет. - Э что ты делаешь? Нафига ты актору колбек кидаешь! Причём тут актор? - Кидай в сам объект, так проще обеспечить совместимость. Код колбека. callback(GameObject::eWeaponOnShoot)(l_cartridge.m_ammoSect); Возвращает имя патрона, т.е. секцию. Изменено 20 Ноября 2021 пользователем НаноБот 1 5 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 21 Ноября 2021 (изменено) Скрытый текст --[[------------------------------------------------------------------------------ Ракетница Для СТАЛКЕР Тень Чернобыля Отслеживаем выстрелы, расчитано только на один выстрел за фрейм. Ракету запускает отдельный скрипт. Создано: 10.02.2017 (c) NanoBot Версия 1.03 Край. изменения: 20.03.2017 --]]------------------------------------------------------------------------------ local actor_id = 0 local con = get_console() local function log(str) if log1 then -- XE log1(str) else -- original con:execute("load ~ "..str) end end function init_wpn(obj) obj:bind_object(CWeapon(obj)) end --------------------------------------------------------------------------------------------- class "CWeapon" (object_binder) function CWeapon:__init(obj) super(obj) self.id = obj:id() end function CWeapon:net_spawn(data) if not object_binder.net_spawn(self, data) then return false end local wpn = self.object wpn:set_fastcall(self.UpdateCL, self) return true end function CWeapon:UpdateCL() local wpn = self.object local ammo_elapsed = wpn:get_ammo_in_magazine() local ammo_total = wpn:get_ammo_total() if self.last_ammo_elapsed then local npc = wpn:parent() if npc then local active_wpn = npc:active_item() if active_wpn and active_wpn:id() == self.id then -- Определяем выстрел if self.last_ammo_elapsed - ammo_elapsed == 1 and self.last_ammo_total - ammo_total == 1 and not on_open_hud(npc) then local ammo_name = _unb.get_ammo_name(wpn) bind_flares.shot_callback(wpn, ammo_name) -- log("SHOOT:["..wpn:name().."], ammo_elapsed["..ammo_elapsed.."], ammo["..ammo_name.."], alive["..tostring(npc:alive()).."]") end end end end self.last_ammo_elapsed = ammo_elapsed self.last_ammo_total = ammo_total end function CWeapon:update(delta) end function CWeapon:net_destroy() end ---------------------------------------------------------------------------------------------------- -- утилиты -- открыт ли ХУД у актора function on_open_hud(obj) return obj:id() == actor_id and level.main_input_receiver() end Работает как для актора, так и для НПС. Правда тут на одиночный огонь, для автоогня скрипт надо доработать. Как видно, ещё 4 года назад скрипт написал. Изменено 21 Ноября 2021 пользователем НаноБот чертов таб на 8 3 3 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение