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

corner xyz

Участник
94
36
help!
SAMP 0.3.7 R3-1 CRMP
Lua:
function getAimPacketData()
    local aimptr = allocateMemory(31)
    local _, pid = sampGetPlayerIdByCharHandle(PLAYER_PED)
    sampStorePlayerAimData(pid, aimptr)
    pdata[counter].mode = memory.getuint8(aimptr)
    pdata[counter].cx = memory.getfloat(aimptr + 1)
    pdata[counter].cy = memory.getfloat(aimptr + 5)
    pdata[counter].cz = memory.getfloat(aimptr + 9)
    pdata[counter].px = memory.getfloat(aimptr + 13)
    pdata[counter].py = memory.getfloat(aimptr + 17)
    pdata[counter].pz = memory.getfloat(aimptr + 21)
    pdata[counter].az = memory.getfloat(aimptr + 25)
    pdata[counter].zoom = memory.getuint8(aimptr + 29)
    pdata[counter].wstate = memory.getuint8(aimptr + 30)
    pdata[counter].unk = memory.getuint8(aimptr + 31)
    freeMemory(aimptr)
end
крашит полностью самп, без всяких окошек краша

UPD: Год назад вроде все воркало, сборка с библиотеками и версиями муна\функса та же вроде.
На данный момент перешарил интернет в поиске подробностей о "sampStorePlayerAimData"
Испробовал все версии муна, функса, клео
 

hajcm

Новичок
14
0
Я новичок, только начинаю учить Lua. Подскажите как можно использовать переменные среды windows 10? Вот мне например нужно чтобы в чат выводился путь до домашней папки(или же основного юзера). Сама переменная: %HOMEPATH%
 

chromiusj

Kommando-Leiteinheit Bioresonanztechnik-Replika
Модератор
5,500
3,828
Я новичок, только начинаю учить Lua. Подскажите как можно использовать переменные среды windows 10? Вот мне например нужно чтобы в чат выводился путь до домашней папки(или же основного юзера). Сама переменная: %HOMEPATH%
1712129957435.png

Lua:
os.getenv('HOMEPATH')
 
  • Ха-ха
  • Вау
Реакции: Vintik и qdIbp

Vintik

Через тернии к звёздам
Проверенный
1,521
994
При создании объекта через lua за пределами игровой карты их не видно. Можно как-то исправить это?
Пробовал эмуляцией RPC?

как получить данные из
OnPlayerEnterDynamicArea хуком? @

ChromiusJ

Эта функция, как я понял, обрабатывается на стороне сервера, а не игрового клиента.
Тебе нужно, чтобы срабатывал скрипт при входе в какую-либо область?
Используй функцию getCharCoordinates() в цикле.
Или в чём суть задачи?

help!
SAMP 0.3.7 R3-1 CRMP
Lua:
function getAimPacketData()
    local aimptr = allocateMemory(31)
    local _, pid = sampGetPlayerIdByCharHandle(PLAYER_PED)
    sampStorePlayerAimData(pid, aimptr)
    pdata[counter].mode = memory.getuint8(aimptr)
    pdata[counter].cx = memory.getfloat(aimptr + 1)
    pdata[counter].cy = memory.getfloat(aimptr + 5)
    pdata[counter].cz = memory.getfloat(aimptr + 9)
    pdata[counter].px = memory.getfloat(aimptr + 13)
    pdata[counter].py = memory.getfloat(aimptr + 17)
    pdata[counter].pz = memory.getfloat(aimptr + 21)
    pdata[counter].az = memory.getfloat(aimptr + 25)
    pdata[counter].zoom = memory.getuint8(aimptr + 29)
    pdata[counter].wstate = memory.getuint8(aimptr + 30)
    pdata[counter].unk = memory.getuint8(aimptr + 31)
    freeMemory(aimptr)
end
крашит полностью самп, без всяких окошек краша

UPD: Год назад вроде все воркало, сборка с библиотеками и версиями муна\функса та же вроде.
На данный момент перешарил интернет в поиске подробностей о "sampStorePlayerAimData"
Испробовал все версии муна, функса, клео
А какая задача?
 
Последнее редактирование:

UnikalnoeName

Известный
20
1

Vintik мне нужно взять координаты при заходе игрока в динамическую зону​

(коорды прописанные самим сервером) к примеру функция CreateDynamicSphere со стороны сервера, есть ли какие нибудь хуки?​

 

corner xyz

Участник
94
36
А какая задача
это скрипт который все пакеты сохраняет, потом можно воспроизвести на клиенте RakSamp

[RakBot] OnFoot/InCar Route Recording System

сам скрипт для воспроизведения есть, переделанный под RakSamp, версия в которой нету считывания аима работает и записывает, но без синхры аима бот нормально ходить не может, его болтает во все стороны
 

Maxim25012

Известный
493
222
неа, имею ввиду, можно ли как то дистанционно ее пиздить руками/оружием например?
Не. Насколько я понял, урон машине обрабатывается клиентом водителя, то есть урон машине наносится только тогда, когда это происходит локально у водителя, и его клиент должен самостоятельно отправлять изменившееся здоровье машины. Именно поэтому всякие ГМ на машины до сих пор работают.
 
  • Нравится
  • Грустно
Реакции: Vintik и minxty