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

YarikVL

Известный
Проверенный
4,706
1,800
хочу написать что-то типа простенького админского автоответчика. как бы сюда засунуть переменную на айди отправившего в репорт игрока, чтоб был автоматический ответ на его репорт?
Lua:
require "lib.moonloader"
local sampev = require "lib.samp.events"

function sampev.onServerMessage(color, text)
    if string.find(text, "текст репорта игрока", 1, true) then
        sampSendChat("автоответ от администратора")
    end
end
Не уверен, что правильно понял твою идею, но попробуй регулярным выражением вытаскивать ид ( так как ты строчки не показал, как выглядят в игре и в чатлоге, то оставлю тебе две ссылки на гайды: https://www.blast.hk/threads/62661/ и https://www.blast.hk/threads/93808/ )
А потом при выводе вписывать переменную с id игрока, возможно ещё нужно будет tostring для переменной твоей заюзать:
sampSendChat("ID игрока "..id)
 

XRLM

Против ветра рождённый
Модератор
1,693
1,394
хочу написать что-то типа простенького админского автоответчика. как бы сюда засунуть переменную на айди отправившего в репорт игрока, чтоб был автоматический ответ на его репорт?
Lua:
require "lib.moonloader"
local sampev = require "lib.samp.events"

function sampev.onServerMessage(color, text)
    if string.find(text, "текст репорта игрока", 1, true) then
        sampSendChat("автоответ от администратора")
    end
end
скинь текст сообщения и команду для ответа
 
  • Нравится
Реакции: qdIbp

NetyEgo

Участник
164
10
при нажатии на кнопку у меня срабатывает:
Lua:
thisScript():reload()
но остаётся курсор и нельзя поворачивать голову, как это исправить?
 

windranger

Участник
30
4
скинь текст сообщения и команду для ответа
попробовал что-то написать, 100 раз изменял код, но безуспешно
Lua:
require "lib.moonloader"
local samp = require 'lib.samp.events'

function samp.onServerMessage(color, text)
    if text:find('[Жалоба]%[%d+%]: спасибо') then
        local id = text:match('[Жалоба]%[%d+%]: спасибо')
        sampSendChat("/ans".. id .."Приятной игры")
    end
end
 

DZONE

Известный
186
200
попробовал что-то написать, 100 раз изменял код, но безуспешно
Lua:
require "lib.moonloader"
local samp = require 'lib.samp.events'

function samp.onServerMessage(color, text)
    if text:find('[Жалоба]%[%d+%]: спасибо') then
        local id = text:match('[Жалоба]%[%d+%]: спасибо')
        sampSendChat("/ans".. id .."Приятной игры")
    end
end
Lua:
if text:find("%[Жалоба%]%[%d+%]%: спасибо") then
    local _id = text:match("%[Жалоба%]%[(%d+)%]%: спасибо")
    print(_id)
end
если не подходит, то скинь скрин строки
 

qdIbp

Автор темы
Проверенный
1,438
1,199
так учись, учись писать код, учись искать инфу если не находишь тогда спрашивай и все
 
  • Нравится
Реакции: XRLM и YarikVL

si6on1

Новичок
7
0
Админю на одном сервере, и при спеке за игроком появляется курсор, который не дает свободно вращать камеру. Приходится вызывать какой-нибудь диалог и зажимать esc, тогда курсор пропадает и можно свободно осматриваться. Можно ли это как-то пофиксить, если да, то как?
 

qdIbp

Автор темы
Проверенный
1,438
1,199
Админю на одном сервере, и при спеке за игроком появляется курсор, который не дает свободно вращать камеру. Приходится вызывать какой-нибудь диалог и зажимать esc, тогда курсор пропадает и можно свободно осматриваться. Можно ли это как-то пофиксить, если да, то как?
 

вайега52

Налуашил состояние
Модератор
3,052
3,276
Есть смысл скиппать биты, отвечающие за ид пакета при его нопе?

Пытаюсь эмулировать пакет плеер синхры, но крашит игру. Структура, которую заполняю:
Lua:
{207, {"playerId", "int16"}, {"leftRightKeys", "int16"}, {"upDownKeys", "int16"}, {"keysData", "int16"}, {"positionX", "float"}, {"positionY", "float"}, {"positionZ", "float"}, {"quaternionW", "float"}, {"quaternionX", "float"}, {"quaternionY", "float"}, {"quaternionZ", "float"}, {"health", "int8"}, {"armor", "int8"}, {"weapon", "int8"}, {"specialAction", "int8"}, {"moveSpeedX", "float"}, {"moveSpeedY", "float"}, {"moveSpeedZ", "float"}, {"surfingOffsetsX", "float"}, {"surfingOffsetsY", "float"}, {"surfingOffsetsZ", "float"}, {"surfingVehicleId", "int16"}, {"animationId", "int16"}, {"animationFlags", "int16"}
 
Последнее редактирование:

вайега52

Налуашил состояние
Модератор
3,052
3,276
какой int в vector3d и float?
19KAdKTxRwI.jpg


че эм?
vector3d - float X, float Y, float Z
 

вайега52

Налуашил состояние
Модератор
3,052
3,276
я заебался мозги себе ебать. как заполнить 68 rpc? структура
Lua:
{'onSetSpawnInfo', {team = 'uint8'}, {skin = 'int32'}, {_unused = 'uint8'}, {position = 'vector3d'}, {rotation = 'float'}, {weapons = 'Int32Array3'}, {ammo = 'Int32Array3'}}
Вроде так:
Lua:
bs:writeUInt8(value) -- team
bs:writeInt32(value) -- skin
bs:writeUInt8(value) -- _unused
bs:writeFloat(value) -- posX
bs:writeFloat(value) -- posY
bs:writeFloat(value) -- posZ
bs:writeFloat(value) -- rotation
bs:writeInt32(value) -- weapon
bs:writeInt32(value) -- ammo
эт ес шо раклуа, под сф сам переписешь
 
  • Нравится
Реакции: XRLM