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

OtherWeather

Новичок
39
2
Почему при использовании в окно чата выводит 3 одинаковых сообщения вместо 1?
Lua:
script_name("Example script")

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

function main()
   while not isSampAvailable() do wait(100) end
   while true do
   wait(0)
   local result, target = getCharPlayerIsTargeting(playerHandle)
   if result then result, playerid = sampGetPlayerIdByCharHandle(target) end -- Если зажата пкм на игроке, то получаем ID.
     if result and isKeyDown(VK_1) then -- Если зажата пкм и кнопка 1 на игроке, то...
        name = sampGetPlayerNickname(playerid) -- получаем nickname игрока по ранее полученному ID.
      sampAddChatMessage(string.format("%s", name, 0x0099FF)) -- Выводим nickname в окно чата.
     end
   end
end
 
Последнее редактирование:

FYP

Известный
Автор темы
Администратор
1,758
5,722
Почему при использовании в окно чата выводит 3 одинаковых сообщения вместо 1?
Lua:
script_name("Example script")

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

function main()
   while not isSampAvailable() do wait(100) end
   while true do
   wait(0)
   local result, target = getCharPlayerIsTargeting(playerHandle)
   if result then result, playerid = sampGetPlayerIdByCharHandle(target) end -- Если зажата пкм на игроке, то получаем ID.
     if result and isKeyDown(VK_1) then -- Если зажата пкм и кнопка 1 на игроке, то...
        name = sampGetPlayerNickname(playerid) -- получаем nickname игрока по ранее полученному ID.
      sampAddChatMessage(string.format("%s", name, 0x0099FF)) -- Выводим nickname в окно чата.
     end
   end
end
потому что функция isKeyDown проверяет зажата ли клавиша. соответственно, сообщение будет выводиться каждый кадр, пока зажата клавиша, т.к. нет задержки. используй wasKeyPressed.
 

Garrus

Известный
159
20
При перезапуске скрипта функцией reloadScripts() или script:reload(), необходимо ли предварительно завершить поток, созданный функцией lua_thread.create(firstThread)?
 
Последнее редактирование:

OtherWeather

Новичок
39
2
Почему ID игрока отображается с задержкой и один рендер накладывается на другой?

c274a2d730e57c98d755f02f6b0e9797.png

Lua:
require "lib.moonloader"
require "lib.SAMPFUNCS"

function main()
     while not isSampAvailable() do wait(100) end
     font = renderCreateFont("Times New Roman", 20, 5);
     while true do
     wait(0)
     if not isPauseMenuActive() and not isKeyDown(VK_F8) then
     for i = 0, 1001 do -- перебираем все иды в зоне стрима и выбираем ближайший
         if sampIsPlayerConnected(i) then name = sampGetPlayerNickname(i) end
         instream, handle = sampGetCharHandleBySampPlayerId(i)
         if instream then
             pedX, pedY, pedZ = getCharCoordinates(handle)
             myX, myY, myZ = getCharCoordinates(playerPed)
             distance = getDistanceBetweenCoords3d(pedX, pedY, pedZ, myX, myY, myZ)
             distanceInteger = math.floor(distance)
             result, id = sampGetPlayerIdByCharHandle(handle)
             renderFontDrawText(font, string.format("ID: %s", id), 700, 500, -1) -- отрисовка ида
                 end
             end
         end
     end
end
 

FYP

Известный
Автор темы
Администратор
1,758
5,722
При перезапуске скрипта функцией reloadScripts() или script:reload(), необходимо ли предварительно завершить поток, созданный функцией lua_thread.create(firstThread)?
нет
Почему ID игрока отображается с задержкой и один рендер накладывается на другой?
в коде много ошибок
 
  • Нравится
Реакции: Garrus

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,338
Почему ID игрока отображается с задержкой и один рендер накладывается на другой?

c274a2d730e57c98d755f02f6b0e9797.png

Lua:
require "lib.moonloader"
require "lib.SAMPFUNCS"

function main()
     while not isSampAvailable() do wait(100) end
     font = renderCreateFont("Times New Roman", 20, 5);
     while true do
     wait(0)
     if not isPauseMenuActive() and not isKeyDown(VK_F8) then
     for i = 0, 1001 do -- перебираем все иды в зоне стрима и выбираем ближайший
         if sampIsPlayerConnected(i) then name = sampGetPlayerNickname(i) end
         instream, handle = sampGetCharHandleBySampPlayerId(i)
         if instream then
             pedX, pedY, pedZ = getCharCoordinates(handle)
             myX, myY, myZ = getCharCoordinates(playerPed)
             distance = getDistanceBetweenCoords3d(pedX, pedY, pedZ, myX, myY, myZ)
             distanceInteger = math.floor(distance)
             result, id = sampGetPlayerIdByCharHandle(handle)
             renderFontDrawText(font, string.format("ID: %s", id), 700, 500, -1) -- отрисовка ида
                 end
             end
         end
     end
