191 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local mpGamerTags = {}
 | |
| local mpGamerTagSettings = {}
 | |
| 
 | |
| local gtComponent = {
 | |
|     GAMER_NAME = 0,
 | |
|     CREW_TAG = 1,
 | |
|     healthArmour = 2,
 | |
|     BIG_TEXT = 3,
 | |
|     AUDIO_ICON = 4,
 | |
|     MP_USING_MENU = 5,
 | |
|     MP_PASSIVE_MODE = 6,
 | |
|     WANTED_STARS = 7,
 | |
|     MP_DRIVER = 8,
 | |
|     MP_CO_DRIVER = 9,
 | |
|     MP_TAGGED = 10,
 | |
|     GAMER_NAME_NEARBY = 11,
 | |
|     ARROW = 12,
 | |
|     MP_PACKAGES = 13,
 | |
|     INV_IF_PED_FOLLOWING = 14,
 | |
|     RANK_TEXT = 15,
 | |
|     MP_TYPING = 16
 | |
| }
 | |
| 
 | |
| local function makeSettings()
 | |
|     return {
 | |
|         alphas = {},
 | |
|         colors = {},
 | |
|         healthColor = false,
 | |
|         toggles = {},
 | |
|         wantedLevel = false
 | |
|     }
 | |
| end
 | |
| 
 | |
| local templateStr
 | |
| 
 | |
| function updatePlayerNames()
 | |
|     -- re-run this function the next frame
 | |
|     SetTimeout(0, updatePlayerNames)
 | |
| 
 | |
|     -- return if no template string is set
 | |
|     if not templateStr then
 | |
|         return
 | |
|     end
 | |
| 
 | |
|     -- get local coordinates to compare to
 | |
|     local localCoords = GetEntityCoords(PlayerPedId())
 | |
| 
 | |
|     -- for each valid player index
 | |
|     for _, i in ipairs(GetActivePlayers()) do
 | |
|         -- if the player exists
 | |
|         if i ~= PlayerId() then
 | |
|             -- get their ped
 | |
|             local ped = GetPlayerPed(i)
 | |
|             local pedCoords = GetEntityCoords(ped)
 | |
| 
 | |
|             -- make a new settings list if needed
 | |
|             if not mpGamerTagSettings[i] then
 | |
|                 mpGamerTagSettings[i] = makeSettings()
 | |
|             end
 | |
| 
 | |
|             -- check the ped, because changing player models may recreate the ped
 | |
|             -- also check gamer tag activity in case the game deleted the gamer tag
 | |
|             if not mpGamerTags[i] or mpGamerTags[i].ped ~= ped or not IsMpGamerTagActive(mpGamerTags[i].tag) then
 | |
|                 local nameTag = formatPlayerNameTag(i, templateStr)
 | |
| 
 | |
|                 -- remove any existing tag
 | |
|                 if mpGamerTags[i] then
 | |
|                     RemoveMpGamerTag(mpGamerTags[i].tag)
 | |
|                 end
 | |
| 
 | |
|                 -- store the new tag
 | |
|                 mpGamerTags[i] = {
 | |
|                     tag = CreateMpGamerTag(GetPlayerPed(i), nameTag, false, false, '', 0),
 | |
|                     ped = ped
 | |
|                 }
 | |
|             end
 | |
| 
 | |
|             -- store the tag in a local
 | |
|             local tag = mpGamerTags[i].tag
 | |
| 
 | |
|             -- should the player be renamed? this is set by events
 | |
|             if mpGamerTagSettings[i].rename then
 | |
|                 SetMpGamerTagName(tag, formatPlayerNameTag(i, templateStr))
 | |
|                 mpGamerTagSettings[i].rename = nil
 | |
|             end
 | |
| 
 | |
|             -- check distance
 | |
|             local distance = #(pedCoords - localCoords)
 | |
| 
 | |
|             -- show/hide based on nearbyness/line-of-sight
 | |
|             -- nearby checks are primarily to prevent a lot of LOS checks
 | |
|             if distance < 250 and HasEntityClearLosToEntity(PlayerPedId(), ped, 17) then
 | |
|                 SetMpGamerTagVisibility(tag, gtComponent.GAMER_NAME, true)
 | |
|                 SetMpGamerTagVisibility(tag, gtComponent.healthArmour, IsPlayerTargettingEntity(PlayerId(), ped))
 | |
