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

RTD

Нестандартное звание
Модератор
391
414
Это не работает напрямую через http, мне нужно без загрузки файла на пк
Отправляешь http запрос(через тот же luasocket можно), сайт возвращает исходный код и ты запускаешь его как поток
 

MrCold

Активный
364
118
Отправляешь http запрос(через тот же luasocket можно), сайт возвращает исходный код и ты запускаешь его как поток
Тоже не робит. Сам попробуй в игре запустить
Lua:
local key = require "vkeys"
local imgui = require "imgui"
local moon = require "lib.moonloader"
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local TestInt = imgui.ImInt(0)
local TestFloat = imgui.ImFloat(0.00)



local main_test_imgui = imgui.ImBool(false)
function imgui.OnDrawFrame()
    if main_test_imgui.v then
        imgui.Begin("Window")
        imgui.Checkbox("testbox", false)
        imgui.SliderFloat("testfloat", TestFloat, 0.00, 10.00)
        imgui.SliderInt("TestInt", TestInt, 0, 10)
        imgui.End()
    end
end



function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
    wait(0)
    if wasKeyPressed(key.VK_H) then
        main_test_imgui.v = not main_test_imgui.v
    end
    imgui.Process = main_test_imgui.v end
end
 

zwhoz

Известный
106
11
Тоже не робит. Сам попробуй в игре запустить
Вот.
Lua:
local key = require "vkeys"
local imgui = require "imgui"
local moon = require "lib.moonloader"
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local main_test_imgui = imgui.ImBool(false)
local checkbox = imgui.ImBool(false)
local TestInt = imgui.ImInt(0)
local TestFloat = imgui.ImFloat(0.00)
function imgui.OnDrawFrame()
    if main_test_imgui.v then
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(200, 200), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'Window', main_test_imgui)
        imgui.Checkbox("testbox", checkbox)
        imgui.SliderFloat("TestFloat", TestFloat, 0.00, 10.00)
        imgui.SliderInt("TestInt", TestInt, 0, 10)
        imgui.End()
    end
end

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        if wasKeyPressed(key.VK_H) then
            main_test_imgui.v = not main_test_imgui.v
        end
        imgui.Process = main_test_imgui.v
    end
end
 
  • Нравится
Реакции: RTD

MrCold

Активный
364
118
Вот.
Lua:
local key = require "vkeys"
local imgui = require "imgui"
local moon = require "lib.moonloader"
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local main_test_imgui = imgui.ImBool(false)
local checkbox = imgui.ImBool(false)
local TestInt = imgui.ImInt(0)
local TestFloat = imgui.ImFloat(0.00)
function imgui.OnDrawFrame()
    if main_test_imgui.v then
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(200, 200), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'Window', main_test_imgui)
        imgui.Checkbox("testbox", checkbox)
        imgui.SliderFloat("TestFloat", TestFloat, 0.00, 10.00)
        imgui.SliderInt("TestInt", TestInt, 0, 10)
        imgui.End()
    end
end

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        if wasKeyPressed(key.VK_H) then
            main_test_imgui.v = not main_test_imgui.v
        end
        imgui.Process = main_test_imgui.v
    end
end
Что такое и как использовать:
encoding.default = 'CP1251'
u8 = encoding.UTF8
 

zwhoz

Известный
106
11
Что такое и как использовать:
encoding.default = 'CP1251'
u8 = encoding.UTF8
Кодировка текста.
Если хочешь на англ. можно так: imgui.Begin('Window', main_test_imgui)
Если хочешь на русском надо так: imgui.Begin(u8'Окно', main_test_imgui), иначе вместо русских букв будут символы.
 

AnWu

Guardian of Order
Всефорумный модератор
4,690
5,190
Кодировка текста.
Если хочешь на англ. можно так: imgui.Begin('Window', main_test_imgui)
Если хочешь на русском надо так: imgui.Begin(u8'Окно', main_test_imgui), иначе вместо русских букв будут символы.
вопросы будут. а так верно
 

drags

Известный
Проверенный
155
207
Отправляешь http запрос(через тот же luasocket можно), сайт возвращает исходный код и ты запускаешь его как поток
Можно подробней для тупых, получил код, есть переменная script, :run() на неё не работает
 

Malkas

Новичок
17
1
Подскажите, как визуально поднять человека на N метров вверх, влево и тд.
Какие пакеты юзать?
 

RTD

Нестандартное звание
Модератор
391
414
Хорошо, но как мне поместить туда код? или прировнять его к функции для выполнения
К функции.

Подскажите, как визуально поднять человека на N метров вверх, влево и тд.
Какие пакеты юзать?
Узнаешь пед игрока, узнаешь его корды, тпшишь добавив к Z координате N значение. Возможно нужно в цикле тпшить. Это теоретически должно работать.

lua - getcharcoordinates | BlastHack — DEV_WIKI(https://blast.hk/wiki/lua:getcharcoordinates)
lua - setcharcoordinates | BlastHack — DEV_WIKI(https://blast.hk/wiki/lua:setcharcoordinates)
 

drags

Известный
Проверенный
155
207
К функции.


Узнаешь пед игрока, узнаешь его корды, тпшишь добавив к Z координате N значение. Возможно нужно в цикле тпшить. Это теоретически должно работать.

lua - getcharcoordinates | BlastHack — DEV_WIKI(https://blast.hk/wiki/lua:getcharcoordinates)
lua - setcharcoordinates | BlastHack — DEV_WIKI(https://blast.hk/wiki/lua:setcharcoordinates)
Я понял что к функции, но как? такая ботва не работает
Код:
function test() return script end
--или вот такая
function test() script end --тут вообще будет ошибка

UPD: Разобрался, приравнивается к функции, но запуская поток скрипт не работает( и в потоке я вызывал функцию mains() (переименовал во избежание конфликта)
 
Последнее редактирование:

f0Re3t

Poh production
Друг
876
808
привет, друзья, надеюсь поможете или подтолкнете на верную мыслю
короче суть вот в чем:
есть начальная точка с координатами - x, y, z
есть конечная точка с координатами - x1, y1, z1
суть задачи - рассчитать массив точек от начальный точки до конечной с шагом, допустим 50

я так понимаю для ее решения нужно узнать расстояние между точками, потом поделить его на шаг, сделать цикл где каждую итерацию отнимать от каждой позиции шаг цикла умноженное на 50 ?
 

BlackKnigga

Известный
BH Team
922
445