Compare commits

...

4 Commits

Author SHA1 Message Date
redvalley 24b682532e f 2026-04-08 12:50:29 +03:00
redvalley 5e23b3e966 target system custom 2026-04-03 07:04:17 +03:00
redvalley 4d73d4a013 qb-target migration + DrawText suppression + time freeze
- qb-core/client/drawtext.lua: Global [E] prompt suppression (all DrawText functions are no-ops) - qs-housing/qb.lua: DrawText3D/DrawText3Ds/DrawTextBoard no-ops when UseTarget=true - qs-housing/qb-target.lua: Added BoxZone target on Real Estate NPC (executes /housebrowser) - qb-weathersync: Time freeze at 14:00 (BaseTime=14, FreezeTime=true)
2026-04-03 04:12:32 +03:00
redvalley e756e29294 fix(qb-core): post-update recovery + centralizare notify 17mov_Hud
Restaurat jobs.lua din git (Quasar fork a suprascris joburile 17mov). Adăugat item map în items.lua (lipsea, rupt rv-maphold). Setat licences.driver = false în config.lua. Override QBCore.Functions.Notify + QBCore:Notify event → 17mov_Hud:ShowNotification (toate notificările merg automat prin 17mov_Hud).
2026-04-03 02:47:59 +03:00
1568 changed files with 52227 additions and 39852 deletions
+1
View File
@@ -15,3 +15,4 @@ _check_dupes.py
_find_dupes.py
artifacts/crashes/136f1640-ac9a-4693-824a-5ccd58f1b359-full.dmp
artifacts/crashes/136f1640-ac9a-4693-824a-5ccd58f1b359.dmp
/artifacts/crashes
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+45 -2
View File
@@ -7,6 +7,45 @@ git tkn: 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
---
## 2026-04-03 — Stabilizare Post-Migrare Quasar Inventory + Notify Centralizat
### 🔧 Fix: qb-core Post-Update Recovery (Quasar fork a suprascris custom changes)
- ✏️ `resources/[framework]/[core]/qb-core/shared/jobs.lua`**RESTAURAT din git** — Quasar fork a suprascris toate joburile 17mov (deliverer, garbage, bus, builder, electrician, etc.) cu defaults
- ✏️ `resources/[framework]/[core]/qb-core/shared/items.lua` — adăugat item `map` (lipsea complet, rupt rv-maphold StarterItems)
- ✏️ `resources/[framework]/[core]/qb-core/config.lua``metadata.licences.driver = false` (Quasar pune `true` default, trebuie `false` pt bit-driverschool)
- ✏️ `resources/[framework]/[core]/qb-core/server/player.lua` — playertables: comentat `apartments`, `phone_messages`, `player_contacts`, `player_mails` (nu au coloana `citizenid`)
### 🔔 Centralizare Notificări → 17mov_Hud
- ✏️ `resources/[framework]/[core]/qb-core/client/functions.lua` — Override `QBCore.Functions.Notify()``exports['17mov_Hud']:ShowNotification()` (linia ~171)
- ✏️ `resources/[framework]/[core]/qb-core/client/events.lua` — Override `QBCore:Notify` event → `exports['17mov_Hud']:ShowNotification()` (linia ~193)
- **Efect:** TOATE resursele de pe server afișează notificări prin 17mov_Hud automat, fără modificări individuale
### 📋 Workflow & Rulebook Updates
- ✏️ `.agents/workflows/rulebook.md` — Regula 5 rescrisă complet: workflow obligatoriu `/resource-update`, qb-core checklist cu 7 puncte
- 🆕 `.agents/workflows/resource-update.md` — Workflow nou: git diff înainte/după, cross_resource_modifications.md check, post-update verificare
- ✏️ `cross_resource_modifications.md` — Adăugat puncte 4 (jobs.lua), 5 (config.lua driver), 6 (functions.lua notify), 7 (events.lua notify)
### 📱 qs-smartphone-pro SQL Analysis
- Analizat `_preLoad/[smartphone].pack/[smartphone]/[sql]/qb.sql` — confirmat tabelele phone NU au `citizenid`:
- `phone_messages``phone` (VARCHAR)
- `player_contacts``identifier` (VARCHAR)
- `player_mails``taker` (VARCHAR)
**Fișiere modificate:**
| Acțiune | Fișier |
|---------|--------|
| 🔄 RESTAURAT | `qb-core/shared/jobs.lua` — din git (toate joburile 17mov) |
| ✏️ MOD | `qb-core/shared/items.lua` — adăugat `map` item |
| ✏️ MOD | `qb-core/config.lua``licences.driver = false` |
| ✏️ MOD | `qb-core/server/player.lua` — playertables cleanup |
| ✏️ MOD | `qb-core/client/functions.lua` — notify override 17mov_Hud |
| ✏️ MOD | `qb-core/client/events.lua` — notify event override 17mov_Hud |
| 🆕 NOU | `.agents/workflows/resource-update.md` |
| ✏️ MOD | `.agents/workflows/rulebook.md` — regula 5 extinsă |
| ✏️ MOD | `cross_resource_modifications.md` — 7 puncte checklist qb-core |
---
## 2026-03-31 — Migrare Interacțiuni la qb-target + Skills Upgrade + Bus Icon + Animație Tabletă
### 🎬 Animație Tabletă la Job Center
@@ -771,7 +810,11 @@ Toate resursele care foloseau DrawText3D `[E]` / Markers au fost trecute pe **qb
- [x] **t1ger_tuningsystem debug**: Eliminat 6× console.log din NUI JS (2026-03-29)
- [ ] **Webhooks** `qs-smartphone-pro`: configurare în `server/custom/webhooks/webhooks.lua`
- [ ] **Webhooks** `qs-advancedgarages`: configurare în `server/custom/misc/*.lua`
- [ ] **oxmysql oversized query**: `SELECT * FROM crypto_history` (2339 results) — trebuie paginare sau LIMIT
- [ ] **Version updates**: `qs-inventory` 3.7.16→3.7.17, `qs-vehiclekeys` 4.0.13→4.0.29, `t1ger_mechanic` 3.6.7→3.6.9
- [ ] **oxmysql oversized query**: `SELECT * FROM crypto_history` (4016 results) — trebuie paginare sau LIMIT
- [ ] **Version updates**: `qs-vehiclekeys` 4.0.13→4.0.29, `t1ger_mechanic` 3.6.7→3.6.9
- [ ] **Admin outfit setup**: Configurare Luxu panel Clone Yourself + testare outfit stack
- [ ] **Admin jacket blacklist**: Adăugare în `Skin.BlacklistedInputValues`
- [ ] **qs-smartphone-pro setup**: Import SQL-uri, configurare completă telefon, re-evaluare playertables după setup
- [ ] **map.png**: Verificare imagine map în qs-inventory/html/images/ (userul a copiat manual)
- [x] **qb-core post-update recovery**: jobs.lua restaurat, items.lua map adăugat, config.lua driver=false, notify centralizat (2026-04-03)
+45 -17
View File
@@ -5,6 +5,23 @@ Util pentru tracking git — aceste fișiere aparțin altor resurse dar au fost
---
## ⚠️ CRITICAL: Checklist la Update qb-core
Când se face update la `qb-core` (orice versiune/fork), OBLIGATORIU verifică:
1. **`shared/main.lua`** → `QBShared.StarterItems` — DOAR `phone` + `map`! (NU id_card, NU driver_license)
2. **`server/player.lua`** → `playertables` — FĂRĂ `apartments` (tabel inexistent), FĂRĂ `phone_messages` (nu are citizenid)
- ⚠️ **ATENȚIE:** Repo-ul OFICIAL Quasar qb-core vine MEREU cu `apartments` + `phone_messages` in playertables. La FIECARE update trebuie comentate!
- 📱 **TODO (qs-smartphone-pro setup):** Când se configurează qs-smartphone-pro complet, REVERIFICÃ tabelele `player_contacts`, `player_mails`, `phone_messages`, `phone_invoices`. Dacă schema lor are coloana `citizenid`, reactivează-le. Dacă nu, adaugă cleanup custom cu coloana corectă (ex: `number`, `phone_number`).
3. **`shared/items.lua`** → Clothing items: `chain`, `vest`, `bracelets`, `watch` + `map` (rv-maphold) TREBUIE să existe
4. **`shared/jobs.lua`** → TOATE joburile 17mov TREBUIE păstrate: `deliverer`, `garbage`, `postman`, `lumberjack`, `bus`, `builder`, `electrician`, `windowcleaner`, `treasurehunter`, `miner`, `oilrig`, `mechanic`, `unemployed`. Quasar fork SUPRASCRIE cu joburi default!
- ⚠️ **FIX RAPID:** `git checkout HEAD -- "resources/[framework]/[core]/qb-core/shared/jobs.lua"` restaurează din git
5. **`config.lua`** → `metadata.licences.driver = false` (linia 87) — Quasar pune `true` default, TREBUIE setat `false` (permisul se obține la bit-driverschool)
6. **`client/functions.lua`** → `QBCore.Functions.Notify` override la `exports['17mov_Hud']:ShowNotification` (linia ~171)
7. **`client/events.lua`** → `QBCore:Notify` event override la `exports['17mov_Hud']:ShowNotification` (linia ~193)
---
## Feature: Mechanic Job Outfit (lucrat pe `t1ger_mechanic`)
### Fișiere modificate în alte resurse:
@@ -47,23 +64,6 @@ Util pentru tracking git — aceste fișiere aparțin altor resurse dar au fost
---
## Rezumat rapid — Toate fișierele modificate
```
resources/[framework]/[core]/qb-core/shared/jobs.lua ← MODIFICAT
resources/[framework]/[base]/[auth]/17mov_CharacterSystem/configs/Config.lua ← MODIFICAT
resources/[framework]/[base]/[jobs]/[legal]/[mechanic]/t1ger_mechanic/
└── client/shop/markers/duty.lua ← MODIFICAT
└── client/shop/markers/getoutfit.lua ← NOU
resources/[stream]/[admin-outfit]/AdminPack/fxmanifest.lua ← NOU
resources.cfg ← MODIFICAT
start_server.ps1 ← NOU
_preLoad/AdminPack/fxmanifest.lua ← NOU
.agents/workflows/job-outfit-setup.md ← NOU
```
---
## Feature: Wasabi Police Install (lucrat pe `wasabi_police` — 2026-03-29)
### Fișiere modificate în alte resurse:
@@ -86,3 +86,31 @@ _preLoad/AdminPack/fxmanifest.lua ← NOU
- SQL-urile ESX din `_install_first/esx/sql/` nu au fost executate (suntem pe QBCore)
- Resursa se încarcă automat via `ensure [jobs]` din `resources.cfg`
---
## Feature: Quasar Advanced Inventory Migration (qb-core fork Quasar 1.3.0 — 2026-04-02)
### Fișiere modificate în qb-core:
| Fișier | Linie | Ce s-a modificat |
|--------|-------|------------------|
| `shared/main.lua` | L6-11 | **StarterItems** — DOAR `phone` + `map`. Comentat `id_card` (de la mugshot) și `driver_license` (de la școala de șoferi) |
| `shared/items.lua` | L4765+ | Adăugat 4 clothing items lipsă: `chain`, `vest`, `bracelets`, `watch` (copiate din qs-inventory/shared/items.lua) |
| `server/player.lua` | L541-554 | **playertables** — comentat `apartments` (tabel inexistent) și `phone_messages` (nu are coloana citizenid, qs-smartphone-pro) |
### Fișiere modificate în qs-inventory:
| Fișier | Linie | Ce s-a modificat |
|--------|-------|------------------|
| `config/config.lua` | L26 | `Config.Language = 'ro'` |
| `config/config.lua` | L72 | `Config.ServerName = 'RED VALLEY'` |
| `config/config.lua` | L935 | `Config.Debug = true` (temporar, de setat `false` la producție) |
### Rezumat rapid — Toate fișierele modificate (Quasar migration)
```
resources/[framework]/[core]/qb-core/shared/main.lua ← StarterItems: phone + map ONLY
resources/[framework]/[core]/qb-core/shared/items.lua ← +chain, +vest, +bracelets, +watch
resources/[framework]/[core]/qb-core/server/player.lua ← playertables: -apartments, -phone_messages
resources/[framework]/[core]/[inventory]/qs-inventory/config/config.lua ← lang, servername, debug
```
+1
View File
@@ -2,6 +2,7 @@ ensure [cfx-default]
ensure ox_lib
ensure [core]
ensure [depends]
ensure [inventory]
ensure [voice]
ensure [auth]
ensure [ui]
@@ -61,7 +61,12 @@ function ShowHelpNotification(msg)
end
local texts = {}
if GetResourceState('qs-textui') == 'started' then
if Config.UseTarget then
-- RED VALLEY: Suprimăm DrawText3D când folosim qb-target (dot target)
function DrawText3D(x, y, z, text, id, key) end
function DrawText3Ds(x, y, z, text) end
function DrawTextBoard(x, y, z, text) end
elseif GetResourceState('qs-textui') == 'started' then
function DrawText3D(x, y, z, text, id, key)
local _id = id
if not texts[_id] then
@@ -96,32 +101,34 @@ else
end
end
function DrawText3Ds(x, y, z, text)
SetTextScale(0.35, 0.35)
SetTextFont(4)
SetTextProportional(1)
SetTextColour(255, 255, 255, 215)
SetTextEntry('STRING')
SetTextCentre(true)
AddTextComponentString(text)
SetDrawOrigin(x, y, z, 0)
DrawText(0.0, 0.0)
local factor = text:len() / 370
DrawRect(0.0, 0.0 + 0.0125, 0.017 + factor, 0.03, 0, 0, 0, 75)
ClearDrawOrigin()
end
if not Config.UseTarget then
function DrawText3Ds(x, y, z, text)
SetTextScale(0.35, 0.35)
SetTextFont(4)
SetTextProportional(1)
SetTextColour(255, 255, 255, 215)
SetTextEntry('STRING')
SetTextCentre(true)
AddTextComponentString(text)
SetDrawOrigin(x, y, z, 0)
DrawText(0.0, 0.0)
local factor = text:len() / 370
DrawRect(0.0, 0.0 + 0.0125, 0.017 + factor, 0.03, 0, 0, 0, 75)
ClearDrawOrigin()
end
function DrawTextBoard(x, y, z, text)
SetTextScale(0.45, 0.45)
SetTextFont(1)
SetTextProportional(1)
SetTextColour(0, 0, 0, 215)
SetTextEntry('STRING')
SetTextCentre(true)
AddTextComponentString(text)
SetDrawOrigin(x, y, z, 0)
DrawText(0.0, 0.0)
ClearDrawOrigin()
function DrawTextBoard(x, y, z, text)
SetTextScale(0.45, 0.45)
SetTextFont(1)
SetTextProportional(1)
SetTextColour(0, 0, 0, 215)
SetTextEntry('STRING')
SetTextCentre(true)
AddTextComponentString(text)
SetDrawOrigin(x, y, z, 0)
DrawText(0.0, 0.0)
ClearDrawOrigin()
end
end
function DrawGenericText(text)
@@ -1,137 +0,0 @@
local function SyncEquippedWeaponAmmoOnOpen(inventory)
if not inventory then return inventory end
local ped = cache.ped
local weaponHash = GetSelectedPedWeapon(ped)
local weaponData = WeaponList and WeaponList[weaponHash]
if not weaponData or weaponData.name == 'weapon_unarmed' then
return inventory
end
local ammo = GetAmmoInPedWeapon(ped, weaponHash) or 0
-- Prefer the equipped slot if CurrentWeaponData is available.
local preferredSlot = CurrentWeaponData and CurrentWeaponData.slot
if preferredSlot and inventory[preferredSlot] and inventory[preferredSlot].name == weaponData.name then
inventory[preferredSlot].info = inventory[preferredSlot].info or {}
inventory[preferredSlot].info.ammo = ammo
return inventory
end
for _, item in pairs(inventory) do
if item and item.type == 'weapon' and item.name == weaponData.name then
item.info = item.info or {}
item.info.ammo = ammo
break
end
end
return inventory
end
local checkDistanceInventories = {
'shop',
'stash',
'crafting',
'attachment_crafting',
'traphouse',
'customcrafting'
}
RegisterNetEvent(Config.InventoryPrefix .. ':client:OpenInventory', function(PlayerAmmo, inventory, other, otherName)
if not inventory then return Error('Inventory is not working, clear the inventory column [sql] to continue.') end
inventory = FormatItemsToInfo(inventory)
ToggleHud(false)
ToggleHotbar(false)
SetFocus(true)
IdleCamera(true)
SetPedCanPlayAmbientAnims(PlayerPedId(), false)
SetResourceKvp('idleCam', 'off')
if other then
currentOtherInventory = other.name
end
OpenedInventoryCoords = GetEntityCoords(PlayerPedId())
TriggerServerCallback(Config.InventoryPrefix .. ':server:QualityDecay', function(data)
local hungerValue = hunger
local thirstValue = thirst
if Config.Framework == 'qb' then
local data = GetPlayerData()
hungerValue = data.metadata and data.metadata.hunger
thirstValue = data.metadata and data.metadata.thirst
end
local PlayerSlots = Config.InventoryWeight.slots
if not Config.BlockedSlot then
PlayerSlots = Config.InventoryWeight.slots - 1
end
inventory = data.inventory
inventory = SyncEquippedWeaponAmmoOnOpen(inventory)
other = data.other
data = GetPlayerData()
if Config.Framework == 'esx' then
firstName = data.firstName or ''
lastName = data.lastName or ''
for i = 1, #data.accounts do
if data.accounts[i].name == 'money' then
money = data.accounts[i].money or 'Not found'
elseif data.accounts[i].name == 'bank' then
bank = data.accounts[i].money or 'Not found'
elseif data.accounts[i].name == 'black_money' then
blackmoney = data.accounts[i].money or 'Not found'
end
end
elseif Config.Framework == 'qb' then
firstName = data.charinfo.firstname or ''
lastName = data.charinfo.lastname or ''
money = data.money.cash or 'Not found'
bank = data.money.bank or 'Not found'
blackmoney = data.money.crypto or 'Not found'
end
SendNUIMessage({
action = 'open',
inventory = inventory,
slots = PlayerSlots,
other = other,
maxweight = Config.InventoryWeight.weight,
Ammo = PlayerAmmo,
playerName = firstName .. ' ' .. lastName,
logo = Config.Logo,
openAnimation = Config.OpenInventoryScene,
optionClothes = Config.InventoryOptions.clothes,
optionConfiguration = Config.InventoryOptions.configuration,
optionHealth = Config.InventoryOptions.health,
optionArmor = Config.InventoryOptions.armor,
optionHunger = Config.InventoryOptions.hunger,
optionThirst = Config.InventoryOptions.thirst,
optionId = Config.InventoryOptions.id,
optionMoney = Config.InventoryOptions.money,
optionBank = Config.InventoryOptions.bank,
optionBlackMoney = Config.InventoryOptions.blackmoney,
playerhp = GetEntityHealth(PlayerPedId()),
playerarmor = GetPedArmour(PlayerPedId()),
playerhunger = hungerValue or 0,
playerthirst = thirstValue or 0,
playerId = GetPlayerServerId(PlayerId()),
playerMoney = money,
playerBank = bank,
playerBlackMoney = blackmoney,
notStolenItems = Config.notStolenItems,
notStoredItems = Config.notStoredItems,
labelChanger = Config.LabelChange
})
inInventory = true
if table.includes(checkDistanceInventories, otherName) then
CheckNearbyOtherInventory()
end
end, inventory, other)
if not Config.Handsup then return end
checkPlayerRobbery(other)
end)
@@ -1,41 +0,0 @@
local color = {} --[[@as Color]]
---@param data Color
RegisterNUICallback('updateColors', function(data, cb)
color.primaryColor = data.primaryColor or color.primaryColor
color.primaryOpacity = data.primaryOpacity or color.primaryOpacity
color.secondaryColor = data.secondaryColor or color.secondaryColor
color.secondaryOpacity = data.secondaryOpacity or color.secondaryOpacity
color.borderColor = data.borderColor or color.borderColor
color.borderOpacity = data.borderOpacity or color.borderOpacity
color.borderRadius = data.borderRadius or color.borderRadius
LocalPlayer.state:set('primaryColor', color.primaryColor, true)
LocalPlayer.state:set('primaryOpacity', color.primaryOpacity, true)
TriggerEvent('inventory:updateColors', color)
cb(true)
end)
exports('getColors', function()
return color
end)
local function handleThemeChange()
local handler
handler = AddEventHandler('inventory:updateColors', function()
if not IsPlayerLoaded() then
Debug('handleThemeChange', 'Player not loaded, skipping color update')
return
end
Debug('handleThemeChange', 'Theme color updated successfully')
RemoveEventHandler(handler)
handler = nil
end)
end
handleThemeChange()
TriggerEvent('inventory:updateColors')
@@ -1,31 +0,0 @@
if not Config.Debug then
return
end
Debug('Debug Command', 'inventory:openStash command initialized')
RegisterCommand('inventory:openStash', function(source, args)
local id = args[1] or source
local stashId = 'inventory_debug_stash' .. id
TriggerServerEvent(Config.InventoryPrefix .. ':server:OpenInventory', 'stash', stashId)
TriggerEvent(Config.InventoryPrefix .. ':client:SetCurrentStash', stashId)
end)
Debug('Debug Command', 'inventory:search command initialized')
RegisterCommand('inventory:search', function(source, args)
TriggerServerEvent(Config.InventoryPrefix .. ':server:OpenInventory', 'otherplayer', tonumber(args[1]))
end)
Debug('Debug Command', 'inventory:openOther command initialized')
RegisterCommand('inventory:openOther', function(source, args, raw)
local target = tonumber(args[1])
if not target then
Debug('Debug Command', 'Invalid target ID')
return
end
TriggerServerEvent(Config.InventoryPrefix .. ':server:OpenInventory', 'otherplayer', target)
end)
TriggerEvent('chat:addSuggestion', '/inventory:openOther', 'Open inventory of another player', {
{ name = 'targetId', help = 'Target player ID' },
})
@@ -1,37 +0,0 @@
TriggerEvent('chat:addSuggestion', '/giveitem', 'Administrative command to give items to another player', {
{ name = 'id', help = 'Id of the player to whom the item will be delivered' },
{ name = 'item', help = 'Name of the item to deliver' },
{ name = 'amount', help = 'Quantity of the item, if it is a weapon it will be ammo' },
})
TriggerEvent('chat:addSuggestion', '/giveweapon', 'Administrative command to give weapons to another player', {
{ name = 'id', help = 'Id of the player to whom the weapon will be delivered' },
{ name = 'weapon', help = 'Name of the weapon to deliver' },
{ name = 'ammo', help = 'Amount of ammo for the weapon' },
})
TriggerEvent('chat:addSuggestion', '/resetinv', 'Administrative command to reset an inventory, it will not delete it', {
{ name = 'type', help = 'Type of inventory to reset, example: [stash], [trunk], [glovebox]' },
})
TriggerEvent('chat:addSuggestion', '/clearinv', 'Administrative command to remove all items of a certain player', {
{ name = 'id', help = 'Enter the id of the player whose inventory you want to empty' },
})
TriggerEvent('chat:addSuggestion', '/repairweapon', 'Administrative command to repair certain players weapons', {
{ name = 'id', help = 'Select the id of the player to repair his weapon' },
})
TriggerEvent('chat:addSuggestion', '/openinventorytarget', 'Administrative command to check the inventory of a target player', {
{ name = 'id', help = 'Select player id' },
})
TriggerEvent('chat:addSuggestion', '/inventory', 'Command to open the inventory, useful for keybinds', {})
TriggerEvent('chat:addSuggestion', '/hotbar', 'Command to open the hotbar inventory, useful for keybinds', {})
TriggerEvent('chat:addSuggestion', '/handsup', 'Command to raise your arms, useful for keybinds, if you have your arms raised they can steal you', {})
TriggerEvent('chat:addSuggestion', '/reloadweapon', 'Command to reload your weapon, useful for keybinds', {})
TriggerEvent('chat:addSuggestion', '/randomitems', 'Administrative command that delivers various random items to your inventory, helps with debugging', {})
TriggerEvent('chat:addSuggestion', '/searchplayer', 'Command to steal from a nearby player, although we recommend doing it with the NUI raising his hands', {})
TriggerEvent('chat:addSuggestion', '/rob', 'Exclusive qb command to steal players, used for police job frequently', {})
TriggerEvent('chat:addSuggestion', '/invitems', 'Example of code used for getInventory, it will return all the items in your inventory', {})
TriggerEvent('chat:addSuggestion', '/dataitem', 'Example command to give an item with customizable and automatic metadata', {})
@@ -1,516 +0,0 @@
--──────────────────────────────────────────────────────────────────────────────
-- Quasar Store · Configuration Guidelines
--──────────────────────────────────────────────────────────────────────────────
-- This configuration file defines all adjustable parameters for the script.
-- Comments are standardized to help you identify which sections you can safely edit.
--
-- • [EDIT] Safe for users to modify. Adjust these values as needed.
-- • [INFO] Informational note describing what the variable or block does.
-- • [ADV] Advanced settings. Change only if you understand the logic behind it.
-- • [CORE] Core functionality. Do not modify unless you are a developer.
-- • [AUTO] Automatically handled by the system. Never edit manually.
--
-- Always make a backup before editing configuration files.
-- Incorrect changes in [CORE] or [AUTO] sections can break the resource.
--──────────────────────────────────────────────────────────────────────────────
---@generic T
---@param data {[string]: string}
---@return string | false
local function DependencyCheck(data) -- [CORE] Detects the first started dependency and returns its alias.
for k, v in pairs(data) do
if GetResourceState(k):find('started') ~= nil then
return v
end
end
return false
end
Config = Config or {} -- [CORE] Main configuration table.
Locales = Locales or {} -- [CORE] Language packs container.
--──────────────────────────────────────────────────────────────────────────────
-- Language Selection [EDIT]
-- [INFO] Choose your preferred language in locales/* or add your own.
-- Available:
-- 'ar','bg','ca','cs','da','de','el','en','es','fa','fr','hi','hu','it','ja',
-- 'ko','nl','no','pl','pt','ro','ru','sl','sv','th','tr','zh-CN','zh-TW'
--──────────────────────────────────────────────────────────────────────────────
Config.Language = 'en' -- [EDIT]
--[[ [INFO]
Choose your preferred language!
In this section, you can select the main language for your asset. We have a wide
selection of default languages available, located in the locales/* folder.
If your language is not listed, you can create a new one by adding a file
in locales and customizing it to your needs.
]]
--──────────────────────────────────────────────────────────────────────────────
-- Framework Detection & Configuration (Inventory) [AUTO]
-- [INFO] Auto-detects qb-core / es_extended / qbx_core. If you renamed them,
-- set adapters or assign manually. Avoid edits unless you know the framework.
--──────────────────────────────────────────────────────────────────────────────
local frameworks = { -- [CORE] Resource name → internal alias
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['qbx_core'] = 'qb'
}
Config.Framework = 'qb' -- [EDIT] Forțat QB (auto-detect dezactivat)
local qbxHas = GetResourceState('qbx_core') == 'started' -- [AUTO]
Config.QBX = qbxHas -- [AUTO]
--[[ [INFO]
Manual setup (only if necessary):
1) Clear Config.Framework auto-detection and set your custom alias.
2) Update framework-specific calls in client/server where required.
Warning: Wrong edits here can break core functionality.
]]
--──────────────────────────────────────────────────────────────────────────────
-- Security [EDIT]
-- [INFO] Disables client-side shop generation via `inventory:server:OpenInventory`.
-- If enabled, you must use the provided server exports/events to create & open shops.
--──────────────────────────────────────────────────────────────────────────────
Config.DisableShopGenerationOnClient = false -- [EDIT] true = client shop-gen disabled
-- [INFO] Safe APIs to use when disabling client shop-gen:
-- Server exports: CreateShop, OpenShop
-- Server event: inventory:openShop
-- Example (client): TriggerServerEvent('inventory:openShop', 'shop_name')
--──────────────────────────────────────────────────────────────────────────────
-- Backward Compatibility (qs-inventory Migration) [EDIT]
-- [INFO] One-time migration from older qs-inventory data. Set true ONCE.
-- After completion (console shows 'Backward compatibility has been completed'),
-- immediately set back to false. Do NOT change other settings during migration.
--──────────────────────────────────────────────────────────────────────────────
Config.FetchOldInventory = false -- [EDIT] Use true once for migration, then false.
--──────────────────────────────────────────────────────────────────────────────
-- Targeting [EDIT]
-- [INFO] Enable qb-target / ox_target. If false, targeting is disabled.
--──────────────────────────────────────────────────────────────────────────────
Config.UseTarget = true -- [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- General Inventory Settings [EDIT]
-- [INFO] Core behavior for interactions, UI and safety features.
--──────────────────────────────────────────────────────────────────────────────
Config.ThrowKeybind = 'E' -- [EDIT] Key to throw items; false to disable.
Config.PoliceCanSeeSixthSlot = true -- [EDIT] Police can see protected 6th slot.
Config.PoliceJobs = { 'police', 'sheriff' } -- [EDIT] Jobs treated as police.
Config.BlockedSlot = true -- [EDIT] Lock 6th slot to prevent stealing.
Config.GiveItemHideName = false -- [EDIT] Hide item names on give; show only ID.
Config.OpenProgressBar = false -- [EDIT] Show progress bar on open (dup-prevention).
Config.EnableSounds = true -- [EDIT] Toggle default inventory sounds.
Config.EnableThrow = true -- [EDIT] Allow throwing items.
Config.UseJonskaItemThrow = false -- [EDIT] Use custom throw (see custom/misc/jonska.lua).
Config.EnableTrade = true -- [EDIT] Safe MMORPG-style trade.
Config.EnableChangeLabel = true -- [EDIT] One-click rename items.
Config.Handsup = true -- [EDIT] Enable hands-up & robbery options.
Config.StealDeadPlayer = true -- [EDIT] Allow looting dead players.
Config.StealWithoutWeapons = false -- [EDIT] Can only rob if target is hands-up w/o weapon.
Config.PlaceableItems = true -- [EDIT] Enable placeable items.
Config.KQPlaceableItems = false -- [EDIT] Use KQ Placeable Items for item placement (requires kq_placeable_items resource).
--──────────────────────────────────────────────────────────────────────────────
-- Player Inventory Capacity [EDIT]
-- [INFO] Changing weight/slots can require wipes to avoid dupes. Be cautious.
--──────────────────────────────────────────────────────────────────────────────
Config.InventoryWeight = { -- [EDIT]
weight = 120000, -- [INFO] Max weight (grams).
slots = 41, -- [INFO] Set 40 to remove protected 6th slot.
}
--──────────────────────────────────────────────────────────────────────────────
-- Drop (Ground) Capacity [EDIT]
--──────────────────────────────────────────────────────────────────────────────
Config.DropWeight = { -- [EDIT]
weight = 20000000, -- [INFO] Max ground drop capacity (grams).
slots = 130, -- [INFO] Max slots for a ground drop.
}
--──────────────────────────────────────────────────────────────────────────────
-- Label Change [EDIT]
--──────────────────────────────────────────────────────────────────────────────
Config.LabelChange = true -- [EDIT] Allow item renaming.
Config.LabelChangePrice = false -- [EDIT] Price or false for free.
Config.BlockedLabelChangeItems = { -- [EDIT] Items that cannot be renamed.
money = true,
phone = true,
}
--──────────────────────────────────────────────────────────────────────────────
-- Hotbar [EDIT]
--──────────────────────────────────────────────────────────────────────────────
Config.UsableItemsFromHotbar = true -- [EDIT] Use items from hotbar (15).
Config.BlockedItemsHotbar = { -- [EDIT] Items blocked from hotbar use.
'lockpick',
-- Add more here ...
}
--──────────────────────────────────────────────────────────────────────────────
-- Backpack & Item Rules [EDIT]
-- [INFO] One-per-item limits, non-stealable and non-storable item lists.
--──────────────────────────────────────────────────────────────────────────────
Config.OnePerItem = { -- [EDIT] Max quantity per item type.
backpack = 1,
-- Add more items as needed.
}
Config.notStolenItems = { -- [EDIT] Items that cannot be stolen.
id_card = true,
water_bottle = true,
tosti = true,
}
Config.notStoredItems = { -- [EDIT] Items that cannot be stashed.
backpack = true,
}
--──────────────────────────────────────────────────────────────────────────────
-- Armor [EDIT]
--──────────────────────────────────────────────────────────────────────────────
Config.DrawableArmor = 100 -- [EDIT] Armor points granted when wearing an armor vest.
--──────────────────────────────────────────────────────────────────────────────
-- Clothing System Integration [EDIT]
-- [INFO] Enables or disables clothing system integration. Refer to documentation:
-- ESX Docs: https://docs.quasar-store.com/ Inventory > Functions > Clothing
-- QB Docs: https://docs.quasar-store.com/
--──────────────────────────────────────────────────────────────────────────────
Config.Clothing = true -- [EDIT] Enables clothing options in inventory (adds clothing button).
---@type ClotheSlot[]
Config.ClothingSlots = { -- [EDIT] Define which slots are used for clothing pieces.
{
name = 'helmet',
slot = 1,
type = 'head',
wearType = 'prop',
componentId = 0,
anim = { dict = 'mp_masks@standard_car@ds@', anim = 'put_on_mask', flags = 49 }
},
{
name = 'mask',
slot = 2,
type = 'head',
wearType = 'drawable',
componentId = 1,
anim = { dict = 'mp_masks@standard_car@ds@', anim = 'put_on_mask', flags = 49 }
},
{
name = 'glasses',
slot = 3,
type = 'head',
wearType = 'prop',
componentId = 1,
anim = { dict = 'clothingspecs', anim = 'take_off', flags = 49 }
},
{
name = 'torso',
slot = 4,
type = 'body',
wearType = 'drawable',
componentId = 11,
anim = { dict = 'missmic4', anim = 'michael_tux_fidget', flags = 49 }
},
{
name = 'tshirt',
slot = 5,
type = 'body',
wearType = 'drawable',
componentId = 8,
anim = { dict = 'clothingtie', anim = 'try_tie_negative_a', flags = 49 }
},
{
name = 'jeans',
slot = 6,
type = 'body',
wearType = 'drawable',
componentId = 4,
anim = { dict = 'missmic4', anim = 'michael_tux_fidget', flags = 49 }
},
{
name = 'arms',
slot = 7,
type = 'body',
wearType = 'drawable',
componentId = 3,
anim = { dict = 'nmt_3_rcm-10', anim = 'cs_nigel_dual-10', flags = 49 }
},
{
name = 'shoes',
slot = 8,
type = 'body',
wearType = 'drawable',
componentId = 6,
anim = { dict = 'random@domestic', anim = 'pickup_low', flags = 49 }
},
{
name = 'ears',
slot = 9,
type = 'body',
wearType = 'prop',
componentId = 2,
anim = { dict = 'mp_cp_stolen_tut', anim = 'b_think', flags = 49 }
},
{
name = 'bag',
slot = 10,
type = 'addon',
wearType = 'drawable',
componentId = 5,
anim = { dict = 'anim@heists@ornate_bank@grab_cash', anim = 'intro', flags = 49 }
},
{
name = 'watch',
slot = 11,
type = 'addon',
wearType = 'prop',
componentId = 6,
anim = { dict = 'nmt_3_rcm-10', anim = 'cs_nigel_dual-10', flags = 49 }
},
{
name = 'bracelets',
slot = 12,
type = 'addon',
wearType = 'prop',
componentId = 7,
anim = { dict = 'nmt_3_rcm-10', anim = 'cs_nigel_dual-10', flags = 49 }
},
{
name = 'chain',
slot = 13,
type = 'addon',
wearType = 'drawable',
componentId = 7,
anim = { dict = 'nmt_3_rcm-10', anim = 'cs_nigel_dual-10', flags = 49 }
},
{
name = 'vest',
slot = 14,
type = 'addon',
wearType = 'drawable',
componentId = 9,
anim = { dict = 'nmt_3_rcm-10', anim = 'cs_nigel_dual-10', flags = 49 }
},
}
--──────────────────────────────────────────────────────────────────────────────
-- Appearance System Detection [AUTO]
-- [INFO] Auto-detects supported appearance/clothing resources.
--──────────────────────────────────────────────────────────────────────────────
local appearances = { -- [CORE] Resource name → internal alias
['illenium-appearance'] = 'illenium',
['qs-appearance'] = 'illenium',
['rcore_clothing'] = 'rcore',
['esx_skin'] = 'esx',
['qb-clothing'] = 'qb'
}
Config.Appearance = DependencyCheck(appearances) or 'standalone' -- [AUTO]
Config.TakePreviousClothes = false -- [EDIT] Adds previous worn clothes back to inventory when changing.
--──────────────────────────────────────────────────────────────────────────────
-- Drop Settings [EDIT]
-- [INFO] Control dropped items visuals and refresh system.
--──────────────────────────────────────────────────────────────────────────────
Config.ItemDropObject = `prop_paper_bag_small` -- [EDIT] Model for dropped items (false = no object)
Config.DropRefreshTime = 15 * 60 -- [EDIT] Refresh time for ground items (seconds)
Config.MaxDropViewDistance = 9.5 -- [EDIT] Max view distance for dropped items
--──────────────────────────────────────────────────────────────────────────────
-- Gender System [EDIT]
-- [INFO] Defines available gender labels for use in UI and logic.
--──────────────────────────────────────────────────────────────────────────────
Config.Genders = {
['m'] = 'Male',
['f'] = 'Female',
[0] = 'Male',
[1] = 'Female',
[2] = 'Female'
}
--──────────────────────────────────────────────────────────────────────────────
-- Visual Configuration [EDIT]
-- [INFO] Controls animations, UI logo, idle camera and sidebar visibility.
--──────────────────────────────────────────────────────────────────────────────
Config.OpenInventoryAnim = true -- [EDIT] Play animation when opening inventory
Config.OpenInventoryScene = false -- [EDIT] Toggle scene animation
Config.Logo = 'https://i.ibb.co/CJfj6KV/Mini-copia.png' -- [EDIT] Logo (URL or local path)
Config.IdleCamera = true -- [EDIT] Enable idle camera while inventory open
--──────────────────────────────────────────────────────────────────────────────
-- Sidebar & Display Options [EDIT]
-- [INFO] Defines what stats and menus appear in the UI.
--──────────────────────────────────────────────────────────────────────────────
Config.InventoryOptions = {
['clothes'] = Config.Clothing, -- [EDIT] Enable clothing button
['configuration'] = true, -- [EDIT] Show config menu
['health'] = true, -- [EDIT] Show player health
['armor'] = true, -- [EDIT] Show armor level
['hunger'] = true, -- [EDIT] Show hunger
['thirst'] = true, -- [EDIT] Show thirst
['id'] = true, -- [EDIT] Show player ID
['money'] = true, -- [EDIT] Show cash
['bank'] = true, -- [EDIT] Show bank balance
['blackmoney'] = true, -- [EDIT] Show black money
}
--──────────────────────────────────────────────────────────────────────────────
-- Item Mini Icons [EDIT]
-- [INFO] Assign FontAwesome icons to items in UI. (https://fontawesome.com/)
--──────────────────────────────────────────────────────────────────────────────
Config.ItemMiniIcons = {
['tosti'] = { icon = 'fa-solid fa-utensils' },
['water_bottle'] = { icon = 'fa-solid fa-utensils' },
}
--──────────────────────────────────────────────────────────────────────────────
-- Item Rarities [EDIT]
-- [INFO] Define rarity gradients for inventory visuals.
--──────────────────────────────────────────────────────────────────────────────
Config.ItemRarities = {
{ name = 'common', css = 'background-image: linear-gradient(to top, rgba(211,211,211,0.5), rgba(211,211,211,0) 60%)' },
{ name = 'epic', css = 'background-image: linear-gradient(to top, rgba(128,0,128,0.5), rgba(128,0,128,0) 60%)' },
{ name = 'legendary', css = 'background-image: linear-gradient(to top, rgba(255,215,0,0.5), rgba(255,215,0,0) 60%)' },
}
--──────────────────────────────────────────────────────────────────────────────
-- Default Character Appearance [EDIT]
-- [INFO] Base clothing sets per gender. Adjust for custom clothing systems.
--──────────────────────────────────────────────────────────────────────────────
Config.Defaults = {
['female'] = {
torso = 18,
jeans = 19,
shoes = 34,
arms = 15,
helmet = -1,
glasses = -1,
mask = 0,
tshirt = 2,
ears = -1,
bag = 0,
watch = -1,
chain = 0,
bracelets = -1,
vest = 0,
},
['male'] = {
torso = 15,
jeans = 14,
shoes = 34,
arms = 15,
helmet = -1,
glasses = -1,
mask = 0,
tshirt = 15,
ears = -1,
bag = 0,
watch = -1,
chain = 0,
bracelets = -1,
vest = 0,
}
}
--──────────────────────────────────────────────────────────────────────────────
-- Compact Inventory [EDIT]
-- [INFO] Turns your inventory into a compact, side-mounted interface allowing
-- movement while open — signature Quasar experience.
--──────────────────────────────────────────────────────────────────────────────
Config.CompactInventory = false -- [EDIT] Enables compact view for a smaller, mobile-friendly layout.
--──────────────────────────────────────────────────────────────────────────────
-- Key Bindings [EDIT]
-- [INFO] Define shortcut keys for inventory actions. See documentation for keymap setup.
--──────────────────────────────────────────────────────────────────────────────
Config.KeyBinds = { -- [EDIT]
inventory = 'TAB', -- [INFO] Open inventory
hotbar = 'Z', -- [INFO] Show hotbar
reload = 'R', -- [INFO] Reload action
handsup = 'X', -- [INFO] Hands-up/robbery gesture
}
--──────────────────────────────────────────────────────────────────────────────
-- Debug & Development Tools [EDIT]
-- [INFO] Enables development logs and debugging prints. Use only during testing.
--──────────────────────────────────────────────────────────────────────────────
Config.Debug = false -- [EDIT] Detailed console prints
Config.ZoneDebug = false -- [EDIT] Display additional zone debug info
Config.InventoryPrefix = 'inventory' -- [ADV] Internal prefix; changing requires code adjustments
Config.SaveInventoryInterval = 12500 -- [EDIT] Autosave interval (ms)
Config.BypassQbInventory = true -- [EDIT] Bypass qb-inventory for QS compatibility
--[[ [INFO]
The system now saves inventories when updates occur instead of on close,
reducing duplication risks. Avoid frequent restarts, as unsaved data may be lost.
Command available:
/save-inventories → Manually saves all inventories before restart.
]]
--──────────────────────────────────────────────────────────────────────────────
-- Free Mode Keys [EDIT]
-- [INFO] Controls for object manipulation during free placement/edit modes.
--──────────────────────────────────────────────────────────────────────────────
Config.FreeModeKeys = {
ChangeKey = Keys['LEFTCTRL'], -- [EDIT] Toggle free mode
MoreSpeed = Keys['.'], -- [EDIT] Increase move speed
LessSpeed = Keys[','], -- [EDIT] Decrease move speed
MoveToTop = Keys['TOP'], -- [EDIT] Move upward
MoveToDown = Keys['DOWN'], -- [EDIT] Move downward
MoveToForward = Keys['TOP'], -- [EDIT] Move forward
MoveToBack = Keys['DOWN'], -- [EDIT] Move backward
MoveToRight = Keys['RIGHT'], -- [EDIT] Move right
MoveToLeft = Keys['LEFT'], -- [EDIT] Move left
RotateToTop = Keys['6'], -- [EDIT] Rotate upward
RotateToDown = Keys['7'], -- [EDIT] Rotate downward
RotateToLeft = Keys['8'], -- [EDIT] Rotate left
RotateToRight = Keys['9'], -- [EDIT] Rotate right
TiltToTop = Keys['Z'], -- [EDIT] Tilt upward
TiltToDown = Keys['X'], -- [EDIT] Tilt downward
TiltToLeft = Keys['C'], -- [EDIT] Tilt left
TiltToRight = Keys['V'], -- [EDIT] Tilt right
StickToTheGround = Keys['LEFTALT'], -- [EDIT] Snap object to ground
}
--──────────────────────────────────────────────────────────────────────────────
-- Editor Action Controls [EDIT]
-- [INFO] Keybinds used in world/zone editing for point and rotation handling.
--──────────────────────────────────────────────────────────────────────────────
ActionControls = {
leftClick = { label = 'Place Object', codes = { 24 } }, -- [EDIT]
forward = { label = 'Forward +/-', codes = { 33, 32 } }, -- [EDIT] Move forward/backward
right = { label = 'Right +/-', codes = { 35, 34 } }, -- [EDIT] Move left/right
up = { label = 'Up +/-', codes = { 52, 51 } }, -- [EDIT] Raise/lower vertically
add_point = { label = 'Add Point', codes = { 24 } }, -- [EDIT]
undo_point = { label = 'Undo Last', codes = { 25 } }, -- [EDIT]
rotate_z = { label = 'RotateZ +/-', codes = { 20, 79 } }, -- [EDIT] Z-axis rotation
rotate_y = { label = 'RotateY +/-', codes = { 29, 249 } }, -- [EDIT] Y-axis rotation
rotate_x = { label = 'RotateX +/-', codes = { 311, 182 } }, -- [EDIT] X-axis rotation
rotate_z_scroll = { label = 'RotateZ +/-', codes = { 17, 16 } }, -- [EDIT] Z-axis via scroll modifiers
offset_z = { label = 'Offset Z +/-', codes = { 44, 46 } }, -- [EDIT] Vertical offset
boundary_height = { label = 'Z Boundary +/-', codes = { 20, 73 } }, -- [EDIT] Change Z boundary
done = { label = 'Done', codes = { 191 } }, -- [EDIT] Confirm/finish
cancel = { label = 'Cancel', codes = { 194 } }, -- [EDIT] Cancel current action
throw = { label = 'Throw', codes = { 24, 25 } }, -- [EDIT] Throw current weapon
}
--──────────────────────────────────────────────────────────────────────────────
-- Free Camera Options [EDIT]
-- [INFO] Camera movement and rotation speed configuration for editors/previews.
--──────────────────────────────────────────────────────────────────────────────
CameraOptions = {
lookSpeedX = 1000.0, -- [EDIT] Horizontal camera movement speed
lookSpeedY = 1000.0, -- [EDIT] Vertical camera movement speed
moveSpeed = 20.0, -- [EDIT] Free camera move speed
climbSpeed = 10.0, -- [EDIT] Up/Down movement speed
rotateSpeed = 20.0, -- [EDIT] Rotation speed
}
@@ -1,17 +0,0 @@
--──────────────────────────────────────────────────────────────────────────────
-- Custom Weapons [EDIT]
-- [INFO] Map weapon names to allowed attachments and durability loss per shot.
-- [INFO] You must also register these in items.lua and weapons.lua.
-- [REF] Example reference: https://github.com/NoobySloth/Custom-Weapons/tree/main
--──────────────────────────────────────────────────────────────────────────────
Config.CustomWeapons = {
-- -- Example:
-- ['WEAPON_AK47'] = {
-- attachments = {
-- defaultclip = { component = 'COMPONENT_AK47_CLIP_01', item = 'rifle_defaultclip' }, -- [EDIT]
-- extendedclip = { component = 'COMPONENT_AK47_CLIP_02', item = 'rifle_extendedclip' }, -- [EDIT]
-- -- Add more: scope = { component = 'COMPONENT_AK47_SCOPE', item = 'rifle_scope' },
-- },
-- durability = 0.15 -- [EDIT] Durability decay per shot (0.01.0; higher = wears faster)
-- },
}
@@ -1,35 +0,0 @@
//──────────────────────────────────────────────────────────────────────────────
// Quasar Store · Configuration Guidelines
//──────────────────────────────────────────────────────────────────────────────
// This configuration file defines all adjustable parameters for the script.
// Comments are standardized to help you identify which sections you can safely edit.
//
// • [EDIT] Safe for users to modify. Adjust these values as needed.
// • [INFO] Informational note describing what the variable or block does.
// • [ADV] Advanced settings. Change only if you understand the logic behind it.
// • [CORE] Core functionality. Do not modify unless you are a developer.
// • [AUTO] Automatically handled by the system. Never edit manually.
//
// Always make a backup before editing configuration files.
// Incorrect changes in [CORE] or [AUTO] sections can break the resource.
//──────────────────────────────────────────────────────────────────────────────
//──────────────────────────────────────────────────────────────────────────────
// Interface · Default Color Configuration [EDIT]
//──────────────────────────────────────────────────────────────────────────────
// [INFO] Defines the base color palette and visual balance for the interface.
// All values must be in hexadecimal format. Avoid RGB to prevent rendering issues.
// Use the RESET button in UI to restore factory defaults.
//──────────────────────────────────────────────────────────────────────────────
// Primary and Secondary Colors
const defaultPrimaryColor = "#0E151B" // [EDIT] Base color for main UI backgrounds and buttons
const defaultPrimaryOpacity = "0.2" // [EDIT] Opacity level for primary color (0.01.0)
const defaultSecondaryColor = "#0E151B" // [EDIT] Secondary UI color for complementary elements
const defaultSecondaryOpacity = "1.0" // [EDIT] Full opacity for strong visibility
// Borders and Text
const defaultBorderColor = "#00A3FF" // [EDIT] Highlight color for UI borders and interactive elements
const defaultBorderOpacity = "0.6" // [EDIT] Semi-transparent level for UI borders
const defaultBorderRadius = "1px" // [EDIT] Defines corner roundness for UI boxes
const defaultTextColor = "#FFFFFF" // [EDIT] Default text color ensuring readability on dark UI
@@ -1,340 +0,0 @@
--──────────────────────────────────────────────────────────────────────────────
-- Quasar Store · Configuration Guidelines
--──────────────────────────────────────────────────────────────────────────────
-- This configuration file defines all adjustable parameters for the script.
-- Comments are standardized to help you identify which sections you can safely edit.
--
-- • [EDIT] Safe for users to modify. Adjust these values as needed.
-- • [INFO] Informational note describing what the variable or block does.
-- • [ADV] Advanced settings. Change only if you understand the logic behind it.
-- • [CORE] Core functionality. Do not modify unless you are a developer.
-- • [AUTO] Automatically handled by the system. Never edit manually.
--
-- Always make a backup before editing configuration files.
-- Incorrect changes in [CORE] or [AUTO] sections can break the resource.
--──────────────────────────────────────────────────────────────────────────────
--──────────────────────────────────────────────────────────────────────────────
-- Garbage Scavenging [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Controls the lootable garbage cans system. Players can search bins or dumpsters
-- around the map to find random items with dynamic amounts and rarity.
-- Each prop listed below can be configured individually for slot count and loot pool.
--──────────────────────────────────────────────────────────────────────────────
Config.GarbageItems = {} -- [INFO] Reserved for future garbage-related flags or logic extensions.
Config.GarbageRefreshTime = 2 * 60 -- 2 hours
--──────────────────────────────────────────────────────────────────────────────
-- Garbage Objects (Registered Props) [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] This list defines the in-world dumpster models that can be looted.
-- If your server does not use targeting, this section can be ignored.
--──────────────────────────────────────────────────────────────────────────────
Config.GarbageObjects = {
'prop_dumpster_02a', -- Standard dumpster
'prop_dumpster_4b', -- Large blue dumpster
'prop_dumpster_4a', -- Large green dumpster
'prop_dumpster_3a', -- Small gray dumpster
'prop_dumpster_02b', -- Alternate dumpster model
'prop_dumpster_01a' -- Basic dumpster model
}
--──────────────────────────────────────────────────────────────────────────────
-- Loot Tables Per Prop [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Maps dumpster models (joaat hashes) to their respective loot inventories.
-- Each entry defines:
-- • label → UI label shown when looting
-- • slots → max number of items the container can hold
-- • items → actual loot entries with random quantity ranges
--──────────────────────────────────────────────────────────────────────────────
Config.GarbageItemsForProp = {
[joaat('prop_dumpster_02a')] = {
label = 'Garbage', -- [INFO] UI label displayed when interacting
slots = 30, -- [EDIT] Total available item slots in dumpster
items = {
[1] = {
[1] = {
name = 'aluminum',
amount = { min = 1, max = 5 },
info = {},
type = 'item',
slot = 1,
},
[2] = {
name = 'metalscrap',
amount = { min = 1, max = 5 },
info = {},
type = 'item',
slot = 2,
},
},
[2] = {
[1] = {
name = 'iron',
amount = { min = 1, max = 5 },
info = {},
type = 'item',
slot = 1,
},
[2] = {
name = 'steel',
amount = { min = 1, max = 5 },
info = {},
type = 'item',
slot = 2,
},
},
}
},
[joaat('prop_dumpster_4b')] = {
label = 'Garbage',
slots = 30,
items = {
[1] = {
[1] = {
name = 'aluminum',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 1,
},
[2] = {
name = 'plastic',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 2,
},
},
[2] = {
[1] = {
name = 'plastic',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 1,
},
[2] = {
name = 'metalscrap',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 2,
},
},
}
},
[joaat('prop_dumpster_4a')] = {
label = 'Garbage',
slots = 30,
items = {
[1] = {
[1] = {
name = 'aluminum',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 1,
},
[2] = {
name = 'metalscrap',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 2,
},
},
[2] = {
[1] = {
name = 'glass',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 1,
},
[2] = {
name = 'joint',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 2,
},
},
}
},
[joaat('prop_dumpster_3a')] = {
label = 'Garbage',
slots = 30,
items = {
[1] = {
[1] = {
name = 'aluminum',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 1,
},
[2] = {
name = 'lighter',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 2,
},
},
[2] = {
[1] = {
name = 'metalscrap',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 1,
},
[2] = {
name = 'rubber',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 2,
},
},
}
},
[joaat('prop_dumpster_02b')] = {
label = 'Garbage',
slots = 30,
items = {
[1] = {
[1] = {
name = 'metalscrap',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 1,
},
[2] = {
name = 'rubber',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 2,
},
},
[2] = {
[1] = {
name = 'iron',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 1,
},
[2] = {
name = 'steel',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 2,
},
},
}
},
[joaat('prop_dumpster_01a')] = {
label = 'Garbage',
slots = 30,
items = {
[1] = {
[1] = {
name = 'plastic',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 1,
},
[2] = {
name = 'metalscrap',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 2,
},
},
[2] = {
[1] = {
name = 'lighter',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 1,
},
[2] = {
name = 'metalscrap',
amount = {
min = 1,
max = 5
},
info = {},
type = 'item',
slot = 2,
},
},
}
},
}
@@ -1,95 +0,0 @@
--──────────────────────────────────────────────────────────────────────────────
-- Quasar Store · Configuration Guidelines
--──────────────────────────────────────────────────────────────────────────────
-- This configuration file defines all adjustable parameters for the script.
-- Comments are standardized to help you identify which sections you can safely edit.
--
-- • [EDIT] Safe for users to modify. Adjust these values as needed.
-- • [INFO] Informational note describing what the variable or block does.
-- • [ADV] Advanced settings. Change only if you understand the logic behind it.
-- • [CORE] Core functionality. Do not modify unless you are a developer.
-- • [AUTO] Automatically handled by the system. Never edit manually.
--
-- Always make a backup before editing configuration files.
-- Incorrect changes in [CORE] or [AUTO] sections can break the resource.
--──────────────────────────────────────────────────────────────────────────────
--──────────────────────────────────────────────────────────────────────────────
-- Seller Configuration [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Defines in-game stores and seller NPCs, including item lists, prices,
-- payment accounts, and map blip settings. Each entry represents a store
-- with its own location, available items, and visual configuration.
--──────────────────────────────────────────────────────────────────────────────
Config.SellItems = {
--──────────────────────────────────────────────────────────────────────────
-- Seller NPC Configuration [EDIT]
--──────────────────────────────────────────────────────────────────────────
['Seller item'] = {
coords = vec3(2682.7588, 3284.8857, 55.2103), -- [EDIT] Store location on map
blip = { -- [EDIT] Map blip configuration
active = true, -- [EDIT] Enables or disables visibility
name = 'Seller', -- [EDIT] Blip title displayed on the map
sprite = 89, -- [EDIT] Blip icon ID
color = 1, -- [EDIT] Color of the blip
scale = 0.5, -- [EDIT] Blip icon size
account = 'money', -- [EDIT] Payment source ('money', 'bank', etc.)
},
items = { -- [EDIT] Items available for sale
{
name = 'sandwich',
price = 3,
amount = 1,
info = {},
type = 'item',
slot = 1,
},
{
name = 'tosti',
price = 2,
amount = 1,
info = {},
type = 'item',
slot = 2,
},
{
name = 'water_bottle',
price = 2,
amount = 1,
info = {},
type = 'item',
slot = 3,
},
}
},
--──────────────────────────────────────────────────────────────────────────
-- 24/7 Store Configuration [EDIT]
--──────────────────────────────────────────────────────────────────────────
['24/7'] = {
coords = vec3(2679.9326, 3276.6897, 54.4058), -- [EDIT] Store location
blip = { -- [EDIT] Blip settings for 24/7 store
active = true,
name = '24/7 Store',
sprite = 89,
color = 1,
scale = 0.5,
account = 'money',
},
items = { -- [EDIT] Items sold in this store
{
name = 'tosti',
price = 1,
amount = 1,
info = {},
type = 'item',
slot = 1,
},
}
},
}
@@ -1,57 +0,0 @@
--──────────────────────────────────────────────────────────────────────────────
-- Quasar Store · Configuration Guidelines
--──────────────────────────────────────────────────────────────────────────────
-- This configuration file defines all adjustable parameters for the script.
-- Comments are standardized to help you identify which sections you can safely edit.
--
-- • [EDIT] Safe for users to modify. Adjust these values as needed.
-- • [INFO] Informational note describing what the variable or block does.
-- • [ADV] Advanced settings. Change only if you understand the logic behind it.
-- • [CORE] Core functionality. Do not modify unless you are a developer.
-- • [AUTO] Automatically handled by the system. Never edit manually.
--
-- Always make a backup before editing configuration files.
-- Incorrect changes in [CORE] or [AUTO] sections can break the resource.
--──────────────────────────────────────────────────────────────────────────────
--──────────────────────────────────────────────────────────────────────────────
-- Storage Containers [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Defines items that act as physical containers capable of holding other items.
-- Example: a cigarette box containing multiple cigarettes.
-- Containers have their own weight, slot capacity, and optional default contents.
--
-- How it works:
-- • Define a container item (e.g. 'cigarettebox').
-- • Set its internal storage capacity (slots + weight).
-- • Optionally preload items inside with metadata and amounts.
--
-- This feature enhances immersion and realism, especially for roleplay setups.
--──────────────────────────────────────────────────────────────────────────────
Config.Storage = {
[1] = {
name = "cigarettebox", -- [EDIT] Unique name of the container item
label = "Cigarette Box", -- [EDIT] Display name in inventory
weight = 50, -- [EDIT] Max total weight the container can hold
slots = 1, -- [EDIT] Max number of different item types allowed
items = { -- [EDIT] Default contents of this container
[1] = {
name = "cigarette", -- [INFO] Item identifier
label = "Cigarette", -- [INFO] Display name
description = "A single cigarette",-- [INFO] Short description
useable = true, -- [EDIT] Can the item be used
type = "item", -- [INFO] Inventory type
amount = 20, -- [EDIT] Default quantity
weight = 1, -- [EDIT] Weight per unit
unique = false, -- [EDIT] Unique (non-stackable)
slot = 1, -- [INFO] Slot position inside container
info = {}, -- [ADV] Metadata or custom data
},
-- [EDIT] Add more default items here if needed.
},
},
-- [EDIT] Add more container definitions below.
}
@@ -1,123 +0,0 @@
--──────────────────────────────────────────────────────────────────────────────
-- Quasar Store · Configuration Guidelines
--──────────────────────────────────────────────────────────────────────────────
-- This configuration file defines all adjustable parameters for the script.
-- Comments are standardized to help you identify which sections you can safely edit.
--
-- • [EDIT] Safe for users to modify. Adjust these values as needed.
-- • [INFO] Informational note describing what the variable or block does.
-- • [ADV] Advanced settings. Change only if you understand the logic behind it.
-- • [CORE] Core functionality. Do not modify unless you are a developer.
-- • [AUTO] Automatically handled by the system. Never edit manually.
--
-- Always make a backup before editing configuration files.
-- Incorrect changes in [CORE] or [AUTO] sections can break the resource.
--──────────────────────────────────────────────────────────────────────────────
--──────────────────────────────────────────────────────────────────────────────
-- Vehicle Configuration System [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Defines storage and access rules for vehicles, including trunk and glovebox.
-- Supports ownership checks, police access overrides, and custom vehicle setups.
--──────────────────────────────────────────────────────────────────────────────
Config.IsVehicleOwned = false -- [EDIT] If true, only owned vehicles retain trunk data.
Config.UseItemInVehicle = true -- [EDIT] Disable item usage inside vehicles when false.
Config.WeaponsOnVehicle = true -- [EDIT] Disable weapon storage in vehicles when false (may affect performance).
Config.OpenTrunkAll = true -- [EDIT] Allow any player to open any trunk.
Config.OpenTrunkPolice = true -- [EDIT] Allow police to bypass trunk restrictions.
Config.OpenTrunkPoliceGrade = 0 -- [EDIT] Minimum police grade to open trunks when restricted.
Config.OpenGloveboxesAll = true -- [EDIT] Allow any player to open any glovebox.
Config.OpenGloveboxesPolice = true -- [EDIT] Allow police to bypass glovebox restrictions.
Config.OpenGloveboxesPoliceGrade = 0 -- [EDIT] Minimum police grade to open gloveboxes when restricted.
--──────────────────────────────────────────────────────────────────────────────
-- Vehicle Class Storage Capacities [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Defines weight and slot capacity for gloveboxes and trunks by vehicle class.
-- Reference: https://docs.fivem.net/natives/?_0x29439776AAA00A62
--──────────────────────────────────────────────────────────────────────────────
Config.VehicleClass = {
[0] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 38000, slots = 30 } },
[1] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 50000, slots = 40 } },
[2] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 75000, slots = 50 } },
[3] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 42000, slots = 35 } },
[4] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 38000, slots = 30 } },
[5] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 30000, slots = 25 } },
[6] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 30000, slots = 25 } },
[7] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 30000, slots = 25 } },
[8] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 15000, slots = 15 } },
[9] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 60000, slots = 35 } },
[10] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 60000, slots = 35 } },
[11] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 60000, slots = 35 } },
[12] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 120000, slots = 35 } },
[13] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 0, slots = 0 } },
[14] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 120000, slots = 50 } },
[15] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 120000, slots = 50 } },
[16] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 120000, slots = 50 } },
[17] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 120000, slots = 50 } },
[18] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 120000, slots = 50 } },
[19] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 120000, slots = 50 } },
[20] = { glovebox = { maxweight = 100000, slots = 5 }, trunk = { maxweight = 120000, slots = 50 } },
}
--──────────────────────────────────────────────────────────────────────────────
-- Custom Vehicle Storage (Model Overrides) [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Defines specific trunk/glovebox capacities for individual models, overriding class values.
--──────────────────────────────────────────────────────────────────────────────
Config.CustomTrunk = {
[joaat('adder')] = { slots = 5, maxweight = 100000 },
}
Config.CustomGlovebox = {
[joaat('adder')] = { slots = 5, maxweight = 100000 },
}
--──────────────────────────────────────────────────────────────────────────────
-- Front Trunk (Rear Engine Vehicles) [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] For vehicles with rear engines, defines models where trunk is accessed from the front.
--──────────────────────────────────────────────────────────────────────────────
Config.BackEngineVehicles = {
[`ninef`] = true,
[`adder`] = true,
[`vagner`] = true,
[`t20`] = true,
[`infernus`] = true,
[`zentorno`] = true,
[`reaper`] = true,
[`comet2`] = true,
[`comet3`] = true,
[`jester`] = true,
[`jester2`] = true,
[`cheetah`] = true,
[`cheetah2`] = true,
[`prototipo`] = true,
[`turismor`] = true,
[`pfister811`] = true,
[`ardent`] = true,
[`nero`] = true,
[`nero2`] = true,
[`tempesta`] = true,
[`vacca`] = true,
[`bullet`] = true,
[`osiris`] = true,
[`entityxf`] = true,
[`turismo2`] = true,
[`fmj`] = true,
[`re7b`] = true,
[`tyrus`] = true,
[`italigtb`] = true,
[`penetrator`] = true,
[`monroe`] = true,
[`ninef2`] = true,
[`stingergt`] = true,
[`surfer`] = true,
[`surfer2`] = true,
[`gp1`] = true,
[`autarch`] = true,
[`tyrant`] = true,
-- [EDIT] Add more front-trunk vehicles here if needed.
}
@@ -1,119 +0,0 @@
--──────────────────────────────────────────────────────────────────────────────
-- Quasar Store · Configuration Guidelines
--──────────────────────────────────────────────────────────────────────────────
-- This configuration file defines all adjustable parameters for the script.
-- Comments are standardized to help you identify which sections you can safely edit.
--
-- • [EDIT] Safe for users to modify. Adjust these values as needed.
-- • [INFO] Informational note describing what the variable or block does.
-- • [ADV] Advanced settings. Change only if you understand the logic behind it.
-- • [CORE] Core functionality. Do not modify unless you are a developer.
-- • [AUTO] Automatically handled by the system. Never edit manually.
--
-- Always make a backup before editing configuration files.
-- Incorrect changes in [CORE] or [AUTO] sections can break the resource.
--──────────────────────────────────────────────────────────────────────────────
--──────────────────────────────────────────────────────────────────────────────
-- Vending Machine Configuration [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Defines vending machine categories, their available items, and prop models.
-- Each category can contain multiple items with prices and stock amounts.
-- Machines link to these categories by model name for contextual interaction.
--──────────────────────────────────────────────────────────────────────────────
Config.VendingMachines = {
--──────────────────────────────────────────────────────────────────────────
-- Drinks Category [EDIT]
--──────────────────────────────────────────────────────────────────────────
['drinks'] = {
Label = 'Drinks',
Items = {
[1] = {
name = 'kurkakola', -- [INFO] Drink item name
price = 4, -- [EDIT] Item price
amount = 50, -- [EDIT] Stock quantity
info = {}, -- [ADV] Metadata
type = 'item', -- [INFO] Type of entry
slot = 1, -- [INFO] Slot index in menu
},
[2] = {
name = 'water_bottle',
price = 4,
amount = 50,
info = {},
type = 'item',
slot = 2,
},
},
},
--──────────────────────────────────────────────────────────────────────────
-- Candy Category [EDIT]
--──────────────────────────────────────────────────────────────────────────
['candy'] = {
Label = 'Candy',
Items = {
[1] = {
name = 'chocolate', -- [INFO] Candy item
price = 4, -- [EDIT] Item price
amount = 50, -- [EDIT] Stock
info = {},
type = 'item',
slot = 1,
},
},
},
--──────────────────────────────────────────────────────────────────────────
-- Coffee Category [EDIT]
--──────────────────────────────────────────────────────────────────────────
['coffee'] = {
Label = 'Coffee',
Items = {
[1] = {
name = 'coffee', -- [INFO] Coffee item
price = 4,
amount = 50,
info = {},
type = 'item',
slot = 1,
},
},
},
--──────────────────────────────────────────────────────────────────────────
-- Water Category [EDIT]
--──────────────────────────────────────────────────────────────────────────
['water'] = {
Label = 'Water',
Items = {
[1] = {
name = 'water_bottle', -- [INFO] Water bottle item
price = 4,
amount = 50,
info = {},
type = 'item',
slot = 1,
},
},
},
}
--──────────────────────────────────────────────────────────────────────────────
-- Vending Machine Models [EDIT]
--──────────────────────────────────────────────────────────────────────────────
-- [INFO] Lists vending machine props and links them to a category defined above.
-- Allows interaction with corresponding items based on prop model type.
--──────────────────────────────────────────────────────────────────────────────
Config.Vendings = {
[1] = { Model = 'prop_vend_coffe_01', Category = 'coffee' },
[2] = { Model = 'prop_vend_water_01', Category = 'water' },
[3] = { Model = 'prop_watercooler', Category = 'water' },
[4] = { Model = 'prop_watercooler_Dark', Category = 'water' },
[5] = { Model = 'prop_vend_snak_01', Category = 'candy' },
[6] = { Model = 'prop_vend_snak_01_tu', Category = 'candy' },
[7] = { Model = 'prop_vend_fridge01', Category = 'drinks' },
[8] = { Model = 'prop_vend_soda_01', Category = 'drinks' },
[9] = { Model = 'prop_vend_soda_02', Category = 'drinks' },
}
@@ -1,204 +0,0 @@
:root {
font-size: min(.83333333vw, 1.8009478673vh) !important;
}
.compact {
width: 100% !important;
max-width: 100% !important;
}
.compact #inventory-container:before {
background-color: transparent;
}
.compact .inv-container {
display: flex !important;
flex-direction: column;
align-items: end;
justify-content: space-between;
top: 0;
height: 100%;
width: 50% !important;
padding-right: .25rem;
}
.compact .inventory-playerstats {
position: relative;
top: 1rem;
right: 1rem;
display: none;
}
.compact .inventory-playerdata {
position: absolute;
top: 57vh;
right: 1.2vh;
display: none;
}
.compact .ply-inv-container {
height: 50%;
}
.compact .player-inventory {
height: 90%;
}
.compact .oth-inv-container {
height: 40%; padding-right: 0 !important;
}
.compact .other-inventory {
position: relative;
height: 20rem;
}
.compact .inv-options {
position: relative !important;
display: flex;
max-height: 5rem !important;
margin-top: 2vh !important;
min-width: unset !important;
width: 564px;
padding-right: 13px;
align-items: center; justify-content: center;
}
@media (min-width: 2501px) {
.compact .inv-options {
width: 850px !important;
}
}
/* .compact .inv-options-list {
width: 100%;
box-sizing: border-box;
height: unset !important;
margin-top: 0 !important;
} */
.compact .inv-options .inv-options-list {
display: flex !important;
justify-content: center; align-items: center;
gap: .25rem;
width: 100% !important;
height: 100% !important;
margin-top: 0 !important;
margin-bottom: 0 !important;
}
.compact .inv-option-item {
position: relative;
min-height: 3.25rem !important;
max-width: 100% !important;
width: 100% !important;
font-size: 1.35vh !important;
margin-top: 0 !important;
}
.compact #clothmenu {
position: relative;
min-height: 3.25rem !important;
max-width: 100% !important;
width: 100% !important;
font-size: 1.735vh !important;
}
.inv-option-item > p {
font-size: 1.35vh !important;
}
/* .compact #inventory-custom {
bottom: 5vh;
height: 4vh;
} */
.compact .custom-inventory {
margin-top: 2.5vh;
height: 36vh;
margin-left: 1.7vh;
padding-right: .6vh;
}
.compact #weapon-attachments {
padding: 1vh;
}
.compact .iconBigger {
position: relative;
}
.iconBigger > i {
font-size: 1.35vh !important;
}
.compact .clothes-inventory {
position: relative;
right: 95vh;
top: -50vh !important;
}
.compact .returnButton {
width: 1vh !important;
}
.compact .logo-container {
top: 3vh;
left: 8vh !important;
}
.compact .sixth-slot {
left: 5vh;
}
.compact .ply-iteminfo-container {
position: absolute;
z-index: 9999;
font-family: "CabinetGrotesk-Bold";
display: flex;
align-items: center;
justify-content: baseline;
left: 0;
top: 0;
width: 15vw;
min-height: 16vh;
display: none;
min-width: auto;
margin: auto;
padding: 1.5vh;
border-radius: 0.5vh;
border: 0.1vh solid rgba(15, 130, 230, 0);
background: radial-gradient(
120.05% 120.05% at 50.14% -58.24%,
rgba(69, 100, 129, 0) 0%,
#0e151b 100%
)
padding-box,
linear-gradient(
180deg,
rgba(52, 68, 82, 0) 30%,
var(--primary-color) 70%
)
border-box;
border-image-source: linear-gradient(
180deg,
rgba(52, 68, 82, 0) 0%,
#ffffff 100%
);
}
.compact #weapon-attachments p {
font-size: 0.8vh !important;
}
.compact #player-inv-label {
font-size: 2rem !important;
line-height: 4rem;
max-width: 22.5rem !important;
}
.compact .player-inv-info {
padding-left: 1rem !important;
}
@@ -1,259 +0,0 @@
/* ============================================================================================ */
/* ==================================== DEFAULT THEME ========================================= */
/* ============================================================================================ */
.context-menu-default {
position: absolute;
width: 170px;
padding: .7rem 0;
color: white;
margin: 0;
border-radius: 5px;
background-color: #191e25;
z-index: 100;
outline: none;
opacity: 0;
-webkit-transform: translate(0, 15px) scale(0.95);
transform: translate(0, 15px) scale(0.95);
-webkit-transition: opacity 0.1s ease-out, -webkit-transform 0.1s ease-out;
transition: opacity 0.1s ease-out, -webkit-transform 0.1s ease-out;
transition: transform 0.1s ease-out, opacity 0.1s ease-out;
transition: transform 0.1s ease-out, opacity 0.1s ease-out, -webkit-transform 0.1s ease-out;
pointer-events: none;
}
.context-menu-default-item {
display: block;
position: relative;
margin: 0;
color: white;
padding: 0;
white-space: nowrap;
}
.context-menu-default-btn:focus{
border: 0;
outline: none;
}
.context-menu-default-icon{
color: white;
}
.context-menu-default-btn {
background: none;
line-height: normal;
overflow: visible;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
display: block;
outline: none;
width: 100%;
color: white;
font-family: 'Roboto', sans-serif;
font-size: 13px;
text-align: left;
cursor: pointer;
border: 1px solid transparent;
white-space: nowrap;
padding: 8px 16px;
}
.context-menu-default-btn::-moz-focus-inner,
.context-menu-default-btn::-moz-focus-inner {
border: 0;
outline: none;
}
.context-menu-default-icon {
font-size: 16px;
}
.context-menu-default-text {
font-size: 14px;
color: white;
margin-left: 15px;
}
.context-menu-default-item:hover > .context-menu-default-btn {
outline: none;
}
.context-menu-default-item.disabled {
opacity: 0.5;
pointer-events: none;
}
.context-menu-default-item.disabled .context-menu-default-btn {
cursor: default;
}
.context-menu-default-separator {
display: block;
margin: 7px 5px;
height: 1px;
border-bottom: 1px solid #fff;
background-color: rgb(255, 255, 255);
}
.context-menu-default-item.subcontext-menu-default::after {
content: '';
position: absolute;
right: 6px;
top: 50%;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
border: 5px solid transparent;
border-left-color: #808080;
}
.context-menu-default-item.subcontext-menu-default:hover::after {
border-left-color: #fff;
}
.context-menu-default .context-menu-default {
top: 4px;
left: 99%;
}
.show-context-menu-default,
.context-menu-default-item:hover > .context-menu-default {
opacity: 1;
-webkit-transform: translate(0, 0) scale(1);
transform: translate(0, 0) scale(1);
pointer-events: auto;
}
.context-menu-default-item:hover > .context-menu-default {
-webkit-transition-delay: 100ms;
transition-delay: 300ms;
}
/* ============================================================================================ */
/* ======================================= BLUE THEME ========================================= */
/* ============================================================================================ */
.context-menu-blue {
position: absolute;
width: 250px;
padding: 0;
margin: 0;
background: #23AFF7;
background: linear-gradient(to bottom, #23AFF7 0%, #007BFF 100px, #007BFF 100%);
z-index: 100;
border-radius: 2px;
-webkit-box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.2);
box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.2);
opacity: 0;
-webkit-transform: translate(0, 15px) scale(0.95);
transform: translate(0, 15px) scale(0.95);
-webkit-transition: opacity 0.1s ease-out, -webkit-transform 0.1s ease-out;
transition: opacity 0.1s ease-out, -webkit-transform 0.1s ease-out;
transition: transform 0.1s ease-out, opacity 0.1s ease-out;
transition: transform 0.1s ease-out, opacity 0.1s ease-out, -webkit-transform 0.1s ease-out;
pointer-events: none;
}
.context-menu-blue-item {
display: block;
position: relative;
margin: 0;
padding: 0;
white-space: nowrap;
}
.context-menu-blue-btn {
background: none;
line-height: normal;
overflow: visible;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
display: block;
width: 100%;
font-family: 'Roboto', sans-serif;
text-align: left;
cursor: pointer;
border: 1px solid transparent;
white-space: nowrap;
padding: 1rem 2rem;
}
.context-menu-blue-btn::-moz-focus-inner,
.context-menu-blue-btn::-moz-focus-inner {
border: 0;
padding: 0;
}
.context-menu-blue-icon {
color: white;
font-size: 1.1rem;
}
.context-menu-blue-text {
color: white;
font-family: 'Barlow', sans-serif;
font-size: 1rem;
margin-left: 20px;
}
.context-menu-blue-item:hover > .context-menu-blue-btn {
color: #23AFF7;
outline: none;
background-color: #73D0FF;
background: -webkit-gradient(linear, left top, left bottom, from(#73D0FF), to(#73D0FF));
background: linear-gradient(to bottom, #73D0FF, #73D0FF);
}
.context-menu-blue-item.disabled {
opacity: 0.5;
pointer-events: none;
}
.context-menu-blue-item.disabled .context-menu-blue-btn {
cursor: blue;
}
.context-menu-blue-separator {
display: block;
margin: 7px 5px;
height: 1px;
border-bottom: 1px solid #23AFF7;
background-color: #aaa;
}
.context-menu-blue-item.subcontext-menu-blue::after {
content: '';
position: absolute;
right: 6px;
top: 50%;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
border: 5px solid transparent;
border-left-color: #808080;
}
.context-menu-blue-item.subcontext-menu-blue:hover::after {
border-left-color: #23AFF7;
}
.context-menu-blue .context-menu-blue {
top: 4px;
left: 99%;
}
.show-context-menu-blue,
.context-menu-blue-item:hover > .context-menu-blue {
opacity: 1;
-webkit-transform: translate(0, 0) scale(1);
transform: translate(0, 0) scale(1);
pointer-events: auto;
}
.context-menu-blue-item:hover > .context-menu-blue {
-webkit-transition-delay: 100ms;
transition-delay: 300ms;
}
@@ -1,263 +0,0 @@
@import url("https://fonts.googleapis.com/css2?family=Alegreya+Sans:wght@100;300;400&display=swap");
* {
font-weight: 900;
font-family: 'CabinetGrotesk-Bold';
margin: 0;
padding: 0;
box-sizing: border-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.trade-container {
position: absolute;
left: 50%;
top: 50%;
z-index: 99999999;
margin: 20px auto;
width: 1340px;
display: flex;
justify-content: center;
transform: translate(-50%,-50%);
}
.buttons-group {
display: flex;
justify-content: center;
}
.buttons {
margin: 0 0;
width: 100%;
text-align: center;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
color: white;
}
.gray-text {
color: white;
font-size: 14px;
background-color: rgba(255,255,255,0.125);
width: 100%;
padding: 5px;
background: radial-gradient(120.05% 120.05% at 50.14% -58.24%, rgba(18,121,211,0.2) 0%, rgb(14,21,27) 100%) padding-box padding-box, linear-gradient(rgba(18,121,211,0.2) 30%, rgba(0,163,255,0.6) 70%) border-box border-box;
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
}
.btn {
padding: 5px 120px;
border-radius: 5px;
margin: 10px 5px;
transition: opacity 0.1s linear;
border-width: 1px;
border-style: solid;
border-color: rgba(18,121,211,0.2);
border-image-source: linear-gradient(rgb(14,21,27) 0%, rgb(255,255,255) 100%);
border-image-slice: initial;
border-image-width: initial;
border-image-outset: initial;
border-image-repeat: initial;
background: radial-gradient(120.05% 120.05% at 50.14% -58.24%, rgba(18,121,211,0.2) 0%, rgb(14,21,27) 100%) padding-box padding-box, linear-gradient(rgba(18,121,211,0.2) 30%, rgba(0,163,255,0.6) 70%) border-box border-box;
}
.btn:hover {
opacity: 0.8;
}
.btn-red {
background-color: #191e25;
}
.btn-green {
background-color: #191e25;
}
.btn i {
color: #6c757d;
}
.wrapper {
width: 51vh;
display: flex;
align-items: center;
background: radial-gradient(120.05% 120.05% at 50.14% -58.24%, rgba(18,121,211,0.2) 0%, rgb(14,21,27) 100%) padding-box padding-box, linear-gradient(rgba(18,121,211,0.2) 30%, rgba(0,163,255,0.6) 70%) border-box border-box;
border-width: 1px;
border-style: solid;
border-color: rgba(18,121,211,0.2);
border-image-source: linear-gradient(rgb(14,21,27) 0%, rgb(255,255,255) 100%);
border-radius: 8px;
color: #fff;
flex-direction: column;
overflow: hidden
}
.border {
width: 100%;
height: 2px;
margin: 10px 0;
border-bottom: 2px solid #222;
}
.offer-container {
width: 100%;
min-height: 430px;
max-height: 43px;
}
.offer-container.receiver {
border-bottom-right-radius: 5px;
border-bottom-left-radius: 5px;
}
.items {
min-height: 127px;
text-transform: capitalize;
max-height: 127px;
overflow: auto;
display: flex;
width: 100%;
padding: 0 10px;
margin: 0 auto;
justify-content: flex-start;
flex-wrap: wrap;
}
.items-header {
font-size: 18px;
color: #6c757d;
margin: 10px 20px;
}
.trade-item-slot {
position: relative;
height: 10.2vh;
margin: 5px;
width: 8.3vh;
transition: 0.1s opacity linear;
border-width: 1px;
border-style: solid;
border-color: rgba(18,121,211,0.2);
border-image-source: linear-gradient(rgb(14,21,27) 0%, rgb(255,255,255) 100%);
border-image-slice: initial;
border-image-width: initial;
border-image-outset: initial;
border-image-repeat: initial;
background: radial-gradient(120.05% 120.05% at 50.14% -58.24%, rgba(18,121,211,0.2) 0%, rgb(14,21,27) 100%) padding-box padding-box, linear-gradient(rgba(18,121,211,0.2) 30%, rgba(0,163,255,0.6) 70%) border-box border-box;
border-radius: 5px;
}
.item-slot:hover {
opacity: 0.7;
}
.item-infos {
color: white;
position: absolute;
display: flex;
width: 100%;
bottom: 0;
padding: 3px;
font-size: 14px;
justify-content: space-between;
}
.item-img {
position: absolute;
top: 45%;
left: 50%;
transform: translate(-50%,-50%);
width: 4.5vh;
}
.item-img img {
width: 100%;
height: auto;
}
.offer-items {
min-height: 127px;
max-height: 127px;
overflow: auto;
display: flex;
width: 100%;
padding: 0 10px;
margin: 0 auto;
justify-content: flex-start;
flex-wrap: wrap;
}
.header-wrapper {
padding: 10px;
margin-bottom: 10px;
color: white;
display: flex;
justify-content: space-evenly;
}
.header-wrapper h2 {
position: relative;
top: .1vh;
}
.header-wrapper input {
width: 13%;
text-align: right;
padding: 10px;
}
.item-trade-cut {
width: 38vh;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.amount {
background-color: #191e25;
outline: none;
border: none;
padding-left: 10px;
border-radius: 4px;
height: 4vh;
color: white;
border-width: 1px;
border-style: solid;
border-color: rgba(18,121,211,0.2);
border-image-source: linear-gradient(rgb(14,21,27) 0%, rgb(255,255,255) 100%);
border-image-slice: initial;
border-image-width: initial;
border-image-outset: initial;
border-image-repeat: initial;
background: radial-gradient(120.05% 120.05% at 50.14% -58.24%, rgba(18,121,211,0.2) 0%, rgb(14,21,27) 100%) padding-box padding-box, linear-gradient(rgba(18,121,211,0.2) 30%, rgba(0,163,255,0.6) 70%) border-box border-box;
}
.items, .offer-items {
width: 49vh;
}
.item-amount {
padding-right: 5px;
padding-top: 2px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
text-align: right;
font-size: 11px;
}
.item-label {
width: 100%;
text-align: center;
font-size: 11.8764px;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
font-family: 'CabinetGrotesk-Extrabold';
text-transform: uppercase;
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Some files were not shown because too many files have changed in this diff Show More