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

gfgfds2423

Участник
73
18
как зделать так чтобы при появления диалога с цифрами, эти цифры выводились в чат.
Lua:
require 'lib.moonloader'
local sampev = require 'samp.events'

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


function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
  
    sampAddChatMessage('%u',-1)
  
end
p.s мой код выводит странное число(4294967295), когда появляеться любой диалог
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,482
как проигнорировать сообщения скрипта?
Нужно работать со структурой чата.

как зделать так чтобы при появления диалога с цифрами, эти цифры выводились в чат.
Lua:
require 'lib.moonloader'
local sampev = require 'samp.events'

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


function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
 
    sampAddChatMessage('%u',-1)
 
end
p.s мой код выводит странное число(4294967295), когда появляеться любой диалог
Lua:
local sampev = require 'samp.events'

function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
    for number in text:gmatch('%d+') do
        sampAddChatMessage(number,-1)
    end
end
 
  • Нравится
Реакции: sanders и gfgfds2423

gfgfds2423

Участник
73
18
Посоветуйте какой скрипт написать. Надо простой и полезный, у меня идей нету.
 

Double Tap Inside

Известный
Проверенный
1,898
1,253
Как получить позицию пркокрутки диалога и установить её?
Потому что sampSetCurrentDialogListItem курсор ставит в нужную строчку, но окно даже к той строке не прокручивается.
sa-mp-032.png
 

ГОХА | GoxaShow

В АРМИИ С 12.12,ЗАКАЗЫ НЕ ДЕЛАЮ,ТУПЫЕ ВОПРОСЫ-НАХУ
Проверенный
1,866
1,866
вопрос по json, хочу сделать привязку по айпи, но скрипт крашится, хуй пойми изза чего, вот код
Lua:
function checkip()
local result, response = pcall(request.get, "http://ip-api.com/json/")
    if response then
        local lastip = decodeJson(response)["query"]
        if lastip ~= "800.555.35.35" then
        --..
        end
    end
end
 

Refraktor

Известный
137
72
почему у меня ничего не подсвечивается в коде?
FI0oy.png
1. "Atom" — лагающий кусок дерьма из-за того что написан на Node.js а не C++. Юзай норм редактор.
2. Если мазохист, снизу справа вместо "Plain Text" укажи "Lua", если доступно. Вообще редактор должен сам подхватывать синтаксис и подсвечивать. Ну тут опять же первый пункт.
Некоторые проекты отображают id игрока. Лучше бы уточнил
Ну я думаю он сам поймёт, когда увидит Vasya_Pupkin[228][228].
Как получить позицию пркокрутки диалога и установить её?
Потому что sampSetCurrentDialogListItem курсор ставит в нужную строчку, но окно даже к той строке не прокручивается.
Посмотреть вложение 38572
Эмулируй нажатия клавиш вместо sampSetCurrentDialogListItem. Просто стрелочку вниз на сколько тебе надо пунктов кликай скриптом.
 
  • Ха-ха
Реакции: FBenz

rafion

Новичок
5
0
ребят, что не так делаю? в итоге должно крашить игру
1:
function main()
    repeat wait(0) until isSampAvailable()
    wait(2000)
    if testCheat("LOL") then
    script:reload()
end
end
 

FBenz

Активный
328
40
Если вырубить курсор имгуи, а окно оставить открытым, то элементы в центре экрана (кнопки, хеддеры итд) будут выделены, будто на них навели курсором.
Связано, думаю, с тем, что вырубленный курсор становится невидимым и находится по центру экрана. Можно ли это пофиксить?

Другими словами, мне нужно вырубить взаимодействие с открытым окном имгуи при выключенном курсоре
Все еще актуально
 
  • Нравится
Реакции: Double Tap Inside

S-Sirius

Известный
353
21
Что тут не так?? Вкладки диалога иногда работают, иногда нет
Lua:
function secondThread()
    local resultMain, buttonMain, listMain = sampHasDialogRespond(154)
    if resultMain == true then
      if buttonMain == 1 then
        if listMain == 0 then
            if chathelper == true then
                chathelper = false
                sampfuncsLog("* ChatIndicator OFF!")
                sampAddChatMessage("* Apollon: {ffffff}Chat Indicator выключён",0x0088ff)
                chathelper_state = '{FF0000} Выключен'
            else
                chathelper = true
                sampfuncsLog("* ChatIndicator ON!")
                sampAddChatMessage("* Apollon: {ffffff}Chat Indicator включён",0x0088ff)
                chathelper_state = '{00FF00} Включен'
            end
        end
        if listMain == 1 then
            if fpsshow == true then
                fpsshow = false
                sampfuncsLog("* FPS Indicator OFF!")
                sampAddChatMessage("* Apollon: {ffffff}FPS Indicator выключён",0x0088ff)
                fps_state = '{FF0000} Выключен'
            else
                fpsshow = true
                sampfuncsLog("* FPS Indicator ON!")
                sampAddChatMessage("* Apollon: {ffffff}FPS Indicator включён",0x0088ff)
                fps_state = '{00FF00} Включен'
            end
        end
        if listMain == 2 then
          if hphud == true then
            hphud = false
            sampfuncsLog("* HP Indicator OFF!")
            sampAddChatMessage("* Apollon: {ffffff}HP Indicator выключён",0x0088ff)
            hphud_state = '{FF0000} Выключен'
          else
            hphud = true
            sampfuncsLog("* HP Indicator ON!")
            sampAddChatMessage("* Apollon: {ffffff}HP Indicator включён",0x0088ff)
            hphud_state = '{00FF00} Включен'
          end
        end
        if listMain == 3 then
          if hp2hud == true then
            hp2hud = false
            sampfuncsLog("* 160 HP Indicator OFF!")
            sampAddChatMessage("* Apollon: {ffffff}160 HP Indicator выключён",0x0088ff)
            hphud_state2 = '{FF0000} Выключен'
          else
            hp2hud = true
            sampfuncsLog("* 160 HP Indicator ON!")
            sampAddChatMessage("* Apollon: {ffffff}160 HP Indicator включён",0x0088ff)
            hphud_state2 = '{00FF00} Включен'
          end
        end
        if listMain == 4 then
        if armhud == true then
            armhud = false
            sampfuncsLog("* Armour Indicator OFF!")
            sampAddChatMessage("* Apollon: {ffffff}Armour Indicator выключён",0x0088ff)
            armhud_state = '{FF0000} Выключен'
        else
            armhud = true
            sampfuncsLog("* Armour Indicator ON!")
            sampAddChatMessage("* Apollon: {ffffff}Armour Indicator включён",0x0088ff)
            armhud_state = '{00FF00} Включен'
        end
        if listMain == 5 then
        sampAddChatMessage("* Apollon: {ffffff}Из за нагрузки диалоговое окно может не запускатся с первого раза. Если окно не запускался, пожалуйста попробуйте снова.",0x0088ff)
            local help = [[
{ffffff}  {0088ff}__________________________________________________________________________________________________________ {ffffff}
{0088ff}
{0088ff}SA:MP Indicators{ffffff} - Скрипт в базе Lua, который даёт возможность посмотреть свой HP, уровень броня так же поиощник чата.
{ffffff}
{ffffff}      •     {0088ff}/igelp{ffffff} - информация.     
{ffffff}      •     {0088ff}/ireload {ffffff} - перезагрузка скрипта.               
{ffffff}      •     {0088ff}/indicators{ffffff} - Меню скрипта                                                 
{0088ff}   
{ffffff}  {0088ff}__________________________________________________________________________________________________________ {ffffff}
            ]]
                sampShowDialog(155, "Что я могу делать?", help, "*", "", 0)
        end
        end
     end
    end
 end


function toghmenu()
    sampShowDialog(154, "Панель индикаторов", string.format("{00ffd5}Chat Indicator: {cccccc}[ %s {cccccc}]\n{00ffd5}FPS Indicator: {cccccc}[ %s {cccccc}]\n{00ffd5}HP Indicator[100]: {cccccc}[ %s {cccccc}]\n{00ffd5}HP Indicator[160]: {cccccc}[ %s {cccccc}]\n{00ffd5}Armour Indicator: {cccccc}[ %s {cccccc}]\n{000018}Информация(Список команд)", chathelper_state, fps_state, hphud_state, hphud_state2, armhud_state), "Выбрать", "Отмена", 2)
end
 

wulfandr

