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

MaksQ

Известный
967
834
огромное спасибо, за помощь !
кстати, мне нужно чтобы если найден ид текстдрава, то кликать на его, я могу это сделать, но оно выполняется всего 1 раз, как исправить
нужно в бесконечный цикл запихнуть
огромное спасибо, за помощь !
кстати, мне нужно чтобы если найден ид текстдрава, то кликать на его, я могу это сделать, но оно выполняется всего 1 раз, как исправить
Код:
function main()
    while not isSampAvailable() do wait(0) end
    while true do wait(0)
          if sampTextdrawIsExists(1094) then
            sampSendClickTextdraw(1083)
            sampSendClickTextdraw(1095)
            sampSendClickTextdraw(1091)
            sampSendClickTextdraw(1091)
            sampSendClickTextdraw(1095)
            sampSendClickTextdraw(1091)
            sampSendClickTextdraw(1095)
            sampSendClickTextdraw(1091)
            sampSendClickTextdraw(1095)
            sampSendClickTextdraw(1091)
            sampSendClickTextdraw(1095)
            sampSendClickTextdraw(1097)
        end
    end
end
 

_Benya_

Участник
82
37
Здрасти, может остался у кого скрипт, который пишет номер цвета в чате (именно цифрами). По типу -303234902
Держи

Lua:
local sampev = require 'lib.samp.events'

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(-1)
    end
end

function sampev.onServerMessage(color, message)
    if message then sampAddChatMessage(" Цвет: "..color, -1) end
end
 
  • Нравится
Реакции: McLore и Drinkins

damag

Женюсь на официантке в моем любимом баре
Проверенный
1,152
1,199
У меня есть


Lua:
          servak = {"185.169.134.3:7777", "185.169.134.4:7777", "185.169.134.43:7777", "185.169.134.44:7777", "185.169.134.45:7777", "185.169.134.5:7777", "185.169.134.59:7777", "185.169.134.61:7777", "185.169.134.107:7777", "185.169.134.109:7777", "185.169.134.166:7777", "185.169.134.171:7777"}

servip, servport = sampGetCurrentServerAddress()
sexip = ""..servip..":"..servport

и мне теперь нужно, чтобы писало название сервера, например, если ип 185.169.134.3:7777, то название Phoenix и тд
 

Andre_Esposito

Новичок
13
0
хочу сделать фаст репорт для арп на луа , мне нужно после того как ввел команду /mn выбрать пункт "cвязь с администрацией" как можно навести на это курсор мыши или как то по другому сделать это
 

Lucifer Melton

Активный
164
57
У меня есть


Lua:
          servak = {"185.169.134.3:7777", "185.169.134.4:7777", "185.169.134.43:7777", "185.169.134.44:7777", "185.169.134.45:7777", "185.169.134.5:7777", "185.169.134.59:7777", "185.169.134.61:7777", "185.169.134.107:7777", "185.169.134.109:7777", "185.169.134.166:7777", "185.169.134.171:7777"}

servip, servport = sampGetCurrentServerAddress()
sexip = ""..servip..":"..servport

и мне теперь нужно, чтобы писало название сервера, например, если ип 185.169.134.3:7777, то название Phoenix и тд
Lua:
name = sampGetCurrentServerName()
sampAddChatMessage("Вы играете на "..name.."!", -1)
 
  • Нравится
Реакции: degrando

MaksQ

Известный
967
834
Снимок экрана (519).png



Как сделать вот такую штуку? при нажатии на перейти на ссылку
 

|| NN - NoName ||

Известный
1,049
635
(Впервые работаю с алгоритмами)
Я работаю с алгоритмом Дейкстры, нашёл
Lua:
-- Graph definition
local edges = {
    a = {b = 7, c = 9, f = 14},
    b = {c = 10, d = 15},
    c = {d = 11, f = 2},
    d = {e = 6},
    e = {f = 9}
}

-- Fill in paths in the opposite direction to the stated edges
function complete (graph)
    for node, edges in pairs(graph) do
        for edge, distance in pairs(edges) do
            if not graph[edge] then graph[edge] = {} end
            graph[edge][node] = distance
        end
    end
end

-- Create path string from table of previous nodes
function follow (trail, destination)
    local path, nextStep = destination, trail[destination]
    while nextStep do
        path = nextStep .. " " .. path
        nextStep = trail[nextStep]
    end
    return path
end

-- Find the shortest path between the current and destination nodes
function dijkstra (graph, current, destination, directed)
    if not directed then complete(graph) end
    local unvisited, distanceTo, trail = {}, {}, {}
    local nearest, nextNode, tentative
    for node, edgeDists in pairs(graph) do
        if node == current then
            distanceTo[node] = 0
            trail[current] = false
        else
            distanceTo[node] = math.huge
            unvisited[node] = true
        end
    end
    repeat
        nearest = math.huge
        for neighbour, pathDist in pairs(graph[current]) do
            if unvisited[neighbour] then
                tentative = distanceTo[current] + pathDist
                if tentative < distanceTo[neighbour] then
                    distanceTo[neighbour] = tentative
                    trail[neighbour] = current
                end
                if tentative < nearest then
                    nearest = tentative
                    nextNode = neighbour
                end
            end
        end
        unvisited[current] = false
        current = nextNode
    until unvisited[destination] == false or nearest == math.huge
    return distanceTo[destination], follow(trail, destination)
end

