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

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,919
1,290
Как в setvirtualkeydown вводить не английскими символами, а при нажатие на их вводить руские?
то есть
вводит /buybiz
как на руское раскладке ввести вместо /buybiz = .игнишя
Lua:
            wait(chatopen.v)
            sampSetChatInputEnabled(true)
            wait(wait1.v)
            setVirtualKeyDown(0x6F, true)
            setVirtualKeyDown(0x6F, false)
            wait(wait2.v)
            setVirtualKeyDown(0x42, true)
            setVirtualKeyDown(0x42, false)
            wait(wait3.v)
            setVirtualKeyDown(0x55, true)
            setVirtualKeyDown(0x55, false)
            wait(wait4.v)
            setVirtualKeyDown(0x59, true)
            setVirtualKeyDown(0x59, false)
            wait(wait5.v)
            setVirtualKeyDown(0x42, true)
            setVirtualKeyDown(0x42, false)
            wait(wait6.v)
            setVirtualKeyDown(0x49, true)
            setVirtualKeyDown(0x49, false)
            wait(wait7.v)
            setVirtualKeyDown(0x5A, true)
            setVirtualKeyDown(0x5A, false)
            wait(enter.v)
            setVirtualKeyDown(key.VK_RETURN, true)
            setVirtualKeyDown(key.VK_RETURN, false)
Еще вопросс
не запускается Гта просто с скриптом.
Lua:
local key = require 'vkeys'
function main()
     while true do
       if wasKeyPressed(key.VK_X) then
            sampSetChatInputEnabled(true)
            wait(50)
            setVirtualKeyDown(0x6F, true)
            setVirtualKeyDown(0x6F, false)
            wait(90)
            setVirtualKeyDown(0x42, true)
            setVirtualKeyDown(0x42, false)
            wait(30)
            setVirtualKeyDown(0x55, true)
            setVirtualKeyDown(0x55, false)
            wait(90)
            setVirtualKeyDown(0x59, true)
            setVirtualKeyDown(0x59, false)
            wait(150)
            setVirtualKeyDown(0x42, true)
            setVirtualKeyDown(0x42, false)
            wait(32)
            setVirtualKeyDown(0x49, true)
            setVirtualKeyDown(0x49, false)
            wait(90)
            setVirtualKeyDown(0x5A, true)
            setVirtualKeyDown(0x5A, false)
            wait(38)
            setVirtualKeyDown(key.VK_RETURN, true)
            setVirtualKeyDown(key.VK_RETURN, false)
       end
     end
end
Между ними wait(0)
7169B248-D62C-45B8-AFF9-F5C1AB6AD8B3.jpeg
 
  • Нравится
Реакции: Pheonixxx

brainis

Новичок
15
0
Привет, столкнулся с проблемой - как плавно поворачивать камеру и персонажа в нужную сторону?
Прошу помощь, ломаю над этим голову уже несколько дней, никак не могу найти решение!



Написал функцию, которая делает плавный поворот камеры и персонажа нужную сторону.
Готовый пример использования функции прикреплен к посту.



Lua:
local abs, sin, cos, atan2 = math.abs, math.sin, math.cos, math.atan2
local PI       = 3.141592653589793
local DEGTORAD = PI / 180.0
local RADTODEG = 180.0 / PI


UpdateRotationToTarget = function ( ptTargetX, ptTargetY, fSpeed, dt )
    -- @VolArtDev
    -- ptTargetX, ptTargetY - координата точки в которую необходимо произвести поворот
    -- fSpeed - скорость поворота, градусы в секунду
    -- dt - delta time, обратная величина FPS, (1/FPS), в секундах
    -- Возвращает true когда игрок повернут на ptTargetX, ptTargetY, иначе false
    -- have nice day :)

    local ptSelfPlayerPosX, ptSelfPlayerPosY, _ = getCharCoordinates ( PLAYER_PED )
    local fSelfPlayerHeading = getCharHeading ( PLAYER_PED )

    local vnSelfPlayerFrontX, vnSelfPlayerFrontY = -sin ( fSelfPlayerHeading * DEGTORAD ), cos ( fSelfPlayerHeading * DEGTORAD )
    local vToTargetPointX, vToTargetPointY = ptTargetX - ptSelfPlayerPosX, ptTargetY - ptSelfPlayerPosY

    local vRotX = vToTargetPointX * vnSelfPlayerFrontX + vToTargetPointY * vnSelfPlayerFrontY
    local vRotY = vToTargetPointX * vnSelfPlayerFrontY - vToTargetPointY * vnSelfPlayerFrontX

    local fAngToTarget = atan2 ( vRotY, vRotX ) * RADTODEG
    local fDeltaAng = fSpeed * dt

    if abs ( fAngToTarget ) > fDeltaAng then

        if fAngToTarget > 0.0 then
            fDeltaAng = -fDeltaAng
        end

        setCharHeading ( PLAYER_PED, fSelfPlayerHeading + fDeltaAng )

        restoreCameraJumpcut()

        return false
    end

    return true
end
 

Вложения

  • SmoothRotation.lua
    3.3 KB · Просмотры: 22

atomlin

Известный
587
449
При активации скрипта - пишет что скрипт активирован но ничего дальше не происходит. (варнингов нету)



Lua:
script_name('CheckPoint-BOT')
script_author('atomlin')
script_version('0.1')
script_version_number(1)

