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

EnScryptior

Участник
56
9
Здравствуйте, уважаемые форумчане, хочу у вас спросить, как проверить прогрузился ли 3д текст по типу такого: https://prnt.sc/26mvwi6. Заранее благодарю за ваш ответ. Ещё хотел бы попросить хорошенькие уроки по ЛУА.
 

P!NK.

Участник
68
54
Здравствуйте, уважаемые форумчане, хочу у вас спросить, как проверить прогрузился ли 3д текст по типу такого: https://prnt.sc/26mvwi6. Заранее благодарю за ваш ответ. Ещё хотел бы попросить хорошенькие уроки по ЛУА.
Lua:
for a = 1, 2048 do
                if sampIs3dTextDefined(a) then
                    local string, color, vposX, vposY, vposZ, distance, ignoreWalls, playerId, vehicleId = sampGet3dTextInfoById(a)
                    local X, Y, Z = getCharCoordinates(PLAYER_PED)
                    local distances = getDistanceBetweenCoords2d(vposX, vposY, X, Y)
                    local wposX, wposY = convert3DCoordsToScreen(vposX, vposY, vposZ)
                    local px , py = convert3DCoordsToScreen(X, Y, Z)
                    local distance1 = string.format("%.0f", getDistanceBetweenCoords3d(vposX, vposY, vposZ, X, Y, Z))
                    if isPointOnScreen(vposX, vposY, vposZ, 0.0) and string.find(string, "Твой текст") then print('ok') end
               end
end
 

EnScryptior

Участник
56
9
При установке на атом пакета moonloader возникает данная ошибка, прошу помочь устранить
1643720622679.png


TypeError: Arguments to CompositeDisposable.add must have a .dispose() method
at assertDisposable (C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:11:1190471)
at CompositeDisposable.add (C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:11:1191439)
at Object.consumeProvider (C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:11:164616)
at Object.consumeProvider_2 (C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:11:164314)
at Provider.provide (C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:14:1167327)
at ServiceHub.provide (C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:11:3503590)
at Package.activateServices (C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:11:3511975)
at Package.activateNow (C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:11:3508951)
at C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:11:3508275
at Package.measure (C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:11:3505853)
at C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:11:3508135
at new Promise (<anonymous>)
at Package.activate (C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:11:3508078)
at PackageManager.activatePackage (C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:11:385612)
at C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:11:915033
at r (C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:11:909639)
at n (C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:14:1194945)
at C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:14:1195099
at Socket.<anonymous> (C:\Users\user\AppData\Local\atom\app-1.58.0\resources\app\static\<embedded>:14:1193701)
at Socket.emit (events.js:228:7)
at Pipe.<anonymous> (net.js:664:12)
 
Последнее редактирование:

sizeoftrickster

…And Megadeth For All?
Проверенный
126
453
Как можно получить и в дальнейшем изменить этот текст
Посмотреть вложение 134462
Lua:
require('moonloader')

local ffi = require('ffi')
local memory = require('memory')

local state = false

function main()
    if (not isSampLoaded()) then
        return
    end
    while (not isSampAvailable()) do
        wait(200)
    end

    sampRegisterChatCommand('choo', function ()
        state = not state
    end)

    local address = (getModuleHandle('samp.dll') + 0xD83A8)

    while (true) do

        if (state) then
            local oldProtect = memory.unprotect(address, 0x87)
            ffi.copy(ffi.cast('void*', address), 'ID: %d, Type: %d, SubType: %d, Health: %.1f', 0x87)
            memory.protect(adress, oldProtect)
        else
            local oldProtect = memory.unprotect(address, 0x87)
            ffi.copy(ffi.cast('void*', address), '[id: %d, type: %d subtype: %d Health: %.1f preloaded: %u]\nDistance: %.2fm\nPassengerSeats: %u\ncPos: %.3f,%.3f,%.3f\nsPos: %.3f,%.3f,%.3f', 0x87)
            memory.protect(adress, oldProtect)
        end

        wait(0)
    end
end

function onScriptTerminate(script, quitGame)
    if (script == thisScript()) then
        local oldProtect = memory.unprotect(address, 0x87)
        ffi.copy(ffi.cast('void*', address), '[id: %d, type: %d subtype: %d Health: %.1f preloaded: %u]\nDistance: %.2fm\nPassengerSeats: %u\ncPos: %.3f,%.3f,%.3f\nsPos: %.3f,%.3f,%.3f', 0x87)
        memory.protect(adress, oldProtect)
    end
end

