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

FYS

Потрачен
982
236
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как сделать всплывающею подсказку в имгуи?
 

ГОХА | GoxaShow

В АРМИИ С 12.12,ЗАКАЗЫ НЕ ДЕЛАЮ,ТУПЫЕ ВОПРОСЫ-НАХУ
Проверенный
1,889
1,903
Lua:
local sampev = require 'lib.samp.events'


function sampev.onCreate3DText(id,color,position,dist,testLOS,attachedPlayerId,attachedVehicleId,text)
    print(id,color,position,dist,testLOS,attachedPlayerId,attachedVehicleId,text)
end
и что это? мне надо чтобы скрипт находил 3д текст с опредленным словом, получал xyz и ставил на них метку
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,650
2,535
и что это? мне надо чтобы скрипт находил 3д текст с опредленным словом, получал xyz и ставил на них метку
Вон, получай текст и работай с ним
position это таблица, получай оттуда X Y Z
 

ГОХА | GoxaShow

В АРМИИ С 12.12,ЗАКАЗЫ НЕ ДЕЛАЮ,ТУПЫЕ ВОПРОСЫ-НАХУ
Проверенный
1,889
1,903
Вон, получай текст и работай с ним
position это таблица, получай оттуда X Y Z
ну я понял, там выше я нашел скрипт который находит это все, но он находит весь 3д текст который огромный, а мне надо, чтобы он искал опреденное слово в этом 3д тексте
Lua:
script_dependencies("CLEO", "SAMP", "SAMPFUNCS")

---------------------------------------------------------------------------

require "lib.moonloader"
require "lib.sampfuncs"

---------------------------------------------------------------------------

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    sampRegisterChatCommand("mycmd", cmd)

    while true do
             wait(0)
        end
end

function cmd(param)
    if isPlayerPlaying(playerHandle) then
        local posX, posY, posZ = getCharCoordinates(playerPed)
        local res, text, color, x, y, z, distance, ignoreWalls, player, vehicle = Search3Dtext(posX, posY, posZ, 300.0, "")
        if res then
            sampAddChatMessage(string.format("Найден 3D текст \"%s\" в координатах %.2f %.2f %.2f, дистанция %.2f, id игрока %d, id транспорта %d", text, x, y, z, distance, player, vehicle), color)
                    
        end
    end
end

function Search3Dtext(x, y, z, radius, patern)
    local text = ""
    local color = 0
    local posX = 0.0
    local posY = 0.0
    local posZ = 0.0
    local distance = 0.0
    local ignoreWalls = false
    local player = -1
    local vehicle = -1
    local result = false

    for id = 0, 2048 do
        if sampIs3dTextDefined(id) then
            local text2, color2, posX2, posY2, posZ2, distance2, ignoreWalls2, player2, vehicle2 = sampGet3dTextInfoById(id)
            if getDistanceBetweenCoords3d(x, y, z, posX2, posY2, posZ2) < radius then
                if string.len(patern) ~= 0 then
                    if string.match(text2, patern, 0) ~= nil then result = true end
                else
                    result = true
                end
                if result then
                    text = text2
                    color = color2
                    posX = posX2
                    posY = posY2
                    posZ = posZ2
                    distance = distance2
                    ignoreWalls = ignoreWalls2
                    player = player2
                    vehicle = vehicle2
                    radius = getDistanceBetweenCoords3d(x, y, z, posX, posY, posZ)
                end
            end
        end
    end

    return result, text, color, posX, posY, posZ, distance, ignoreWalls, player, vehicle
end
 

trefa

3d print
Всефорумный модератор
2,106
1,260
Код:
function hint(text)
  lua_thread.create(
    function()
      imgui.TextDisabled("(?)")
      if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.TextUnformatted(u8(text))
        imgui.EndTooltip()
      end
  end)
end

вроде она



