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

shrug228

Активный
212
75
получать координаты радара на экране с помощью памяти, а после используй эти координаты в имгуи окне
Увы, но нет. Попробуй сам так сделать, вот адреса:
0x858A10 - x
0x866B70 - y
0x866B78 - ширина
0x866B74 - высота
Мне посоветовали пропатчить радар и отрисовать свой в окне imgui, но как это сделать - я без понятия.
 

DeagleC+

Известный
48
3
Как сделать так, чтобы скрывало текст из чата по определённым словам? Какая для этого требуется функция?
 

DeagleC+

Известный
48
3
Тебе нужно удаление строк с определенными словами, либо удаление самих слов?

1651600321134.png

В первом предложении удалить всё, что в скобках, но оставить "Ваш транспорт доставлен."
А во втором полностью строку.

Это всё по обнаружению словосочетания можно сделать?

Вот:

Lua:
script_name('AutoInscar')
local     sampev     =     require 'lib.samp.events'
require "lib.moonloader"
local encoding = require 'encoding'
encoding.default = 'cp1251'
u8 = encoding.UTF8

function sampev.onServerMessage(color, text)
    lua_thread.create(function()
        if(u8:encode(text):find("Ваш транспорт доставлен.")) then wait(1000) sampSendChat("/inscar") end
    end)
end

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

Хотя-бы скажите названия функций
 
Последнее редактирование:

Andrinall

Известный
679
532

Посмотреть вложение 146332
В первом предложении удалить всё, что в скобках, но оставить "Ваш транспорт доставлен."
А во втором полностью строку.

Это всё по обнаружению словосочетания можно сделать?

Вот:

Lua:
script_name('AutoInscar')
local     sampev     =     require 'lib.samp.events'
require "lib.moonloader"
local encoding = require 'encoding'
encoding.default = 'cp1251'
u8 = encoding.UTF8

function sampev.onServerMessage(color, text)
    lua_thread.create(function()
        if(u8:encode(text):find("Ваш транспорт доставлен.")) then wait(1000) sampSendChat("/inscar") end
    end)
end

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

Хотя-бы скажите названия функций
Lua:
function sampev.onServerMessage(color, text)
    if text:find("^Ваш транспорт доставлен%.") then return {color, "Ваш транспорт доставлен."} end
    if text:find("^Вы оформили страховку на .* для .*%.") then return false end -- по поводу этого не уверен, не тестил, но думаю прокатит
end
 

DeagleC+

Известный
48
3
Lua:
function sampev.onServerMessage(color, text)
    if text:find("^Ваш транспорт доставлен%.") then return {color, "Ваш транспорт доставлен."} end
    if text:find("^Вы оформили страховку на .* для .*%.") then return false end -- по поводу этого не уверен, не тестил, но думаю прокатит
end
Первая не работает, а из-за второй перестало прописывать команду. Но всё равно спасибо.
 

silentium2006

Потрачен
721
128
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как сделать альт когда
Lua:
function events.onSetObjectMaterialText(ev, data)
    local Object = sampGetObjectHandleBySampId(ev)
    if doesObjectExist(Object) and getObjectModel(Object) == 18663 and string.find(data.text, "(.-) {30A332}Свободная!") then
        if get_distance(Object) and status then
            lua_thread.create(press_key)
        end
    end
end
 

Fluffy1560

Активный
276
34
Кикает при входе в инт античит, поставил фикс арз инты но на Onlinerp он не работает, мб есть у кого идеи буду благодарен
[00:43:46] [RAKBOT] Бот заспавнен
[00:43:49] [RAKBOT] === СПИСОК ПИКАПОВ ===
[00:43:49] [RAKBOT] ID * МОДЕЛЬ * ТИП * РАССТОЯНИЕ * ПОЗИЦИЯ
[00:43:49] [RAKBOT] 39 * 1318 * 23 * 167,13 * (1368,73; -1279,74; 13,55)
[00:43:49] [RAKBOT] 54 * 2663 * 23 * 125,86 * (1585,62; -1152,92; 24,08)
[00:43:49] [RAKBOT] 433 * 1239 * 23 * 22,27 * (1514,97; -1276,51; 14,56)
[00:43:49] [RAKBOT] 484 * 1318 * 23 * 101,87 * (1565,84; -1171,15; 24,09)
[00:43:49] [RAKBOT] 499 * 19135 * 23 * 152,75 * (1579,12; -1414,44; 13,55)
[00:43:49] [RAKBOT] 517 * 1318 * 23 * 11,20 * (1546,60; -1268,55; 17,40)
[00:43:49] [RAKBOT] 591 * 19134 * 23 * 36,56 * (1508,39; -1292,59; 14,50)
[00:43:49] [RAKBOT] 668 * 2663 * 23 * 24,85 * (1517,38; -1284,99; 14,51)
[00:43:49] [RAKBOT] === [ВСЕГО: 8] ===
[00:44:02] [RAKBOT] CoordMaster: телепорт на координаты (1546,00; -1268,00; 17,00)
[00:44:03] [RAKBOT] Вы достигли места назначения!
[00:44:04] [RAKBOT] Коордмастер завершил работу
[00:44:14] [RAKBOT] Отправка пикапа с ID 517
[00:44:15] [RAKBOT] Поднят пикап с ID 517 (модель: 1318)
[00:44:15] [RAKBOT] Получен диалог 32700 с заголовком "Выбор этажа"
[00:44:20] [RAKBOT] Отправлен ответ диалогу с ID 32700 (кнопка: 1, список: 0; текст: 1-й этаж)
[00:44:20] [RAKBOT] Бот перемещен в интерьер 254
[00:44:20] [RAKBOT] Ваша позиция изменена на: (1361,17; -27,14; 1000,93)
[00:44:21] [СЕРВЕР] Вы были кикнуты по подозрению в использовании чит-программ! (Teleport (onfoot) | code: 002 | platform: PC)
[00:44:21] [СЕРВЕР] Если произошла ошибка, напишите на forum.gta-mobile.ru (Технический раздел > Проблемы с античитом)
[00:44:36] [RAKBOT] Сервер закрыл соединение. Переподключение через 15 секунд
[00:44:37] [RAKBOT] Бот отключен от сервера
 

ewin

Известный
675
369
смотрел исходник этого файла - https://www.blast.hk/threads/81615/, заметил интересную фигню, если при нажатии на "ОК" или крестик, оно автоматом разворачивают игру, как можно пофиксить, либо автоматом закрывать ее спустя пару сек?
1651655510516.png


UPD:фикс:
Lua:
function ShowMessage(text, title, style)
    ffi.cdef("int MessageBoxA( void* hWnd, const char* lpText, const char* lpCaption, unsigned int uType); ")
    ffi.C.MessageBoxA(nil, text,  title, style and (style + 327680) or 327680)
end


function at line 293 has more than 60 upvalues - как можно исправить?
храни переменные в массивах:

Lua:
array = {
    key_1 = value_1,
    key_2 = value_2,
}

function YourFunction()
    print(array['key_1'])
end
 
Последнее редактирование: