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

FYP

Известный
Автор темы
Администратор
1,764
5,924
@CrazyNeron findAllRandomObjectsInSphere. циклом перебрать все объекты с помощью этой функции и оперировать с нужными.
@NARVELL Vehicle car = storeCarCharIsInNoSave(Ped ped)
 
  • Нравится
Реакции: NARVELL

CrazyNeron

Новичок
26
0
@CrazyNeron findAllRandomObjectsInSphere. циклом перебрать все объекты с помощью этой функции и оперировать с нужными.
@NARVELL Vehicle car = storeCarCharIsInNoSave(Ped ped)
Окей поэксперементирую с функцией, а есть где записаны айди всех объектов?
 

vovandolg

Новичок
4
0
А как задать к примеру игровую(не виртуальную!) эмуляцию кнопки ALT(типо спокойная ходьба)?
Оч нужно)) Каждая клавиша которая работает в сампце важна))
 
Последнее редактирование:

ishi

Известный
493
110
А как задать к примеру игровую(не виртуальную!) эмуляцию кнопки ALT(типо спокойная ходьба)?
Оч нужно)) Каждая клавиша которая работает в сампце важна))
http://i12.pixs.ru/storage/6/0/3/123333png_5851462_26157603.png
 

CrazyNeron

Новичок
26
0
@CrazyNeron findAllRandomObjectsInSphere. циклом перебрать все объекты с помощью этой функции и оперировать с нужными.
@NARVELL Vehicle car = storeCarCharIsInNoSave(Ped ped)
А вот и неполучилось ничего, он ищет не те объекты, мне нужны объекты такие как ловочка, фанарный столб, стена, и т.д. потому, что иначе мой бот не обходит припятсвия (

@CrazyNeron findAllRandomObjectsInSphere. циклом перебрать все объекты с помощью этой функции и оперировать с нужными.
@NARVELL Vehicle car = storeCarCharIsInNoSave(Ped ped)
А где функции получения текста из чата?
 
Последнее редактирование модератором:

ishi

Известный
493
110
Так ну это то понятно, а без Cleo и SF не как нельзя?

P.S. а нет, пардон, там такие же кнопки, так как вызывать эмуляцию кнопки ALT, её там нету в списке!
если тебе нужно без клео и сф, зачем ты пишешь это в теме мун лоадера? пиши в другое, с пометкой "AHK"
 

vovandolg

Новичок
4
0
если тебе нужно без клео и сф, зачем ты пишешь это в теме мун лоадера? пиши в другое, с пометкой "AHK"
вот именно что мне нужно без клео и без сф, а с мункой,
у меня функция на клавиши игровые работает без сф и клео,
вот я и поинтересовался почему нету кнопки ALT в этой функции в мунке,
или если я работаю с мункой то я должен писать так же в анк? (stupid logic by Снежок)
 

FYP

Известный
Автор темы
Администратор
1,764
5,924
вот именно что мне нужно без клео и без сф, а с мункой,
у меня функция на клавиши игровые работает без сф и клео,
вот я и поинтересовался почему нету кнопки ALT в этой функции в мунке,
или если я работаю с мункой то я должен писать так же в анк? (stupid logic by Снежок)
https://www.blast.hk/threads/13892/page-25#post-139855
А вот и неполучилось ничего, он ищет не те объекты, мне нужны объекты такие как ловочка, фанарный столб, стена, и т.д. потому, что иначе мой бот не обходит припятсвия (
он должен искать именно их. го код
 
  • Нравится
Реакции: vovandolg

CrazyNeron

Новичок
26
0
те6е так кажется потому, что ты не читал основную тему мунлоадера, либо читал её очень невнимательно. убери и убедись в этом сам.
Lua:
function RunToPoint (x, y, z, radius, move_code, isSprint)
FindCharCarObject()
local CPX, CPY, CPZ = getCharCoordinates(playerPed)
local zAngle = getHeadingFromVector2d(x, y)
zAngle = zAngle + HeadingCharGradus
setCharHeading(playerPed, zAngle)
setGameKeyState(1, -255)
end

function FindCharCarObject ()
local x, y, z = getCharCoordinates(playerPed)
local CResult, CH = findAllRandomCharsInSphere(x, y, z, 3, false, true)
local VRusult, VH = findAllRandomVehiclesInSphere(x, y, z, 5, false, true)
local OResult, OH = findAllRandomObjectsInSphere(x, y, z, 2, false)
local x2, y2, z2
    if CResult == true or VRusult == true or OResult == true then
        if CResult == true then
            x2, y2, z2 = getCharCoordinates(CH)
        end
        if VRusult == true then
            x2, y2, z2 = getCarCoordinates(VH)
        end
        if OResult == true then
            x2, y2, z2 = getObjectCoordinates(OH)
        end
        local zChar = getCharHeading(playerPed)
        local zCVO = getHeadingFromVector2d(x2, y2)
        if zChar > zCVO then
            print("zChar > zCVO: ", zChar, " ", zCVO)
            HeadingCharGradus = HeadingCharGradus - summsHeadGradus
        else
        if zChar <= 90 and zCVO > 270 then
            print("zChar <= 90 and zCVO > 270: ", zChar, " ", zCVO)
            HeadingCharGradus = HeadingCharGradus - summsHeadGradus
        end
        end
        if zChar < zCVO then
            HeadingCharGradus = HeadingCharGradus + summsHeadGradus
            print("zChar < zCVO: ", zChar, " ", zCVO)
        else
        if zChar > 270 and zCVO < 90 then
            HeadingCharGradus = HeadingCharGradus + summsHeadGradus
            print("zChar > 270 and zCVO < 90: ", zChar, " ", zCVO)
        end
        end
        if HeadingCharGradus >= 55 then
        HeadingCharGradus = 55
        end
        if HeadingCharGradus <= -55 then
        HeadingCharGradus = -55
        end
    else
        HeadingCharGradus = 0
    end
end

function MyLocation ()
cordx, cordy, cordz = getCharCoordinates(playerPed)
print(getCharHeading(playerPed))
end

Если быть откровенным то я себе поставил задачу написать функции которые будут автоматизировать передвижения в гта, тоесть я указал точку и он бежит к этой точке обходя игроком машины не утыкаясь жбаном в стены, тоже самое на машинах и на лодках мне эти функции позарез нужны, но что-то пошло не так XD Но есть ещё маленькая проблема это неполнота справки, тоесть функция есть описания и примера нету (
 

FYP

Известный
Автор темы
Администратор
1,764
5,924
@CrazyNeron неправильно используются функции findAllRandom... их нужно вызывать циклично, пока в результате не будет возвращен false.
пример:
Lua:
function print_all_objects(x, y, z, radius)
   local found, handle = findAllRandomObjectsInSphere(x, y, z, 1000.0, false)
   while found do
     local modelId = getObjectModel(handle)
     local _, positionX, positionY, positionZ = getObjectCoordinates(handle)
     print(string.format('Object %d Position %0.2f, %0.2f, %0.2f', modelId, positionX, positionY, positionZ))
     found, handle = findAllRandomObjectsInSphere(x, y, z, 1000.0, true)
   end
end
 

CrazyNeron

Новичок
26
0
@CrazyNeron неправильно используются функции findAllRandom... их нужно вызывать циклично, пока в результате не будет возвращен false.
пример:
Lua:
function print_all_objects(x, y, z, radius)
   local found, handle = findAllRandomObjectsInSphere(x, y, z, 1000.0, false)
   while found do
     local modelId = getObjectModel(handle)
     local _, positionX, positionY, positionZ = getObjectCoordinates(handle)
     print(string.format('Object %d Position %0.2f, %0.2f, %0.2f', modelId, positionX, positionY, positionZ))
     found, handle = findAllRandomObjectsInSphere(x, y, z, 1000.0, true)
   end
end
Ах да сори, я тебе код выложил своей будущей библеотеке он сделан пока очень криворуко, я что хочу сказать-то, то, что функция
findAllRandomObjectsInSphere ищет только такие объекты как различные домики стрелки и прочее, но никак не дорогу на которой я нахожусь никак не стенка которая около меня и тому подобное, понимаешь? Она ище не то, что мне нужно что бы искала (