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

Мира

Участник
455
9
а если ли подробный гайд по регулярным выражением,а именно как спец. символы брать и обходить. просто не понимаю это %(%) и т.д. хз как правильно с * поступить. вроде %* , либо %*% , но это не точно. если поможете с * и : , буду благодарен
 

Shepard

Активный
459
88
а если ли подробный гайд по регулярным выражением,а именно как спец. символы брать и обходить. просто не понимаю это %(%) и т.д. хз как правильно с * поступить. вроде %* , либо %*% , но это не точно. если поможете с * и : , буду благодарен
отпиши мне vk kalibyga, мб помогу
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,656
2,542
только с помощью SAMP.Lua
Не только
 
  • Нравится
Реакции: Shepard

Eugene Crabs

Активный
544
30
Ребят, что это за хрень?

Moonloader.log особенного человека:
cannot resume non-suspended coroutine
stack traceback:
    [C]: in function 'pcall'
-- Это processLineOfSight используется

Какого хрена вообще pcall не защищает от этой ошибки?
 
U

user390868

Гость
Не только
ты прав. но суть в том. что чел всего лишь из-за одного слова дал возможность тебе написать сообщение и скинуть свою тему. если бы он вообще не писал бы слово "только", а просто бы написал что одна из возможностей это с помощью самп.луа, то ты бы уже не стал бы ничего ему писать. твоя библиотека кстати не плохая
 

Itachi Uchiha

Участник
124
21
Как сделать написание координат экрана под курсором? Например, если я наведусь на центр экрана, под курсором будут координаты места, куда навелся.
Еще, как юзать sampTextdrawCreate? Ничего не вышло
 

Vintik

Через тернии к звёздам
Проверенный
1,556
1,027
Не только
мне кажется, что для новичка лучше самп.луа, если честно)
 

Eugene Crabs

Активный
544
30
Есть ли код, который показывает, какие и сколько потоков сейчас активно в программе?
 

Мира

Участник
455
9
как в onServerMessage (if text:find()) отслеживать текст по его цвету?
может не тот цвет отслеживаю. желательно бы ещё как узнать цвет последней строки из чата
 

Eugene Crabs

Активный
544
30
как в onServerMessage (if text:find()) отслеживать текст по его цвету?
может не тот цвет отслеживаю. желательно бы ещё как узнать цвет последней строки из чата
Попробуй отправить текст нужного тебе сообщения в буфер обмена. Чисто в теории у тебя будет ID нужного цвета, а дальше ты сможешь сделать триггер
 
  • Нравится
Реакции: Мира

Eugene Crabs

Активный
544
30
Ребят, смотрите. Есть такая функция:

Код:
function Countdown(posX, posY, posZ)
    local ResOfPCall, Res, NewData
    ResOfPCall, Res, NewData = pcall(processLineOfSight, posX, posY, posZ, posX, posY, posZ-5, true, false, false, false, false, false, false, false)
    if Res then
        posZ = NewData.pos[3]+1
    else
        ResOfPCall, Res, NewData = pcall(processLineOfSight, posX, posY, posZ, posX, posY, posZ+5, true, false, false, false, false, false, false, false)
        if Res then posZ = NewData.pos[3]+1 end
    end
    return posX, posY, posZ, Res
end

Она выдает координаты земли с некоторым смещением по оси Z. Её проблема в том, что из-за нестабильной работы "processLineOfSight" она вылетает с ошибкой "cannot resume non-suspended coroutine". Я её использую в бесконечном цикле, который находится в потоке.

Впервые у меня уже нет сил бороться с этой парашной ошибкой. Помогите, пожалуйста. Я устал от неё
 

Rei

Известный
Друг
1,616
1,674
Ребят, смотрите. Есть такая функция:

Код:
function Countdown(posX, posY, posZ)
    local ResOfPCall, Res, NewData
    ResOfPCall, Res, NewData = pcall(processLineOfSight, posX, posY, posZ, posX, posY, posZ-5, true, false, false, false, false, false, false, false)
    if Res then
        posZ = NewData.pos[3]+1
    else
        ResOfPCall, Res, NewData = pcall(processLineOfSight, posX, posY, posZ, posX, posY, posZ+5, true, false, false, false, false, false, false, false)
        if Res then posZ = NewData.pos[3]+1 end
    end
    return posX, posY, posZ, Res
end

Она выдает координаты земли с некоторым смещением по оси Z. Её проблема в том, что из-за нестабильной работы "processLineOfSight" она вылетает с ошибкой "cannot resume non-suspended coroutine". Я её использую в бесконечном цикле, который находится в потоке.

Впервые у меня уже нет сил бороться с этой парашной ошибкой. Помогите, пожалуйста. Я устал от неё
вот ты кек, для получения земли есть же отдельная функция
ну и никакой "нестабильной работы" у линии нет, за полгода пользования салом ни разу не было ничего подобного. так что чини-ка ты руки
 
  • Нравится
Реакции: Eugene Crabs