|                 SetMpGamerTagVisibility(tag, gtComponent.AUDIO_ICON, NetworkIsPlayerTalking(i))
 | |
| 
 | |
|                 SetMpGamerTagAlpha(tag, gtComponent.AUDIO_ICON, 255)
 | |
|                 SetMpGamerTagAlpha(tag, gtComponent.healthArmour, 255)
 | |
| 
 | |
|                 -- override settings
 | |
|                 local settings = mpGamerTagSettings[i]
 | |
| 
 | |
|                 for k, v in pairs(settings.toggles) do
 | |
|                     SetMpGamerTagVisibility(tag, gtComponent[k], v)
 | |
|                 end
 | |
| 
 | |
|                 for k, v in pairs(settings.alphas) do
 | |
|                     SetMpGamerTagAlpha(tag, gtComponent[k], v)
 | |
|                 end
 | |
| 
 | |
|                 for k, v in pairs(settings.colors) do
 | |
|                     SetMpGamerTagColour(tag, gtComponent[k], v)
 | |
|                 end
 | |
| 
 | |
|                 if settings.wantedLevel then
 | |
|                     SetMpGamerTagWantedLevel(tag, settings.wantedLevel)
 | |
|                 end
 | |
| 
 | |
|                 if settings.healthColor then
 | |
|                     SetMpGamerTagHealthBarColour(tag, settings.healthColor)
 | |
|                 end
 | |
|             else
 | |
|                 SetMpGamerTagVisibility(tag, gtComponent.GAMER_NAME, false)
 | |
|                 SetMpGamerTagVisibility(tag, gtComponent.healthArmour, false)
 | |
|                 SetMpGamerTagVisibility(tag, gtComponent.AUDIO_ICON, false)
 | |
|             end
 | |
|         elseif mpGamerTags[i] then
 | |
|             RemoveMpGamerTag(mpGamerTags[i].tag)
 | |
| 
 | |
|             mpGamerTags[i] = nil
 | |
|         end
 | |
|     end
 | |
| end
 | |
| 
 | |
| local function getSettings(id)
 | |
|     local i = GetPlayerFromServerId(tonumber(id))
 | |
| 
 | |
|     if not mpGamerTagSettings[i] then
 | |
|         mpGamerTagSettings[i] = makeSettings()
 | |
|     end
 | |
| 
 | |
|     return mpGamerTagSettings[i]
 | |
| end
 | |
| 
 | |
| RegisterNetEvent('playernames:configure')
 | |
| 
 | |
| AddEventHandler('playernames:configure', function(id, key, ...)
 | |
|     local args = table.pack(...)
 | |
| 
 | |
|     if key == 'tglc' then
 | |
|         getSettings(id).toggles[args[1]] = args[2]
 | |
|     elseif key == 'seta' then
 | |
|         getSettings(id).alphas[args[1]] = args[2]
 | |
|     elseif key == 'setc' then
 | |
|         getSettings(id).colors[args[1]] = args[2]
 | |
|     elseif key == 'setw' then
 | |
|         getSettings(id).wantedLevel = args[1]
 | |
|     elseif key == 'sehc' then
 | |
|         getSettings(id).healthColor = args[1]
 | |
|     elseif key == 'rnme' then
 | |
|         getSettings(id).rename = true
 | |
|     elseif key == 'name' then
 | |
|         getSettings(id).serverName = args[1]
 | |
|         getSettings(id).rename = true
 | |
|     elseif key == 'tpl' then
 | |
|         for _, v in pairs(mpGamerTagSettings) do
 | |
|             v.rename = true
 | |
|         end
 | |
| 
 | |
|         templateStr = args[1]
 | |
|     end
 | |
| end)
 | |
| 
 | |
| AddEventHandler('playernames:extendContext', function(i, cb)
 | |
|     cb('serverName', getSettings(GetPlayerServerId(i)).serverName)
 | |
| end)
 | |
| 
 | |
| AddEventHandler('onResourceStop', function(name)
 | |
|     if name == GetCurrentResourceName() then
 | |
|         for _, v in pairs(mpGamerTags) do
 | |
|             RemoveMpGamerTag(v.tag)
 | |
|         end
 | |
|     end
 | |
| end)
 | |
| 
 | |
| SetTimeout(0, function()
 | |
|     TriggerServerEvent('playernames:init')
 | |
| end)
 | |
| 
 | |
| -- run this function every frame
 | |
| SetTimeout(0, updatePlayerNames)
 | 
