Dennis_Chikin 3 658 Опубликовано 23 Марта 2014 Поделиться Опубликовано 23 Марта 2014 До 2014-го она дожила по тому, что все предпочитают что-то делать параллельно и в глубоком подполье. И на совместимость всяких правок/адаптаций/аддонов между собой всем тоже плевать. Это во-первых. Во-вторых, смарты сохранять НЕ нужно. Так же как и еще пачку других целей. Это все великолепно берется из конфига. Так же, кстати, как и "активные таски", коль скоро есть статусы. В-третьих - сколько ж можно тащить древний мусор ? Ага, это я про if i~=255 then... Да, кстати, о птичках: кто нибудь знает, что на самом деле делает :GetPhraseScript(), и что именно возвращает ? Ну, local sc = phr:GetPhraseScript() local phr = d:AddPhrase( что-попало ) local sc = phr:GetPhraseScript() ... повторить 100500 раз - это, понятно, явный мусор же. А вообще он в каких случаях действительно нужен ? Да, что касается xr_gulag.getGulagState() - "это не бага, это фича !" Очень много где испоьзуются откровенно странные возвращаемые значения из "общих функций". В частности, с теми же гулагами - многие проверки работают только если он в онлайне. Отсюда, например, вечно бегающий шустрый и перманентная бойня на АТП (сталкеры приходят, и превращются в мясо, приходят и превращаются)... Приходится дублировать руками на месте уже правильно, либо вставлять в тот же xr_gulag дублирующую (привет, совместимость). Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Romann 620 Опубликовано 23 Марта 2014 Поделиться Опубликовано 23 Марта 2014 Всем привет, можно ли в шапке темы поправить эти ссылки : Логика со вступлением и четырьмя частями: Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики А то по ним кидает на главную страницу stalkerin, а не на сами статьи... Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz). Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб). Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge. Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор Ссылка на комментарий
FantomICW 678 Опубликовано 24 Марта 2014 Поделиться Опубликовано 24 Марта 2014 @Romann, не в шапке конечно, но лови) Smart_terrain (в простонароде - гулаг) Интересный способ настройки логики для гулагов Скриптовая часть игровой логики 1 Ссылка на комментарий
Старлей 88 Опубликовано 24 Марта 2014 Поделиться Опубликовано 24 Марта 2014 (изменено) Уважаемые знатоки, подскажите пожалуйста, а за кого мы играем в мультиплеере? Если более подробно, то ковыряюсь я в SOProject. (Да я знаю, что туда мне и идти со своими расспросами, но хотя бы дайте ссылку на теорию или выскажите свои догадки). Проблема в том, что actor изначально должен быть в спавн-файле. Потом его можно удалить db.del_actor(...). И все как бы работает, единственное что не получится снять координаты позиции актора(логично, ведь мы его удалили). И я вот не пойму кем же мы бегаем то? В db.script ничего не увидел... При спавне(возрождение после смерти) пишется к примеру Ник[65535] respawned as actor. Но мы не actor... А кто тогда?! ==== local sim = alife() -- получаем сам объект класса alife_simulator local sactor = sim:actor() -- получаем серверный объект для актора Попробовал так еще. Пока непонятно ====== Но это получается серверный объект... А тот что в db.actor изначально клиентский что ли? ========= Стоп, а какие тогда методы и функции есть у серверных объектов? И возможно ли перегнать серверный объект в GameObject? Изменено 24 Марта 2014 пользователем Старлей Ray Of Hope - кооператив сталкера OldStory Ссылка на комментарий
proper70 74 Опубликовано 24 Марта 2014 Поделиться Опубликовано 24 Марта 2014 (изменено) Совершенно случайно нашел истинную причину, почему бьются сейвы в Лиманске, если сохраниться рядом зомби и изломами, бились сейвы в ОП-1 в Путепроводе, бьются сейвы если не зачистить территорию после взятия некоторых тайников Кости, когда спавнятся зомбированные сталкеры и зомби одновременно. Вот цитата со stalkerwiki: В оригинале ОГСМ и основанных на нём модах часто встречались проблемы с сохранениями на Радаре. Эту проблему долго не удавалось победить, пока наконец благодаря помощи Маландринуса не удалось выявить её первопричину. Как выяснилось, она очень проста - гражданские зомби в моде (монстры) имели в конфиге ту же пропись вида (параметр конфига species), что и монолитовцы и зомбированные (неписи). И там и тут было проставлено "zombie", и так оно было ещё с оригинала. Как оказалось, так делать категорически нельзя. Дело в том, что у неписей есть такой функционал, как хитовая память - в ней какое-то время хранятся ссылки на атакующие объекты. У монстров тоже есть остатки этого функционала, но он неработоспособен, и использовать его нельзя. В случае же когда монстры и неписи попадают в один вид, в ситуации когда они находятся рядом в бою, хитовая память монстров автоматически получает от неписей того же вида распространяемую внутри вида информацию об атакующих - а хранить её монстрам нельзя. Если после создания такой ситуации сохраниться - сейв будет вызывать вылет при загрузке. То есть проще говоря, если в бою с монолитовцами рядом оказывались гражданские зомби - и игрок сохранял игру - сейв этот не загружался. Чтобы предотвратить эти проблемы, вполне достаточно создать для гражданских зомби свой отдельный вид, добавив его прописи в конфиг game_relations. так и сделал) оставил у всех сталкеров species = zombie а всем зомби и изломам поставил species = zombi завел эту новую группу в game_relations.ltx и поставил ей такие же параметры друг-враг, как и у zombie загрузил имевшийся у меня сейв в Лиманске, и сохранился у фонтана, где бегали и неписи и моснтры зомби, и загрузил этот сейв. И - о чудо - сейв загрузился!!! То есть бились сейвы, где зомби-неписи и зомби-монстры были рядом. Подобное есть по тайникам Кости, где идет спавн при взятии тайника - там была такая же проблема) теперь и она решена)) По этой же причине в солянке не работали изломы в x-16 и Архара был вынужден их убрать оттуда из спавна - потому что там терлись неписи/зомби, и они вместе приходили в онлайн. На Янтаре нет битья сейвов потому, что там нет монстров зомби и изломов, а иначе была бы та же проблема)) Здорово, только вот пост не совсем в тему... ColR_iT Изменено 24 Марта 2014 пользователем ColR_iT 1 1 Ссылка на комментарий
Zander_driver 10 334 Опубликовано 25 Марта 2014 Поделиться Опубликовано 25 Марта 2014 Если это идентификатор текстуры, то нужно проверить его наличие в файлах-описателях для текстур А где бы мне почитать про работу с xml-файлами из скриптов? Мои познания здесь видимо очень поверхностны. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
ColR_iT 171 Опубликовано 25 Марта 2014 Поделиться Опубликовано 25 Марта 2014 А по сути нет никаких скриптов для работы с xml, окромя сласса CScriptXmlInit, который достаточно узконаправленный. Где-то на "просторах" есть парсер .xml файлов, кто автор забыл. Я с его помощью получал любое значение из указанных тегов .xml файлов. Ссылка на комментарий
Transcend 0 Опубликовано 25 Марта 2014 Поделиться Опубликовано 25 Марта 2014 (изменено) Добрый вечер, имею следующее : function use_inventory_item(s_obj) if s_obj and s_obj.section_name and s_obj:section_name()=="antirad" then news_manager.send_tip(db.actor,"%c[255,0,255,0]use_item = ok ") news_manager.send_tip(db.actor,"%c[255,0,255,0]start timer ") function_onetimer() end end ---------------------------------------------------------------------------------- local iTimer function function_onetimer() iTimer = time_global() + 1*1000 if iTimer and iTimer < time_global() then iTimer = nil news_manager.send_tip(db.actor,"%c[255,0,255,0]timer vipolnen ") news_manager.send_tip(db.actor,"%c[255,0,255,0] delete item ") delete_items_1() delete_items_2() delete_items_3() end end Должно быть так: При юзе антирада запускаем тайме, таймер отсчитал, выполняем delete_items 1,2,3 Зарегистрирован: function actor_binder:update(delta) object_binder.update(self, delta) -- дальше кэлбек таймера local interval_to_callback = 0 if interval_to_callback < time_global() then rad_inv.function_onetimer() local interval_to_callback = time_global() + 1000 end --конец кэлбека таймераПошли прочие функцииНо таймер не срабатывает, почему? Неправильный? Я уверен в том, что неисправен только таймер, без таймера всё работает. Изменено 25 Марта 2014 пользователем ColR_iT Ссылка на комментарий
Desertir 202 Опубликовано 25 Марта 2014 Поделиться Опубликовано 25 Марта 2014 (изменено) Нету понимания видимости переменных... или страдает здравая логика. 1. Условие для iTimer никогда не сработает, потому что ты строчкой выше всегда определяешь его на 1000 условных попугаев (ок, микросекунд) больше, чем текущее время. Даже если предположить (а это не так, на сколько я помню), что функция time_global() вернет разные значения в 2-х подряд идущих строчках кода, пауза никак не может быть равна 1 секунде. Нужно использовать раздельную проверку (если nil то стартуем, иначе проверяем с текущим временем, если больше, ничего не делаем, если меньше, делаем свои черные дела) 2. Та же ошибка с interval_to_callback, только обратная. Ты объявляешь ее равной нулю (инициализируешь этим значением), а потом сразу проверяешь с текущим временем, которое никак не может быть меньше нуля, соответственно условие всегда выполняется. И где логика? 3. Это какие-то взаимоисключающие таймеры, ты и вызвать функцию пытаешься по таймеру и в ней же так же делаешь проверку по таймеру. Достаточно одного, а вот где, это уже другой вопрос. ЗЫ: и это не калбек (callback), как ты указал в комментариях, это чистый апдейт (я не про "апдейт актора", а про "апдейт" как смысл слова и функции), функция-калбек имеет совершенно иное значение. Это так, на всякий случай. Изменено 25 Марта 2014 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Transcend 0 Опубликовано 25 Марта 2014 Поделиться Опубликовано 25 Марта 2014 (изменено) Много слов наговорил, а по сути то и не сказал ничего. Ты можешь нормально помочь? как выглядит чистый таймер ? --------------Таймер: local iTimer function Start_Timer_30_sek() iTimer = time_global() + 30*1000 -- взводим таймер на 30сек. end function Timer_N_minutes() if iTimer and iTimer < time_global() then iTimer = nil Moi_kvestj.give_info_ozhidanie_30_sek() -- выполняем действие end end ТАК ? 1. Используй теги, пожалуйста. 2. Готового решения не требуй. Решил разбираться - разбирайся. Готовое будет стёрто. ColR_iT Изменено 25 Марта 2014 пользователем ColR_iT Ссылка на комментарий
Zander_driver 10 334 Опубликовано 25 Марта 2014 Поделиться Опубликовано 25 Марта 2014 Разрабатывая некое окно, столкнулся с какой то чертовщиной, одни статики спокойно выводятся, другие - вызывают зависание в модуле который собственно окно вызывает. В моем случае это прекращение всех действий, которые должны вызываться из апдейта актора... но, обо всем по порядку. Когда, отслеженное в апдейте актора, случается энное событие (достается болт) вызываю свое окно: window_space = zet_t.zet_window(get_hud()) level.start_stop_menu(window_space,true) переменная window_space объявлена в "шапке" файла вне всяких функций. сам класс окна: local ltx = ini_file("hud_settings.ltx") local sModule = script_name() --/ string name of the file module --/ ------------------------------------------------------------------ --/ for output of the debug information local log = function(fmt,...) _G.log(sModule..":"..tostring(fmt),...) end if to_log and type(string.exformat) == 'function' then log = function(fmt,...) to_log(sModule..":"..string.exformat(fmt,...)) end end class "zet_window" (CUIScriptWnd) function zet_window:__init(owner) super() self.owner = owner self.controls = {} self.statics = {} self.funcs = {} self.session = 1 self:Init(100,100,703,508) self.mainframe = CUIStatic() self.mainframe:SetWindowName("main_frame") self.mainframe:Init(0,0,1,1) self.mainframe:SetFont(GetFontLetterica16Russian()) self.mainframe:SetTextColor(255, 255, 255, 255) self.mainframe:InitTexture("ui\\bar_bl") self.mainframe:SetStretchTexture(true) self:Register(self.mainframe) mag_ref_support.register_ammo_window(self) self:AttachChild(self.mainframe) self:StartLoad() end function zet_window:__finalize() mag_ref_support.unregister_ammo_window() end function zet_window:GetValidStaticID() local stat_id = 1 while self.statics[stat_id] ~= nil do stat_id = stat_id + 1 end return stat_id end function zet_window:GetValidControlID() local stat_id = 1 while self.controls[stat_id] ~= nil do stat_id = stat_id + 1 end return stat_id end function zet_window:GetValidFunctionID() local stat_id = 1 while self.funcs[stat_id] ~= nil do stat_id = stat_id + 1 end return stat_id end function zet_window:StartLoad() log("StartLoad") local s1 = ltx:r_string("zet_window","slot1") local t1 = zander_utils.string_uncompress(s1, ",") local s2 = ltx:r_string("zet_window","slot2") local t2 = zander_utils.string_uncompress(s2, ",") local s3 = ltx:r_string("zet_window","slot3") local t3 = zander_utils.string_uncompress(s3, ",") local s4 = ltx:r_string("zet_window","frame1") local t4 = zander_utils.string_uncompress(s4, ",") self:AddFrameSpace(10, {"ui\\bar_red", "ui\\bar_yellow"}, t1[1], t1[2], t1[3], t1[4], self.mainframe) self:AddFrameSpace(10, {"ui\\bar_red", "ui\\bar_yellow"}, t2[1], t2[2], t2[3], t2[4], self.mainframe) self:AddFrameSpace(10, {"ui\\bar_red", "ui\\bar_yellow"}, t3[1], t3[2], t3[3], t3[4], self.mainframe) self:AddFrameSpace(10, {"ui\\bar_red", "ui\\bar_yellow"}, t4[1], t4[2], t4[3], t4[4], self.mainframe) end function zet_window:OnKeyboard(dik, keyboard_action) --virtual function CUIScriptWnd.OnKeyboard(self,dik,keyboard_action) if keyboard_action == ui_events.WINDOW_KEY_PRESSED then if dik == DIK_keys.DIK_ESCAPE then events.close_window() end end return true end function zet_window:AddFrameSpace(border, texture_table, x, y, w, h, m_frame) --- добавить окно с рамкой, с установленными параметрами --- опционально - прием данных в формате одной таблицы log("AddFrame_start") if type(border) == "table" then texture_table = border[2] x = border[3] y = border[4] w = border[5] h = border[6] m_frame = border[7] border = border[1] end log("Initializing_textures") --- определяем, какие нам даны текстуры local R_tex = "" -- 1 ; 1 ; 1 local RB_tex = "" -- 2 ; 2 ; 1 local B_tex = "" -- 3 ; 3 ; 1 local BL_tex = "" -- 4 ; 2 ; 1 local L_tex = "" -- 5 ; 1 ; 1 local UL_tex = "" -- 6 ; 2 ; 1 local U_tex = "" -- 7 ; 3 ; 1 local UR_tex = "" -- 8 ; 2 ; 1 local W_tex = "" -- 9 ; 4 ; 2 -- если в таблице 9 элементов, значит нам дали по отдельности текстуры на каждый угол и на каждую границу окна. -- если в таблице 4 элемента, значит нам дали текстуру для вертикальных границ, для горизонтальных границ, для углов и окна -- если в таблице всего 2 элемента, то первый для границ и углов а второй для окна. if texture_table[9] ~= nil then R_tex = texture_table[1] RB_tex = texture_table[2] B_tex = texture_table[3] BL_tex = texture_table[4] L_tex = texture_table[5] UL_tex = texture_table[6] U_tex = texture_table[7] UR_tex = texture_table[8] W_tex = texture_table[9] elseif texture_table[4] ~= nil then R_tex = texture_table[1] RB_tex = texture_table[2] B_tex = texture_table[3] BL_tex = texture_table[2] L_tex = texture_table[1] UL_tex = texture_table[2] U_tex = texture_table[3] UR_tex = texture_table[2] W_tex = texture_table[4] else R_tex = texture_table[1] RB_tex = texture_table[1] B_tex = texture_table[1] BL_tex = texture_table[1] L_tex = texture_table[1] UL_tex = texture_table[1] U_tex = texture_table[1] UR_tex = texture_table[1] W_tex = texture_table[2] end log("Create_Statics_start") local S = self:AddStatic(W_tex, m_frame, x + border, y + border, w - (border * 2), h - (border * 2)) log("Wstatic_created") -- VALID self:AddStatic(B_tex, m_frame, x + border, y + h - border, w - (border * 2), border) log("Bstatic_created") -- VALID self:AddStatic(R_tex, m_frame, x + w - border, y + border, border, h - (border * 2)) log("Rstatic_created")-- VALID self:AddStatic(RB_tex, m_frame, x + w - border, y + h - border, border, border) log("RBstatic_created") -- VALID self:AddStatic(UL_tex, m_frame, x, y, border, border) log("ULstatic_created") -- NOT VALID self:AddStatic(L_tex, m_frame, x, y + border, border, h - (border * 2)) log("Lstatic_created") -- NOT VALID self:AddStatic(BL_tex, m_frame, x, y + h - border, border, border) log("BLstatic_created") -- NOT VALID self:AddStatic(UR_tex, m_frame, x + w - border, y, border, border) log("URstatic_created") -- NOT VALID self:AddStatic(U_tex, m_frame, x + border, y, w - (border * 2), border) log("Ustatic_created") -- NOT VALID log("Create_Statics_complete") return S --- возвращаем ID статика, который является полем созданного окна. end function zet_window:AddStatic(texture,m_frame,x,y,w,h) log("AddStatic;Arguments:"..texture..","..tostring(x)..","..tostring(y)..","..tostring(w)..","..tostring(h)) if type(texture) == "table" then m_frame = texture[2] x = texture[3] y = texture[4] w = texture[5] h = texture[6] texture = texture[1] end log("find_ID") --- добавляет настроенный статик. без регистрации событий на нем local s = self:GetValidStaticID() self.statics[s] = CUIStatic() log("Init...") self.statics[s]:Init(x,y,w,h) log("Texturing...") self.statics[s]:InitTexture(texture) log("StretchTexture...") self.statics[s]:SetStretchTexture(true) log("AutoDelete...") self.statics[s]:SetAutoDelete(true) log("Attach...") if m_frame then m_frame:AttachChild(self.statics[s]) else self:AttachChild(self.statics[s]) end log("Static_Created.") return s end Как видно, в коде предостаточно сообщений в лог, позволяющих контролировать, что происходит. И вот что мы получаем: * DBG: state_mgr_animstate:(318):set new target state sit_ass * DBG: zet_t:StartLoad * DBG: zet_t:AddFrame_start * DBG: zet_t:Initializing_textures * DBG: zet_t:Create_Statics_start * DBG: zet_t:AddStatic;Arguments:ui\bar_yellow,34,34,130,80 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:Wstatic_created * DBG: zet_t:AddStatic;Arguments:ui\bar_red,34,114,130,10 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:Bstatic_created * DBG: zet_t:AddStatic;Arguments:ui\bar_red,164,34,10,80 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:Rstatic_created * DBG: zet_t:AddStatic;Arguments:ui\bar_red,164,114,10,10 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:RBstatic_created * DBG: zet_t:AddStatic;Arguments:ui\bar_red,24,24,10,10 * DBG: zet_t:find_ID * DBG: zet_t:Init... - Disconnect - Destroying level Из лога видим, что скрипт начал выводить статики. И успешно завершил обработку первых четырех. А на инициализации пятого - повис. zet_t:Init... именно это и только это всегда было в случае зависания, последней строкой, отправленной этим модулем. Апдейты актора после этого прекращаются, дисконнект - это уже я закрываю игру.Теперь о том, когда и на каком статике эти зависания происходят. В классе окна есть метод AddFrameSpace, в нем расположены вызовы метода AddStatic, который непосредственно занимается добавлением статиков на окно. Так вот, как можно видеть, в этом AddFrameSpace, различные вызовы подписаны комментариями --VALID либо --NOT VALID. это не случайно. Я произвел множество тестов, меняя их местами. Те, что валидны - обрабатываются не вызывая проблем. Те что не валидны - вызывают зависание. Я даже добился успешной обработки всего класса окна, закомментировав вызовы всех невалидных статиков. Но стоит вызвать хоть один невалидный - не важно первым он будет, или пятым как здесь - именно на нем все зависнет.Поясню, в чем смысл метода AddFrameSpace. он выводит окно с рамкой, выводя каждую вертикальную/горизонтальную границу окна и каждый угол окна как отдельный статик, а так же заполняя поле окна тоже отдельным статиком. Так вот в валидности статиков прослеживается закономерность. Все статики которые относятся к верхней и/или левой границе окна, не валидны. А внутреннее поле окна, нижняя и правая граница, и нижний правый угол выводятся. Повторюсь, неважно в каком порядке я вывожу статики - именно верхние-левые вызывают проблему при своей инициализации.Менять координаты окна я тоже пробовал, Результат тот же. Один и тот же метод, аналогичные входные данные для него, различающиеся только численными значениями, и вот такое странное неодинаковое поведение. Верхние-левые - не выводятся, остальное без проблем.Может я чего то не знаю/не понимаю... есть какое то объяснение этой чертовщины? Дабы не быть голословным, результаты парочки тестов... Меняем метод AddFrameSpace таким образом: function zet_window:AddFrameSpace(border, texture_table, x, y, w, h, m_frame) --- добавить окно с рамкой, с установленными параметрами --- опционально - прием данных в формате одной таблицы log("AddFrame_start") if type(border) == "table" then texture_table = border[2] x = border[3] y = border[4] w = border[5] h = border[6] m_frame = border[7] border = border[1] end log("Initializing_textures") --- определяем, какие нам даны текстуры local R_tex = "" -- 1 ; 1 ; 1 local RB_tex = "" -- 2 ; 2 ; 1 local B_tex = "" -- 3 ; 3 ; 1 local BL_tex = "" -- 4 ; 2 ; 1 local L_tex = "" -- 5 ; 1 ; 1 local UL_tex = "" -- 6 ; 2 ; 1 local U_tex = "" -- 7 ; 3 ; 1 local UR_tex = "" -- 8 ; 2 ; 1 local W_tex = "" -- 9 ; 4 ; 2 -- если в таблице 9 элементов, значит нам дали по отдельности текстуры на каждый угол и на каждую границу окна. -- если в таблице 4 элемента, значит нам дали текстуру для вертикальных границ, для горизонтальных границ, для углов и окна -- если в таблице всего 2 элемента, то первый для границ и углов а второй для окна. if texture_table[9] ~= nil then R_tex = texture_table[1] RB_tex = texture_table[2] B_tex = texture_table[3] BL_tex = texture_table[4] L_tex = texture_table[5] UL_tex = texture_table[6] U_tex = texture_table[7] UR_tex = texture_table[8] W_tex = texture_table[9] elseif texture_table[4] ~= nil then R_tex = texture_table[1] RB_tex = texture_table[2] B_tex = texture_table[3] BL_tex = texture_table[2] L_tex = texture_table[1] UL_tex = texture_table[2] U_tex = texture_table[3] UR_tex = texture_table[2] W_tex = texture_table[4] else R_tex = texture_table[1] RB_tex = texture_table[1] B_tex = texture_table[1] BL_tex = texture_table[1] L_tex = texture_table[1] UL_tex = texture_table[1] U_tex = texture_table[1] UR_tex = texture_table[1] W_tex = texture_table[2] end log("Create_Statics_start") local S = self:AddStatic(W_tex, m_frame, x + border, y + border, w - (border * 2), h - (border * 2)) log("Wstatic_created") -- VALID self:AddStatic(B_tex, m_frame, x + border, y + h - border, w - (border * 2), border) log("Bstatic_created") -- VALID self:AddStatic(R_tex, m_frame, x + w - border, y + border, border, h - (border * 2)) log("Rstatic_created")-- VALID self:AddStatic(RB_tex, m_frame, x + w - border, y + h - border, border, border) log("RBstatic_created") -- VALID --[[ self:AddStatic(UL_tex, m_frame, x, y, border, border) log("ULstatic_created") -- NOT VALID self:AddStatic(L_tex, m_frame, x, y + border, border, h - (border * 2)) log("Lstatic_created") -- NOT VALID self:AddStatic(BL_tex, m_frame, x, y + h - border, border, border) log("BLstatic_created") -- NOT VALID self:AddStatic(UR_tex, m_frame, x + w - border, y, border, border) log("URstatic_created") -- NOT VALID self:AddStatic(U_tex, m_frame, x + border, y, w - (border * 2), border) log("Ustatic_created") -- NOT VALID ]] log("Create_Statics_complete") return S --- возвращаем ID статика, который является полем созданного окна. end получаем * DBG: xr_sound:(371):SOUND_OBJECT: selected id [2] for theme [day_music_dolg_tolikk_razija], type [function: 0A0C0D10], size [10] * DBG: state_mgr_animstate:(318):set new target state sit_ass * DBG: zet_t:StartLoad * DBG: zet_t:AddFrame_start * DBG: zet_t:Initializing_textures * DBG: zet_t:Create_Statics_start * DBG: zet_t:AddStatic;Arguments:ui\bar_yellow,34,34,130,80 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:Wstatic_created * DBG: zet_t:AddStatic;Arguments:ui\bar_red,34,114,130,10 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:Bstatic_created * DBG: zet_t:AddStatic;Arguments:ui\bar_red,164,34,10,80 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:Rstatic_created * DBG: zet_t:AddStatic;Arguments:ui\bar_red,164,114,10,10 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:RBstatic_created * DBG: zet_t:Create_Statics_complete * DBG: zet_t:AddFrame_start * DBG: zet_t:Initializing_textures * DBG: zet_t:Create_Statics_start * DBG: zet_t:AddStatic;Arguments:ui\bar_yellow,210,34,230,80 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:Wstatic_created * DBG: zet_t:AddStatic;Arguments:ui\bar_red,210,114,230,10 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:Bstatic_created * DBG: zet_t:AddStatic;Arguments:ui\bar_red,440,34,10,80 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:Rstatic_created * DBG: zet_t:AddStatic;Arguments:ui\bar_red,440,114,10,10 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:RBstatic_created * DBG: zet_t:Create_Statics_complete * DBG: zet_t:AddFrame_start * DBG: zet_t:Initializing_textures * DBG: zet_t:Create_Statics_start * DBG: zet_t:AddStatic;Arguments:ui\bar_yellow,510,34,330,80 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:Wstatic_created * DBG: zet_t:AddStatic;Arguments:ui\bar_red,510,114,330,10 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:Bstatic_created * DBG: zet_t:AddStatic;Arguments:ui\bar_red,840,34,10,80 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:Rstatic_created * DBG: zet_t:AddStatic;Arguments:ui\bar_red,840,114,10,10 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:RBstatic_created * DBG: zet_t:Create_Statics_complete * DBG: zet_t:AddFrame_start * DBG: zet_t:Initializing_textures * DBG: zet_t:Create_Statics_start * DBG: zet_t:AddStatic;Arguments:ui\bar_yellow,40,160,380,380 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:Wstatic_created * DBG: zet_t:AddStatic;Arguments:ui\bar_red,40,540,380,10 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:Bstatic_created * DBG: zet_t:AddStatic;Arguments:ui\bar_red,420,160,10,380 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:Rstatic_created * DBG: zet_t:AddStatic;Arguments:ui\bar_red,420,540,10,10 * DBG: zet_t:find_ID * DBG: zet_t:Init... * DBG: zet_t:Texturing... * DBG: zet_t:StretchTexture... * DBG: zet_t:AutoDelete... * DBG: zet_t:Attach... * DBG: zet_t:Static_Created. * DBG: zet_t:RBstatic_created * DBG: zet_t:Create_Statics_complete * DBG: level_weathers:(52):weather_update day [12] - Disconnect Свидетельствующий об успешной обработке всех статиков. Окошки отобразились, их можно тыкать мышкой и кнопками, все работает, ничего не зависло. Меняем код вот так: (обратите внимание какой статик теперь вызывается первым) function zet_window:AddFrameSpace(border, texture_table, x, y, w, h, m_frame) --- добавить окно с рамкой, с установленными параметрами --- опционально - прием данных в формате одной таблицы log("AddFrame_start") if type(border) == "table" then texture_table = border[2] x = border[3] y = border[4] w = border[5] h = border[6] m_frame = border[7] border = border[1] end log("Initializing_textures") --- определяем, какие нам даны текстуры local R_tex = "" -- 1 ; 1 ; 1 local RB_tex = "" -- 2 ; 2 ; 1 local B_tex = "" -- 3 ; 3 ; 1 local BL_tex = "" -- 4 ; 2 ; 1 local L_tex = "" -- 5 ; 1 ; 1 local UL_tex = "" -- 6 ; 2 ; 1 local U_tex = "" -- 7 ; 3 ; 1 local UR_tex = "" -- 8 ; 2 ; 1 local W_tex = "" -- 9 ; 4 ; 2 -- если в таблице 9 элементов, значит нам дали по отдельности текстуры на каждый угол и на каждую границу окна. -- если в таблице 4 элемента, значит нам дали текстуру для вертикальных границ, для горизонтальных границ, для углов и окна -- если в таблице всего 2 элемента, то первый для границ и углов а второй для окна. if texture_table[9] ~= nil then R_tex = texture_table[1] RB_tex = texture_table[2] B_tex = texture_table[3] BL_tex = texture_table[4] L_tex = texture_table[5] UL_tex = texture_table[6] U_tex = texture_table[7] UR_tex = texture_table[8] W_tex = texture_table[9] elseif texture_table[4] ~= nil then R_tex = texture_table[1] RB_tex = texture_table[2] B_tex = texture_table[3] BL_tex = texture_table[2] L_tex = texture_table[1] UL_tex = texture_table[2] U_tex = texture_table[3] UR_tex = texture_table[2] W_tex = texture_table[4] else R_tex = texture_table[1] RB_tex = texture_table[1] B_tex = texture_table[1] BL_tex = texture_table[1] L_tex = texture_table[1] UL_tex = texture_table[1] U_tex = texture_table[1] UR_tex = texture_table[1] W_tex = texture_table[2] end log("Create_Statics_start") self:AddStatic(UL_tex, m_frame, x, y, border, border) log("ULstatic_created") -- NOT VALID local S = self:AddStatic(W_tex, m_frame, x + border, y + border, w - (border * 2), h - (border * 2)) log("Wstatic_created") -- VALID self:AddStatic(B_tex, m_frame, x + border, y + h - border, w - (border * 2), border) log("Bstatic_created") -- VALID self:AddStatic(R_tex, m_frame, x + w - border, y + border, border, h - (border * 2)) log("Rstatic_created")-- VALID self:AddStatic(RB_tex, m_frame, x + w - border, y + h - border, border, border) log("RBstatic_created") -- VALID self:AddStatic(L_tex, m_frame, x, y + border, border, h - (border * 2)) log("Lstatic_created") -- NOT VALID self:AddStatic(BL_tex, m_frame, x, y + h - border, border, border) log("BLstatic_created") -- NOT VALID self:AddStatic(UR_tex, m_frame, x + w - border, y, border, border) log("URstatic_created") -- NOT VALID self:AddStatic(U_tex, m_frame, x + border, y, w - (border * 2), border) log("Ustatic_created") -- NOT VALID log("Create_Statics_complete") return S --- возвращаем ID статика, который является полем созданного окна. end получаем * DBG: state_mgr_animstate:(318):set new target state sit_ass * DBG: zet_t:StartLoad * DBG: zet_t:AddFrame_start * DBG: zet_t:Initializing_textures * DBG: zet_t:Create_Statics_start * DBG: zet_t:AddStatic;Arguments:ui\bar_red,24,24,10,10 * DBG: zet_t:find_ID * DBG: zet_t:Init... - Disconnect Свидетельствующий о том что все рухнуло сразу же при попытке обработать самый первый статик. Зависание, апдейты актора не обрабатываются, никакого окна на экран не выведено. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Nazgool 250 Опубликовано 27 Марта 2014 Поделиться Опубликовано 27 Марта 2014 (изменено) Zander_driver По всей вероятности у Вас не правильно работает функция zander_utils.string_uncompress Значения t1[1] - t1[4] получаются строками в выражении : self:AddFrameSpace(10, {"ui\\bar_red", "ui\\bar_yellow"}, t1[1], t1[2], t1[3], t1[4], self.mainframe) Если не верите, то вместо "остринговывания" : log("AddStatic;Arguments:"..texture..","..tostring(x)..","..tostring(y)..","..tostring(w)..","..tostring(h)) проверьте тип данных. Во всех валидных вариантах Вы производите с этими данными математические операции, при которых происходит автоматическое преобразование получаемых результатов в числовой формат. В каждом из не валидных данных Вы используете хотя бы один из передаваемых аргументов, с которыми не производятся никакие математические действия. И зависание может быть только от того, что X,Y,W или H - это строки. А функция CUIStatic:Init(x,y,w,h) строки не умеет кушать ) Где-то на "просторах" есть парсер .xml файлов, кто автор забыл Автор - Kirag Но я бы советовал установить (если нет) Lua расширение от RvP и использовать библиотеку LuaXml. С помощью этих библиотек можно кое-какие фортеля выкидывать. Если заинтересует - продолжу. Изменено 27 Марта 2014 пользователем Gun12 Ссылка на комментарий
Comador 203 Опубликовано 27 Марта 2014 Поделиться Опубликовано 27 Марта 2014 С помощью этих библиотек можно кое-какие фортеля выкидывать. Если заинтересует - продолжу. Хотелось бы почитать об этом. Неважно – сколько у тебя друзей. Важно - сколько из них помогут тебе в трудную минуту и сколько вспомнят о тебе когда им хорошо. "Худ" и "Умное выпадание частей монстров" для Народной солянки Ссылка на комментарий
Nazgool 250 Опубликовано 27 Марта 2014 Поделиться Опубликовано 27 Марта 2014 ComadorЕсли по-быстрому, то ... Движку всё-равно что записано в xml файле, главное что бы он был. Поэтому можно создать пустой файл, а затем динамически, с помощью библиотеки io в него писать нужный xml текст. Затем вызывать CScriptXmlInit и указывать на этот динамический файл. Переписывая его согласно необходимым условиям, можно управлять ранее недоступными процессами, определяющимися только в в xml файлах. Я делаю это с помощью специальной оболочки, использующей новые классы (аналоги стандартных), в которых добавлены методы управления всеми процессами, которые ранее необходимо было фактически прописывать в xml. 1 Ссылка на комментарий
Zander_driver 10 334 Опубликовано 27 Марта 2014 Поделиться Опубликовано 27 Марта 2014 По всей вероятности у Вас не правильно работает функция zander_utils.string_uncompress Значения t1[1] - t1[4] получаются строками в выражении : self:AddFrameSpace(10, {"ui\\bar_red", "ui\\bar_yellow"}, t1[1], t1[2], t1[3], t1[4], self.mainframe) Совершенно верно, именно к этому результату мы с Charsi пришли в ходе переписки в личке. О том что проблема решена, в посте написать забыл Но я бы советовал установить (если нет) Lua расширение от RvP и использовать библиотеку LuaXml. Стоит Lua-расширение от RvP для вывода дебаговой информации во второй лог, это то же самое или нет? Описанный вами функционал меня очень заинтересовал. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Nazgool 250 Опубликовано 28 Марта 2014 Поделиться Опубликовано 28 Марта 2014 это то же самое или нет? Да, это то. Ещё нужна библиотека LuaXml. Там одна dll-ка и lua файл. Ссылка на комментарий
Zander_driver 10 334 Опубликовано 28 Марта 2014 Поделиться Опубликовано 28 Марта 2014 Где это взять, и как пользоваться?) Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
RayTwitty 492 Опубликовано 28 Марта 2014 Поделиться Опубликовано 28 Марта 2014 (изменено) @Zander_driver, http://viremo.eludi.net/LuaXML/ Качать версию для lua 5.1. Изменено 28 Марта 2014 пользователем Shadows Ссылка на комментарий
k01jan 816 Опубликовано 28 Марта 2014 Поделиться Опубликовано 28 Марта 2014 , и как с ней бороться? Ссылка на комментарий
Nazgool 250 Опубликовано 28 Марта 2014 Поделиться Опубликовано 28 Марта 2014 (изменено) Подготавливаю русский мануал. Заодно и правленый LuaXml.lua подкину. Там функция find не очень. Да и добавил несколько новых. http://rghost.ru/53555112 Остальные ответы по ходу дела. Изменено 29 Марта 2014 пользователем ColR_iT Добавлено Murarius, 19 Октября 2014 Ссылка померла, увы. 2 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти