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

qdIbp

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

si6on1

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

qdIbp

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

why ega

РП игрок
Модератор
2,541
2,233
Есть смысл скиппать биты, отвечающие за ид пакета при его нопе?

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

XRLM

Известный
2,544
863
какой int в vector3d и float?
19KAdKTxRwI.jpg


че эм?
 
Последнее редактирование:
  • Эм
  • Клоун
Реакции: Air_Official и ARMOR

XRLM

Известный
2,544
863
я заебался мозги себе ебать. как заполнить 68 rpc? структура
Lua:
{'onSetSpawnInfo', {team = 'uint8'}, {skin = 'int32'}, {_unused = 'uint8'}, {position = 'vector3d'}, {rotation = 'float'}, {weapons = 'Int32Array3'}, {ammo = 'Int32Array3'}}
 
  • Клоун
Реакции: Air_Official

why ega

РП игрок
Модератор
2,541
2,233
я заебался мозги себе ебать. как заполнить 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

Известный
2,544
863
Вроде так:
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(__СОХРАНЁННЫЙ ЦВЕТ__)
 

zvezdavnebe

Участник
26
3
Приветствую народ, надеюсь сможете помочь, тк не силён в lua. Это обычный круиз контроль, но... Помогите исправить звуки "очереди пулемёта" когда машина достигает нужной скорости круиза и сделать шаг повышения/понижения скорости круиза не по 5км/ч,а по 1км/ч и при долгом нажатие кнопки, что бы быстро повышалась/понижалась ( а не тыкать 10 раз, для повышения 10км/ч ). Огромная благодарность заранее
 

Вложения

  • cruise_control.lua
    1.3 KB · Просмотры: 5

why ega

РП игрок
Модератор
2,541
2,233
Чет синхра не отправляется, в чом проблема?
Lua:
local data = samp_create_sync_data("unoccupied")
data.vehicleId = vehid
data.seatId = 0
local px, py, pz = getCharCoordinates(ped)
if isCharInAnyCar(ped) then
    data.position = {px,py - 0.5,pz - 0.5}
    data.moveSpeed = {0,1,1}
else
    data.position = {px,py,pz-0.5}
    data.moveSpeed = {0,0,1}
end
data.send()

Попробовал сам вписать битстрим, но чет тоже не получается
Lua:
local px, py, pz = getCharCoordinates(ped)
local bs = RakLuaBitStream.new()
bs:writeUInt8(209) -- packetId
bs:writeInt16(vehid) -- vehId
bs:writeUInt8(0) -- seatId
bs:setWriteOffset(27) -- offset
bs:writeFloat(px) -- posX
bs:writeFloat(py) -- posY
bs:writeFloat(pz) -- posZ

P.S. У унок синрхры надо записывать фулл структуру
 
Последнее редактирование:

shibaTaidjy

Известный
446
157
как можно удалить все объекты в зоне стрима?пробывал но не удалялись