# 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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.0resmon.org/0resmon/0r-resources/0r-apartments/installation.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
