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

CaJlaT

07.11.2024 14:55
Модератор
2,830
2,660
Каким образом можно поставить кавычки в строке?
Lua:
text = 'текст "Кавычки" текст'
print(text) -- out: текст "Кавычки" текст
text = 'Текст \'Кавычки\' текст' -- \ не будет видно
print(text) -- out: Текст 'Кавычки' текст
 
  • Нравится
Реакции: Lucifer Melton

D.Makarov

Участник
146
3
ребята помогите у меня есть скрипт поторый телепортируеться на объекты как сделать что бы он телепортировался на 3д текст помогите
Lua:
local vec = require 'vector3d'
local time = 90
local step = 2
local gogogo = false
local events = require 'lib.samp.events'
local state1 = false
local font = renderCreateFont('Century Gothic', 13, 10)
local ssSH = false
local Aspeed = -1
local speeduxa = 10
local sc = 0
local isBlipExists, blipX, blipY, blipZ = false,0,0,0

local objs = {
    [16305] = "Хуйня ебаная"
}


function events.onSendPlayerSync(data)
    local speed = data.moveSpeed
    Aspeed = math.sqrt( speed.x ^ 2 + speed.y ^ 2 + speed.z ^ 2 ) * 140
    if ssSH then
        speed.x = speeduxa / 140
        speed.y = 0
        speed.z = -1
    end
end


function main()
    while not isSampAvailable() do wait(0) end
    
    local obj = 0
    while true do wait(0)
    
        if isKeyJustPressed(90) then sup() end
        
        while gogogo do wait(time)
        
            if isKeyJustPressed(90) then sup() end
        
            freezeCharPosition(PLAYER_PED, true)
            local x, y, z = getCharCoordinates(PLAYER_PED)
          
            if obj == 0 then
                obj = 1
            end


            sc = 1
    
            if isBlipExists then
                
            else
                printString('~r~ Metky Daj', 2000)
                gogogo = false
                freezeCharPositionAndDontLoadCollision(playerPed, false)
            end
            freezeCharPositionAndDontLoadCollision(playerPed, true)
            local posX, posY, posZ = GetCoordinates()
            vx = blipX - posX
            vy = blipY - posY
            vz = blipZ - posZ
            local vectr = vec(vx, vy, vz)
            vectr:normalize()
            teleportPlayer(posX + vectr.x * step, posY + vectr.y * step, posZ + vectr.z * step)
            local possX, possY, possZ = GetCoordinates()
            mamagdeya = getDistanceBetweenCoords3d(blipX , blipY, blipZ, possX, possY, possZ)
            if mamagdeya < step then
                wait(sukaaaaaaaaaaaaaaa)
                teleportPlayer(blipX , blipY, blipZ)
                gogogo = false
                ssSH = false
                
                sc = 0
                freezeCharPosition(PLAYER_PED, false)
                printString('~g~ Successful', 3000)
                wait(1000)
            end
        end
    end
end
    function sup()


        ssSH = not ssSH
          
        if ssSH then
            speeduxa = 10
            print('21')

        end
        
        printString('~g~ Letim', 3000)
        isBlipExists, blipX, blipY, blipZ = GetObj()
        
        if isBlipExists then
            gogogo = true
        else
            printString('~r~ Metky Daj', 2000)
        end
    end


    function GetObj()
        local max = 99999
        local isObj,tX,tY,tZ = false,0,0,0
        
        for _, obj_hand in pairs(getAllObjects()) do
            local modelid = getObjectModel(obj_hand)
            local _obj = objs[modelid]
            if _obj then
                local x,y,z = getCharCoordinates(PLAYER_PED)
                local res,x1,y1,z1 = getObjectCoordinates(obj_hand)
                local distan = math.floor(getDistanceBetweenCoords3d(x,y,z,x1,y1,z1))
                
                if distan < max then
                    max = distan
                    tX,tY,tZ = x1,y1,z1
                end
                
            end
        end
        printString('~g~ Distanse: '..max..'m.', 2000)
        
        if tX ~= 0 then
            isObj = true   
        end
        
        return isObj,tX,tY,tZ+2
    end






function SetAngle(x, y, z)
    local posX, posY, posZ = GetCoordinates()
    local pX = x - posX
    local pY = y - posY
    local zAngle = getHeadingFromVector2d(pX, pY)

    if isCharInAnyCar(playerPed) then
        local car = storeCarCharIsInNoSave(playerPed)
        setCarHeading(car, zAngle)
    else
        setCharHeading(playerPed, zAngle)
    end

    restoreCameraJumpcut()
end

