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

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

Известный
187
202
попробовал что-то написать, 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,197
так учись, учись писать код, учись искать инфу если не находишь тогда спрашивай и все
 
  • Нравится
Реакции: XRLM и YarikVL

si6on1

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

qdIbp

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

вайега52

cache miss
Модератор
3,084
3,415
Есть смысл скиппать биты, отвечающие за ид пакета при его нопе?

Пытаюсь эмулировать пакет плеер синхры, но крашит игру. Структура, которую заполняю:
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

cache miss
Модератор
3,084
3,415
какой int в vector3d и float?
19KAdKTxRwI.jpg


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

вайега52

cache miss
Модератор
3,084
3,415
я заебался мозги себе ебать. как заполнить 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

XRLM

Против ветра рождённый
Модератор
1,688
1,408
Вроде так:
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
эт ес шо раклуа, под сф сам переписешь
я пишу на павне, но так как почти везде все идентичное, спрашиваю тут.
 

NetyEgo

Участник
164
10
Lua:
local color1 = imgui.ImFloat4(255, 255, 255, 255)

imgui.ColorEdit4(u8'Цвет слов.', color1)
как сохранить цвет из imgui.ColorEdit4 и потом использовать в local color1 = imgui.ImFloat4(__СОХРАНЁННЫЙ ЦВЕТ__)