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

xbyte

Активный
111
95
Извините за наитупейший вопрос, но что происходит с пакетами, когда PLAYER_PED жмет F чтобы сесть в машину
 

NoName_001

Участник
152
21
Нужно сделать в скрипт изменение активации(по imgui.InputText). Как это сделать?(пс: команды находятся в ини)
 

bab0n

Известный
95
10
это FFFFFF, просто в десятеричной системе счисления.
Если тебе нужно куда-то в строчку вставить именно в шестнадцатиричной системе счисления, то вот:
Lua:
local color = 12351473
print(("%x"):format(color))

int doorStatus = getCarDoorLockStatus(Vehicle car)
Выходит 8 символов, а для цвета везде 6. Ну или другой баг
Трабл имено в кол-ве символов, html цвет подразумивает 6 символов а не 8, я сам пытался переводить и ничего не получалось.
 

Akionka

akionka.lua
Проверенный
742
502
Выходит 8 символов, а для цвета везде 6. Ну или другой баг
Трабл имено в кол-ве символов, html цвет подразумивает 6 символов а не 8, я сам пытался переводить и ничего не получалось.
очевидно потому что кроме РГБ ещё и альфа канал
 

CaJlaT

07.11.2024 14:55
Модератор
2,833
2,669
Lua:
        text, prefix, color, pcolor = sampGetChatString(99)
        g = ("%x"):format(color)
        text = text:gsub('Babon_Stern', '{9ACD32}Babon Stern{'..g..'}')
        sampSetChatString(99, text, prefix, color, pcolor)
Код на всякий

[ML] (script) toster.lua: 4291743438
[ML] (script) toster.lua: ffcecece
Lua:
text, prefix, color, pcolor = sampGetChatString(99)
g = bit.tohex(color, 6)
text = text:gsub('Babon_Stern', '{9ACD32}Babon Stern{'..g..'}')
sampSetChatString(99, text, prefix, color, pcolor)
 
  • Нравится
Реакции: bab0n

BloodyMax

Новичок
13
0
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)


Вот объясняют как сделать точно так же
У меня проблема не с изменением цвета в лайв режиме, вопрос не в этом был)
Меня интересует как синхронизировать это всё с ини файлом, чтобы человек мог поставить у цвета ''Чёрный''=true и он был у него мейн цветом со старта, либо поставить к ''Синий''=true и был бы синий

з.ы делается это всё для удобства, условно я не разбираюсь в коде и не хочу лезть туда и изменять там аргумент на нужную мне цифру, а в ини файлике сменив значение с false > true это всё было бы понятнее (для юзера, которому будет скинут скрипт...) надеюсь понял
 
Последнее редактирование:

Akionka

akionka.lua
Проверенный
742
502
У меня проблема не с изменением цвета в лайв режиме, вопрос не в этом был)
Меня интересует как синхронизировать это всё с ини файлом, чтобы человек мог поставить у цвета ''Чёрный''=true и он был у него мейн цветом со старта, либо поставить к ''Синий''=true и был бы синий

з.ы делается это всё для удобства, условно я не разбираюсь в коде и не хочу лезть туда и изменять там аргумент на нужную мне цифру, а в ини файлике сменив значение с false > true это всё было бы понятнее (для юзера, которому будет скинут скрипт...) надеюсь понял
вариант где сохраняется selectedColor=*цвет* принципиально не рассматриваете?
 

BARRY BRADLEY

Известный
711
176
Привет всем. Такой вопрос: у меня есть текст "Привет, как дела? Что сегодня делал?", вот, мне нужно вывести сообщение до 45 символов, но при это сохранить и не нарушить сами слова!! То есть до оследнего нужно пробела выводим в первом сообщении, а дальше во втором. Проблема может быть в том, что разделить надо будет не только на два ряда, но и на 5 и больше.
Вот такой код был, но плох тем что обрезает слово как раз на 45 символе, а не после пробела.

