# uniqers-spawn

<figure><img src="/files/hy3wVyUAkUtMzMR0NW5R" alt=""><figcaption></figcaption></figure>

<figure><img src="https://dunb17ur4ymx4.cloudfront.net/wysiwyg/1302793/8d1a45373067aa1b6bfeae1aae2fce36dac934d2.jpg" alt=""><figcaption></figcaption></figure>

## How To install

FOR QBCORE/QBUS/CUSTOMQBCORES FRAMEWORK

First\
stop or delete qb-spawn script or what you use spawn script.\
after

open qb-apartments/client/main.lua\
To integrate both the first spawn and normal spawn functionality for QBCore, ensuring compatibility with all spawn-related features such as jobs, gangs, houses, and apartments, locate and modify the relevant sections of the code to support unified functionality.

```
RegisterNetEvent('apartments:client:setupSpawnUI', function(cData)
QBCore.Functions.TriggerCallback('apartments:GetOwnedApartment', function(result)
if result then
TriggerEvent('qb-spawn:client:setupSpawns', cData, false, nil)
TriggerEvent('qb-spawn:client:openUI', true)
TriggerEvent("apartments:client:SetHomeBlip", result.type)
else
if Apartments.Starting then
TriggerEvent('qb-spawn:client:setupSpawns', cData, true, Apartments.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)
end)
```

and save\
after\
open resources\[qb]\qb-core\shared gang and job .lua\
for gang\\

```
ballas = {
label = 'Ballas',
grades = {
['0'] = { name = 'Recruit' },
['1'] = { name = 'Enforcer' },
['2'] = { name = 'Shot Caller' },
['3'] = { name = 'Boss', isboss = true },
},
spawnlocations = {
[1] = {x = 469.34469, y = -982.1764, z = 26.273393}
},
},    
```

like this,

and for job

```
police = {
label = 'Law Enforcement',
type = 'leo',
defaultDuty = true,
offDutyPay = false,
grades = {
['0'] = { name = 'Recruit', payment = 50 },
['1'] = { name = 'Officer', payment = 75 },
['2'] = { name = 'Sergeant', payment = 100 },
['3'] = { name = 'Lieutenant', payment = 125 },
['4'] = { name = 'Chief', isboss = true, payment = 150 },
},
spawnlocations = {
[1] = {x = 469.34469, y = -982.1764, z = 26.273393}
},
},
```

and open qb-apartments/config.lua

change this

```
Apartments.Locations = {
["apartment1"] = {
name = "apartment1",
label = "South Rockford Drive",
image = "img/imgap1.png",
price = "FREE",
description = "Information about the hotel can be written here.",
maplocation = "img/imgap1.jpg",
coords = {
enter = vector4(-667.02, -1105.24, 14.63, 242.32),
camcoords = vector4(-691.7783, -1098.214, 27.575319, 263.03857),
},
polyzoneBoxData = {
heading = 245,
minZ = 13.5,
maxZ = 16.0,
debug = false,
length = 1,
width = 3,
distance = 2.0,
created = false
}
},
["apartment2"] = {
name = "apartment2",
label = "Morningwood Blvd",
image = "img/imgap2.png",
price = "FREE",
description = "Information about the hotel can be written here.",
maplocation = "img/imgap2.jpg",
coords = {
enter = vector4(-1288.52, -430.51, 35.15, 124.81),
camcoords = vector4(-1260.244, -423.0414, 45.239257, 101.14539),
},
polyzoneBoxData = {
heading = 124,
minZ = 34.0,
maxZ = 37.0,
debug = false,
length = 1,
width = 3,
distance = 2.0,
created = false
}
},
["apartment3"] = {
name = "apartment3",
label = "Integrity Way",
image = "img/imgap3.png",
price = "FREE",
description = "Information about the hotel can be written here.",
maplocation = "img/imgap3.jpg",
coords = {
enter = vector4(269.73, -640.75, 42.02, 249.07),
camcoords = vector4(245.81562, -622.9107, 58.348945, 228.84838),
},
polyzoneBoxData = {
heading = 250,
minZ = 40,
maxZ = 43.5,
debug = false,
length = 1,
width = 1,
distance = 2.0,
created = false
}
},
["apartment4"] = {
name = "apartment4",
label = "Tinsel Towers",
image = "img/imgap4.png",
price = "FREE",
description = "Information about the hotel can be written here.",
maplocation = "img/imgap4.jpg",
coords = {
enter = vector4(-619.29, 37.69, 43.59, 181.03),
camcoords = vector4(-586.6358, 8.9766902, 63.2192, 358.14163),
},
polyzoneBoxData = {
heading = 180,
minZ = 41.0,
maxZ = 45.5,
debug = false,
length = 1,
width = 2,
distance = 2.0,
created = false
}
},
["apartment5"] = {
name = "apartment5",
label = "Fantastic Plaza",
image = "img/imgap5.png",
price = "FREE",
description = "Information about the hotel can be written here.",
maplocation = "img/imgap5.jpg",
coords = {
enter = vector4(291.517, -1078.674, 29.405, 270.75),
camcoords = vector4(313.55181, -1087.797, 52.274063, 68.456321),
},
polyzoneBoxData = {
heading = 270,
minZ = 28.5,
maxZ = 31.0,
debug = false,
length = 1,
width = 2,
distance = 2.0,
created = false
}
},
}
```