local sampev   = require 'lib.samp.events'
local inicfg   = require 'inicfg'
local imgui   = require 'imgui'
local imadd    = require 'imgui_addons'
local encoding = require 'encoding'
local effil    = require 'effil'
local memory   = require 'memory'
local rkeys    = require 'rkeys'
local vkeys    = require 'vkeys'
local coord = false
local ret_posX = 0.0
local ret_posY = 0.0
local ret_posZ = 0.0
local isFind = false

function main()
    while not isSampAvailable() do wait(100) end   
    sampAddChatMessage("[CheckPoint-BOT]: Автор скрипта - atomlin", 0xFFFFFF)
    sampAddChatMessage("[CheckPoint-BOT]: Последнее обновление: 09.01.2020", 0xFFFFFF)
    sampRegisterChatCommand("snejinka", function() coord = not coord sampAddChatMessage(coord and "[CheckPoint-BOT]: Включен. " or "[CheckPoint-BOT]: Выключен.", 0xFFFFFF)
    end)
end


function sneg()
    while true do
    wait(0)
        if coord then
            if getDistanceBetweenCoords3d(blipX, blipY, charPosZ, charPosX, charPosY, charPosZ) > 10.98 then
            charPosX, charPosY, charPosZ = getCharCoordinates(PLAYER_PED)
            vectorX = blipX - charPosX
            vectorY = blipY - charPosY
            vectorZ = blipZ - charPosZ
                    local vec = vector(vectorX, vectorY, vectorZ)
                    vec:normalize()
                    charPosX = charPosX + vec.x * 3
                    charPosY= charPosY + vec.y * 3
                    setCharCoordinates(PLAYER_PED, charPosX, charPosY, charPosZ)
                else
                    coord = false
                    setCharCoordinates(PLAYER_PED, blipX, blipY, blipZ)
                end
            end
        end
    end


function sampev.onSendVehicleSync(data)
            local speed = data.moveSpeed
        if coord then
            speed.x = 0
            speed.y = 0
            speed.z = -1
            data.position.z = -2
            setVehicleQuaternion(Vehicle_car, sasa, sasaj, sasak, sasal)
        else
            local X, Y, Z = getCharCoordinates(PLAYER_PED)
            while Z ~= data.position.z do
            data.position.z = data.position.z + 1
            X, Y, Z = getCharCoordinates(PLAYER_PED)
        end
    end
end

function SearchMarker(posX, posY, posZ)
    local ret_posX = 0.0
        local ret_posY = 0.0
            local ret_posZ = 0.0
                local isFind = false
                for id2 = 0, 31 do
                local MarkerStruct = 0
                MarkerStruct = 0xC7F168 + id2 * 56
                local MarkerPosX = representIntAsFloat(readMemory(MarkerStruct + 0, 4, false))
                local MarkerPosY = representIntAsFloat(readMemory(MarkerStruct + 4, 4, false))
                local MarkerPosZ = representIntAsFloat(readMemory(MarkerStruct + 8, 4, false))
                if MarkerPosX ~= 0.0 or MarkerPosY ~= 0.0 or MarkerPosZ ~= 0.0 then
                bool, blipX, blipY, blipZ = SearchMarker(posX, posY, posZ)
                ret_posX = MarkerPosX
                ret_posY = MarkerPosY
                ret_posZ = MarkerPosZ
                isFind = true
            end
        end
    return isFind, ret_posX, ret_posY, ret_posZ
end
 

Tak

Известный
177
70
Как добавить в [] (Заголовок) не цифру, а строку?
(За место 1 добавить строку)
Понял что номер добавляется так:
Lua:
table.insert(cmd_binds, 1, {['Keck'] = '123'})

[1]
Keck=123

Что бы было так:
Lua:
[Str]
1=Нет
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,656
2,541
Как добавить в [] (Заголовок) не цифру, а строку?
Понял что номер добавляется так:
Lua:
table.insert(cmd_binds, 1, {['Keck'] = '123'})

[1]
Keck=123

(За место 1 не знаю как добавить строку)
cmd_binds["blabka"] = ...
 
  • Нравится
Реакции: Tak

|DEVIL|

Известный
363
281
Как можно вычислить айди у диалогового окна? Или же, кто знает айди диалогового окна ввода капчи на Аризоне?
 

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
Как можно вычислить айди у диалогового окна? Или же, кто знает айди диалогового окна ввода капчи на Аризоне?
Lua:
local sampev = 'lib.samp.events'

function sampev.onShowDialog(id, style, title, b1, b2, text)
sampAddChatMessage(id, -1)
end

-- Если ID окон разные, сделай проверку на заголовок
if title:find("Text") then
-- code
end
 
  • Нравится
Реакции: Enlizmee и |DEVIL|

S-Sirius

Известный
351
21
Lua:
function flooder()
    local flooder = false
    if flooder == false then
    while true do wait(700)
        sampProcessChatInput("/capture")         
    end
    flooder = true
    end
    if flooder == true then flooder = false end
end
Что тут не так?
 

ne4estno

Участник
79
0

wintreist

Активный
308
71
Как заменить серверный цвет текста на свой.
Скрин:Посмотреть вложение 47421
Lua:
function sampev.onServerMessage(colormsg, textmessage)
    return {--[[Меняешь первый параметер на тот цвет который тебе нужен]], textmessage}
end
Lua:
function flooder()
    local flooder = false
    if flooder == false then
    while true do wait(700)
        sampProcessChatInput("/capture")        
    end
    flooder = true
    end
    if flooder == true then flooder = false end
end
Что тут не так?
То, что он никогда не выйдет из цикла