DEVEK Posted November 6, 2012 Share Posted November 6, 2012 (edited) Здравствуйте! У меня есть вопрос по скриптингу. Дело в том, что у меня есть небольшой скриптик для наблюдения за игроками на сервере. Работает он исправно, но есть необходимость "прикрутить" к нему смену 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 November 14, 2012 by Guest Link to comment
Vamp1r Posted November 6, 2012 Share Posted November 6, 2012 Если я правильно понял, то ты хочешь сделать команду типа "/recon", при вводе которой у игрока появляется возможность следить за игроком и переключаться между игроками при помощи кнопок? Если да, то тебе поможет https://wiki.multitheftauto.com/wiki/GetElementsByType Сохраняешь текущий индекс игрока в таблице. При нажатии на кнопку вперед индекс увеличивается на 1, при нажатии на кнопку назад индекс уменьшается на 1. Как-то коротко вот так. Link to comment
DEVEK Posted November 7, 2012 Author Share Posted November 7, 2012 Если я правильно понял, то ты хочешь сделать команду типа "/recon", при вводе которой у игрока появляется возможность следить за игроком и переключаться между игроками при помощи кнопок? Если да, то тебе поможет https://wiki.multitheftauto.com/wiki/GetElementsByTypeСохраняешь текущий индекс игрока в таблице. При нажатии на кнопку вперед индекс увеличивается на 1, при нажатии на кнопку назад индекс уменьшается на 1. Как-то коротко вот так. Спасибо за ответ. Подскажите, как вызвать запуск функции при нажатии на GUI кнопку? Link to comment
Vamp1r Posted November 7, 2012 Share Posted November 7, 2012 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
Flaker Posted November 7, 2012 Share Posted November 7, 2012 Devek, не забудь, что GUI это клиентская часть... И если твоя функцию расположена на сервере, то придется использовать triggerServerEvent Link to comment
DEVEK Posted November 8, 2012 Author Share Posted November 8, 2012 Devek, не забудь, что GUI это клиентская часть... И если твоя функцию расположена на сервере, то придется использовать triggerServerEvent Спасибо всем за помощь! Очень всем признателен! С уважением, Дмитрий. Link to comment
DEVEK Posted November 10, 2012 Author Share Posted November 10, 2012 Если я правильно понял, то ты хочешь сделать команду типа "/recon", при вводе которой у игрока появляется возможность следить за игроком и переключаться между игроками при помощи кнопок? Если да, то тебе поможет https://wiki.multitheftauto.com/wiki/GetElementsByTypeСохраняешь текущий индекс игрока в таблице. При нажатии на кнопку вперед индекс увеличивается на 1, при нажатии на кнопку назад индекс уменьшается на 1. Как-то коротко вот так. Покажите пожалуйста примером, как сохранять переменые в таблицу и как их оттуда читать. Что-то не могу с ходу разобраться. С уважением, Дмитрий. Link to comment
Vamp1r Posted November 10, 2012 Share Posted November 10, 2012 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
DEVEK Posted November 10, 2012 Author Share Posted November 10, 2012 Спасибо за ответ Vamp1r! Но таблица, она как бы локальная? И будет только "жить" внутри функции? Или я ошибаюсь? Может подскажите о создании глобальных переменных, которые можно вызывать из любого места программы? С уважением, Дмитрий. Link to comment
Flaker Posted November 10, 2012 Share Posted November 10, 2012 Просто убери local Вобще это называется массивами вобщем если... Почитай про массивы, многое станет понятно. http://ilovelua.narod.ru/about_lua.html#Arrays Link to comment
DEVEK Posted November 11, 2012 Author Share Posted November 11, 2012 Просто убери localВобще это называется массивами вобщем если... Почитай про массивы, многое станет понятно. Спасибо Flaker! Да, я прочитал, что глобальные переменные создаются просто - не внутри функции и без значения local конечно. Но, пробовал использовать созданую таким образом переменную, в другом скрипте, результат = nil С уважением, Дмитрий. Link to comment
Flaker Posted November 11, 2012 Share Posted November 11, 2012 Да, область видимости скриптом ограничена... Зачем тебе вобще использовать ее на другом ресурсе? Можно вроде в массив global запихать переменную, что бы ее прочесть можно было отовсюду... Но лучше на мой взгляд использовать export https://wiki.multitheftauto.com/wiki/Call Link to comment
DEVEK Posted November 12, 2012 Author Share Posted November 12, 2012 Подскажите пожалуйста, как привязать к переменной ID игрока? На сервере: recon_playerID = thePlayer или getLocalPlayer() не работает. Туплю конечно сильно, но сам что то не пойму. Помогайте. С уважением, Дмитрий. Link to comment
Flaker Posted November 12, 2012 Share Posted November 12, 2012 Сперва выбери событие в котором ты хочешь игрока отследить... Допустим OnPlayerDamage, тогда The source of this event is the player who was damaged. И ты в этом случае можешь сделать так: thePlayer = source. Теперь в переменной thePlayer находится ссылка на игрока, который был ранен. Link to comment
DEVEK Posted November 12, 2012 Author Share Posted November 12, 2012 (edited) Спасибо всем за помощь! Идем дальше. Есть функция: function reconPlayer(thePlayer, commandName, targetPlayer) end addCommandHandler("recon", reconPlayer, false, false) и есть функция: function next_player() --отсюда нужно запустить функцию reconPlayer с необходимыми параметрами. end Все это на стороне сервера. Как правильно вызвать функцию reconPlayer? Только господа, пожалуйста с примерами. С уважением, Дмитрий. Edited November 12, 2012 by Guest Link to comment
Flaker Posted November 12, 2012 Share Posted November 12, 2012 https://wiki.multitheftauto.com/wiki/ExecuteCommandHandler Link to comment
DEVEK Posted November 12, 2012 Author Share Posted November 12, 2012 https://wiki.multitheftauto.com/wiki/ExecuteCommandHandler Прочитал, пробовал, не смог запустить. Прошу пример, применительно к моему коду программы, пожалуйста. С уважением, Дмитрий. Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now