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

astynk

Известный
Проверенный
742
530
как выбрать (выбрать, после нажать enter) строку в диалоге?
пробовал
Lua:
sampSendDialogResponse(тут id диалога, 1, 0, nil)
но что-то не получается
Попробуй так
Lua:
sampSetCurrentDialogListItem(5) -- номер строки, отсчет с нуля
sampCloseCurrentDialogWithButton(1)
 

The Spark

Известный
653
672
Как сделать что бы переменная менялась? Тип вот такого
Lua:
for i = 1, 6 do
    c .. i = renderLoadTextureFromFile("moonloader/config/Hud" .. i)
end
Ну и получилось что в "c1", "c2", "c3"... "c6". Записаны картинки
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,635
2,485
Как сделать что бы переменная менялась? Тип вот такого
Lua:
for i = 1, 6 do
    c .. i = renderLoadTextureFromFile("moonloader/config/Hud" .. i)
end
Ну и получилось что в "c1", "c2", "c3"... "c6". Записаны картинки
В таблицу.
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
как найти определенные слова в тексте через text:find к примеру вот текст "Карл у Клары украл кораллы"
если сделаю так
if text:find("Карл украл"), то он не реагирует на этот текст, мне нужно чтобы если в этом тексте были слова "Карл украл" then (мой код)
 

quesada

