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

cheremuxa

Известный
430
200
Как называются такие цвета? 0xFFFFC700
И еще, как из выше цветов достать красный цвет, синий цвет, скиньте плз

sriptTerminated
1. цвета из памяти, проще так
2. эти цвета тупо как обычный HEX только 0xFF в начале, красный цвет #ff0000 - значит пишем 0xFFFF0000
 

vadimka

Известный
176
42
Как детектить машину рядом? например кловер в 0.11м от меня как его задетектить?
 

vadimka

Известный
176
42
Как перезапустить скрипт который крашнулся через код?
 

Chiba

Известный
25
1
как можно сделать фикс двойного нажатия клавиши? например, нажал я энтер, и чтобы в течение 0.5 сек еще одно нажатие энтера не воспринималось?
 

andrey_hacker

Известный
274
88
Код:
function sampev.onServerMessage(color, text)
    if text:find('Состояние счета: $%d+, Состояния депозита: $%d+') then
        dengi = string:match('Состояние счета: $(%d+), состояние депозита: $%d+')
        sampAddChatMessage('вот  ' ..dengi)
    end
end
почему не работает ?
 

Firus20016

Участник
148
15
Привет всем. Пожалуйста, подскажите как определять в зоне стрима только ид водителя авто. На данный момент я могу определить всех игроков в машине.(
 

astynk

Известный
Проверенный
742
530
как можно сделать фикс двойного нажатия клавиши? например, нажал я энтер, и чтобы в течение 0.5 сек еще одно нажатие энтера не воспринималось?
Lua:
require 'moonloader'
local ts = 0

-- ...

if wasKeyPressed(VK_ENTER) and os.clock() - ts > 0.5 then
    ts = os.clock()
    -- код для выполнения по нажатию Enter
end
 

F0RQU1N and

Известный
1,311
495
Учись пользоваться поиском..

Функция downloadurltofile Если тебе нужно именно скачивать файл из интернета в директорию..
Если просто подгрузить аудио-поток из интернета - URL потока вместо пути к файлу в loadAudioStream
пользоватся поиском я умею, я еще около месяца 4 назад пытался юзать довнловадурлтофиле и оно просто не скачивалось.
Как получить ид машины чужого человека?
на первой странице есть
Lua:
local veh = storeCarCharIsInNoSave(PLAYER_PED)
 
Последнее редактирование:

Andrinall

Известный
680
532
пользоватся поиском я умею, я еще около месяца 4 назад пытался юзать довнловадурлтофиле и оно просто не скачивалось.

Видимо, ты что-то не так сделал. Сделал точно по примеру в DEV WIKI и всё отлично работает.
Screenshot_1.png

Screenshot_2.png

Screenshot_3.png


Lua:
local dlstatus = require('moonloader').download_status
local vk = require 'vkeys'

function download_handler(id, status, p1, p2)
    if stop_downloading then
        stop_downloading = false
        download_id = nil
        print('Загрузка отменена.')
        return false -- прервать загрузку
    end
    if status == dlstatus.STATUS_DOWNLOADINGDATA then
        print(string.format('Загружено %d из %d.', p1, p2))
    elseif status == dlstatus.STATUS_ENDDOWNLOADDATA then
        print('Загрузка завершена.')
    end
end

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    
    print('Нажмите F1, чтобы начать загрузку файла.')
    while true do
        if wasKeyPressed(vk.VK_F1) and not download_id then
            local url = 'https://cdn.discordapp.com/attachments/480383124488978452/681913416285159425/20200131205013_1.jpg'
            local file_path = getWorkingDirectory() .. '/RPCL/1_1.jpg'
            download_id = downloadUrlToFile(url, file_path, download_handler)
            print('Загрузка начата. Нажмите F2, чтобы отменить её.')
            
        elseif wasKeyPressed(vk.VK_F2) and download_id then
            stop_downloading = true
        end
    end
end
 

F0RQU1N and

Известный
1,311
495
Видимо, ты что-то не так сделал. Сделал точно по примеру в DEV WIKI и всё отлично работает.


Lua:
local dlstatus = require('moonloader').download_status
local vk = require 'vkeys'

function download_handler(id, status, p1, p2)
    if stop_downloading then
        stop_downloading = false
        download_id = nil
        print('Загрузка отменена.')
        return false -- прервать загрузку
    end
    if status == dlstatus.STATUS_DOWNLOADINGDATA then
        print(string.format('Загружено %d из %d.', p1, p2))
    elseif status == dlstatus.STATUS_ENDDOWNLOADDATA then
        print('Загрузка завершена.')
    end
end

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
   
    print('Нажмите F1, чтобы начать загрузку файла.')
    while true do
        if wasKeyPressed(vk.VK_F1) and not download_id then
            local url = 'https://cdn.discordapp.com/attachments/480383124488978452/681913416285159425/20200131205013_1.jpg'
            local file_path = getWorkingDirectory() .. '/RPCL/1_1.jpg'
            download_id = downloadUrlToFile(url, file_path, download_handler)
            print('Загрузка начата. Нажмите F2, чтобы отменить её.')
           
        elseif wasKeyPressed(vk.VK_F2) and download_id then
            stop_downloading = true
        end
    end
end
крашит)