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

no3jour

Участник
55
0
Помогите сделать сохранение клавиши ибо при смене клавиши её сохраняет в виде - table: 0x080d1bb8
PHP:
      if imgui.HotKey("##active", ActiveMenu, tLastKeys, 100) then
        rkeys.changeHotKey(bindID, ActiveMenu.v)
        scriptConfig.inputs.ActiveMenu = ActiveMenu.v 
        inicfg.save(scriptConfig, script_patch_config)
        sampAddChatMessage("Успешно! Старое значение: " .. table.concat(rkeys.getKeysName(tLastKeys.v), " + ") .. " | Новое: " .. table.concat(rkeys.getKeysName(ActiveMenu.v), " + "), -1)
      end
 

Dmitriy Makarov

25.05.2021
Проверенный
2,481
1,113
Как сделать проверку на то, что ты держишь в руке оружие определенное кол-во времени
И если N'ое кол-во времени ты держал оружие в руке, то происходит действие.
P.S: Обычно, когда делаю проверку на оружие в руках и делаю отыгровку, то если быстро скроллить в руке оружие, то кикает из-за флуда отыгровки. Чтобы такого не было, хочу сделать проверку, что если я держал какое-то оружие в руке N'ое кол-во времени, то только тогда происходит отыгровка
 

frit

Известный
389
174
Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
    if text:find("Администратор% (%w+.%w+)%[(%d+)%]% забанил игрока% (%w+.%w+)%[(%d+)%]%на % (%w+.%w+)% дней.") then
        local nickadm, admid, nick, id, days = text:match("Администратор% (%w+.%w+)%[(%d+)%]% забанил игрока% (%w+.%w+)%[(%d+)%]%на % (%w+.%w+)% дней.")
    end
end
local f="C:\\checker\\1.txt"
local fwrite
fwrite = io.open(f, "a")
fwrite:write(nick.. "забанен на ".. days)
fwrite:close()

что не так?
должен выводить в файл игрока, которого забанили.
 

McLore

Известный
559
279
Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
    if text:find("Администратор% (%w+.%w+)%[(%d+)%]% забанил игрока% (%w+.%w+)%[(%d+)%]%на % (%w+.%w+)% дней.") then
        local nickadm, admid, nick, id, days = text:match("Администратор% (%w+.%w+)%[(%d+)%]% забанил игрока% (%w+.%w+)%[(%d+)%]%на % (%w+.%w+)% дней.")
    end
end
local f="C:\\checker\\1.txt"
local fwrite
fwrite = io.open(f, "a")
fwrite:write(nick.. "забанен на ".. days)
fwrite:close()

что не так?
должен выводить в файл игрока, которого забанили.
Вроде косяк в регулярки, на % (%w+.%w+)% дней.")
"Администратор% (%w+.%w+)%[%\d+)%]% забанил игрока% (%w+.%w+)%[(%d+)%]% на% (%d+)% дней. Причина:(.*)"
 
  • Нравится
Реакции: frit

Alkamal

Новичок
23
2
Как сделать проверку на то, что ты держишь в руке оружие определенное кол-во времени
И если N'ое кол-во времени ты держал оружие в руке, то происходит действие.
P.S: Обычно, когда делаю проверку на оружие в руках и делаю отыгровку, то если быстро скроллить в руке оружие, то кикает из-за флуда отыгровки. Чтобы такого не было, хочу сделать проверку, что если я держал какое-то оружие в руке N'ое кол-во времени, то только тогда происходит отыгровка
Как вариант могу предложить запустить wait(), после которого проверяешь, оружие всё ещё в руке или нет.
 

Deniska.lua

Участник
43
0
Лично я делал так)
Lua:
if(isCurrentCharWeapon(playerPed, deagleID) and deagle == false) then
    sampSendChat("/me лёгким движением руки достал DEagle из кобуры")
    deagle = true
end
if(isCurrentCharWeapon(playerPed, deagleID) == false and deagle == true) then
    sampSendChat("/me поставив DEagle на предохранитель, засунул его в кобуру")
    deagle = false
end
Не работает(
Не работает(
 

Mr_Incognito

Активный
331
50
Как кликнуть на второй слот в инвентаре АРЗ РП? Текстдравы меняются очень часто, надоело менять иды.
 

ГОХА | GoxaShow

В АРМИИ С 12.12,ЗАКАЗЫ НЕ ДЕЛАЮ,ТУПЫЕ ВОПРОСЫ-НАХУ
Проверенный
1,873
1,867
Привет, как сделать,чтобы бот бежал сначала на одни координаты, как добежал на другие,и так раз 5?
 

niki4

Участник
92
10
Привет, как сделать,чтобы бот бежал сначала на одни координаты, как добежал на другие,и так раз 5?
сделать проверку находится ли на нужных координатах. Если подходит по условиям, то бежит на другие корды
 
  • Нравится
Реакции: dolphin_aye

Alkamal

Новичок
23
2
Не работает(

Не работает(

Ты мб его просто взял и скопировал в пустой файл)
Если так, то вот готовый уже код
Только мой вариант флудит, я не заморачивался по этому поводу

Lua:
require "lib.moonloader"

local activated = false
local playerid
local name

local deagle = false
local m4 = false
local rifle = false
local sRifle = false

local deagleID = 24
local m4ID = 31
local rifleID = 33
local sRifleID = 34

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    while true do
        wait(0)
        wRolePlay()
    end
end

function wRolePlay(arg)
    --Desert Eagle
    if(isCurrentCharWeapon(playerPed, deagleID) and deagle == false) then
        sampSendChat("/me лёгким движением руки достал DEagle из кобуры")
        deagle = true
    end
    if(isCurrentCharWeapon(playerPed, deagleID) == false and deagle == true) then
        sampSendChat("/me поставив DEagle на предохранитель, засунул его в кобуру")
        deagle = false
    end
    --M4
    if(isCurrentCharWeapon(playerPed, m4ID) and m4 == false) then
        sampSendChat("/me резким движением достал карабин M4 из-за спины и снял с предохранителя")
        m4 = true
    end
    if(isCurrentCharWeapon(playerPed, m4ID) == false and m4 == true) then
        sampSendChat("/me поставил карабин M4 на предохранитель и закинул за спину")
        m4 = false
    end
    --Rifle
    if(isCurrentCharWeapon(playerPed, rifleID) and rifle == false) then
        sampSendChat("/me взяв в руки винтовку Rifle, снял её с предохранителя")
        rifle = true
    end
    if(isCurrentCharWeapon(playerPed, rifleID) == false and rifle == true) then
        sampSendChat("/me поставил на предохранитель винтовку и спрятал за спину")
        rifle = false
    end
    --SniperRifle
    if(isCurrentCharWeapon(playerPed, sRifleID) and sRifle == false) then
        sampSendChat("/me взяв в руки винтовку Rifle, прикрутил снайперский прицел, после чего снял с предохранителя")
        sRifle = true
    end
    if(isCurrentCharWeapon(playerPed, sRifleID) == false and sRifle == true) then
        sampSendChat("/me снял прицел и поставил на предохранитель винтовку, после чего закинул её за спину")
        sRifle = false
    end
end
wait тут не получится юзать, через os делать надо
Спасибо, возьму на заметку)
 
Последнее редактирование:
  • Нравится
Реакции: dolphin_aye

Izvinisb

Известный
Проверенный
964
598
Как сделать проверку на то, что ты держишь в руке оружие определенное кол-во времени
И если N'ое кол-во времени ты держал оружие в руке, то происходит действие.
P.S: Обычно, когда делаю проверку на оружие в руках и делаю отыгровку, то если быстро скроллить в руке оружие, то кикает из-за флуда отыгровки. Чтобы такого не было, хочу сделать проверку, что если я держал какое-то оружие в руке N'ое кол-во времени, то только тогда происходит отыгровка
/igun
Lua:
local state = false
local time = os.clock()

function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('igun', function() state = not state
        if state then
            sampAddChatMessage('Включено', -1)
            lua_thread.create(function()
                while state do
                    wait(0)
                    local res, id = getgun()
                    if os.clock() - time > 7 and res then -- 7 sec.
                        sampSendChat('Отыгровка 1')
                        wait(2000)
                        sampSendChat('Отыгровка 2')
                        time = os.clock()
                        while getCurrentCharWeapon(1) == id do wait(0) end
                    end
                end
            end)
        else
            sampAddChatMessage('Выключено', -1)
        end
    end)
    wait(-1)
end

function getgun()
    for i = 1, 46 do -- 0 id кулак
        if getCurrentCharWeapon(1) == i then
            return true, i
        end
    end
    return false
end
 

Alkamal

Новичок
23
2
Такой вопрос:
Допустим есть объект и его превратили в текст. Тык (Вот такая штука)
Могу ли я из "этой штуки" достать текст?