function GetCoordinates()
    if isCharInAnyCar(playerPed) then
        local car = storeCarCharIsInNoSave(playerPed)
        return getCarCoordinates(car)
    else
        return getOffsetFromCharInWorldCoords(playerPed, 0.0, 0.0, 0.2855)
    end
end

-- Teleport from ClickWarp (by FYP)
function teleportPlayer(x, y, z)
    if isCharInAnyCar(playerPed) then
        setCharCoordinates(playerPed, x, y, z)
    end
    setCharCoordinatesDontResetAnim(playerPed, x, y, z)
end

function setCharCoordinatesDontResetAnim(char, x, y, z)
    if doesCharExist(char) then
        local ptr = getCharPointer(char)
        setEntityCoordinates(ptr, x, y, z)
    end
end

function setEntityCoordinates(entityPtr, x, y, z)
    if entityPtr ~= 0 then
        local matrixPtr = readMemory(entityPtr + 0x14, 4, false)
        if matrixPtr ~= 0 then
            local posPtr = matrixPtr + 0x30
            writeMemory(posPtr + 0, 4, representFloatAsInt(x), false) --X
            writeMemory(posPtr + 4, 4, representFloatAsInt(y), false) --Y
            writeMemory(posPtr + 8, 4, representFloatAsInt(z), false) --Z
        end
    end
end
 

Eugene Crabs

Активный
544
30
Ребят, вопрос. Есть короч функция, которую вызывают с помощью команды. В ней есть два аргумента. Почему при запросе на длину строки одного из аргументов, функция вылетает?

Lua:
function FunctionFF(Param1, Param2)
    if #Param1 == 0 then
        print("123")
    end
end
 

Adrian G.

Известный
Проверенный
520
457
Есть вот это. Как правильно объявить переменную, если она равна true - происходит хук текста в text:find, а если false то нет соответственно.


Lua:
function sampev.onPlayerStreamIn(id, team, model, position, rotation, color, fightingStyle)
    lua_thread.create(function()
        wait(50)
        sampSendChat('/cl '..id)
        sampev.onServerMessage = function(color, text)
            if text:find('Игрок .+%[.+%] %{......%}Использует лаунчер и у него есть голосовой чат!') then
                local id = text:match('Игрок .+%[(.+)%] %{......%}Использует лаунчер и у него есть голосовой чат!')
                sampCreate3dText('<< Launcher >>', 0xFFB51616, 0, 0, 0.5, 21.5, true, id, -1)
                return false

            elseif text:find('Игрок .+%[.+%] %{......%}Не использует лаунчер и мобильный лаунчер!') then
                local id = text:match('Игрок .+%[(.+)%] %{......%}Не использует лаунчер и мобильный лаунчер!')
                sampCreate3dText('<< Client >>', 0xFFA2B5CD, 0, 0, 0.5, 21.5, true, id, -1)
                return false

            elseif text:find('Игрок .+%[.+%] %{......%}Использует мобильный лаунчер!') then
                local id = text:match('Игрок .+%[(.+)%] %{......%}Использует мобильный лаунчер!')
                sampCreate3dText('<< Mobile >>', 0xFF147BFA, 0, 0, 0.5, 21.5, true, id, -1)
                return false
            end
        end
    end)
end
 
  • Нравится
Реакции: Gorskin

chapo

чопа сребдс // @moujeek
Модератор
8,860
11,544
Есть вот это. Как правильно объявить переменную, если она равна true - происходит хук текста в text:find, а если false то нет соответственно.


Lua:
function sampev.onPlayerStreamIn(id, team, model, position, rotation, color, fightingStyle)
    lua_thread.create(function()
        wait(50)
        sampSendChat('/cl '..id)
        sampev.onServerMessage = function(color, text)
            if text:find('Игрок .+%[.+%] %{......%}Использует лаунчер и у него есть голосовой чат!') then
                local id = text:match('Игрок .+%[(.+)%] %{......%}Использует лаунчер и у него есть голосовой чат!')
                sampCreate3dText('<< Launcher >>', 0xFFB51616, 0, 0, 0.5, 21.5, true, id, -1)
                return false

            elseif text:find('Игрок .+%[.+%] %{......%}Не использует лаунчер и мобильный лаунчер!') then
                local id = text:match('Игрок .+%[(.+)%] %{......%}Не использует лаунчер и мобильный лаунчер!')
                sampCreate3dText('<< Client >>', 0xFFA2B5CD, 0, 0, 0.5, 21.5, true, id, -1)
                return false

            elseif text:find('Игрок .+%[.+%] %{......%}Использует мобильный лаунчер!') then
                local id = text:match('Игрок .+%[(.+)%] %{......%}Использует мобильный лаунчер!')
                sampCreate3dText('<< Mobile >>', 0xFF147BFA, 0, 0, 0.5, 21.5, true, id, -1)
                return false
            end
        end
    end)