Как в imgui картинку убрать прозрачность?
Lua:
-- MoonLoader/Lib/imgui.lua
-- 556 - ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0), const ImVec2& uv1 = ImVec2(1,1), const ImVec4& tint_col = ImVec4(1,1,1,1), const ImVec4& border_col = ImVec4(0,0,0,0));

-- 5 аргумент (const ImVec4& tint_col = ImVec4(1,1,1,1)) функции imgui.Image, где 4 значение отвечает за прозрачность
-- imgui.ImVec4(1, 1, 1, 0) каритнки будет не видно
-- imgui.ImVec4(1, 1, 1, 0.5) каритнку будет видно на половину
imgui.Image(image, imgui.ImVec2(50, 50), imgui.ImVec2(0, 0), imgui.ImVec2(1, 1), imgui.ImVec4(1, 1, 1, 0.5))
 
Последнее редактирование:
  • Нравится
Реакции: dmitri4

Markelov9999

Участник
73
2
Как можно сделать систему.
Чтоб при вводе в игре команду /script у тебя в чат выводило названия всех файлов, которые у тебя лежат в moonloader
 

copypaste_scripter

Известный
1,218
225
ну раскоментирую тебе пожалуй
Lua:
function onReceiveRpc(int,bit) --Событие вызываемое  при получении RPC
    if int == 38 then -- если ID RPC равно 38 то
        typeRace = raknetBitStreamReadInt8(bit) --читаем из битстрима тип чекпоинта
        X = raknetBitStreamReadFloat(bit) -- читаем координату Х
        Y = raknetBitStreamReadFloat(bit) -- читаем координату Y
        Z = raknetBitStreamReadFloat(bit) -- читаем координату Z
        nextX = raknetBitStreamReadFloat(bit) -- читаем следующую точку Х
        nextY = raknetBitStreamReadFloat(bit) -- читаем следующую точку Y
        nextZ = raknetBitStreamReadFloat(bit) -- читаем следующую точку Z
        radius = raknetBitStreamReadFloat(bit) -- читаем радиус чекпоинта
    end
end
RPC List
а можно сделать еще проще с использованием SAMP.lua

Lua:
require("lib.samp.events").onSetRaceCheckpoint = function(type, pos, nextPosition, size)
sampAddChatMessage(("Тип: %s posX:%s posY:%s posZ:%s Размер: %s"):format(type, pos.x, pos.y, pos.z, size), -1)
end
ну да я понял что там XYZ это координаты) но я хотел спросить гда расписано эти все функции и почему бы не
x, y, z = raknetBitStreamReadFloat(bit)
и как узнать какого вида чекпоинт, и что ты имел ввиду с самп.луа, он сет рейс чекпоинт? в вики есть? это вроде не race а простой чекпойнт (гоночный то, что с указателем куда ехать, со стрелочки вроде)
 

EnScryptior

Участник
56
9
Ребята, хочу у вас спросить где пишите код, поставил себе на атом пак "moonloader", но нету подсказок для команд samp..., например sampRegisterChatCommand
 

Corrygan228

Участник
132
9
Как реализовать сам чекер лидеров? Рендер не получается
Lua:
local font_flag = require('moonloader').font_flag
local leader_checker = imgui.ImBool(false)
local ld_size = imgui.ImBuffer(256)
local ld_font = imgui.ImBuffer(256)
local ld_font_main = renderCreateFont(ld_font.v, ld_size.v, font_flag.BOLD + font_flag.SHADOW)
local leaders = {}

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

    while true do
        wait(0)

        if leader_checker.v then
            for i in leaders do --та самая 64 строка
                renderFontDrawText(ld_font_main, ld_name .. ld_surname .. '[' .. ld_id .. '] - ' .. ld_org, 10, 400, 0xFFFFFFFF)
            end
        end
    end
end

--imgui.OnDrawFrame()
    imgui.Checkbox(u8'Включить чекер', leader_checker)
    imgui.NewLine()
    imgui.PushItemWidth(120)
    imgui.InputText(u8'Шрифт', ld_font)
    imgui.PopItemWidth()
    imgui.SameLine()
    imgui.PushItemWidth(120)
    imgui.InputText(u8'Размер шрифта', ld_size)
    imgui.PopItemWidth()
@chapo может ты поможешь? Или игнорят или не знают решения(
 

Tufar tufan

Потрачен
103
30
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ребята, хочу у вас спросить где пишите код, поставил себе на атом пак "moonloader", но нету подсказок для команд samp..., например sampRegisterChatCommand
visual studio , если луа скрипты пишешь - юзай с припиской код