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

FYP

Известный
Автор темы
Администратор
1,763
5,906
Какую таблицу возвращает getAllVehicle
обычную, с хэндлами всех существующих тачек.
как работает isCarModel?
принимает хэндл ТС и ид модели, возвращает результат проверки
Использую в onHevicleStreamIn, использую ид кара в качестве 1 аргумента. Чет не заходит.
машина создаётся после выполнения onVehicleStreamIn, создавай из эвента поток, передавай в него ид, в начале потока должен быть wait(0)
 

k0lenval

Известный
133
111
Кто-нибудь может объяснить почему скрипт вылетает с ошибкой?
cannot resume non-suspended coroutine
Script died due to error. (0885BAC4)

Что-то мне подсказывает, что это баг муна
Lua:
local mem = require "memory"
function main()
    repeat wait(100) until isSampAvailable()
    while true do
        wait(10)
        if testCheat("nop") then
            mem.setuint16(sampGetBase()+83680, 50064)
            mem.setuint16(sampGetBase()+88432, 50064)
        end
    end
end
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,468
Кто-нибудь может объяснить почему скрипт вылетает с ошибкой?
cannot resume non-suspended coroutine
Script died due to error. (0885BAC4)

Что-то мне подсказывает, что это баг муна
Lua:
local mem = require "memory"
function main()
    repeat wait(100) until isSampAvailable()
    while true do
        wait(10)
        if testCheat("nop") then
            mem.setuint16(sampGetBase()+83680, 50064)
            mem.setuint16(sampGetBase()+88432, 50064)
        end
    end
end
Перед записью нужно снять протекцию для участка памяти:
Lua:
local mem = require "memory"

function main()
    repeat wait(100) until isSampAvailable()
  
    local sampBase = sampGetBase()
    local firstAddress = sampBase+0x146E0
    local secondAddress = sampBase+0x15970
  
    while true do
        wait(10)
        if testCheat("nop") then
            local oldProtection = mem.unprotect(firstAddress, 2)
            mem.setuint16(firstAddress, 0xC390)
            mem.protect(firstAddress, 2, oldProtection)

            local oldProtection = mem.unprotect(secondAddress, 2)
            mem.setuint16(secondAddress, 0xC390)
            mem.protect(secondAddress, 2, oldProtection)
        end
    end
end
 
  • Нравится
Реакции: inf и k0lenval

k0lenval

Известный
133
111
Перед записью нужно снять протекцию для участка памяти:
Lua:
local mem = require "memory"

function main()
    repeat wait(100) until isSampAvailable()
 
    local sampBase = sampGetBase()
    local firstAddress = sampBase+0x146E0
    local secondAddress = sampBase+0x15970
 
    while true do
        wait(10)
        if testCheat("nop") then
            local oldProtection = mem.unprotect(firstAddress, 2)
            mem.setuint16(firstAddress, 0xC390)
            mem.protect(firstAddress, 2, oldProtection)

            local oldProtection = mem.unprotect(secondAddress, 2)
            mem.setuint16(secondAddress, 0xC390)
            mem.protect(secondAddress, 2, oldProtection)
        end
    end
end
Надо же, кто бы мог подумать! А я-то думал, что в функции mem.setuint16 защита автоматически снимается, ппц. Спасибо, братан!!!
 

k1sher

Известный
201
4
Не подскажите какими опкодами можно узнать сколько игроков на сервере в данный момент?
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,468
  • Нравится
Реакции: k1sher

k0lenval

Известный
133
111
Не могу понять, что происходит, хочу вернуть значение на исходное - вылетает игра
Lua:
local mem = require "memory"

function main()
    repeat wait(100) until isSampAvailable()
 
    local nop = 0
    local firstAddress = sampGetBase()+0x146E0
    local secondAddress = sampGetBase()+0x15970
 
    while true do
        wait(10)
        if testCheat("nop") then
            if nop == 0 then
                local oldProtection = mem.unprotect(firstAddress, 2)
                local  OldfirstAddress = mem.read(firstAddress, 2, true)
                mem.setuint16(firstAddress, 0xC390)
                mem.protect(firstAddress, 2, oldProtection)
          
                local oldProtection = mem.unprotect(secondAddress, 2)
                local  OldsecondAddress = mem.read(secondAddress, 2, true)
                mem.setuint16(secondAddress, 0xC390)
                mem.protect(secondAddress, 2, oldProtection)
              
                nop = 1
          
            else
                local oldProtection = mem.unprotect(firstAddress, 2)
                mem.setuint16(firstAddress, OldfirstAddress)
                mem.protect(firstAddress, 2, oldProtection)
          
                local oldProtection = mem.unprotect(secondAddress, 2)
                mem.setuint16(secondAddress, OldsecondAddress)
                mem.protect(secondAddress, 2, oldProtection)
              
                nop = 0
            end
       end
    end
end
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,468
Не могу понять, что происходит, хочу вернуть значение на исходное - вылетает игра
Lua:
local mem = require "memory"

function main()
    repeat wait(100) until isSampAvailable()
 
    local nop = 0
    local firstAddress = sampGetBase()+0x146E0
    local secondAddress = sampGetBase()+0x15970
 
    while true do
        wait(10)
        if testCheat("nop") then
            if nop == 0 then
                local oldProtection = mem.unprotect(firstAddress, 2)
                local  OldfirstAddress = mem.read(firstAddress, 2, true)
                mem.setuint16(firstAddress, 0xC390)
                mem.protect(firstAddress, 2, oldProtection)
         
                local oldProtection = mem.unprotect(secondAddress, 2)
                local  OldsecondAddress = mem.read(secondAddress, 2, true)
                mem.setuint16(secondAddress, 0xC390)
                mem.protect(secondAddress, 2, oldProtection)
             
                nop = 1
         
            else
                local oldProtection = mem.unprotect(firstAddress, 2)
                mem.setuint16(firstAddress, OldfirstAddress)
                mem.protect(firstAddress, 2, oldProtection)
         
                local oldProtection = mem.unprotect(secondAddress, 2)
                mem.setuint16(secondAddress, OldsecondAddress)
                mem.protect(secondAddress, 2, oldProtection)
             
                nop = 0
            end
       end
    end
end
local - объявление переменной, которая будет действительна только в той конструкции, в которой она объявлена. Убери local (глобальное объявление), либо используй другой способ хранения.
 
  • Нравится
Реакции: k0lenval

k0lenval

Известный
133
111
local - объявление переменной, которая будет действительна только в той конструкции, в которой она объявлена. Убери local (глобальное объявление), либо используй другой способ хранения.
Блин, точняк, не знал, бро, я думал локальные переменные на весь main действуют, спасибо!!!
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,760
5,367
обычную, с хэндлами всех существующих тачек.

принимает хэндл ТС и ид модели, возвращает результат проверки

машина создаётся после выполнения onVehicleStreamIn, создавай из эвента поток, передавай в него ид, в начале потока должен быть wait(0)
Как проверить что авто готово к проверке? Тоесть уже создано
 

deddosouru

Смотрю аниме, служу Сатане
Друг
2,036
1,323
можно ли как-нибудь из vkeys.lua получить имя кнопки по её ид из другого скрипта? или есть более православный метод получения названия кнопки?
 

eiuhuth

Новичок
91
43
У меня есть строка "example example example", её длина 23 символа, можно ли как нибудь разделить эту строку на две строки, зная её длину, допустим, если длина этой строки превышает 10 символов, то - сначала выведется первая часть этой строки размером в 10 символов "example ex", а после уже выведется остальная часть "ample example". Прошу помощи так как сам что-то совсем запутался в этом, а о встроенных функциях для редактирования строк я знаю немного. :(
 

Moonlight_Ru

Известный
66
21
У меня есть строка "example example example", её длина 23 символа, можно ли как нибудь разделить эту строку на две строки, зная её длину, допустим, если длина этой строки превышает 10 символов, то - сначала выведется первая часть этой строки размером в 10 символов "example ex", а после уже выведется остальная часть "ample example". Прошу помощи так как сам что-то совсем запутался в этом, а о встроенных функциях для редактирования строк я знаю немного. :(

Читай статью. Тебе нужен string.sub, но с остальной информацией тоже рекомендую ознакомиться.
 
  • Нравится
Реакции: eiuhuth