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

Bernardoooo!

Известный
98
13
Lua:
local sampev = require ('samp.events')

function main()
    repeat wait(0) until isSampAvailable()
    sampAddChatMessage('{FF00D6} AUTOREG by Bernardooo! {00F4FF}SCRIPT HAS LOADED!! USE ',-1 )
    wait(-1)
end

    --local email = ''
    --math.randomseed(os.time())
    --for i = 1, 15 do
  --email = email .. string.char(math.random(97,122))
    --end
    --email = email .. '@gmail.com'--*

function sampev.onShowDialog(id, style, title, btn1, btn2, text)
    if id == 9 then
                    sampSendDialogResponse(9, 0, 0, 0)
        return false
        elseif id == 10 then
          sampSendDialogResponse(10, 1, 0, 123123)
    return false
    end
end
Что не так с кодом?
 

sdfaw

Активный
717
150
ZzXp0bn.png

IcBAH0b.png

выводит
h5Y8RfV.png

как исправить?
в one и two из input text значение
p.s кто не понял мне нужно чтобы из массива рандомно выводился текст
HEEEEEEEEEEEEEEEEEEEEEEEEEEEELP

Lua:
local sampev = require ('samp.events')

function main()
    repeat wait(0) until isSampAvailable()
    sampAddChatMessage('{FF00D6} AUTOREG by Bernardooo! {00F4FF}SCRIPT HAS LOADED!! USE ',-1 )
    wait(-1)
end

    --local email = ''
    --math.randomseed(os.time())
    --for i = 1, 15 do
  --email = email .. string.char(math.random(97,122))
    --end
    --email = email .. '@gmail.com'--*

function sampev.onShowDialog(id, style, title, btn1, btn2, text)
    if id == 9 then
                    sampSendDialogResponse(9, 0, 0, 0)
        return false
        elseif id == 10 then
          sampSendDialogResponse(10, 1, 0, 123123)
    return false
    end
end
Что не так с кодом?
если ошибка то скинь moonloader log
 

madrasso

Потрачен
883
325
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Посмотреть вложение 32618

Есть шарящие за ракбот? Как получить корды такой хуйни, чекал через getAllObjects() в luaAddons, но его даже не показывает там, а в муне показывает в getAllObjects()
up

Где можно посмотреть инфу о том, как читать битстрим? RakBot

Почему перс не поднимает пикап? rakbot diamond
 

astynk

Известный
Проверенный
742
532
Lua:
local sampev = require ('samp.events')

function main()
    repeat wait(0) until isSampAvailable()
    sampAddChatMessage('{FF00D6} AUTOREG by Bernardooo! {00F4FF}SCRIPT HAS LOADED!! USE ',-1 )
    wait(-1)
end

    --local email = ''
    --math.randomseed(os.time())
    --for i = 1, 15 do
  --email = email .. string.char(math.random(97,122))
    --end
    --email = email .. '@gmail.com'--*

function sampev.onShowDialog(id, style, title, btn1, btn2, text)
    if id == 9 then
                    sampSendDialogResponse(9, 0, 0, 0)
        return false
        elseif id == 10 then
          sampSendDialogResponse(10, 1, 0, 123123)
    return false
    end
end
Что не так с кодом?
Была похожая проблема, решил так - запихнул все тело обработчика onShowDialog в поток с wait(1) в начале. Похоже на какой-то баг в самом муне.
 

Belo4ka_belka

Известный
191
7
Здравствуйте, товарищи. Такой вопрос: можно ли узнать как-нибудь находишься ли ты на базе зона 51? Имеется ввиду внутри периметра базы. Сейчас хочу попробовать добавить координаты этой базы и определять по ним, но проблема в том, что периметр базы не ровный и либо внутри периметра некоторые зоны будут не занесены в координаты, либо наоборот: лишняя зона за периметром будет занесена. Все потому что я проверяю квадратную область координат. Однако в сингле есть такая штука: как только ступишь за порог базы тебе сразу звезды прописывает, вот вопрос: можно ли в сампике это определение поймать как-нибудь? Ну либо создать зону координат не квадратной формы? Буду очень признателен за советы.
 

