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

RazorRw

t.me/sssecretway | ТГК: t.me/razor_ware
Всефорумный модератор
2,012
3,370
Как сделать,что когда я нажал на кнопку imgui.Button,и мне надо нажать от 1 до 100,и когда я нажал то выбилось сообщение в чат,какое число я нажал
Код:
count = 0

if imgui.Button('Test') then
    count = count + 1
    print(count)
end
Код:
if imgui.CollapsingHeader('info') then
    local info_text = [[ 
Плагин,для таких отсталых пользователей/игроков,которые лень учить .LUA
ТАКИХ КАК
Fabregooooooooooooooooooo
By Vespan
]]
    imgui.Text(u8(info_text))
end
Во первых - LUA это скрипты. усек?
Во вторых - ты же сам создаешь миллион тем чтобы тебе кинули готовый код :\
 
  • Нравится
Реакции: Fabregoo

Kolbasa241

Известный
211
57
Помогите, при вводе команды /chip 132 18.16.88.192 192 123.16.48.192 в чат у меня появляется окно с двумя айпишниками, т.е. два айпи и информация о каждом, и расстояние тоже о каждом.
Как сделать так чтобы у каждого ипа были свои переменные, т.е. у этого ипа - 132 18.16.88.192 были переменные logquery logcountry logcity logisp, а у айпи - 123.16.48.192 были переменные regquery regcountry regcity regisp. А не у обоих ипов это были одни переменные, помогите пожалуйста, сколько всего перепробывал.

КОД:
Lua:
script_name("IP Checker")
script_author("drags (blast.hk)")
script_version("Poxuy na Versiyu")
local cjson = require"cjson"
local encoding = require"encoding"
local effil = require"effil"
encoding.default = "cp1251"
u8 = encoding.UTF8

function asyncHttpRequest(method, url, args, resolve, reject)
    local request_thread = effil.thread(function(method, url, args)
        local requests = require"requests"
        local result, response = pcall(requests.request, method, url, args)
        if result then
            response.json, response.xml = nil, nil
            return true, response
        else
            return false, response
        end
    end)(method, url, args)

    if not resolve then
        resolve = function() end
    end
    if not reject then
        reject = function() end
    end
    lua_thread.create(function()
        local runner = request_thread
        while true do
            local status, err = runner:status()
            if not err then
                if status == "completed" then
                    local result, response = runner:get()
                    if result then
                        resolve(response)
                    else
                        reject(response)
                    end
                    return
                elseif status == "canceled" then
                    return reject(status)
                end
            else
                return reject(err)
            end
            wait(0)
        end
    end)
end

function distance_cord(lat1, lon1, lat2, lon2)
    if lat1 == nil or lon1 == nil or lat2 == nil or lon2 == nil or lat1 == "" or lon1 == "" or lat2 == "" or lon2 == "" then
        return 0
    end
    local dlat = math.rad(lat2 - lat1)
    local dlon = math.rad(lon2 - lon1)
    local sin_dlat = math.sin(dlat / 2)
    local sin_dlon = math.sin(dlon / 2)
    local a =
        sin_dlat * sin_dlat + math.cos(math.rad(lat1)) * math.cos(
            math.rad(lat2)
        ) * sin_dlon * sin_dlon
    local c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
    local d = 6378 * c
    return d
end

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

function chip(cl)
    ips = {}
    for word in string.gmatch(cl, "(%d+%p%d+%p%d+%p%d+)") do
        table.insert(ips, { query = word })
    end
    if #ips > 0 then
        data_json = cjson.encode(ips)
        asyncHttpRequest(
            "POST",
            "http://ip-api.com/batch?fields=25305&lang=ru",
            { data = data_json },
            function(response)
                local rdata = cjson.decode(u8:decode(response.text))
                local text = ""
                for i = 1, #rdata do
                    if rdata[i]["status"] == "success" then
                        local distances =
                            distance_cord(
                                rdata[1]["lat"],
                                rdata[1]["lon"],
                                rdata[i]["lat"],
                                rdata[i]["lon"]
                            )
                        text =
                            text .. string.format(
                                "\n{FFF500}IP - {FF0400}%s\n{FFF500}Страна -{FF0400} %s\n{FFF500}Город -{FF0400} %s\n{FFF500}Провайдер -{FF0400} %s\n{FFF500}Растояние -{FF0400} %d  \n\n",
                                rdata[i]["query"],
                                rdata[i]["country"],
                                rdata[i]["city"],
                                rdata[i]["isp"],
                                distances
                            )
               end
                end
                if text == "" then
                    text = " \n\t{FFF500}Ничего не найдено"
                end
                showdialog("Информация о IP", text)
            end,
            function(err)
                showdialog("Информация о IP", "Произошла ошибка \n" .. err)
            end
        )
    end
