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

Patrickkk

Участник
162
19
Мне не важен процесс рыбалки, мне нужен именно процесс написания такого бота) Спасибо
Попробуй декомпилировать скрипт его, т.к. он на luac, редачить его конечно врятли сможешь, но понять суть и работу попробуй) Есть ли декриптор Luac файлов?(https://blast.hk/threads/17363/)
 
У

Удалённый пользователь 147808

Гость

AnWu

Известный
Всефорумный модератор
4,777
5,402
Lua:
if distance <= 5.0 then
    if model == 265 or model == 266 or model == 267
        or model == 281 or model == 282 or model == 283
        or model == 284 or model == 285 or model == 286 then
            sampAddChatMessage(distance, -1)
    end
end
Хватит блять делать громадные условия. А если скинов 50?
Lua:
local skins = {[265] = true, [266] = true, [267] = true}
if skins[model] ~= nil then
-- E boy
end
 
  • Нравится
Реакции: deddosouru и RTD

AnWu

Известный
Всефорумный модератор
4,777
5,402
Функции которые в MoonLoader позволяют работать с INI файлами стали не удобными, чем в CLEO. Библиотека inicfg, зачем ее ввели, почему не могли опкоды взять они мне больше помогают, чем какие то таблицы в луа. Если так уж принято, то объясните мне как добавить новую секцию в INI файл при этом полностью его не перезаписав?

Lua:
script_name('InI')
script_author('Chel555')
require "lib.moonloader"
require "lib.vkeys"
local inicfg = require "inicfg"

--- Main
function main()
  while true do
    wait(0)
  
    if isKeyDown(VK_L) then
  

        data = {
            main = {
                name = "TEXT",
                num = 228
            }
      
        }
      
        inicfg.save(data, "../file_test")

        data = {
            new = {
                name = "NEW_TEXT",
                num = 1337
            }
      
        }

        inicfg.save(data, "../file_test")      

  
    end
  

  end
end

Мне надо чтобы в файл file_test.ini добавилась всего лишь новая секция new и старую main не удалила, объясните как это можно сделать?
Присваиваешь во время работы табице новые значения, после сохраняешь. inicgf.save() сохранит таблицу полностью, тоесть её формат может меняться в процессе работы. Можешь задать существующей секции значение nil и оно не сохранится.
 

imring

Ride the Lightning
Всефорумный модератор
2,365
2,552
Хватит блять делать громадные условия. А если скинов 50?
Lua:
local skins = {[265] = true, [266] = true, [267] = true}
if skins[model] ~= nil then
-- E boy
end
я же скидывал другой вариант
Lua:
function doingWithModel(modelID)
    local types = {
        [0] = 1,
        [301] = 2
    }
    local functions = {
        [1] = function()
            sampAddChatMessage('Ya CJ', -1)
        end,
        [2] = function()
            sampAddChatMessage('Ya kop', -1)
        end
    }
    local t = types[modelID]
    if t then
        functions[t]()
    end
end
так лучше. каждая функция для определённых скинов.
 
  • Нравится
Реакции: deddosouru и AnWu

Hatiko

Известный
Проверенный
1,512
628
Можно ли как проверить в папке на существование любого txt файла? Не могу додуматься что сделать с функцией doesFileExist(). Просто есть функция, которая получает список всех txt файлов в указанной папке, а если в папке нет никаких файлов выдаётся ошибка и дальнейшее прекращение работы скрипта. Вот и требуется проверка, чтобы при отсутствия файлов код получения не затрагивался и скрипт не прекращал работу.
Если надо код на получение списка:
Lua:
lua_thread.create(function()
listfiles = {}
    search, name = findFirstFile("moonloader/test/*.txt")
        while true do
        wait(0)
            listfiles[#ListLek + 1] = name
            name = findNextFile(search)
            if name == nil then
                findClose(search)
                break
            end
          
        end

    end)
 
  • Нравится
Реакции: WebDim
У

Удалённый пользователь 147808

Гость
Есть строка
<<
Вы (НИК) уже выиграли этот приз (ID)
>>
Как мне из этой строки, получить НИК и ID?
 

imring

Ride the Lightning
Всефорумный модератор
2,365
2,552
Есть строка
<<
Вы (НИК) уже выиграли этот приз (ID)
>>
Как мне из этой строки, получить НИК и ID?
Lua:
text = 'Вы n_name уже выиграли этот приз 13'
name, id = text:match('Вы (.*) уже.+приз (%d+)')

Можно ли как проверить в папке на существование любого txt файла? Не могу додуматься что сделать с функцией doesFileExist(). Просто есть функция, которая получает список всех txt файлов в указанной папке, а если в папке нет никаких файлов выдаётся ошибка и дальнейшее прекращение работы скрипта. Вот и требуется проверка, чтобы при отсутствия файлов код получения не затрагивался и скрипт не прекращал работу.
Если надо код на получение списка:
Lua:
lua_thread.create(function()
listfiles = {}
    search, name = findFirstFile("moonloader/test/*.txt")
        while true do
        wait(0)
            listfiles[#ListLek + 1] = name
            name = findNextFile(search)
            if name == nil then
                findClose(search)
                break
            end
      
        end

    end)
вырезал со своей шпоры.
Lua:
files = {}
local handleFile, nameFile = findFirstFile('moonloader/filesSpur/*.txt')
while handleFile do
  if not nameFile then findClose(handleFile)
  else
    files[#files+1] = nameFile
    nameFile = findNextFile(handleFile)
  end
end
 
Последнее редактирование: