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

Double Tap Inside

Известный
Проверенный
1,916
1,256
Здрасте, как мне узнать номер строки диалога в которой есть нужный мне текст?
Я знаю такой вариант:
Lua:
sampev = require("lib.samp.events")

function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
    if title:match("123") and text:match("123") then
    sampSendDialogResponse(dialogid, 1, -1, -1)
    end
end
А мне нужно искать в диалоге типа "Список" совпадение и потом в sampSendDialogResponse выбирать нужную линию.
Объясните на пальцах, как вычислить ту самую линию)

Lua:
function sampev.onShowDialog(dialogId, style, title, button1, button2, text)

    local index = 0

    for line in text:gmatch("[^\n]*\n?") do -- line будет включать также "\n" вконце строки
        if title:match("123") then
            if line:match("Ищем это") then
                sampSendDialogResponse(dialogid, 1, index , -1)
                break
            end
            index = index+1
        end

    end
end
 
  • Нравится
Реакции: JustFedot

dmitri4

Известный
452
78
Как выводить ID диалога рядом с названием его?
Код как ограничитель фпс снять ( память вроде, не ебу )
Lua:
local events = require "lib.samp.events"
function events.onShowDialog(dialogid, style, title, button1, button2, text)
    return { dialogid, style, ('%s[%s]'):format(title, dialogid), button1, button2, text }
end
 

JustFedot

Известный
338
339
Подскажите пожалуйста, как закрыть соединение с сервером?
Желательно имитируя вылет, а так вообще без разницы. Мне для самописного реконекта
 

savvin

Известный
406
139
Подскажите пожалуйста, как закрыть соединение с сервером?
Желательно имитируя вылет, а так вообще без разницы. Мне для самописного реконекта
Код:
GAMESTATE_NONE = 0
GAMESTATE_WAIT_CONNECT = 1
GAMESTATE_AWAIT_JOIN = 2
GAMESTATE_CONNECTED = 3
GAMESTATE_RESTARTING = 4
GAMESTATE_DISCONNECTED = 5

 

k0shaK

Известный
147
112
Подскажите пожалуйста, как закрыть соединение с сервером?
Желательно имитируя вылет, а так вообще без разницы. Мне для самописного реконекта
Получаешь айпи сервера, на котором щас находишься, потом подключаешься к ему же через sampConnectToServer.
 

shrei9

Известный
17
0
ку, мне нужно вывести скорость аирбрейка на экран, но каждый раз как текст выводится - фпс дико проседает
как можно пофиксить?

Lua:
if isKeyDown(key.VK_RBUTTON) and isKeyDown(key.VK_E) then
      if AirBrk_multiplier < 15 then AirBrk_multiplier = AirBrk_multiplier + math.floor(10 * fpsCorrection()) / 100 end
      drawFPS(AirBrk_multiplier, sw, sh)  -- sw и sh это глобальные размера экрана
-- ......
function drawFPS(airspeed, x, y)
  renderFontDrawText(font, string.format('AirBrk speed: %.2f', airspeed), x/2, y/2, -1)
end
 
Последнее редактирование:

mld

Участник
99
11
Помогите плезз
Как сделать такой же биндер как в arx?
мне самое главное это содержание и результат,задержка все
 

Вложения

  • 1567264334234.png
    1567264334234.png
    32.5 KB · Просмотры: 123

savvin

Известный
406
139
Помогите плезз
Как сделать такой же биндер как в arx?
мне самое главное это содержание и результат,задержка все
Готовый код за тебя никто писать не будет, тем более такого масштаба. Создаешь, к примеру, json файл со всеми биндами, при запуске скрипта выгружаешь в таблицу. Берешь ImGui, создаешь буфферы, окна, колонки и вперед писать бинд
 

JustFedot

Известный
338
339
Код:
GAMESTATE_NONE = 0
GAMESTATE_WAIT_CONNECT = 1
GAMESTATE_AWAIT_JOIN = 2
GAMESTATE_CONNECTED = 3
GAMESTATE_RESTARTING = 4
GAMESTATE_DISCONNECTED = 5

Спасибо, я уже сделал скрипт :3
На даймонде как оказалось какаето хрень стоит, типа если реконект то краш игры.
Еле нашел способ это обойти...
Если кому понадобиться, вот обход:

Lua:
state = false

function func(text) --сам реконект
    lua_thread.create(function()
        if text:match("^%d+$") then
            del = text*1000
            dell = text
            if del > 60000 then del = 60000 dell = 60 sampAddChatMessage('Больше 60-ти сек. НИЗЯ!', -1) end
            sampAddChatMessage('Реконект через: '..dell..' секунд.', -1)
            state = true
            sampDisconnectWithReason(1)
            wait(100)
            sampSetGamestate(1)
            sampDisconnectWithReason(1)
            wait(del+1000)
            sampSetGamestate(1)
        end
    end)
end

function sampev.onRemoveBuilding() -- обход этого говна на даймонде
    if state then
        return false
    end
    if not state then
        return true
    end
end
 
  • Вау
Реакции: gfgfds2423

savvin

Известный
406
139
  • Нравится
Реакции: shrei9

KCAS 700W

Новичок
20
4
Помогите с кодом, не работает чёт
Lua:
local kolichestvo = 100
local price = 2750
-- хуй
local sampev = require 'lib.samp.events'
local key = require 'vkeys'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        if not sampIsChatInputActive() and not isSampfuncsConsoleActive() and not sampIsDialogActive() then
            if isKeyJustPressed(key.VK_SUBTRACT) then
                sampSendChat('/sellbrill')
            end
        end
    end
end

function sampev.onShowDialog(id, style, title, b1, b2, text)
    if id == 996 then
        sampSendDialogResponse(id, 1, -1, tostring(kolichestvo))
        if id = 997 then
            sampSendDialogResponse(id, 1, -1, tostring(price))
            end
    end
end

function sampev.onSendEditObject(playerObject, objectId, response, position, rotation)
    return {playerObject, objectId, 1, position, rotation}
end
 

mld

Участник
99
11
Скиньте плез тему(-ы) для изучения json файлов,как выводить таблицу и тд
 

ImPasha

Software Developer & System Administrator
Друг
1,788
2,142
Помогите с кодом, не работает чёт
Lua:
local kolichestvo = 100
local price = 2750
-- хуй
local sampev = require 'lib.samp.events'
local key = require 'vkeys'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        if not sampIsChatInputActive() and not isSampfuncsConsoleActive() and not sampIsDialogActive() then
            if isKeyJustPressed(key.VK_SUBTRACT) then
                sampSendChat('/sellbrill')
            end
        end
    end
end

function sampev.onShowDialog(id, style, title, b1, b2, text)
    if id == 996 then
        sampSendDialogResponse(id, 1, -1, tostring(kolichestvo))
        if id = 997 then
            sampSendDialogResponse(id, 1, -1, tostring(price))
            end
    end
end

function sampev.onSendEditObject(playerObject, objectId, response, position, rotation)
    return {playerObject, objectId, 1, position, rotation}
end
Попробуй таким образом
Lua:
local kolichestvo = 100
local price = 2750
local sampev = require("samp.events")

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    repeat wait(0) until isSampAvailable()
    while true do wait(0)
        if not sampIsChatInputActive() and not isSampfuncsConsoleActive() and not sampIsDialogActive() then
            if isKeyJustPressed(VK_SUBTRACT) then sampSendChat("/sellbrill") end
        end
    end
end