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

FYP

Известный
Автор темы
Администратор
1,758
5,725
Как правильно обрабатывать RPC? Пытаюсь сделать чат-логер, ничего не получается =\
Код:
function onReceiveRpc(id, bs)
  if id == RPC_SCRCLIENTMESSAGE
  then
value1 = raknetBitStreamReadString(bs, 128)

    text = string.format("%i:%s", id, value1)
message()
  end
end

function main()
...
чтобы правильно обработать входящий/исходящий пакет/рпц, нужно знать его структуру. у тебя битстрим читается не в соответствии со структурой этого рпц. кроме этого, код вывода сообщения нелогичен.
вот верный код
Lua:
function onReceiveRpc(id, bs)
  if id == RPC_SCRCLIENTMESSAGE
  then
   local color = raknetBitStreamReadInt32(bs)
   local len = raknetBitStreamReadInt32(bs)
   local text = raknetBitStreamReadString(bs, len)
   print(string.format("%d:%s", id, text))
  end
end

function main()
...
 

ShadowBroker

Известный
110
27
Слушай, а прикольная тема) Попробовал запилить скриптец реагирующий на текст в чате - получилось) Далеко не с первого раза конечно, пришлось репу почесать, но все же получилось :)
---------
Как найти игрока по нику? Пытаюсь вот таким способом - не получается
Lua:
script_name("id")

function main()
local id
    while true do
    wait(0)
        if isKeyDown(36) then
            for id = 0, 999 do
            local result = sampIsPlayerConnected(id) then
                if result then
                local nick = sampGetPlayerNickname(result)
                    if nick == "Nick" then
                    sampAddChatMessage("Found!", 0xffffff)
                    end
                end
            end
        end
    end
end
 
Последнее редактирование:

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,338
Слушай, а прикольная тема) Попробовал запилить скриптец реагирующий на текст в чате - получилось) Далеко не с первого раза конечно, пришлось репу почесать, но все же получилось :)
---------
Как найти игрока по нику? Пытаюсь вот таким способом - не получается
Lua:
script_name("id")

function main()
local id
    while true do
    wait(0)
        if isKeyDown(36) then
            for id = 0, 999 do
            local result = sampIsPlayerConnected(id) then
                if result then
                local nick = sampGetPlayerNickname(result)
                    if nick == "Nick" then
                    sampAddChatMessage("Found!", 0xffffff)
                    end
                end
            end
        end
    end
end
Во первых: в
Код:
nick = sampGetPlayerNickname(result)
нужно указывать ид игрока.
Во вторых: в строке
Код:
local result = sampIsPlayerConnected(id) then
then не нужна.
Все остальное правильно.
 
  • Нравится
Реакции: ShadowBroker

applethecandy

Now it's PHP time
Проверенный
253
328
Код:
function main()
  while not isSampfuncsLoaded() do
    wait(1000)
  end
    while true do
        wait(20)
        if isPlayerPlaying(playerHandle) then
            if isKeyCheckAvailable() and isKeyDown(VK_F) and isKeyDown(VK_RBUTTON) then
                if isCurrentCharWeapon(playerChar, 24) then
                    sendChat("test")
                                        wait(800)
                end
            end
        end
    end
end
Выдает ошибку: Warning(s007): Exception 0xC0000005 at 0x48AAEA
 

RedBoxWhite

Известный
337
27
Код:
function main()
  while not isSampfuncsLoaded() do
    wait(1000)
  end
    while true do
        wait(20)
        if isPlayerPlaying(playerHandle) then
            if isKeyCheckAvailable() and isKeyDown(VK_F) and isKeyDown(VK_RBUTTON) then
                if isCurrentCharWeapon(playerChar, 24) then
                    sendChat("test")
                                        wait(800)
                end
            end
        end
    end
end
Выдает ошибку: Warning(s007): Exception 0xC0000005 at 0x48AAEA
sampSendChat
 

FYP

Известный
Автор темы
Администратор
1,758
5,725
callFunction(0x69F0B0, 4, 4, 0, 0, 3000, "Hellow World")
ужас.
printStringNow("text", 1000)
Код:
function main()
  while not isSampfuncsLoaded() do
    wait(1000)
  end
    while true do
        wait(20)
        if isPlayerPlaying(playerHandle) then
            if isKeyCheckAvailable() and isKeyDown(VK_F) and isKeyDown(VK_RBUTTON) then
                if isCurrentCharWeapon(playerChar, 24) then
                    sendChat("test")
                                        wait(800)
                end
            end
        end
    end
end
Выдает ошибку: Warning(s007): Exception 0xC0000005 at 0x48AAEA
давай код целиком. тут ошибок не видно.
 
  • Нравится
Реакции: RedBoxWhite и san0

CAPTA!N

Новичок
220
49
sampAddChatMessage(string.format("%f %f %f", LPCamX, LPCamY, LPCamZ))
Примерно так, я точно не помню, с тела проблематично посмотреть

При вводе команды включается поток, который ты задал в опкоде.