Известный
637
260
Что тут не так?? Вкладки диалога иногда работают, иногда нет
Lua:
function secondThread()
    local resultMain, buttonMain, listMain = sampHasDialogRespond(154)
    if resultMain == true then
      if buttonMain == 1 then
        if listMain == 0 then
            if chathelper == true then
                chathelper = false
                sampfuncsLog("* ChatIndicator OFF!")
                sampAddChatMessage("* Apollon: {ffffff}Chat Indicator выключён",0x0088ff)
                chathelper_state = '{FF0000} Выключен'
            else
                chathelper = true
                sampfuncsLog("* ChatIndicator ON!")
                sampAddChatMessage("* Apollon: {ffffff}Chat Indicator включён",0x0088ff)
                chathelper_state = '{00FF00} Включен'
            end
        end
        if listMain == 1 then
            if fpsshow == true then
                fpsshow = false
                sampfuncsLog("* FPS Indicator OFF!")
                sampAddChatMessage("* Apollon: {ffffff}FPS Indicator выключён",0x0088ff)
                fps_state = '{FF0000} Выключен'
            else
                fpsshow = true
                sampfuncsLog("* FPS Indicator ON!")
                sampAddChatMessage("* Apollon: {ffffff}FPS Indicator включён",0x0088ff)
                fps_state = '{00FF00} Включен'
            end
        end
        if listMain == 2 then
          if hphud == true then
            hphud = false
            sampfuncsLog("* HP Indicator OFF!")
            sampAddChatMessage("* Apollon: {ffffff}HP Indicator выключён",0x0088ff)
            hphud_state = '{FF0000} Выключен'
          else
            hphud = true
            sampfuncsLog("* HP Indicator ON!")
            sampAddChatMessage("* Apollon: {ffffff}HP Indicator включён",0x0088ff)
            hphud_state = '{00FF00} Включен'
          end
        end
        if listMain == 3 then
          if hp2hud == true then
            hp2hud = false
            sampfuncsLog("* 160 HP Indicator OFF!")
            sampAddChatMessage("* Apollon: {ffffff}160 HP Indicator выключён",0x0088ff)
            hphud_state2 = '{FF0000} Выключен'
          else
            hp2hud = true
            sampfuncsLog("* 160 HP Indicator ON!")
            sampAddChatMessage("* Apollon: {ffffff}160 HP Indicator включён",0x0088ff)
            hphud_state2 = '{00FF00} Включен'
          end
        end
        if listMain == 4 then
        if armhud == true then
            armhud = false
            sampfuncsLog("* Armour Indicator OFF!")
            sampAddChatMessage("* Apollon: {ffffff}Armour Indicator выключён",0x0088ff)
            armhud_state = '{FF0000} Выключен'
        else
            armhud = true
            sampfuncsLog("* Armour Indicator ON!")
            sampAddChatMessage("* Apollon: {ffffff}Armour Indicator включён",0x0088ff)
            armhud_state = '{00FF00} Включен'
        end
        if listMain == 5 then
        sampAddChatMessage("* Apollon: {ffffff}Из за нагрузки диалоговое окно может не запускатся с первого раза. Если окно не запускался, пожалуйста попробуйте снова.",0x0088ff)
            local help = [[
{ffffff}  {0088ff}__________________________________________________________________________________________________________ {ffffff}
{0088ff}
{0088ff}SA:MP Indicators{ffffff} - Скрипт в базе Lua, который даёт возможность посмотреть свой HP, уровень броня так же поиощник чата.
{ffffff}
{ffffff}      •     {0088ff}/igelp{ffffff} - информация.    
{ffffff}      •     {0088ff}/ireload {ffffff} - перезагрузка скрипта.              
{ffffff}      •     {0088ff}/indicators{ffffff} - Меню скрипта                                                
{0088ff}  
{ffffff}  {0088ff}__________________________________________________________________________________________________________ {ffffff}
            ]]
                sampShowDialog(155, "Что я могу делать?", help, "*", "", 0)
        end
        end
     end
    end
end


function toghmenu()
    sampShowDialog(154, "Панель индикаторов", string.format("{00ffd5}Chat Indicator: {cccccc}[ %s {cccccc}]\n{00ffd5}FPS Indicator: {cccccc}[ %s {cccccc}]\n{00ffd5}HP Indicator[100]: {cccccc}[ %s {cccccc}]\n{00ffd5}HP Indicator[160]: {cccccc}[ %s {cccccc}]\n{00ffd5}Armour Indicator: {cccccc}[ %s {cccccc}]\n{000018}Информация(Список команд)", chathelper_state, fps_state, hphud_state, hphud_state2, armhud_state), "Выбрать", "Отмена", 2)
end
Сделай на ImGui менюшку, очень крутая тема, и учить-то особо не нужно, главное понимать...