end

function showdialog(name, rdata)
    sampShowDialog(
        math.random(1000),
        "{FF4444}" .. name,
        rdata,
        "Закрыть",
        false,
        0
    )
end
 
Последнее редактирование:

Fabregoo

Известный
656
129
Код:
while true do wait(0)
    if testCheat('gg') then
        activation = not activation
    end
    if activation then
            setVirtualKeyDown(VK_F, true)
                   wait(1)
                    setVirtualKeyDown(VK_F, false)
    end
МОЙ ВОПРОС:Как сделать,что когда у игрока 0 броника,заменивался 0-лик на "Нету"
sampGetPlayerArmor
Для imgui.Text
не возможно остановить флуд клавиши, мб из - за того что не задейстованна function Flooder?
 

Fabregoo

Известный
656
129
Ты неправильно понял,я нажал imgui.Button,и я ввожу от 1 до 100 на клавиатуре(допустим 71),потом когда ввёл,нажимаю ENTER и выводиться в чат сообщение сколько я ввёл на клаве число
(напишет 71,потому-что я ввёл на клаве 71 число)
Сделать через аргументы?
 

Vespan

хинкали это большие пельмени
Проверенный
2,139
1,892
Как сделать,что когда нажал кнопку,можно было перетащить imgui окно,ещё раз нажал на кнопку,и imgui окно в том месте где его оставил
 

RazorRw

t.me/sssecretway | ТГК: t.me/razor_ware
Всефорумный модератор
2,012
3,370
  • Нравится
Реакции: Fabregoo

MrCold

Активный
364
118
Ошибка на getObjectCoordinates. Незнаю, в чём причина.
Lua:
function events.onCreateObject(id, data)
    if dmg then
        if data.modelId == 1590 then
            local OBJECT_HANDLE = sampGetObjectHandleBySampId(tonumber(id))
            local _, ox, oy, oz = getObjectCoordinates(OBJECT_HANDLE)
            local data = samp_create_sync_data('bullet', false)
            data.targetType = 1
            data.targetId = 65535
            data.origin.x, data.origin.y, data.origin.z = getActiveCameraCoordinates()
            data.target.x, data.target.y, data.target.z = ox, oy, oz
            data.weaponId = 24
            data.send()
        end
    end
end
 

Fabregoo

Известный
656
129
Как вместо имуги окна, создать диалог ( как /mn на аризоне ) и в нем создать пункты. то есть, при нажатие на пункты, будет идти действие ( любое, даже sampSendChat) не подскажет кто, 722 id диалога.
 

RazorRw

t.me/sssecretway | ТГК: t.me/razor_ware
Всефорумный модератор
2,012
3,370
Ошибка на getObjectCoordinates. Незнаю, в чём причина.
Lua:
function events.onCreateObject(id, data)
    if dmg then
        if data.modelId == 1590 then
            local OBJECT_HANDLE = sampGetObjectHandleBySampId(tonumber(id))
            local _, ox, oy, oz = getObjectCoordinates(OBJECT_HANDLE)
            local data = samp_create_sync_data('bullet', false)
            data.targetType = 1
            data.targetId = 65535
            data.origin.x, data.origin.y, data.origin.z = getActiveCameraCoordinates()
            data.target.x, data.target.y, data.target.z = ox, oy, oz
            data.weaponId = 24
            data.send()
        end
    end
end
Проверь, получает ли скрипт вообще хэндл объекта
Как вместо имуги окна, создать диалог ( как /mn на аризоне ) и в нем создать пункты. то есть, при нажатие на пункты, будет идти действие ( любое, даже sampSendChat) не подскажет кто, 722 id диалога.
 
  • Нравится
Реакции: Fabregoo

RazorRw

t.me/sssecretway | ТГК: t.me/razor_ware
Всефорумный модератор
2,012
3,370
Я понимаю, можешь отказать, или проигнорить, но я не очень понимаю wiki)
Lua:
sampShowDialog(228, 'Заголовок диалога', 'Привет\nКак дела?\nА у тебя?', 'Окей', 'Не окей', DIALOG_STYLE_LIST)
Делай всё сам,тут помогают не делают за тебя всё
кто бы говорил
 
  • Нравится
Реакции: Fabregoo