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

sep

Известный
681
77
код:
--почему это работает

    sampRegisterChatCommand('gan', function() gan = not gan end)


    if gan then
      sampSetChatInputText("/sellgun /selldrugs  /makegun 2 50")
      sampSetChatInputEnabled(true)
      gan = false
    end
    
    
    --а это нет
    
    sampRegisterChatCommand('gan1', function(param)
      sampSetChatInputText('/sellgun /selldrugs  /makegun 2 50')
      sampSetChatInputEnabled(true)
    end)
    
    --хотя так тоже работает
    
            sampRegisterChatCommand('gan1', function(param)
sampSendChat('1')
    end)
 

SHARLYBUTTOM

Известный
598
119
Допустим я хочу создать много команд и не хочу писать sampRegisterChatCommand для каждой из команд, есть ли какая строка что отвечает за это?
 

Fott

Простреленный
3,461
2,378
А как сделать что-бы текст был внизу? А время в верху, знаю что через /n, но как правильно сделать
Какой именно текст? Сейчас это выглядит так:
В Украине сейчас так же как и в России:
*Время*
Погодка тоже не плохая'
renderFontDrawText(font,'В Украине сейчас так же как и в России: \n'..os.date("!%H:%M", os.time(utc) + 3 * 3600 ).. ' \nПогодка тоже не плохая', 200, 300, -1)
 
  • Нравится
Реакции: rayprod

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,920
1,292

liwgvnqsok

Потрачен
227
125
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
цикл for и таблицы
а как ты функции будешь создавать для этих команд умник

Допустим я хочу создать много команд и не хочу писать sampRegisterChatCommand для каждой из команд, есть ли какая строка что отвечает за это?
для каждой команды отдельная функция, придется уж потерпеть
 

wulfandr

Известный
636
260
приветствую, подскажите функцию узнающая изменил ли сервер вам хп в реальном времени, спасибо, или это событие какое то
 

Rei

Известный
Друг
1,616
1,674
приветствую, подскажите функцию узнающая изменил ли сервер вам хп в реальном времени, спасибо, или это событие какое то
в events есть
Подскажет кто почему у меня зацикливается код в потоке?
Нет никаких FOR | WHILE и прочего, что явно бы зациклило мой линейный код.
Также отмечу, что поток нужен только для того, чтобы добавить wait().

Часть кода, которая зацикливается:
if string.len(message) > 20 or string.len(message) < 3 then
    if not is_def or not is_word then
        sampAddChatMessage("HAHAHHAHAHA")
        return false
    end
end
попробуй return false убрать
 

liwgvnqsok

Потрачен
227
125
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
приветствую, подскажите функцию узнающая изменил ли сервер вам хп в реальном времени, спасибо, или это событие какое то
onSetPlayerHealth
событие.
ловится через сампевентс , ведь номер рпц не подскажу
 
  • Нравится
Реакции: wulfandr

sep

Известный
681
77
как сообщение от сервера поймать неработает
код:
function sampev.onServerMessage(color, text)
              if string.find(text, 'Сейчас у Вас аптечек: 3 шт.', 1, true) then
                --Сейчас у Вас аптечек: {33cc33}3 шт.
                sampSendChat('1')
              end
          end
 

CaJlaT

07.11.2024 14:55
Модератор
2,836
2,674
как сообщение от сервера поймать неработает
код:
function sampev.onServerMessage(color, text)
              if string.find(text, 'Сейчас у Вас аптечек: 3 шт.', 1, true) then
                --Сейчас у Вас аптечек: {33cc33}3 шт.
                sampSendChat('1')
              end
          end
Из-за цвета и не ловит...
if text:find('Сейчас у Вас аптечек: %{33cc33%}%d+ шт%.') then
 
  • Нравится
Реакции: sep