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

|| NN - NoName ||

Известный
1,049
635
Можно пример как сравнить id?
Lua:
local sampev = require("lib.samp.events")

local gev = 'lolkek'

function main()
    wait(-1)
end

function sampev.onShowDialog(id, style, title, botton1, botton2, text)
    if id == 706 then
        mbtext = {}
        lol = ''
        for w in string.gmatch(text, "[^\r\n]+") do
            table.insert(mbtext, w)
        end
        for s, h in pairs(mbtext) do
            local xui, nick, id, het, rank, afk = h:match('(.*) (%a+_%a+)%[(%d+)%]  {0088ff}| {cccccc}(.*): {FFFFFF}(%d+)(.*)')
            sampAddChatMessage(afk, -1)
            color = sampGetPlayerColor(id)
            color = string.format('%06X', bit.band(color,  0xFFFFFF))
            text = xui..'{'..color..'}'..nick..'{FFFFFF}['..id..']'..het..'\n'
            coord(id, nick)
            lol = lol..''..tostring(text)
        end
        return {id, style, title, botton1, botton2, lol}
    end
end

function coord(id, nick)
    result, has = sampGetCharHandleBySampPlayerId(id)
    if result then
        x, y, z = getCharCoordinates(PLAYER_PED)
        xx, yy, zz = getCharCoordinates(has)
        dis = getDistanceBetweenCoords3d(x, y, z, xx, yy, zz)
        sampAddChatMessage(nick..' от вас: '..dis..' метрах', -1)
    end
end
Тут вроде есть всё, то что тебе нужно. Дальше сам разберёшься надеюсь.
 
Последнее редактирование:
  • Нравится
Реакции: TWP

MrBidloKoder

Известный
423
249
emul_rpc('onCreateGangZone', 543, {1248.011, 2072.804}, {1439.348, 2204.319}, 123456)


attempt to index local 'parameters' (a number value)
stack traceback:
1419: in function 'emul_rpc'

Загадка от Жака Фреско. 'Почему?' На размышление даётся 30 секунд.
 

ufdhbi

Известный
Проверенный
1,460
866
emul_rpc('onCreateGangZone', 543, {1248.011, 2072.804}, {1439.348, 2204.319}, 123456)


attempt to index local 'parameters' (a number value)
stack traceback:
1419: in function 'emul_rpc'

Загадка от Жака Фреско. 'Почему?' На размышление даётся 30 секунд.
emul_rpc('onCreateGangZone', {тут параметры})
 
Последнее редактирование:
  • Ха-ха
Реакции: MrBidloKoder

_ex$tanOr_

Участник
125
19
Как мне сделать клик по текстдраву, если id текстдравов в моде ДРП постоянно меняются? Как это можно реализовать через проверку по дате?
Lua:
function cmd_posad()
          active = not active
          sampAddChatMessage(active and "{FF8C00}[Posadka] Включен" or "{FF8C00}[Posadka] Выключен", -1)
          if active == true then
              sampProcessChatInput("/items")
              sampSendClickTextdraw(2090)
              sampSendClickTextdraw(2134)

        end
end
 

SurnikSur

Активный
284
40
Как сделать так что бы когда только появлялась серверная метка (она будет появляться максимум 10 самповских метра от персонажа) так вот когда она появлялась персонаж сразу тпехался кордом на неё
 
D

deleted-user-210352

Гость
есть где гайды, как в окно imgui вставить картинку?
 

_ex$tanOr_

Участник
125
19
Как мне сделать клик по текстдраву, если id текстдравов в моде ДРП постоянно меняются? Как это можно реализовать через проверку по дате?
Lua:
function cmd_posad()
          active = not active
          sampAddChatMessage(active and "{FF8C00}[Posadka] Включен" or "{FF8C00}[Posadka] Выключен", -1)
          if active == true then
              sampProcessChatInput("/items")
              sampSendClickTextdraw(2090)
              sampSendClickTextdraw(2134)

        end
end
Парни, помогите, пожалуйста
 

Fott

Простреленный
3,462
2,378
Парни, помогите, пожалуйста
Если там модель объекта о можно по ней
Lua:
function samp.onShowTextDraw(id, data)
    if data.modelId == сюда ид объекта then
        sampSendClickTextdraw(id)
    end
end
Если там текст то можно так

Lua:
function samp.onShowTextDraw(id, data)
    if data.text == 'тут текст' then
        sampSendClickTextdraw(id)
    end
end
 

Viem

Известный
49
5
Ищу код для перемещения чата, кто видел или у кого завалился скиньте пж
 

Tak

Известный
177
70
Ищу код для перемещения чата, кто видел или у кого завалился скиньте пж
Ищу код для перемещения чата, кто видел или у кого завалился скиньте пж
В теме ниже можно посмотреть как сделан рендер отдельного чата, и сделать так, но уже со всем чатом:
 

CaJlaT

07.11.2024 14:55
Модератор
2,834
2,674
Он попросил код на луа, а это C++, ещё и без исходника
 

Luis_Mora

Участник
31
1
Народ всем привет. Задался тут сделать одну историю для себя и назрел вопрос в процессе выполнения.

1)Мне нужно чтобы в чате, после перехвата сообщения из чата фракции ( /r ) возвращалось это же сообщение но ник того кто его отправил был цветом клиста нашего отправителя.
2) Ещё столкнулся с такой проблемой, перехватывает сообщение с рации, но если находит второе двоеточие например, или "_" то сразу крашит.

Кто сталкивался, подскажите будьте любезны.

**Функция поиска ID ( findPlayerByName(nameRD) ) игрока, обычный цикл for перебора всех игроков на сервере.

пример Строки
Лейтенант Nick_Name: texttexttexttexttexttexttexttext

Lua:
        if text:find('_') and text:find(':')then
            if color == -1920073984 then
                local txL, nameRD, txR = text:match('(.+) (.+):(.+)')
                local id = findPlayerByName(nameRD)
                local colorN = sampGetPlayerColor(id)
                --sampAddChatMessage(colorN,colorN)
                if txR ~= nil and txL ~= nil then return {color, txL .. " " .. nameRD .. '[' .. id .. "]" .. ':'.. txR} end
            end
        end


Возвращаюсь к этой теме. Разобрался где крашит игру но пока не могу понять как решить, может у вас есть идеи.

Мысль следующая, ID игрока определяется в функции перебора всех игроков, выдаёт на ID игрока который использует скрипт (соответственной мой ID), возвращает значение -1 хотя и получает имя такое же как и все другие. С другими игроками нормально всё.

Lua:
function findPlayerByName(name)
    local _, mID = sampGetPlayerIdByCharHandle(PLAYER_PED)
    for i = 0, 999 do
        if sampIsPlayerConnected(i)  then
            local Nick = sampGetPlayerNickname(i)
            if Nick == name then
                return i
            end
        end
    end
    return -1
end

** Добавлял проверки на мой ID, никаких успехов.