J.A.A. 2 Опубликовано 8 Апреля 2015 Поделиться Опубликовано 8 Апреля 2015 Ребят, добрый вечер! Никто не подскажет, как убрать закрытие диалогового окна кнопкой "Esc"? Чтобы диалоги были как в Fallout 3/New Vegas - если завёл разговор, то до логичного конца. 1 Пишу мод с неповторимым сюжетом. Нужны "модельеры" Заинтересованным писать в ЛС Ссылка на комментарий
AndrewMor 527 Опубликовано 8 Апреля 2015 Поделиться Опубликовано 8 Апреля 2015 J.A.A, присоединяюсь к вопросу. Иногда очень напрягает сия возможность. Сталкер - наше всё! Ссылка на комментарий
Zander_driver 10 333 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 Сильно подозреваю что ныне - без ковыряний в движке никак, ибо диалоговый интерфейс - штука движковая. Ну или соорудить ему взамен скриптовый аналог и устанавливать свои правила. Какие вздумается. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 (изменено) Кстати, о птичках, точнее - об этих самых кнопках из соседней темы: 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() помогает, но дешевле оказалось избавиться от перерисовки. Выяснилось, что нужные статики ложатся в нужном порядке, а оригинал был странен, но просто до подобной ситуации обычно не доживал. Изменено 9 Апреля 2015 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
abramcumner 1 146 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 self:AttachChild( w ) Кнопку мы после каждого нажатия перерисовываем, но как бы вроде разве недостаточно w = CUIButton(), чтобы старая удалилась ? Это надо еще какое-то волшебное слово сказать ? Сслыка на кнопку в родительском окне не дает ей удалиться. Возможно поможет DetachChild. Ссылка на комментарий
UnLoaded 313 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 (изменено) как убрать закрытие диалогового окна кнопкой "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> чтоб его завершить то-же не получится. Вроде как тупик ? Изменено 9 Апреля 2015 пользователем UnLoaded Ссылка на комментарий
Charsi 440 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 @UnLoaded, ты открываешь своё скриптовое окно и оно перехватывает управление ввода на себя. Попробуй при входе в диалог разбиндить экшены use и quit, а на последней фразе диалога забиндить обратно. Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
UnLoaded 313 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 (изменено) разбиндить экшены use и quit, а на последней фразе диалога забиндить обратно. А можно примерчик собственно как разбиндить\забиндить ? Изменено 9 Апреля 2015 пользователем UnLoaded Ссылка на комментарий
Nazgool 250 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 get_console():execute("unbind quit") get_console():execute("bind quit kESCAPE") Ссылка на комментарий
UnLoaded 313 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 Ага, разбиндить получается, но вот обратно - чтоб снова назначить указанную в настройках клавишу для "Действия", надо ее перед разбиндиванием получить и сохранить. Попробовал con:get_string("use") - не прокатывает, остальные get_... вообще к вылету приводят... Ссылка на комментарий
Сталкер-Стрелок 12 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 @UnLoaded, возможно вот так: local u_quit, b_quit = "unbind quit", "bind quit kESCAPE" get_console():execute(u_quit) ... get_console():execute(b_quit) Правда зачем тебе сохранять условные константы мне не ясно. Ссылка на комментарий
abramcumner 1 146 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 Правда зачем тебе сохранять условные константы мне не ясно.Возможно за тем, что у игрока "quit" и "use" могут быть забиндены на другие кнопки? Ссылка на комментарий
UnLoaded 313 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 (изменено) могут быть забиндены на другие кнопки? Однозначно, у меня всегда "use" переназначено так, как мне нравится... @Сталкер-Стрелок Однако толку мало от предложенного Вами - надо сразу указать то, что может быть переназначено. Вопрос остается открытым. Изменено 9 Апреля 2015 пользователем UnLoaded 1 Ссылка на комментарий
Сталкер-Стрелок 12 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 (изменено) @abramcumner, ну их тогда и указывать, или я чего не понял? В любом случае они же должны в каком-то массиве хранится. Изменено 9 Апреля 2015 пользователем Сталкер-Стрелок Ссылка на комментарий
abramcumner 1 146 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 (изменено) @abramcumner, ну их тогда и указывать, или я чего не понял? В любом случае они же должны в каком-то массиве хранится.У каждого игрока они могут быть свои и надо восстановить именно их, а не абстрактные. А так в движке хранятся, еще в user.ltx Можно разобрать user.ltx и запомнить оттуда настройки. Вроде папка к нему в fsgame.ltx прописана - по идее можно грузить через ini_file Можно еще проверить, что возвращает get_console():execute("bind quit") Изменено 9 Апреля 2015 пользователем abramcumner Ссылка на комментарий
UnLoaded 313 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 Можно еще проверить, что возвращает get_console():execute("bind quit") В "Справочнике ..." - void execute(string <команда консоли>); // выполнить команду консоли Значит ничего не возвращает, плюс назначит на "quit" пустое значение(уже проверял). по идее можно грузить через ini_file Так ведь структура не ltx-кая, навряд-ли прочтет что-то. Да и все равно, даже если все срастется - нормально будет работать тока на правленом движке, где восстановлена выдача инфо-порций окна диалогов по нормальному. Так, что для AndrewMor и J.A.A: похоже на исходном движке ТЧ бессмысленная затея, так что смотреть в сторону правленного движка. Ссылка на комментарий
Сталкер-Стрелок 12 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 @abramcumner, она разве не из $game_config$ грузит? Т.е. я имею ввиду использовать getFS() (но он не читает такие файлы). Еще есть класс COptionsManager, через который это можно сделать, в целом он с этим и работает на самом деле. Так ведь структура не ltx-кая, навряд-ли прочтет что-то. Можно распарсить в массив ключ значение. Ссылка на комментарий
abramcumner 1 146 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 плюс назначит на "quit" пустое значение(уже проверял).Насколько я помню, если в консоли набрать "bind quit", то вернется забинденная клавиша. Так ведь структура не ltx-кая, навряд-ли прочтет что-то.Читать по строке и искать bind quit. Да и все равно, даже если все срастется - нормально будет работать тока на правленом движке, где восстановлена выдача инфо-порций окна диалогов по нормальному.Почему, unbind можно еще делать в коллбеке на юзе нпц, а обратный бинд в функции на выходе из диалога. Ссылка на комментарий
UnLoaded 313 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 Почему, unbind можно еще делать в коллбеке на юзе нпц Гм, неплохо бы, вот только есть ли такой ? Глянул сейчас в константы C++ class callback в lua_help, не вижу какой из них ? Или я не туда\не о том ? Ссылка на комментарий
Сталкер-Стрелок 12 Опубликовано 9 Апреля 2015 Поделиться Опубликовано 9 Апреля 2015 @UnLoaded, callback.use_object Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти