# Installation

* Once you have set up the dependencies, all you have to do is upload the folder to the server.

This installation guide covers both <mark style="color:red;">ESX</mark> and <mark style="color:blue;">QBCore/QBOX</mark> frameworks.

<table><thead><tr><th width="202">Resource</th><th>Source</th></tr></thead><tbody><tr><td>ox_lib</td><td><a href="https://github.com/overextended/ox_lib/releases">Download</a></td></tr><tr><td>object_gizmo</td><td><a href="https://github.com/DemiAutomatic/object_gizmo/releases">Download</a></td></tr><tr><td>0r_lib</td><td>Download From Your Keymaster</td></tr><tr><td>Maps</td><td>Download From Your Keymaster</td></tr></tbody></table>

### Supported Inventories

* qb-inventory
* ox\_inventory

### ESX

```lua
start es_extended
start 0r_lib
start 0r-apartment-v2
--- esx resources --
```

### QBOX

```lua
--[[ Other Scripts ]]
start 0r_lib
start 0r-apartment-v2
```

### QBOX Starter Apartment ?

* Q: I want new players to choose an apartment and have a random room, what should I do?
* A: First of all, you should be using qbx\_spawn for this. After this you won't need qbox\_apartment. However, it is your responsibility to make sure that other scripts that use it don't malfunction. The functions have been edited to replace qbx\_apartments. So if you use other scripts, you should fix them according to your settings. Here is what you need to do in order:

1- `0r-apartment-v2\modules\bridge\qb\client.lua` If you are already using the latest update, you do not need to !

Line 24\~ `apartments:client:setupSpawnUI`

```lua
RegisterNetEvent("apartments:client:setupSpawnUI", function(cData, firstSpawn, isNew)
    if not cData then return end
    if Utils.Functions.IsResourceStart('qbx_core') then
        local Locations = Config.Apartments

        local upLocations = {}

        for key, value in pairs(Locations) do
            upLocations[#upLocations + 1] = {
                label = value.label,
                coords = value.coords.enter,
                propertyId = key,
            }
        end

        TriggerEvent("qb-spawn:client:setupSpawns", cData, true, upLocations)
    else
        Client.Functions.TriggerServerCallback("0r-apartment:Server:GetPlayerRooms", function(result)
            if #result > 0 then
                TriggerEvent("qb-spawn:client:setupSpawns", cData, false, nil)
                TriggerEvent("qb-spawn:client:openUI", true)
            else
                if isNew and Config.ApartmentStarting then
                    local Locations = Config.Apartments
                    TriggerEvent("qb-spawn:client:setupSpawns", cData, true, Locations)
                    TriggerEvent("qb-spawn:client:openUI", true)
                else
                    TriggerEvent("qb-spawn:client:setupSpawns", cData, false, nil)
                    TriggerEvent("qb-spawn:client:openUI", true)
                end
            end
        end, cData.citizenid or cData.cid)
    end
end)
```

2- qbx\_spawn\client\main.lua Line 188\~ `inputHandler` & `qb-spawn:client:setupSpawns` Update:

```lua
local function inputHandler()
    while DoesCamExist(previewCam) do
        if IsControlJustReleased(0, 188) then
            previousButtonID = currentButtonID
            currentButtonID -= 1

            if currentButtonID < 1 then
                currentButtonID = #spawns
            end

            updateScaleform()
        elseif IsControlJustReleased(0, 187) then
            previousButtonID = currentButtonID
            currentButtonID += 1

            if currentButtonID > #spawns then
                currentButtonID = 1
            end

            updateScaleform()
        elseif IsControlJustReleased(0, 191) then
            DoScreenFadeOut(1000)

            while not IsScreenFadedOut() do
                Wait(0)
            end

            TriggerServerEvent('QBCore:Server:OnPlayerLoaded')
            TriggerEvent('QBCore:Client:OnPlayerLoaded')
            FreezeEntityPosition(cache.ped, false)
            DisplayRadar(true)

            local spawnData = spawns[currentButtonID]
            if spawnData.propertyId then
				if GetResourceState('0r-apartment-v2') == 'started' then
					TriggerServerEvent("apartments:server:CreateApartment", spawnData.propertyId, spawnData.label)
				else
					TriggerServerEvent('qbx_properties:server:enterProperty', { id = spawnData.propertyId, isSpawn = true })
				end
            else
                SetEntityCoords(cache.ped, spawnData.coords.x, spawnData.coords.y, spawnData.coords.z, false, false, false, false)
                SetEntityHeading(cache.ped, spawnData.coords.w or 0.0)
            end

            DoScreenFadeIn(1000)

            break
        end

        Wait(0)
    end

    stopCamera()
end

AddEventHandler('qb-spawn:client:setupSpawns', function(cData, useExtra, extraLocations)
    spawns = {}

	if not useExtra then

		local lastCoords, lastPropertyId = lib.callback.await('qbx_spawn:server:getLastLocation')
		spawns[#spawns + 1] = {
			label = locale('last_location'),
			coords = lastCoords,
			propertyId = lastPropertyId
		}

		for i = 1, #config.spawns do
			spawns[#spawns + 1] = config.spawns[i]
		end

		local properties = lib.callback.await('qbx_spawn:server:getProperties')
		for i = 1, #properties do
			spawns[#spawns + 1] = properties[i]
		end

	else
	
		spawns = extraLocations

	end

    Wait(400)

    managePlayer()
    setupCamera()
    setupMap()

    Wait(400)

    currentButtonID = 1
    scaleformDetails(currentButtonID)
    inputHandler()
end)
```

