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

FBenz

Активный
328
40
Как сделать imgui.Text нужным шрифтом? И куда пихать файл со шрифтом? И какое название должно у него быть?
Я скачал Monotype Corsiva, кинул файл шрифта в lib (название файла рандомное 88238.ttf), в main пихнул:
Код:
newFont = renderCreateFont("Monotype Corsiva", 15.5, 1)
и в onDrawFrame:
Lua:
imgui.PushFont(newFont)
imgui.Text(string.upper('FEDERAL'))
imgui.PopFont()
Шо не так? Крашит игру, в логе пусто
 

~Justie~

Участник
133
25
Lua:
function sampev.onSendCommand(cmd)
    idrec = string.match(cmd,"%/re (%d+)")
end
По сути код записывает значение после команды /re, с этим он справляется отлично, НО если я отправлю другую команду, то значение переменной idrec будет nil, это очень мешает, как это можно исправить?
 
D

deleted-user-328926

Гость
Не получается перехватить диалоговое окно, библиотека SAMP.Events установлена. другие функции этой библиотеки работают.
Код:
local hooks = require 'lib.samp.events'

function hooks.onShowDialod(id, style, title, button1, button2, text) -- функция вызывается каждый раз, когда появляется диалог
  -- text - это текст диалога
  return fasle -- не отображать диалог
end
dialod?
Может быть dialog?

Код:
function sampev.onSendCommand(cmd)
    idrec = string.match(cmd,"/re (%d+)")
end
По сути код записывает значение после команды /re, с этим он справляется отлично, НО если я отправлю другую команду, то значение переменной idrec будет nil, это очень мешает, как это можно исправить?
все исправимо, брат!
Lua:
function sampev.onSendCommand(cmd)
    idrec = string.match(cmd,"/re (%d+)") or idrec
end
должно работать

как сделать чтобы меня из машины тпхало на ноги?просто вот это тпхает вместе с тачкой...
Код:
setCharCoordinates(PLAYER_PED, x, y, z)
а еще как сделать отправку серверу синхры с водительского места?(при этом я должен стоять на ногах)
чтобы тпхало на ноги сначала надо выйти из машины, в этом тебе поможет sampSendExitVehicle(carid), где carid = айди машины
 
  • Нравится
Реакции: Artem90

Petr_Sergeevich

Известный
Проверенный
707
297
Как сделать imgui.Text нужным шрифтом? И куда пихать файл со шрифтом? И какое название должно у него быть?
Я скачал Monotype Corsiva, кинул файл шрифта в lib (название файла рандомное 88238.ttf), в main пихнул:
Код:
newFont = renderCreateFont("Monotype Corsiva", 15.5, 1)
и в onDrawFrame:
Lua:
imgui.PushFont(newFont)
imgui.Text(string.upper('FEDERAL'))
imgui.PopFont()
Шо не так? Крашит игру, в логе пусто
Шрифты в imgui немного иначе создаются
Lua:
local font = nil
function imgui.BeforeDrawFrame()
    if not font then    
        imgui.GetIO().Fonts:Clear()
        font = imgui.GetIO().Fonts:AddFontFromFileTTF(getFolderPath(0x14)..'\\arial.ttf', 19, nil, imgui.GetIO().Fonts:GetGlyphRangesCyrillic())
        imgui.RebuildFonts()
    end
end
 
  • Нравится
Реакции: FBenz

BIG BOG

Известный
654
142
чтобы тпхало на ноги сначала надо выйти из машины, в этом тебе поможет sampSendExitVehicle(carid), где carid = айди машины
проблема в том,что мне тогда надо синхру,которая будет имитировать то,что я сижу в авто, ведь sampSendExitVehicle(carid) просто отправит на сервер синхру,не меняя моё положение
 

~Justie~

Участник
133
25
все исправимо, брат!
function sampev.onSendCommand(cmd)
idrec = string.match(cmd,"/re (%d+)") or idrec
endВыделить кодLua
должно работать
Ляя, как же ты мне помог, спасибо большое :3

Как сделать определенное окно imgui не активным? То есть что бы оно не было выделено и не было курсора
 
D

deleted-user-328926

Гость
проблема в том,что мне тогда надо синхру,которая будет имитировать то,что я сижу в авто, ведь sampSendExitVehicle(carid) просто отправит на сервер синхру,не меняя моё положение
интересно, ты хочешь тпхнуться на ноги но при том сидя в машине? какой-то сюрр

Ляя, как же ты мне помог, спасибо большое :3

Как сделать определенное окно imgui не активным? То есть что бы оно не было выделено и не было курсора
я никогда не работал с ImGui и только начинаю писать скрипты, но попробуй поэкспериментировать с SetWindowFocus(какие-то аргументы);
 
  • Нравится
Реакции: ~Justie~

FYS

Потрачен
982
236
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ляя, как же ты мне помог, спасибо большое :3

Как сделать определенное окно imgui не активным? То есть что бы оно не было выделено и не было курсора
Lua:
imgui.ShowCursor = false -- курсор (true - активен, false - неактивен)
imgui.Begin('SYKA', test , imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoTitleBar) -- окно
 

astynk

Известный
Проверенный
742
532
как узнать айди диалога созданного сервером?
sampGetCurrentDialogId()

как сделать чтобы меня из машины тпхало на ноги?просто вот это тпхает вместе с тачкой...
Код:
setCharCoordinates(PLAYER_PED, x, y, z)
а еще как сделать отправку серверу синхры с водительского места?(при этом я должен стоять на ногах)
Lua:
local x, y, z = getCharCoordinates(1)
warpCharFromCarToCoord(1, x, y, z + 1)
Насчет второго - нопать онфут синхру и отправлять вместо нее водительскую.
 

mld

Участник
99
11
смотрите,правильно ли я написал string.format по получению значения денег у игрока?

Lua:
checkmoney = getPlayerMoney(PLAYER_HANDLE)

string.format(u8"Деньги:%d{ff00ff} ",checkmoney)

Так должно быть?
 

smurf1k➹

Участник
78
67
смотрите,правильно ли я написал string.format по получению значения денег у игрока?

Lua:
checkmoney = getPlayerMoney(PLAYER_HANDLE)

string.format(u8"Деньги:%d{ff00ff} ",checkmoney)

Так должно быть?
смотрите,правильно ли я написал string.format по получению значения денег у игрока?

Lua:
checkmoney = getPlayerMoney(PLAYER_HANDLE)

string.format(u8"Деньги:%d{ff00ff} ",checkmoney)

Так должно быть?
sampSendChat(string.format('Деньги:%d{ff00ff} ', checkmoney)) -- u8 здесь не нужно, просто измени кодировку на win1251

как узнать айди диалога созданного сервером?
Lua:
function samp.onShowDialog(id, style, title, b1, b2, text) -- при появлении диалога
sampAddChatMessage(id, -1) -- напишет его ID
end
 

astynk

Известный
Проверенный
742
532
где-то можно найти примеры заполнения подобных структур?просто мне надо VehicleSync создать а я не знаю как,пробовал в events поискать,но не понял ничего
Lua:
function sendOnfootSync(x, y, z, veh)
    local _, myId = sampGetPlayerIdByCharHandle(PLAYER_PED)
    local data = allocateMemory(68)
    sampStorePlayerOnfootData(myId, data)
    setStructElement(data, 37, 1, 3, false)
    setStructFloatElement(data, 6, x, false)
    setStructFloatElement(data, 10, y, false)
    setStructFloatElement(data, 14, z, false)
    setStructElement(data, 62, 2, veh, false)
    sampSendOnfootData(data)
    freeMemory(data)
end
В lib/sampsynchronization.lua есть все структуры.
Функция для отправки кар синхры, достал из одного старого скрипта:
Lua:
function sendFakeVehicleSync(vehId)
    local data = allocateMemory(59)
   
    setStructElement(data, 0, 2, vehId, false)
    setStructElement(data, 2, 2, 0, false)
    setStructElement(data, 4, 2, 0, false)
    setStructElement(data, 6, 2, 0, false)
    setStructFloatElement(data, 8, 0, false)
    setStructFloatElement(data, 12, 0, false)
    setStructFloatElement(data, 16, 0, false)
    setStructFloatElement(data, 20, 0, false)
    setStructFloatElement(data, 24, 0, false)
    setStructFloatElement(data, 28, 0, false)
    setStructFloatElement(data, 32, 0, false)
    setStructFloatElement(data, 36, 0, false)
    setStructFloatElement(data, 40, 0, false)
    setStructFloatElement(data, 44, 0, false)
    setStructFloatElement(data, 48, 1000, false)
    setStructElement(data, 52, 1, 100, false)
    setStructElement(data, 53, 1, 0, false)
    setStructElement(data, 54, 1, 0, false)
    setStructElement(data, 55, 1, 0, false)
    setStructElement(data, 56, 1, 0, false)
    setStructElement(data, 57, 2, 0, false)
   
    sampSendIncarData(data)
    freeMemory(data)
end
 

smurf1k➹

Участник
78
67
Lua:
function sampev.onSendCommand(cmd)
    idrec = string.match(cmd,"%/re (%d+)")
end
По сути код записывает значение после команды /re, с этим он справляется отлично, НО если я отправлю другую команду, то значение переменной idrec будет nil, это очень мешает, как это можно исправить?
Lua:
function sampev.onSendCommand(cmd)
   if cmd == "re" then -- если команда равна /re, тогда
    idrec = string.match(cmd,"%/re (%d+)") -- записывай значение аргумента
   end
end