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

staffed

Новичок
9
0
Кто поможет переделать функции с setVirtualKeyDown на setGameKeyState, просто в setGameKeyState вообще не шарю. Вот сам скрипт:
script_name("AutoBot") -- Тут наш любимый скрипт инфо :)
script_version_number(1)
script_version("0.1")
script_authors("StaFF")

require "lib.moonloader"
local ev = require("lib.samp.events")
local keys = require "vkeys"



function main()
if not isSampfuncsLoaded() or not isSampLoaded() then return end

sampRegisterChatCommand("at", cmd_at)

while true do
wait(0)
if active then
setVirtualKeyDown(VK_RETURN, true)
wait(100)
setVirtualKeyDown(VK_RETURN, false)
wait(2000)
setVirtualKeyDown(VK_MENU, true)
wait(100)
setVirtualKeyDown(VK_MENU, false)
wait(2000)
setVirtualKeyDown(VK_RETURN, true)
wait(100)
setVirtualKeyDown(VK_RETURN, false)
wait(3000)
setVirtualKeyDown(VK_D, true)
wait(200)
setVirtualKeyDown(VK_D, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(VK_S, true)
wait(200)
setVirtualKeyDown(VK_S, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(VK_D, true)
wait(200)
setVirtualKeyDown(VK_D, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(VK_S, true)
wait(200)
setVirtualKeyDown(VK_S, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(VK_D, true)
wait(200)
setVirtualKeyDown(VK_D, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(VK_S, true)
wait(200)
setVirtualKeyDown(VK_S, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(VK_D, true)
wait(200)
setVirtualKeyDown(VK_D, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(VK_S, true)
wait(200)
setVirtualKeyDown(VK_S, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(1500)
setVirtualKeyDown(VK_G, true)
wait(90)
setVirtualKeyDown(VK_G, false)
wait(80)
setVirtualKeyDown(VK_G, true)
wait(70)
setVirtualKeyDown(VK_G, false)
wait(60)
setVirtualKeyDown(VK_G, true)
wait(50)
setVirtualKeyDown(VK_G, false)
wait(40)
setVirtualKeyDown(VK_G, true)
wait(30)
setVirtualKeyDown(VK_G, false)
wait(20)
setVirtualKeyDown(VK_G, true)
wait(10)
setVirtualKeyDown(VK_G, false)
wait(5000)
setVirtualKeyDown(VK_Down, true)
wait(200)
setVirtualKeyDown(VK_Down, false)
wait(200)
setVirtualKeyDown(VK_RETURN, true)
wait(50)
setVirtualKeyDown(VK_RETURN, false)
wait(63000)
setVirtualKeyDown(VK_Control, true)
wait(1000)
setVirtualKeyDown(VK_F, true)
wait(500)
setVirtualKeyDown(VK_F, false)
wait(500)
setVirtualKeyDown(VK_Control, false)
wait(500)
sampProcessChatInput('/rec 15')
sampAddChatMessage('Скрипт выключен, для повторной активации введите {ff0000}/at', -1)
wait(25000)
end
end
end

function cmd_at(penis)
active = not active
sampAddChatMessage(active and 'Активировано' or 'Деактивировано', -1)
end

function onReceiveRpc(id,bitStream)
if id == 61 then
dialogId = raknetBitStreamReadInt16(bitStream)
style = raknetBitStreamReadInt8(bitStream)
str = raknetBitStreamReadInt8(bitStream)
title = raknetBitStreamReadString(bitStream, str)
if title:find("Авторизация") then sampSendDialogResponse(dialogId,1,0,"romazoma123") end
end
end
 

AloneRose

Потрачен
11
9
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
дайте исходник луа который добовляет иконку на карту (по типу клео дапо у него там вроде при команде добавляются иконки где лежит нарко)
 

CaJlaT

07.11.2024 14:55
Модератор
2,830
2,660
дайте исходник луа который добовляет иконку на карту (по типу клео дапо у него там вроде при команде добавляются иконки где лежит нарко)
P.s: Это у меня в подписи есть
 

Biuti

Участник
165
8
Крч хотел сделать так что бы при виде определённого тексдрава скрипт сам нажимал на кнопку по типу: стрелка вправо или влево но что-то не робит
Lua:
[/B]
local sampev = require "lib.samp.events"
local keys = require "vkeys"
require "lib.moonloader"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('Группа вк vk.com/pinkmodssamp',-1)
    sampRegisterChatCommand('graf', function()
        graf = not graf; sampAddChatMessage(graf and 'Бот запущен' or 'Бот умер',-1)
    end)
    wait(-1)
end

function cmd()
    if sampTextdrawIsExists(2184) then
        PressButon(38)
    end

    if sampTextdrawIsExists(2185) then
        PressButon(40)
    end

    if sampTextdrawIsExists(2186) then
        PressButon(37)
    end

    if sampTextdrawIsExists(2187) then
       PressButon(39)
    end
end

[B]
.
 

darkjer

Активный
134
68
Крч хотел сделать так что бы при виде определённого тексдрава скрипт сам нажимал на кнопку по типу: стрелка вправо или влево но что-то не робит
Lua:
[/B]
local sampev = require "lib.samp.events"
local keys = require "vkeys"
require "lib.moonloader"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('Группа вк vk.com/pinkmodssamp',-1)
    sampRegisterChatCommand('graf', function()
        graf = not graf; sampAddChatMessage(graf and 'Бот запущен' or 'Бот умер',-1)
    end)
    wait(-1)
end

function cmd()
    if sampTextdrawIsExists(2184) then
        PressButon(38)
    end

    if sampTextdrawIsExists(2185) then
        PressButon(40)
    end

    if sampTextdrawIsExists(2186) then
        PressButon(37)
    end

    if sampTextdrawIsExists(2187) then
       PressButon(39)
    end
end

[B]
.
Что за PressButon? Юзай setVirtualKeyDown или setGameKeyState.
 
  • Нравится
Реакции: Biuti

kizn

\ 0 _ 0 /
Всефорумный модератор
2,407
2,090
как узнать цвет надписи на сервере в чате, если в чатлоге нету {} ?
и как сделать проверку на цветной текст, т.е if (text:find('{000000}я в шоке') then
 

Vespan

Чешский луашер
Проверенный
2,118
1,715
как узнать,ли в зонЕ стрима игрок(и) получили урон
 

AloneRose

Потрачен
11
9
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
А можно целым кодом? Просто у меня нету примера для его написания.
Код:
function getClosestPlayerId() -- получение ближайшего игрока
    local mydist = cfg.settings.range
    local closestId = -1
    local x, y, z = getCharCoordinates(PLAYER_PED)
    for i = 0, 999 do
        local streamed, pedID = sampGetCharHandleBySampPlayerId(i)
        if streamed and getCharHealth(pedID) > 0 and not sampIsPlayerPaused(pedID) then
            local xi, yi, zi = getCharCoordinates(pedID)
            local dist = getDistanceBetweenCoords3d(x, y, z, xi, yi, zi)
            if dist <= mydist then
                mydist = dist
                closestId = i
            end
        end
    end
    return closestId
end

end
 

Vespan

Чешский луашер
Проверенный
2,118
1,715
как узнать,ли в зонЕ стрима игрок(и) получили урон
 

Fott

Простреленный
3,461
2,374
как узнать цвет надписи на сервере в чате, если в чатлоге нету {} ?
и как сделать проверку на цветной текст, т.е if (text:find('{000000}я в шоке') then
Если в чатлоге нету значит ниче указывать не над
Lua:
if (text:find('%{000000%}я в шоке') then
 

Мира

Участник
455
9
Код:
function getClosestPlayerId() -- получение ближайшего игрока
    local mydist = cfg.settings.range
    local closestId = -1
    local x, y, z = getCharCoordinates(PLAYER_PED)
    for i = 0, 999 do
        local streamed, pedID = sampGetCharHandleBySampPlayerId(i)
        if streamed and getCharHealth(pedID) > 0 and not sampIsPlayerPaused(pedID) then
            local xi, yi, zi = getCharCoordinates(pedID)
            local dist = getDistanceBetweenCoords3d(x, y, z, xi, yi, zi)
            if dist <= mydist then
                mydist = dist
                closestId = i
            end
        end
    end
    return closestId
end

end
А можно с примером для кода?
Lua:
local color = 0xFFFF00
local text = "картошка"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("rank", cmd_rank)
    wait(-1)
    
end

function cmd_rank()
    sampAddChatMessage("text : " .. text, color)
end

Просто я думал, что будет как:

Lua:
    _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
    name = sampGetPlayerNickname(id)
 

Biuti

Участник
165
8
шо то не робитcode=lua]
local sampev = require "lib.samp.events"
local keys = require "vkeys"
require "lib.moonloader"

function main()
if not isSampLoaded() or not isSampfuncsLoaded() then return end
while not isSampAvailable() do wait(100) end
sampAddChatMessage('Группа вк vk.com/pinkmodssamp',-1)
sampRegisterChatCommand('graf', function()
graf = not graf; sampAddChatMessage(graf and 'Бот запущен' or 'Бот умер',-1)
end)
wait(-1)
end

function cmd()
if sampTextdrawIsExists(2184) then
int vkey(38)
bool down(true)
wait(100)
bool down(false)
end

if sampTextdrawIsExists(2185) then
int vkey(40)
bool down(true)
wait(100)
bool down(false)
end

if sampTextdrawIsExists(2186) then
int vkeys(37)
bool down(true)
wait(100)
bool down(false)
end

if sampTextdrawIsExists(2187) then
int vkeys(39)
end
end

[/code].