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

Perg

Активный
227
32
как сделать,чтобы скрипт писал сообщение о активация только после захода на сервер? допустим скрипты блэк джизуса пишутся после захода в игру сразу,а скрипты дапо когда зашел на сервер
 

Rei

Известный
Друг
1,616
1,676
как сделать,чтобы скрипт писал сообщение о активация только после захода на сервер? допустим скрипты блэк джизуса пишутся после захода в игру сразу,а скрипты дапо когда зашел на сервер
Хук сообщений в чате, rpc
 

neverlane

t.me/neverlane00
Друг
1,010
1,161
как сделать,чтобы скрипт писал сообщение о активация только после захода на сервер? допустим скрипты блэк джизуса пишутся после захода в игру сразу,а скрипты дапо когда зашел на сервер
Lua:
function main()
   while not isSampAvailable() do wait(0) end
   while not sampIsLocalPlayerSpawned() do wait(0) end -- ждемс пока перс не заспавнится
   --code
   sampAddChatMessage('script loaded',-1)
   wait(-1)
end
 
  • Нравится
Реакции: Perg

enyag

Известный
345
12
как сделать,чтобы скрипт писал сообщение о активация только после захода на сервер? допустим скрипты блэк джизуса пишутся после захода в игру сразу,а скрипты дапо когда зашел на сервер

Lua:
function main()
    while true do
    wait(0)
        if isPlayerPlaying(playerHandle) and rr then
            sampAddChatMessage('vrode tak', -1)
        end
    end
end

😜
 

donaks.

Активный
101
68
Активируется после открытия диалога, а мне нужно что-бы активировалось после нажатия на нужный list

Lua:
      local res, button, list, input = sampHasDialogRespond(9898)
      if res then
        if list == 0 then
          local _, idp = sampGetPlayerIdByCharHandle(PLAYER_PED)
          nick_usr = sampGetPlayerNickname(iid)
          nick_plaeyr = sampGetPlayerNickname(idp)
          hello(nick_plaeyr, nick_usr, idp)
        end
        if list == 1 then
        end
        if list == 2 then
        end
      end
Вместо if res вставь if list == 0 и пиши код. Но он у тебя сразу активируется, так как сразу выделяется нулевой id списка.
 

Biuti

Участник
165
8
Как это код
Lua:
local sampev = require "lib.samp.events"
local keys = require "vkeys"

require "lib.moonloader"
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('{FF0000}Автор скрипта: {FF1493}Pink')
    sampAddChatMessage('{FF1493}[Pink]:{FF0000}Группа в вк',-1)
    sampRegisterChatCommand('graf', graf)
    while true do
        wait(0)
        if graf_act then
            if sampTextdrawIsExists(2184) then
                setVirtualKeyDown(0x26, true)
                wait(1000)
                setVirtualKeyDown(0x26, false)
            end

            if sampTextdrawIsExists(2185) then
                setVirtualKeyDown(0x28, true)
                wait(1000)
                setVirtualKeyDown(0x28, false)
            end

            if sampTextdrawIsExists(2186) then
                setVirtualKeyDown(0x25, true)
                wait(1000)
                setVirtualKeyDown(0x25, false)
            end

            if sampTextdrawIsExists(2187) then
                setVirtualKeyDown(0x27, true)
                wait(1000)
                setVirtualKeyDown(0x27, false)
            end
        end
    end

end

function graf(arg)
    graf_act = not graf_act
   sampAddChatMessage(graf_act and '{FF1493}[Pink]:{FFFFFF}Бот {00FF00}включен' or '{FF1493}[Pink]:{FFFFFF}Бот {FF0000}выключен', -1)
end
совместить с этой функцией?
Lua:
unction hook.onShowTextDraw(2194,data)
    if act then
        if data.color == "FFFFFF" then
        end
    end
end
 

pheal

Участник
70
8
еще один глупый вопрос, как сделать что бы было так
123:
if imgui.Button(u8'ЕФК 1.1 | Нападение на гражданское лицо. 3 зв.') and zaprosR.v then
    thread:run('tr1')
else
    sampSendChat('/su '..id_purs)
    id_purs = -1
end
zaprosR.v работал. Стоит галочка - не стоит, скрипт пишет /su, а мне нужно что бы было так.
Если галка стоит - thread:run('tr1')
Не стоит - sampSendChat('/su'..id_purs
А он при любом случае выполняет else
 

CaJlaT

07.11.2024 14:55
Модератор
2,840
2,673
еще один глупый вопрос, как сделать что бы было так
123:
if imgui.Button(u8'ЕФК 1.1 | Нападение на гражданское лицо. 3 зв.') and zaprosR.v then
    thread:run('tr1')
else
    sampSendChat('/su '..id_purs)
    id_purs = -1
end
zaprosR.v работал. Стоит галочка - не стоит, скрипт пишет /su, а мне нужно что бы было так.
Если галка стоит - thread:run('tr1')
Не стоит - sampSendChat('/su'..id_purs
А он при любом случае выполняет else
Lua:
if imgui.Button(u8'ЕФК 1.1 | Нападение на гражданское лицо. 3 зв.') then
    if zaprosR.v then
        thread:run('tr1')
    else
        sampSendChat('/su '..id_purs)
        id_purs = -1
    end
end
 
  • Грустно
Реакции: neverlane

neverlane

t.me/neverlane00
Друг
1,010
1,161
еще один глупый вопрос, как сделать что бы было так
123:
if imgui.Button(u8'ЕФК 1.1 | Нападение на гражданское лицо. 3 зв.') and zaprosR.v then
    thread:run('tr1')
else
    sampSendChat('/su '..id_purs)
    id_purs = -1
end
zaprosR.v работал. Стоит галочка - не стоит, скрипт пишет /su, а мне нужно что бы было так.
Если галка стоит - thread:run('tr1')
Не стоит - sampSendChat('/su'..id_purs
А он при любом случае выполняет else
Lua:
if imgui.Button(u8'ЕФК 1.1 | Нападение на гражданское лицо. 3 зв.') then
    if zaprosR.v then
        thread:run('tr1')
    else
        sampSendChat('/su '..id_purs)
        id_purs = -1
    end
end
 
  • Ха-ха
Реакции: CaJlaT

pheal

Участник
70
8
+ что бы после сохранения inputText русские символы выводились нормально.