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

Wood_Goblin

Новичок
22
0
Немного переделал скрипт:
Lua:
script_author("Wood_Goblin")
script_name("Spawn Security")
require "lib.moonloader"
local glob = require "lib.game.models"
local glob = require "lib.game.globals"

function main()
    playerchar = getGameGlobal(glob.PLAYER_CHAR)
    playerPed = getGameGlobal(glob.PLAYER_ACTOR)
    playerGroup = getGameGlobal(glob.PLAYER_GROUP)
    activeinterior = getGameGlobal(glob.Active_Interior)
    local death = false
    local arrest = false
    while true do
        wait(0)
        bool1 = isPlayerPlaying(playerchar)
        bool2 = doesCharExist(playerPed)
        if bool1 == false or bool2 == false then
            playerchar = getGameGlobal(glob.PLAYER_CHAR)
            playerPed = getGameGlobal(glob.PLAYER_ACTOR)
            activeinterior = getGameGlobal(glob.Active_Interior)
        end

        if testCheat("girlon") == true then
            print('cheat activated')
            requestModel(355)
            print('AK47 available')
            loadSpecialCharacter('gungrl1', 7)
            print('gungirl1 available')
            loadAllModelsNow()
            wait(10)
            print('gungirl1 and AK47 loaded')
            if isModelAvailable(355) and hasSpecialCharacterLoaded(7) then
                local paX, paY, paZ = getOffsetFromCharInWorldCoords(playerPed, 3.0, 1.0, 0.2)
                local girl1 = createChar(8, 296, paX, paY, paZ)
                setCharProofs(girl1, 1, 1, 1, 1, 1)
                giveWeaponToChar(girl1, 30, 99999)
                setCharAccuracy(girl1, 100)
                setGroupLeader(playerGroup, playerPed)
                setGroupMember(playerGroup, girl1)
                setCharCanBeKnockedOffBike(girl1, true)
                setCharWeaponSkill(girl1, 2)
                setCharRelationship(girl1, 1, 0)
                setCharRelationship(girl1, 4, 7)
                setCharRelationship(girl1, 1, 8)
                setCharRelationship(girl1, 4, 9)
                setCharRelationship(girl1, 4, 10)
                setCharRelationship(girl1, 4, 11)
                setCharRelationship(girl1, 4, 12)
                setCharRelationship(girl1, 4, 13)
                setCharRelationship(girl1, 4, 14)
                setCharRelationship(girl1, 4, 17)
                setCharRelationship(girl1, 3, 20)
                setCharRelationship(girl1, 2, 22)
                wait(10)
                print('gungirl1 spawned')
                while doesCharExist(girl1) do
                    wait(1000)
                    local interiorcj = getCharActiveInterior(playerPed)
                    local interiorgrl = getCharActiveInterior(girl1)
                    while isKeyJustPressed(96) or interiorcj ~= interiorgrl do
                        local pbX, pbY, pbZ = getOffsetFromCharInWorldCoords(playerPed, 0.0, 2.0, -0.9)
                        wait(100)
                        setCharCoordinates(girl1, pbX, pbY, pbZ)
                        setCharInterior(girl1, interiorcj)
                        interiorgrl = interiorcj
                        if interiorgrl == interiorcj then
                            wait(0)
                            print('gungirl1 relinked')
                            break
                        end
                    end

                    while isCharDead(girl1) or isPlayerDead(playerPed) or testCheat("girlof") == true do
                        wait(100)
                        removeCharFromGroup(girl1)
                        markModelAsNoLongerNeeded(355)
                        delete = markCharAsNoLongerNeeded(girl1)
                        deleteChar(girl1)
                        print('girl deleted')
                        if not doesCharExist(girl1) then
                            wait(0)
                            break
                        end
                    end
                end
            end
        end
    end
end

Правда, это не помогло. Игру крашит после сообщения print('AK47 available'), непосредственно при работе оператора loadSpecialCharacter('gungrl1', 7). Я по-прежнему не могу с ним сладить. %) В качестве аргументов передавал и 2 и 3 значения (при том разные), задавал оператор - как значение переменной special07, :wall: результат один и тот-же. :sorry: Описание для loadSpecialCharacter я не нашел. :unknw:
 

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,339
Немного переделал скрипт:
Lua:
script_author("Wood_Goblin")
script_name("Spawn Security")
require "lib.moonloader"
local glob = require "lib.game.models"
local glob = require "lib.game.globals"

