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

Quasper

Известный
835
354
Можно ли как-то связать два скрипта, не используя хост? Мне нужно, чтобы в одном скрипте изменялась переменная и в другом скрипте на другом компуктере она принимала это значение. Читал про это, но нужен свой сайт на хосте, где можно будет писать свои php коды, редактирующие файлы на сайте.
Но такого у меня нет. Есть только хост, куда я могу заливать файлы. Однако, редактировать их через скрипт не выходит, ибо сайт не мой.
Ничего с этим не сделать?
ну можно использовать бесплатный хост, а если тебе нужно только для локальных ПК то проще через IIS поставить сервер на 1м пк и использовать его в качестве хоста

это не работает, подскажите плиз, как там писать надо, я уже забыл.
Lua:
sampRegisterChatCommand("idss", function param()
        local id = sampGetCurrentDialogId()
        print(id)
end)
Lua:
sampRegisterChatCommand("idss", param)
function param()
local id = sampGetCurrentDialogId()
print(id)
end

Ребят, как правильно юзать цикл в imgui.OnDrawFrame()?
Если использую for i = 1, 10 do (к примеру) то через некоторое время активности фрейма крашит самп.
И еще вопрос, я хочу заполнить фрейм текстом. Как сделать его кликабельным?(не кнопки)
 
Последнее редактирование:

pwned

Участник
142
5
Почему удаляет сообщение из чата, когда игрок пишет в пм?

Код:
local sampev = require 'lib.samp.events'
local playerID = nil

function sampev.onServerMessage(color, message)
            if message:find("%>%> ПМ от .+%: .+тест.+") or message:find("%>%> ПМ от .+%: .+test.+") then
            playerNick, playerID = message:match("%>%> ПМ от (.*)%[(%d+)%]: .+тест.+")
        sampAddChatMessage('Ты добавил игрока '..playerNick..' | ID: '..playerID.. 'в /blacklist', -1)
                sampSendChat(("/pm %s на респ"):format(playerID)
    end
end

function main()
    while not isSampAvailable() do wait(0) end
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while true do
        wait(0)
    end
end
 

Quasper

Известный
835
354
Почему удаляет сообщение из чата, когда игрок пишет в пм?

Код:
local sampev = require 'lib.samp.events'
local playerID = nil

function sampev.onServerMessage(color, message)
            if message:find("%>%> ПМ от .+%: .+тест.+") or message:find("%>%> ПМ от .+%: .+test.+") then
            playerNick, playerID = message:match("%>%> ПМ от (.*)%[(%d+)%]: .+тест.+")
        sampAddChatMessage('Ты добавил игрока '..playerNick..' | ID: '..playerID.. 'в /blacklist', -1)
                sampSendChat(("/pm %s на респ"):format(playerID)
    end
end

function main()
    while not isSampAvailable() do wait(0) end
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while true do
        wait(0)
    end
end
Это баг samp eventa, не помню правда как он работает. Короче он просто обрабатывает сообщение но не выводит его клиенту
Юзай так
Lua:
function sampev.onServerMessage(color, message)
            if message:find("%>%> ПМ от .+%: .+тест.+") or message:find("%>%> ПМ от .+%: .+test.+") then
sampAddChatMessage(message, color) --[[Вроде так, могу ошибиться, не помню точно какой цвет приходит из OnServerMessage, если что переконвертируешь]]
            playerNick, playerID = message:match("%>%> ПМ от (.*)%[(%d+)%]: .+тест.+")
        sampAddChatMessage('Ты добавил игрока '..playerNick..' | ID: '..playerID.. 'в /blacklist', -1)
                sampSendChat(("/pm %s на респ"):format(playerID)
    end
end
 
Последнее редактирование:

Double Tap Inside

Известный
Проверенный
1,916
1,256
Почему удаляет сообщение из чата, когда игрок пишет в пм?

Код:
local sampev = require 'lib.samp.events'
local playerID = nil

function sampev.onServerMessage(color, message)
            if message:find("%>%> ПМ от .+%: .+тест.+") or message:find("%>%> ПМ от .+%: .+test.+") then
            playerNick, playerID = message:match("%>%> ПМ от (.*)%[(%d+)%]: .+тест.+")
        sampAddChatMessage('Ты добавил игрока '..playerNick..' | ID: '..playerID.. 'в /blacklist', -1)
                sampSendChat(("/pm %s на респ"):format(playerID)
    end
end

function main()
    while not isSampAvailable() do wait(0) end
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while true do
        wait(0)
    end
end

Был этот прикол. Я просто дорисовывал сожраную чат строку. в момент получения строки нельзя сразу отпоавить команду на сервер. Вторым решением есть запустить: начать новый поток. Поставить задержку 100 мс. . Отправить в чат команду. Закрыть поток

Это баг samp eventa, не помню правда как он работает. Короче он просто обрабатывает сообщение но не выводит его клиенту
Юзай так
Lua:
function sampev.onServerMessage(color, message)
            if message:find("%>%> ПМ от .+%: .+тест.+") or message:find("%>%> ПМ от .+%: .+test.+") then
sampAddChatMessage(message, color) --[[Вроде так, могу ошибиться, не помню точно какой цвет приходит из OnServerMessage, если что переконвертируешь]]
            playerNick, playerID = message:match("%>%> ПМ от (.*)%[(%d+)%]: .+тест.+")
        sampAddChatMessage('Ты добавил игрока '..playerNick..' | ID: '..playerID.. 'в /blacklist', -1)
                sampSendChat(("/pm %s на респ"):format(playerID)
    end
end
Тоддько bit.rshift(color, 8) стоб был цвет верный
 

neYarik.

Участник
83
9
Почему удаляет сообщение из чата, когда игрок пишет в пм?

Код:
local sampev = require 'lib.samp.events'
local playerID = nil

function sampev.onServerMessage(color, message)
            if message:find("%>%> ПМ от .+%: .+тест.+") or message:find("%>%> ПМ от .+%: .+test.+") then
            playerNick, playerID = message:match("%>%> ПМ от (.*)%[(%d+)%]: .+тест.+")
        sampAddChatMessage('Ты добавил игрока '..playerNick..' | ID: '..playerID.. 'в /blacklist', -1)
                sampSendChat(("/pm %s на респ"):format(playerID)
    end
end

function main()
    while not isSampAvailable() do wait(0) end
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while true do
        wait(0)
    end
end
в конце onservermessage пишешь
Lua:
return {color, message}
 
  • Нравится
Реакции: Double Tap Inside

Double Tap Inside

Известный
Проверенный
1,916
1,256
Меня краши gta при попытке прочитать или записать переменную lua_thread.work_in_pause
 

#kweeZ

Известный
577
124
Как через onServerMessage найти?

Код:
function sampev.onServerMessage(text)
if text:find("Ник_ник передал тебе денег") then
end
end