Хочу создать команду в samp в которой нужно ввести id игрока

Alexey228228

Новичок
Автор темы
5
1
Версия MoonLoader
Другое
Помогите пожалуйста, я хочу создать команду в Moonloader в которой кроме команды нужно ввести ID, чтобы потом это id использовать в скрипте
У меня есть sampfunc, cleo, Moonloader (если зависимости будут)
 

w99zzl1

Участник
150
17
Lua:
function cmd_test(arg)
    sampAddChatMessage("Текущий аргумент: " .. tostring(arg), 0x00FF00)
end
arg - это текст, который ты указал "агрументом" команды. В дальнейшем можешь добавить проверку, чтобы аргумент был числом, чтобы он вообще присутствовал и т.д. Если впадлу использовать "arg", то инициализируй переменную local id = "", потом в функции выставь, что id = arg, и используй id (или tostring(id)) для вывода. А лучше, чекни гайды, это база)
 

kyrtion

Известный
1,128
408
function zapomni(arg) id = arg end
arg в sampRegisterChatCommand является строковое

Lua:
local sampev = require('samp.events')

local target = {
    id = nil,
    nickname = nil
}

local function alert(message)
    message = tostring(message)
    return sampAddChatMessage(message, -1)
end

local function alertf(pattern, ...)
    pattern = string.format(pattern, ...)
    return alert(pattern)
end

local function setTargetPlayerByPlayerId(arg)
    local playerId = tonumber(arg)

    if arg:len() == 0 or not playerId then
        alert('[Подсказка] Используйте: /target [ID]')
        return -- прерываем продолжение исполнение данной функции, вроде фраза такая "всё остановись!"
    elseif not arg:find('^%d+$') then
        -- на всякий случай защита от дурака
        -- если укажут 1.1 то вернет 1.1 как вещественные числа. а нам нужны целые! кста без минуса
        alert('[Ошибка] В аргумент ID должно быть целые и положительные числа')
        return
    elseif playerId < 0 or playerId > 1000 then -- min id = 0, max = 999, sum = 1000 players (limit in samp)
        alert('[Ошибка] В аргумент ID должно быть не меньше 0 и не больше 1000')
        return
    elseif not sampIsPlayerConnected(playerId) then
        alertf('[Ошибка] Игрок не в сети', playerId)
        return
    end

    local nickname = sampGetPlayerNickname(playerId)

    alertf('[Успешно] Вы указали цель игрока %s[%d]', target.nickname, playerId)

    target.nickname = nickname
    target.id = playerId
end

local function getTargetPlayer()
    if not target.id then
        alert('[Ошибка] Вы еще не указали цель игрока! Введите: /target [ID]')
        return
    end

    alertf('[Информация] Текущая цель игрока: %s[%d]', target.nickname, target.id)
end

function main()
    while not isSampAvailable() do wait(0) end

    sampRegisterChatCommand('settarget', setTargetPlayerByPlayerId)
    sampRegisterChatCommand('gettarget', getTargetPlayer)

    wait(-1)
end

function sampev.onPlayerQuit(playerId)
    if target.id and target.id == playerId then
        alertf('[Информация] Игрок %s[%d] вышел из сервера, цель удалена!', target.nickname, target.id)
        target.nickname = nil
        target.id = nil
    end
end
 
  • Эм
Реакции: qdIbp

meowprd

Тот самый Котовский
Проверенный
1,299
730
arg в sampRegisterChatCommand является строковое

Lua:
local sampev = require('samp.events')

local target = {
    id = nil,
    nickname = nil
}

local function alert(message)
    message = tostring(message)
    return sampAddChatMessage(message, -1)
end

local function alertf(pattern, ...)
    pattern = string.format(pattern, ...)
    return alert(pattern)
end

local function setTargetPlayerByPlayerId(arg)
    local playerId = tonumber(arg)

    if arg:len() == 0 or not playerId then
        alert('[Подсказка] Используйте: /target [ID]')
        return -- прерываем продолжение исполнение данной функции, вроде фраза такая "всё остановись!"
    elseif not arg:find('^%d+$') then
        -- на всякий случай защита от дурака
        -- если укажут 1.1 то вернет 1.1 как вещественные числа. а нам нужны целые! кста без минуса
        alert('[Ошибка] В аргумент ID должно быть целые и положительные числа')
        return
    elseif playerId < 0 or playerId > 1000 then -- min id = 0, max = 999, sum = 1000 players (limit in samp)
        alert('[Ошибка] В аргумент ID должно быть не меньше 0 и не больше 1000')
        return
    elseif not sampIsPlayerConnected(playerId) then
        alertf('[Ошибка] Игрок не в сети', playerId)
        return
    end

    local nickname = sampGetPlayerNickname(playerId)

    alertf('[Успешно] Вы указали цель игрока %s[%d]', target.nickname, playerId)

    target.nickname = nickname
    target.id = playerId
end

local function getTargetPlayer()
    if not target.id then
        alert('[Ошибка] Вы еще не указали цель игрока! Введите: /target [ID]')
        return
    end

    alertf('[Информация] Текущая цель игрока: %s[%d]', target.nickname, target.id)
end

function main()
    while not isSampAvailable() do wait(0) end

    sampRegisterChatCommand('settarget', setTargetPlayerByPlayerId)
    sampRegisterChatCommand('gettarget', getTargetPlayer)

    wait(-1)
end

function sampev.onPlayerQuit(playerId)
    if target.id and target.id == playerId then
        alertf('[Информация] Игрок %s[%d] вышел из сервера, цель удалена!', target.nickname, target.id)
        target.nickname = nil
        target.id = nil
    end
end
Не самый удачный пример кода, если честно.
Я считаю, что достаточно было просто упомянуть, что при использовании аргумента в функции туда передается все, что будет введено после команды + пробел.
Например:
Lua:
-- somewhere
sampRegisterChatCommand("command", cmd)

function cmd(params)
    print(params)
end

-- Если я вызываю /command foo bar
-- То в moonloader.log будет выведено "foo bar"

Для того, чтобы обработать входящую информацию и провести ее валидацию можно использовать регулярные выражения.
Допустим, мы ожидаем что в /command будет передано 2 аргумента: из которых первый число, второе строка

Lua:
function cmd(params)
    local int, str = params:match("(%d+) (.*)")
    if not int or not str then sampAddChatMessage("Usage: /command [integer] [string]")
   
    return int, str
end

В примере выше команда разбивает передаваемый ей аргумент на две переменных и возвращает их как результат выполнения функции.
 
  • Нравится
Реакции: qdIbp

Alexey228228

Новичок
Автор темы
5
1
Не самый удачный пример кода, если честно.
Я считаю, что достаточно было просто упомянуть, что при использовании аргумента в функции туда передается все, что будет введено после команды + пробел.
Например:
Lua:
-- somewhere
sampRegisterChatCommand("command", cmd)

function cmd(params)
    print(params)
end

-- Если я вызываю /command foo bar
-- То в moonloader.log будет выведено "foo bar"

Для того, чтобы обработать входящую информацию и провести ее валидацию можно использовать регулярные выражения.
Допустим, мы ожидаем что в /command будет передано 2 аргумента: из которых первый число, второе строка

Lua:
function cmd(params)
    local int, str = params:match("(%d+) (.*)")
    if not int or not str then sampAddChatMessage("Usage: /command [integer] [string]")
  
    return int, str
end

В примере выше команда разбивает передаваемый ей аргумент на две переменных и возвращает их как результат выполнения функции.
слушай спасибо тебе, помогло вот эта строчка:

Код:
sampRegisterChatCommand("command", cmd)

function cmd(params)
    print(params)
end

просто когда я пытался вместо params подставить arg, получалось так что скрипт ломался и если прописать 2 раз команду и параметр то скрипт и вовсе выгрузится, спасибо еще раз
 
  • Нравится
Реакции: meowprd