Перейти к контенту

Рекомендуемые сообщения

До 2014-го она дожила по тому, что все предпочитают что-то делать параллельно и в глубоком подполье. ;)

И на совместимость всяких правок/адаптаций/аддонов между собой всем тоже плевать.

Это во-первых.

 

Во-вторых, смарты сохранять НЕ нужно. Так же как и еще пачку других целей. Это все великолепно берется из конфига. Так же, кстати, как и "активные таски", коль скоро есть статусы.

 

В-третьих - сколько ж можно тащить древний мусор ? Ага, это я про if i~=255 then...

 

Да, кстати, о птичках: кто нибудь знает, что на самом деле делает :GetPhraseScript(), и что именно возвращает ?

 

Ну, local sc = phr:GetPhraseScript()

local phr = d:AddPhrase( что-попало )

local sc = phr:GetPhraseScript() ... повторить 100500 раз - это, понятно, явный мусор же.

А вообще он в каких случаях действительно нужен ?

 

Да, что касается xr_gulag.getGulagState() - "это не бага, это фича !"

Очень много где испоьзуются откровенно странные возвращаемые значения из "общих функций". В частности, с теми же гулагами - многие проверки работают только если он в онлайне. Отсюда, например, вечно бегающий шустрый и перманентная бойня на АТП (сталкеры приходят, и превращются в мясо, приходят и превращаются)...

 

Приходится дублировать руками на месте уже правильно, либо вставлять в тот же xr_gulag дублирующую (привет, совместимость).

Ссылка на комментарий

Всем привет, можно ли в шапке темы поправить эти ссылки :

А то по ним кидает на главную страницу 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.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

Ссылка на комментарий

Уважаемые знатоки, подскажите пожалуйста, а за кого мы играем в мультиплеере? Если более подробно, то ковыряюсь я в SOProject. (Да я знаю, что туда мне и идти со своими расспросами, но хотя бы дайте ссылку на теорию или выскажите свои догадки). Проблема в том, что actor изначально должен быть в спавн-файле. Потом его можно удалить db.del_actor(...). И все как бы работает, единственное что не получится снять координаты позиции актора(логично, ведь мы его удалили). И я вот не пойму кем же мы бегаем то? В db.script ничего не увидел... При спавне(возрождение после смерти) пишется к примеру Ник[65535] respawned as actor. Но мы не actor... А кто тогда?!

 

 

====

local sim = alife() -- получаем сам объект класса alife_simulator
local sactor = sim:actor() -- получаем серверный объект для актора

 

Попробовал так еще. Пока непонятно

======

Но это получается серверный объект... А тот что в db.actor изначально клиентский что ли?



=========

Стоп, а какие тогда методы и функции есть у серверных объектов? И возможно ли перегнать серверный объект в GameObject?

Изменено пользователем Старлей
Ссылка на комментарий

Совершенно случайно нашел истинную причину, почему бьются сейвы в Лиманске, если сохраниться рядом зомби и изломами, бились сейвы в ОП-1 в Путепроводе, бьются сейвы если не зачистить территорию после взятия некоторых тайников Кости, когда спавнятся зомбированные сталкеры и зомби одновременно. Вот цитата со stalkerwiki:

 

 

В оригинале ОГСМ и основанных на нём модах часто встречались проблемы с сохранениями на Радаре. Эту проблему долго не удавалось победить, пока наконец благодаря помощи Маландринуса не удалось выявить её первопричину. Как выяснилось, она очень проста - гражданские зомби в моде (монстры) имели в конфиге ту же пропись вида (параметр конфига species), что и монолитовцы и зомбированные (неписи). И там и тут было проставлено "zombie", и так оно было ещё с оригинала. Как оказалось, так делать категорически нельзя. Дело в том, что у неписей есть такой функционал, как хитовая память - в ней какое-то время хранятся ссылки на атакующие объекты. У монстров тоже есть остатки этого функционала, но он неработоспособен, и использовать его нельзя. В случае же когда монстры и неписи попадают в один вид, в ситуации когда они находятся рядом в бою, хитовая память монстров автоматически получает от неписей того же вида распространяемую внутри вида информацию об атакующих - а хранить её монстрам нельзя. Если после создания такой ситуации сохраниться - сейв будет вызывать вылет при загрузке. То есть проще говоря, если в бою с монолитовцами рядом оказывались гражданские зомби - и игрок сохранял игру - сейв этот не загружался. Чтобы предотвратить эти проблемы, вполне достаточно создать для гражданских зомби свой отдельный вид, добавив его прописи в конфиг game_relations.

 

 

так и сделал) оставил у всех сталкеров 

species                            = zombie

а всем зомби и изломам поставил

species                    = zombi

завел эту новую группу в game_relations.ltx и поставил ей такие же параметры друг-враг, как и у zombie

 

загрузил имевшийся у меня сейв  в Лиманске, и сохранился у фонтана, где бегали и неписи и моснтры зомби, и загрузил этот сейв. И - о чудо - сейв загрузился!!! То есть бились сейвы, где зомби-неписи и зомби-монстры были рядом. Подобное есть по тайникам Кости, где идет спавн при взятии тайника - там была такая же проблема) теперь и она решена))

 

По этой же причине в солянке не работали изломы в x-16 и Архара был вынужден их убрать оттуда из спавна - потому что там терлись неписи/зомби, и они вместе приходили в онлайн. На Янтаре нет битья сейвов потому, что там нет монстров зомби и изломов, а иначе была бы та же проблема))

 

Здорово, 697e7bf03714a0175ceff55cef81032b.gif только вот пост не совсем в тему...

ColR_iT

Изменено пользователем ColR_iT
  • Спасибо 1
  • Полезно 1
Ссылка на комментарий

 

 


Если это идентификатор текстуры, то нужно проверить его наличие в файлах-описателях для текстур

А где бы мне почитать про работу с 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.

Ссылка на комментарий

А по сути нет никаких скриптов для работы с xml, окромя сласса CScriptXmlInit, который достаточно узконаправленный.

Где-то на "просторах" есть парсер .xml файлов, кто автор забыл. Я с его помощью получал любое значение из указанных тегов .xml файлов.

Ссылка на комментарий

Добрый вечер, имею следующее :

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
    --конец кэлбека таймера
Пошли прочие функции

Но таймер не срабатывает, почему? Неправильный? Я уверен в том, что неисправен только таймер, без таймера всё работает.

Изменено пользователем ColR_iT
Ссылка на комментарий

Нету понимания видимости переменных... или страдает здравая логика.

1. Условие для iTimer никогда не сработает, потому что ты строчкой выше всегда определяешь его на 1000 условных попугаев (ок, микросекунд) больше, чем текущее время. Даже если предположить (а это не так, на сколько я помню), что функция time_global() вернет разные значения в 2-х подряд идущих строчках кода, пауза никак не может быть равна 1 секунде. Нужно использовать раздельную проверку (если nil то стартуем, иначе проверяем с текущим временем, если больше, ничего не делаем, если меньше, делаем свои черные дела)

2. Та же ошибка с interval_to_callback, только обратная. Ты объявляешь ее равной нулю (инициализируешь этим значением), а потом сразу проверяешь с текущим временем, которое никак не может быть меньше нуля, соответственно условие всегда выполняется. И где логика?

3. Это какие-то взаимоисключающие таймеры, ты и вызвать функцию пытаешься по таймеру и в ней же так же делаешь проверку по таймеру. Достаточно одного, а вот где, это уже другой вопрос.

ЗЫ: и это не калбек (callback), как ты указал в комментариях, это чистый апдейт (я не про "апдейт актора", а про "апдейт" как смысл слова и функции), функция-калбек имеет совершенно иное значение. Это так, на всякий случай.

Изменено пользователем Desertir

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

Много слов наговорил, а по сути то и не сказал ничего. Ты можешь нормально помочь? как выглядит чистый таймер ?  

--------------Таймер:
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

Изменено пользователем ColR_iT
Ссылка на комментарий

Разрабатывая некое окно, столкнулся с какой то чертовщиной, одни статики спокойно выводятся, другие - вызывают зависание в модуле который собственно окно вызывает. В моем случае это прекращение всех действий, которые должны вызываться из апдейта актора...

но, обо всем по порядку.

Когда, отслеженное в апдейте актора, случается энное событие (достается болт) вызываю свое окно:

    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.

Ссылка на комментарий

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.

С помощью этих библиотек можно кое-какие фортеля выкидывать. Если заинтересует - продолжу.

Изменено пользователем Gun12
Ссылка на комментарий

 

 


С помощью этих библиотек можно кое-какие фортеля выкидывать. Если заинтересует - продолжу.

Хотелось бы почитать об этом.

Неважно – сколько у тебя друзей. Важно - сколько из них помогут тебе в трудную минуту и сколько вспомнят о тебе когда им хорошо.

"Худ" и "Умное выпадание частей монстров" для Народной солянки

Ссылка на комментарий
Comador

Если по-быстрому, то  ...

Движку всё-равно что записано в xml файле, главное что бы он был.

Поэтому можно создать пустой файл, а затем динамически, с помощью библиотеки io в него писать нужный xml текст.

Затем вызывать CScriptXmlInit и указывать на этот динамический файл.

Переписывая его согласно необходимым условиям, можно  управлять ранее недоступными процессами, определяющимися только в в xml файлах.

 

Я делаю это с помощью специальной оболочки, использующей новые классы (аналоги стандартных), в которых добавлены методы управления всеми процессами, которые ранее необходимо было фактически прописывать в xml.

  • Нравится 1
Ссылка на комментарий

 

 


По всей вероятности у Вас не правильно работает функция 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.

Ссылка на комментарий

Где это взять, и как пользоваться?)

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

Ссылка на комментарий

Подготавливаю русский мануал.

Заодно и правленый LuaXml.lua подкину. Там функция find не очень.

Да и добавил несколько новых.

 

 

http://rghost.ru/53555112

Остальные ответы по ходу дела.

Изменено пользователем ColR_iT
Добавлено  Murarius,

Ссылка померла, увы.

  • Нравится 2
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   1 пользователь

×
×
  • Создать...