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

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,468
Ещё один плюс спп - работа со строками идёт без извращений х)
Причём тут строки lua и cpp? Такой же класс можешь состряпать и на луа, никто тебе не мешает. Но вот ведь не задача, "классов" в луа нет.
 
Последнее редактирование:
  • Нравится
Реакции: ishi

ishi

Известный
493
110
Причём тут строки lua и cpp? Такой же класс можешь состряпать и на луа, никто тебе не мешает. Но вот ведь не задача, "классов" в луа нет.
Я не про классы, а про возможность получить указатель на строку без лишних операций, и так же просто добавить к нему нужное число чтобы получить указатель на нужный символ. Без "вырезания" буквы из строки отдельной функцией. Вот и всё.
 

ishi

Известный
493
110
Как выкинуть персонажа из транспорта?
Я пробовал сменить координаты именно локального актёра, но он оставаясь в машине перемещался.
 

castlefamily

Участник
104
3
Как можно проверить сбил ли игрок /healme или нет? Чет пробовал через анимацию, но не работает через быстрые сбивы :(
 
Последнее редактирование:

romacaddy

Известный
Проверенный
234
206
Как выкинуть персонажа из транспорта?
Я пробовал сменить координаты именно локального актёра, но он оставаясь в машине перемещался.
Lua:
local x, y, z = getCharCoordinates(PLAYER_PED)
warpCharFromCarToCoord(PLAYER_PED, x, y + 1, z)
 

ishi

Известный
493
110
Не знаю, связано ли это с последней обновой, которая улучшает проверку скриптов на ошибки, но у меня такая ситуация:
В мейне стоит множество различной фигни, в том числе
Lua:
myCar = storeCarCharIsInNoSave(playerPed)
, и в принципе всё в ней работало нормально, пока мне не понадобилось создать второй "поток".
Отгрузив в него часть кода, я создал глобальные переменные чтобы можно было записывать между функциями, не передавая аргументы:
Lua:
letdoit = false
myTurn = false
myCar = 0
myCarID = 0

В сам же второй "поток" я отгрузил часть кода и поставил триггер, который не позволит ему выполниться раньше, чем выполнится код из основного потока, который заполняет необходимые данные.И в принципе, если снова код склеить, всё работать будет, но:
Код:
[22:15:14.216687] (system)   Session started.
[22:15:14.216687] (debug)   Module handle: 54BE0000

MoonLoader v.025-beta loaded.
Developers: FYP, hnnssy, EvgeN 1137

Copyright (c) 2016, BlastHack Team
https://www.blast.hk/moonloader/

[22:15:14.216687] (info)   Working directory: C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto San Andreas\moonloader
[22:15:14.216687] (debug)   FP Control: 0009001F
[22:15:14.216687] (debug)   Game: GTA SA 1.0.0.0 US
[22:15:14.216687] (system)   Installing pre-game hooks...
[22:15:14.216687] (system)   Hooks installed.
[22:15:15.870716] (debug)   Initializing opcode handler table
[22:15:15.870716] (debug)   package.path = C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto San Andreas\moonloader\lib\?.lua;C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto San Andreas\moonloader\lib\?\init.lua;C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto San Andreas\moonloader\?.lua;C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto San Andreas\moonloader\?\init.lua;.\?.lua;C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto San Andreas\moonloader\lib\?.luac;C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto San Andreas\moonloader\lib\?\init.luac;C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto San Andreas\moonloader\?.luac;C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto San Andreas\moonloader\?\init.luac;.\?.luac
[22:15:15.870716] (debug)   package.cpath = C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto San Andreas\moonloader\lib\?.dll;
[22:15:15.871718] (system)   Loading script 'C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto San Andreas\moonloader\123123.lua'...
[22:15:15.871718] (debug)   New script: 05D3802C
[22:15:15.874720] (system)   123123.lua: Loaded successfully.
[22:15:15.874720] (system)   Loading script 'C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto San Andreas\moonloader\check-moonloader-updates.lua'...
[22:15:15.874720] (debug)   New script: 05D390BC
[22:15:15.880725] (system)   Check MoonLoader Updates: Loaded successfully.
[22:15:15.880725] (system)   Loading script 'C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto San Andreas\moonloader\enter.lua'...
[22:15:15.880725] (debug)   New script: 05D3975C
[22:15:15.889730] (debug)   Add thread 05D13E95 to SCM-thread queue
[22:15:15.893733] (system)   enter.lua: Loaded successfully.
[22:15:15.893733] (system)   Loading script 'C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto San Andreas\moonloader\gotoid.lua'...
[22:15:15.893733] (debug)   New script: 05D3940C
[22:15:15.897737] (system)   gotoid.lua: Loaded successfully.
[22:15:15.897737] (system)   Loading script 'C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto San Andreas\moonloader\oki4.lua'...
[22:15:15.897737] (debug)   New script: 05D395B4
[22:15:15.910745] (system)   oki4.lua: Loaded successfully.
[22:15:23.608221] (system)   Installing post-load hooks...
[22:15:23.608221] (system)   Hooks installed.
[22:15:24.656977] (debug)   Add thread 0194BB7D to SCM-thread queue
[22:15:24.656977] (debug)   Add thread 0194B48D to SCM-thread queue
[22:15:24.656977] (debug)   Add thread 0194B6DD to SCM-thread queue
[22:15:24.657967] (debug)   Add thread 0194B92D to SCM-thread queue
[22:15:25.010218] (error)   opcode '0407' call caused an unhandled exception
[22:15:25.038239] (error)   gotoid.lua: cannot resume non-suspended coroutine
[22:15:25.038239] (error)   gotoid.lua: Script died due to error. (05D3940C)
[22:15:25.038239] (debug)   Remove thread 0194B6DD from SCM-thread queue
[22:15:29.253237] (system)   Unloading...
[22:15:29.254239] (system)   123123.lua: Script terminated. (05D3802C)
[22:15:29.254239] (debug)   Remove thread 0194BB7D from SCM-thread queue
[22:15:29.254239] (system)   Check MoonLoader Updates: Script terminated. (05D390BC)
[22:15:29.255237] (system)   enter.lua: Script terminated. (05D3975C)
[22:15:29.255237] (debug)   Remove thread 0194B48D from SCM-thread queue
[22:15:29.256237] (system)   oki4.lua: Script terminated. (05D395B4)
[22:15:29.256237] (debug)   Remove thread 0194B92D from SCM-thread queue
[22:15:29.302272] (system)   Session terminated.
[22:15:29.302272] (debug)   Remove thread 05D13E95 from SCM-thread queue
Среди ошибок можно заметить
Код:
[22:15:25.010218] (error)   opcode '0407' call caused an unhandled exception
И единственным упоминанием данного опкода является строка:
Lua:
X, Y, Z = getOffsetFromCarInWorldCoords(myCar,-1.5,0.0,0.0)

В связи с чем прошу @FYP посмотреть, не напортачил ли он с обновой. Скрипт начал выбивать ошибку только потому что единый код был разделён, хотя он на момент "краша" даже не активен - он активируется командой, а ошибку выдаёт едва самп загружается.

Если понадобится, могу скинуть в личку скрипт. Он сделан на скорую руку и не закончен, так что на общий обзор пока не могу. Сорян.
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,468
Если понадобится, могу скинуть в личку скрипт. Он сделан на скорую руку и не закончен, так что на общий обзор пока не могу. Сорян.
Если он сделан на скорую руку, то может быть стоит тщательнее его продебажить?
Ну и судя по ошибке и твоим объяснениям, поток запустился сразу же, а myCar в этот момент ещё nil => поток необходимо запускать замороженным; сабж: lua - luathread | BlastHack — DEV_WIKI(https://blast.hk/wiki/lua:luathread)
 
Последнее редактирование:
  • Нравится
Реакции: ishi

ishi

Известный
493
110
Если он сделан на скорую руку, то может быть стоит тщательнее его продебажить?
Ну и судя по ошибке и твоим объяснениям, поток запустился сразу же, а myCar в этот момент ещё nil => поток необходимо запускать замороженным; сабж: lua - luathread | BlastHack — DEV_WIKI(https://blast.hk/wiki/lua:luathread)
И всё же ты прав. Мне стоило проспаться и пересмотреть код, прежде чем доказывать свою правоту. Прошу прощения за беспокойство ._.
 
  • Нравится
Реакции: inf

FYP

Известный
Автор темы
Администратор
1,763
5,906
можно ли как-нибудь из vkeys.lua получить имя кнопки по её ид из другого скрипта? или есть более православный метод получения названия кнопки?
Lua:
local vkeys = require 'vkeys'
print(vkeys.id_to_name(vkeys.VK_X))
Как можно проверить сбил ли игрок /healme или нет? Чет пробовал через анимацию, но не работает через быстрые сбивы :(
обрабатывать входящие пакеты
 

k0lenval

Известный
133
111
Ребят, подскажите, есть ли функция проверки, что перс подобрал пикап? В вики не смог найти.