and done\
if u want you can use your custom apartment use FirstLoadAP() and if u want use custom create character codes use FirstLoad() at config.

FOR ESX/OLDESX/CUSTOMESX FRAMEWORK

First\
stop or delete your spawn script.\
after\
ESX basically has no apartment scripts, gang scripts, or house scripts, so you can't use spawns in those features. If you have these scripts, you can use them.\
If you are using one of these 3 scripts, contact us so we can make it compatible with the spawn script so you can use these features.\
If you are using multichar on your server, replace the spawn function codes with these codes. If there is no multichar, replace the codes how your character spawns and the code you use to spawn with these 2 codes below.

for client TriggerEvent for server part TriggerClientEvent

```
TriggerEvent('qb-spawn:client:setupSpawns', Player, false, nil)
TriggerEvent('qb-spawn:client:openUI', true)
```

Your character will now be able to use the spawn system.

Since it does not use the esx apartment system to create a new character, the character is born in a designated place and created there. Therefore, you can continue to use the character script you are using or the character creation system in any script, or you can use the codes of that system in the config.

function FirstLoad() -- for esx first create screen if u have apertment system for esx you can use this or contact us.\
\-- add your codes here.\
end

You can add it to this function. In this way, character creation codes also work in spawn. If you are using a special apartment system, contact us and we will add that system to the spawn script.

FOR QBX FRAMEWORK

First stop or delete qbx\_spawn script or what you use spawn script.\
after\
QBX basically has no house scripts, so you can't use spawns in those features. If you have these scripts, you can use them.\
If you are using one of these scripts, contact us so we can make it compatible with the spawn script so you can use these features.\
If you are using multichar on your server, replace the spawn function codes with these codes. If there is no multichar, replace the codes how your character spawns and the code you use to spawn with these 2 codes below.

for client TriggerEvent for server part TriggerClientEvent

```
    TriggerClientEvent('qb-spawn:client:setupSpawns', src, Player, false, nil)
    TriggerClientEvent('qb-spawn:client:openUI', src, true)
	
```

after\
open resources\[qbx]\qbx\_core\shared gang and job .lua

add this code\
your gang and jobs table. <br>

```
spawnlocations = {
[1] = {x = 469.34469, y = -982.1764, z = 26.273393}
},
```

\
like this,\
for gang

```
['lostmc'] = {
label = 'The Lost MC',
grades = {
[0] = {
name = 'Recruit'
},
[1] = {
name = 'Enforcer'
},
[2] = {
name = 'Shot Caller'
},
[3] = {
name = 'Boss',
isboss = true,
bankAuth = true
},
},
spawnlocations = {
[1] = {x = 469.34469, y = -982.1764, z = 26.273393}
},
},
```

\
like this,\
for job

```
['police'] = {
label = 'LSPD',
type = 'leo',
defaultDuty = true,
offDutyPay = false,
grades = {
[0] = {
name = 'Recruit',
payment = 50
},
[1] = {
name = 'Officer',
payment = 75
},
[2] = {
name = 'Sergeant',
payment = 100
},
[3] = {
name = 'Lieutenant',
payment = 125
},
[4] = {
name = 'Chief',
isboss = true,
bankAuth = true,
payment = 150
},
},
spawnlocations = {
[1] = {x = 469.34469, y = -982.1764, z = 26.273393}
},
},
```

after\
open qbx\_properties/server/property.lua\
and paste this code

