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

CaJlaT

07.11.2024 14:55
Модератор
2,833
2,670
классный ответ, чисто нихуя не подсказал.
классный ответ, чисто нихуя не подсказал.
Lua:
local samp = require "samp.events"
function samp.onTextDrawSetString(id, text)
    if text:find('Нихуя не подсказал') then
        print('Пиздец трудно поискать, да?')
    end
end
или так

Lua:
local samp = require "samp.events"
function samp.onShowTextDraw(id,data)
    local text = data.text
    if text:find('Нихуя не подсказал') then
        print('Пиздец трудно поискать, да?')
    end
end
 
Последнее редактирование:
  • Нравится
Реакции: Fott

штейн

Известный
Проверенный
1,002
688
Приветствую, помогите пожалуйста с написанием банального кода, который будет браться скриптом (хуком скорее всего) из чата...
Например, в чате такая строка:
[R] Captain Nick_Name (( /mds 123 ))

Мне нужно, чтобы скрипт брал из этой строки только "/mdc 123" (ибо значение "Captain и Nick_Name у каждого своё...)", после чего отправлял это в чат.

В чате выскачит допустим такая шляпа:
Ник: Nick_Name
Розыск: 6
Организация: Ballas Gang

После этого, скрипт должен отправить в чат такие данные:
/rb ID, Розыск: 6, Организация: Ballas Gang

ID - должен браться из первоначальной строки
Розыск из информации из чата, которая получен путём отправки сообщения, организация - аналогично...

Помогите пожалуйста ;3

Написал такой код, но функция выполняет свою работу до половины...
Lua:
local hook = require 'lib.samp.events'
function main()
   
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end

end

function cmd_test(param)
    lua_thread.create(function() -- При использовании WAIT вне потока MAIN
function hook.onServerMessage(color, text)

    if text:find(': (( /mdc (%d+) ))') then
    local id = text:match('/mdc (%d+)')
    wait(1500)
    sampSendChat('/mdc '..id..'')
     end
   
    if text:find('Уровень розыска: (%d+)') or text:find('Организация: (%D+)') then
    --local zvezdy, orga = text:match('Уровень розыска: (%d+)') ('Организация: (%D+)')
    local zvezdy = text:match('Уровень розыска: (%d+)')
    local orga = text:match('Организация: (%D+)')
    wait(1500)
    sampSendChat('/b '..zvezdy..' '..orga..'')
end
end
    end) -- Конец потока WAIT вне MAIN
end

xdZoqlg.png
Lua:
local hook = require 'lib.samp.events'

function hook.onServerMessage(color, text)
    if text:find('%[R%] %a+ %a+_%a+ %(%( /mdc %d+ %)%)') then
        local cmd = text:match('%[R%] %a+ %a+_%a+ %(%( (/mdc %d+) %)%)')
        if cmd then
            sampSendChat(cmd)
        end
    end
    if text:find('Уровень розыска: %d+') or text:find('Организация: %d+') then
        local zvezdy = text:match('Уровень розыска: (%d+)')
        local orga = text:match('Организация: (%d+)')
        if zvezdy or orga then
            sampSendChat('/b '..(zvezdy == nil and '' or zvezdy)..' '..(orga == nil and '' or orga))
        end
    end
end
Как копировать определенное сообщение от игрока на сервере в буфер обмена ?
Lua:
local sampev = require 'lib.samp.events'

local nickname = 'Nick_Name'

function sampev.onServerMessage(color, text)
    if text:find(nickname) then
        setClipboardText(text)
    end
end
 

Eugene Crabs

Активный
544
30
Как сделать чтобы скрипт нажимал на вот этот текст (Взять в руки)? если ид текстдрава все время меняется

Посмотреть вложение 58219
Короч смотри. Вот тот ID (2076), который ты скинул - скорее всего ID текста. Где-то рядом с ним должен быть ID того фона, на который тебе нужно нажать. Поищи его и узнай объект, которым он является. После этого находишь его циклом по всем текстдравам и нажимаешь на него функцией.
 

Timur_Januar

Новичок
12
0
Помогите пожалуйста пишу уже 2-ой раз никто не отвечает, ниже прикрепил скрин, кто знает код что бы писать ниже, то есть не в правую сторону, а именно вниз отступить сроку и начать писать следующие подсказки?Дайте код пожалуйста
И ещё,кто знает код для отмены отыгровки на букву?
2.png
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,771
5,377
как получить цвет ChatBubble?
приходит в rpc
Помогите пожалуйста пишу уже 2-ой раз никто не отвечает, ниже прикрепил скрин, кто знает код что бы писать ниже, то есть не в правую сторону, а именно вниз отступить сроку и начать писать следующие подсказки?Дайте код пожалуйста
И ещё,кто знает код для отмены отыгровки на букву?Посмотреть вложение 58247
imgui.NewLine()
 
  • Нравится
Реакции: user31883

Vespan

Чешский луашер
Проверенный
2,119
1,720
Lua:
local dlstatus = require('moonloader').download_status
update_state = false

local ini_url = "https://raw.githubusercontent.com/Vespan/autologinGoldRp/master/AL.ini"

local script_url = "https://raw.githubusercontent.com/Vespan/autologinGoldRp/master/11.txt"
local script_direct = thisScript().patch
        
        -- while true do
            if update_state then
        downloadUrlToFile(script_url, script_direct, function(id, status)
               if status == dlstatus.STATUS_ENDDOWNLOADDATA then
                   lua_thread.create(function()
                   sampAddChatMessage('Обновление загружено!', -1)
                   update_state = false
                   imgui.ShowCursor = false
                   wait(1500)
                   thisScript():reload()
                   end)
               end
    end)
        break
    end
        -- imgui
        if imgui.Button(u8'Проверить Обновление') then
               downloadUrlToFile(ini_url, getWorkingDirectory() .. '/lib/AL.ini', function(id, status)
                   if status == dlstatus.STATUS_ENDDOWNLOADDATA then
                       if tonumber(IniS.Version) > script_version then
                           sampAddChatMessage('Есть обновлени! Загружаю...', -1)
                           update_state = true
                       else
                           sampAddChatMessage('Обновлений не обнаружено!', -1)
                       end
                end
        end)
    end
Почему не скачиваеться .txt файл? (я выбрал .txt для теста). Скачиваеться .ini файл,заменяеться но .txt не скачиваеться (заместь .txt будет .lua).
 

Setkh

Участник
74
6
Как убрать этот текст, появляющийся после ввода команды?
gm.png


Даже таким методом он не исчезает.
Это вообще текстдрав?
Lua:
for i = 0, 10000 do
    sampTextdrawDelete(i)
end
 

Alkamal

Новичок
23
2
Можно ли на ArizonaRP создать 3dText, вчера пробовал на получалось, хотя когда запускал localhost, то там создавался
 

Vespan

Чешский луашер
Проверенный
2,119
1,720
Как сделать что бы через функцию выбирался пункт и нажимался ENTER в dialog меню?
 

NetyEgo

Участник
164
10
как называется функция? типо textinput и там квадратик или т.д и ты его можешь передвигать
 
Последнее редактирование: