Jump to content

[Решено]Скрипт слежения за игроками (нужна помощь)


Recommended Posts

Здравствуйте!

У меня есть вопрос по скриптингу. Дело в том, что у меня есть небольшой скриптик для наблюдения за игроками на сервере. Работает он исправно, но есть необходимость "прикрутить" к нему смену id наблюдаемого игрока через GUI-кнопки. Посоветуйте как лучше это сделать?

Выкладываю функцию слежения за игроком.

  
function reconPlayer(thePlayer, commandName, targetPlayer) 
    if (exports.global:isPlayerAdmin(thePlayer)) then 
        if not (targetPlayer) then 
            local rx = getElementData(thePlayer, "reconx") 
            local ry = getElementData(thePlayer, "recony") 
            local rz = getElementData(thePlayer, "reconz") 
            local reconrot = getElementData(thePlayer, "reconrot") 
            local recondimension = getElementData(thePlayer, "recondimension") 
            local reconinterior = getElementData(thePlayer, "reconinterior") 
             
            if not (rx) or not (ry) or not (rz) or not (reconrot) or not (recondimension) or not (reconinterior) then 
                outputChatBox("SYNTAX: /" .. commandName .. " [Player Partial Nick]", thePlayer, 255, 194, 14) 
            else 
                detachElements(thePlayer) 
             
                setElementPosition(thePlayer, rx, ry, rz) 
                setPedRotation(thePlayer, reconrot) 
                setElementDimension(thePlayer, recondimension) 
                setElementInterior(thePlayer, reconinterior) 
                setCameraInterior(thePlayer, reconinterior) 
                 
                exports['anticheat-system']:changeProtectedElementDataEx(thePlayer, "reconx", nil) 
                exports['anticheat-system']:changeProtectedElementDataEx(thePlayer, "recony", nil, false) 
                exports['anticheat-system']:changeProtectedElementDataEx(thePlayer, "reconz", nil, false) 
                exports['anticheat-system']:changeProtectedElementDataEx(thePlayer, "reconrot", nil, false) 
                setCameraTarget(thePlayer, thePlayer) 
                setElementAlpha(thePlayer, 255) 
                outputChatBox("Recon turned off.", thePlayer, 255, 194, 14) 
            end 
        else 
            local targetPlayer, targetPlayerName = exports.global:findPlayerByPartialNick(thePlayer, targetPlayer) 
             
            if targetPlayer then 
                local logged = getElementData(targetPlayer, "loggedin") 
                 
                if (logged==0) then 
                    outputChatBox("Player is not logged in.", thePlayer, 255, 0, 0) 
                else 
                    setElementAlpha(thePlayer, 0) 
                     
                    if ( not getElementData(thePlayer, "reconx") or getElementData(thePlayer, "reconx") == true ) and not getElementData(thePlayer, "recony") then 
                        local x, y, z = getElementPosition(thePlayer) 
                        local rot = getPedRotation(thePlayer) 
                        local dimension = getElementDimension(thePlayer) 
                        local interior = getElementInterior(thePlayer) 
                        exports['anticheat-system']:changeProtectedElementDataEx(thePlayer, "reconx", x) 
                        exports['anticheat-system']:changeProtectedElementDataEx(thePlayer, "recony", y, false) 
                        exports['anticheat-system']:changeProtectedElementDataEx(thePlayer, "reconz", z, false) 
                        exports['anticheat-system']:changeProtectedElementDataEx(thePlayer, "reconrot", rot, false) 
                        exports['anticheat-system']:changeProtectedElementDataEx(thePlayer, "recondimension", dimension, false) 
                        exports['anticheat-system']:changeProtectedElementDataEx(thePlayer, "reconinterior", interior, false) 
                    end 
                    setPedWeaponSlot(thePlayer, 0) 
                     
                    local playerdimension = getElementDimension(targetPlayer) 
                    local playerinterior = getElementInterior(targetPlayer) 
                     
                    setElementDimension(thePlayer, playerdimension) 
                    setElementInterior(thePlayer, playerinterior) 
                    setCameraInterior(thePlayer, playerinterior) 
                     
                    local x, y, z = getElementPosition(targetPlayer) 
                    setElementPosition(thePlayer, x - 10, y - 10, z - 5) 
                    local success = attachElements(thePlayer, targetPlayer, -10, -10, -5) 
                    if not (success) then 
                        success = attachElements(thePlayer, targetPlayer, -5, -5, -5) 
                        if not (success) then 
                            success = attachElements(thePlayer, targetPlayer, 5, 5, -5) 
                        end 
                    end 
                     
                    if not (success) then 
                        outputChatBox("Failed to attach the element.", thePlayer, 0, 255, 0) 
                    else 
                        setCameraTarget(thePlayer, targetPlayer) 
                        outputChatBox("Now reconning " .. targetPlayerName .. ".", thePlayer, 0, 255, 0) 
                         
                        local hiddenAdmin = getElementData(thePlayer, "hiddenadmin") 
                         
                        if hiddenAdmin == 0 and not exports.global:isPlayerLeadAdmin(thePlayer) then 
                            local adminTitle = exports.global:getPlayerAdminTitle(thePlayer) 
                            exports.global:sendMessageToAdmins("AdmCmd: " .. tostring(adminTitle) .. " " .. getPlayerName(thePlayer) .. " started reconning " .. targetPlayerName .. ".") 
                        end 
                    end 
                end 
            end 
        end 
    end 
end 
addCommandHandler("recon", reconPlayer, false, false) 
  

Буду благодарен за любую помощь!

С уважением, Дмитрий.

Edited by Guest
Link to comment

Если я правильно понял, то ты хочешь сделать команду типа "/recon", при вводе которой у игрока появляется возможность следить за игроком и переключаться между игроками при помощи кнопок? Если да, то тебе поможет https://wiki.multitheftauto.com/wiki/GetElementsByType

Сохраняешь текущий индекс игрока в таблице. При нажатии на кнопку вперед индекс увеличивается на 1, при нажатии на кнопку назад индекс уменьшается на 1. Как-то коротко вот так.

Link to comment
Если я правильно понял, то ты хочешь сделать команду типа "/recon", при вводе которой у игрока появляется возможность следить за игроком и переключаться между игроками при помощи кнопок? Если да, то тебе поможет https://wiki.multitheftauto.com/wiki/GetElementsByType

Сохраняешь текущий индекс игрока в таблице. При нажатии на кнопку вперед индекс увеличивается на 1, при нажатии на кнопку назад индекс уменьшается на 1. Как-то коротко вот так.

Спасибо за ответ. Подскажите, как вызвать запуск функции при нажатии на GUI кнопку?

Link to comment
local button = guiCreateButton(0.7, 0.1, 0.2, 0.1, "Кнопка", true) 
  
addEventHandler("onClientGUIClick", getRootElement(), 
    function() 
        if source == button then 
            -- Тут вызов функции 
        end 
    end 
) 

Link to comment
Devek, не забудь, что GUI это клиентская часть... И если твоя функцию расположена на сервере, то придется использовать triggerServerEvent

Спасибо всем за помощь! Очень всем признателен!

С уважением, Дмитрий.

Link to comment
Если я правильно понял, то ты хочешь сделать команду типа "/recon", при вводе которой у игрока появляется возможность следить за игроком и переключаться между игроками при помощи кнопок? Если да, то тебе поможет https://wiki.multitheftauto.com/wiki/GetElementsByType

Сохраняешь текущий индекс игрока в таблице. При нажатии на кнопку вперед индекс увеличивается на 1, при нажатии на кнопку назад индекс уменьшается на 1. Как-то коротко вот так.

Покажите пожалуйста примером, как сохранять переменые в таблицу и как их оттуда читать. Что-то не могу с ходу разобраться.

С уважением, Дмитрий.

Link to comment
local a, b = 1, 2 -- Инициализуем две переменные. а = 1, b = 2 
local tabl = {}   -- Инициализуем табилцу 
tabl["1"] = a     -- Заносим в таблицу значение a 
tabl["2"] = b     -- Заносим в таблицу значение b 
-- Внутри квадратных скобок может быть что угодно, т.е. там может быть tabl[a] или tabl["Ololo"]. Это  всего лишь индекс нужного элемента таблицы 
a = tabl["2"]     -- Меняем значение а, на значение из таблицы 
b = tabl["1"]     -- Меняем значение b, на значение из таблицы 
tabl = nil        -- Удаляем таблицу 

Данный пример занес значения a и b в таблицу, а потом эти значения были изъяты из таблицы (в таблице эти значения все равно остались неизменными) в обратном порядке. Т.е. a = 2, а b = 1.

Link to comment

Спасибо за ответ Vamp1r! Но таблица, она как бы локальная? И будет только "жить" внутри функции? Или я ошибаюсь? Может подскажите о создании глобальных переменных, которые можно вызывать из любого места программы?

С уважением, Дмитрий.

Link to comment
Просто убери local

Вобще это называется массивами вобщем если...

Почитай про массивы, многое станет понятно.

Спасибо Flaker!

Да, я прочитал, что глобальные переменные создаются просто - не внутри функции и без значения local конечно. Но, пробовал использовать созданую таким образом переменную, в другом скрипте, результат = nil :(

С уважением, Дмитрий.

Link to comment

Да, область видимости скриптом ограничена... Зачем тебе вобще использовать ее на другом ресурсе?

Можно вроде в массив global запихать переменную, что бы ее прочесть можно было отовсюду...

Но лучше на мой взгляд использовать export https://wiki.multitheftauto.com/wiki/Call

Link to comment

Подскажите пожалуйста, как привязать к переменной ID игрока?

На сервере: recon_playerID = thePlayer или getLocalPlayer() не работает.

Туплю конечно сильно, но сам что то не пойму. Помогайте. :-)

С уважением, Дмитрий.

Link to comment

Сперва выбери событие в котором ты хочешь игрока отследить...

Допустим OnPlayerDamage, тогда The source of this event is the player who was damaged.

И ты в этом случае можешь сделать так: thePlayer = source. Теперь в переменной thePlayer находится ссылка на игрока, который был ранен.

Link to comment

Спасибо всем за помощь! Идем дальше.

Есть функция:

function reconPlayer(thePlayer, commandName, targetPlayer) 
  
end 
addCommandHandler("recon", reconPlayer, false, false) 

и есть функция:

function next_player() 
--отсюда нужно запустить функцию reconPlayer с необходимыми параметрами. 
end 

Все это на стороне сервера.

Как правильно вызвать функцию reconPlayer? Только господа, пожалуйста с примерами.

С уважением, Дмитрий.

Edited by Guest
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...