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

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,482
Lua:
text = '[Nathan_Ratzenberger]: Совершено преступление: [напад], Подозреваемый: [Jinhaei_Rizzuto],Ур. розыска: [6]'
local nick1, reason, nick2 = text:match('%[(.*)%].+%[(.*)%].+%[(.*)%].+')
[Pablo_Enrimuerta]: Выписан Штраф: [ДТП.], Нарушитель: [Alexander_Rapenok],Сумма: [20000$]
Сделай пожалуйста аналогичное и с этой строкой.
 

ShuffleBoy

Известный
Друг
754
429
Есть строка:
[Nathan_Ratzenberger]: Совершено преступление: [напад], Подозреваемый: [Jinhaei_Rizzuto],Ур. розыска: [6]

Мне из этого текста нужно вырвать оба ника, причину объявления в розыск и уровень розыска, после чего отправить это в чат под своим форматом.
Кто-нибудь может помочь с этим?
UPD: Сделайте пожалуйста тоже самое и с этой строкой.
[Pablo_Enrimuerta]: Выписан Штраф: [ДТП.], Нарушитель: [Alexander_Rapenok],Сумма: [20000$]

Вырвите из этого текста оба ника, причину штрафа и сумму.
Lua:
nick1, id1, reason, nick2, id2, level = text:match('%[(.*)%[(.*)%]%]: Совершено преступление: %[(.*)%], Подозреваемый: %[(.*)%[(.*)%]%],Ур. розыска: %[(.*)%]')

[Pablo_Enrimuerta]: Выписан Штраф: [ДТП.], Нарушитель: [Alexander_Rapenok],Сумма: [20000$]
Сделай пожалуйста аналогичное и с этой строкой.
Lua:
text = '[Pablo_Enrimuerta]: Выписан Штраф: [ДТП.], Нарушитель: [Alexander_Rapenok],Сумма: [20000$]'
nick, reason, nick2, summ = text:match('%[(.*)%]: Выписан Штраф: %[(.*)%], Нарушитель: %[(.*)%],Сумма: %[(.*)%]')
 
Последнее редактирование модератором:

ShuffleBoy

Известный
Друг
754
429
Вот у меня есть строчка 'бх супер крута', как мне ее закодировать в 16 ричный код, никто не знает?
 

Qsany

Потрачен
464
147
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
memory = require 'memory'

function main()
    font = renderCreateFont('Arial black', 11, 4)
    while true do wait(0)
        x, y = getScreenResolution()
        render_hud_x, render_hud_y = convertGameScreenCoordsToWindowScreenCoords(545.6, 32.2)
        pos_x_hp, pos_y_hp = convertGameScreenCoordsToWindowScreenCoords(576.0, 66.7)
        pos_x_arm, pos_y_arm = convertGameScreenCoordsToWindowScreenCoords(576.0, 44)
        pos_x_wat, pos_y_wat = convertGameScreenCoordsToWindowScreenCoords(576.0, 56)
        if isPlayerPlaying(playerPed) then
            if memory.getint16(0xBA6769) == 1 then
                local car, hpcar
                local hp = getCharHealth(playerPed)
                local arm = getCharArmour(playerPed)
                local sprint = math.floor(getSprintLocalPlayer())
                local water = math.floor(getWaterLocalPlayer())
                if isCharInAnyCar(playerPed) then
                    car = storeCarCharIsInNoSave(playerPed)
                    hpcar = getCarHealth(car)
                end
                local width = car and math.floor((x/11.1)*(hpcar/1000)) or math.floor((x/11.1)*(sprint/100))
                renderDrawBox(render_hud_x, render_hud_y, x/10.3, y/51.2, 0xFF000000)
                renderDrawBox(render_hud_x+(x/273.2), render_hud_y+(y/192), x/11.1, y/109.7, car and 0xFF40407f or 0xff40407f)
                renderDrawBox(render_hud_x+(x/273.2), render_hud_y+(y/192), width, y/109.7, car and 0xff8080ff or 0xFF8080ff)
                renderFontDrawText(font, car and hpcar or sprint, pos_x_arm-(renderGetFontDrawTextLength(font, car and hpcar or sprint)/2), pos_y_arm-23, car and 0xFFffffff or 0xFFffffff)
                renderFontDrawText(font, hp, pos_x_hp-(renderGetFontDrawTextLength(font, hp)/2), pos_y_hp, 0xFFFFffff)
                if arm > 101 then
                    renderFontDrawText(font, arm, pos_x_arm-(renderGetFontDrawTextLength(font, arm)/2), pos_y_arm, -1)
                end
                if isCharInWater(playerPed) or car and isCarInWater(car) then
                    renderFontDrawText(font, water, pos_x_wat-(renderGetFontDrawTextLength(font, water)/2), pos_y_wat, 0xFFffffff)
                end
            end
        end
    end
