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

ШPEK

Известный
1,474
525
Как?
Если что у меня это обновляемый текстдрав:

Lua:
    while on do
            wait(500)
            if not on then return end
            local res = new_distance*0.7
            local res2 = new_distance*0.001
            local res = math.floor(res)
            local res2 = res2-res2%0.01
            if not on then return end
            sampTextdrawDelete(false)
            sampTextdrawCreate(false, 'Distance: '..res2..'km Count: '..res..'$ '..waiting, tx, ty)
Lua:
local font = renderCreateFont("Arial", 10, 4)
while true do
  wait(0)
  local x, y = getScreenResolution()
  renderFontDrawText(font, "Hello world!", x / 2, y / 2, -1)
end
 

JustFedot

Известный
337
346
Lua:
local font = renderCreateFont("Arial", 10, 4)
while true do
  wait(0)
  local x, y = getScreenResolution()
  renderFontDrawText(font, "Hello world!", x / 2, y / 2, -1)
end
Всё работает но, текст твой мелькает ибо я его вызываю раз в пол секунды, мне просто надо обновлять инфу в тексте.
Я щас попробую сам разобраться, но буду признателен если поможешь.
 

JustFedot

Известный
337
346
Lua:
local font = renderCreateFont("Arial", 10, 4)
while true do
  wait(0)
  local x, y = getScreenResolution()
  renderFontDrawText(font, "Hello world!", x / 2, y / 2, -1)
end
Так, ну я встроил вот это к себе в скрипт, мне нравиться.
Вот только как-бы мне этот текст сделать больше, и сместить чуть чуть влево и вниз?
 

ШPEK

Известный
1,474
525
Так, ну я встроил вот это к себе в скрипт, мне нравиться.
Вот только как-бы мне этот текст сделать больше, и сместить чуть чуть влево и вниз?
Там где x / 2 и y / 2 это X и Y координаты, где функция renderCreateFont вторым параметром это размер
 

JustFedot

Известный
337
346
Там где x / 2 и y / 2 это X и Y координаты, где функция renderCreateFont вторым параметром это размер
Слушай, ну ты мой спаситель, он даже русский понимает!
123.jpg


Подскажи ещё вот что
Я сделал смещение вот так: rx / 2 - 450, ry / 2 + 300
Тоесть просто к координатам центра добавил или отнял координаты что-бы текст встал куда мне нужно.
На других разрешениях он тоже будет тут, или всётаки нет?
Если нет то как решить?

P.S. Терь это мой любимый метод вывода текста на экран ^_^
 
Последнее редактирование:

ШPEK

Известный
1,474
525
Слушай, ну ты мой спаситель, он даже русский понимает!
Посмотреть вложение 39452

Подскажи ещё вот что
Я сделал смещение вот так: rx / 2 - 450, ry / 2 + 300
Тоесть просто к координатам центра добавил или отнял координаты что-бы текст встал куда мне нужно.
На других разрешениях он тоже будет тут, или всётаки нет?
Если нет то как решить?
Допустим, ты рисуешь текст на 300 пикселе и разрешение экрана 1900. 300 делишь на 1900 и получаешь число 0,15789474 на которое потом умножаешь любое разрешение по X экрана и текст всегда будет на примерном месте. С Y так же
 
  • Нравится
  • Влюблен
Реакции: Eugene Crabs и JustFedot

Domino

Участник
326
15
Как сделать так,чтобы командой /3doff можно было бы убрать 3д текст. Не понимаю...
Lua:
function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand("3dtext", text)
    sampRegisterChatCommand("3doff", tex)

    wait(-1)
end
-- --
function text(arg)
    local a = "{ff7500}Л{ffeb00}Г{9cff00}Б{27ff00}Т {00ffc4}А{00c4ff}к{004eff}т{2700ff}и{9c00ff}в{ff00eb}и{ff0075}с{ff0000}т"
    id = arg
    sampAddChatMessage("Игрок с id "..id.. " помечен как "..a, -1)
sampCreate3dText(a, 0xFF3399FF, 0.0, 0.0, -0.5, 21, false, id, -1)
end
 

ШPEK

Известный
1,474
525
Как сделать так,чтобы командой /3doff можно было бы убрать 3д текст. Не понимаю...
Lua:
function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand("3dtext", text)
    sampRegisterChatCommand("3doff", tex)

    wait(-1)
end
-- --
function text(arg)
    local a = "{ff7500}Л{ffeb00}Г{9cff00}Б{27ff00}Т {00ffc4}А{00c4ff}к{004eff}т{2700ff}и{9c00ff}в{ff00eb}и{ff0075}с{ff0000}т"
    id = arg
    sampAddChatMessage("Игрок с id "..id.. " помечен как "..a, -1)
sampCreate3dText(a, 0xFF3399FF, 0.0, 0.0, -0.5, 21, false, id, -1)
end
Lua:
function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand("3dtext", text)
  sampRegisterChatCommand("3doff", tex)
  wait(-1)
end

function tex()
	if idof then
		sampDestroy3dText(idof)
		idof = nil
	end
end

function text(arg)
    if tonumber(arg) and not idof then
    	local a = "{ff7500}Л{ffeb00}Г{9cff00}Б{27ff00}Т {00ffc4}А{00c4ff}к{004eff}т{2700ff}и{9c00ff}в{ff00eb}и{ff0075}с{ff0000}т"
    	id = tonumber(arg)
    	sampAddChatMessage("Игрок с id "..id.. " помечен как "..a, -1)
		idof = sampCreate3dText(a, 0xFF3399FF, 0.0, 0.0, -0.5, 21, false, id, -1)
	end
end
 

Eugene Crabs

Активный
544
30
Ребят, в moonloadere есть ли функция, которая может мне вернуть кол-во определенных машин в зоне стрима?
 

Неадекватная сова

Известный
Проверенный
261
233
  • Нравится
Реакции: Eugene Crabs

Неадекватная сова

Известный
Проверенный
261
233
Не работает. Примера где-то на форуме нету? И да, сейчас свой код добавлю к этому сообщению
 

Eugene Crabs

Активный
544
30
Оба способа не работают. Если что - вот мой код.
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    if isKeyDown(17) and isKeyDown(84) then
        while isKeyDown(17) and isKeyDown(84) do wait(80) end
        local veh = getAllVehicles()
        for i = 1, #veh do sampAddChatMessage(i, veh[i]) end
    end
    wait(-1)
end

Lua:
print(#getAllVehicles())
Тоже самое, к сожалению.
 

VEN1LOV

Новичок
9
10
Оба способа не работают. Если что - вот мой код.
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    if isKeyDown(17) and isKeyDown(84) then
        while isKeyDown(17) and isKeyDown(84) do wait(80) end
        local veh = getAllVehicles()
        for i = 1, #veh do sampAddChatMessage(i, veh[i]) end
    end
    wait(-1)
end


Тоже самое, к сожалению.
Засунуть код в бесконечный цикл для слабаков же, наверное?
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        if isKeyDown(17) and isKeyDown(84) then
            while isKeyDown(17) and isKeyDown(84) do wait(80) end
            local veh = getAllVehicles()
            for i = 1, #veh do sampAddChatMessage(("%d - %d"):format(i, veh[i]), -1) end
        end
    end
end
 
  • Нравится
Реакции: Eugene Crabs