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

romacaddy

Известный
Проверенный
234
206
Lua:
local car = storeCarCharIsIn(PLAYER_PED)
local _, id = sampGetVehicleIdByCarHandle(car)
sampfuncsLog(id)
Почему не работает эта функция, вроде все делаю верно, но выводит -1. Заметил, что storeCarCharIsIn это аналог опкода 00D9, а в клео, хендл своей машины, я получать этим опкодом не мог, получал опкодом 03С0.
Нужна помощь, как получить ид авто, в котором сидишь?
 

FYP

Известный
Автор темы
Администратор
1,757
5,684
добавил несколько частых вопросов с первых страниц в основной пост темы, чтобы их не повторяли многократно. напишите, какие ещё можно добавить, если есть что предложить.
 

k0lenval

Известный
133
109
Есть ли возможность отследить появление таких надписей? Не могу найти ничего подходящего. Мне нужно, чтобы при появлении определенной надписи, выполнялось действие.
https://s7.postimg.org/qemdbvr2h/sa-mp-018.png
 

FYP

Известный
Автор темы
Администратор
1,757
5,684
Есть ли возможность отследить появление таких надписей? Не могу найти ничего подходящего. Мне нужно, чтобы при появлении определенной надписи, выполнялось действие.
https://s7.postimg.org/qemdbvr2h/sa-mp-018.png
приходящие с сервера можно с помощью samp.lua, но чтобы отследить локальные, придётся копаться в памяти и, возможно, делать хук.
 

ynhhoJ

Известный
102
6
Приветствую.
Есть у кого-нибудь более подробные примеры по использованию SAMP.Lua(SAMP.Events) или какой-нибудь справочник/уроки.
Прочел тему от FYP-a, где он дал хоть какие-то примеры, но на деле у меня ничего не работает.
P.S: Скорее всё из-за того что я не правильно сделал.
Lua:
...
require "lib.sampfuncs"
require "lib.moonloader"
local sampev = require 'lib.samp.events'

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

end

function sampev.onSendChat(msg)
  print('I said: ' .. msg)
end
function sampev.onSendChat(msg)
  return {'I said: ' .. msg}
end
 

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,338
Приветствую.
Есть у кого-нибудь более подробные примеры по использованию SAMP.Lua(SAMP.Events) или какой-нибудь справочник/уроки.
Прочел тему от FYP-a, где он дал хоть какие-то примеры, но на деле у меня ничего не работает.
P.S: Скорее всё из-за того что я не правильно сделал.
Lua:
...
require "lib.sampfuncs"
require "lib.moonloader"
local sampev = require 'lib.samp.events'

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

end

function sampev.onSendChat(msg)
  print('I said: ' .. msg)
end
function sampev.onSendChat(msg)
  return {'I said: ' .. msg}
end
в main в конце пропиши wait(-1)
 

ynhhoJ

Известный
102
6
LUA записывает текст только в кодировке UTF-8. Как можно сменить кодировку на Windows-1251?

LUA записывает текст только в кодировке UTF-8. Как можно сменить кодировку на Windows-1251?
Решил проблему тем что кодировку в самом файле .txt изменил на Windows-1251.
 
Последнее редактирование модератором:

kobato

Новичок
7
12
Вопрос по парсингу строк. Не удаётся мне, значит, пропарсить строку.
Дана строка:
Код:
Дистанция: 1.12 км.
Каким образом я могу вытащить из строки 1.12? Число именно с точкой, не float.
 

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,338
Вопрос по парсингу строк. Не удаётся мне, значит, пропарсить строку.
Дана строка:
Код:
Дистанция: 1.12 км.
Каким образом я могу вытащить из строки 1.12? Число именно с точкой, не float.
Lua:
Dotchk,potchk=string.match(str, "Дистанция: (%d+).(%d+) км.")
 
  • Нравится
Реакции: kobato

deddosouru

Смотрю аниме, служу Сатане
Друг
2,036
1,317
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    local font = renderCreateFont("Arial", 8, 5)
    firstline = 99
    scrX, scrY = getScreenResolution()
    while true do
        for i = 0, 17 do
            strtext, _, strcol, _ = sampGetChatString(firstline - i)
            renderFontDrawText(font, string.format("%s",strtext), 0, scrY - (i * 10 - 20), strcol)
        end
    end
end
внимание знатоки: вопрос
ругается на renderFontDrawText
где именно я сделал ошибку не считая того, что вообще начал писать этот код?
 
  • Нравится
Реакции: AlexDeluxe

4546546513212

Новичок
2
1
Можно-ли как нибудь в Lua создать переменную которая не меняет свой адрес, даже после перезапуска? Или можно ли работать с адрессами других приложении в lua?

Нужно отследить состояние скрипта из другой программы.
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,447
В string.format сначала передается строка.
В логах это должно быть написано, мог бы и приложить.