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

EmilkaL

Известный
85
5
И еще вопрос, возможно ли по id игрока узнать его положение, при условии что он находится в зоне стрима?
 

Belo4ka_belka

Известный
191
7
И еще вопрос, возможно ли по id игрока узнать его положение, при условии что он находится в зоне стрима?
Код:
result, ped = sampGetCharHandleBySampPlayerId(21)
            if result and doesCharExist(ped) then -- если цель есть и персонаж существует
            tX, tY, tZ = getCharCoordinates(tped)
end
 

Juonior

Новичок
20
9
Как получить информацию о своём ФПС и вывести это на экран?
Lua:
script_name('fps')
script_author("Juonior")
require "lib.moonloader"
local sampev = require 'lib.samp.events'
local memory = require "memory"
fpsfont = renderCreateFont('arial', 9, 12) 
local sw, sh = getScreenResolution()
function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        fps = math.floor(memory.getfloat(0xB7CB50, true))
        renderFontDrawText(fpsfont, 'FPS: '..fps, 1, sh / 1.02, - 1)
    end
end
 
  • Нравится
Реакции: SkadiLuv

SkadiLuv

Участник
59
15
Lua:
script_name('fps')
script_author("Juonior")
require "lib.moonloader"
local sampev = require 'lib.samp.events'
local memory = require "memory"
fpsfont = renderCreateFont('arial', 9, 12)
local sw, sh = getScreenResolution()
function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        fps = math.floor(memory.getfloat(0xB7CB50, true))
        renderFontDrawText(fpsfont, 'FPS: '..fps, 1, sh / 1.02, - 1)
    end
end
Просто пусечька, спасибо
 

FBenz

Активный
328
40
sampCreate3dText - где можно посмотреть названия цветов для него? Написано, что ARGB, но он только в формате 0хFFFFFFFF. Где можно посмотреть такие названия цветов? При конвертации RGBA в HEX выдает FFFFFF, а не 0хFFFFFFFF (белый).
 

Juonior

Новичок
20
9
И еще вопрос, возможно ли по id игрока узнать его положение, при условии что он находится в зоне стрима?
Lua:
script_name('getcord')
script_author("Juonior")
require "lib.moonloader"
local sampev = require 'lib.samp.events'
function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('getcord', cmd_getcord)
    while true do
        wait(0)
    end
end

function cmd_getcord(id)
    if id == '' then
        sampAddChatMessage('Используйте /getcord [id]', -1)
    else
        if tonumber(id) and sampIsPlayerConnected(id) then --- Если ID число и игрок с этим ID подключен.
            result, handlid = sampGetCharHandleBySampPlayerId(id)  --- получаем handl по id
            if result and doesCharExist(handlid) then -- если цель есть и персонаж существует
                pX, pY, pZ = getCharCoordinates(handlid) --- Получаем координаты.
                sampAddChatMessage('Координаты игрока: X: '..pX..' Y: '..pY..' Z: ' ..pZ, -1)
            else
                sampAddChatMessage('Игрок находится вне зоны  стрима', -1)
            end
        else
            sampAddChatMessage('Используйте /getcord [id]', -1)
        end
    end
end
 
  • Нравится
Реакции: EmilkaL

EmilkaL

Известный
85
5
Как сделать проверку на значение в команде, те если я ввожу допустим /hello, то он выводит мне сообщение" Введите /hello [ID]", а если я ввожу /hello 55, то он вводит эту команду в чат

Lua:
script_name('getcord')
script_author("Juonior")
require "lib.moonloader"
local sampev = require 'lib.samp.events'
function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('getcord', cmd_getcord)
    while true do
        wait(0)
    end
end

function cmd_getcord(id)
    if id == '' then
        sampAddChatMessage('Используйте /getcord [id]', -1)
    else
        if tonumber(id) and sampIsPlayerConnected(id) then --- Если ID число и игрок с этим ID подключен.
            result, handlid = sampGetCharHandleBySampPlayerId(id)  --- получаем handl по id
            if result and doesCharExist(handlid) then -- если цель есть и персонаж существует
                pX, pY, pZ = getCharCoordinates(handlid) --- Получаем координаты.
                sampAddChatMessage('Координаты игрока: X: '..pX..' Y: '..pY..' Z: ' ..pZ, -1)
            else
                sampAddChatMessage('Игрок находится вне зоны  стрима', -1)
            end
        else
            sampAddChatMessage('Используйте /getcord [id]', -1)
        end
    end
end
Многа букав, пасиб ;*, ты этим постом ответил на 2 моих вопроса, хех
 

Juonior

Новичок
20
9
sampCreate3dText - где можно посмотреть названия цветов для него? Написано, что ARGB, но он только в формате 0хFFFFFFFF. Где можно посмотреть такие названия цветов? При конвертации RGBA в HEX выдает FFFFFF, а не 0хFFFFFFFF (белый).
Посмотри вот эту темку, https://blast.hk/threads/9763/

Как сделать проверку на значение в команде, те если я ввожу допустим /hello, то он выводит мне сообщение" Введите /hello [ID]", а если я ввожу /hello 55, то он вводит эту команду в чат
Lua:
function cmd_hello(arg)
    if arg == '' then -- Если написано arg = ничему, то
        sampAddChatMessage('Введие /hello [id]', -1)
    else
        if tonumber(arg) then --- Если arg число, то
            if sampIsPlayerConnected(arg) then-- Если игрок подключен
            else
                sampAddChatMessage('Игрок не в сети', -1)
            end
        else
            sampAddChatMessage('Введие /hello [id]', -1)
        end
    end
end

Здравствуйте товарищи, есть несколько вопросов.
1) Можно ли узнать что игрок целится в данный момент (как в машине так и пешком)?
2) Можно ли получить хэндл транспорта в который ты сейчас целишься (причем там не обязательно может быть водитель/пасажир)?
Можно получить только Персонажа, в которого ты сейчас целишься. Функций для машин, пикапов и тому подобного в moonloader'e нету. Для получения хендла персонажа используй:

Lua:
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- получить хендл персонажа, в которого целится игрок
if valid and doesCharExist(ped) then -- если цель есть и персонаж существует
    --- Код
end
 
  • Нравится
Реакции: FBenz

SkadiLuv

Участник
59
15
Lua:
script_name('fps')
script_author("Juonior")
require "lib.moonloader"
local sampev = require 'lib.samp.events'
local memory = require "memory"
fpsfont = renderCreateFont('arial', 9, 12)
local sw, sh = getScreenResolution()
function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        fps = math.floor(memory.getfloat(0xB7CB50, true))
        renderFontDrawText(fpsfont, 'FPS: '..fps, 1, sh / 1.02, - 1)
    end
end
а как уменьшить частоту обновления показателя? Слишком быстро меняется показатель, не понятно что за цифры вообще, было бы круто если бы обновлялся раз в пол секунды/секунду
 

#kweeZ

Известный
577
122
Кто поможет меня исправить работу в свернутом режиме на CheckBox из ImGui?
Lua:
if Rabs.v then
      -----Когда он Активирован.
       sampAddChatMessage('+', -1)
        writeMemory(7634870, 1, 1, 1)
        writeMemory(7635034, 1, 1, 1)
        memory.fill(7623723, 144, 8)
        memory.fill(5499528, 144, 6)
else
    ------Когда он вернет как было/Деактивирован.
    sampAddChatMessage('-', -1)
    writeMemory(7634870, 1, 0, 0)
    writeMemory(7635034, 1, 0, 0)
    memory.hex2bin('5051FF1500838500', 7623723, 8)
    memory.hex2bin('0F847B010000', 5499528, 6)
end
https://imgur.com/gallery/X88WaZK
В имгуи
Lua:
 if imgui.Checkbox("Test", checkbox) then
enabled = not enabled
if enabled then
sampAddChatMessage("+", -1)
else
sampAddChatMessage("-", -1)
end
end
Вне имгуи
Lua:
function winplay(work)
  while true do
    wait(0)
if enabled then -- on
memory.setuint8(7634870, 1)
memory.setuint8(7635034, 1)
memory.fill(7623723, 144, 8)
memory.fill(5499528, 144, 6)
else -- off
memory.setuint8(7634870, 0)
memory.setuint8(7635034, 0)
memory.hex2bin('5051FF1500838500', 7623723, 8)
memory.hex2bin('0F847B010000', 5499528, 6)
end
end
end

а как уменьшить частоту обновления показателя? Слишком быстро меняется показатель, не понятно что за цифры вообще, было бы круто если бы обновлялся раз в пол секунды/секунду
Поставь задержку больше
 

Juonior

Новичок
20
9
а как уменьшить частоту обновления показателя? Слишком быстро меняется показатель, не понятно что за цифры вообще, было бы круто если бы обновлялся раз в пол секунды/секунду
Lua:
script_name('fps')
script_author("Juonior")
require "lib.moonloader"
local sampev = require 'lib.samp.events'
local memory = require "memory"
fpsfont = renderCreateFont('arial', 9, 12) 
local sw, sh = getScreenResolution()
fps = math.floor(memory.getfloat(0xB7CB50, true)) --- Получаем FPS
function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    fps_update()
    while true do
        wait(0)
        renderFontDrawText(fpsfont, 'FPS: '..fps, 1, sh / 1.02, - 1) --- Выводим на экран
    end
end

function fps_update()
    lua_thread.create(function()
        while true do
            wait(2000) --- Задержка в милисекундах 2000 мл = 2 секунды
            fps = math.floor(memory.getfloat(0xB7CB50, true)) -- Получаем FPS
        end
    end)
end
 
  • Нравится
Реакции: SkadiLuv

SkadiLuv

Участник
59
15
В имгуи
Lua:
 if imgui.Checkbox("Test", checkbox) then
enabled = not enabled
if enabled then
sampAddChatMessage("+", -1)
else
sampAddChatMessage("-", -1)
end
end
Вне имгуи
Lua:
function winplay(work)
  while true do
    wait(0)
if enabled then -- on
memory.setuint8(7634870, 1)
memory.setuint8(7635034, 1)
memory.fill(7623723, 144, 8)
memory.fill(5499528, 144, 6)
else -- off
memory.setuint8(7634870, 0)
memory.setuint8(7635034, 0)
memory.hex2bin('5051FF1500838500', 7623723, 8)
memory.hex2bin('0F847B010000', 5499528, 6)
end
end
end


Поставь задержку больше
При изменении wait(0) на любое другое значение уменьшает частоту вывода фпса на экран, т.е текст моргать начинает
 

SkadiLuv

Участник
59
15
не заметил, спасибо

а math.floor заменить можно чем-то? Он просто округляет мой показатель фпс, поэтому выводится только 200, 250 и всё
 
  • Нравится
Реакции: Juonior

Juonior

Новичок
20
9
а math.floor заменить можно чем-то? Он просто округляет мой показатель фпс, поэтому выводится только 200, 250 и всё
Чем ты хочешь его заменить? Тебе нужно не целое число?.
Math.floor - функция, которое округляет число до целового. Пример 1.25, с функцией будет: 1.
Если ты хочешь не целое число в фпс, тогда просто убери math.floor и все