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

BARRY BRADLEY

Известный
711
176
мне надо сделать что бы допустим команда /bp 11 [если тут число не вписано после 11 то команда не будет работать] скажите плиз как это сделать?
Lua:
sampRegisterChatCommand("bp", function(number)
   if number ~= nil and number ~= "" then
      if tonumber(number) then
         -- если число
      else
         -- если агрумент не число
      end
   else
      -- Вывод что строка без аргумента (без /bp [аргумент])
   end
end)
 

Quasper

Известный
834
354
Кусь родные, и снова у меня не работает sampRegisterChatCommadnd

Весь код снизу, заранее грац :D​
Lua:
require "lib.moonloader"

local keys = require "vkeys"
local _, idp = sampGetPlayerIdByCharHandle(PLAYER_PED) -- узнаём id игрока..
local tag = "{FFFFFF}[7P Script]:{3BADFE} "
local mc = 0x3BADFE
local mct = '{FF216F}'
local wc = '{FFFFFF}'
local name = '"{FF2E2E}Arizona {FFFFFF}Helper"{3BADFE}'
local version = '0.1'


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("test", cmd_test)
    sampAddChatMessage(tag .. name .. "- активирован!!", mc)
    sampAddChatMessage(tag .. 'Версия скрипта - ' .. version, mc)
    while true do
        wait(0)
       
        if isKeyJustPressed(VK_L) then
            sampSendChat("/lock")
        end
       
        if isKeyDown(VK_I) and isKeyJustPressed(VK_D) then
            sampAddChatMessage(tag .. 'Ваш ID: {FFFFFF}' .. idp, mc)
        end
    end
function cmd_test(arg)
    if #arg == nil then
        sampAddChatMessage('Забыл аргумент!',0x3BADFE)
    else
        print('Грац!')
    end
end
end
Lua:
require "lib.moonloader"
local keys = require "vkeys" --[[если подключаешь библиотеку мунлоудера то не обязательно подключать
vkeys потому что он уже есть в муне]]
--[[local _, idp = sampGetPlayerIdByCharHandle(PLAYER_PED) вот на этом этапе у тебя крашил скрипт
потому что ты пытался воспользоваться функцией сампа еще до загрузки самого сампа, низя так]]
local tag = "{FFFFFF}[7P Script]:{3BADFE} "
local mc = 0x3BADFE
local mct = '{FF216F}'
local wc = '{FFFFFF}'
local name = '"{FF2E2E}Arizona {FFFFFF}Helper"{3BADFE}'
local version = '0.1'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("test", cmd_test)
    sampAddChatMessage(tag .. name .. "- активирован!!", mc)
    sampAddChatMessage(tag .. 'Версия скрипта - ' .. version, mc)
    while true do
        wait(0)
        if isKeyJustPressed(VK_L) then
            sampSendChat("/lock")
        end
        if isKeyDown(VK_I) and isKeyJustPressed(VK_D) then
        local result, idp = sampGetPlayerIdByCharHandle(PLAYER_PED)
            if result then
                sampAddChatMessage(tag .. 'Ваш ID: {FFFFFF}' .. idp, mc)
            else
                sampAddChatMessage(tag .. 'Не удалось получить ID', mc)
            end
        end
    end
end
function cmd_test(arg)
    if #arg == nil then
        sampAddChatMessage('Забыл аргумент!',0x3BADFE)
    else
        print('Грац!')
    end
end
 

Heymexaa

Новичок
1
0
Подскажите, как можно сделать такие звуки ?
Автор видео говорил, что как-то через moonloader 🤷‍♂️
 

Mr_Incognito

Активный
331
50
Подскажите пожалуйста, как выбрать пункт диалога не по номеру, а по названию? Возможно ли такое вообще?
 

Quasper

Известный
834
354
Подскажите пожалуйста, как выбрать пункт диалога не по номеру, а по названию? Возможно ли такое вообще?
создать переменную допустим индекс, циклом перебирать строки текста диалога, с каждой итерацией цикла плюсовать единицу к индексу и если найдено совпадение то слать нажатие на индекс(им же и будет пункт диалога)
 
  • Нравится
Реакции: Mr_Incognito

Sid_Ridley

Новичок
2
0
Есть у кого готовая функция перевода ARGB-цвета в HEX? Нужно цвет который возвращает функция sampGetPlayerColor,
переводить в HEX-цвет для дальнейшего использования в строке. К примеру "{FFFFFF} текст".
 

