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

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

Ребят, добрый вечер! Никто не подскажет, как убрать закрытие диалогового окна кнопкой "Esc"? Чтобы диалоги были как в Fallout 3/New Vegas - если завёл разговор, то до логичного конца.

  • Согласен 1

Пишу мод с неповторимым сюжетом.

Нужны "модельеры"

Заинтересованным писать в ЛС

J.A.A..gif

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

Сильно подозреваю что ныне - без ковыряний в движке никак, ибо диалоговый интерфейс - штука движковая.

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

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

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

Кстати, о птичках, точнее - об этих самых кнопках из соседней темы:

w = CUIButton()

w:SetWindowName( "btn_next" )

w:SetAutoDelete( true )

w:Init( 250, 60, 50, 30 )

self:AttachChild( w )

self:AddCallback( "btn_next", ui_events.BUTTON_CLICKED, self.next, self )

w:Show( true )

 

Что здесь не так, что первое нажатие оно отрабатывает нормально, второе - 2 раза, а дальше - 4 и т.д.

Кнопку мы после каждого нажатия перерисовываем, но как бы вроде разве недостаточно w = CUIButton(), чтобы старая удалилась ?

Это надо еще какое-то волшебное слово сказать ?

 

 

2 abramcumner: в общем, да, DetachChild() помогает, но дешевле оказалось избавиться от перерисовки. Выяснилось, что нужные статики ложатся в нужном порядке, а оригинал был странен, но просто до подобной ситуации обычно не доживал.

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

self:AttachChild( w )

Кнопку мы после каждого нажатия перерисовываем, но как бы вроде разве недостаточно w = CUIButton(), чтобы старая удалилась ?

Это надо еще какое-то волшебное слово сказать ?

Сслыка на кнопку в родительском окне не дает ей удалиться. Возможно поможет DetachChild.
Ссылка на комментарий
как убрать закрытие диалогового окна кнопкой "Esc"?

Решил поковыряться  с этим вопросом, и вот чего наковырял.

Доступ к окну диалога(разговора - так точнее ?) получить можно, хотя и коряво:

<info_portion id="ui_talk">

<action>какой-то_скрипт.On_talk</action>

<disable>ui_talk_hide</disable>

</info_portion>

<info_portion id="ui_talk_hide">

<action>какой-то_скрипт.On_talk_hide</action>

<disable>ui_talk</disable>

</info_portion>

 

В этот самый какой-то_скрипт пропишем:

talk_wnd = nil
function On_talk()
talk_wnd = CUIAddTalkControl()
level.start_stop_menu(talk_wnd, true)
end
 
function On_talk_hide()
talk_wnd = nil
end
 
---------------- скриптовый класс для окна разговора --------------------------------
class "CUIAddTalkControl" (CUIScriptWnd)
 
function CUIAddTalkControl:__init() super()
self:InitControls()
end
 
function CUIAddTalkControl:InitControls()
----- Положение и размеры окна -----
self:Init(0,0,1024,768)
end
 
function CUIAddTalkControl:__finalize()
end
 
------------------ обработка нажатий клавы ------------------
function CUIAddTalkControl:OnKeyboard(dik, keyboard_action)
CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
local bind = dik_to_bind(dik)
----- перехватываем Esc и Действие -----
if dik == DIK_keys.DIK_ESCAPE then
local text = "нажали - ESC"
news_manager.send_tip(db.actor, text, nil, nil, 30000)
return true
elseif bind == key_bindings.kUSE then
local text = "нажали - Действие"
news_manager.send_tip(db.actor, text, nil, nil, 30000)
return true
end
end
return false
end

 

 