function main()
if not isSampfuncsLoaded() or not isSampLoaded() then return end
sampRegisterChatCommand("mycmd", cmd)

while true do wait(0) end
end

function cmd(param)
body
end
 
Последнее редактирование:

zwhoz

Известный
106
11
Почему при нажатии клавиши не включается анимация?

Lua:
function main()
  while true do
    wait(0)
    if isKeyDown(50) then
      task = openSequenceTask()
      taskPlayAnim(-1, "ROADCROSS", "PED", 4.0, 0, 0, 0, 0, -1)
      closeSequenceTask(task)
      performSequenceTask(playerPed, task)
      clearSequenceTask(task)
    end
  end
end
 

FYP

Известный
Автор темы
Администратор
1,758
5,725
Почему при нажатии клавиши не включается анимация?

Lua:
function main()
  while true do
    wait(0)
    if isKeyDown(50) then
      task = openSequenceTask()
      taskPlayAnim(-1, "ROADCROSS", "PED", 4.0, 0, 0, 0, 0, -1)
      closeSequenceTask(task)
      performSequenceTask(playerPed, task)
      clearSequenceTask(task)
    end
  end
end
первым аргументом taskPlayAnim нужно передать хендл педа (playerPed).
openSequenceTask, closeSequenceTask и т.д. вроде как не нужны.

--- UPD
проверил taskPlayAnim - там один из аргументов имеет неверный тип, поэтому опкод может не работать. в следующем обновлении исправлю.
 
  • Нравится
Реакции: zwhoz

CAPTA!N

Новичок
220
49
Уверен что я где то туплю. Помогите слепцу, пожалуйста.
Lua:
function main()
    speed = 140.0
    while true do
     wait(0)
        if isKeyDown(87) and isKeyJustPressed(88) and isCharInAnyCar(playerPed) then
            printStringNow("ON", 3000)
            car = storeCarCharIsInNoSave(playerPed)
            setCarProofs(car, 1, 1, 1, 1, 1)
            camX, camY, camZ = getActiveCameraCoordinates()
            pcamX, pcamY, pcamZ = getActiveCameraPointAt()
            resX = pcamX - camX
            resY = pcamY - camY
            angleZ = getHeadingFromVector2d(pcamX, pcamY)
            setCarHeading(car, angleZ)
        else return end
        if isKeyDown(87) then
            setCarForwardSpeed(car, speed)
        end
        if isKeyDown(32) then
            posX, posY, posZ = getCharCoordinates(playerPed)
            posZ = posZ + 0.5
            setCharCoordinates(playerPed, posX, posY, posZ)
        end
        if isKeyDown(107) then
            speed = speed + 10.0
             wait(100)
        end
        if isKeyDown(109) then
            speed = speed - 10.0
             wait(100)
        end
        if isKeyDown(16) then
            setCarForwardSpeed(car, 0.0)
        end
         wait(100)
        if isKeyDown(87) and isKeyJustPressed(88) and not isCharInAnyCar(playerPed) then
            printStringNow("OFF", 3000)
            setCarForwardSpeed(car, 0.0)
            setCarProofs(car, 0, 0, 0, 0, 0)
        end
    end
end
 

hnnssy

Известный
Друг
2,684
2,748
Уверен что я где то туплю. Помогите слепцу, пожалуйста.
Lua:
function main()
    speed = 140.0
    while true do
     wait(0)
        if isKeyDown(87) and isKeyJustPressed(88) and isCharInAnyCar(playerPed) then
            printStringNow("ON", 3000)
            car = storeCarCharIsInNoSave(playerPed)
            setCarProofs(car, 1, 1, 1, 1, 1)
            camX, camY, camZ = getActiveCameraCoordinates()
            pcamX, pcamY, pcamZ = getActiveCameraPointAt()
            resX = pcamX - camX
            resY = pcamY - camY
            angleZ = getHeadingFromVector2d(pcamX, pcamY)
            setCarHeading(car, angleZ)
        else return end
        if isKeyDown(87) then
            setCarForwardSpeed(car, speed)
        end
        if isKeyDown(32) then
            posX, posY, posZ = getCharCoordinates(playerPed)
            posZ = posZ + 0.5
            setCharCoordinates(playerPed, posX, posY, posZ)
        end
        if isKeyDown(107) then
            speed = speed + 10.0
             wait(100)
        end
        if isKeyDown(109) then
            speed = speed - 10.0
             wait(100)
        end
        if isKeyDown(16) then
            setCarForwardSpeed(car, 0.0)
        end
         wait(100)
        if isKeyDown(87) and isKeyJustPressed(88) and not isCharInAnyCar(playerPed) then
            printStringNow("OFF", 3000)
            setCarForwardSpeed(car, 0.0)
            setCarProofs(car, 0, 0, 0, 0, 0)
        end
    end
end
написал бы хоть какая проблема возникла
 

Garrus

Известный
159
20
Почему-то не могу создать DXUT диалог, просто ничего не происходит. СФ стоит.