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

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

DimaPlay

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

Изза строчки ниже скрипт умирает, а я даже в душе не ебу, как сделать всё без ошибок((
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,732
4,033
Как заставить это работать? Это не работает, я имею в виду, что когда текст отображается, он не отправляет функцию 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,732
4,033
+:
Посмотреть вложение 245081
Как получить идентификатор textdraw для textdraw, который имеет определенные координаты на экране? В приведенном выше примере X=85,867 и Y=234,403? Или, если это невозможно, любой другой способ обнаружить текстовое изображение, не зная его идентификатора. (В моем случае идентификатор textdraw меняется, но структура textdraw остается прежней).
Че
 

chromiusj

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

eweest

Известный
4
0
Примерно как-то так,регулярки переделать только
Спасибо.
Однако я видимо не то делаю. Сделал вроде как надо, но диалог висит и все. Текст находит, который в регулярке указываешь и на этом все.
Мне нужно не только текст вытянуть оттуда, а выбрать нужную строку и в диалоге нажать кнопку с индексом 1. Чтобы следующий диалог открыть.
 

chromiusj

Стань той переменой, которую хочешь увидеть в мире
Модератор
5,732
4,033
Спасибо.
Однако я видимо не то делаю. Сделал вроде как надо, но диалог висит и все. Текст находит, который в регулярке указываешь и на этом все.
Мне нужно не только текст вытянуть оттуда, а выбрать нужную строку и в диалоге нажать кнопку с индексом 1. Чтобы следующий диалог открыть.
Ну так используй это
 

kjtktkjr

Новичок
2
0
как где %d+ проверить количество символом? нужно от 2 до 3 символов
Lua:
if text:find('%{FFFFFF%}(%a+%_%a+)%[%d+%]%:    %{33CCFF%}(%d+)') then
перед аргументом прописать # и проверять его
 
Последнее редактирование: