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

deleted-user-210352

Гость
уваужаемы скриптеры, я хочу сделать например привязку по серверу к серверам АРЗ, но чтоб у одного сервера была привязка по нику, как нибудь можно реализовать? пробовал пишет то нет привязки по серверу или нику
 

earthlord

Известный
136
34
уваужаемы скриптеры, я хочу сделать например привязку по серверу к серверам АРЗ, но чтоб у одного сервера была привязка по нику, как нибудь можно реализовать? пробовал пишет то нет привязки по серверу или нику
сверяй адрес сервера с массивом алдресов серверов аризоны, если не совпадает выгружай скрипт
 
У

Удалённый пользователь 411026

Гость
Какая функция что б узнать свой ip адресс, а не сервера?
 

Smeruxa

t.me/smeruxa
Проверенный
1,404
753
Какая функция что б узнать свой ip адресс, а не сервера?
Lua:
local lanes = require('lanes').configure()

function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('getip', function()
        async_http_request("GET", "https://api.ipify.org/?format=json", {params = {name = "test"}}, function(response)
        sampfuncsLog("you ip: "..response.text)
        sampAddChatMessage("you ip: "..response.text, -1)
        end, function(err) print(err) end)
    end)
    wait(-1)
end

function async_http_request(method, url, args, resolve, reject)
    local request_lane = lanes.gen('*', {package = {path = package.path, cpath = package.cpath}}, function()
        local requests = require 'requests'
        local ok, result = pcall(requests.request, method, url, args)
        if ok then
            result.json, result.xml = nil, nil -- cannot be passed through a lane
            return true, result
        else
            return false, result -- return error
        end
    end)
    if not reject then reject = function() end end
    lua_thread.create(function()
        local lh = request_lane()
        while true do
            local status = lh.status
            if status == 'done' then
                local ok, result = lh[1], lh[2]
                if ok then resolve(result) else reject(result) end
                return
            elseif status == 'error' then
                return reject(lh[1])
            elseif status == 'killed' or status == 'cancelled' then
                return reject(status)
            end
            wait(0)
        end
    end)
end
--bydamag
 
Последнее редактирование модератором:

Smeruxa

t.me/smeruxa
Проверенный
1,404
753
уваужаемы скриптеры, я хочу сделать например привязку по серверу к серверам АРЗ, но чтоб у одного сервера была привязка по нику, как нибудь можно реализовать? пробовал пишет то нет привязки по серверу или нику
Lua:
require 'lib.moonloader'

local servers = {
    [1] = "ip:port",
    [2] = "ip:port"
}

function main()
    while not isSampAvailable() do wait(100) end
    for k,v in ipairs(servers) do
        local ip, port = sampGetCurrentServerAddress()
        if ip..':'..port ~= v then
            thisScript():unload()
        end
    end
    while true do wait(0) end
end
 

sesr4g3w

Новичок
7
1
Как можно узнать, что написано в текстдраве, но при этом не отображая его?
 

Smeruxa

t.me/smeruxa
Проверенный
1,404
753
Как можно узнать, что написано в текстдраве, но при этом не отображая его?
в переменную money запишется кол-во денег, а сам текст драв пропадет
Lua:
function samp.onShowTextDraw(id, data)
    if data.text:find('Денег: (%d+)') then
        money = data.text:match('Денег (%d+)')
        return false
    end
end
 
  • Нравится
Реакции: sesr4g3w

Nessel

Участник
120
25
Всем привет парни, так как есть обход лаунчера была идея написать скрипт, чтобы мы играли на лаунчере а гташка была как обычный хотя плюшки капали
Код:
local sampev= require'lib.samp.events'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    wait(-1)
end

function sampev.onDisplayGameText(style, type, text)
    if text == "10000$" then
    return false
    end
end


function sampev.onServerMessage(color, text)
    if text == "Вам был добавлен предмет 'Гражданский талон'. Чтобы открыть инвентарь используйте" then
    return false
    end
end
Просто надо чтобы это не появлялось на экране во время пд. Осталось сделать спидометр.
 

Smeruxa

t.me/smeruxa
Проверенный
1,404
753
Всем привет парни, так как есть обход лаунчера была идея написать скрипт, чтобы мы играли на лаунчере а гташка была как обычный хотя плюшки капали
Код:
local sampev= require'lib.samp.events'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    wait(-1)
end

function sampev.onDisplayGameText(style, type, text)
    if text == "10000$" then
    return false
    end
end


function sampev.onServerMessage(color, text)
    if text == "Вам был добавлен предмет 'Гражданский талон'. Чтобы открыть инвентарь используйте" then
    return false
    end
end
Просто надо чтобы это не появлялось на экране во время пд. Осталось сделать спидометр.
А шо сделать то нужно скажи
 
  • Нравится
Реакции: Nessel
D

deleted-user-210352

Гость
Lua:
require 'lib.moonloader'

local servers = {
    [1] = "ip:port",
    [2] = "ip:port"
}

function main()
    while not isSampAvailable() do wait(100) end
    for k,v in ipairs(servers) do
        local ip, port = sampGetCurrentServerAddress()
        if ip..':'..port ~= v then
            thisScript():unload()
        end
    end
    while true do wait(0) end
end
вставил кодд ввел ip адрес, захожу на другой сервер и все равно работает,как исправить?
 

Smeruxa

t.me/smeruxa
Проверенный
1,404
753
вставил кодд ввел ip адрес, захожу на другой сервер и все равно работает,как исправить?
я проверял работает, upd 2 min. перепроверил работает. мб ты не так делаешь, ты вводишь сервера в массив, если self.сервер не равен серверу что в массиве скрипт отключается, т.е. это проверка на сервер
 

chapo

чопа сребдс // TG/IG: @moujeek
Модератор
9,042
11,891
Всем привет парни, так как есть обход лаунчера была идея написать скрипт, чтобы мы играли на лаунчере а гташка была как обычный хотя плюшки капали
Код:
local sampev= require'lib.samp.events'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    wait(-1)
end

function sampev.onDisplayGameText(style, type, text)
    if text == "10000$" then
    return false
    end
end


function sampev.onServerMessage(color, text)
    if text == "Вам был добавлен предмет 'Гражданский талон'. Чтобы открыть инвентарь используйте" then
    return false
    end
end
Просто надо чтобы это не появлялось на экране во время пд. Осталось сделать спидометр.
Lua:
function sampev.onServerMessage(color, text)
    if text:find("Вам был добавлен предмет 'Гражданский талон'. Чтобы открыть инвентарь используйте" ) then
        return false
    end
end
 
  • Нравится
Реакции: Nessel