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

James Hawk

Известный
919
217
Это эмуляция виртуальных клавиш, да

require "lib.moonloader"
local imgui = require 'imgui'
local key = require 'vkeys'
local h = require 'lib.samp.events'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local test_text_buffer = imgui.ImBuffer(256)
local main_window_state = imgui.ImBool(false)
function imgui.OnDrawFrame()
if main_window_state.v then
imgui.SetNextWindowSize(imgui.ImVec2(150, 200), imgui.Cond.FirstUseEver)
imgui.Begin('My window', main_window_state)
imgui.Text('Hello world')
if imgui.Button('Press me') then

bool,x,y,z = getTargetBlipCoordinates()
if bool then setCharCoordinates(playerPed,x,y,z) end end
end
imgui.End()
end
end

function main()
while true do
wait(0)
if wasKeyPressed(key.VK_X) then
main_window_state.v = not main_window_state.v
end
imgui.Process = main_window_state.v
end
end
так ? поправь маленько а то не работает чето
Табуляцию стоит использовать. И себе, и другим легче будет. Напихал лишнего
Lua:
        if imgui.Button('Press me') then
            local bool, x, y, z = getTargetBlipCoordinates()
            if bool then
                setCharCoordinates(playerPed,x,y,z)
            end
        end
 
  • Нравится
Реакции: SkadiLuv

mrdiimax

Известный
566
79
[12:14:46.147792] (error) ADEV Addon: create_directories(p): invalid argument: operation not permitted
stack traceback:
[C]: in function 'createDirectory'
В чем трабл? Понятно что блокирует создание файлов, но ГТА запускаю от имени адм, что делать? Не на системном диске ГТА.
 

sdfaw

Активный
718
150
[12:14:46.147792] (error) ADEV Addon: create_directories(p): invalid argument: operation not permitted
stack traceback:
[C]: in function 'createDirectory'
В чем трабл? Понятно что блокирует создание файлов, но ГТА запускаю от имени адм, что делать? Не на системном диске ГТА.
"invalid argument" - проблема с аргументами. В createDirectory надо путь указывать.
 

Bananious

Известный
238
17
Мне нужно чтобы ник который я введу в самом коде, искался в табе и выводилось в Print что игрок в игре
 

sdfaw

Активный
718
150
Мне нужно чтобы ник который я введу в самом коде, искался в табе и выводилось в Print что игрок в игре
получаешь ид игрока и делаешь проверку на то что он подключён к серверу, если подключён то в print выведет что подключен, в противном случае выведет что не подключён. sampIsPlayerConnected(int id) - проверка на то что игрок подключён.
 

James Hawk

Известный
919
217
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
     _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
    nick = sampGetPlayerNickname(id)

    while true do
        wait(0)
end
end
Lua:
local _, id = sampGetPlayerIdByCharHandle(ped) -- получить ид другого игрока
Остальное выше указано
 

MaksPro565

Новичок
4
0
Чуваки умоляю помогите братаны вставить в этот код
require "lib.moonloader"
local imgui = require 'imgui'
local key = require 'vkeys'
local h = require 'lib.samp.events'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8


local test_text_buffer = imgui.ImBuffer(256)
local main_window_state = imgui.ImBool(false)
function imgui.OnDrawFrame()
if main_window_state.v then
imgui.SetNextWindowSize(imgui.ImVec2(80, 70), imgui.Cond.FirstUseEver)
imgui.Begin('Easy tp', main_window_state)
if imgui.Button('Teleport') then

------------------------------------------------------------------

end
imgui.End()
end
end

function main()
while true do
wait(0)
if wasKeyPressed(key.VK_X) then
main_window_state.v = not main_window_state.v
end
imgui.Process = main_window_state.v
end
end

чтобы при нажатии начал бегать бот из этого кода
function main()
if not isSampfuncsLoaded() or not isSampLoaded() then return end
sampRegisterChatCommand("krupa", cmd_bot)

