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

FordeD

Участник
98
11
Приветствую, каким образом обратиться к конфиг файлу и достать значение ключа например?
 

kmsfax

Известный
154
89
Как определить, целится ли в меня игрок (Есть ли надо мной зелёный треугоник)?
 

FYP

Известный
Автор темы
Администратор
1,758
5,723
Приветствую, каким образом обратиться к конфиг файлу и достать значение ключа например?
https://www.blast.hk/wiki/lua:inicfg
Как определить, целится ли в меня игрок (Есть ли надо мной зелёный треугоник)?
по вектору направления его камеры или ротации персонажа. первое можно получить из aim синхры, второе из памяти игры
 

kmsfax

Известный
154
89
по вектору направления его камеры или ротации персонажа. первое можно получить из aim синхры, второе из памяти игры
Как использовать первое? Можешь подробно расписать?
Можно где-то подробно прочитать про синхру?
 

Bogach

Активный
558
27
Привет дорогие друзья. У меня есть такой вопрос.

Как сделать в команде функции переменную.
Lua:
function main()
  if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
        sampRegisterChatCommand("test", testfunc)
        sampRegisterChatCommand("met", metfunc)
    while true do
        wait(0)
    end
end

function metfunc()
    if activate == 1 then
        sampSendChat("/me открыл склад с металлом ")
    wait(1)
        sampSendChat("/me взял металлическую заготовку")
        sampSendChat("/takem", q)
    wait(1)
        sampSendChat("/me закрыл склад с металлом")
    elseif activate == 0 then
        sampAddChatMessage("{704214}[AHK MO] {bdbdbd}Для работы этой команды , активируйте программу - {ffffff}/test", 0xbdbdbd)
    end
end
Получается мне нужно сделать так: /met Значение
и дальше следует код , а где /takem мне надо что бы туда ввело значение. К примеру. : /met 6 = /takem 6

Lua:
function metfunc(args)
local kg = string.match(args, "%d+")
    if activate == 1 then
        sampSendChat("/me открыл склад с металлом ")
    wait(1)
        sampSendChat("/me взял металлическую заготовку")
        sampSendChat("/takem", kg)
    wait(1)
        sampSendChat("/me закрыл склад с металлом")
    elseif activate == 0 then
        sampAddChatMessage("{704214}[AHK MO] {bdbdbd}Для работы этой команды , активируйте программу - {ffffff}/test", 0xbdbdbd)
    end
end
Но можно сделать получше, потом покажу.
 

ynhhoJ

Известный
102
6
Как изменить: : | % [ ] ! " "(пробел) в _
Я делаю так:
Lua:
function sdebug(params)
    local name = sampGetCurrentServerName()
    local name = name:gsub("( )", "_")

    sampAddChatMessage(string.format("Server: %s",name),0xFFFFFF)
end
Blast Hack Net > Blast_Hack_Net
Но, тут меняется лишь пробел на _
Я пробовал и так:
Lua:
%|( )
|( )
%| %( )
Но ничего не работает....
Как сделать так, что-бы gsub редактировал больше чем один символ?
 

ynhhoJ

Известный
102
6
Если честно, я не понимаю почему у меня столько проблем...уже заеб...
Lua:
script_name("Object Stealer v0.1")
script_author("Johhny")
script_version("Beta")
script_version_number(0)
script_dependencies("SAMPFUNCS", "SAMP")
script_description("Object Stealer")

require "lib.sampfuncs"
require "lib.moonloader"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
  
    local name = sampGetCurrentServerName()
    local name = name:gsub("[|%%%[%]! ]", "_")
    if not doesDirectoryExist("moonloader\\Object_Stealer")
        then createDirectory("moonloader\\Object_Stealer")
    end
    if not doesFileExist(string.format("moonloader\\Object_Stealer\\%s.txt",name)) then
        local file2 = io.open(string.format("moonloader\\Object_Stealer\\%s.txt",name), "w")
        io.close(file2)
    end
    local font = renderCreateFont("Arial", 10, 12)
    repeat
        wait(0)
        if isKeyDown(VK_1) then
            local X, Y, Z = getCharCoordinates(playerPed)
            for a = 0, 10 do
                local result, object = findAllRandomObjectsInSphere(X, Y, Z, 200,1)
                if result == true then
                    local a = getObjectModel(object)
                    local results, oX, oY, oZ = getObjectCoordinates(object)
                    local sX, sY = convert3DCoordsToScreen(oX, oY, oZ)
                    local rX, rY, rZ, w = getObjectQuaternion(object)
                    sampAddChatMessage(string.format("CreateObject(%i, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f)",a,oX,oY,oZ,rX,rY,rZ), 0xFFFFFF)
                end
            end
            while isKeyDown(VK_1) do wait(0) end
        end
    until false
end
Вообщем, суть в том, что цикл очень странно работает...
Он не показывает каждый раз новые координаты, но через каждые 3 раза координаты меняются, вот так:
Lua:
1
1
1
2
2
2
3
3
3
4
4
4
5
5
5
6
6
6
7
7
7
8
8
8
9
9
9
10
10
10
....
Из-за чего это происходит? Ведь вроде всё правильно...
 

kmsfax

Известный
154
89
Возможно ли поставить запрет на перезагрузку скрипта?
 
Последнее редактирование:

ynhhoJ

Известный
102
6
Lua:
local rX, rY, rZ, w = getObjectQuaternion(object)
Появляется ошибка когда пытаюсь узнать Кватернион объекта и появляется варнинг в игре, в а MoonLoader-e это:
Код:
(error)    opcode '07C3' call caused an unhandled exception
(error)    Object Stealer v0.1: cannot resume non-suspended coroutine
(error)    Object Stealer v0.1: Script died due to error. (1C6F28EC)
Как можно исправить проблему?