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

MLycoris

На вид оружие массового семяизвержения
Проверенный
1,974
2,209
Как упростить этот процесс?: Когда вы вводите /jaillist или любую другую команду (например, /jl, чтобы открыть /jaillist) и вводите «/free ID 15000» для каждого человека в диалоговом списке. Для примера видео, приведенного ниже:
/free 235 15000 ; wait(676) /free 567 15000 wait(676) ... /free ID 15000
попробуй
Lua:
local sampev = require('lib.samp.events')
function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
    if title:find('Prizonieri') then
        lua_thread.create(function()
            for line in text:gmatch("[^\n]*\n?") do
                local id = line:match('.+ %((%d+)%) %- Jail')
                if id then
                    sampSendChat('/free '..id..' 15000')
                    wait(700)
                end
            end
        end)
    end
end
 

ALCAPONE2225

Известный
41
0
Такой вопрос, к примеру у меня есть обычный цвет в rgb - ff0000, как перевести его в int, чтобы можно было поменять цвет onServerMessage через return {color, text}, там color в формате int
 

зач хейт

Потрачен
111
39
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Такой вопрос, к примеру у меня есть обычный цвет в rgb - ff0000, как перевести его в int, чтобы можно было поменять цвет onServerMessage через return {color, text}, там color в формате int
4278190080
 
  • Нравится
Реакции: ALCAPONE2225

kakalin