Lua:
str = "Привет, как дела? Что сегодня делал?"
for key = 0, math.floor(#str / 45) do
     sampSendChat(string.sub(str, key  * 45 + 1, (key + 1) * 45))
end

-- Выводит тип так:
-- сообщение 1: Привет, как дела? Ч
-- сообщение 2: то сегодня делал?
-- Это лишь пример как криво выводит
 

xbyte

Активный
111
95
есть код, который поворачивает камеру через setCameraPositionUnfixed
если смотреть персонажем вперед, то все работает нормально
но если немного отойти персонажем назад ближе к камере, то при поровоте она отдаляется (подробнее на видео ниже)
мне нужно сделать, чтобы она не отдалялась, как это можно реализовать?
Lua:
require "lib.moonloader"

function main()
  while true do
    wait(0)
    if isKeyDown(VK_CONTROL) then
        local view = {fix(representIntAsFloat(readMemory(0xB6F258, 4, false))), fix(representIntAsFloat(readMemory(0xB6F248, 4, false)))}
        view[1] = view[1] + 0.01
        setCameraPositionUnfixed(view[2], view[1])
    end
  end
end

function fix(angle)
    if angle > math.pi then
        angle = angle - (math.pi * 2)
    elseif angle < -math.pi then
        angle = angle + (math.pi * 2)
    end
    return angle
end
Зачем тебе работа с памятью?)
Lua:
local ffi = require 'ffi'
local sampfuncs = require 'sampfuncs'
local raknet = require 'samp.raknet'
require 'samp.synchronization'
ffi.cdef[[
struct OnSendEnterVehicle {
    uint16_t    vehicleId;
    bool    passenger;
} __attribute__ ((packed));
]]

function master(id)
    id = tonumber(id)
    active = not active
    local data_type = 'struct OnSendEnterVehicle'
    local data = ffi.new(data_type, {})
    local raw_data_ptr = tonumber(ffi.cast('uintptr_t', ffi.new(data_type .. '*', data)))
    data.vehicleId = id
    data.passenger = false
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt8(bs, 26)
    raknetBitStreamWriteBuffer(bs, raw_data_ptr, ffi.sizeof(data))
    raknetSendBitStreamEx(bs, sampfuncs.HIGH_PRIORITY, sampfuncs.UNRELIABLE_SEQUENCED, 1)
    raknetDeleteBitStream(bs)
end
Почему ничего не происходит, когда я пытаюсь отправить пакет допустим в авто с id63?
 
Последнее редактирование:

astynk

Известный
Проверенный
741
532
Привет всем. Такой вопрос: у меня есть текст "Привет, как дела? Что сегодня делал?", вот, мне нужно вывести сообщение до 45 символов, но при это сохранить и не нарушить сами слова!! То есть до оследнего нужно пробела выводим в первом сообщении, а дальше во втором. Проблема может быть в том, что разделить надо будет не только на два ряда, но и на 5 и больше.
Вот такой код был, но плох тем что обрезает слово как раз на 45 символе, а не после пробела.

Lua:
str = "Привет, как дела? Что сегодня делал?"
for key = 0, math.floor(#str / 45) do
     sampSendChat(string.sub(str, key  * 45 + 1, (key + 1) * 45))
end

-- Выводит тип так:
-- сообщение 1: Привет, как дела? Ч
-- сообщение 2: то сегодня делал?
-- Это лишь пример как криво выводит
Lua:
local lines = {''}
local i = 1
local len = 0
local message = 'Это сообщение будет разделено на части не более сорока пяти символов с сохранением целостности слов'
for word in message:gmatch('[^%s]+') do
    len = len + word:len() + 1
    if len > 45 then
        i = i + 1
        len = 0
        lines[i] = word .. ' '
    else
        lines[i] = lines[i] .. word .. ' '
    end
end
for k, v in pairs(lines) do
    sampAddChatMessage(v, -1)
end
 
  • Нравится
  • Влюблен
Реакции: BARRY BRADLEY и Quasper

ewin

Известный
673
372
Ввожу текст в imgui.InputText и пытаюсь через sampSendChat вывести, но скрипт просто крашится, как исправить?

Lua:
if imgui.Button(u8"Отправить", imgui.ImVec2(125, 0)) then
                sampSendChat("/pm "..idReport.." "..report_text_buff)