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

NARVELL

Известный
71
10
используя раклоггер отследи что отправляется при нажатии и отправляй rpc самостоятельно.

Не умею работать с ракнетом, вот что получил при нажатии:
Код:
[19:41:35.039] < [RPC Send] RPC_DialogResponse[62](length: 22 bytes, 176 bits, priority: 1, reliability: 9, orderingChannel: 0)
< dump:
0000  16 00 01 28 00 10 3E 3E  20 D1 EB E5 E4 2E F1 F2    ...(..>> След.ст
0010  F0 E0 ED E8 F6 E0                                  раница
Насколько понял, функция вот эта:
Lua:
raknetSendRpcEx(int rpc, Bitstream bs, int priority, int reliability, int channel, bool timestamp)

Тогда так?
Lua:
raknetSendRpcEx(RPC_DialogResponse, 176, 1, 9, 0, 0)

Но в таком случае:
Код:
(error)    opcode '0B41' call caused an unhandled exception
(error)    Test Script: cannot resume non-suspended coroutine
(error)    Test Script: Script died due to error. (24950CCC)
(debug)    Remove thread 24A48355 from SCM-thread queue

Явно я чего-то не понял.
 

egor230

Участник
47
16
Уважаемый FYP за Ваш полезный совет, благодаря ему написал первый lua скрипт для gta sa.
Lua:
script_author("egor")
script_name("weapon")
require "lib.moonloader"

function main() -- объявление функции
while true do -- бесконечный цикл
local a = 362 -- модель оружие
local b = 38 -- id оружие или его номер
local c = 100 -- количество патронов у оружия
wait(0) -- задержка в 0 мс
if isPlayerPlaying (PLAYER_HANDLE) then  -- если игрок найден
if isKeyDown(VK_1)  then -- если клавиша 1 нажата
    requestModel(a) -- запрос модели минигана
if hasModelLoaded(a) then  -- ждём, пока модель не загрузится  
while isKeyDown(VK_1) do wait(100) end -- и ждём, пока клавиша не будет отпущена
  printString ("GiveWeapon", 1000) -- надпись дано оружие, второй параметр время надписи
giveWeaponToChar(PLAYER_PED, b, c) -- дать миниган, первый параметр id, количество патронов
markModelAsNoLongerNeeded (a, b) -- удалить модель и id из памяти
end
end
end
end
end

Конечно, он далеко неидеальный, но работает, может кому будет полезен. Специально объявил 3

Скажите, пожалуйста, находится лог? Чтобы смотреть свои ошибки.

До функций пока далеко мне как до Китая.
HTML:
script_author("egor")
script_name("weapon")
require "lib.moonloader"

function main() -- объявление функции
while true do -- бесконечный цикл
local a = 480 -- модель оружие
wait(0) -- задержка в 0 мс
if isPlayerPlaying (PLAYER_HANDLE) then  -- если игрок найден
if isKeyDown(VK_m)  then -- если клавиша 1 нажата
  X, Y, Z = getCharCoordinates (PLAYER_PED)
     requestModel(a) -- запрос модели минигана
if hasModelLoaded(a) then  -- ждём, пока модель не загрузится  
while isKeyDown(VK_m) do wait(100) end -- и ждём, пока клавиша не будет отпущена
  printString ("Give car", 1000) -- надпись дано оружие, второй параметр время надписи
Vehicle car = createCar(a, X, Y, Z)  -- 00A5
end
end
end
end


В cleo есть опкод 00A0: store_actor $PLAYER_ACTOR position_to - получение координат игрока(cj)

Аналог в lua getCharCoordinates. Как правильно записать в переменные координаты.

Не получается. Хочу создать машину. Перехожу от простого к сложному.

Без Вашей помощи мне очень тяжело разобраться в этой гениальной вещи
 

FYP

Известный
Автор темы
Администратор
1,757
5,684
Не умею работать с ракнетом, вот что получил при нажатии:
Код:
[19:41:35.039] < [RPC Send] RPC_DialogResponse[62](length: 22 bytes, 176 bits, priority: 1, reliability: 9, orderingChannel: 0)
< dump:
0000  16 00 01 28 00 10 3E 3E  20 D1 EB E5 E4 2E F1 F2    ...(..>> След.ст
0010  F0 E0 ED E8 F6 E0                                  раница
Насколько понял, функция вот эта:
Lua:
raknetSendRpcEx(int rpc, Bitstream bs, int priority, int reliability, int channel, bool timestamp)

Тогда так?
Lua:
raknetSendRpcEx(RPC_DialogResponse, 176, 1, 9, 0, 0)

Но в таком случае:
Код:
(error)    opcode '0B41' call caused an unhandled exception
(error)    Test Script: cannot resume non-suspended coroutine
(error)    Test Script: Script died due to error. (24950CCC)
(debug)    Remove thread 24A48355 from SCM-thread queue

Явно я чего-то не понял.
данные нужно записывать в битстрим и передавать функции его. но судя по дампу, структура пакета та же, т.е. полностью соответствует отправляемой функцией sampSendDialogResponse. был нажат 40 пункт в диалоге с идом 22?
возможно сервер проверяет ещё и текст, тогда надо передавать его четвёртым параметром.

@egor230 ознакомься с Информация - MoonLoader - разработка(https://blast.hk/threads/13315/) и примерами скриптов (ссылки на них в той же теме). это вполне элементарные вещи, и о них уже даже спрашивали в этой теме.
 
  • Нравится
Реакции: NARVELL

Dimitrador_lightbourne

Новичок
5
0
Привет друзья, я хочу отредактировать этот LUA, чтобы PING не появлялся. Если враг находится за стеной или какой-то предмет, а расстояние, на котором оно появляется, не настолько преувеличено


Код:
script_name("Player info")
script_version_number(1)
script_version("1.1")
script_author("RollUp")


function main()
while not isSampAvailable() do wait(200) end
x, y = getScreenResolution()
font = renderCreateFont("Arial", 15, 12)
    while true do
        wait(0)
        res, handle = getCharPlayerIsTargeting(playerHandle)
        if res and not isKeyDown(119) then
              resid, id = sampGetPlayerIdByCharHandle(handle)
               ping = sampGetPlayerPing(id)
              renderFontDrawText(font,''.. ping ,x/35, y/3, -1)
        end
    end
end
 
Последнее редактирование:

NARVELL

Известный
71
10
Окей, как заставить string.gsub() не воспринимать квадратные скобки частью паттерна, а заменить их?
Типа:
Lua:
x= string.gsub(x, "["..i.."]", "")
Не нашёл ответ.
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,447
Lua:
--isLineOfSightClear(float fromX, float fromY, float fromZ, float toX, float toY, float toZ, bool checkBuildings, bool checkVehicles, bool checkActors, bool checkObjects, bool checkParticles)
local fromX, fromY, fromZ = getCharCoordinates(PLAYER_PED)
local toX, toY, toZ = getCharCoordinates(handle) -- other player
if isLineOfSightClear(fromX, fromY, fromZ, toX, toY, toZ, true, false, false, true, false) then
    -- render
end
 

FYP

Известный
Автор темы
Администратор
1,757
5,684
в луа экранирование спецсимволов в паттернах осуществляется символом %
 
  • Нравится
Реакции: NARVELL

k1sher

Известный
201
4
Как по id можно узнать какой скин у другого игрока?
 
Последнее редактирование:

slidan4a

Новичок
14
5
Я переписал код CLEO анти-коллизии с игроками на Lua, но с функцией doesCharExist (аналог 056D: actor 3@ defined в CLEO) появилась проблема. Что не так?
Lua:
function code()
    for i=0, 1000, 1 do
        if(sampIsPlayerConnected(i)) then
            newPed = sampGetCharHandleBySampPlayerId(i)
            if(doesCharExist(newPed)) then --тут всегда false
                if not(newPed == playerPed) then
                    setCharCollision(newPed, collisions)
                end
            end
        end
    end
end
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,447
sampGetCharHandleBySampPlayerId возвращает два значения - результат выполнения и хендл.
Lua:
--[[bool]] result, --[[Ped]] ped = sampGetCharHandleBySampPlayerId(--[[int]] id)
 

k1sher

Известный
201
4
Делаю рандом чисел в чат. ran = math.random (1, 71)
Возможно ли сделать так чтоб не было повторений? Мож условие какие-то или еще что-то?