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

McLore

Известный
559
279
Можете скинуть пример защиты скрипта от передачи между людьми?
Или как сделать чтобы скрипт работал некоторое время , допустим день
 
Последнее редактирование:

sanders

Потрачен
253
126
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Можете скинуть пример защиты скрипта от передачи между людьми?
Или как сделать чтобы скрипт работал некоторое время , допустим день
Lua:
function getHarddiskSerial()
    local ffi = require("ffi")
    ffi.cdef[[
    int __stdcall GetVolumeInformationA(
        const char* lpRootPathName,
        char* lpVolumeNameBuffer,
        uint32_t nVolumeNameSize,
        uint32_t* lpVolumeSerialNumber,
        uint32_t* lpMaximumComponentLength,
        uint32_t* lpFileSystemFlags,
        char* lpFileSystemNameBuffer,
        uint32_t nFileSystemNameSize
    );
    ]]
    local serial = ffi.new("unsigned long[1]", 0)
    ffi.C.GetVolumeInformationA(nil, nil, 0, serial, nil, nil, nil, 0)
    return serial[0]
end
-- выше получение жесткого диска
function main()
    repeat wait(0) until isSampAvailable()
    local key = getHarddiskSerial() -- ключ нашего диска
local key = require 'md5'.sumhexa(getHarddiskSerial())
  local codes = require 'requests'.get('сайт с привязками') -- отправляем запрос на хостинг
  if not codes.text:find(key) then -- если ключа там не оказалось(в тхт файле) то
    print('У вас нет лицензии. Ваш ключ:', key) -- то получим ключ в SF панели на Ё  
    return -- завершим работу
  else
    print('Скрипт успешно активирован') -- если ключ найден, то код вопспроизведется
  end
      while true do
          wait(0)
    end
end
 

K1LLMVCHINE

Новичок
8
0
Как записать, если мой персонаж убивает противоположного(скажем врага), то появляется текст?
 

Данекк

Известный
39
0
добрый день. помогите пожалуйста, есть переменная text, в ней 2 числа и тескт нужно достать все цифры из переменной text а затем присвоить 1 переменной 1 найденное число, 2 переменной 2 найденное число
 

yarsuetolog

Участник
67
7
Здравствуйте. Есть код, который создает инпут в имгуи и введенный текст будет писаться в чат. Проблема в том, что русский текст пишется каракулями, хотя декод стоит и кодировка файла Windows-1251. Можете помочь?

Lua:
if imgui.InputText(u8'cюда текст', moonimgui_text_buffer) then
    sampAddChatMessage('text:', u8:decode(moonimgui_text_buffer.v))
end
.
 

cheremuxa

Известный
430
200
Здравствуйте. Есть код, который создает инпут в имгуи и введенный текст будет писаться в чат. Проблема в том, что русский текст пишется каракулями, хотя декод стоит и кодировка файла Windows-1251. Можете помочь?

Lua:
if imgui.InputText(u8'cюда текст', moonimgui_text_buffer) then
    sampAddChatMessage('text:', u8:decode(moonimgui_text_buffer.v))
end
.
в начало скрипта
Lua:
u8 = encoding.UTF8
добрый день. помогите пожалуйста, есть переменная text, в ней 2 числа и тескт нужно достать все цифры из переменной text а затем присвоить 1 переменной 1 найденное число, 2 переменной 2 найденное число
Lua:
text = 2, 3
n1, n2 = text

---или---
text = 'text', 'odin'
t1, t2 = text
 

K1LLMVCHINE

Новичок
8
0
Здравствуйте. Помогите с написанием кода. Какие строчки нужны чтобы при убийстве моим персонажем, появлялся текст на экране.
 

yarsuetolog

Участник
67
7
так какой из текстов каракули?
во второй строке, после text: должно выводить текст, который я ввел в инпут, если я пишу на русском пишет каракулями. В остальном все работает. В ini файл тоже, кстати, каркули сохраняются
Lua:
if imgui.InputText(u8'cюда текст', moonimgui_text_buffer) then
    sampAddChatMessage('text:', u8:decode(moonimgui_text_buffer.v))
end
.
 

cheremuxa

Известный
430
200
во второй строке, после text: должно выводить текст, который я ввел в инпут, если я пишу на русском пишет каракулями. В остальном все работает. В ini файл тоже, кстати, каркули сохраняются
Lua:
if imgui.InputText(u8'cюда текст', moonimgui_text_buffer) then
    sampAddChatMessage('text:', u8:decode(moonimgui_text_buffer.v))
end
.
честно, не понимаю, все должно работать
 
  • Нравится
Реакции: yarsuetolog

Данекк

Известный
39
0
Есть переменная text которая равна определённой строчке из чата в этой строчке слова и 2 однозначных числа, мне нужно достать эти два числа и присвоить переменной t1 первое число а переменной t2 второе число, возможно ли это?