Новичок
1
0
Помогите позязя.. Хотел сделать что то типа бинда, чтобы на клавишу, либо же на две доставался скейт. В итоге не работает обсалютно ничего(
Объясните пожалуйста, может тут чиго то не хватает?




Код:
require 'lib.moonloader'
local keys = require 'vkeys'
function main()
    if not isSampLoaded() or not isSampfuncsLoaded()
    then return
    end
    while not isSampAvailable()
    do wait(100)
    end
    sampAddChatMessage('Тестовый скрипт загружен', #0x6A5ACD)
while true do
    wait(0)
    if isKeyDown(VK_O)
    and isKeyJustPressed(VK_Q)
    than sampSendChat('/skate')
end
 

Masayuki

Участник
92
36
Помогите позязя.. Хотел сделать что то типа бинда, чтобы на клавишу, либо же на две доставался скейт. В итоге не работает обсалютно ничего(
Объясните пожалуйста, может тут чиго то не хватает?




Код:
require 'lib.moonloader'
local keys = require 'vkeys'
function main()
    if not isSampLoaded() or not isSampfuncsLoaded()
    then return
    end
    while not isSampAvailable()
    do wait(100)
    end
    sampAddChatMessage('Тестовый скрипт загружен', #0x6A5ACD)
while true do
    wait(0)
    if isKeyDown(VK_O)
    and isKeyJustPressed(VK_Q)
    than sampSendChat('/skate')
end
Замени than на then
 

mafizik

Участник
18
5
Помогите позязя.. Хотел сделать что то типа бинда, чтобы на клавишу, либо же на две доставался скейт. В итоге не работает обсалютно ничего(
Объясните пожалуйста, может тут чиго то не хватает?




Код:
require 'lib.moonloader'
local keys = require 'vkeys'
function main()
    if not isSampLoaded() or not isSampfuncsLoaded()
    then return
    end
    while not isSampAvailable()
    do wait(100)
    end
    sampAddChatMessage('Тестовый скрипт загружен', #0x6A5ACD)
while true do
    wait(0)
    if isKeyDown(VK_O)
    and isKeyJustPressed(VK_Q)
    than sampSendChat('/skate')
end
Lua:
require 'lib.moonloader'
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('Тестовый скрипт загружен', 0x6A5ACD)
    while true do wait(0)
       if isKeyDown(VK_O) and isKeyJustPressed(VK_Q) then
          sampSendChat('/skate')
       end  
    end
end
 
Последнее редактирование:
  • Нравится
Реакции: Oki_Bern

Sunzer

Активный
279
89
Всем здраствуйте. Решил я модифицировать скрипт под Родину, но есть один нюанс.

Изза строчки ниже скрипт умирает, а я даже в душе не ебу, как сделать всё без ошибок((
sampAddChatMessage('ID: {33CCFF}['..settings.id.v..'] {FFFFFF}| Имя: {33CCFF}['..settings.name.v..']', -1)
 

mil0n

Участник
32
1
Всем здраствуйте. Решил я модифицировать скрипт под Родину, но есть один нюанс.

Изза строчки ниже скрипт умирает, а я даже в душе не ебу, как сделать всё без ошибок((
sampAddChatMessage('ID: {33CCFF}['..settings.id.v..'] {FFFFFF}| Имя: {33CCFF}['..settings.name.v..']', -1)
вырежи строку, вот тебе и фикс
 
  • Эм
Реакции: ARMOR

mafizik

Участник
18
5
Всем здраствуйте. Решил я модифицировать скрипт под Родину, но есть один нюанс.

Изза строчки ниже скрипт умирает, а я даже в душе не ебу, как сделать всё без ошибок((
sampAddChatMessage('ID: {33CCFF}['..settings.id.v..'] {FFFFFF}| Имя: {33CCFF}['..settings.name.v..']', -1)
проблема в переменных settings.id.v и settings.name.v возможно для них нет значений.
 
Последнее редактирование:

chromiusj

модерирую шмодерирую
Модератор
5,958
4,286
Как заставить это работать? Это не работает, я имею в виду, что когда текст отображается, он не отправляет функцию sampSendChat. Кроме того, как сделать циклическую проверку определенного текста в textdraw? Потому что оно меняется, например, с 24,1 на 25,0, на 25,9 и так далее.
Код:
local sampev = require('lib.samp.events')

function sampev.onShowTextDraw(textdrawId, data)
    if data.text:find('Ebene ~r~1 ~w~- ~у~24.1 % ~w~prozent') then -- here it can change from 24.1 to 25.9 and so on.
    lua_thread.create(function() wait(200)
        sampSendChat('Ebene erreicht')
    end)
    end
Ebene 1 может измениться на Ebene 2, Ebene 3 и т. д. Как сделать циклическую проверку textdraw, которая периодически меняет свой текст?
 

unjoyablehappiness

Новичок
5
0
Как насчет той части, где текстовый рисунок читается только один раз (единственный раз, когда текстовый рисунок создается?) Текстовый рисунок остается на экране, но текст внутри него изменяется.
Как я уже сказал: от Ebene 1 до Ebene 2, Ebene 3, ETC..
 

unjoyablehappiness

Новичок
5
0
+:
1719825803028.png

Как получить идентификатор textdraw для textdraw, который имеет определенные координаты на экране? В приведенном выше примере X=85,867 и Y=234,403? Или, если это невозможно, любой другой способ обнаружить текстовое изображение, не зная его идентификатора. (В моем случае идентификатор textdraw меняется, но структура textdraw остается прежней).
 

eweest

Известный
4
0
Приветствую.
Перепробовал все методы для работы с обычным списком. безуспешно.
Как в диалоге типа 4 DIALOG_STYLE_TABLIST найти строку и выбрать ее для продолжения сценария?
 

chromiusj

модерирую шмодерирую
Модератор
5,958
4,286
+:
Посмотреть вложение 245081
Как получить идентификатор textdraw для textdraw, который имеет определенные координаты на экране? В приведенном выше примере X=85,867 и Y=234,403? Или, если это невозможно, любой другой способ обнаружить текстовое изображение, не зная его идентификатора. (В моем случае идентификатор textdraw меняется, но структура textdraw остается прежней).
Че
 

chromiusj

модерирую шмодерирую
Модератор
5,958
4,286
Приветствую.
Перепробовал все методы для работы с обычным списком. безуспешно.
Как в диалоге типа 4 DIALOG_STYLE_TABLIST найти строку и выбрать ее для продолжения сценария?
Примерно как-то так,регулярки переделать только