este es el script ,e intentado mucho
local x, y = guiGetScreenSize ()
local localPlayer = getLocalPlayer()
local spectatorSettings = {
count = 7, -- how many player names to show, before showing "and x more"
charLimit = 19, -- max limit of characters in player name
xOffset = 200, -- how far to the left this should be
yOffset = (y / 2) - 10, -- how far down the screen this should be ~ currently it is almost half way down
alwaysShow = true -- whether to show anything if there aren't any players spectating you
}
local spectators = {}
addEvent('addSpectator', true)
addEvent('removeSpectator', true)
addEventHandler('onClientResourceStart', root,
function()
triggerServerEvent ('addClient', localPlayer)
end
)
addEventHandler('addSpectator', root,
function(spectator)
table.insert(spectators, spectator)
end
)
addEventHandler('removeSpectator', root,
function(spectator)
for i, val in ipairs(spectators) do
if (val == spectator) then
table.remove(spectators, i)
end
end
end
)
function elementCheck (elem)
if elem then
if isElement (elem) then
if (getElementType (elem) == 'player') then
return true
end
end
end
return false
end
function drawSpectators()
local textX = x - spectatorSettings.xOffset
local textY = spectatorSettings.yOffset
if (not isPlayerDead(localPlayer)) then
local s_Spectators = 'Spectadores ['.. tostring(#spectators) ..']\n'
if (#spectators > 0) then
for i, v in ipairs(spectators) do
if elementCheck (v) then
local name = getPlayerName(v)
if (string.len(getPlayerName(v)) > spectatorSettings.charLimit) then
name = string.sub(name, 0, spectatorSettings.charLimit)..'..'
end
if (i > spectatorSettings.count) then
s_Spectators = s_Spectators..tostring(#spectators - spectatorSettings.count)..' more'
break
else
s_Spectators = s_Spectators..name..'\n'
end
else
table.remove (spectators, k)
end
end
else
if (spectatorSettings.alwaysShow) then
s_Spectators = s_Spectators..'None'
else
s_Spectators = '/'
end
end
dxDrawText (s_Spectators, textX, textY, x, y, tocolor(255, 255, 255, 255), 0.5, 'Bankgothic')
dxDrawText (s_Spectators, textX, textY, x, y, tocolor(0, 0, 0, 0), 0.5, 'Bankgothic')
--dxDrawText("Spectating [".. tostring(#spectators) .."]", 825, y-410, x, y, tocolor ( 255, 255, 255, 255 ), 0.5, "bankgothic" )
end
end
addEventHandler('onClientRender', root, drawSpectators)
de lado del servidor
l GATHER_FREQUENCY = 1000 -- how often in ms it should run the "spectator" function
local playerData = {}
local spectator_players = {}
addEvent('onCameraTargetChange')
addEvent('removeClient', true)
addEvent('addClient', true)
function elementCheck (elem)
if elem then
if isElement (elem) then
if (getElementType (elem) == 'player') then
return true
end
end
end
return false
end
function repairTable()
for i, val in ipairs (spectator_players) do
if not elementCheck (val) then
if playerData[val] then
if playerData[val].target then
if (elementCheck(playerData[val].target) and playerData[val].target ~= val) then
triggerClientEvent(playerData[val].target, 'removeSpectator', playerData[val].target, player)
end
end
for k, v in ipairs (playerData) do
if (k == val) then
table.remove (playerData, k)
end
end
end
table.remove (spectator_players, i)
end
end
end
function spectators()
for i, player in ipairs(spectator_players) do
if elementCheck (player) then
local target = getCameraTarget(player)
if (not playerData[player]) then
playerData[player] = {}
end
if (target ~= playerData[player].target) then -- if the target is different from previous one
playerData[player].previous = playerData[player].target -- store the old target
playerData[player].target = target -- store the new target
triggerEvent('onCameraTargetChange', player, playerData[player].target, playerData[player].previous)
end
else
repairTable()
end
end
end
setTimer(spectators, GATHER_FREQUENCY, 0)
addEventHandler('onCameraTargetChange', root,
function(target, oldTarget)
if elementCheck (oldTarget) then -- if the old target is valid(ie. not false or nil(in which case the camera was fixed))
triggerClientEvent(oldTarget, 'removeSpectator', oldTarget, source) -- trigger for the old target to remove from his list
end
if (target == source) or (not target) then -- if the new target is invalid or facing the player who invoked the event
return
end
if elementCheck (target) then
triggerClientEvent(target, 'addSpectator', target, source) -- else we add the player to the targets list
end
end
)
function removeClient()
if (playerData[source]) then
if (playerData[source].target) then
triggerClientEvent(playerData[source].target, 'removeSpectator', playerData[source].target, source)
end
playerData[source] = nil
end
for i, val in ipairs(spectator_players) do
if (val == source) then
table.remove(spectator_players, i)
end
end
end
addEvent ('removeClient')
addEventHandler ('removeClient', root, removeClient)
function addClient()
if elementCheck (source) then
table.insert(spectator_players, source)
end
end
addEvent ('addClient', true)
addEventHandler ('addClient', root, addClient)
addEventHandler ('onPlayerQuit', root, removeClient)