aliensky Posted January 14, 2015 Share Posted January 14, 2015 Hello, i need help. Why does this script is not working? I can't see it when i'm in other team. It's okay but when i join to Criminal team, i can't see it again. What should i do? Thanks. local crMarker = createMarker(1863.6999511719,-1598.6999511719,12.89999961853, 'cylinder', 2, 255, 0,0, 150) setElementVisibleTo (crMarker,getTeamFromName ("Criminal"), true) setElementVisibleTo (crMarker, root, false ) Link to comment
joaosilva099 Posted January 15, 2015 Share Posted January 15, 2015 local crMarker = createMarker(1863.6999511719,-1598.6999511719,12.89999961853, 'cylinder', 2, 255, 0,0, 150) setElementVisibleTo (crMarker, root, false ) for k, v in ipairs(getPlayersInTeam(getTeamFromName ("Criminal"))) do setElementVisibleTo (crMarker, v, true) end Link to comment
Moderators Citizen Posted January 15, 2015 Moderators Share Posted January 15, 2015 local crMarker = createMarker(1863.6999511719,-1598.6999511719,12.89999961853, 'cylinder', 2, 255, 0,0, 150) setElementVisibleTo (crMarker, root, false ) for k, v in ipairs(getPlayersInTeam(getTeamFromName ("Criminal"))) do setElementVisibleTo (crMarker, v, true) end Totally pointless, it will do the exact same result. Here is the reason: When the setElementVisibleTo is called you (aliensky) get the "Criminal" team element with his members as children. So imagine you are "Player1" and you are not in the Criminal team, but there is "Player2" and "Player3" in the Criminal team, when this piece of code is called, it will set the visibility to true for only "Player2" and "Player3" and then it's over ! It won't update automatically if "Player1" joins the team ! So you have to set the visibility to true for anyone who will join this team, and to false for anyone who will leave that team. A good way to do that would be to listen for an event such as "onPlayerTeamChange" but this event doesn't exist. So I did this instead: -- Table that will store the teams that have elements only visible for their members. local teamVisibilityBindings = {} -- Copying the original setElementVisibleTo function into _setElementVisibleTo: local _setElementVisibleTo = setElementVisibleTo -- Replacing setElementVisibleTo function by our own for the whole resource: _G.setElementVisibleTo = function ( theElement, visibleTo, visible ) if isElement(visibleTo) and getElementType(visibleTo) == "team" then addTeamVisibilityBinding(visibleTo, theElement, visible) end end local function addTeamVisibilityBinding(team, element, visibility) local bindings = teamBindings[team] if not bindings then teamBindings[team] = {} bindings = teamBindings[team] end local notFound = true for elem, vis in pairs(bindings) do if elem == element then -- if there is already an entry for that team and element local notFound = false if vis ~= visibility then -- if we are changing the visibility teamBindings[team][elem] = visibility -- Update it refreshVisibility(true) end end end -- We checked all the bindings for that team if notFound then -- It's a new element to bind its visibility to a team teamBindings[team][element] = visibility -- Add it refreshVisibility(true) end end local teamMembersCache = {} function refreshVisibility( forced ) for team, bindings in pairs(teamVisibilityBindings) do local nbMembers = #getPlayersInTeam(team) if teamMembersCache[team] ~= nil or nbMembers ~= teamMembersCache[team] or forced then --if the number of members changed or we are forcing it for elem, vis in pairs(bindings) do _setElementVisibleTo(elem, root, not vis) _setElementVisibleTo(elem, team, vis) end end end end setTimer(refreshVisibility, 1000, 0) This should work but I didn't tested it (I can't for now). Here is what your code should now looks like: local crMarker = createMarker(1863.6999511719,-1598.6999511719,12.89999961853, 'cylinder', 2, 255, 0,0, 150) setElementVisibleTo (crMarker, getTeamFromName ("Criminal"), true) Link to comment
joaosilva099 Posted January 20, 2015 Share Posted January 20, 2015 local crMarker = createMarker(1863.6999511719,-1598.6999511719,12.89999961853, 'cylinder', 2, 255, 0,0, 150) setElementVisibleTo (crMarker, root, false ) for k, v in ipairs(getPlayersInTeam(getTeamFromName ("Criminal"))) do setElementVisibleTo (crMarker, v, true) end Totally pointless, it will do the exact same result. Here is the reason: When the setElementVisibleTo is called you (aliensky) get the "Criminal" team element with his members as children. So imagine you are "Player1" and you are not in the Criminal team, but there is "Player2" and "Player3" in the Criminal team, when this piece of code is called, it will set the visibility to true for only "Player2" and "Player3" and then it's over ! It won't update automatically if "Player1" joins the team ! So you have to set the visibility to true for anyone who will join this team, and to false for anyone who will leave that team. A good way to do that would be to listen for an event such as "onPlayerTeamChange" but this event doesn't exist. So I did this instead: -- Table that will store the teams that have elements only visible for their members. local teamVisibilityBindings = {} -- Copying the original setElementVisibleTo function into _setElementVisibleTo: local _setElementVisibleTo = setElementVisibleTo -- Replacing setElementVisibleTo function by our own for the whole resource: _G.setElementVisibleTo = function ( theElement, visibleTo, visible ) if isElement(visibleTo) and getElementType(visibleTo) == "team" then addTeamVisibilityBinding(visibleTo, theElement, visible) end end local function addTeamVisibilityBinding(team, element, visibility) local bindings = teamBindings[team] if not bindings then teamBindings[team] = {} bindings = teamBindings[team] end local notFound = true for elem, vis in pairs(bindings) do if elem == element then -- if there is already an entry for that team and element local notFound = false if vis ~= visibility then -- if we are changing the visibility teamBindings[team][elem] = visibility -- Update it refreshVisibility(true) end end end -- We checked all the bindings for that team if notFound then -- It's a new element to bind its visibility to a team teamBindings[team][element] = visibility -- Add it refreshVisibility(true) end end local teamMembersCache = {} function refreshVisibility( forced ) for team, bindings in pairs(teamVisibilityBindings) do local nbMembers = #getPlayersInTeam(team) if teamMembersCache[team] ~= nil or nbMembers ~= teamMembersCache[team] or forced then --if the number of members changed or we are forcing it for elem, vis in pairs(bindings) do _setElementVisibleTo(elem, root, not vis) _setElementVisibleTo(elem, team, vis) end end end end setTimer(refreshVisibility, 1000, 0) This should work but I didn't tested it (I can't for now). Here is what your code should now looks like: local crMarker = createMarker(1863.6999511719,-1598.6999511719,12.89999961853, 'cylinder', 2, 255, 0,0, 150) setElementVisibleTo (crMarker, getTeamFromName ("Criminal"), true) You are right. I didnt understood that part when he asks for the blip to get shown when he joins the team 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