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).
@@ -15,3 +15,4 @@ _check_dupes.py
|
|||||||
_find_dupes.py
|
_find_dupes.py
|
||||||
artifacts/crashes/136f1640-ac9a-4693-824a-5ccd58f1b359-full.dmp
|
artifacts/crashes/136f1640-ac9a-4693-824a-5ccd58f1b359-full.dmp
|
||||||
artifacts/crashes/136f1640-ac9a-4693-824a-5ccd58f1b359.dmp
|
artifacts/crashes/136f1640-ac9a-4693-824a-5ccd58f1b359.dmp
|
||||||
|
/artifacts/crashes
|
||||||
|
|||||||
@@ -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ă
|
## 2026-03-31 — Migrare Interacțiuni la qb-target + Skills Upgrade + Bus Icon + Animație Tabletă
|
||||||
|
|
||||||
### 🎬 Animație Tabletă la Job Center
|
### 🎬 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)
|
- [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-smartphone-pro`: configurare în `server/custom/webhooks/webhooks.lua`
|
||||||
- [ ] **Webhooks** `qs-advancedgarages`: configurare în `server/custom/misc/*.lua`
|
- [ ] **Webhooks** `qs-advancedgarages`: configurare în `server/custom/misc/*.lua`
|
||||||
- [ ] **oxmysql oversized query**: `SELECT * FROM crypto_history` (2339 results) — trebuie paginare sau LIMIT
|
- [ ] **oxmysql oversized query**: `SELECT * FROM crypto_history` (4016 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
|
- [ ] **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 outfit setup**: Configurare Luxu panel Clone Yourself + testare outfit stack
|
||||||
- [ ] **Admin jacket blacklist**: Adăugare în `Skin.BlacklistedInputValues`
|
- [ ] **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)
|
||||||
|
|
||||||
|
|||||||
@@ -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`)
|
## Feature: Mechanic Job Outfit (lucrat pe `t1ger_mechanic`)
|
||||||
|
|
||||||
### Fișiere modificate în alte resurse:
|
### 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)
|
## Feature: Wasabi Police Install (lucrat pe `wasabi_police` — 2026-03-29)
|
||||||
|
|
||||||
### Fișiere modificate în alte resurse:
|
### 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)
|
- 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`
|
- 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
|
||||||
|
```
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ ensure [cfx-default]
|
|||||||
ensure ox_lib
|
ensure ox_lib
|
||||||
ensure [core]
|
ensure [core]
|
||||||
ensure [depends]
|
ensure [depends]
|
||||||
|
ensure [inventory]
|
||||||
ensure [voice]
|
ensure [voice]
|
||||||
ensure [auth]
|
ensure [auth]
|
||||||
ensure [ui]
|
ensure [ui]
|
||||||
|
|||||||
@@ -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 (1–5).
|
|
||||||
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.0–1.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.0–1.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;
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 91 KiB |
|
Before Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 157 KiB |
|
Before Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 122 KiB |
|
Before Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 91 KiB |
|
Before Width: | Height: | Size: 5.9 MiB |
|
Before Width: | Height: | Size: 7.0 MiB |
|
Before Width: | Height: | Size: 97 KiB |
|
Before Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 91 KiB |
|
Before Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 80 KiB |