end

function getSprintLocalPlayer()
    local float = memory.getfloat(0xB7CDB4)
    return float/31.47000244
end

function getWaterLocalPlayer()
    local float = memory.getfloat(0xB7CDE0)
    return float/39.97000244
end

Пацики плиз, вырежите функцию отвечающую хп авто в дравбаре + само хп авто в циферках, и проверку на то что ты сидишь в тачке
<3 <3 <3
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,482
В общем, есть баг, из-за которого текст в чат не помещается.
upload_2018-4-3_22-30-19.png


Из-за этого SAMP.Lua не видит эту строку.
И вопрос: Есть ли какой-нибудь способ исправить это? Что-бы SAMP.Lua видел эту строку нормально и мог брать от-туда нужную информацию. Должно показываться как-то так:
[22:27:56] [Katsuro_Kobayashi]: Совершено преступление: [testtesttesttesttesttesttesttesttesttesttes], Подозреваемый: [Mort_Rihter],Ур. розыска: [0]
 
1,417
1,029
В общем, есть баг, из-за которого текст в чат не помещается.
Посмотреть вложение 13017

Из-за этого SAMP.Lua не видит эту строку.
И вопрос: Есть ли какой-нибудь способ исправить это? Что-бы SAMP.Lua видел эту строку нормально и мог брать от-туда нужную информацию. Должно показываться как-то так:
[22:27:56] [Katsuro_Kobayashi]: Совершено преступление: [testtesttesttesttesttesttesttesttesttesttes], Подозреваемый: [Mort_Rihter],Ур. розыска: [0]
выведи эту строку в лог сф и посмотри чем она оканчивается, если так же на "Ур.ро", то нельзя.
 

loverBoy

Новичок
29
0
Дорогие старожилы, подскажите пожалуйста, как при наведении на игрока (тобеж таргет, тобеж зелёненькая стрелочка) взять его ID или Nick. Заранее спасибо за ответ.
 

Qsany

Потрачен
464
147
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как уменьшить текстдрав?
 

Alkasch226

Известный
43
4
Дорогие старожилы, подскажите пожалуйста, как при наведении на игрока (тобеж таргет, тобеж зелёненькая стрелочка) взять его ID или Nick. Заранее спасибо за ответ.
Lua:
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- получить хендл персонажа, в которого целится игрок
if valid and doesCharExist(ped) then -- если цель есть и персонаж существует
    local result, id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
    if result and Mid ~= id then -- проверить, прошло ли получение ида успешно
        Mid = id -- ID
        Mnick = sampGetPlayerNickname(Mid) -- Nick
    end
end
 
  • Нравится
Реакции: loverBoy

MEXANI3M

Новичок
49
8
setGameKeyState(int key, int state), почему int state от -32768 до 32767, какое число, чтобы поставить клавишу в нажатое и отжатое положение?
скажите, пж id клавиш управления транспортом(стандарт W,A,S,D,space), искал в keys.lua, не нашёл
 
Последнее редактирование:

ShadowBroker

Известный
110
27
setGameKeyState(int key, int state), почему int state от -32768 до 32767, какое число, чтобы поставить клавишу в нажатое и отжатое положение?
Не знаю как в луа, а в клео это число 255, но там еще есть нюансы, посмотри в общем opcodes - 0b56 | BlastHack — DEV_WIKI(https://blast.hk/wiki/opcodes:0b56)
 
Последнее редактирование: