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

kalistonov

Участник
249
13
кинь код скрипта который ты сделал
Код:
script_author("hz")
script_name("Binder ArzRP")

require "lib.moonloader"
local keys = require "vkeys"

local tag = "{FFB841}[sda] {FFFFFF}dfgdsg"
local main_color = 0xFFFFFF
local main_color_text = "{5A90CE}"
local white_color = "{FFFFFF}"
local red_color = "{FF0000}"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
      while not isSampAvailable() do wait(100) end
      sampAddChatMessage("" .. tag, main_color)
      while true do
      wait(0)

 if testCheat("13") and not sampIsChatInputActive() then
                sampSendChat("/mask")
            end

     if testCheat("L") and not sampIsChatInputActive() then
                sampSendChat("/lock")
            end

     if testCheat("K") and not sampIsChatInputActive() then
                sampSendChat("/key")
            end

    if testCheat("P") and not sampIsChatInputActive() then
                sampSendChat("/phone")
            end

    if testCheat("12") and not sampIsChatInputActive() then
                sampSendChat("/armour")
            end

sampRegisterChatCommand('fh', function(num)
            sampSendChat('/findihouse '..num)
    end)

sampRegisterChatCommand('fbiz', function(num)
            sampSendChat('/findibiz '..num)
    end)

if wasKeyPressed(0x32) and isKeyDown(0x12) then
            local veh, ped = storeClosestEntities(PLAYER_PED)
            local _, id = sampGetPlayerIdByCharHandle(ped)
            if _ then
                    sampSendChat('/trade '..id)
            end
        end
    
end
end


local samp = require("samp.events")
function samp.onShowDialog(dialogId)
    if dialogId == 1000 then
        sampSendDialogResponse(1000,1,0,0)
        return false
    end
end

Значит другой скрипт уже зарегистрировал данную команду
нету такого
 

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,701
Код:
script_author("hz")
script_name("Binder ArzRP")

require "lib.moonloader"
local keys = require "vkeys"

local tag = "{FFB841}[sda] {FFFFFF}dfgdsg"
local main_color = 0xFFFFFF
local main_color_text = "{5A90CE}"
local white_color = "{FFFFFF}"
local red_color = "{FF0000}"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
      while not isSampAvailable() do wait(100) end
      sampAddChatMessage("" .. tag, main_color)
      while true do
      wait(0)

 if testCheat("13") and not sampIsChatInputActive() then
                sampSendChat("/mask")
            end

     if testCheat("L") and not sampIsChatInputActive() then
                sampSendChat("/lock")
            end

     if testCheat("K") and not sampIsChatInputActive() then
                sampSendChat("/key")
            end

    if testCheat("P") and not sampIsChatInputActive() then
                sampSendChat("/phone")
            end

    if testCheat("12") and not sampIsChatInputActive() then
                sampSendChat("/armour")
            end

sampRegisterChatCommand('fh', function(num)
            sampSendChat('/findihouse '..num)
    end)

sampRegisterChatCommand('fbiz', function(num)
            sampSendChat('/findibiz '..num)
    end)

if wasKeyPressed(0x32) and isKeyDown(0x12) then
            local veh, ped = storeClosestEntities(PLAYER_PED)
            local _, id = sampGetPlayerIdByCharHandle(ped)
            if _ then
                    sampSendChat('/trade '..id)
            end
        end
  
end
end


local samp = require("samp.events")
function samp.onShowDialog(dialogId)
    if dialogId == 1000 then
        sampSendDialogResponse(1000,1,0,0)
        return false
    end
end


нету такого
сделай так что юы эти строки были ПЕРЕД while true
1643906248076.png

сюда:
1643906266178.png
 

sizeoftrickster

Известный
Проверенный
143
578
ну так правильно ???
сделал так sampRegisterChatCommand('rvol', function(param) memory.write(0xBA6798, val, param, true) end)
в param указываю менше 64 от 1-10
что я не так делаю ?


Lua:
require('moonloader')

local memory = require('memory')

function main()

    if (not isSampLoaded() or not isSampfuncsLoaded()) then
        return
    end

    while (not isSampAvailable()) do
        wait(200)
    end

    sampRegisterChatCommand('volume', function (arg)
        if (type(tonumber(arg)) == 'number') then
            if (tonumber(arg) >= 0 and tonumber(arg) <= 64) then
                memory.write(0xBA6798, tonumber(arg), 4)
            end
        end
    end)

    wait(-1)
end
 
  • Нравится
Реакции: qdIbp и sep

sep

Известный
681
77


Lua:
require('moonloader')

local memory = require('memory')

function main()

    if (not isSampLoaded() or not isSampfuncsLoaded()) then
        return
    end

    while (not isSampAvailable()) do
        wait(200)
    end

    sampRegisterChatCommand('volume', function (arg)
        if (type(tonumber(arg)) == 'number') then
            if (tonumber(arg) >= 0 and tonumber(arg) <= 64) then
                memory.write(0xBA6798, tonumber(arg), 4)
            end
        end
    end)

    wait(-1)
