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

T1cKz

Известный
596
246
Смена цвета меню imGui? на DearImGui всю библиотеку облазил не нашёл
 

RTD

Нестандартное звание
Модератор
391
414
Lua:
script_name('color')
function main()
    while not isSampAvailable do wait(0) end
    while true do wait(0)
        if sampTextdrawIsExists(2048) then
            local box, color, sizeX, sizeY = sampTextdrawGetLetterSizeAndColor(2048)
            sampTextdrawGetLetterSizeAndColor(2048, 0xFFFF0000)
        end
    end
end

Пытаюсь поменять цвет этого текстдрава
er9wEWc.jpg

но((
Может кто объяснить как это работает?
Lua:
local letSizeX, letSizeY, _ = sampTextdrawGetLetterSizeAndColor(2048)
sampTextdrawSetLetterSizeAndColor(2048, letSizeX, letSizeY, 0xFFFF0000)
 
  • Нравится
Реакции: Qsany

MrCold

Активный
364
118
Что я сделал не так? Хотел написать телепорт для одного сервера, и ошибок в консоли нету, но когда я сажусь в авто и пытаюсь тпнутся, ничего не произходит. Помогите пожалуйста!
Lua:
require "lib.moonloader"
local result, X, Y, Z = getTargetBlipCoordinates() -- Получает координаты метки на карте
local q = getGroundZFor3dCoord(X, Y, 999.0) -- Координаты земли
local active = true
local car = storeCarCharIsInNoSave(playerPed) -- Возвращает хендл машины, используемый педом
local J, K, L = getCharCoordinates(PLAYER_PED) -- Получить координаты актёра

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do
    wait(200)
    end
    sampRegisterChatCommand("ftpp", active)
    while true do
    wait(0)
        if result and active then
            loadScene(X, Y, Z)
            requestCollision(X, Y)
            result3, car = findAllRandomVehiclesInSphere(J, K, L, 15.0, 0, 1)
            if result3 then
                setCarCoordinates(car, X, Y, Z)
                wait (100)
                active = false
            end
        end
        if isCharSittingInAnyCar(PLAYER_PED) and active then
            loadScene(X, Y, Z)
            requestCollision(X, Y)
        else
            active = false
        end
    end
end
 

AnWu

Guardian of Order
Всефорумный модератор
4,686
5,166
Что-то не работает :(
Lua:
function hook.onShowDialog(id, style, title, btn1, btn2, text)
    if string.find(text,'Мат') then
        sampAddChatMessage('test', -1)
        sampSetCurrentDialogEditboxText('test')
    end
end
Сообщение в чат выводит, а в диалог - нет.
потому что это событие происходит до показа диалога. думай :)
 
  • Нравится
Реакции: Alkasch226

NookieONE

Участник
128
1
CLEO:
{$CLEO .cs}
0000:
thread "QWE"

if not 0@ = SAMP.Base()
then 0A93: end_custom_thread
end
while not SAMP.Available()
wait 100
end
0B34: samp register_client_command "tp" to_label @tp

while true
    wait 0
end

:tp
        IF 0AB6: store_target_marker_coords_to 1@ 2@ 3@
        THEN   
        04E4: refresh_game_renderer_at 1@ 2@ 3@
        03CB: set_rendering_origin_at 1@ 2@ 3@
        Camera.SetAtPos(1@, 2@, 3@)
        02CE: 3@ = ground_z_at 1@ 2@ 999.0
        Actor.PutAt($PLAYER_ACTOR,1@,2@,3@)
        ELSE
        chatmsg "Íå ïîñòàâëåíà ìåòêà íà êàðòå" -1
        END
SAMP.CmdRet

:tpp
if and
    0AB0:   key_pressed 05
    8B21:   not samp is_chat_opened
    8B4C:   not samp is_dialog_active -1
    then
        IF 0AB6: store_target_marker_coords_to 1@ 2@ 3@
        THEN   
        04E4: refresh_game_renderer_at 1@ 2@ 3@
        03CB: set_rendering_origin_at 1@ 2@ 3@
        Camera.SetAtPos(1@, 2@, 3@)
        02CE: 3@ = ground_z_at 1@ 2@ 999.0
        Actor.PutAt($PLAYER_ACTOR,1@,2@,3@)
        ELSE
        chatmsg "Íå ïîñòàâëåíà ìåòêà íà êàðòå" -1
        END
        wait 1000
    end
Не работает тп по кнопке
 

Qsany

Потрачен
464
147
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Может кто функцию прислать по нахождению id текстдрава путём нахождения его координат
 

AnWu

Guardian of Order
Всефорумный модератор
4,686
5,166
Может кто функцию прислать по нахождению id текстдрава путём нахождения его координат
Нихера не понял. На: /rtd
Покажет все кроме usebox, убери в скрипте проверку на usebox и покажет вообще все тд и их ид.
 

Вложения

  • rtd.lua
    873 байт · Просмотры: 10
  • Нравится
Реакции: Qsany

Qsany

Потрачен
464
147
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Нихера не понял. На: /rtd
Покажет все кроме usebox, убери в скрипте проверку на usebox и покажет вообще все тд и их ид.
XX0ZzCi.jpg


575 это id текстдрава, оно меняется с перезаходом на сервер
Мне нужно узнавать id этого текстдрава когда оно появится на экране и менять его цвет

Lua:
function main()
    while true do wait(0)
    while not isSampAvailable do wait(0) end
    if sampTextdrawIsExists(575) then
            local box, color, sizeX, sizeY = sampTextdrawGetBoxEnabledColorAndSize(575)
            sampTextdrawSetBoxColorAndSize(575, box, 0xFFff0000, sizeX, sizeY) end end end
 
Последнее редактирование:

Qsany

Потрачен
464
147
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
require 'moonloader'
require 'sampfuncs'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then
        return
    end
        while not isSampAvailable do wait(100) end
    while true do
wait(0)
    for textdrawid = 100, 1000 do
            if sampTextdrawIsExists(textdrawid) then
                local X, Y = sampTextdrawGetPos(textdrawid)

            local box, color, sizeX, sizeY = sampTextdrawGetBoxEnabledColorAndSize(textdrawid)
            sampTextdrawSetBoxColorAndSize(textdrawid, box, 0xFFff0000, sizeX, sizeY) end end end end


как замутить такую фигную типа пока текстдрав не будет найден, будет идти его поиск?
 

Hatiko

Известный
Проверенный
1,472
611
Что может обозначать ошибка, ниже написанная. По опкоду это sampAddChatMessage. В main, есть все проверки на загрузку всех необходим библиотек, то ошибка вылетает первой при заходе в игру.
Код:
opcode '0AF8' call caused an unhandled exception