Quasper

Известный
834
354
Есть у кого готовая функция перевода ARGB-цвета в HEX? Нужно цвет который возвращает функция sampGetPlayerColor,
переводить в HEX-цвет для дальнейшего использования в строке. К примеру "{FFFFFF} текст".
color = ("%06x"):format(sampGetPlayerColor(id))
 
У

Удалённый пользователь 257775

Гость
Ку народ! У меня вообщем 2 вопроса, грац за помощь сразу.
1. есть ли какая-нибудь функция, которая автоматом нажимает на кнопку диалога?
2. скрипт сразу после загрузки сампа не активируется. Нужно жать Contral + r, и вот только тогда он включается, памагити :C
 

Quasper

Известный
834
354
Ку народ! У меня вообщем 2 вопроса, грац за помощь сразу.
1. есть ли какая-нибудь функция, которая автоматом нажимает на кнопку диалога?
2. скрипт сразу после загрузки сампа не активируется. Нужно жать Contral + r, и вот только тогда он включается, памагити :C
1) a) sampSendDialogResponse(int id, int button, int list_item, string input)
b) sampCloseCurrentDialogWithButton(int button)
2) Используешь функции сампа до его инициализации, поэтому твой скрипт крашится т.к функции еще не доступны.
Держи вики если ты еще не в курсе о нём
 
У

Удалённый пользователь 257775

Гость
1) a) sampSendDialogResponse(int id, int button, int list_item, string input)
b) sampCloseCurrentDialogWithButton(int button)
2) Используешь функции сампа до его инициализации, поэтому твой скрипт крашится т.к функции еще не доступны.
Держи вики если ты еще не в курсе о нём
Спасибо большое, насчёт первого помог!
А насчёт второго я вообще не уверен..
Можешь сделать видоизменить мой код, что-бы сразу после начала игры он работал?(( Про вики я кстати знал :D

Code:
--Arizona Helper v0.1
require "lib.moonloader"

local keys = require "vkeys"
local _, idp = sampGetPlayerIdByCharHandle(PLAYER_PED) -- узнаём id игрока..
local tag = "{FFFFFF}[7P Script]:{3BADFE} "
local mc = 0x3BADFE
local mct = '{FF216F}'
local wc = '{FFFFFF}'
local name = '"{FF2E2E}Arizona {FFFFFF}Helper"{3BADFE}'
local version = '0.1'
local sampev   = require 'lib.samp.events'


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    color = ("%06x"):format(sampGetPlayerColor(id))
    thread =
    sampRegisterChatCommand("cchat", cmd_cchat) -- регистрируем команду очистки чата
    sampAddChatMessage(tag .. name .. "- активирован!!",wc)
    sampAddChatMessage(tag .. 'Версия скрипта - ' .. version,wc)
    while true do
        wait(0)
      
        if isKeyJustPressed(VK_L) then
            sampSendChat("/lock")
        end
      
        if isKeyDown(VK_I) and isKeyJustPressed(VK_D) then -- узнаём свой ID
            sampAddChatMessage(tag .. 'Ваш ID: {FFFFFF}' .. idp, wc)
        end
        if isKeyDown(VK_E) and isKeyJustPressed(VK_Z) then -- ez - время
            sampAddChatMessage(tag .. "Время:", wc)
            sampSendChat("/time")
        end       
        if isKeyDown(VK_S) and isKeyDown(VK_M) and isKeyJustPressed(VK_K) then -- SMK - сигарета
            sampSendChat("/smoke")
        end       
        if isKeyDown(VK_A) and isKeyDown(VK_R) and isKeyJustPressed(VK_M) then  -- При нажатии ARM вы юзаете броник
            sampSendChat("/armour")
        end   
        if isKeyDown(VK_M) and isKeyDown(VK_S) and isKeyJustPressed(VK_K) then
            sampSendChat("/mask")
        end   
        
    end
end

function cmd_cchat()
        for i=1, 30 do
        sampAddChatMessage("", wc)
        end
end
function sampev.onSendChat(text)
    sampAddChatMessage(text, wc)
end
 

Quasper

Известный
834
354
Спасибо большое, насчёт первого помог!
А насчёт второго я вообще не уверен..
Можешь сделать видоизменить мой код, что-бы сразу после начала игры он работал?(( Про вики я кстати знал :D
Code:
--Arizona Helper v0.1
require "lib.moonloader"

local keys = require "vkeys"
--[[local _, idp = sampGetPlayerIdByCharHandle(PLAYER_PED) вот твоя неуверенность, до загрузки сампа ты пытался получить свой ID из за этого скрипт умирал]]
local tag = "{FFFFFF}[7P Script]:{3BADFE} "
local mc = 0x3BADFE
local mct = '{FF216F}'
local wc = '{FFFFFF}'
local name = '"{FF2E2E}Arizona {FFFFFF}Helper"{3BADFE}'
local version = '0.1'
local sampev   = require 'lib.samp.events'


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("cchat", cmd_cchat) -- регистрируем команду очистки чата
    sampAddChatMessage(tag .. name .. "- активирован!!",wc)
    sampAddChatMessage(tag .. 'Версия скрипта - ' .. version,wc)
    while not sampIsLocalPlayerSpawned() do wait(100) return end --[[делаем проверку на то заспавнен ли игрок потому что после доступности сампа твой локальный ид будет равен 0 и вот только потом получаем ID]]
    local _, idp = sampGetPlayerIdByCharHandle(PLAYER_PED)
    color = ("%06x"):format(sampGetPlayerColor(idp))
    while true do
        wait(0)
    
        if isKeyJustPressed(VK_L) then
            sampSendChat("/lock")
        end
    
        if isKeyDown(VK_I) and isKeyJustPressed(VK_D) then -- узнаём свой ID
            sampAddChatMessage(tag .. 'Ваш ID: {FFFFFF}' .. idp, wc)
        end
        if isKeyDown(VK_E) and isKeyJustPressed(VK_Z) then -- ez - время
            sampAddChatMessage(tag .. "Время:", wc)
            sampSendChat("/time")
        end     
        if isKeyDown(VK_S) and isKeyDown(VK_M) and isKeyJustPressed(VK_K) then -- SMK - сигарета
            sampSendChat("/smoke")
        end     
        if isKeyDown(VK_A) and isKeyDown(VK_R) and isKeyJustPressed(VK_M) then  -- При нажатии ARM вы юзаете броник
            sampSendChat("/armour")
        end 
        if isKeyDown(VK_M) and isKeyDown(VK_S) and isKeyJustPressed(VK_K) then
            sampSendChat("/mask")
        end 
      
    end
end

function cmd_cchat()
        for i=1, 30 do
        sampAddChatMessage("", wc)
        end
end
function sampev.onSendChat(text)
    sampAddChatMessage(text, wc)
end
 
У

Удалённый пользователь 257775

Гость
И снова добрый день, как узнать id кнопки? Если кто-то играл на аризоне, тот знает, что там после того как ты прописал /phone вылазит окошко с выбором телефона, так вот, я хочу, что-бы скрипт сам нажимал на кнопку ">>"
Code:
        if isKeyJustPressed(VK_P) then
            sampSendChat("/phone")
            sampCloseCurrentDialogWithButton(0)
        end
 

Thrill_Pill

Известный
315
108
Как получить координаты красной точки?
48464
 
D

deleted-user-204957

Гость
Как получить координаты красной точки?
Посмотреть вложение 48464
Lua:
function SearchMarker(posX, posY, posZ, radius, isRace)
    local ret_posX = 0.0
    local ret_posY = 0.0
    local ret_posZ = 0.0
    local isFind = false

    for id = 0, 31 do
        local MarkerStruct = 0
        if isRace then MarkerStruct = 0xC7F168 + id * 56
        else MarkerStruct = 0xC7DD88 + id * 160 end
        local MarkerPosX = representIntAsFloat(readMemory(MarkerStruct + 0, 4, false))
        local MarkerPosY = representIntAsFloat(readMemory(MarkerStruct + 4, 4, false))
        local MarkerPosZ = representIntAsFloat(readMemory(MarkerStruct + 8, 4, false))

        if MarkerPosX ~= 0.0 or MarkerPosY ~= 0.0 or MarkerPosZ ~= 0.0 then
            if getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ) < radius then
                ret_posX = MarkerPosX
                ret_posY = MarkerPosY
                ret_posZ = MarkerPosZ
                isFind = true
                radius = getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ)
            end
        end
    end

    return isFind, ret_posX, ret_posY, ret_posZ
end
Lua:
local res, x, y, z = SearchMarker(posX, posY, posZ, 50.0, false)
 
  • Нравится
Реакции: Thrill_Pill