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

k1lla

Новичок
7
0
есть ли короткая функция дисконекта от сервера по типу sampSendSpawn?
 

Стэнфорд

Потрачен
1,058
540
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Нужно что бы пользователь мог через imgui.ColorEdit4 выбрать цвет и сохранить его в ини, помогите пожалуйста
 

Sanchez.

Известный
704
187
Где можно найти как пользоваться в имгуи AddRectFilled(), и где можно найти нужные функи для создания кастомного интерфейса в имгуи. Скиньте ссылки плз <3
 

SamperJostkiy

Участник
169
19
@

Akionka

авто активация, точнее активация командой antiafk, по умолчанию включен
lua:
require "lib.moonloader"
local activate = true

function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(0) end
  SV()
sampRegisterChatCommand("antiafk", function()
    activate = not activate
    sampAddChatMessage(activate and "Анти-афк: включен" or "Анти-афк: выключен", -1)
end)
while true do
wait(0)
if testCheat('AFK') and activate then SV() end
end
end
function SV()
check = not check
local memory = require "memory"
if check then
printString('~g~ AFK ON', 2000)
memory.setuint8(7634870, 1, false)
memory.setuint8(7635034, 1, false)
memory.fill(7623723, 144, 8, false)
memory.fill(5499528, 144, 6, false)
else
printString('~r~ AFK OFF', 2000)
memory.setuint8(7634870, 0, false)
memory.setuint8(7635034, 0, false)
memory.hex2bin('0F 84 7B 01 00 00', 7623723, 8)
memory.hex2bin('50 51 FF 15 00 83 85 00', 5499528, 6)
end
end
Функция взаимодействия с серверной командой через samp events?
 

#SameLine

Активный
417
37
Нужно что бы если в тебя стреляют со всеех оружий то отправляется этому человеку в смс 1
Если ударили с кулака / машины то 2

Lua:
function ev.onSendTakeDamage(playerId, damage, weapon, bodypart)
    if weapon == 0 or weapon == 50 then --кулак / машина
        sampSendChat("/w "..playerId.." 2")
    else
        sampSendChat("/w "..playerId.." 1")
    end
end

Чувак сделал код он работает но только когда с оружия - 1
С кулака - 2
С машины - 1 а должно быть 2

Что не так?
 

Sanchez.

Известный
704
187
Как отредактировать raw на гитхабе через post-запрос? (библиотека effil)
 

#SameLine

Активный
417
37
Почему не работает даже самый просто scoreboard? :D


Хотя установлены полностью все требования
 

Akionka

akionka.lua
Проверенный
742
500
Как отредактировать raw на гитхабе через post-запрос? (библиотека effil)
через гит только
Почему не работает даже самый просто scoreboard? :D


Хотя установлены полностью все требования
лог?
 

#SameLine

Активный
417
37
через гит только

лог?
[01:33:22.175701] (error) ImGui Scoreboard: ...орка by FiredOnli\moonloader\imgui_simple_scoreboard.lua:274: stack index 1, expected string, received number: (bad argument into 'bool(const char*, sol::optional<sol::basic_object<sol::basic_reference<0> > >, sol::optional<int>, sol::optional<ImVec2 const *>)')
stack traceback:
[C]: in function 'Selectable'
...орка by FiredOnli\moonloader\imgui_simple_scoreboard.lua:274: in function 'drawScoreboardPlayer'
...орка by FiredOnli\moonloader\imgui_simple_scoreboard.lua:216: in function 'OnDrawFrame'
...ane\Desktop\Сборка by FiredOnli\moonloader\lib\imgui.lua:1378: in function <...ane\Desktop\Сборка by FiredOnli\moonloader\lib\imgui.lua:1367>
[01:33:22.176677] (error) ImGui Scoreboard: Script died due to an error. (0994E0E4)
 

Вложения

  • imgui_simple_scoreboard.lua
    12.2 KB · Просмотры: 3

iMaddison

Участник
49
16
Уже видел в этой теме подобный вопрос, но на него никто не ответил.
Ребят, как отправить на сервер нажатие клавиши F? Что только не перепробовал -.-
 
  • Нравится
Реакции: monolith04

F0RQU1N and

Известный
1,310
495
Уже видел в этой теме подобный вопрос, но на него никто не ответил.
Ребят, как отправить на сервер нажатие клавиши F? Что только не перепробовал -.-
))
Lua:
setGameKeyState(0x46,true)
wait(math.random(40,80))
setGameKeyState(0x46,false)
Ну а где тогда найти гайд, чтобы отправить пост запрос, чтобы вместить в raw какой нибудь текст? (Я не про гайд ассинхронные запросы, я именно ищу гайд чтобы отправить пост запрос)
по первой ссылке в гугле,
Lua:
local http = require "socket.http"
local ltn12 = require "ltn12"

local reqbody = "{post body}"
local respbody = {} -- for the response body

local result, respcode, respheaders, respstatus = http.request {
    method = "POST",
    url = "https://httpbin.org/post",
    source = ltn12.source.string(reqbody),
    headers = {
        ["content-type"] = "text/plain",
        ["content-length"] = tostring(#reqbody)
    },
    sink = ltn12.sink.table(respbody)
}
-- get body as string by concatenating table filled by sink
respbody = table.concat(respbody)

print (result)
print (respcode)
print (respheaders)
print (respstatus)
print (respbody)
 
  • Нравится
Реакции: Sanchez.