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

chromiusj

$IWishYouSweetDreams
Модератор
5,733
4,026

qwertyKEK

Новичок
12
1
Как удалить звук музыки в казино? Про f11 и звук у винды я и так знаю, но нужно именно этот звук удалить.
 

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
Как удалить звук музыки в казино? Про f11 и звук у винды я и так знаю, но нужно именно этот звук удалить.
Узнать ID звука и вернуть ложь.
Lua:
require("samp.events").onPlaySound = function(soundId, position)
    print("ID звука: "..soundId) -- Зайдёшь в казино - в консоль выведется ID звука.
    if soundId == ИД then -- Где "ИД" - ID звука из консоли
        return false
    end
end

не( что-то не то... Может в моем исходном скрипте ошибки?
Много синтаксических ошибок в коде.
Screenshot_1.png

Lua:
local imgui = require "mimgui"
local ffi = require "ffi"
local encoding = require "encoding"
encoding.default = "CP1251"
u8 = encoding.UTF8

local window = imgui.new.bool(true)

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
end)

imgui.OnFrame(function() return window[0] end, function(self)
    local resX, resY = getScreenResolution()
    imgui.SetNextWindowPos(imgui.ImVec2(resX / 2, resY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(200, 150), imgui.Cond.FirstUseEver)
    imgui.Begin("Test window", window)
        if imgui.Button(u8("Суицид"), imgui.ImVec2(100, 70)) then
            lua_thread.create(function()
                sampAddChatMessage("Сдохни мразь", -1)
                for i = getCharHealth(PLAYER_PED), 0, -1 do
                    setCharHealth(PLAYER_PED, i)
                    wait(100)
                end
            end)
        end
    imgui.End()
end)

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand("sc", function()
        window[0] = not window[0]
    end)
    wait(-1)
end

На будущее:
 
Последнее редактирование:
  • Нравится
  • Влюблен
Реакции: Raulore, chapo и MLycoris

qwertyKEK

Новичок
12
1
Узнать ID звука и вернуть ложь.
Lua:
require("samp.events").onPlaySound = function(soundId, position)
print("ID звука: "..soundId) -- Зайдёшь в казино - в консоль выведется ID звука.
if soundId == ИД then -- Где "ИД" - ID звука из консоли
return false
end
end
Не работает(
Нашёлся какой то ид, но похоже это не он, рестартил несколько раз.
Я играю с лаунчера аризоны
 

Mico

Активный
252
50
А возможно ли отобразить в окне imgui территории гетто? Если да, то подскажите как) или если есть пример, скиньте )
 

Read1dno

Участник
33
39
Что делать если вся работа кода в 5000 строчек зависит от
Зависимость:
local function transliterate_command(input)
    return input -- plz fix
end
 

kuboni

Потрачен
154
2
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
local samp = require "lib.samp.events"
function main()
while not isSampAvailable() do wait(100) end
repeat
wait(0)
until sampIsLocalPlayerSpawned()
sampRegisterChatCommand('god', function()
window = not window
end)
while true do wait(0)
setCharProofs(PLAYER_PED, window, window, window, window, window)
end
end
function samp.onRequestSpawnResponse() if window and sampIsLocalPlayerSpawned() then return false end end
function samp.onRequestClassResponse() if window and sampIsLocalPlayerSpawned() then return false end end
function samp.onResetPlayerWeapons() if window and sampIsLocalPlayerSpawned() then return false end end
function samp.onSetCameraBehind() if window and sampIsLocalPlayerSpawned() then return false end end
function samp.onTogglePlayerControllable() if window and sampIsLocalPlayerSpawned() then return false end end
function samp.onSetPlayerSkin() if window and sampIsLocalPlayerSpawned() then return false end end
function samp.onSetPlayerHealth() if window and sampIsLocalPlayerSpawned() then return false end end
function samp.onBulletSync() if window and sampIsLocalPlayerSpawned() then return false end end
When you first enter the game, using it is not immortal and you have to use a reload script to use it
 
Последнее редактирование:

whyega52

Eblang головного мозга
Модератор
2,821
2,712
I'm trying to create a script to apply some patches, but I'm receiving this error message :


Lua:
 cannot resume non-suspended coroutine
stack traceback:
    [C]: in function 'copy'


Lua:
local patches = {
    {0x00637590, "\xC7\x87\x40\x05\x00\x00\x00\x00\x00\x00"},
    {0x0063070C, "\xC7\x86\x40\x05\x00\x00\x00\x00\x00\x00"},
    {0x004B331F, "\x89\x96\x40\x05\x00\x00"},
    {0x00635DA0, "\xB8\x00\x00\x00\x00\xC3\x90"}
}

local function patchMemory(address, data)
    local origBytes = memory.tostring(address, #data, true)
    memory.copy(address, data, #data, true)
    return origBytes
end

local function applyPatches(patchSet, enable)
    for i, p in ipairs(patchSet) do
        local orig = patchMemory(p[1], enable and p[2] or p[3])
        if enable and p[3] == nil then
            p[3] = orig
        end
    end
end

function main()
    while not isSampAvailable() do wait(300) end
   
    lua_thread.create(function()
        wait(1000)
        applyPatches(patches, true)
        print('patches applied')
    end)

    while true do wait(0) end
   
end

can you guys help me?
memory.copy принимает тип данных number, для того, чтобы получить адрес lua-строки, используй функцию memory.strptr
Lua:
local function patchMemory(address, data)
    local origBytes = memory.tostring(address, #data, true)
    memory.copy(address, memory.strptr(data), #data, true)
    return origBytes
end
 

kuboni

Потрачен
154
2
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Which function gets the player's ip when connecting and exiting?
 

minxty

Известный
1,189
1,072
Which function gets the player's ip when connecting and exiting?
you cant get someone else's ip if you're not server admin that have rights to do it, but you can get your own using API of ipify, like this:
Lua:
local requests = require("requests")

-- get your IP
local response = requests.get("https://api.ipify.org")
if response.status_code == 200 then -- OK
    print(response.text)
end
 
  • Нравится
Реакции: 0x73616D и MLycoris

[SA ARZ]

Известный
392
8
Подскажите, как сделать чтоб удалял все по порядку и не быстро, каждое удаление 300 мс и писало, после сохранял таблицу


код:
sampRegisterChatCommand('cleardesc', function(args)
       if #list_punish > 0 then
            for k, txt in ipairs(list_punish) do
                if get_online_players(txt[k][1], 'status') == '{00FF00}В игре' then
                    sampAddChatMessage('{FFA500}[LRD] {F5FFFA}Запись {00FF00}'..i..' ('..txt[k][1]..') {F5FFFA}удалена!', 0xF5FFFA)
                    table.remove(list_punish, k)
                end
            end
        end
        jsonSave(list_punish)
    end)
 

whyyounotreal

Новичок
1
0
пацаны, первый день на луа
подскажите как сделать что бы после того как прописывалась команда materials load, писалось после нее сразу /un

code:
function main()
    while not isSampAvailable() do wait(0) end
    sampAddChatMessage('{FF0000}Auto mLoad & mUnload:{FFFFFF} Загружен', 0xFFFFFF)
    sampRegisterChatCommand('mload', function()
        active = not active
        sampAddChatMessage(active and 'Скрипт включен' or 'Скрипт выключен', -1)
    end)
    while true do
        wait(0)
        if active then
            printStyledString('active!', 20, 7)
                if os.clock() - time >= 1800 then -- 30 минут
                    sampSendChat('/materials load')
                        time = os.clock()
            end
        end
    end
end
 

minxty

Известный
1,189
1,072
пацаны, первый день на луа
подскажите как сделать что бы после того как прописывалась команда materials load, писалось после нее сразу /un

code:
function main()
    while not isSampAvailable() do wait(0) end
    sampAddChatMessage('{FF0000}Auto mLoad & mUnload:{FFFFFF} Загружен', 0xFFFFFF)
    sampRegisterChatCommand('mload', function()
        active = not active
        sampAddChatMessage(active and 'Скрипт включен' or 'Скрипт выключен', -1)
    end)
    while true do
        wait(0)
        if active then
            printStyledString('active!', 20, 7)
                if os.clock() - time >= 1800 then -- 30 минут
                    sampSendChat('/materials load')
                        time = os.clock()
            end
        end
    end
end
Lua:
function main()
    while not isSampAvailable() do wait(0) end
    sampAddChatMessage('{FF0000}Auto mLoad & mUnload:{FFFFFF} Загружен', 0xFFFFFF)
    sampRegisterChatCommand('mload', function()
        active = not active
        sampAddChatMessage(active and 'Скрипт включен' or 'Скрипт выключен', -1)
    end)
    while true do
        wait(0)
        if active then
            printStyledString('active!', 20, 7)
            if os.clock() - time >= 1800 then -- 30 минут
                sampSendChat('/materials load')
                wait(1500) -- лучше добавить задержку что бы сервер не выдавал "Не флуди!"
                sampSendChat('/un')
                time = os.clock()
            end
        end
    end
end
 

MAHEKEH

Известный
2,010
505
Как взаимодействовать с меню игры > настройки > управление персонажем?
Мне допустим нужно по нажатию CNTRL заменить прыжок скажем на .. E
 

Farany1

Новичок
12
2
короче помогите сделать проверку чата на сообщение на радмире, готовый хук:
Код:
require('samp.events').onServerMessage = function(playerId, text)
end
text:find()
text:match()
string.find()
не работают