end
Тебе нужно что бы ближайший игрок отображался или все игроки в стриме?
 

iTz_WEEZY

Известный
298
84
Как это правильно перевести в Луа
CLEO:
04C4: store_coords_to 0@ 1@ 2@ from_actor $PLAYER_ACTOR with_offset 0.0 0.0 -1.0
00A1: put_actor $PLAYER_ACTOR at 0@ 1@ 2@

Только начал вникать, а тут переменные нарисовались с которыми в луа я еще не очень дружу.

Lua:
X,  Y, Z = getOffsetFromCharInWorldCoords(playerPed, 0.0, 0.0, -1.0)
 setCharCoordinates(playerPed, X, Y, Z)
 

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,338
Как это правильно перевести в Луа
CLEO:
04C4: store_coords_to 0@ 1@ 2@ from_actor $PLAYER_ACTOR with_offset 0.0 0.0 -1.0
00A1: put_actor $PLAYER_ACTOR at 0@ 1@ 2@

Только начал вникать, а тут переменные нарисовались с которыми в луа я еще не очень дружу.

Lua:
X,  Y, Z = getOffsetFromCharInWorldCoords(playerPed, 0.0, 0.0, -1.0)
setCharCoordinates(playerPed, X, Y, Z)
У тебя это не работает или что?
 

iTz_WEEZY

Известный
298
84
У тебя это не работает или что?
Вот смотри, я точно делаю не правильно..
Lua:
while true do
        wait (0)
            local result = isCurrentCharWeapon(playerPed, 24)
              setCharAnimSpeed(playerPed, python_crouchfire, 3.0)
            setCharAnimSpeed(playerPed, python_crouchreload, 3.0)
            setCharAnimSpeed(playerPed, python_fire, 3.0)
            setCharAnimSpeed(playerPed, python_fire_poor, 3.0)
            local result = isCharShooting(playerPed)
            local X,  Y, Z = getOffsetFromCharInWorldCoords(playerPed, 0.0, 0.0, -1.0)
            setCharCoordinates(playerPed, X, Y, Z)
                    end
                end
 

iTz_WEEZY

Известный
298
84
какого то хрена всё равно не получается :sad_frog:

CLEO:
:Noname_11
0001: wait 0 ms
02D8:   actor $PLAYER_ACTOR current_weapon == 24
004D: jump_if_false @Noname_11
0393: actor $PLAYER_ACTOR perform_animation "python_crouchfire" at 3.0 times_normal_rate
0393: actor $PLAYER_ACTOR perform_animation "python_crouchreload" at 3.0 times_normal_rate
0393: actor $PLAYER_ACTOR perform_animation "python_fire" at 3.0 times_normal_rate
0393: actor $PLAYER_ACTOR perform_animation "python_fire_poor" at 3.0 times_normal_rate
02E0:   actor $PLAYER_ACTOR firing_weapon
004D: jump_if_false @Noname_11
04C4: store_coords_to 0@ 1@ 2@ from_actor $PLAYER_ACTOR with_offset 0.0 0.0 -1.0
00A1: put_actor $PLAYER_ACTOR at 0@ 1@ 2@
0002: jump @Noname_11
Lua:
script_name("No Name")
script_version_number(1)
script_version("v.1.0")
script_authors("iTz_Weezy")

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

function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do
      wait(200)
            end
      sampAddChatMessage("{44D5C7}[Lua] {FFFFFF}+C BUG {44FF68}Loaded",0xFFFFFF)
            while true do
        wait (0)
            if isCurrentCharWeapon(playerPed, 24) then
              setCharAnimSpeed(playerPed, python_crouchfire, 3.0)
            setCharAnimSpeed(playerPed, python_crouchreload, 3.0)
            setCharAnimSpeed(playerPed, python_fire, 3.0)
            setCharAnimSpeed(playerPed, python_fire_poor, 3.0)
            if isCharShooting(playerPed) then
            local X,  Y, Z = getOffsetFromCharInWorldCoords(playerPed, 0.0, 0.0, -1.0)
            local result = setCharCoordinates(playerPed, X, Y, Z)
                    end
                end
            end
        end
 

NARVELL

Известный
71
10
Что-то блокирует одинаковые php запросы через функцию downloadUrlToFile(). Как быть?
 

FYP

Известный
Автор темы
Администратор
1,758
5,722
Что-то блокирует одинаковые php запросы через функцию downloadUrlToFile(). Как быть?
эта функция не предназначена для обычных get/post-запросов. скорее всего кеширование блокирует одинаковые запросы.
 

Bogach

Активный
558
27
Подскажите, почему не работает?
Lua:
script_name("test")

require("lib.moonloader")
local sampev = require("lib.samp.events")

function main()
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
    end
end

function sampev.onServerMessage(color, text)
   print('onServerMessage:', color, text)
end
Сам скрипт не загружается, в консоле sampfuncs его нет в скрипт менеджере тоже, что я не так сделал?