3- `qbx_core/client/charecter.lua` Line\~345

```lua
-- if GetResourceState('qbx_spawn') == 'missing' then
--     spawnDefault()
-- else
--     if config.characters.startingApartment then
--         TriggerEvent('apartments:client:setupSpawnUI', newData)
--     else
--         TriggerEvent('qbx_core:client:spawnNoApartments')
--     end
-- end

TriggerEvent('apartments:client:setupSpawnUI', newData)
```

Find and Update like that

### QBCore

```
start qb-core
start 0r_lib
start 0r-apartment-v2
--- qbcore resources --
```

### QBCore QB-Apartment ?

* Q: I want new players to choose an apartment and have a random room, what should I do?
* A: First of all, you should be using qb-spawn and qb-multicharacter and qb-apartments for this. After this you won't need qb-apartments. However, it is your responsibility to make sure that other scripts that use it don't malfunction. The functions have been edited to replace qb-apartments. So if you use other scripts, you should fix them according to your settings. Here is what you need to do in order:

1- In qb-multicharacter: server/main.lua replace this code block:

```
RegisterNetEvent('qb-multicharacter:server:createCharacter', function(data)
    local src = source
    local newData = {}
    newData.cid = data.cid
    newData.charinfo = data
    if QBCore.Player.Login(src, false, newData) then
        repeat
            Wait(10)
        until hasDonePreloading[src]
        if GetResourceState('0r-apartment-v2') == 'started' then -- > This place has changed !
            local randbucket = (GetPlayerPed(src) .. math.random(1,999))
            SetPlayerRoutingBucket(src, randbucket)
            print('^2[qb-core]^7 '..GetPlayerName(src)..' has successfully loaded!')
            QBCore.Commands.Refresh(src)
            loadHouseData(src)
            TriggerClientEvent("qb-multicharacter:client:closeNUI", src)
            TriggerClientEvent('apartments:client:setupSpawnUI', src, newData, true, true) -- > This place has changed !
            GiveStarterItems(src)
        else
            print('^2[qb-core]^7 '..GetPlayerName(src)..' has successfully loaded!')
            QBCore.Commands.Refresh(src)
            loadHouseData(src)
            TriggerClientEvent("qb-multicharacter:client:closeNUIdefault", src)
            GiveStarterItems(src)
        end
    end
end)
```

2- In qb-spawn/fxmanifest: replace `shared_scripts` with the following.

```
shared_scripts {
    '@qb-core/shared/locale.lua',
    'locales/en.lua',
    'locales/*.lua',
    'config.lua',
    --'@qb-apartments/config.lua',
    "@0r-apartment-v2/shared/config.lua",
}
```

3- qb-spawn/client.lua

```
local Apartments = Config.Apartments -- You should add this at the top.
```

You must change all `Apartments.Locations` definitions in the file to `Apartments`.

For example: client line 136.

```
TriggerServerEvent("apartments:server:CreateApartment", appaYeet, Apartments.Locations[appaYeet].label) Instead 
> to
TriggerServerEvent("apartments:server:CreateApartment", appaYeet, Apartments[appaYeet].label)
-- As you can see, instead of `Apartments.Locations` I wrote `Apartments`
```

4- qb-spawn/client.lua line 135 / function RegisterNUICallback('chooseAppa', function(data, cb)

```
    local appaYeet = tonumber(data.appType) or data.appType
	if type(appaYeet) == "number" then
		appaYeet = appaYeet + 1
	end
```

Then restart your server. Everything should work properly. Please don't create a support ticket until you are sure everything is working properly.

## What You Need to Know

* Q: Where is the sql file ?
* A: database.sql
* Q: How to add a motel ?
* A: You can take an example from Config.Apartments in the Config file.