function main()
    playerchar = getGameGlobal(glob.PLAYER_CHAR)
    playerPed = getGameGlobal(glob.PLAYER_ACTOR)
    playerGroup = getGameGlobal(glob.PLAYER_GROUP)
    activeinterior = getGameGlobal(glob.Active_Interior)
    local death = false
    local arrest = false
    while true do
        wait(0)
        bool1 = isPlayerPlaying(playerchar)
        bool2 = doesCharExist(playerPed)
        if bool1 == false or bool2 == false then
            playerchar = getGameGlobal(glob.PLAYER_CHAR)
            playerPed = getGameGlobal(glob.PLAYER_ACTOR)
            activeinterior = getGameGlobal(glob.Active_Interior)
        end

        if testCheat("girlon") == true then
            print('cheat activated')
            requestModel(355)
            print('AK47 available')
            loadSpecialCharacter('gungrl1', 7)
            print('gungirl1 available')
            loadAllModelsNow()
            wait(10)
            print('gungirl1 and AK47 loaded')
            if isModelAvailable(355) and hasSpecialCharacterLoaded(7) then
                local paX, paY, paZ = getOffsetFromCharInWorldCoords(playerPed, 3.0, 1.0, 0.2)
                local girl1 = createChar(8, 296, paX, paY, paZ)
                setCharProofs(girl1, 1, 1, 1, 1, 1)
                giveWeaponToChar(girl1, 30, 99999)
                setCharAccuracy(girl1, 100)
                setGroupLeader(playerGroup, playerPed)
                setGroupMember(playerGroup, girl1)
                setCharCanBeKnockedOffBike(girl1, true)
                setCharWeaponSkill(girl1, 2)
                setCharRelationship(girl1, 1, 0)
                setCharRelationship(girl1, 4, 7)
                setCharRelationship(girl1, 1, 8)
                setCharRelationship(girl1, 4, 9)
                setCharRelationship(girl1, 4, 10)
                setCharRelationship(girl1, 4, 11)
                setCharRelationship(girl1, 4, 12)
                setCharRelationship(girl1, 4, 13)
                setCharRelationship(girl1, 4, 14)
                setCharRelationship(girl1, 4, 17)
                setCharRelationship(girl1, 3, 20)
                setCharRelationship(girl1, 2, 22)
                wait(10)
                print('gungirl1 spawned')
                while doesCharExist(girl1) do
                    wait(1000)
                    local interiorcj = getCharActiveInterior(playerPed)
                    local interiorgrl = getCharActiveInterior(girl1)
                    while isKeyJustPressed(96) or interiorcj ~= interiorgrl do
                        local pbX, pbY, pbZ = getOffsetFromCharInWorldCoords(playerPed, 0.0, 2.0, -0.9)
                        wait(100)
                        setCharCoordinates(girl1, pbX, pbY, pbZ)
                        setCharInterior(girl1, interiorcj)
                        interiorgrl = interiorcj
                        if interiorgrl == interiorcj then
                            wait(0)
                            print('gungirl1 relinked')
                            break
                        end
                    end

                    while isCharDead(girl1) or isPlayerDead(playerPed) or testCheat("girlof") == true do
                        wait(100)
                        removeCharFromGroup(girl1)
                        markModelAsNoLongerNeeded(355)
                        delete = markCharAsNoLongerNeeded(girl1)
                        deleteChar(girl1)
                        print('girl deleted')
                        if not doesCharExist(girl1) then
                            wait(0)
                            break
                        end
                    end
                end
            end
        end
    end
end

Правда, это не помогло. Игру крашит после сообщения print('AK47 available'), непосредственно при работе оператора loadSpecialCharacter('gungrl1', 7). Я по-прежнему не могу с ним сладить. %) В качестве аргументов передавал и 2 и 3 значения (при том разные), задавал оператор - как значение переменной special07, :wall: результат один и тот-же. :sorry: Описание для loadSpecialCharacter я не нашел. :unknw:
После загрузки модели и перед выдачай оружия поставь небольшую задержку, ну или проверяй модель на то что она загруженна, 500 мс вполне хватало и особо не заметна
 

FYP

Известный
Автор темы
Администратор
1,758
5,726
@Wood_Goblin похоже проблема в мунлоадере. напишу когда разберусь.

UPD: дело было в перепутанном порядке аргументов в функции loadSpecialCharacter. плагин с исправлением во вложении, но это не релиз.
код для теста:
Lua:
function special_ped_test()
   loadSpecialCharacter('ogloc', 1)
   while not hasSpecialCharacterLoaded(1) do
     wait(0)
   end
   local models = require 'lib.game.models'
   local x, y, z = getCharCoordinates(PLAYER_PED)
   local ped = createChar(24, models.SPECIAL01, x + 1, y + 1, z)
   unloadSpecialCharacter(1)
   -- do anything
   markCharAsNoLongerNeeded(ped)
end
 

Вложения

  • MoonLoader-023C-fix.rar
    412.1 KB · Просмотры: 9
Последнее редактирование:
  • Нравится
Реакции: Garrus и Wood_Goblin

Wood_Goblin

Новичок
22
0
@Wood_Goblin похоже проблема в мунлоадере. напишу когда разберусь.