Запускаем игру, начинаем разговор с кем-то и переключаемся кнопкой "Торговать" в торговлю и сразу возвращаемся - и сработает On_talk(). Следовательно наше скрипт-окно будет прилеплено к диалоговому и нажатие "Esc" и назначенной в настройках кнопки "Действие" будут перехватываться. Вот только толку с этого вроде как ноль: сам способ через одно место и кроме перехвата ввода с клавы полностью отрубается ввод с мыша. Т.е. закрыть диалог с неписем с клавиатуры уже не получится, но и продолжить его до какой-нить фразы с <action>dialogs.break_dialog</action> чтоб его завершить то-же не получится. Вроде как тупик ?

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

@UnLoaded, ты открываешь своё скриптовое окно и оно перехватывает управление ввода на себя.

Попробуй при входе в диалог разбиндить экшены use и quit, а на последней фразе диалога забиндить обратно. 

Ссылка на комментарий
разбиндить экшены use и quit, а на последней фразе диалога забиндить обратно. 

А можно примерчик собственно как разбиндить\забиндить ?

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

Ага, разбиндить получается, но вот обратно - чтоб снова назначить указанную в настройках клавишу для "Действия", надо ее перед разбиндиванием получить и сохранить. Попробовал con:get_string("use") - не прокатывает, остальные get_... вообще к вылету приводят...

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

@UnLoaded, возможно вот так:

local u_quit, b_quit = "unbind quit", "bind quit kESCAPE"

 

get_console():execute(u_quit)

...

get_console():execute(b_quit)

 

Правда зачем тебе сохранять условные константы мне не ясно.

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

Правда зачем тебе сохранять условные константы мне не ясно.

Возможно за тем, что у игрока "quit" и "use" могут быть забиндены на другие кнопки?
Ссылка на комментарий
могут быть забиндены на другие кнопки?

Однозначно, у меня всегда "use" переназначено так, как мне нравится...

 

@Сталкер-Стрелок

Однако толку мало от предложенного Вами - надо сразу указать то, что может быть переназначено.

 

Вопрос остается открытым.

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

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

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

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

У каждого игрока они могут быть свои и надо восстановить именно их, а не абстрактные. А так в движке хранятся, еще в user.ltx

 

Можно разобрать user.ltx и запомнить оттуда настройки. Вроде папка к нему в fsgame.ltx прописана - по идее можно грузить через ini_file

Можно еще проверить, что возвращает get_console():execute("bind quit")

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

 

 

Можно еще проверить, что возвращает get_console():execute("bind quit")

В "Справочнике ..." - void execute(string <команда консоли>); // выполнить команду консоли

Значит ничего не возвращает, плюс назначит на "quit" пустое значение(уже проверял).

 

 

 

по идее можно грузить через ini_file

Так ведь структура не ltx-кая, навряд-ли прочтет что-то. Да и все равно, даже если все срастется - нормально будет работать тока на правленом движке, где восстановлена выдача инфо-порций окна диалогов по нормальному.

 

Так, что для AndrewMor и J.A.A: похоже на исходном движке ТЧ бессмысленная затея, так что смотреть в сторону правленного движка.

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

@abramcumner, она разве не из $game_config$ грузит? Т.е. я имею ввиду использовать getFS() (но он не читает такие файлы). Еще есть класс COptionsManager, через который это можно сделать, в целом он с этим и работает на самом деле.

 

 

 

Так ведь структура не ltx-кая, навряд-ли прочтет что-то.

Можно распарсить в массив ключ значение.

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

плюс назначит на "quit" пустое значение(уже проверял).

Насколько я помню, если в консоли набрать "bind quit", то вернется забинденная клавиша.

 

Так ведь структура не ltx-кая, навряд-ли прочтет что-то.

Читать по строке и искать bind quit.

 

Да и все равно, даже если все срастется - нормально будет работать тока на правленом движке, где восстановлена выдача инфо-порций окна диалогов по нормальному.

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

 

 

Почему, unbind можно еще делать в коллбеке на юзе нпц

Гм, неплохо бы, вот только есть ли такой ? Глянул сейчас в константы C++ class callback в lua_help, не вижу какой из них ? Или я не туда\не о том ?

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

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

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

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

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

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

Войти

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

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

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...