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

kuboni

Потрачен
154
2
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Does anyone have the most basic teleport soucer?
 

chromiusj

Известный
Модератор
6,054
4,400
Does anyone have the most basic teleport soucer?
 

Meer

Участник
51
20
Как можно сделать проверку текста который находится чуть ниже ника персонажа, к примеру название семьи и т.п. на аризоне?
 

chromiusj

Известный
Модератор
6,054
4,400
Как можно сделать проверку текста который находится чуть ниже ника персонажа, к примеру название семьи и т.п. на аризоне?
Lua:
local sampev = require 'samp.events'

function sampev.onCreate3DText(id,color,position,distance,testLOS,attachedPlayerId,attachedVehicleId,text)
   if text:find('piska') then
       print('+')
    end
end
 

chromiusj

Известный
Модератор
6,054
4,400
не работает к сожалению
1700839191782.png

Lua:
local sampev = require('lib.samp.events')
function sampev.onCreate3DText(id, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, text)
    if text:find('{.-}©(.+)') then
        local family = text:match('{.-}©(.+)')
        sampAddChatMessage('Нашли фаму: '..family,-1)
    end
end
это пример плохой проверки,очевидно можно проверить приатаченно ли оно к игроку,и там уже сверяться,так как не во всех фамах есть такой знак как в регулярке выше
 
  • Нравится
Реакции: Meer

kuboni

Потрачен
154
2
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
function samp.onSendPlayerSync(data)
if send then
if data.keysData == 160 then
data.keysData = 0
end
if data.weapon == 44 or data.weapon == 45 or data.weapon == 46 then
data.weapon = 0
end
if data.animationId ~= 0 then
data.animationId = 0
end
if data.upKeyDown == -128 then
data.upKeyDown = 0
end
end
end
I have blocked data.upkeydoưn to id = 0 but the code is dead and unused, why?
 

kuboni

Потрачен
154
2
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
use return false if you want to block something
function samp.onSendPlayerSync(data)
if send then
if data.keysData == 160 then
data.keysData = 0
end

if data.weapon == 44 or data.weapon == 45 or data.weapon == 46 then
data.weapon = 0
end

if data.animationId ~= 0 then
data.animationId = 0
end

if data.upKeyDown == -128 then
data.upKeyDown = 1
end
end

return false
end
THAT'S RIGHT, MAN
 

kuboni

Потрачен
154
2
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
I want to send id = 0 when upkeydown = -128 appears if I block it I will be afk
 

Oleg1337228

Известный
425
21
Почените, почему-то не приходит уведомление в тг с одним текстом приходит с этим нет строка лога: [Информация] {FFFFFF}Транспорт снят с продажи, из-за того что вы или транспорт покинули место!
 

Вложения

  • [Snyat s prod ts.lua
    2 KB · Просмотры: 5

Dmitriy Makarov

25.05.2021
Проверенный
2,510
1,139
Почените, почему-то не приходит уведомление в тг с одним текстом приходит с этим нет строка лога: [Информация] {FFFFFF}Транспорт снят с продажи, из-за того что вы или транспорт покинули место!
if text:find(%[Информация%] {.-}Транспорт снят с продажи, из%-за того что вы или транспорт покинули место!") then
 

Dmitriy Makarov

25.05.2021
Проверенный
2,510
1,139
Не работает все поменял.
Ну не знаю, у меня в редакторе всё работает.
Такой код тоже можешь попробовать, у меня он тоже работает.
Lua:
local text = "[Информация] {FFFFFF}Транспорт снят с продажи, из-за того что вы или транспорт покинули место!"
if text:find("%[Информация%] {......}Транспорт снят с продажи%, из%-за того что вы или транспорт покинули место%!") then
    print("+")
end

-- Out: +
 

MrDorlik

Известный
940
376
На самом деле это не код, но, скажем, если функция с именем TRAG = true, вы не можете наносить урон игрокам или нажимать кнопку ОГОНЬ (щелкните левой кнопкой мыши).
отменять урон - рпс отменяй просто, название не помню к сожалению