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

qdIbp

Автор темы
Проверенный
1,387
1,142
Код, который тебе скинули, в бесконечный цикл в мейн засунь
Ааа бл я думаю что не так у меня внимание сосредоточено на его *говнокоде*
А где этот *говнокод* находится не обратил внимания
Все надо кушать орешки мозгУ развивать
 

percheklii

Известный
733
269
Как удалить текст (galaxy-rpg.online, p.s не реклама) из TextDraw'a оставив только дату?
 

Вложения

  • Безымянный.png
    Безымянный.png
    30.3 KB · Просмотры: 37

YarikVL

Известный
Проверенный
4,797
1,813
Как удалить текст (galaxy-rpg.online, p.s не реклама) из TextDraw'a оставив только дату?
Берёшь весь этот текст ( текст этот в data.text ), вытягиваешь регуляркой дату, примерно так:
if data.text:find("Text: galaxy-rpg%.online (%d+)") then
dats = data.text:match("Text: galaxy-rpg%.online (%d+)")
Задаёшь значение: data.text = "Text: "..dats ––вот тут точно не помню будет ли работать
И потом возвращаешь таблицу data с заменённым значением так: return {id, data}
Думаю понятно объяснил
 

kizn

О КУ)))
Всефорумный модератор
2,405
2,058
if data.text:find("Text: galaxy-rpg%.online (%d+)") then
dats = data.text:match("Text: galaxy-rpg%.online (%d+)")
1657742828885.png

тебе бы перед ответом на вопрос проверять код свой сначала

ну и помимо того что при правильном экранировании оно выведет только первое число из даты, ты не экранировал минус в match, поэтому оно выведет nil
 
  • Нравится
  • Грустно
Реакции: YarikVL и memir

kizn

О КУ)))
Всефорумный модератор
2,405
2,058
Как удалить текст (galaxy-rpg.online, p.s не реклама) из TextDraw'a оставив только дату?
Lua:
local SE = require("samp.events")

function SE.onShowTextDraw(id, data)
    local match = data.text:match("~w~galaxy%-rpg%.online~n~(.+)")
    if match then
        data.text = match
        return {id, data}
    end
end
 
  • Нравится
Реакции: percheklii

kizn

О КУ)))
Всефорумный модератор
2,405
2,058
Как только ввел пароль, выдало такое, и текстдрав не отображается.
Warning: ignoring large TextDraw size=11827
Lua:
local SE = require("samp.events")

function SE.onShowTextDraw(id, data)
    local match = data.text:match("~w~galaxy%-rpg%.online~n~(.+)")
    if match then
        print(match)
        data.text = match
        return {id, data}
    end
end

скинь что выведет в moonloader.log (или в консоль если у тебя есть SF Integration) после того как ткестдрав появляется
 
  • Нравится
Реакции: percheklii

percheklii

Известный
733
269
Lua:
local SE = require("samp.events")

function SE.onShowTextDraw(id, data)
    local match = data.text:match("~w~galaxy%-rpg%.online~n~(.+)")
    if match then
        print(match)
        data.text = match
        return {id, data}
    end
end

скинь что выведет в moonloader.log (или в консоль если у тебя есть SF Integration) после того как ткестдрав появляется
ничего не пишет в moonloader.log и в консоле
 

kizn

О КУ)))
Всефорумный модератор
2,405
2,058
Как только ввел пароль, выдало такое, и текстдрав не отображается.
Warning: ignoring large TextDraw size=11827
1657745034916.png

Lua:
local SE = require("samp.events")

function SE.onShowTextDraw(id, data)
    local match = data.text:match("~w~galaxy%-rpg%.online~n~(.+)")
    if match then
        data.text = match
        return {id, data}
    end
end

все работает
 
  • Нравится
Реакции: percheklii

percheklii

Известный
733
269
Последнее редактирование:

coderko61

Участник
55
0
Lua:
        for _, v in pairs(getAllObjects()) do
            if isObjectOnScreen(v) then
                local model = getObjectModel(v)
                local _, x, y, z = getObjectCoordinates(v)
                local x1, y1 = convert3DCoordsToScreen(x,y,z)
                local x2,y2,z2 = getCharCoordinates(PLAYER_PED)
                local x10, y10 = convert3DCoordsToScreen(x2,y2,z2)
                local distance = string.format("%.0f", getDistanceBetweenCoords3d(x, y, z, x2, y2, z2))
                if model == 331 or model == 334 or model == 336 or model == 347 or model == 348 or model == 349 or model == 350 or model == 353 or model == 355 or model == 356 or model == 357 or model == 358 or model == 365 then
                    if tonumber(distance) > 1 then
                        renderFontDrawText(font, '{ff0000}Вооружен! '..'['..distance..']', x1, y1, -1)
                        renderDrawLine(x10, y10, x1, y1, 5.0, 0xff0000)
                    end
                end
                
            end
        end

хочу получить информацию, есть ли оружие в руках персонажей. многое перепробовал, работает только на объектах интерьеров.
 

T1cKz

Известный
596
246
как экранировать '/' в регулярке? XD

Lua:
        for _, v in pairs(getAllObjects()) do
            if isObjectOnScreen(v) then
                local model = getObjectModel(v)
                local _, x, y, z = getObjectCoordinates(v)
                local x1, y1 = convert3DCoordsToScreen(x,y,z)
                local x2,y2,z2 = getCharCoordinates(PLAYER_PED)
                local x10, y10 = convert3DCoordsToScreen(x2,y2,z2)
                local distance = string.format("%.0f", getDistanceBetweenCoords3d(x, y, z, x2, y2, z2))
                if model == 331 or model == 334 or model == 336 or model == 347 or model == 348 or model == 349 or model == 350 or model == 353 or model == 355 or model == 356 or model == 357 or model == 358 or model == 365 then
                    if tonumber(distance) > 1 then
                        renderFontDrawText(font, '{ff0000}Вооружен! '..'['..distance..']', x1, y1, -1)
                        renderDrawLine(x10, y10, x1, y1, 5.0, 0xff0000)
                    end
                end
              
            end
        end

хочу получить информацию, есть ли оружие в руках персонажей. многое перепробовал, работает только на объектах интерьеров.
Если оружие на теле игрока
Lua:
bool result = isObjectAttached(Object object)
А вообще, если именно в руках оружие, то нужно перебирать игроков, а не объекты, т.к. в руке у перса не объект, а именно оружие
Lua:
local int = getCurrentCharWeapon(Ped ped)
ID оружий думаю прогуглить сможешь

На фотографии видно серверный текстдрав, он прозрачный, как мне изенить его цвет на белый, сделал ещё больше прозрачней? Текстдрав без текста, обычный он, просто заменить его другим цветом и сделать прозрачнее
лучше делай через рендеры, больше возможностей, меньше багов
 
Последнее редактирование:

Anti...

Участник
252
24
как экранировать '/' в регулярке? XD


Если оружие на теле игрока
Lua:
bool result = isObjectAttached(Object object)
А вообще, если именно в руках оружие, то нужно перебирать игроков, а не объекты, т.к. в руке у перса не объект, а именно оружие
Lua:
local int = getCurrentCharWeapon(Ped ped)
ID оружий думаю прогуглить сможешь


лучше делай через рендеры, больше возможностей, меньше багов
что за рендеры? мне команда нужна текстдрава на изменение его фона и прозрачности (НЕ ТЕКСТАБ фона)