end
попробуй так:

Lua:
local sampev = require 'lib.samp.events'
local active = false
function sampev.onPlayerStreamIn(id, team, model, position, rotation, color, fightingStyle)
    sampSendChat('/cl '..id)
    active = true
end

function sampev.onServerMessage(color, text)
    if active then
        if text:find('Игрок .+%[.+%] %{......%}Использует лаунчер и у него есть голосовой чат!') then
            local id = text:match('Игрок .+%[(.+)%] %{......%}Использует лаунчер и у него есть голосовой чат!')
            sampCreate3dText('<< Launcher >>', 0xFFB51616, 0, 0, 0.5, 21.5, true, id, -1)
            return false

        elseif text:find('Игрок .+%[.+%] %{......%}Не использует лаунчер и мобильный лаунчер!') then
            local id = text:match('Игрок .+%[(.+)%] %{......%}Не использует лаунчер и мобильный лаунчер!')
            sampCreate3dText('<< Client >>', 0xFFA2B5CD, 0, 0, 0.5, 21.5, true, id, -1)
            return false

        elseif text:find('Игрок .+%[.+%] %{......%}Использует мобильный лаунчер!') then
            local id = text:match('Игрок .+%[(.+)%] %{......%}Использует мобильный лаунчер!')
            sampCreate3dText('<< Mobile >>', 0xFF147BFA, 0, 0, 0.5, 21.5, true, id, -1)
            return false
        end
        active = false
    end
end
 
  • Нравится
Реакции: Gorskin

Anton Nixon

Активный
474
48
пытаюсь сделать счетчик игрового времени, для этого у меня gameClock(), но оно показывает общее число секунд проведенных в игре, а как сделать чтобы оно отсчитывало 60 секунд, затем прибавляло 1 к минутам и секунды опять шли с 00?
sa-mp-031.png
 
Последнее редактирование:

EclipsedFlow

Известный
Проверенный
1,043
474
пытаюсь сделать счетчик игрового времени, для этого у меня gameClock(), но оно показывает общее число секунд проведенных в игре, а как сделать чтобы оно отсчитывало 60 секунд, затем прибавляло 1 к минутам и секунды опять шли с 00?
Посмотреть вложение 84396
Можешь так попробовать, но думаю другие меня подправят!

Lua:
local sec = 0
local min = 0

--Где-то в коде!
if sec == 60 then
    min = min + 1
    sec = 0
end
 

Мира

Участник
455
9
как в BeginChild запретить передвигать вертикальные линии (разделения столбов)?
1611766886768.png
 

Adrian G.

Известный
Проверенный
520
457
попробуй так:

Lua:
local sampev = require 'lib.samp.events'
local active = false
function sampev.onPlayerStreamIn(id, team, model, position, rotation, color, fightingStyle)
    sampSendChat('/cl '..id)
    active = true
end

function sampev.onServerMessage(color, text)
    if active then
        if text:find('Игрок .+%[.+%] %{......%}Использует лаунчер и у него есть голосовой чат!') then
            local id = text:match('Игрок .+%[(.+)%] %{......%}Использует лаунчер и у него есть голосовой чат!')
            sampCreate3dText('<< Launcher >>', 0xFFB51616, 0, 0, 0.5, 21.5, true, id, -1)
            return false

        elseif text:find('Игрок .+%[.+%] %{......%}Не использует лаунчер и мобильный лаунчер!') then
            local id = text:match('Игрок .+%[(.+)%] %{......%}Не использует лаунчер и мобильный лаунчер!')
            sampCreate3dText('<< Client >>', 0xFFA2B5CD, 0, 0, 0.5, 21.5, true, id, -1)
            return false

        elseif text:find('Игрок .+%[.+%] %{......%}Использует мобильный лаунчер!') then
            local id = text:match('Игрок .+%[(.+)%] %{......%}Использует мобильный лаунчер!')
            sampCreate3dText('<< Mobile >>', 0xFF147BFA, 0, 0, 0.5, 21.5, true, id, -1)
            return false
        end
        active = false
    end
end
Да, работает, хотя я вроде так пробовал, спасиб
 

EclipsedFlow

Известный
Проверенный
1,043
474
Написал в одном скрипте 5 телепортов в одном, все красиво, работает, но ач кикает, кто поможет мне с синхронизацией пошаманить, жду в лс, спасибо)