/racingusb

When item is moved into players inventory, it will install the racing app. When it is removed, it will uninstall the app.

racingusb

When item is moved into players inventory, it will install the racing app. When it is removed, it will uninstall the app.

Dependencies:

qb-phone qb-inventory, aj-inventory, lj-inventory. (will work for either)

EDITS

Move racing app in qb-phone/config.lua from Config.PhoneApplications to Config.StoreApps

["racing"] = {
    app = "racing",
    color = "#353b48",
    icon = "fas fa-flag-checkered",
    tooltipText = "Racing",
    job = false,
    blockedjobs = {},
    slot = 14,
    Alerts = 0,
},

In qb-phone/client/main.lua,

RegisterNetEvent('phone:client:InstallApplication', function(app, cb)
    local ApplicationData = Config.StoreApps[app]
    TriggerServerEvent('qb-phone:server:InstallApplication', ApplicationData)
end)

----------

RegisterNetEvent('phone:SaveChanges', function()
	TriggerServerEvent('qb-phone:server:SaveMetaData', PhoneData.MetaData)
end)

----------

RegisterNetEvent("phone:client:hasUsb")
AddEventHandler("phone:client:hasUsb", function()
	local ped = PlayerPedId()
QBCore.Functions.TriggerCallback('qb-phone:hasRacingUsb', function(hasItems)
	if hasItems then
        		TriggerEvent('phone:client:InstallApplication', 'racing')
    	else
        		QBCore.Functions.TriggerCallback('qb-phone:server:GetPhoneData', function(pData)
           			PlayerJob = QBCore.Functions.GetPlayerData().job
            		PhoneData.PlayerData = QBCore.Functions.GetPlayerData()
            		local PhoneMeta = PhoneData.PlayerData.metadata["phone"]
            		PhoneData.MetaData = PhoneMeta
    
            		if pData.InstalledApps ~= nil and next(pData.InstalledApps) ~= nil then
               			for k, v in pairs(pData.InstalledApps) do
                    			TriggerServerEvent('qb-phone:server:RemoveInstallation', v.app)
                    			Config.PhoneApplications['racing'] = nil
                			end
            		end
       		end)
  	end
  end)
end)

----

RegisterNetEvent('qb-phone:RefreshPhone', function()
	LoadPhone()
	SetTimeout(250, function()
    	SendNUIMessage({
        	action = "RefreshAlerts",
        	action = "SetUpApplications",
       	AppData = Config.PhoneApplications,
    	})
	end)
end)

Add this snippet to qb-phone/server/main.lua

QBCore.Functions.CreateCallback('qb-phone:hasRacingUsb', function(source, cb)
  	local src = source
 	local Player = QBCore.Functions.GetPlayer(src)
local hasItems = Player.Functions.GetItemByName("racingusb")

    	if hasItems then
      		cb(true)
 		else
      		cb(false)
  		end
end)

Replace qb-phone:server:InstallApplication with

RegisterNetEvent('qb-phone:server:InstallApplication', function(ApplicationData)
		local src = source
		local Player = QBCore.Functions.GetPlayer(src)
		Player.PlayerData.metadata["phonedata"].InstalledApps[ApplicationData.app] = ApplicationData
		Player.Functions.SetMetaData("phonedata", Player.PlayerData.metadata["phonedata"])

		TriggerClientEvent('phone:SaveChanges', src)
		TriggerClientEvent('qb-phone:RefreshPhone', src)
end)

Replace qb-phone:server:RemoveInstallation with

RegisterNetEvent('qb-phone:server:RemoveInstallation', function(App)
		local src = source
		local Player = QBCore.Functions.GetPlayer(src)
		Player.PlayerData.metadata["phonedata"].InstalledApps[App] = nil
		Player.Functions.SetMetaData("phonedata", Player.PlayerData.metadata["phonedata"])

		TriggerClientEvent('phone:SaveChanges', src)
		TriggerClientEvent('qb-phone:RefreshPhone', src)
end)

I use aj-inventory and have edited it quite a bit.

replace the event for DropItemAnim with this

RegisterNetEvent('inventory:client:DropItemAnim', function()
    local ped = PlayerPedId()
    SendNUIMessage({
        action = "close",
    })
    RequestAnimDict("pickup_object")
    while not HasAnimDictLoaded("pickup_object") do
        Wait(7)
    end
    TaskPlayAnim(ped, "pickup_object" ,"pickup_low" ,8.0, -8.0, -1, 1, 0, false, false, false )
    Wait(2000)
    ClearPedTasks(ped)
    TriggerEvent('phone:client:hasUsb')
end)

replace the current RegisterCommand for inventory with this