Shell :3

Активный
159
32
Помогите, вообщем... Если влючить bool9, то оно каждые две секунды будет отправлять сообщение из вк в игру. Как сделать чтоб оно отправляло только новые сообщения и только один раз?
Lua:
function vk_msg()
while true do
wait(2000)
    if Bool[9].v then
        local serv = sampGetCurrentServerName()
        local server = serv:gsub('Diamond Role Play | ','')
        local _, myid = sampGetPlayerIdByCharHandle(playerPed)
        local name = sampGetPlayerNickname(myid)
        async_http_request('GET', 'https://api.vk.com/method/messages.getHistory?v=5.41&access_token='..token..'&peer_id=71186731&offset=0&count=1', nil, -- Отправка запроса
        function(response)
        local data = decodeJson(response.text)
        local result = data['response']['items'][1]['body']
        local ttext = u8:decode(result)
        local cmd1, svr,  name1, msg = ttext:match('/(.+)%s+(.+)%s+(%a+_%a+)%s+(.+)')
        if cmd1 == 'msg' then
            if server == svr then
                if name1 == name then
                    sampAddChatMessage(ttext, -1)
                end
            end
        end
    end,
    function(err)
            end)
        end
    end
end
 

Bernardoooo!

Известный
98
13
text[math.random(1, #text)].v ты сделал или как?

во-первых, не script has loaded, а script has been loaded или scripted loaded, а во-вторых последним параметром в sampSendDialogResponce надо передавать строку а не число, например - 'хуй' или '138181'


официальная документация
Што? Какая строка, можешь в коде исправить?
 

Yzy

Известный
2
0
Доброго времени суток, есть функция отправки серверу нажатие клавиши:

function sendKey(key)
local _, myId = sampGetPlayerIdByCharHandle(PLAYER_PED)
local data = allocateMemory(68)
sampStorePlayerOnfootData(myId, data)
setStructElement(data, 36, 1, key, false)
sampSendOnfootData(data)
freeMemory(data)
end

Функция взята с этого форума, в key передается номер клавиши.
Дайте пожалуйста кто-то полный список клавиш, ибо сколько искал - не могу найти.
Учитывая что:
64 - Y
128 - N
192 - H
Из всех таблиц кодов клавиш, ничего не совпадает.
 

Licht

Известный
238
32
Доброго времени суток, есть функция отправки серверу нажатие клавиши:
Дайте пожалуйста кто-то полный список клавиш, ибо сколько искал - не могу найти.
Учитывая что:
64 - Y
128 - N
192 - H
Из всех таблиц кодов клавиш, ничего не совпадает.
Та вот софтина которая показывает № клавиш
 

Вложения

  • KeyV.exe
    402 KB · Просмотры: 13

Bernardoooo!

Известный
98
13
Скрипт не скипает диалог, но запускается. ПАМАГИТИ

Lua:
-- SCRIPT MADE BY BERNARDOOO!
-- GOVNOKOD EDITION!

local sampev = require ('samp.events')

function main()
    repeat wait(0) until isSampAvailable()
    sampAddChatMessage('{FF00D6} AUTOREG by Bernardooo! {00F4FF}SCRIPT HAS LOADED!! USE ',-1 )
    wait(-1)
end

    --local email = ''
    --math.randomseed(os.time())
    --for i = 1, 15 do
  --email = email .. string.char(math.random(97,122))
    --end
    --email = email .. '@gmail.com'--*

    function sampev.onShowDialog(id, style, title, btn1, btn2, text)
        if id == 9 then
            sampCloseCurrentDialogWithButton(0)
            return true
        elseif id == 10 then
            sampSetCurrentDialogEditboxText(123123)
            sampCloseCurrentDialogWithButton(0)
            return true
        end
    end