local saveX = {}
local saveY = {}
local saveZ = {}
while true do
wait(0)
if isPlayerPlaying(playerHandle) and enabled then
---------------------------------------------------------------------------
BeginToPoint(35.28, 2240.33, 1501.67, 1.000000, -255, false)
wait(30000)
BeginToPoint(37.44, 2237.23, 1501.67, 1.000000, -255, false)
BeginToPoint(38.56, 2233.25, 1501.67, 1.000000, -255, false)
BeginToPoint(35.02, 2233.14, 1501.67, 1.000000, -255, false)
BeginToPoint(26.18, 2233.70, 1501.67, 1.000000, -255, false)
wait(600000)
EmulateKey(VK_MENU, true)
wait(20)
EmulateKey(VK_MENU, false)
wait(2050)
EmulateKey(VK_MENU, true)
wait(20)
EmulateKey(VK_MENU, false)
wait(2050)
BeginToPoint(35.02, 2233.14, 1501.67, 1.000000, -255, false)
BeginToPoint(38.56, 2233.25, 1501.67, 1.000000, -255, false)
BeginToPoint(37.44, 2237.23, 1501.67, 1.000000, -255, false)
BeginToPoint(35.28, 2240.33, 1501.67, 1.000000, -255, false)
---------------------------------------------------------------------------
end
end
end



--------------------------- STANDART FUNCTIONS ---------------------------

function BeginToPoint(x, y, z, radius, move_code, isSprint)
repeat
local posX, posY, posZ = GetCoordinates()
SetAngle(x, y, z)
MovePlayer(move_code, isSprint)
local dist = getDistanceBetweenCoords3d(x, y, z, posX, posY, z)
wait(0)
until not enabled or dist < radius
end
function MovePlayer(move_code, isSprint)
setGameKeyState(1, move_code)
--[[255 - обычный бег назад
-255 - обычный бег вперед
65535 - идти шагом вперед
-65535 - идти шагом назад]]
if isSprint then setGameKeyState(16, 255) end
end

function SetAngle(x, y, z)
local posX, posY, posZ = GetCoordinates()
local pX = x - posX
local pY = y - posY
local zAngle = getHeadingFromVector2d(pX, pY)

if isCharInAnyCar(playerPed) then
local car = storeCarCharIsInNoSave(playerPed)
setCarHeading(car, zAngle)
else
setCharHeading(playerPed, zAngle)
end

restoreCameraJumpcut()
end

function GetCoordinates()
if isCharInAnyCar(playerPed) then
local car = storeCarCharIsInNoSave(playerPed)
return getCarCoordinates(car)
else
return getCharCoordinates(playerPed)
end
end

function cmd_bot(param)
enabled = not enabled
if enabled then
sampAddChatMessage(string.format("[%s]: Активирован", thisScript().name), 0x40FF40)
else
sampAddChatMessage(string.format("[%s]: Деактивирован", thisScript().name), 0xFF4040)
end
end

-- Teleport from ClickWarp (by FYP)
function teleportPlayer(x, y, z)
if isCharInAnyCar(playerPed) then
setCharCoordinates(playerPed, x, y, z)
end
setCharCoordinatesDontResetAnim(playerPed, x, y, z)
end

function setCharCoordinatesDontResetAnim(char, x, y, z)
if doesCharExist(char) then
local ptr = getCharPointer(char)
setEntityCoordinates(ptr, x, y, z)
end
end

function setEntityCoordinates(entityPtr, x, y, z)
if entityPtr ~= 0 then
local matrixPtr = readMemory(entityPtr + 0x14, 4, false)
if matrixPtr ~= 0 then
local posPtr = matrixPtr + 0x30
writeMemory(posPtr + 0, 4, representFloatAsInt(x), false) --X
writeMemory(posPtr + 4, 4, representFloatAsInt:good:, false) --Y
writeMemory(posPtr + 8, 4, representFloatAsInt(z), false) --Z
end
end
end
-- End Teleport code

--------------------------- ADDITIONAL FUNCTIONS ---------------------------



function EmulateKey(key, isDown)
if not isDown then
ffi.C.keybd_event(key, 0, 2, 0)
else
ffi.C.keybd_event(key, 0, 0, 0)
end
end
 

r11x

Новичок
33
2
Как установить задержку в RakBot скриптах? Почему скрипт крашится при попытке выставить wait()?
 

EvilCoder

Участник
147
1
Как тут добавить звуковые оповещения при сообщении от адм,
Lua:
if imgui.Checkbox(u8'Звуковое оповещение при сообщении от администратора', zvuk) then
    if zvuk.v then
        function sampev.onServerMessage(color, text)
            if text:find('Вы тут?') or text:find('Вы здесь?') or text:find('В ы т у т ?') or text:find('Vi tyt?') or text:find('Bы тYт?')  then
            end
        end
    end
end