local Keys = { ["ESC"] = 322, ["F1"] = 288, ["F2"] = 289, ["F3"] = 170, ["F5"] = 166, ["F6"] = 167, ["F7"] = 168, ["F8"] = 169, ["F9"] = 56, ["F10"] = 57, ["~"] = 243, ["1"] = 157, ["2"] = 158, ["3"] = 160, ["4"] = 164, ["5"] = 165, ["6"] = 159, ["7"] = 161, ["8"] = 162, ["9"] = 163, ["-"] = 84, ["="] = 83, ["BACKSPACE"] = 177, ["TAB"] = 37, ["Q"] = 44, ["W"] = 32, ["E"] = 38, ["R"] = 45, ["T"] = 245, ["Y"] = 246, ["U"] = 303, ["P"] = 199, ["["] = 39, ["]"] = 40, ["ENTER"] = 18, ["CAPS"] = 137, ["A"] = 34, ["S"] = 8, ["D"] = 9, ["F"] = 23, ["G"] = 47, ["H"] = 74, ["K"] = 311, ["L"] = 182, ["LEFTSHIFT"] = 21, ["Z"] = 20, ["X"] = 73, ["C"] = 26, ["V"] = 0, ["B"] = 29, ["N"] = 249, ["M"] = 244, [","] = 82, ["."] = 81, ["LEFTCTRL"] = 36, ["LEFTALT"] = 19, ["SPACE"] = 22, ["RIGHTCTRL"] = 70, ["HOME"] = 213, ["PAGEUP"] = 10, ["PAGEDOWN"] = 11, ["DELETE"] = 178, ["LEFT"] = 174, ["RIGHT"] = 175, ["TOP"] = 27, ["DOWN"] = 173, ["NENTER"] = 201, ["N4"] = 108, ["N5"] = 60, ["N6"] = 107, ["N+"] = 96, ["N-"] = 97, ["N7"] = 117, ["N8"] = 61, ["N9"] = 118 } local GUI = {} GUI.Time = 0 local IsPaused = false local PlayerSpawned = false local PlayerShootingTimeouts = {} local Pickups = {} RegisterNetEvent('esx:playerLoaded') AddEventHandler('esx:playerLoaded', function(xPlayer) ESX.PlayerLoaded = true ESX.PlayerData = xPlayer for i=1, #xPlayer.accounts, 1 do local accountTpl = '
 {{money}}
' ESX.UI.HUD.RegisterElement('account_' .. xPlayer.accounts[i].name, i-1, 0, accountTpl, { money = 0 }) ESX.UI.HUD.UpdateElement('account_' .. xPlayer.accounts[i].name, { money = xPlayer.accounts[i].money }) end local jobTpl = '
{{job_label}} - {{grade_label}}
' if xPlayer.job.grade_label == '' then jobTpl = '
{{job_label}}
' end ESX.UI.HUD.RegisterElement('job', #xPlayer.accounts, 0, jobTpl, { job_label = '', grade_label = '' }) ESX.UI.HUD.UpdateElement('job', { job_label = xPlayer.job.label, grade_label = xPlayer.job.grade_label }) end) AddEventHandler('playerSpawned', function() Citizen.CreateThread(function() while not ESX.PlayerLoaded do Citizen.Wait(0) end local playerPed = GetPlayerPed(-1) -- Restore position if ESX.PlayerData.lastPosition ~= nil then SetEntityCoords(playerPed, ESX.PlayerData.lastPosition.x, ESX.PlayerData.lastPosition.y, ESX.PlayerData.lastPosition.z) end -- Restore loadout TriggerEvent('esx:restoreLoadout') PlayerSpawned = true end) end) AddEventHandler('skinchanger:modelLoaded', function() while not ESX.PlayerLoaded do Citizen.Wait(0) end TriggerEvent('esx:restoreLoadout') end) AddEventHandler('esx:restoreLoadout', function () local playerPed = GetPlayerPed(-1) RemoveAllPedWeapons(playerPed, true) for i=1, #ESX.PlayerData.loadout, 1 do local weaponHash = GetHashKey(ESX.PlayerData.loadout[i].name) GiveWeaponToPed(playerPed, weaponHash, ESX.PlayerData.loadout[i].ammo, false, false) end end) RegisterNetEvent('esx:setAccountMoney') AddEventHandler('esx:setAccountMoney', function(account) for i=1, #ESX.PlayerData.accounts, 1 do if ESX.PlayerData.accounts[i].name == account.name then ESX.PlayerData.accounts[i] = account end end ESX.UI.HUD.UpdateElement('account_' .. account.name, { money = account.money }) end) RegisterNetEvent('es:activateMoney') AddEventHandler('es:activateMoney', function(money) ESX.PlayerData.money = money end) RegisterNetEvent('esx:addInventoryItem') AddEventHandler('esx:addInventoryItem', function(item, count) for i=1, #ESX.PlayerData.inventory, 1 do if ESX.PlayerData.inventory[i].name == item.name then ESX.PlayerData.inventory[i] = item end end ESX.UI.ShowInventoryItemNotification(true, item, count) if ESX.UI.Menu.IsOpen('default', 'es_extended', 'inventory') then ESX.ShowInventory() end end) RegisterNetEvent('esx:removeInventoryItem') AddEventHandler('esx:removeInventoryItem', function(item, count) for i=1, #ESX.PlayerData.inventory, 1 do if ESX.PlayerData.inventory[i].name == item.name then ESX.PlayerData.inventory[i] = item end end ESX.UI.ShowInventoryItemNotification(false, item, count) if ESX.UI.Menu.IsOpen('default', 'es_extended', 'inventory') then ESX.ShowInventory() end end) RegisterNetEvent('esx:setJob') AddEventHandler('esx:setJob', function(job) ESX.PlayerData.job = job end) RegisterNetEvent('esx:addWeapon') AddEventHandler('esx:addWeapon', function(weaponName, ammo) local playerPed = GetPlayerPed(-1) local weaponHash = GetHashKey(weaponName) GiveWeaponToPed(playerPed, weaponHash, ammo, false, false) end) RegisterNetEvent('esx:removeWeapon') AddEventHandler('esx:removeWeapon', function(weaponName) local playerPed = GetPlayerPed(-1) local weaponHash = GetHashKey(weaponName) RemoveWeaponFromPed(playerPed, weaponHash) end) -- Commands RegisterNetEvent('esx:teleport') AddEventHandler('esx:teleport', function(pos) pos.x = pos.x + 0.0 pos.y = pos.y + 0.0 pos.z = pos.z + 0.0 RequestCollisionAtCoord(pos.x, pos.y, pos.z) while not HasCollisionLoadedAroundEntity(GetPlayerPed(-1)) do RequestCollisionAtCoord(pos.x, pos.y, pos.z) Citizen.Wait(0) end SetEntityCoords(GetPlayerPed(-1), pos.x, pos.y, pos.z) end) RegisterNetEvent('esx:setJob') AddEventHandler('esx:setJob', function(job) ESX.UI.HUD.UpdateElement('job', { job_label = job.label, grade_label = job.grade_label }) end) RegisterNetEvent('esx:loadIPL') AddEventHandler('esx:loadIPL', function(name) Citizen.CreateThread(function() LoadMpDlcMaps() EnableMpDlcMaps(true) RequestIpl(name) end) end) RegisterNetEvent('esx:unloadIPL') AddEventHandler('esx:unloadIPL', function(name) Citizen.CreateThread(function() RemoveIpl(name) end) end) RegisterNetEvent('esx:playAnim') AddEventHandler('esx:playAnim', function(dict, anim) Citizen.CreateThread(function() local pid = PlayerPedId() RequestAnimDict(dict) while not HasAnimDictLoaded(dict) do Wait(0) end TaskPlayAnim(pid, dict, anim, 1.0, -1.0, 20000, 0, 1, true, true, true) end) end) RegisterNetEvent('esx:playEmote') AddEventHandler('esx:playEmote', function(emote) Citizen.CreateThread(function() local playerPed = GetPlayerPed(-1) TaskStartScenarioInPlace(playerPed, emote, 0, false); Wait(20000) ClearPedTasks(playerPed) end) end) RegisterNetEvent('esx:spawnVehicle') AddEventHandler('esx:spawnVehicle', function(model) local playerPed = GetPlayerPed(-1) local coords = GetEntityCoords(playerPed) ESX.Game.SpawnVehicle(model, coords, 90.0, function(vehicle) TaskWarpPedIntoVehicle(playerPed, vehicle, -1) end) end) RegisterNetEvent('esx:spawnObject') AddEventHandler('esx:spawnObject', function(model) local playerPed = GetPlayerPed(-1) local coords = GetEntityCoords(playerPed) local forward = GetEntityForwardVector(playerPed) local x, y, z = table.unpack(coords + forward * 1.0) ESX.Game.SpawnObject(model, { x = x, y = y, z = z }, function(obj) SetEntityHeading(obj, GetEntityHeading(playerPed)) PlaceObjectOnGroundProperly(obj) end) end) RegisterNetEvent('esx:pickup') AddEventHandler('esx:pickup', function(id, label, player) local ped = GetPlayerPed(GetPlayerFromServerId(player)) local coords = GetEntityCoords(ped) local forward = GetEntityForwardVector(ped) local x, y, z = table.unpack(coords + forward * -2.0) ESX.Game.SpawnLocalObject('prop_money_bag_01', { x = x, y = y, z = z - 2.0, }, function(obj) SetEntityAsMissionEntity(obj, true, false) PlaceObjectOnGroundProperly(obj) Pickups[id] = { id = id, obj = obj, label = label, inRange = false, coords = { x = x, y = y, z = z }, } end) end) RegisterNetEvent('esx:removePickup') AddEventHandler('esx:removePickup', function(id) ESX.Game.DeleteObject(Pickups[id].obj) Pickups[id] = nil end) RegisterNetEvent('esx:pickupWeapon') AddEventHandler('esx:pickupWeapon', function(weaponPickup, weaponName) local ped = GetPlayerPed(-1) local playerPedPos = GetEntityCoords(ped, true) CreateAmbientPickup(GetHashKey(weaponPickup), playerPedPos.x + 2.0, playerPedPos.y, playerPedPos.z + 0.5, 0, 1000, 1, false, true) end) RegisterNetEvent('esx:spawnPed') AddEventHandler('esx:spawnPed', function(model) model = (tonumber(model) ~= nil and tonumber(model) or GetHashKey(model)) local playerPed = GetPlayerPed(-1) local coords = GetEntityCoords(playerPed) local forward = GetEntityForwardVector(playerPed) local x, y, z = table.unpack(coords + forward * 1.0) Citizen.CreateThread(function() RequestModel(model) while not HasModelLoaded(model) do Citizen.Wait(0) end CreatePed(5, model, x, y, z, 0.0, true, false) end) end) RegisterNetEvent('esx:deleteVehicle') AddEventHandler('esx:deleteVehicle', function() local playerPed = GetPlayerPed(-1) local coords = GetEntityCoords(playerPed) if IsPedInAnyVehicle(playerPed, false) then local vehicle = GetVehiclePedIsIn(playerPed, false) ESX.Game.DeleteVehicle(vehicle) elseif IsAnyVehicleNearPoint(coords.x, coords.y, coords.z, 5.0) then local vehicle = GetClosestVehicle(coords.x, coords.y, coords.z, 5.0, 0, 71) ESX.Game.DeleteVehicle(vehicle) end end) -- Pause menu disable HUD display Citizen.CreateThread(function() while true do Citizen.Wait(1) if IsPauseMenuActive() and not IsPaused then IsPaused = true TriggerEvent('es:setMoneyDisplay', 0.0) ESX.UI.HUD.SetDisplay(0.0) elseif not IsPauseMenuActive() and IsPaused then IsPaused = false TriggerEvent('es:setMoneyDisplay', 1.0) ESX.UI.HUD.SetDisplay(1.0) end end end) -- Save loadout Citizen.CreateThread(function() while ESX == nil and not ESX.PlayerLoaded do Citizen.Wait(0) end while true do Citizen.Wait(0) local playerPed = GetPlayerPed(-1) if IsPedShooting(playerPed) then for i=1, #PlayerShootingTimeouts, 1 do ESX.ClearTimeout(PlayerShootingTimeouts[i]) end PlayerShootingTimeouts = {} local timeout = ESX.SetTimeout(1000, function() local loadout = {} for i=1, #Config.Weapons, 1 do local weaponHash = GetHashKey(Config.Weapons[i].name) if HasPedGotWeapon(playerPed, weaponHash, false) and Config.Weapons[i].name ~= 'WEAPON_UNARMED' then table.insert(loadout, { name = Config.Weapons[i].name, ammo = GetAmmoInPedWeapon(playerPed, weaponHash), label = Config.Weapons[i].label }) end end ESX.PlayerData.loadout = loadout TriggerServerEvent('esx:updateLoadout', loadout) end) table.insert(PlayerShootingTimeouts, timeout) end end end) -- Menu interactions Citizen.CreateThread(function() while true do Wait(0) if IsControlPressed(0, Keys["F2"]) and not ESX.UI.Menu.IsOpen('default', 'es_extended', 'inventory') and (GetGameTimer() - GUI.Time) > 150 then ESX.ShowInventory() GUI.Time = GetGameTimer() end end end) -- Dot above head if Config.ShowDotAbovePlayer then Citizen.CreateThread(function() while true do Citizen.Wait(0) local players = ESX.Game.GetPlayers() for i = 1, #players, 1 do if players[i] ~= PlayerId() then local ped = GetPlayerPed(players[i]) local headId = Citizen.InvokeNative(0xBFEFE3321A3F5015, ped, ('ยท'), false, false, '', false) end end end end) end -- Disable wanted level if Config.DisableWantedLevel then Citizen.CreateThread(function() while true do Citizen.Wait(0) local playerId = PlayerId() if GetPlayerWantedLevel(playerId) ~= 0 then SetPlayerWantedLevel(playerId, 0, false) SetPlayerWantedLevelNow(playerId, false) end end end) end -- Pickups Citizen.CreateThread(function() while true do Citizen.Wait(0) local playerPed = GetPlayerPed(-1) local coords = GetEntityCoords(playerPed) for k,v in pairs(Pickups) do local distance = GetDistanceBetweenCoords(coords.x, coords.y, coords.z, v.coords.x, v.coords.y, v.coords.z, true) if distance <= 5.0 then ESX.Game.Utils.DrawText3D({ x = v.coords.x, y = v.coords.y, z = v.coords.z + 0.25 }, v.label) end if distance <= 1.0 and not v.inRange then TriggerServerEvent('esx:onPickup', v.id) v.inRange = true end end end end) -- Last position Citizen.CreateThread(function() while true do Citizen.Wait(1000) if ESX ~= nil and ESX.PlayerLoaded and PlayerSpawned then local playerPed = GetPlayerPed(-1) local coords = GetEntityCoords(playerPed) if not IsEntityDead(playerPed) then ESX.PlayerData.lastPosition = {x = coords.x, y = coords.y, z = coords.z} end end end end) Citizen.CreateThread(function() while true do Citizen.Wait(0) local playerPed = GetPlayerPed(-1) if IsEntityDead(playerPed) and PlayerSpawned then PlayerSpawned = false end end end)