q-team
Проверенный
849
1,160
при попытке тп на метку пишет что метка не найдена хелп плс(
 

Вложения

  • ctf.txt
    5.9 KB · Просмотры: 8

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,635
2,485
как найти определенные слова в тексте через text:find к примеру вот текст "Карл у Клары украл кораллы"
если сделаю так
if text:find("Карл украл"), то он не реагирует на этот текст, мне нужно чтобы если в этом тексте были слова "Карл украл" then (мой код)
Lua:
if text:find("Карл.+украл") then
 
  • Нравится
Реакции: Dmitriy Makarov

TSIDEX

Известный
83
8
Как правильно сделать несколько аргументов в одной функции?
 

cheremuxa

Известный
430
200
при попытке тп на метку пишет что метка не найдена хелп плс(
это плохой декомпил какого-то телепорта, у тебя он не сработает, но я нашел одну ошибку, попробуй :/
Lua:
function main()
    repeat
        wait(0)
    until isSampAvailable()

    printStringNow("~>~ ~r~ teleport for arz by Bucha activated | Ver.: 1.0.0 ~<~", 2500)
    sampRegisterChatCommand("btp", function ()
        result, x, y, z = getTargetBlipCoordinates()

        if result then
            if isCharInAnyCar(PLAYER_PED) then
                lua_thread.create(carTeleport, x, y, z)
            else
                lua_thread.create(teleport, x, y, z)
            end
        else
            printStringNow("~>~ ~r~marker not found ~<~", 2500)
        end
    end)
    sampRegisterChatCommand("btpc", function ()
        result, x, y, z = SearchMarker(getCharCoordinates(PLAYER_PED))

        if result then
            if isCharInAnyCar(PLAYER_PED) then
                lua_thread.create(carTeleport, x, y, z)
            else
                lua_thread.create(teleport, x, y, z)
            end
        else
            printStringNow("~>~ ~r~checkpoint not found ~<~", 2500)
        end
    end)
    wait(-1)
end

function nopHook(slot0, slot1)
    require("samp.events")[slot0] = function ()
        if uv0 then
            return false
        end
    end
end

require("lib.samp.events").onSendPlayerSync = function (slot0)
    if Surfing then
        slot0.surfingVehicleId = vehicleId
        slot0.surfingOffsets.x = 0.1
        slot0.surfingOffsets.y = 0.1
        slot0.surfingOffsets.z = 0.1
    end
end

function isAllowed(slot0)
    slot1 = false

    for slot6, slot7 in pairs(slot2) do
        if slot0 == slot7 then
            slot1 = true

            break
        end
    end

    return slot1
end

function teleport(slot0, slot1, slot2)
    if FindSuitableVehicle() then
        lockPlayerControl(true)
        printStringNow("~Y~please wait~s~", 1600)

        Surfing = true

        sampForceOnfootSync()
        setCharCoordinates(PLAYER_PED, slot0, slot1, slot2)
        sampForceOnfootSync()
        wait(1500)

        Surfing = false

        lockPlayerControl(false)
        printStringNow("~>~ ~p~successful ~s~teleport ~<~", 2500)
        addOneOffSound(0, 0, 0, 1139)
    else
        printStringNow("~>~ ~r~no suitable vehicles in the stream ~<~", 2500)
        addOneOffSound(0, 0, 0, 1085)
    end
end

function FindSuitableVehicle()
    slot0 = false

    for slot4, slot5 in pairs(getAllVehicles()) do
        if isAllowed(getCarModel(slot5)) then
            result, vehicleId = sampGetVehicleIdByCarHandle(slot5)

            if result then
                slot0 = true

                break
            end
        end
    end

    return slot0
end

function sendPassengerSync(slot0, slot1, slot2)
    slot3 = allocateMemory(24)
    slot4, slot7 = sampGetPlayerIdByCharHandle(PLAYER_PED)

    sampStorePlayerPassengerData(slot5, slot3)
    setStructElement(slot3, 2, 1, 1, false)
    setStructFloatElement(slot3, 12, slot0, false)
    setStructFloatElement(slot3, 16, slot1, false)
    setStructFloatElement(slot3, 20, slot2, false)
    sampSendPassengerData(slot3)
    freeMemory(slot3)
end

function sendUnoccupiedSyncBySeatId(slot0, slot1, slot2, slot3)
    slot4 = allocateMemory(67)
    slot6, slot15 = sampGetVehicleIdByCarHandle(slot5)
    slot14, slot14, slot14 = getCarRoll(slot5)

    setStructElement(slot4, 0, 2, slot7, false)
    setStructElement(slot4, 2, 1, slot3, false)
    setStructFloatElement(slot4, 3, slot8, false)
    setStructFloatElement(slot4, 7, slot9, false)
    setStructFloatElement(slot4, 11, slot10, false)
    setStructFloatElement(slot4, 15, 0.09, false)
    setStructFloatElement(slot4, 19, -0.8, false)
    setStructFloatElement(slot4, 23, 0.02, false)
    setStructFloatElement(slot4, 27, slot0, false)
    setStructFloatElement(slot4, 31, slot1, false)
    setStructFloatElement(slot4, 35, slot2, false)
    setStructFloatElement(slot4, 39, 0.0012, false)
    setStructFloatElement(slot4, 43, 0.02, false)
    setStructFloatElement(slot4, 47, 0.0017, false)
    setStructFloatElement(slot4, 51, 0.005, false)
    setStructFloatElement(slot4, 55, -0.002, false)
    setStructFloatElement(slot4, 59, 0.3, false)
    setStructElement(slot4, 63, 4, 0, false)
    sampSendUnoccupiedData(slot4)
    freeMemory(slot4)
end

function sendInCarFakePosition(slot0, slot1, slot2)
    for slot6 = 0, 2, 1 do
        slot7 = allocateMemory(24)
        slot8, slot11 = sampGetPlayerIdByCharHandle(PLAYER_PED)

        sampStorePlayerPassengerData(slot9, slot7)
        freeMemory(slot7)
        sendUnoccupiedSyncBySeatId(slot0, slot1, slot2, getStructElement(slot7, 2, 1, false))
        sendPassengerSync(slot0, slot1, slot2)
    end
end

function carTeleport(slot0, slot1, slot2)
    nopHook("onSendPacket", true)
    lockPlayerControl(true)
    coordmaster(slot0, slot1, slot2)
end

function coordmaster(slot0, slot1, slot2)
    slot3 = 10
    slot9, slot10, slot7 = getCarCoordinates(slot4)
    slot8 = getAngle(slot5, slot6, slot0, slot1)

    while true do
        wait(0)
        printStringNow("~Y~please wait~s~", 50)

        if slot3 < getDistanceBetweenCoords2d(slot5, slot6, slot0, slot1) then
            sendInCarFakePosition(slot5 + math.sin(slot8) * slot3, slot6 + math.cos(slot8) * slot3, slot7)
        else
            sendInCarFakePosition(slot0, slot1, slot2)
            setCarCoordinates(slot4, slot0, slot1, slot2)
            nopHook("onSendPacket", false)
            lockPlayerControl(false)
            printStringNow("~>~ ~p~successful ~s~teleport ~<~", 2500)
            addOneOffSound(0, 0, 0, 1139)

            break
        end
    end
end

function getAngle(slot0, slot1, slot2, slot3)
    return math.atan2(slot2 - slot0, slot3 - slot1)
end

function getTargetBlipCoordinatesFixed()
    slot0, slot1, slot2, slot3 = getTargetBlipCoordinates()

    if not slot0 then
        return false
    end

    requestCollision(slot1, slot2)
    loadScene(slot1, slot2, slot3)

    slot8, slot9, slot10, slot11 = getTargetBlipCoordinates()

    return slot4, slot5, slot6, slot7
end

function SearchMarker(slot0, slot1, slot2)
    slot3 = 0
    slot4 = 0
    slot5 = 0
    slot6 = false

    for slot10 = 0, 31, 1 do
        slot11 = 0
        slot13 = representIntAsFloat(readMemory(13103464 + slot10 * 56 + 4, 4, false))
        slot14 = representIntAsFloat(readMemory(13103464 + slot10 * 56 + 8, 4, false))

        if representIntAsFloat(readMemory(13103464 + slot10 * 56 + 0, 4, false)) ~= 0 or slot13 ~= 0 or slot14 ~= 0 then
            slot3 = slot12
            slot4 = slot13
            slot5 = slot14
            slot6 = true
        end
    end

    return slot6, slot3, slot4, slot5
end
 
  • Нравится
Реакции: quesada

Belo4ka_belka

Известный
191
7
Здравствуйте, товарищи. Такой вопрос, можно ли где-то прочитать содержимое вот этого текста (скрин): http://prntscr.com/oc3axs. У меня конечно есть адрес памяти, когда я искал его через АХК, но может-быть есть какая-то встроенная функция для этого?
 

DolgorukovGTA

Известный
Проверенный
652
345
Как произвести очистку анимации? в Pawn соответствующую функцию нашёл, в Lua нет