UPD: дело было в перепутанном порядке аргументов в функции loadSpecialCharacter. плагин с исправлением во вложении, но это не релиз.
код для теста:
Lua:
function special_ped_test()
   loadSpecialCharacter('ogloc', 1)
   while not hasSpecialCharacterLoaded(1) do
     wait(0)
   end
   local models = require 'lib.game.models'
   local x, y, z = getCharCoordinates(PLAYER_PED)
   local ped = createChar(24, models.SPECIAL01, x + 1, y + 1, z)
   unloadSpecialCharacter(1)
   -- do anything
   markCharAsNoLongerNeeded(ped)
end

Спасибо за ответ и за плагин. Скачал, установил, немножко протестил. Резюмирую: При наличии скриптов игра не хотела работать: запускаю игру, загрузка проходит полностью, через 1-2 секунды крашит. Удалил все скрипты - ГТА запустилась. Установил weapon menu.lua (скрипт на выдачу оружия) - игра запустилась, но скрипт не работает. Так-же не работает этот скрипт:

Lua:
script_author("FYP")
script_name("Test Spawn")
require "lib.moonloader"

function main()
    while true do
        wait(10)
        if isPlayerPlaying(playerHandle) then
            wait(10)
            if isKeyJustPressed(51) then
                loadSpecialCharacter('ogloc', 1)
                while not hasSpecialCharacterLoaded(1) do
                    wait(0)
                end
                local models = require 'lib.game.models'
                local x, y, z = getCharCoordinates(PLAYER_PED)
                local ped = createChar(24, models.SPECIAL01, x + 1, y + 1, z)
                unloadSpecialCharacter(1)
                markCharAsNoLongerNeeded(ped)
            end
        while isPlayerDead(playerPed) do wait(10) end
        end
    end
end

Пробовал переделать этот скрипт по-разному - не работает. Остальные скрипты - либо краш игры, либо просто не работают.
П.С. Лог новой версией мунлодера не ведётся.
П.П.С. Чешу репу, пытаюсь вдуплить.
 

Wood_Goblin

Новичок
22
0
После загрузки модели и перед выдачай оружия поставь небольшую задержку, ну или проверяй модель на то что она загруженна, 500 мс вполне хватало и особо не заметна

Поставил задержку, не помогло.
П.С. А этой проверки мало: if isModelAvailable(355) and hasSpecialCharacterLoaded(7) then ? :sorry:
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,459
Твой скрипт работает. С последним фиксом.
 
  • Нравится
Реакции: Wood_Goblin

FYP

Известный
Автор темы
Администратор
1,758
5,726
Ты уже протестил? :blink: Тогда это очень странно, :scratch:у меня вообще ни один скрипт не робит (даже те, что есть на этом форуме). :sorry: :unknw: Буду искать причину. :wall:
установи moonloader с инсталлера, а затем закинь этот asi поверх того. не работает скорее всего из-за того что версия ниже .022, там не было lua51.dll.
 
  • Нравится
Реакции: Wood_Goblin

Wood_Goblin

Новичок
22
0
установи moonloader с инсталлера, а затем закинь этот asi поверх того. не работает скорее всего из-за того что версия ниже .022, там не было lua51.dll.

:facepalm: Вот блин, я обновление пропустил. :-[ У меня был MoonLoader v.021 alpha :pardon: Скачал архив, установил ручками - всё заработало. :dance: :gamer: Спасибо большое за помощь. :preved: :drink: Пойду дальше пилить скрипты :write:
П.С. Лог вернулся :ok: :bravo:
 

Wood_Goblin

Новичок
22
0
Господа, подскажите, пожалуйста: какие альтернативы в LUA для CLEO опкода: 08B7 ? :scratch:
Этот опкод находятся в списке "Ненужные в Lua" https://www.blast.hk/wiki/moonloader:missing_opcodes :unknw:
 
Последнее редактирование:

Wood_Goblin

Новичок
22
0
шутишь, да? аналог вызова функции он ищет...

Я извиняюсь, может что-то не то спросил. Я еще зелёный в скриптинге. Как правильно оформить эту функцию/вызов функции ?
08B7: test 3@ bit 13
 
Последнее редактирование:

kmsfax

Известный
154
89
Возможно ли как-то с помощью рендера вывести на экран модель (объект, скин, транспорт)? (Я имею введу не про - sampTextdrawSetModelRotationZoomVehColor).
 

FYP

Известный
Автор темы
Администратор
1,758
5,726
Господа, подскажите, пожалуйста: какие альтернативы в LUA для CLEO опкода: 08B7 ? :scratch:
Этот опкод находятся в списке "Ненужные в Lua" https://www.blast.hk/wiki/moonloader:missing_opcodes :unknw:
Lua:
local bitex = require 'lib.bitex' -- в начало

local bit = bitex.bextract(value, bitn, 1)
Возможно ли как-то с помощью рендера вывести на экран модель (объект, скин, транспорт)? (Я имею введу не про - sampTextdrawSetModelRotationZoomVehColor).
нет
 
  • Нравится
Реакции: Wood_Goblin