Lua console

Статус
В этой теме нельзя размещать новые ответы.

LUCHARE

Известный
Автор темы
Друг
545
696
Предыстория
Однажды приходилось кодить для сингла, и я столкнулся с проблемой: вешать активацию на клавиши было жалко, а писать интерфейс для каждой примитивной хуйни было лень. Параллельно с этим возник вопрос о том, куда выводить сообщения.

Описание
Этот скрипт представляет из себя консоль, с которой можно взаимодействовать с помощью графического интерфейса или с помощью кода.

С UI все интуитивно понятно, а вот второй вариант нужно рассмотреть подробнее. Для начала нужно импортировать скрипт (для тех, кто не знает link)

Lua:
local console = import "console"

Теперь console - это пространство имен со всеми публичными процедурами, а именно:
Lua:
console.limitmsg() -- устанавливает ограничение количества сообщений. если число меньше нуля, то ограничение выключается
local msg = console.addmsg(text) -- добавляет сообщение и возвращает таблицу с функциями для взаимодействия с ним
local ok = msg.exists() -- существует сообщение или нет
msg.edit(text) -- редактирует сообщение
msg.remove() -- удаляет сообщение
console.clearmsg() -- удаляет все сообщения
local ok = console.cmdexists(name) -- существует команда или нет
console.regcmd(name, proc [, desc]) -- регистрирует команду
console.delcmd(name) -- удаляет команду
local ok, error = console.exec(command, param) -- выполняет команду
console.process_input(string) -- обрабатывает строку
console.addmsg_n(...) -- добавляет сообщения
console.regcmd_n(proc, desc, ...) -- регистрирует команду на сколько угодно имен

Вот немного примеров:
Lua:
local console = import "console"

console.addmsg("test")
-- >test

function main()
    wait(-1)
end
Lua:
local console = import "console"

function foo()
    console.addmsg("Hello World!")
end

console.regcmd("test", foo, "Says hello to the world")

function main()
    wait(-1)
end
Lua:
local console = import "console"

function clock()
    lua_thread.create(
        function()
            local msg = console.addmsg("")

            while msg.exists() do
                msg.edit(os.date("Current time: %X"))
                wait(100)
            end
        end
    )
end

console.regcmd("clock", clock)

function main()
    wait(-1)
end

Скриншоты
1.png
2.png
3.png


Активация

Активацию можно изменить в файле настроек (moonloader/config/console.ini). По умолчанию F2

Зависимости

Dear ImGui
 

Вложения

  • console.rar
    5.3 KB · Просмотры: 193
Последнее редактирование:

checkdasound

Известный
Проверенный
963
409
Предыстория
Однажды приходилось кодить для сингла, и я столкнулся с проблемой: вешать активацию на клавиши было жалко, а писать интерфейс для каждой примитивной хуйни было лень. Параллельно с этим возник вопрос о том, куда выводить сообщения.

Описание
Этот скрипт представляет из себя консоль, с которой можно взаимодействовать с помощью графического интерфейса или с помощью кода.

С UI все интуитивно понятно (кроме того, что для копирования сообщения по нему нужно кликнуть два раза), а вот второй вариант нужно рассмотреть подробнее. Для начала нужно импортировать скрипт (для тех, кто не знает link)

Lua:
local console = import "console"

Теперь console - это пространство имен со всеми публичными процедурами, а именно:
Lua:
console.limitmsg() -- устанавливает ограничение количества сообщений. если число меньше нуля, то ограничение выключается
local msg = console.addmsg(text) -- добавляет сообщение и возвращает таблицу с функциями для взаимодействия с ним
local ok = msg.exists() -- существует сообщение или нет
msg.edit(text) -- редактирует сообщение
msg.remove() -- удаляет сообщение
console.clearmsg() -- удаляет все сообщения
local ok = console.cmdexists(name) -- существует команда или нет
console.regcmd(name, proc [, desc]) -- регистрирует команду
console.delcmd(name) -- удаляет команду
local ok, error = console.exec(command, param) -- выполняет команду
console.process_input(string) -- обрабатывает строку

Вот немного примеров:
Lua:
local console = import "console"

console.addmsg("test")
-- >test

function main()
    wait(-1)
end
Lua:
local console = import "console"

function foo()
    console.addmsg("Hello World!")
end

console.regcmd("test", foo, "Says hello to the world")

function main()
    wait(-1)
end
Lua:
local console = import "console"

function clock()
    lua_thread.create(
        function()
            local msg = console.addmsg("")

            while msg.exists() do
                msg.edit(os.date("Current time: %X"))
                wait(100)
            end
        end
    )
end

console.regcmd("clock", clock)

function main()
    wait(-1)
end

Скриншоты
Посмотреть вложение 17267 Посмотреть вложение 17268 Посмотреть вложение 17269

Активация

Активацию можно изменить в файле настроек (moonloader/config/console.ini). По умолчанию F2

Зависимости

Dear ImGui
Нашел несколько багов:
1) после перезагрузки всех скриптов при помощи reload_all.lua в чат какой-то варнинг пишет и консоль перестает открываться.
2) если сделать скрипт в котором будет регистрироваться команда, которая что-то выполняет, после его изменения не выходя из игры и его авто-перезагрузки при помощи AutoReboot.lua, то если использовать эту команду, игру крашнет (хз, мб у меня такие проблемы только, если что было это со скриптом, код которого я изложил ниже).

а ну и еще сделал счетчик фпс как в консоли сф:
Lua:
local console = import ("console")

local w, h = getScreenResolution()
local fps_act = false

local null = 0.0
local one = 0.0
local two = 0.0
local three = 0.0
local four = 0.0
local five = 0
local six = 0.0

function fps()
   fps_act = not fps_act
end

console.regcmd('fps', fps, 'sampfuncs-like FPS counter')

function main()
   font = renderCreateFont('Tahoma', 9, 12)
    while true do
   wait(0)
       get_fps()
       eight = math.ceil(six)
       final = tostring(eight)
       if fps_act then
           renderFontDrawText(font, final, w - (renderGetFontDrawTextLength(font, final) + 5), 0, 0xFFD6B00A)
       end
   end
end

function get_fps()
null = null + 1.0
seven = readMemory(0xB7CB84, 4, false)
eight = seven
seven = seven - five
   if seven > 240 then
       four = three
       three = two
       two = one
       one = null
       one = one * 4.0
       six = one
       six = six + two
       six = six + three
       six = six + four
       six = six / 4.0
       null = 0.0
       five = eight
   end 
end
 
  • Нравится
Реакции: paulohardy

LUCHARE

Известный
Автор темы
Друг
545
696
если сделать скрипт в котором будет регистрироваться команда, которая что-то выполняет, после его изменения не выходя из игры и его авто-перезагрузки при помощи AutoReboot.lua, то если использовать эту команду, игру крашнет (хз, мб у меня такие проблемы только, если что было это со скриптом, код которого я изложил ниже).
это потому что обработчик обращается к старому адресу функции. Нужно удалять свои команды в деструкторе скрипта
 

FYP

Известный
Администратор
1,763
5,899
баги (апи не тестировал)
  • при нажатии enter в пустом поле ввода оно теряет фокус
  • лог не скроллится колесом мыши
  • ввод спецсимволов паттернов (% [ ] и т.п.) приводит к падению скрипта
  • консоль закрывается нажатием esc, но при этом открывается и меню паузы игры
не хватает
  • истории ввода команд
  • поддержки колортегов
  • автоматического фокуса на поле ввода при открытии
  • автокомплита подсказок нажатием таб
  • вывода системных логов по умолчанию (или возможности включить их через консоль)
  • возможности выделять текст в логе
  • возможности управлять персонажем при открытой консоли
  • более удобного способа выполнить луа код (!код или >код было бы норм), с подсказками при вводе было бы вообще охуенно
  • было бы круто добавить команды для загрузки и выгрузки скриптов ("start my_script.lua", "stop my_scr")
ещё можно доебаться до названий некоторых функций и команд (функция clearmsg вместо clear и команда msg_clear вместо clear), но это мелочи. остальное збс, респект!
баг с импортом скоро исправлю и выложу в новом релизе с парой других запланированных фич.
 

LUCHARE

Известный
Автор темы
Друг
545
696
истории ввода команд
будет когда исправишь баг с длиной буфера текста в ImGuiTextEditCallbackData
возможности управлять персонажем при открытой консоли
исправь баг инпута с шифтом
лог не скроллится колесом мыши
это не баг. верну когда getMousewheelDelta() будет работать при открытом окне
 

FYP

Известный
Администратор
1,763
5,899
будет когда исправишь баг с длиной буфера текста в ImGuiTextEditCallbackData
поподробнее
исправь баг инпута с шифтом
тоже
не знаю ничего об этих багах
а что же? в других имгуи интерфейсах точно такие же списки скроллятся колесом
верну когда getMousewheelDelta() будет работать при открытом окне
не будет, потому что имгуи перехватывает сообщения о кручении колеса и обрабатывая скипает

и что насчёт остального?
 

LUCHARE

Известный
Автор темы
Друг
545
696
тоже
не знаю ничего об этих багах
персонаж прыгнет не смотря на фокус в инпуте
флаг который выключает скролл мышкой
и что насчёт остального?
почти все остальное будет
срабатывает ассерт если несколько раз сменить текст буфера
C++:
IM_ASSERT(callback_data.BufTextLen == (int)strlen(callback_data.Buf)); // этот
 
  • Нравится
Реакции: FYP

FYP

Известный
Администратор
1,763
5,899
персонаж прыгнет не смотря на фокус в инпуте
но при фокусе на инпуте управление лочится целиком, в т.ч. и баг с шифтом

срабатывает ассерт если несколько раз сменить текст буфера
IM_ASSERT(callback_data.BufTextLen == (int)strlen(callback_data.Buf)); // этот
да, баг, исправлю
 

LUCHARE

Известный
Автор темы
Друг
545
696
обнова

что нового?
  • Исправлены баги
  • История ввода (up/down arrow)
  • Автокомплит подсказок (tab)
  • Возможность выделять текст сообщений
  • Добавлены функции regcmd_n(proc, desc, ...) и addmsg_n(...). Подробнее в первом посте
  • Мелкие изменения
 

lorgon

Известный
656
271
обнова

что нового?
  • Исправлены баги
  • История ввода (up/down arrow)
  • Автокомплит подсказок (tab)
  • Возможность выделять текст сообщений
  • Добавлены функции regcmd_n(proc, desc, ...) и addmsg_n(...). Подробнее в первом посте
  • Мелкие изменения
Добавь новых Default`ных команд, как по мне их слишком мало. (На самом деле не очень нужное обновление но всё же)
 
Статус
В этой теме нельзя размещать новые ответы.