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

Raymond

Известный
206
90
Помогите дайте пример как сделать Dxut диалог,а то я нихуя не понимаю((
Там есть 2 скрипта с исходным кодом и DXUT диалогами, думаю разберешься
 

Carlos777

Потрачен
227
219
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Не нажимается ESC когда активно любое imgui окно:

Код:
function imguis(arg)
  main_gui.v = true
  imgui.Process = true
end

function threego(arg)
  three_gui.v = not three_gui.v
  imgui.Process = true
end


function imgui.OnDrawFrame()
  --code
  if main_gui.v then
    imgui.ShowCursor = true
  elseif not main_gui.v and two_gui.v or three_gui.v then
    imgui.ShowCursor = false
  elseif not main_gui.v and not two_gui.v and not three_gui.v then
    imgui.Process = false
  end
 
end
 

FForest

Известный
12
7
Ребята ситуация такая. В LUA Нечего не понимаю, но сценарий очень надо.
Есть Lua сценарий для Game Guardians программа для редактирования адресов памяти на телефоне (Android). Этот сценарий защищён "Simple Encryption By Top GEO V9". Вот сам код , а так же прикреплённый файл ниже.
Как я понял протектор состоит из байт-кода, который переводит в строку, и после его запускает через load().
Я пытался использовать функции которые прилагаться в сценарии.
Пример:


Пример:
function Executer(bytes)
byte = '' for i in ipairs(bytes) do
byte = byte ..string.char(bytes[i])
end return byte end

Executer((arrayBYTE))

print(string.char(table.unpack(arrayBYTE)))

А так же результат пытался сохранить в txt но результат оставался таким же.
Всё что выдавало в консоль
42692

Если кто сможет помочь большое спасибо.​
 

Вложения

  • main.lua
    26.1 KB · Просмотры: 7
Последнее редактирование:

BARRY BRADLEY

Известный
711
176
Как проверить сколько урона нанес игрок машины и как узнать кто именно нанес моей машине (в которой я сижу). И желательно как узнать кто тебя убил выстрелом с РПГ по машине (машина сразу взрывается)
Пробовал через хук onSendTakeDamage но если в машине сидишь и по ней идёт урон - ничего не происходит
 

Bananious

Известный
238
17
Вот у меня есть объект model = 19147, как мне сделать чтобы в радиусе 100метров если видно эту модель машина останавливалась, ну можете просто скинуть ф-цию если видно объект....
 

FForest

Известный
12
7
Вот у меня есть объект model = 19147, как мне сделать чтобы в радиусе 100метров если видно эту модель машина останавливалась, ну можете просто скинуть ф-цию если видно объект....
Рили? У меня заняло ровно 2 минуты чтоб найти функции для тебя
Вот первая
Вот вторая

я бы использовал их в связке для более точного определения.

Вот функция, которая проверяет остановлен ли автомобиль

 
  • Нравится
Реакции: Bananious

Fabregoo

Известный
656
128
Ставит точку в конце предложенние в обычный чат.
Как ставить точку в /b чат?

Lua:
function sampev.onSendChat(text)
    return {text.."."}
end
 

BIG BOG

Известный
654
142
как заспавниться, если сервер не установил координаты для этого?
 

Raymond

Известный
206
90
Дайте пожалуйста код простого трейсер пуль,а то я не могу отрытый исходник найти :((((((((((999
Lua:
local sampev = require 'lib.samp.events'
local memory = require 'memory'

local BulletSync = {lastId = 0, maxLines = 15}
for i = 1, BulletSync.maxLines do
    BulletSync[i] = {enable = false, o = {x, y, z}, t = {x, y, z}, time = 0, tType = 0}
end

function calcScreenCoors(fX,fY,fZ)
    local dwM = 0xB6FA2C

    local m_11 = memory.getfloat(dwM + 0*4)
    local m_12 = memory.getfloat(dwM + 1*4)
    local m_13 = memory.getfloat(dwM + 2*4)
    local m_21 = memory.getfloat(dwM + 4*4)
    local m_22 = memory.getfloat(dwM + 5*4)
    local m_23 = memory.getfloat(dwM + 6*4)
    local m_31 = memory.getfloat(dwM + 8*4)
    local m_32 = memory.getfloat(dwM + 9*4)
    local m_33 = memory.getfloat(dwM + 10*4)
    local m_41 = memory.getfloat(dwM + 12*4)
    local m_42 = memory.getfloat(dwM + 13*4)
    local m_43 = memory.getfloat(dwM + 14*4)

    local dwLenX = memory.read(0xC17044, 4)
    local dwLenY = memory.read(0xC17048, 4)

    frX = fZ * m_31 + fY * m_21 + fX * m_11 + m_41
    frY = fZ * m_32 + fY * m_22 + fX * m_12 + m_42
    frZ = fZ * m_33 + fY * m_23 + fX * m_13 + m_43

    fRecip = 1.0/frZ
    frX = frX * (fRecip * dwLenX)
    frY = frY * (fRecip * dwLenY)

    if(frX<=dwLenX and frY<=dwLenY and frZ>1)then
        return frX, frY, frZ
    else
        return -1, -1, -1
    end
end

function sampev.onBulletSync(playerid, data)
    if traicers == true then
        if data.target.x == -1 or data.target.y == -1 or data.target.z == -1 then
            return true
                    end
                    BulletSync.lastId = BulletSync.lastId + 1
                    if BulletSync.lastId < 1 or BulletSync.lastId > BulletSync.maxLines then
                        BulletSync.lastId = 1
                    end
                    local id = BulletSync.lastId
                    BulletSync[id].enable = true
                    BulletSync[id].tType = data.targetType
                    BulletSync[id].time = os.time() + 15
                    BulletSync[id].o.x, BulletSync[id].o.y, BulletSync[id].o.z = data.origin.x, data.origin.y, data.origin.z
                    BulletSync[id].t.x, BulletSync[id].t.y, BulletSync[id].t.z = data.target.x, data.target.y, data.target.z
                end
            end

function main()
      if not isSampLoaded() or not isSampfuncsLoaded() then
      return end
      while not isSampAvailable() do wait(100) end
      sampRegisterChatCommand('traic', function() traicers = not traicers if traicers then sampAddChatMessage('traicers on', -1) else sampAddChatMessage('traicers off', -1) end end)
      while true do wait(0)
      local oTime = os.time()
        if traicers == true then
            for i = 1, BulletSync.maxLines do
                if BulletSync[i].enable == true and BulletSync[i].time >= oTime then
                    local sx, sy, sz = calcScreenCoors(BulletSync[i].o.x, BulletSync[i].o.y, BulletSync[i].o.z)
                    local fx, fy, fz = calcScreenCoors(BulletSync[i].t.x, BulletSync[i].t.y, BulletSync[i].t.z)

                    if sz > 1 and fz > 1 then
                        renderDrawLine(sx, sy, fx, fy, 1, BulletSync[i].tType == 0 and 0xFFFFFFFF or 0xFFFFC700)
                        renderDrawPolygon(fx, fy-1, 3, 3, 4.0, 10, BulletSync[i].tType == 0 and 0xFFFFFFFF or 0xFFFFC700)
                    end
                end
            end
        end
    end
end
Должно работать, проверить нет возможности
 
Последнее редактирование:
  • Нравится
Реакции: norrthh

kingleonides

Участник
43
28
Ребята ситуация такая. В LUA Нечего не понимаю, но сценарий очень надо.
Есть Lua сценарий для Game Guardians программа для редактирования адресов памяти на телефоне (Android). Этот сценарий защищён "Simple Encryption By Top GEO V9". Вот сам код , а так же прикреплённый файл ниже.
Как я понял протектор состоит из байт-кода, который переводит в строку, и после его запускает через load().
Я пытался использовать функции которые прилагаться в сценарии.
Пример:


Пример:
function Executer(bytes)
byte = '' for i in ipairs(bytes) do
byte = byte ..string.char(bytes[i])
end return byte end

Executer((arrayBYTE))

print(string.char(table.unpack(arrayBYTE)))

А так же результат пытался сохранить в txt но результат оставался таким же.
Всё что выдавало в консоль

Если кто сможет помочь большое спасибо.​
Распаковываешь таблицу символов, конвертирует в чары, сейвишь в файл и получаешь накрытый чем-то файл luac.
Как декомпилировать луак - не знаю, знают те которые этим занимаются, просто запихать его в декомпилятор смысла не имеет, там нечто обо что спотыкается декомпилятор и падает в краш, + еще версия файла, если мне не пиздит декомпилятор 5.4.
Раньше можно было подрезать хидер до какого-то символа - и спокойно декомпилировать.
Можно ли использовать несколько? if string.find?
Lua:
function sampev.onSendCommand(cmd)
    if string.find(cmd, '/b .+') then
        return {cmd..'.'}
    elseif string.find(cmd, "/fam .+") then
        return {cmd.."."}
    end
end
 
  • Нравится
Реакции: FForest и Fabregoo