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

|DEVIL|

Известный
363
281
Всем привет! Из-за моего скрипта вылезает ошибка при запуске сампа:

46037

Код:
script_name('PiarTracker')
script_author('Marcus Devil')
script_version('1.1')

require "lib.moonloader"
require "lib.sampfuncs"
local hook = require "lib.samp.events"

local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
local myname = sampGetPlayerNickname(id)
local tag = "{FF0000}[AdsTracker]{FFFFFF}"
local wh = "0xFFFFFF"
local inicfg = require 'inicfg'
local ones = 0
local tens = 0
local hund = 0
local megas = 0



function podchet()
    if ones == 10 then
        ones = 0
        tens = tens + 1
    end
    if tens == 10 then
        tens = 0
        hund = hund + 1
    end
    if hund == 10 then
        hund = 0
        megas = megas + 1
    end
end

function otchet()

    if tens == 1 then ones = ones + 10 end
    if tens == 2 then ones = ones + 20 end
    if tens == 3 then ones = ones + 30 end
    if tens == 4 then ones = ones + 40 end
    if tens == 5 then ones = ones + 50 end
    if tens == 6 then ones = ones + 60 end
    if tens == 7 then ones = ones + 70 end
    if tens == 8 then ones = ones + 80 end
    if tens == 9 then ones = ones + 90 end

    if hund == 1 then ones = ones + 100 end
    if hund == 2 then ones = ones + 200 end
    if hund == 3 then ones = ones + 300 end
    if hund == 4 then ones = ones + 400 end
    if hund == 5 then ones = ones + 500 end
    if hund == 6 then ones = ones + 600 end
    if hund == 7 then ones = ones + 700 end
    if hund == 8 then ones = ones + 800 end
    if hund == 9 then ones = ones + 900 end

    if megas == 1 then ones = ones + 1000 end
    if megas == 2 then ones = ones + 2000 end
    if megas == 3 then ones = ones + 3000 end
    if megas == 4 then ones = ones + 4000 end
    if megas == 5 then ones = ones + 5000 end
    if megas == 6 then ones = ones + 6000 end
    if megas == 7 then ones = ones + 7000 end
    if megas == 8 then ones = ones + 8000 end
    if megas == 9 then ones = ones + 9000 end
end

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
        while not isSampAvailable() do wait(100) end
            otchet()
            print(tens)
            sampRegisterChatCommand("pod", pd)
end

function pd()
     podchet()
     print(ones)
     print(tens)
     print(hund)
 end
В чём заключается моя ошибка?
 

Вложения

  • 1576954910177.png
    1576954910177.png
    4 KB · Просмотры: 189

Pheonixxx

Потрачен
263
46
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как приклеить текст к скину, или как создать текст на экране?
 

Pheonixxx

Потрачен
263
46
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
создать текст на экране

printStringNow('текст',время)
Это не то, я ХП в цифрах сделать хотел, чтобы он был ровный, и висел на указаных координатах, я так и не нашёл ничего в wiki
 

Pheonixxx

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

Naumov12345

Новичок
3
1
Помогите.
У меня есть функция мне нужно сделать так что бы она каждые 5 минут срабатывала. Как это реализовать? Подскажите пожалуйста
 

AnWu

Известный
Всефорумный модератор
4,777
5,402
Помогите.
У меня есть функция мне нужно сделать так что бы она каждые 5 минут срабатывала. Как это реализовать? Подскажите пожалуйста
Устанавливать кастомный таймер на 5 минут и в бесконечном цикле проверять этот таймер. Если время пришло -> вызвать функцию -> установить новый таймер на 5 минут
Lua:
local timer = -1
function main()
    while true do
      wait(0)
      local nowTime = os.time()
      if nowTime >= timer then
        exampleFunc()
        timer = nowTime + 300 -- Плюсуем 300 секунд к темущему времени = время следующего срабатывания
      end
    end
end
function exampleFunc()
  print("Right now")
end
 
Последнее редактирование:
  • Нравится
  • Влюблен
Реакции: Nuamov123 и Naumov12345

|DEVIL|

Известный
363
281
Всем привет! Из-за моего скрипта вылезает ошибка при запуске сампа:

Посмотреть вложение 46037
Код:
script_name('PiarTracker')
script_author('Marcus Devil')
script_version('1.1')

require "lib.moonloader"
require "lib.sampfuncs"
local hook = require "lib.samp.events"

local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
local myname = sampGetPlayerNickname(id)
local tag = "{FF0000}[AdsTracker]{FFFFFF}"
local wh = "0xFFFFFF"
local inicfg = require 'inicfg'
local ones = 0
local tens = 0
local hund = 0
local megas = 0



function podchet()
    if ones == 10 then
        ones = 0
        tens = tens + 1
    end
    if tens == 10 then
        tens = 0
        hund = hund + 1
    end
    if hund == 10 then
        hund = 0
        megas = megas + 1
    end
end

