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

вайега52

Налуашил состояние
Модератор
2,976
3,092
пинг - можно, есть такой .cs или .sf , указываешь пинг и он меняется, а с ником возможно такое?
Пинг подделывается путем подмены данных в пакете пинга (как например тут и тут). Ник отправляется тобой на сервер в 25 RPC, который отправляется сразу после успешного подключения в серверу, таким образом, без переключения ты никак не можешь изменить свой ник

Как получить эти данные и сравнить если они равны то выполнять кусок кода? (инфа из /dl)
Lua:
---@diagnostic disable: undefined-global


local ffi = require("ffi")



ffi.cdef[[
    typedef struct
    {
        float x;
        float y;
        float z;
    } Vector3D;
]]



function main()
    while not isSampAvailable() do wait(0) end

    sampRegisterChatCommand("gp", function(arg)
        local vehicleId = tonumber(arg)
        local result, car = sampGetCarHandleBySampVehicleId(vehicleId)
        if result then
            local sPos = getVehicleSpawnedPosition(vehicleId)
            local positionX, positionY, positionZ = getCarCoordinates(car)
            sampAddChatMessage(string.format("cPos: X: %d Y: %d Z: %d", positionX, positionY, positionZ), -1)
            sampAddChatMessage(string.format("sPos: X: %d Y: %d Z: %d", sPos.x, sPos.y, sPos.z), -1)
        end
    end)

    wait(-1)
end



function getVehicleSpawnedPosition(vehicleId)
    return ffi.cast("Vector3D*",  sampGetVehiclePoolPtr() + 0x11AD4)[vehicleId]
end
 
Последнее редактирование:

AntonAnton123

Известный
207
104
Вопрос к FYP ну или если ещё кто то ответит то ок, почему функция getCharHeading(PLAYER_PED) не правильно работает??, ну мы когда на компас смотрим градусы идут по часовой стрелке то есть 90* на востоке, а эта функция работает против часовой стрелки, как исправить чтоб правильно работала?, я конечно могу в конце дописать -360 и будет правильно но со знаком -
 

Smeruxa

smeruxa.ru
Проверенный
1,427
786
Вопрос к FYP ну или если ещё кто то ответит то ок, почему функция getCharHeading(PLAYER_PED) не правильно работает??, ну мы когда на компас смотрим градусы идут по часовой стрелке то есть 90* на востоке, а эта функция работает против часовой стрелки, как исправить чтоб правильно работала?, я конечно могу в конце дописать -360 и будет правильно но со знаком -
Ну так исправь и кинь под модуль, никто тебе отвечать на это не будет
 

XRLM

Против ветра рождённый
Модератор
1,629
1,278
Вопрос к FYP ну или если ещё кто то ответит то ок, почему функция getCharHeading(PLAYER_PED) не правильно работает??, ну мы когда на компас смотрим градусы идут по часовой стрелке то есть 90* на востоке, а эта функция работает против часовой стрелки, как исправить чтоб правильно работала?, я конечно могу в конце дописать -360 и будет правильно но со знаком -
360-90...
 
  • Клоун
Реакции: trefa и Air_Official

7 СМЕРТНЫХ ГРЕХОВ

пісюнковий злочинець
522
163
Только что как раз пробовал -
1707671342774.png


При выходе с игры нету принтов :(

Только что как раз пробовал -
1707671342774.png


При выходе с игры нету принтов :(
Помогло удаление GameExitFixbyRomelo.sf
 
Последнее редактирование:
  • Грустно
Реакции: minxty

tsunamiqq

Участник
433
17
Как сделать что-бы при наводке на BeginChild он увеличивался, а при отводке уменьшался
 

P U L V I L I Z A T O R

Участник
93
29
Есть такое событие как onSendTakeDamage, которое вызывается только когда урон осуществляется по игроку. Подскажите как получать ту же информацию, что дает это событие, но только если урон был осуществлен по машине.
 

denis2222

Известный
24
5
Есть такое событие как onSendTakeDamage, которое вызывается только когда урон осуществляется по игроку. Подскажите как получать ту же информацию, что дает это событие, но только если урон был осуществлен по машине.
может тут глянь https://www.blast.hk/threads/88790/
 
  • Нравится
Реакции: P U L V I L I Z A T O R

decidelater

Новичок
6
0
Есть некоторые объекты, которые невозможно отследить из sampev.OnCreateObject или sampev.OnCreatePickup, но они присутствуют в getAllObjects. Какой сампев с этим связан? или эти объекты уже существуют в одиночной игре. Например, посмотрите видео ниже.
There are some objects which can't be traced from sampev.OnCreateObject or sampev.OnCreatePickup, But they are present in getAllObjects. Which sampev is associated with that ? or those object already exist in singleplayer. For example check the below video as well.

 

Slavka Priore

Активный
114
38
Как кликнуть по текстдраву, но только не по айдишнику, а по его координатам(x, y)? И можно ли как-то сделать через for, чтобы оно прокликивало по нескольким текст дравам, причем именно по их координатам. И также, как сделать проверку: Пустой ли текстдрав? То есть в аризоне в инвентаре есть пустые клетки(без предметов), а есть не пустые(с предметами). Мне нужно сделать проверку, если ли какойто предмет в какомто текст драве с какимито координатами
 

chromiusj

модерирую шмодерирую
Модератор
5,951
4,282
Как кликнуть по текстдраву, но только не по айдишнику, а по его координатам(x, y)? И можно ли как-то сделать через for, чтобы оно прокликивало по нескольким текст дравам, причем именно по их координатам. И также, как сделать проверку: Пустой ли текстдрав? То есть в аризоне в инвентаре есть пустые клетки(без предметов), а есть не пустые(с предметами). Мне нужно сделать проверку, если ли какойто предмет в какомто текст драве с какимито координатами
смотри по data.position
 

copypaste_scripter

Известный
1,431
290
ааа сукаааа, как сделать чтобы работал скрипт работал с Х времени до У времени
Lua:
        local start, finish = 1514, 1515
        if tonumber(os.date("%H%M")) < start then
            active = false
        elseif tonumber(os.date("%H%M")) >= finish then
            active = true
        end
      
        while active == true do
            sampAddChatMessage(""..os.date("%H%M%S"),-1)
            wait(1000)
        end
мой код не работает, ясто раз изменил

edit: фул скрипт
Lua:
require "lib.moonloader"
require "lib.samp.events"
local sampev = require "lib.samp.events"
local active = false

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    while true do
        wait(0)
        
        local start, finish = 1514, 1515
        if tonumber(os.date("%H%M")) < start then
            active = false
        elseif tonumber(os.date("%H%M")) >= finish then
            active = true
        end
        
        while active == true do
            sampAddChatMessage(""..os.date("%H%M%S"),-1)
            wait(1000)
        end
        
    end
end
 
  • Вау
Реакции: recxvery

coderko61

Участник
55
0
ребят, нужно сделать поиск персонажей и объектов. пробовал сам, не пашет. скидываю поиск на объекты. нужно что бы он ещё искал игроков и все в одном цикле. помогите, парни
Lua:
for _, v in pairs(getAllObjects()) do
            if isObjectOnScreen(v) then
                local model = getObjectModel(v)
                local _, x, y, z = getObjectCoordinates(v)
                local x1, y1 = convert3DCoordsToScreen(x,y,z)
                local x2,y2,z2 = getCharCoordinates(PLAYER_PED)
                local x10, y10 = convert3DCoordsToScreen(x2,y2,z2)
                local distance = string.format("%.0f", getDistanceBetweenCoords3d(x, y, z, x2, y2, z2))
               
                --code
               
            end
        end