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

BUTCH!

Известный
20
1
Я, конечно, не эксперт, но причём тут Shift + Numpad7, когда в ТЗ шла речь об Alt + Numpad7?
Уверен, что сама панель Numpad активна? Может быть, загвоздка в регулярных выражениях, и они слегка неправильно составлены (зачем экранировать пустоту после кавычек?)?
Опечатался*

Без активации скрипт то работает, вот в чем дело
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,891
1,254
Как получить в чат HEX цвет никнейма игрока, в которого целишься?
Lua:
result, ped = getCharPlayerIsTargeting(PLAYER_PED)
if result then
 sampAddChatMessage(color2hex(sampGetPlayerColor(select(2, sampGetPlayerIdByCharHandle(ped)))), -1)
end

function color2hex(arg)
 return string.sub(string.format('%x', arg), 3)
end
 
  • Нравится
Реакции: Dmitriy Makarov

BIG BOG

Известный
654
141
Как можно рассчитать скорости по осям для того, чтобы от меня отправить тачку к другому человеку(типо стрельбы машинами)
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
Как сделать такую штуку, тип
В чат выводится сообщение вида: "У вас закончились лекарства, возьмите их на складе"
А скрипт замечал это сообщение и можно было какую-либо отыгровку сделать?
Lua:
local sampev = require 'lib.samp.events'


function sampev.onServerMessage(color, text)
    if text:find("Твой текст, который нужно искать") then
    lua_thread.create(function()
    wait(10)
    sampSendChat("/me отыгровка")
    end)
    end
end
 
  • Влюблен
Реакции: XCIDE

sadbones

Известный
375
175
Хотел бы еще узнать.
Вот как реализовать такую штукенцию, чтобы например данные брались из цвета ника человека, на которого я навожусь и записывались в какую-либо переменную, чтобы скрипт определял, кто перед ним стоит вояка или мент и назначал ему цену
Команда на сервере /medhelp id цена
Ну и как доставать ид человека, на которого наведен?
Заранее спасибо, если не захочешь отвечать - пойму.
Лучше по скину искать, а не по цвету ника, имхо.
И для всего этого есть https://blast.hk/wiki/start
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
Хотел бы еще узнать.
Вот как реализовать такую штукенцию, чтобы например данные брались из цвета ника человека, на которого я навожусь и записывались в какую-либо переменную, чтобы скрипт определял, кто перед ним стоит вояка или мент и назначал ему цену
Команда на сервере /medhelp id цена
Ну и как доставать ид человека, на которого наведен?
Заранее спасибо, если не захочешь отвечать - пойму.
Lua:
-- Бесконечный цикл
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
            if valid and doesCharExist(ped) then
            local result, id = sampGetPlayerIdByCharHandle(ped)
            local color = sampGetPlayerColor(id)
                if result and isKeyJustPressed(VK_1) then -- Получение цвета
                    sampAddChatMessage("Цвет: "..color, -1)
                elseif result and isKeyJustPressed(VK_2) and color == 1234567 then -- Вместо цифр - цифры цвета, которых ты получил
                -- Если цвет равен "", тогда..
                -- code
                end
            end
 
  • Влюблен
Реакции: XCIDE

astynk

Известный
Проверенный
742
530
Как можно рассчитать скорости по осям для того, чтобы от меня отправить тачку к другому человеку(типо стрельбы машинами)
Взято из рванки от криптона:
Lua:
function event.onSendUnoccupiedSync(data)
    if state then
        local _, veh = sampGetCarHandleBySampVehicleId(data.vehicleId)
        data.position.x, data.position.y, data.position.z = getCarCoordinates(veh)
        local cx, cy, cz = getActiveCameraCoordinates()
        local tx, ty, tz = getActiveCameraPointAt()
        local angle = getHeadingFromVector2d(tx - cx, ty - cy)
        movespeed = not movespeed
        if movespeed then
            data.moveSpeed.x, data.moveSpeed.y, data.moveSpeed.z = math.sin(-math.rad(angle)) * speed, math.cos(-math.rad(angle)) * speed, -0.1
        else
            data.moveSpeed.x, data.moveSpeed.y, data.moveSpeed.z = math.sin(-math.rad(angle)) / 3.5, math.cos(-math.rad(angle)) / 3.5, -0.1
        end
    end
end
Здесь тачка двигается по направлению камеры. Чтобы кинуть тачку в игрока, скорее всего, понадобится подставить свои координаты и жертвы (не проверял).
 

damag

Женюсь на официантке в моем любимом баре
Проверенный
1,152
1,192
Каким образом можно открыть cmd строку и ввести туда что-то, на луа конечно же?
 

Setkh

Участник
74
6
Написал скрипт, он отлично работает, выполняет все действия как должен, НО!
При запуске игры он не запускается, он начинает работать только после того как нажмешь CTRL+R.
С чем это может быть связано?
 

fistforflirt

Участник
46
2
Lua:
local sampev = require 'lib.samp.events'

function sampev.onShowDialog(id, style, title, b1, b2, text)
    sampAddChatMessage(id, -1)
end
спасибо всплывающий вопрос, библиотеку сам ивентс где можно найти? Если у меня ее нету или она идет как нужное ПО при установке мунлодера?
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
Мой вопрос:
Есть код получения своего ника, но он неправильно работает при заходе в игру
Lua:
-- main
_, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
    mynick = sampGetPlayerNickname(myid)
   
-- использование в скрипте
sampGetPlayerNickname(myid):gsub('_', ' ')
При заходе в игру когда пытаюсь получить свой ник в чат, пишет никнейм игрока с 0 id, после перезагрузки всех скриптов с CTRL + R, все нормально и я получаю свой ник
С чем это может конфликтовать?
спасибо всплывающий вопрос, библиотеку сам ивентс где можно найти? Если у меня ее нету или она идет как нужное ПО при установке мунлодера?
Точно хз, если у тебя в папке moonloader > lib есть папка samp и в ней event, то не нужно устанавливать
47953
 

Eugene Crabs

Активный
544
30
Написал скрипт, он отлично работает, выполняет все действия как должен, НО!
При запуске игры он не запускается, он начинает работать только после того как нажмешь CTRL+R.
С чем это может быть связано?
Делай проверку на запуск сампа. Лови мой стандарт, должно помочь:
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(0) end
-- Код
    wait(-1)
end

Мой вопрос:
Есть код получения своего ника, но он неправильно работает при заходе в игру
Lua:
-- main
_, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
    mynick = sampGetPlayerNickname(myid)
  
-- использование в скрипте
sampGetPlayerNickname(myid):gsub('_', ' ')
При заходе в игру когда пытаюсь получить свой ник в чат, пишет никнейм игрока с 0 id, после перезагрузки всех скриптов с CTRL + R, все нормально и я получаю свой ник
С чем это может конфликтовать?
Полный код бы. У меня подобная штука вродь работала, только у меня был не "PLAYER_PED", а "playerPed". Ну и да, может тоже ожидания прогрузки нету, но тут хз.