ну и как мне тогда в чат отправлять то что в файле написано?
Ну тогда делай проверку что в строке не содержится {wait}.
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,650
2,535
Код:
function hint(text)
  lua_thread.create(
    function()
      imgui.TextDisabled("(?)")
      if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.TextUnformatted(u8(text))
        imgui.EndTooltip()
      end
  end)
end

вроде она



ну и как мне тогда в чат отправлять то что в файле написано?
Нельзя использовать имгуи функции в потоках
 

DolgorukovGTA

Известный
Проверенный
652
345
У меня есть список людей в конфиге, которые допустим мои друзья на сервере
Как мне вывести список этих друзей онлайн в диалоге?
Чтобы было как-то так
( Я говорю об том, чтобы узнать есть ли друзья в сети, потом эту информацию вывести в диалоге )
WWvzdvw.png
Проверить, находится ли игрок на сервере, можно при помощи данной функции:
Lua:
bool result = sampIsPlayerConnected(int id)
Если тебе известны имена, то тебе нужно получить ID этих игроков. Пробегаешься по массиву имён в ini-файле при помощи цикла for. Получить имя по ID можно при помощи следующей функции:
Lua:
name = sampGetPlayerNickname(int id)
 

Fomikus

Известный
Проверенный
475
345
Есть renderDrawBox, как сделать чтобы он создавался не на экране(Как часть интерфейса), а в 3D мире (В определенной точке)
 

ГОХА | GoxaShow

В АРМИИ С 12.12,ЗАКАЗЫ НЕ ДЕЛАЮ,ТУПЫЕ ВОПРОСЫ-НАХУ
Проверенный
1,889
1,903
помогите написать/дописать скрипт на нахождение определенного слова из 3д текста, например вот такого, этот 3д текст считается за весь , а мне надо, чтобы скрипт находил только "Дом Продается"
33497

код:
Lua:
script_dependencies("CLEO", "SAMP", "SAMPFUNCS")

---------------------------------------------------------------------------

require "lib.moonloader"
require "lib.sampfuncs"

---------------------------------------------------------------------------

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    sampRegisterChatCommand("mycmd", cmd)

    while true do
             wait(0)
        end
end

function cmd(param)
    if isPlayerPlaying(playerHandle) then
        local posX, posY, posZ = getCharCoordinates(playerPed)
        local res, text, color, x, y, z, distance, ignoreWalls, player, vehicle = Search3Dtext(posX, posY, posZ, 300.0, "")
        if res then
            sampAddChatMessage(string.format("Найден 3D текст \"%s\" в координатах %.2f %.2f %.2f, дистанция %.2f, id игрока %d, id транспорта %d", text, x, y, z, distance, player, vehicle), color)
                    
        end
    end
end

function Search3Dtext(x, y, z, radius, patern)
    local text = ""
    local color = 0
    local posX = 0.0
    local posY = 0.0
    local posZ = 0.0
    local distance = 0.0
    local ignoreWalls = false
    local player = -1
    local vehicle = -1
    local result = false

    for id = 0, 2048 do
        if sampIs3dTextDefined(id) then
            local text2, color2, posX2, posY2, posZ2, distance2, ignoreWalls2, player2, vehicle2 = sampGet3dTextInfoById(id)
            if getDistanceBetweenCoords3d(x, y, z, posX2, posY2, posZ2) < radius then
                if string.len(patern) ~= 0 then
                    if string.match(text2, patern, 0) ~= nil then result = true end
                else
                    result = true
                end
                if result then
                    text = text2
                    color = color2
                    posX = posX2
                    posY = posY2
                    posZ = posZ2
                    distance = distance2
                    ignoreWalls = ignoreWalls2
                    player = player2
                    vehicle = vehicle2
                    radius = getDistanceBetweenCoords3d(x, y, z, posX, posY, posZ)
                end
            end
        end
    end

    return result, text, color, posX, posY, posZ, distance, ignoreWalls, player, vehicle
end
 

lorgon

Известный
656
271
Как эмулировать нажатие клавиши W? (Много раз надо нажать). Как проверить сижу ли я вообще в машине?