Вопросы по 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
 
Последнее редактирование:

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,484
смысле ненужно? gsub использует паттерны. Экранирование нужно если ищите обычный символ.
Хз, у меня и без экранирования работает нормально. (Ищу *, а не какой то другой символ)
 

штейн

Известный
Проверенный
1,001
687
Lua:
function sampev.onServerMessage(color, text)
    if text:find('%{.+%}%[ ADM %]: (%S+)%[%d+%] Подозрение на .+ %{cccccc%}%[ Отправлен на Спавн %]') then
        print('1')
        local nick, id, cause = text:match('%{.+%}%[ ADM %]: (%S+)%[%d+%] Подозрение на .+ %{cccccc%}%[ Отправлен на Спавн %]')
        print('2')
        if nick and id and cause then
            print(id, nick, cause)
        end
    end
end
че не работает
строка: [ ADM ]: Viktor_Blom[8] Подозрение на Aim Bot {cccccc}[ Отправлен на Спавн ]
можно помочь плс
 

checkdasound

Известный
Проверенный
963
406
Как добавить такую вот кнопку сохранить изменения, чтобы она, соответственно, сохраняла введенные клавиши.
upload_2018-6-22_16-22-3.png
 

Aniki

🐰
Администратор
1,225
1,506
да иник я и сам могу сделать, уже скрипта 3 с ним делал. Но меня интересует, возможно ли сделать без него.
можно писать в текстовый файл как вариант, или тебе интересно как можно сохранить вообще без создания файлов? Так не выйдет
 
  • Нравится
Реакции: checkdasound

Nishikinov

Известный
148
34
Возникла проблема со скриптом ChatHelper, не показывается текущая раскладка клавиатуры кроме русской. Дело в том, что самп запускаю на Linux Mint 19 Tara через Wine. Можно ли что-то с этим сделать? Не шарю за сам способ получения.
Ya0tLnisqhA.jpg

Ниже прикладываю код получения раскладки из скрипта:
Lua:
local ffi = require("ffi")
ffi.cdef[[
    short GetKeyState(int nVirtKey);
    bool GetKeyboardLayoutNameA(char* pwszKLID);
    int GetLocaleInfoA(int Locale, int LCType, char* lpLCData, int cchData);
]]

success = ffi.C.GetKeyboardLayoutNameA(KeyboardLayoutName)
      errorCode = ffi.C.GetLocaleInfoA(tonumber(ffi.string(KeyboardLayoutName), 16), 0x00000002, LocalInfo, BuffSize)
      localName = ffi.string(LocalInfo)

//если здесь не все, полный код по ссылке на скрипт выше
 

checkdasound

Известный
Проверенный
963
406
1)Куда мне нужно поставить ini.settings.repair, чтобы у меня сохранялось значение клавиши, введеной в инпуте repairKey, даже после перезахода.
2) Как сделать, чтобы кнопка Load была справа от кнопки Save, а не снизу.
Lua:
inicfg                        = require 'inicfg'
-- code
local maincfg =
{
   settings = {
       repair = 0x52,
       suicideKey = 0x7A,
       rotateCarKey = 0x08
   }
}
-- code
       imgui.InputText('repairKey', repairKey)
-- code
       if imgui.Button('Save') then
           inicfg.save(maincfg, '..\\config\\funcs.ini')
       end
      
       if imgui.Button('Load') then
           inicfg.load(maincfg, '..\\config\\funcs.ini')
       end
-- function main while true do
inifile()
-- code
function inifile()
   if not doesFileExist(getGameDirectory()..'\\moonloader\\config\funcs.ini') then
       inicfg.save(maincfg, '..\\config\\funcs.ini')
   end
   inicfg.load(maincfg, '..\\config\\funcs.ini')
end
 

checkdasound

Известный
Проверенный
963
406
Lua:
if imgui.InputText('repairKey', repairKey) then
    ini.settings.repair = repairKey.v
end
Lua:
if imgui.Button('Save') then
    inicfg.save(maincfg, '..\\config\\funcs.ini')
end
imgui.SameLine()
if imgui.Button('Load') then
    inicfg.load(maincfg, '..\\config\\funcs.ini')
end
Lua:
inicfg                        = require 'inicfg'
-- code
local maincfg =
{
   settings = {
       repair = 0x52,
       suicideKey = 0x7A,
       rotateCarKey = 0x08
   }
}
-- code

       if imgui.InputText('repairKey', repairKey) then
           ini.settings.repair = repairKey.v
       end
-- function main while true do

       if isKeyJustPressed(repairKey.v) and isKeyCheckAvailable() and isCharInAnyCar(PLAYER_PED) then
           fixCar(veh)
       end
--code 
function inifile()
   if not doesFileExist(getGameDirectory()..'\\moonloader\\config\funcs.ini') then
       inicfg.save(maincfg, '..\\config\\funcs.ini')
   end
   inicfg.load(maincfg, '..\\config\\funcs.ini')
end

function isKeyCheckAvailable()
   if not isSampLoaded() then
       return true
   end
   if not isSampfuncsLoaded() then
       return not sampIsChatInputActive() and not sampIsDialogActive()
   end
   return not sampIsChatInputActive() and not sampIsDialogActive() and not isSampfuncsConsoleActive()
end

52: ini.settings.repair = repairKey.v
что делать? при попытке что-либо написать в инпуте repairKey, скрипт оффается и выводит такую ошибку.
moonloader\funcs.lua:52: attempt to index global 'ini' (a nil value)
stack traceback:
moonloader\funcs.lua:52: in function 'OnDrawFrame'
moonloader\lib\imgui.lua:1377: in function <moonloader\lib\imgui.lua:1366>
[ML] (error) someFuncs: Script died due to an error. (01A10114)