end
да оказывается звук в настройках меняется но на слух тотже пока не перейду в еск и клацну по настойкам
у тебя в игре меняется звук радио именно Audio stream а не стандартного из авто звука ?
 

Gorskin

♥ Love Lua ♥
Проверенный
1,343
1,181
да оказывается звук в настройках меняется но на слух тотже пока не перейду в еск и клацну по настойкам
у тебя в игре меняется звук радио именно Audio stream а не стандартного из авто звука ?
Память попробуй эту ещё memory.setfloat(11926728, 1.0, false)
 
  • Нравится
Реакции: sep

Your December

Новичок
6
0
нужно передать этот файл на другой комп но у него есть привязка, помогите пж.
Если просто закинуть в папку мунлоадер на другой комп вылетает игра.
 

Вложения

  • ADg.luac
    1.9 KB · Просмотры: 3
Последнее редактирование:

EnScryptior

Участник
56
9
Здравствуйте, хочу через самп луа сделать проверку прогрузился ли данный 3д текст на маркере (через хук рпс на 3д текст). Буду очень благодарен, если поможете ♥

UPD: у меня есть предположение, что это можно осуществить с помощью
Lua:
onCreate3DText {id = 'int16'}, {color = 'int32'}, {position = 'vector3d'}, {distance = 'float'}, {testLOS = 'bool8'}, {attachedPlayerId = 'int16'}, {attachedVehicleId = 'int16'}, {text = 'encodedString4096'}
, но я не знаю как мне узнать ид данного текста, или не все пременные обязательны к заполнению?
(мне нужно, чтобы данная часть кода возвращала true, если текст прогрузился
 
Последнее редактирование:

sep

Известный
681
77
нужно передать этот файл на другой комп но у него есть привязка, помогите пж.
Если просто закинуть в папку мунлоадер на другой комп вылетает игра.
ну как я вижу нужно файл декодировать потом посмотреть исходник и полностью почти с 0 сделать такойже
тебе точно не в эту тему а в платные услуги
 

AugustTN

Известный
1,369
470
ку, подскажите как можно добавить дату и время к записи:
начал только изучать луа, так что не бейте если туплю и не понимаю очевидных вещей(
123:
local ev = require "samp.events"
function ev.onServerMessage(color, text)
   if text:find('Удача! За ящиком лежало еще кое что:(.*)')then
   xiy = text:match('Удача! За ящиком лежало еще кое что:(.*)')
   file = io.open(getGameDirectory().."//moonloader//zxc.txt", "a")
   file:write(xiy..'\n')
   file:close()
    end
end
 

BARRY BRADLEY

Известный
711
176
Здравствуйте, хочу через самп луа сделать проверку прогрузился ли данный 3д текст на маркере (через хук рпс на 3д текст). Буду очень благодарен, если поможете ♥

UPD: у меня есть предположение, что это можно осуществить с помощью
Lua:
onCreate3DText {id = 'int16'}, {color = 'int32'}, {position = 'vector3d'}, {distance = 'float'}, {testLOS = 'bool8'}, {attachedPlayerId = 'int16'}, {attachedVehicleId = 'int16'}, {text = 'encodedString4096'}
, но я не знаю как мне узнать ид данного текста, или не все пременные обязательны к заполнению?
(мне нужно, чтобы данная часть кода возвращала true, если текст прогрузился
Lua:
function sampev.onCreate3DText(id, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, text) 
  if text:find("text") then
    -- TO DO
  end

end
 
  • Нравится
Реакции: EnScryptior

Rice.

Известный
Модератор
1,756
1,622
ку, подскажите как можно добавить дату и время к записи:
начал только изучать луа, так что не бейте если туплю и не понимаю очевидных вещей(
123:
local ev = require "samp.events"
function ev.onServerMessage(color, text)
   if text:find('Удача! За ящиком лежало еще кое что:(.*)')then
   xiy = text:match('Удача! За ящиком лежало еще кое что:(.*)')
   file = io.open(getGameDirectory().."//moonloader//zxc.txt", "a")
   file:write(xiy..'\n')
   file:close()
    end
end
Lua:
local ev = require "samp.events"
function ev.onServerMessage(color, text)
   if text:find('Удача! За ящиком лежало еще кое что:(.*)')then
       xiy = text:match('Удача! За ящиком лежало еще кое что:(.*)')
       file = io.open(getGameDirectory().."//moonloader//zxc.txt", "a")
       file:write('['..os.date('%c')..'] '..xiy..'\n')
       file:close()
   end
end
 

eqzzz

Участник
122
19
Возможно реализовать, чтобы скрипт хранился допустим на диске C, не в папке moonloader, но работал?
 

YourAssistant

Участник
144
17
Lua:
local sampev = require('lib.samp.events')

function sampev.onServerMessage(color, text)
    if text:find('text') then
        sampSetChatInputEnabled(true)
    end
end

Через onSendChat можно как-то реализовать?