Вопросы по Lua скриптингу

Общая тема для вопросов по разработке скриптов на языке программирования Lua, в частности под MoonLoader.
  • Задавая вопрос, убедитесь, что его нет в списке частых вопросов и что на него ещё не отвечали (воспользуйтесь поиском).
  • Поищите ответ в теме посвященной разработке Lua скриптов в MoonLoader
  • Отвечая, убедитесь, что ваш ответ корректен.
  • Старайтесь как можно точнее выразить мысль, а если проблема связана с кодом, то обязательно прикрепите его к сообщению, используя блок [code=lua]здесь мог бы быть ваш код[/code].
  • Если вопрос связан с MoonLoader-ом первым делом желательно поискать решение на wiki.

Частые вопросы

Как научиться писать скрипты? С чего начать?
Информация - Гайд - Всё о Lua скриптинге для MoonLoader(https://blast.hk/threads/22707/)
Как вывести текст на русском? Вместо русского текста у меня какие-то каракули.
Изменить кодировку файла скрипта на Windows-1251. В Atom: комбинация клавиш Ctrl+Shift+U, в Notepad++: меню Кодировки -> Кодировки -> Кириллица -> Windows-1251.
Как получить транспорт, в котором сидит игрок?
Lua:
local veh = storeCarCharIsInNoSave(PLAYER_PED)
Как получить свой id или id другого игрока?
Lua:
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получить свой ид
local _, id = sampGetPlayerIdByCharHandle(ped) -- получить ид другого игрока. ped - это хендл персонажа
Как проверить, что строка содержит какой-то текст?
Lua:
if string.find(str, 'текст', 1, true) then
-- строка str содержит "текст"
end
Как эмулировать нажатие игровой клавиши?
Lua:
local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

setGameKeyState(game_keys.player.FIREWEAPON, -1) -- будет сэмулировано нажатие клавиши атаки
Все иды клавиш находятся в файле moonloader/lib/game/keys.lua.
Подробнее о функции setGameKeyState здесь: lua - setgamekeystate | BlastHack — DEV_WIKI(https://www.blast.hk/wiki/lua:setgamekeystate)
Как получить id другого игрока, в которого целюсь я?
Lua:
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- получить хендл персонажа, в которого целится игрок
if valid and doesCharExist(ped) then -- если цель есть и персонаж существует
  local result, id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
  if result then -- проверить, прошло ли получение ида успешно
    -- здесь любые действия с полученным идом игрока
  end
end
Как зарегистрировать команду чата SAMP?
Lua:
-- До бесконечного цикла/задержки
sampRegisterChatCommand("mycommand", function (param)
     -- param будет содержать весь текст введенный после команды, чтобы разделить его на аргументы используйте string.match()
    sampAddChatMessage("MyCMD", -1)
end)
Крашит игру при вызове sampSendChat. Как это исправить?
Это происходит из-за бага в SAMPFUNCS, когда производится попытка отправки пакета определенными функциями изнутри события исходящих RPC и пакетов. Исправления для этого бага нет, но есть способ не провоцировать его. Вызов sampSendChat изнутри обработчика исходящих RPC/пакетов нужно обернуть в скриптовый поток с нулевой задержкой:
Lua:
function onSendRpc(id)
  -- крашит:
  -- sampSendChat('Send RPC: ' .. id)

  -- норм:
  lua_thread.create(function()
    wait(0)
    sampSendChat('Send RPC: ' .. id)
  end)
end
 
Последнее редактирование:

Aniki

🐰
Администратор
1,232
1,579
мг, что-то я не понял как его заполнить? примеров нормальных так и не нашёл
или это я валянок такой
Он принимает значение от 0 до 1, где 0 - пустой бар, 1 - полный. Если у тебя есть какое-то значение для бара, просто дели его на максимальное и будет тебе счастье
Lua:
imgui.ProgressBar(val/maxVal)
 
  • Нравится
Реакции: T1cKz

N1ghT

Известный
79
8
Возможно ли эмулировать нажатие клавиши в свернутом режиме? Например, если игра будет в оконном режиме
 

tlwsn

Известный
537
85
Вот так функцию используй если там цифры, кавычки не нужны
Lua:
function getNamekeybyID(id)
  local name = {
      [8] = 'Backspase',
    [9] = 'Tab',
    [13] = 'Enter',
    [16] = 'Shift',
    [17] = 'Ctrl',
    [18] = 'Alt',
    [19] = 'Pause',
    [20] = 'Caps Lock',
    [27] = 'Esc',
    [32] = 'Space',
    [33] = 'Page UP',
    [34] = 'Page Down',
    [35] = 'End',
    [36] = 'Home',
    [45] = 'Insert',
    [46] = 'Delete',
    [48] = 0,
    [49] = 1,
    [50] = 2,
    [51] = 3,
    [52] = 4,
    [53] = 5,
    [54] = 6,
    [55] = 7,
    [56] = 8,
    [57] = 9,
    [65] = 'A',
    [66] = 'B',
    [67] = 'C',
    [68] = 'D',
    [69] = 'E',
    [70] = 'F',
    [71] = 'G',
    [72] = 'H',
    [73] = 'I',
    [74] = 'J',
    [75] = 'K',
    [76] = 'L',
    [77] = 'M',
    [78] = 'N',
    [79] = 'O',
    [80] = 'P',
    [81] = 'Q',
    [82] = 'R',
    [83] = 'S',
    [84] = 'T',
    [85] = 'U',
    [86] = 'V',
    [87] = 'W',
    [88] = 'X',
    [89] = 'Y',
    [90] = 'Z',
    [96] = 'Num 0',
    [97] = 'Num 1',
    [98] = 'Num 2',
    [99] = 'Num 3',
    [100] = 'Num 4',
    [101] = 'Num 5',
    [102] = 'Num 6',
    [103] = 'Num 7',
    [104] = 'Num 8',
    [105] = 'Num 9',
    [106] = 'Num *',
    [107] = 'Num +',
    [109] = 'Num -',
    [110] = 'Num .',
    [111] = 'Num /',
    [112] = 'F1',
    [113] = 'F2',
    [114] = 'F3',
    [115] = 'F4',
    [116] = 'F5',
    [117] = 'F6',
    [118] = 'F7',
    [119] = 'F8',
    [120] = 'F9',
    [121] = 'F10',
    [122] = 'F11',
    [123] = 'F12',
    [144] = 'Num Lock',
    [145] = 'Scroll Lock'
  }
  return name[id]
end
и еще вопросик есть, у меня чот криво отображается само название кнопки в окошке имуги. юзал так
Lua:
imgui.Text('Текущая клавиша: '..u8(getNamekeybyID(cfg.keys.tazer)))
но ловил
 

Aniki

🐰
Администратор
1,232
1,579
и еще вопросик есть, у меня чот криво отображается само название кнопки в окошке имуги. юзал так
Lua:
imgui.Text('Текущая клавиша: '..u8(getNamekeybyID(cfg.keys.tazer)))
но ловил
Lua:
imgui.Text(u8'Текущая клавиша: '..u8(getNamekeybyID(cfg.keys.tazer)))
 
  • Нравится
Реакции: tlwsn

SAMP.ASI

Известный
223
53
Почему при попытке открыть второе окно tip_window вылетает игра? В мунлоге пусто.
Lua:
script_name('Encryption example')
script_author('Ranx')
script_dependencies('CLEO', 'SAMPFUNCS', 'Moonloader', 'AESLUA')
script_version_number(1.0)
script_version('1.0')

sampev = require 'lib.samp.events'
local key = require 'vkeys'
local imgui = require 'imgui'
local notf = import 'imgui_notf'
local SE = require 'lib.samp.events'
local encoding = require 'encoding'
u8 = encoding.UTF8
encoding.default = 'CP1251'
require('lib.moonloader')
require('lib.aeslua')
local notf = import 'imgui_notf.lua'

local notf_live = 5
local notf_num = 1

local send_text_buffer = imgui.ImBuffer(256)
local main_window_state = imgui.ImBool(false)
local tip_window_state = imgui.ImBool(false)
function imgui.OnDrawFrame()
  if main_window_state.v then
    imgui.SetNextWindowSize(imgui.ImVec2(500, 100), imgui.Cond.FirstUseEver)
    imgui.Begin(u8'Окно месседжера', main_window_state)
    if imgui.InputText(u8'', send_text_buffer) then end
    imgui.SameLine()
    if imgui.Button(u8'Отправить') then
     sampSendChat(string.format("/f "сас"))
   end
    imgui.Text(u8(string.format('Текущая дата: %s', os.date())))
    imgui.End()
  end
  if tip_window_state.v then -- отсюда все проблемы
    imgui.SetNextWindowSize(imgui.ImVec2(300, 600), imgui.Cond.FirstUseEver)
    imgui.Begin(u8'Чит меню', tip_window_state)

    if imgui.Button(u8'Накрутить') then
      sampSendChat('саси')
    end
  end
end



function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
    sampRegisterChatCommand('enc', cmdEncrypt)
    sampRegisterChatCommand('dec', cmdDecrypt)
    sampfuncsRegisterConsoleCommand("xxxfunc", xxxfunc)
    while true do
      wait(0)
      if wasKeyPressed(key.VK_X) then
          main_window_state.v = not main_window_state.v
      end
      imgui.Process = main_window_state.v
      imgui.Process = tip_window_state.v
    end
  end

function xxxfunc()
  tip_window_state.v = not tip_window_state.v
end
 

ufdhbi

Известный
Проверенный
1,463
867
Почему при попытке открыть второе окно tip_window вылетает игра? В мунлоге пусто.
Lua:
script_name('Encryption example')
script_author('Ranx')
script_dependencies('CLEO', 'SAMPFUNCS', 'Moonloader', 'AESLUA')
script_version_number(1.0)
script_version('1.0')

sampev = require 'lib.samp.events'
local key = require 'vkeys'
local imgui = require 'imgui'
local notf = import 'imgui_notf'
local SE = require 'lib.samp.events'
local encoding = require 'encoding'
u8 = encoding.UTF8
encoding.default = 'CP1251'
require('lib.moonloader')
require('lib.aeslua')
local notf = import 'imgui_notf.lua'

local notf_live = 5
local notf_num = 1

local send_text_buffer = imgui.ImBuffer(256)
local main_window_state = imgui.ImBool(false)
local tip_window_state = imgui.ImBool(false)
function imgui.OnDrawFrame()
  if main_window_state.v then
    imgui.SetNextWindowSize(imgui.ImVec2(500, 100), imgui.Cond.FirstUseEver)
    imgui.Begin(u8'Окно месседжера', main_window_state)
    if imgui.InputText(u8'', send_text_buffer) then end
    imgui.SameLine()
    if imgui.Button(u8'Отправить') then
     sampSendChat(string.format("/f "сас"))
   end
    imgui.Text(u8(string.format('Текущая дата: %s', os.date())))
    imgui.End()
  end
  if tip_window_state.v then -- отсюда все проблемы
    imgui.SetNextWindowSize(imgui.ImVec2(300, 600), imgui.Cond.FirstUseEver)
    imgui.Begin(u8'Чит меню', tip_window_state)

    if imgui.Button(u8'Накрутить') then
      sampSendChat('саси')
    end
  end
end



function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
    sampRegisterChatCommand('enc', cmdEncrypt)
    sampRegisterChatCommand('dec', cmdDecrypt)
    sampfuncsRegisterConsoleCommand("xxxfunc", xxxfunc)
    while true do
      wait(0)
      if wasKeyPressed(key.VK_X) then
          main_window_state.v = not main_window_state.v
      end
      imgui.Process = main_window_state.v
      imgui.Process = tip_window_state.v
    end
  end

function xxxfunc()
  tip_window_state.v = not tip_window_state.v
end
imgui.End() забыл во втором окне
 

tlwsn

Известный
537
85
есть какое то google api для муна? хочу сдедать автозаполнение таблицы при повышении. ну или есть ли скрипт с открытым исхрдным для этого?)
 

rraggerr

проверенный какой-то
1,626
851
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
function getNamekeybyID(id)
  local name = {
    ['8'] = 'Backspase',
    ['9'] = 'Tab',
    ['13'] = 'Enter',
    ['16'] = 'Shift',
    ['17'] = 'Ctrl',
    ['18'] = 'Alt',
    ['19'] = 'Pause',
    ['20'] = 'Caps Lock',
    ['27'] = 'Esc',
    ['32'] = 'Space',
    ['33'] = 'Page UP',
    ['34'] = 'Page Down',
    ['35'] = 'End',
    ['36'] = 'Home',
    ['45'] = 'Insert',
    ['46'] = 'Delete',
    ['48'] = 0,
    ['49'] = 1,
    ['50'] = 2,
    ['51'] = 3,
    ['52'] = 4,
    ['53'] = 5,
    ['54'] = 6,
    ['55'] = 7,
    ['56'] = 8,
    ['57'] = 9,
    ['65'] = 'A',
    ['66'] = 'B',
    ['67'] = 'C',
    ['68'] = 'D',
    ['69'] = 'E',
    ['70'] = 'F',
    ['71'] = 'G',
    ['72'] = 'H',
    ['73'] = 'I',
    ['74'] = 'J',
    ['75'] = 'K',
    ['76'] = 'L',
    ['77'] = 'M',
    ['78'] = 'N',
    ['79'] = 'O',
    ['80'] = 'P',
    ['81'] = 'Q',
    ['82'] = 'R',
    ['83'] = 'S',
    ['84'] = 'T',
    ['85'] = 'U',
    ['86'] = 'V',
    ['87'] = 'W',
    ['88'] = 'X',
    ['89'] = 'Y',
    ['90'] = 'Z',
    ['96'] = 'Num 0',
    ['97'] = 'Num 1',
    ['98'] = 'Num 2',
    ['99'] = 'Num 3',
    ['100'] = 'Num 4',
    ['101'] = 'Num 5',
    ['102'] = 'Num 6',
    ['103'] = 'Num 7',
    ['104'] = 'Num 8',
    ['105'] = 'Num 9',
    ['106'] = 'Num *',
    ['107'] = 'Num +',
    ['109'] = 'Num -',
    ['110'] = 'Num .',
    ['111'] = 'Num /',
    ['112'] = 'F1',
    ['113'] = 'F2',
    ['114'] = 'F3',
    ['115'] = 'F4',
    ['116'] = 'F5',
    ['117'] = 'F6',
    ['118'] = 'F7',
    ['119'] = 'F8',
    ['120'] = 'F9',
    ['121'] = 'F10',
    ['122'] = 'F11',
    ['123'] = 'F12',
    ['144'] = 'Num Lock',
    ['145'] = 'Scroll Lock'
  }
  return name[id]
end
у меня есть вот такая функия, мне нужн что бы она выводила значение из конфига. Пробовал так,
Lua:
 kid = tonumber(cfg.keys.tazer)
local kname = getNamekeybyID(kid)
print(kname)
но выводит nil. Значение в конфиге = 88. В чом трабл?
если что, в стандартной либе vkeys есть перевод из int в char , твоя таблица - лишний код. Загружаешь конфиг и все, конфиг может принять VK_MOUSE1 - будет инт 1, или просто вписать сразу интом 1 , или хексом 0x01 , выйдет одна и та же кнопка, поэтому то что ты делаешь - какая то хуйня

есть какое то google api для муна? хочу сдедать автозаполнение таблицы при повышении. ну или есть ли скрипт с открытым исхрдным для этого?)
гугл апи оно и в африке гугл апи, у меня было овер дохера идей с этим, но само апи я так и не нашел
 
Последнее редактирование модератором:
  • Нравится
Реакции: tlwsn