-- Main procedure
print("Directed:", dijkstra(edges, "a", "e", true))
print("Undirected:", dijkstra(edges, "a", "e", false))
У меня есть таблица edges, я хочу добавлять туда значения, но из-за того что не могу бесконечно придумывать названия переменных(a, b, c, d...) - не могу нормально работать с ней, что мне нужно сделать с таблицей или как мне туда можно бесконечно добавлять значения, без постоянного придумывания названий и что-бы это работало с кодом?
Я не уверен, но предполагаю, что можно создать таблицу в которой каждая буква в англ языке будет под цифрой -> a = 1, b = 2 и.д, Потом получать рандомное число от 1 до 26(сток в англ языке букв), потом через pair получаешь какая буква под этим числом, узнаёшь есть ли в твоей таблице которая вторая где переменные, а не буква, узнаёшь есть ли там такая же зарегестрированная переменная, если да, то опять получаешь рандомное число, узнаёшь какая буква добавляешь её к первой и опять делаешь в проверку, и т.д. Естественно это всё должно быть в цикле.
 

lorgon

Известный
656
271
Я не уверен, но предполагаю, что можно создать таблицу в которой каждая буква в англ языке будет под цифрой -> a = 1, b = 2 и.д, Потом получать рандомное число от 1 до 26(сток в англ языке букв), потом через pair получаешь какая буква под этим числом, узнаёшь есть ли в твоей таблице которая вторая где переменные, а не буква, узнаёшь есть ли там такая же зарегестрированная переменная, если да, то опять получаешь рандомное число, узнаёшь какая буква добавляешь её к первой и опять делаешь в проверку, и т.д. Естественно это всё должно быть в цикле.
Решил свою проблему.
1-ое: У меня была не правильная реализация кода.
2-ое: Просто заменил буквы, цифрами(пример: было a, стало [1])
Нашёл вот другой код
 

|| NN - NoName ||

Известный
1,049
635
Решил свою проблему.
1-ое: У меня была не правильная реализация кода.
2-ое: Просто заменил буквы, цифрами(пример: было a, стало [1])
Нашёл вот другой код
facepalm, а вот это не могло твою проблему решить: edges[edges+1]
Или я что-то не допёр?
 

r0den

Участник
24
10
Vsem qq
Есть варианты как при помощи луа установить pagesize значение допустим больше 20?
 

#Rewzeisch

Известный
120
10
Ребят срочно, помогите составить регулярку на данный вид диалога, впервые с таким сталкиваюсь....
Пытался изобразить что-то вроде : (.*) (%a+_%a+)%[(%d+)%] (%d+) (%d+) , но не выходит
Посмотреть вложение 53606
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,907
1,282
Это получает все название сервера, а мне нужно просто Phoenix.
Lua:
stable = {"Phoenix", "Tucson" и т.д.}

for k, v in ipairs(stable) do
 if sampGetCurrentServerName():find(v) then
   sampAddChatMessage("Вы играете на "..v.."!", -1)
 end
end
или же через айпи, как в твоем коде
Lua:
servak = {{"185.169.134.3:7777", "Phoenix"}, {"185.169.134.4:7777", "Tucson"}, "185.169.134.43:7777", "185.169.134.44:7777", "185.169.134.45:7777", "185.169.134.5:7777", "185.169.134.59:7777", "185.169.134.61:7777", "185.169.134.107:7777", "185.169.134.109:7777", "185.169.134.166:7777", "185.169.134.171:7777"}

servip, servport = sampGetCurrentServerAddress()
sexip = ""..servip..":"..servport

for k, v, name in ipairs(servak)
 if sexip == v then
  servername = name
 end
end
 
  • Нравится
Реакции: Quasper

Quasper

Известный
835
354
Это получает все название сервера, а мне нужно просто Phoenix.
Ну так сделай массив с именами серверов

Lua:
local servers = {
{ip = "185.169.134.3", name = "Phoenix"},
{ip = "185.169.134.4", name = "HZ"} --и так далее
}
local serverName = ""
local serverIp =  ""
--И после подключения к серверу
servip, servport = sampGetCurrentServerAddress()
for i = 1, #servers do
    if servers[i].ip == servip then
        serverName, serverIp = servers[i].name, ("%s:%s"):format(servip, servport)
    end
end
--ну и там где  тебе нужно написать
sampAddChatMessage("Сервер: " .. serverName .. " Адресс: " .. serverIp, -1)
Lua:
stable = {"Phoenix", "Tucson" и т.д.}

for k, v in ipairs(stable) do
if sampGetCurrentServerName():find(v) then
   sampAddChatMessage("Вы играете на "..v.."!", -1)
end
end
или же через айпи, как в твоем коде
Lua:
servak = {{"185.169.134.3:7777", "Phoenix"}, {"185.169.134.4:7777", "Tucson"}, "185.169.134.43:7777", "185.169.134.44:7777", "185.169.134.45:7777", "185.169.134.5:7777", "185.169.134.59:7777", "185.169.134.61:7777", "185.169.134.107:7777", "185.169.134.109:7777", "185.169.134.166:7777", "185.169.134.171:7777"}

servip, servport = sampGetCurrentServerAddress()
sexip = ""..servip..":"..servport

for k, v, name in ipairs(servak)
if sexip == v then
  servername = name
end
end
Со вторым вариантом будет трабл, в value будет таблица и следовательно ошибка при сравнении
 
  • Злость
Реакции: paulohardy