Перейти к содержанию
Overf1rst

[CoP] Модострой: вопросница

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

 
 
Emilien220

Здравствуйте уважаемые мододелы продолжил делать мод на зп и решил сделать панель для ввода кода для двери однако когда подхожу и нажимаю ф на кнопку для ввода цифр получаю вылет :
 

[LUA] Error: [string "xr_logic"]:639: attempt to call a nil value

FATAL ERROR

[error]Expression    : !m_error_code
[error]Function      : raii_guard::~raii_guard
[error]File          : F:\ixray-team\ixray-1.6-stcop\src\xrScripts\script_storage.cpp
[error]Line          : 530
[error]Description   : see call_stack for details!


хочу поделится custom data моей панели для ввода кода:
 

Спойлер

 

[logic]
active = ph_button@wait

[ph_button@wait]
anim = off
on_press = %=ui_code_pad.open_my_door_code%
tip_text = "st_btn_enter_code"
on_info = {+lab_door_unlocked} ph_button@unlocked

[ph_button@unlocked]
anim = on
tip_text = "st_btn_access_granted"

 

Спойлер

 

class "UI_CodePad" (CUIScriptWnd)

function UI_CodePad:__init(correct_code, on_success_info) super()
    self.correct_code = tostring(correct_code or "1234")
    self.on_success_info = on_success_info
    self.entered_code = ""

    self:InitControls()
    self:InitCallBacks()
end

function UI_CodePad:__finalize()
end

function UI_CodePad:InitControls()
    self:SetWndRect(Frect():set(0, 0, 1024, 768))

    local xml = CScriptXmlInit()
    xml:ParseFile("ui_code_pad.xml")

    self.dialog = xml:InitStatic("background", self)

    -- Дисплей
    self.display = xml:InitTextWnd("code_display", self.dialog)
    self.display:SetText("----")

    -- Кнопки
    self.btn_1 = xml:Init3tButton("btn_1", self.dialog)
    self:Register(self.btn_1, "btn_1")

    self.btn_2 = xml:Init3tButton("btn_2", self.dialog)
    self:Register(self.btn_2, "btn_2")

    self.btn_3 = xml:Init3tButton("btn_3", self.dialog)
    self:Register(self.btn_3, "btn_3")

    -- Сброс и Подтверждение
    self.btn_clear = xml:Init3tButton("btn_clear", self.dialog)
    self:Register(self.btn_clear, "btn_clear")

    self.btn_ok = xml:Init3tButton("btn_ok", self.dialog)
    self:Register(self.btn_ok, "btn_ok")
end

function UI_CodePad:InitCallBacks()
    -- Безопасная привязка через методы класса (без анонимных функций)
    self:AddCallback("btn_1", ui_events.BUTTON_CLICKED, self.OnBtn1, self)
    self:AddCallback("btn_2", ui_events.BUTTON_CLICKED, self.OnBtn2, self)
    self:AddCallback("btn_3", ui_events.BUTTON_CLICKED, self.OnBtn3, self)

    self:AddCallback("btn_clear", ui_events.BUTTON_CLICKED, self.OnClear, self)
    self:AddCallback("btn_ok", ui_events.BUTTON_CLICKED, self.OnCheckCode, self)
end

-- Обработчики нажатий на кнопки
function UI_CodePad:OnBtn1()
    self:AddDigit("1")
end

function UI_CodePad:OnBtn2()
    self:AddDigit("2")
end

function UI_CodePad:OnBtn3()
    self:AddDigit("3")
end

function UI_CodePad:AddDigit(digit)
    if string.len(self.entered_code) < 4 then
        self.entered_code = self.entered_code .. digit
        self.display:SetText(self.entered_code)
    end
end

function UI_CodePad:OnClear()
    self.entered_code = ""
    self.display:SetText("----")
end

function UI_CodePad:OnCheckCode()
    if self.entered_code == self.correct_code then
        if self.on_success_info and self.on_success_info ~= "" then
            db.actor:give_info_portion(self.on_success_info)
        end
        
        -- Звук успеха
        local snd = sound_object([[device\pda\pda_tip]])
        if snd and snd:path() ~= "" then 
            snd:play(db.actor, 0, sound_object.s2d) 
        end

        self:OnClose()
    else
        self.display:SetText("ERR")
        self.entered_code = ""
        
        -- Звук ошибки
        local snd = sound_object([[device\pda\pda_alarm]])
        if snd and snd:path() ~= "" then 
            snd:play(db.actor, 0, sound_object.s2d) 
        end
    end
end

function UI_CodePad:OnKeyboard(dik, keyboard_action)
    CUIScriptWnd.OnKeyboard(self, dik, keyboard_action)
    if keyboard_action == ui_events.WINDOW_KEY_PRESS then
        if dik == DIK_keys.DIK_ESCAPE then
            self:OnClose()
        end
    end
    return true
end

function UI_CodePad:OnClose()
    self:GetHolder():start_stop_menu(self, true)
end

-- Глобальная функция для вызова из логики (customdata)
function start_code_ui(code, info_portion)
    local hud = UI_CodePad(code, info_portion)
    level.start_stop_menu(hud, true)
end

-- Вызов конкретно для этой двери
function open_my_door_code()
    local hud = UI_CodePad("1234", "lab_door_unlocked")
    level.start_stop_menu(hud, true)
end

 

подскажите пожайлуста что я делаю не так?


Дополнено 32 минуты спустя
32 минуты назад, Emilien220 сказал:

Здравствуйте уважаемые мододелы продолжил делать мод на зп и решил сделать панель для ввода кода для двери однако когда подхожу и нажимаю ф на кнопку для ввода цифр получаю вылет :
 

[LUA] Error: [string "xr_logic"]:639: attempt to call a nil value

FATAL ERROR

[error]Expression    : !m_error_code
[error]Function      : raii_guard::~raii_guard
[error]File          : F:\ixray-team\ixray-1.6-stcop\src\xrScripts\script_storage.cpp
[error]Line          : 530
[error]Description   : see call_stack for details!


хочу поделится custom data моей панели для ввода кода:
 

  custom data (Показать контент)

 

[logic]
active = ph_button@wait

[ph_button@wait]
anim = off
on_press = %=ui_code_pad.open_my_door_code%
tip_text = "st_btn_enter_code"
on_info = {+lab_door_unlocked} ph_button@unlocked

[ph_button@unlocked]
anim = on
tip_text = "st_btn_access_granted"

 

  scrpt code pad (Показать контент)

 

class "UI_CodePad" (CUIScriptWnd)

function UI_CodePad:__init(correct_code, on_success_info) super()
    self.correct_code = tostring(correct_code or "1234")
    self.on_success_info = on_success_info
    self.entered_code = ""

    self:InitControls()
    self:InitCallBacks()
end

function UI_CodePad:__finalize()
end

function UI_CodePad:InitControls()
    self:SetWndRect(Frect():set(0, 0, 1024, 768))

    local xml = CScriptXmlInit()
    xml:ParseFile("ui_code_pad.xml")

    self.dialog = xml:InitStatic("background", self)

    -- Дисплей
    self.display = xml:InitTextWnd("code_display", self.dialog)
    self.display:SetText("----")

    -- Кнопки
    self.btn_1 = xml:Init3tButton("btn_1", self.dialog)
    self:Register(self.btn_1, "btn_1")

    self.btn_2 = xml:Init3tButton("btn_2", self.dialog)
    self:Register(self.btn_2, "btn_2")

    self.btn_3 = xml:Init3tButton("btn_3", self.dialog)
    self:Register(self.btn_3, "btn_3")

    -- Сброс и Подтверждение
    self.btn_clear = xml:Init3tButton("btn_clear", self.dialog)
    self:Register(self.btn_clear, "btn_clear")

    self.btn_ok = xml:Init3tButton("btn_ok", self.dialog)
    self:Register(self.btn_ok, "btn_ok")
end

function UI_CodePad:InitCallBacks()
    -- Безопасная привязка через методы класса (без анонимных функций)
    self:AddCallback("btn_1", ui_events.BUTTON_CLICKED, self.OnBtn1, self)
    self:AddCallback("btn_2", ui_events.BUTTON_CLICKED, self.OnBtn2, self)
    self:AddCallback("btn_3", ui_events.BUTTON_CLICKED, self.OnBtn3, self)

    self:AddCallback("btn_clear", ui_events.BUTTON_CLICKED, self.OnClear, self)
    self:AddCallback("btn_ok", ui_events.BUTTON_CLICKED, self.OnCheckCode, self)
end

-- Обработчики нажатий на кнопки
function UI_CodePad:OnBtn1()
    self:AddDigit("1")
end

function UI_CodePad:OnBtn2()
    self:AddDigit("2")
end

function UI_CodePad:OnBtn3()
    self:AddDigit("3")
end

function UI_CodePad:AddDigit(digit)
    if string.len(self.entered_code) < 4 then
        self.entered_code = self.entered_code .. digit
        self.display:SetText(self.entered_code)
    end
end

function UI_CodePad:OnClear()
    self.entered_code = ""
    self.display:SetText("----")
end

function UI_CodePad:OnCheckCode()
    if self.entered_code == self.correct_code then
        if self.on_success_info and self.on_success_info ~= "" then
            db.actor:give_info_portion(self.on_success_info)
        end
        
        -- Звук успеха
        local snd = sound_object([[device\pda\pda_tip]])
        if snd and snd:path() ~= "" then 
            snd:play(db.actor, 0, sound_object.s2d) 
        end

        self:OnClose()
    else
        self.display:SetText("ERR")
        self.entered_code = ""
        
        -- Звук ошибки
        local snd = sound_object([[device\pda\pda_alarm]])
        if snd and snd:path() ~= "" then 
            snd:play(db.actor, 0, sound_object.s2d) 
        end
    end
end

function UI_CodePad:OnKeyboard(dik, keyboard_action)
    CUIScriptWnd.OnKeyboard(self, dik, keyboard_action)
    if keyboard_action == ui_events.WINDOW_KEY_PRESS then
        if dik == DIK_keys.DIK_ESCAPE then
            self:OnClose()
        end
    end
    return true
end

function UI_CodePad:OnClose()
    self:GetHolder():start_stop_menu(self, true)
end

-- Глобальная функция для вызова из логики (customdata)
function start_code_ui(code, info_portion)
    local hud = UI_CodePad(code, info_portion)
    level.start_stop_menu(hud, true)
end

-- Вызов конкретно для этой двери
function open_my_door_code()
    local hud = UI_CodePad("1234", "lab_door_unlocked")
    level.start_stop_menu(hud, true)
end

 

подскажите пожайлуста что я делаю не так?

ps я нашел проблему оказывается я забыл добавить вызов функции через xr.effects 

 


Дополнено 11 минуты спустя

Еще имеется вопрос я делаю мод где будет 3 главы первая готова вторая на 50 процентов 3 0 процентов но 3 глава ну очень короткая когда можно анонсировать проект для ребят? Или стоит закончить полностью и потом уже анонс делать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   1 пользователь онлайн

    • Emilien220

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек. Оставаясь на сайте, вы подтверждаете свое согласие на их использование. Политика конфиденциальности | Условия использования