function otchet()

    if tens == 1 then ones = ones + 10 end
    if tens == 2 then ones = ones + 20 end
    if tens == 3 then ones = ones + 30 end
    if tens == 4 then ones = ones + 40 end
    if tens == 5 then ones = ones + 50 end
    if tens == 6 then ones = ones + 60 end
    if tens == 7 then ones = ones + 70 end
    if tens == 8 then ones = ones + 80 end
    if tens == 9 then ones = ones + 90 end

    if hund == 1 then ones = ones + 100 end
    if hund == 2 then ones = ones + 200 end
    if hund == 3 then ones = ones + 300 end
    if hund == 4 then ones = ones + 400 end
    if hund == 5 then ones = ones + 500 end
    if hund == 6 then ones = ones + 600 end
    if hund == 7 then ones = ones + 700 end
    if hund == 8 then ones = ones + 800 end
    if hund == 9 then ones = ones + 900 end

    if megas == 1 then ones = ones + 1000 end
    if megas == 2 then ones = ones + 2000 end
    if megas == 3 then ones = ones + 3000 end
    if megas == 4 then ones = ones + 4000 end
    if megas == 5 then ones = ones + 5000 end
    if megas == 6 then ones = ones + 6000 end
    if megas == 7 then ones = ones + 7000 end
    if megas == 8 then ones = ones + 8000 end
    if megas == 9 then ones = ones + 9000 end
end

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
        while not isSampAvailable() do wait(100) end
            otchet()
            print(tens)
            sampRegisterChatCommand("pod", pd)
end

function pd()
     podchet()
     print(ones)
     print(tens)
     print(hund)
end
В чём заключается моя ошибка?
 

AnWu

Известный
Всефорумный модератор
4,777
5,402
Lua:
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
Получаешь самп ид когда самп еще не готов. Запихни это в main после проверки на загрузку сампа
 
  • Нравится
Реакции: |DEVIL|

|DEVIL|

Известный
363
281
Проблемка в скрипте с функцией podchet, а именно после отчёта функция ищет только то что равно десяти, но не больше. Как сделать так чтобы функция превращала к примеру 10 ones в 1 tens и т.д?
Код:
script_name('PiarTracker')
script_author('Marcus Devil')
script_version('1.1')

require "lib.moonloader"
require "lib.sampfuncs"
local hook = require "lib.samp.events"

local tag = "{FF0000}[AdsTracker]{FFFFFF}"
local wh = "0xFFFFFF"
local inicfg = require 'inicfg'
local ones = 2
local tens = 4
local hund = 2
local megas = 0



function podchet()
    if ones == 10 then
        ones = 0
        tens = tens + 1
    end
    if tens == 10 then
        tens = 0
        hund = hund + 1
    end
    if hund == 10 then
        hund = 0
        megas = megas + 1
    end
end

function otchet()
    --Тенсы
    if tens == 1 then ones = ones + 10 end
    if tens == 2 then ones = ones + 20 end
    if tens == 3 then ones = ones + 30 end
    if tens == 4 then ones = ones + 40 end
    if tens == 5 then ones = ones + 50 end
    if tens == 6 then ones = ones + 60 end
    if tens == 7 then ones = ones + 70 end
    if tens == 8 then ones = ones + 80 end
    if tens == 9 then ones = ones + 90 end
    --Ханды
    if hund == 1 then ones = ones + 100 end
    if hund == 2 then ones = ones + 200 end
    if hund == 3 then ones = ones + 300 end
    if hund == 4 then ones = ones + 400 end
    if hund == 5 then ones = ones + 500 end
    if hund == 6 then ones = ones + 600 end
    if hund == 7 then ones = ones + 700 end
    if hund == 8 then ones = ones + 800 end
    if hund == 9 then ones = ones + 900 end
--Меги
    if megas == 1 then ones = ones + 1000 end
    if megas == 2 then ones = ones + 2000 end
    if megas == 3 then ones = ones + 3000 end
    if megas == 4 then ones = ones + 4000 end
    if megas == 5 then ones = ones + 5000 end
    if megas == 6 then ones = ones + 6000 end
    if megas == 7 then ones = ones + 7000 end
    if megas == 8 then ones = ones + 8000 end
    if megas == 9 then ones = ones + 9000 end
end

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
        while not isSampAvailable() do wait(100) end
            local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
            local myname = sampGetPlayerNickname(id)
            print(tens)
            sampRegisterChatCommand("pod", pd)
            sampRegisterChatCommand("otch", tch)
end

function pd()
     podchet()
     print(ones.."  "..tens.." "..hund)
end

function tch()
otchet()
print(ones)
end
 
Последнее редактирование:

Naumov12345

Новичок
3
1
Устанавливать кастомный таймер на 5 минут и в бесконечном цикле проверять этот таймер. Если время пришло -> вызвать функцию -> установить новый таймер на 5 минут
Lua:
local timer = -1
function main()
    while true do
      wait(0)
      local nowTime = os.time()
      if timer > 0 and nowTime >= timer then
        exampleFunc()
        timer = nowTime + 300 -- Плюсуем 300 секунд к темущему времени = время следующего срабатывания
      end
    end
end
function exampleFunc()
  print("Right now")
end
Спасибо, но всеравно проблема, у меня должно по идеи по комманде которую я зарегестрировал выполняться функция этой комманды. Я вставил в function main() таймер, но к сожилению 0 эффекта. После попробовал ваш скрипт полностью переписав его и уменьшив задержку, но всеравно не работает. Есть идеи из-за чего может быть так?
 

AnWu

Известный
Всефорумный модератор
4,777
5,402
Спасибо, но всеравно проблема, у меня должно по идеи по комманде которую я зарегестрировал выполняться функция этой комманды. Я вставил в function main() таймер, но к сожилению 0 эффекта. После попробовал ваш скрипт полностью переписав его и уменьшив задержку, но всеравно не работает. Есть идеи из-за чего может быть так?
убери условие time > 0
должно остаться:
Lua:
if nowTime >= timer then
 
  • Нравится
Реакции: Nuamov123 и Pheonixxx