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

MR_Lua

Участник
41
0
Вопросик. Мне нужно чтобы можно было выбрать и R и Q, а то не могу додуматься. Только на R работает, а как реализовать обеклавиши?
Lua:
sampAddChatMessage('{2ce30b}[MafiaTools]: Если человек подходит, то ножмите R', 23412)
    wait(800)
    sampAddChatMessage('{f50000}[MafiaTools]: Если человек не подходит, нажмите Q', 23412)
while not wasKeyPressed(key.VK_R)
do wait(0) end
sampSendChat("Отлично!")
 

CaJlaT

Овощ
Модератор
2,808
2,609
Вопросик. Мне нужно чтобы можно было выбрать и R и Q, а то не могу додуматься. Только на R работает, а как реализовать обеклавиши?
Lua:
sampAddChatMessage('{2ce30b}[MafiaTools]: Если человек подходит, то ножмите R', 23412)
    wait(800)
    sampAddChatMessage('{f50000}[MafiaTools]: Если человек не подходит, нажмите Q', 23412)
while not wasKeyPressed(key.VK_R)
do wait(0) end
sampSendChat("Отлично!")
Lua:
while not wasKeyPressed(key.VK_R) or not wasKeyPressed(key.VK_Q) do wait(0) end
if wasKeyPressed(key.VK_R) then sampAddChatMessage('Вы нажали R.', -1)
elseif wasKeyPressed(key.VK_Q) then sampAddChatMessage('Вы нажали Q.', -1) end
 

DobrayaPchela

Участник
79
8
Саунд работает только один раз. I need help
Lua:
local as = {
  STOP   = 0,
  PLAY   = 1,
  PAUSE  = 2,
  RESUME = 3
}

local vol = 10.0
timer = os.clock()

function main()
  while not isSampAvailable() do wait(0) end
  while not isPlayerPlaying(PLAYER_HANDLE) do wait(0) end
  local sound = loadAudioStream(getWorkingDirectory()..'\\resource\\audio\\fist.mp3')
  wait(3000)
  setAudioStreamState(sound, as.PLAY)
  setAudioStreamVolume(sound, vol)
  while true do wait(0)
    wp = getCurrentCharWeapon(PLAYER_PED)
    if wp == 0 then
      if getAudioStreamState(sound) ~= 1 then setAudioStreamState(sound, as.PLAY) end
      setAudioStreamVolume(sound, 10.0)
      vol = os.clock() + 5
    else
      q = vol - os.clock()
      if q > 0 then
        setAudioStreamVolume(sound, q * 2)
      else
        setAudioStreamState(sound, as.STOP)
      end
    end
  end
end
 

MR_Lua

Участник
41
0
Lua:
while not wasKeyPressed(key.VK_R) or not wasKeyPressed(key.VK_Q) do wait(0) end
if wasKeyPressed(key.VK_R) then sampAddChatMessage('Вы нажали R.', -1)
elseif wasKeyPressed(key.VK_Q) then sampAddChatMessage('Вы нажали Q.', -1) end
Немного не так. Нужно , если нажал R - то пошел один диалог, а если нажал Q - то другой. К тому же, по отдельности не нажимаются, а лишь совместно Q + R
Возможно ли как то узнать ID определенного пикапа / маркера?
 
Последнее редактирование:

CaJlaT

Овощ
Модератор
2,808
2,609
Немного не так. Нужно , если нажал R - то пошел один диалог, а если нажал Q - то другой. К тому же, по отдельности не нажимаются, а лишь совместно Q + R
Возможно ли как то узнать ID определенного пикапа / маркера?
Lua:
local key = require 'vkeys'
function main()
    if not isSampLoaded() and not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('test', function()
        lua_thread.create(function()
            sampAddChatMessage('Нажмите Q или R', -1)
            while not wasKeyPressed(key.VK_R) and not wasKeyPressed(key.VK_Q) do wait(0) end
            if wasKeyPressed(key.VK_R) then
                sampShowDialog(math.random(5000, 28000), 'Test', 'Вы нажали {ff0000}R', 'Ок', _, 1)
            elseif wasKeyPressed(key.VK_Q) then
                sampShowDialog(math.random(5000, 28000), "Test", 'Вы нажали {ff0000}Q', "Назад", _, 1)
            end
        end)
    end)
    while true do
        wait(0)
    end
end
 

Вложения

  • zdarova.lua
    686 байт · Просмотры: 2

MR_Lua

Участник
41
0
Киньте скрипт, с помощью которого можно определить ID пикапа?
 

MaksQ

Известный
967
817
как взять в зоне стрима ид кара не ближайшего а рандомного?
 

G W

Участник
141
5
Как получить id игрока за которым я захожу в рекон ?


Lua:
require "moonloader"

local samp = require 'lib.samp.events'

local test = imgui.ImBool(false)

function main()

    if not isSampLoaded() or not isSampfuncsLoaded() then return end

    while not isSampAvailable() do wait(2000) end

 

    while true do

        imgui.Process = test.v

    wait(0)

    end

end

function imgui.OnDrawFrame()
    if test.v then
        style()
        imgui.SetNextWindowSize(imgui.ImVec2(470, 170), imgui.Cond.FirstUseEver)
        imgui.ShowCursor = true
        imgui.SetNextWindowPos(imgui.ImVec2((sw / 2), sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.Begin(fa.ICON_ALIGN_LEFT .. u8" Просто", test, imgui.WindowFlags.NoMove)

                if imgui.Button("Забанить за аим", imgui.ImVec2(454, 25)) then

                    sampSendChat("/ban " .. testid .. " 228 TEST")

                end

          imgui.End()
    end

function samp.onTogglePlayerSpectating(state)
    test.v = state
end
 

arcanum1

Новичок
17
9
Как получить id игрока за которым я захожу в рекон ?


Lua:
require "moonloader"

local samp = require 'lib.samp.events'

local test = imgui.ImBool(false)

function main()

    if not isSampLoaded() or not isSampfuncsLoaded() then return end

    while not isSampAvailable() do wait(2000) end



    while true do

        imgui.Process = test.v

    wait(0)

    end

end

function imgui.OnDrawFrame()
    if test.v then
        style()
        imgui.SetNextWindowSize(imgui.ImVec2(470, 170), imgui.Cond.FirstUseEver)
        imgui.ShowCursor = true
        imgui.SetNextWindowPos(imgui.ImVec2((sw / 2), sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.Begin(fa.ICON_ALIGN_LEFT .. u8" Просто", test, imgui.WindowFlags.NoMove)

                if imgui.Button("Забанить за аим", imgui.ImVec2(454, 25)) then

                    sampSendChat("/ban " .. testid .. " 228 TEST")

                end

          imgui.End()
    end

function samp.onTogglePlayerSpectating(state)
    test.v = state
end
Где-то точно отображается (в каком нибудь текстдраве) айди игрока, берешь айдишник этого текстдрава, потом через sampTextdrawGetString(ID TEXTDRAWA) получаешь это значение и это есть ид игрока
 

Vritz

Новичок
13
0
Привет ребят, надеюсь кто-то поможет, ввожу функцию planeGotoCoords, ну тип что бы самолет летел в указанные координаты,
и не понимаю planeGotoCoords(int plane(ЧТО ТУТ ВВОДИТЬ)),float X,float Y,float Z,float z1,float z2), не понимаю что вводить в int plane, сначала
думал что это id самолета) Ну скрипт начал выдавать ошибку)) Луа учу только 2-3 недели)

В float X,float Y,float Z вводил координаты куда мне нужно чтобы самолет летел.

Да и мб кто-то объяснит что это такое float z1,float z2, тип зачем они?

-За любую помощь буду признателен!)
 

CaJlaT

Овощ
Модератор
2,808
2,609
Как получить id игрока за которым я захожу в рекон ?


Lua:
require "moonloader"

local samp = require 'lib.samp.events'

local test = imgui.ImBool(false)

function main()

    if not isSampLoaded() or not isSampfuncsLoaded() then return end

    while not isSampAvailable() do wait(2000) end



    while true do

        imgui.Process = test.v

    wait(0)

    end

end

function imgui.OnDrawFrame()
    if test.v then
        style()
        imgui.SetNextWindowSize(imgui.ImVec2(470, 170), imgui.Cond.FirstUseEver)
        imgui.ShowCursor = true
        imgui.SetNextWindowPos(imgui.ImVec2((sw / 2), sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.Begin(fa.ICON_ALIGN_LEFT .. u8" Просто", test, imgui.WindowFlags.NoMove)

                if imgui.Button("Забанить за аим", imgui.ImVec2(454, 25)) then

                    sampSendChat("/ban " .. testid .. " 228 TEST")

                end

          imgui.End()
    end

function samp.onTogglePlayerSpectating(state)
    test.v = state
end
Lua:
local specid = nil
local spec = false
function samp.onTogglePlayerSpectating(state)
    spec = state
    if not spec then plid = nil end
end
function samp.onSpectatePlayer(playerid, camtype)
    specid = playerid
end


--беск.цикл
if testCheat('GG') then
    if spec then
        if specid == nil then
            sampAddChatMessage('Произошла ошибка', -1)
        else
            sampAddChatMessage('Вы следите за: '..sampGetPlayerNickname(specid)..'['..tostring(specid)..'].', -1)
        end
    else
        sampAddChatMessage('Вы не в слежке', -1)
    end
end
 

Vespan

loneliness
Проверенный
2,104
1,635
Как сделать,что бы imgui окно появлялось только снизу-по центру
 

CaJlaT

Овощ
Модератор
2,808
2,609
Как сделать,что бы imgui окно появлялось только снизу-по центру
Lua:
local imgui = require 'imgui'
local main_window = imgui.ImBool(false)
function main()
    if not isSampLoaded() and not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('test', function()
        main_window.v = not main_window.v
    end)
    while true do
        wait(0)
        imgui.Process = main_window.v
    end
end
function imgui.OnDrawFrame()
    ScreenX, ScreenY = getScreenResolution()
    imgui.SetNextWindowSize(imgui.ImVec2(160, 60))
    imgui.SetNextWindowPos(imgui.ImVec2(ScreenX / 2, ScreenY / 1.1), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin("Imgui", main_window, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoMove)
    imgui.Text('Hello')
    imgui.End()
end
sa-mp-429.png
 
  • Нравится
Реакции: Vespan

MaksQ

Известный
967
817
как взять в зоне стрима ид кара не ближайшего а рандомного?