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)
 |