```
RegisterNetEvent('uniqers:qbx:login:apart', function(cid)
local src = source
local property = MySQL.single.await('SELECT * FROM properties WHERE owner = ?', {cid})
local id = property.id
local propertyCoords = json.decode(property.coords)
propertyCoords = vec3(propertyCoords.x, propertyCoords.y, propertyCoords.z)


local player = exports.qbx_core:GetPlayerByCitizenId(cid)


citizenid[src] = player.PlayerData.citizenid

local interactions = {}
local isInteriorShell = tonumber(property.interior) ~= nil
local stashes = json.decode(property.stash_options)
for i = 1, #stashes do
    local stashCoords = isInteriorShell and CalculateOffsetCoords(propertyCoords, stashes[i].coords) or stashes[i].coords
    interactions[#interactions+1] = {
        type = 'stash',
        coords = vec3(stashCoords.x, stashCoords.y, stashCoords.z)
    }
    exports.ox_inventory:RegisterStash(string.format('qbx_properties_%s', property.property_name), string.format('Property: %s', property.property_name), stashes[i].slots, stashes[i].maxWeight, property.owner)
end

if isInteriorShell then
    TriggerClientEvent('qbx_properties:client:createInterior', src, tonumber(property.interior), vec3(propertyCoords.x, propertyCoords.y, propertyCoords.z - ShellUndergroundOffset))
end

local interactData = json.decode(property.interact_options)
for i = 1, #interactData do
    local coords = isInteriorShell and CalculateOffsetCoords(propertyCoords, interactData[i].coords) or interactData[i].coords
    interactions[#interactions+1] = {
        type = interactData[i].type,
        coords = vec3(coords.x, coords.y, coords.z)
    }
    if interactData[i].type == 'exit' then
        SetEntityCoords(GetPlayerPed(src), coords.x, coords.y, coords.z, false, false, false, false)
    end
end

local decorations = json.decode(property.decorations)
for i = 1, #decorations do
    decorations[i].coords = CalculateOffsetCoords(propertyCoords, decorations[i].coords) or vec3(decorations[i].coords.x, decorations[i].coords.y, decorations[i].coords.z)
end
TriggerClientEvent('qbx_properties:client:loadDecorations', src, decorations)

enteredProperty[src] = id
insideProperty[id] = insideProperty[id] or {}
insideProperty[id][#insideProperty[id] + 1] = src
for i = 1, #insideProperty[id] do
    TriggerClientEvent('qbx_properties:client:concealPlayers', insideProperty[id][i], insideProperty[id])
end

TriggerClientEvent('qbx_properties:client:updateInteractions', src, interactions, type(property.rent_interval) == 'number')
end)
```

and done

if u want you can use your custom apartment use FirstLoadAP() and if u want use custom create character codes use FirstLoad() at config.

also if u use 0r-apartment

open your 0r-apartment config file

and add your apartments this values

```
name = 1, -- this is id your apartment id
image = "img/imgap4.png",
price = "FREE",
description = "Information about the hotel can be written here.",
maplocation = "img/imgap4.jpg",
coords = {
enter = vector4(-619.29, 37.69, 43.59, 181.03),
camcoords = vector4(-586.6358, 8.9766902, 63.2192, 358.14163),
},
```

for example

```
[1] = {
    name = 1,
    label = "Shelly Apart",
	image = "img/imgap4.png",
	price = "FREE",
	description = "Information about the hotel can be written here.",
	maplocation = "img/imgap4.jpg",
    tint = 55,
    coords = { enter = vec4(278.6257, -1118.3618, 29.4197, 179.6273), camcoords = vector4(-586.6358, 8.9766902, 63.2192, 358.14163) },
    blip = {
        active = true,
        title = "Shelly Apart #1",
        sprite = 476,
        color = 2,
        scale = 0.8,
        coords = vec3(278.202209, -1124.268188, 29.380981)
    },
},
```

### Support & Updates & Questions <a href="#support-and-updates-and-questions" id="support-and-updates-and-questions"></a>

![https://discord.gg/MyrGhbf9tM](https://uniqers-scripts-docs.gitbook.io/~gitbook/image?url=https%3A%2F%2F1436200110-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FZO8XqahJMWr9lDZTL9c1%252Fuploads%252F6U1vJg05XehtFcmGXsMW%252F3670325.png%3Falt%3Dmedia%26token%3D603ba3cd-283e-42c5-a0e2-13d33fefb5bd\&width=768\&dpr=4\&quality=100\&sign=80843ce\&sv=2)

<https://discord.gg/MyrGhbf9tM>


---

# 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://uniqers-scripts-docs.gitbook.io/uniqers-scripts-docs/uniqers-spawn.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.