RegisterCommand('inventory', function()
  if not isCrafting and not inInventory then
    QBCore.Functions.GetPlayerData(function(PlayerData)
        if not PlayerData.metadata["isdead"] and not PlayerData.metadata["inlaststand"] and not PlayerData.metadata["ishandcuffed"] and not IsPauseMenuActive() then
            local ped = PlayerPedId()
            local curVeh = nil
            local VendingMachine = GetClosestVending()

            if IsPedInAnyVehicle(ped) then -- Is Player In Vehicle
                local vehicle = GetVehiclePedIsIn(ped, false)
                CurrentGlovebox = QBCore.Functions.GetPlate(vehicle)
                curVeh = vehicle
                CurrentVehicle = nil
            else
                local vehicle = QBCore.Functions.GetClosestVehicle()
                if vehicle ~= 0 and vehicle ~= nil then
                    local pos = GetEntityCoords(ped)
                    local trunkpos = GetOffsetFromEntityInWorldCoords(vehicle, 0, -2.5, 0)
                    if (IsBackEngine(GetEntityModel(vehicle))) then
                        trunkpos = GetOffsetFromEntityInWorldCoords(vehicle, 0, 2.5, 0)
                    end
                    if #(pos - trunkpos) < 2.0 and not IsPedInAnyVehicle(ped) then
                        if GetVehicleDoorLockStatus(vehicle) < 2 then
                            CurrentVehicle = QBCore.Functions.GetPlate(vehicle)
                            curVeh = vehicle
                            CurrentGlovebox = nil
                        else
                            QBCore.Functions.Notify("Vehicle Locked", "error")
                            return
                        end
                    else
                        CurrentVehicle = nil
                    end
                else
                    CurrentVehicle = nil
                end
            end

            if CurrentVehicle ~= nil then		-- Trunk
                local vehicleClass = GetVehicleClass(curVeh)
                local maxweight = 0
                local slots = 0
                if vehicleClass == 0 then
                    maxweight = 38000
                    slots = 30
                elseif vehicleClass == 1 then
                    maxweight = 50000
                    slots = 40
                elseif vehicleClass == 2 then
                    maxweight = 75000
                    slots = 50
                elseif vehicleClass == 3 then
                    maxweight = 42000
                    slots = 35
                elseif vehicleClass == 4 then
                    maxweight = 38000
                    slots = 30
                elseif vehicleClass == 5 then
                    maxweight = 30000
                    slots = 25
                elseif vehicleClass == 6 then
                    maxweight = 30000
                    slots = 25
                elseif vehicleClass == 7 then
                    maxweight = 30000
                    slots = 25
                elseif vehicleClass == 8 then
                    maxweight = 15000
                    slots = 15
                elseif vehicleClass == 9 then
                    maxweight = 60000
                    slots = 35
                elseif vehicleClass == 12 then
                    maxweight = 120000
                    slots = 35
	            elseif vehicleClass == 13 then
                    maxweight = 0
                    slots = 0
                elseif vehicleClass == 14 then
                    maxweight = 120000
                    slots = 50
                elseif vehicleClass == 15 then
                    maxweight = 120000
                    slots = 50
                elseif vehicleClass == 16 then
                    maxweight = 120000
                    slots = 50
                else
                    maxweight = 60000
                    slots = 35
                end
                local other = {
                    maxweight = maxweight,
                    slots = slots,
                }
                TriggerServerEvent("inventory:server:OpenInventory", "trunk", CurrentVehicle, other)
                TriggerEvent('phone:client:hasUsb')
                OpenTrunk()
            elseif CurrentGlovebox ~= nil then
                TriggerServerEvent("inventory:server:OpenInventory", "glovebox", CurrentGlovebox)
                TriggerEvent('phone:client:hasUsb')
            elseif CurrentDrop ~= 0 then
                TriggerServerEvent("inventory:server:OpenInventory", "drop", CurrentDrop)
                TriggerEvent('phone:client:hasUsb')
            elseif VendingMachine ~= nil then
                local ShopItems = {}
                ShopItems.label = "Vending Machine"
                ShopItems.items = Config.VendingItem
                ShopItems.slots = #Config.VendingItem
                TriggerServerEvent("inventory:server:OpenInventory", "shop", "Vendingshop_"..math.random(1, 99), ShopItems)
            else
                openAnim()
                TriggerServerEvent("inventory:server:OpenInventory")
                TriggerEvent('phone:client:hasUsb')
            end
        end
    end)
  end
end)

Then replace RegisterNUICallback("CloseInventory") with this

RegisterNUICallback("CloseInventory", function(data, cb)
  if currentOtherInventory == "none-inv" then
      CurrentDrop = 0
      CurrentVehicle = nil
      CurrentGlovebox = nil
      CurrentStash = nil
      SetNuiFocus(false, false)
      inInventory = false
      ClearPedTasks(PlayerPedId())
      return
  end
  if CurrentVehicle ~= nil then
      CloseTrunk()
      TriggerServerEvent("inventory:server:SaveInventory", "trunk", CurrentVehicle)
      TriggerEvent('phone:client:hasUsb')
      CurrentVehicle = nil
  elseif CurrentGlovebox ~= nil then
      TriggerServerEvent("inventory:server:SaveInventory", "glovebox", CurrentGlovebox)
      TriggerEvent('phone:client:hasUsb')
      CurrentGlovebox = nil
  elseif CurrentStash ~= nil then
      TriggerServerEvent("inventory:server:SaveInventory", "stash", CurrentStash)
      TriggerEvent('phone:client:hasUsb')
      CurrentStash = nil
  else
      TriggerServerEvent("inventory:server:SaveInventory", "drop", CurrentDrop)
      TriggerEvent('phone:client:hasUsb')
      CurrentDrop = 0
  end
  SetNuiFocus(false, false)
  inInventory = false
end)

This is the shared/items.lua that i use for the racingusb

	["racingusb"] 					 = {["name"] = "racingusb", 					["label"] = "Racing USB", 			['weight'] = 1000, 		["type"] = "item", 		["image"] = "usb_device.png", 			["unique"] = true, 		["useable"] = false, 	['shouldClose'] = false, ["combinable"] = nil,  ["description"] = "A USB marked for police seizure"},