
Shops
Sistema di negozi per l'inventario standard e ox_inventory: negozi con carrello, armerie, mercato nero a rotazione, offerte del giorno, venditori NPC e un editor negozi in gioco.
- ESX Legacy (
es_extended) - oxmysql
- Inventario: inventario standard ESX o ox_inventory (rilevato all'avvio)
- Opzionale: ox_target
Funzionalità
- Tre tipi di negozio: negozio con carrello, armeria e mercato nero. Si paga con carta o in contanti, al mercato nero con soldi sporchi.
- Il server controlla prezzi, totale, peso e distanza. Scorte solo nei negozi acquistati. Regole per tipo di negozio, negozio o oggetto.
- Negozi in vendita: i giocatori comprano un negozio, decidono i prezzi, ritirano la merce dal grossista e gestiscono la cassa.
- Mercato nero a rotazione con posizioni, assortimento e prezzi che cambiano, più offerte del giorno nei negozi normali.
- Editor negozi in gioco con modello NPC, scenario, marcatore con anteprima dal vivo e blip personalizzato.
- Log Discord per ogni acquisto e statistiche dal vivo su Discord.
Installazione
- Metti la cartella
off_shopsnella tua cartellaresources. - Tutti gli oggetti di
config/settings/config.items.luadevono esistere nel tuo inventario – ESX: tabellaitems, ox_inventory:ox_inventory/data/items.lua. Le armi (weapon_…) con ESX non hanno bisogno di una voce. - Nel
server.cfg– dopo ESX, oxmysql e il tuo inventario:
ensure oxmysql
ensure es_extended
ensure ox_inventory
ensure off_shopsLe tabelle vengono create automaticamente e integrate con gli aggiornamenti.
Configurazione
config/settings/config.lua
| Opzione | Predefinito | Descrizione |
|---|---|---|
serverInfo.name | 'OFF SCRIPTS' | Nome del server, mostrato nell'interfaccia al posto di «OFF SCRIPTS» |
serverInfo.locale | 'de' | Lingua: de, en, pl, fr, es, it o nl |
serverInfo.color | { 155, 89, 255 } | Colore della UI (RGB) |
serverInfo.design | 3 | Design dell'interfaccia: 1 = Classico, 2 = Scontrino, 3 = Storefront |
blur | true | Sfondo sfocato finché il negozio è aperto. L'editor resta nitido (anteprima) |
useTarget | false | true = ox_target invece di E |
pedSpeech | true | L'NPC saluta, si congeda e ringrazia a voce |
purchase.maxPerItem | 25 | Quantità massima per articolo e acquisto |
deals.enabled / count / discountPercent | false / 2 / 20 | Offerte del giorno (solo negozi normali, niente armi): on/off, numero, sconto in percentuale |
marker.color / marker.alpha | { 155, 89, 255 } / 150 | Colore predefinito e opacità dei marcatori |
editor.command / editor.groups | 'shopeditor' / { 'projektleitung' } | Comando e gruppi ESX per l'editor |
stats.enabled / updateMinutes | true / 10 | Statistiche dal vivo su Discord, aggiornamento in minuti |
blackmarket.rotation / activeLocations | 'day' / 1 | Cambio del mercato nero ('day', 'week', 'month') e quanti ce ne sono contemporaneamente |
blackmarket.itemsPerCategory / priceVariancePercent | 2 / 15 | Articoli per categoria nel periodo, variazione di prezzo in percentuale |
shopTypes | normal, weapon, blackmarket | Per tipo label, ped (venditore), uiColor (colore UI proprio), blip e rules |
Regole (rules) esistono per tipo di negozio, negozio o oggetto: jobs, blockedJobs, minGrade e hours = { from, to } (ora di gioco, 22–5 = 22:00–04:59).
config/settings/config.locations.lua – Posizioni
{ type = 'normal', label = 'LTD Davis', interactionType = 'ped', position = vec4(-47.02, -1758.23, 29.42, 45.05), categories = { 'food', 'drinks', 'tools' } },
{ type = 'blackmarket', interactionType = 'ped', position = vec4(14.2280, -1104.0475, 29.7970, 340.0), categories = { 'weapons', 'illegal' } },| Campo | Descrizione |
|---|---|
type | 'normal', 'weapon' o 'blackmarket' |
interactionType | 'ped' (NPC, vec4 con direzione dello sguardo) o 'marker' |
categories | Quali categorie vende il negozio |
price | Opzionale: prezzo d'acquisto · senza price il negozio non è in vendita |
label / rules / blip = false | Opzionale: nome proprio, regole proprie o nessuna icona sulla mappa |
Le posizioni con type = 'blackmarket' sono possibili luoghi del mercato nero – di queste, activeLocations sono attive contemporaneamente.
Categorie e oggetti
food = { label = 'Essen', items = { 'bread', 'kebab', 'wrap' } }, -- categoria
{ name = 'water', label = 'Wasser', price = 10 }, -- oggetto- Opzionale per oggetto:
max(quantità massima propria),image(immagine propria),rules(regole proprie). weapon_…viene trattato come arma: acquistabile singolarmente, con 42 colpi nell'inventario ESX, non due volte.- Immagini: ESX carica
web/dist/assets/items/<name>.png, ox_inventory usa le sue. Metti le immagini delle armi mancanti inweb/dist/assets/weapons/<name>.png.
config/functions.lua
| Funzione | A cosa serve |
|---|---|
Notify(message, type) | Notify personalizzato · Server: Notify(source, message, type) |
HelpNotify(text) | Testo di aiuto al venditore o al marcatore |
Log Discord
I webhook li inserisci in config/settings/config.server.lua (solo lato server): purchases registra ogni acquisto, stats sono le statistiche dal vivo. Un url vuoto ('') disattiva il log.
Lingue
Tutti i testi sono in config/locales/<lingua>.json. Per una lingua tua, copia un file, traducilo e imposta locale – lascia dentro i placeholder come %s e {total}.
In gioco
Premi E al venditore o al marcatore (oppure usa ox_target), scegli gli articoli e paga. Nel negozio c'è un carrello, in armeria e al mercato nero scegli un articolo.
Editor negozi (/shopeditor)
- A sinistra ci sono tutti i negozi dell'editor. I negozi della config non ci sono, quelli li modifichi in
config/settings/config.locations.lua. - Nuovo crea un negozio nella tua posizione attuale, Modifica ne apre uno esistente.
- Puoi impostare tipo, nome, categorie, NPC o marcatore, posizione con direzione dello sguardo e blip.
- NPC: Scegli un modello da una lista di immagini di tutti i ped di GTA (ricerca e categorie), più scenario e direzione dello sguardo, tutto con anteprima dal vivo in gioco. Un ped addon lo scegli con il nome esatto del modello nella ricerca. Predefinito = venditore da
shopTypes. - Marcatore: Tipo, dimensione, distanza dal suolo, rotazione, colore, opacità e movimento con anteprima dal vivo in gioco.
- Blip: attivo o no, opzionalmente con icona e colore propri. Altrimenti vale il blip di
shopTypes. - Finché l'editor è aperto, ti muovi con WASD e ti guardi intorno tenendo premuto il tasto destro. Poi premi Prendi posizione.
- Dopo Salva la modifica vale subito per tutti i giocatori. Un mercato nero dell'editor è fisso e vende tutti gli articoli delle sue categorie.
Negozi in vendita
Se un negozio è in vendita lo imposti con price in config.locations.lua per i negozi della config, e nell'editor per i negozi dell'editor (gruppo Proprietà: In vendita, Prezzo d'acquisto). Il mercato nero non è mai in vendita. I negozi senza proprietario vendono come prima, senza scorte.
Opzione (ownership) | Predefinito | Descrizione |
|---|---|---|
enabled | true | Negozi in vendita sì/no. No = tutto come senza la funzione |
maxPerPlayer | 1 | Quanti negozi può avere un giocatore |
startStock / maxStock | 20 / 200 | Scorta iniziale per articolo dopo l'acquisto / scorta massima per articolo |
priceRange.min / max | 0.8 / 1.5 | Prezzo di vendita consentito = prezzo base × min a max |
wholesaleFactor | 0.6 | Prezzo all'ingrosso = prezzo base × fattore |
sellBackPercent | 60 | Riacquisto del server in % del prezzo d'acquisto |
van / orderMaxUnits / orderMinutes | 'speedo' / 300 / 20 | Furgone, pezzi max. per viaggio, limite di tempo in minuti |
vanSpawn | vec4(...) | Punto di spawn del furgone, il giocatore viene teletrasportato lì |
refundPercent | 0 | Rimborso in % se la consegna fallisce o viene annullata |
wholesalers | 3 × vec3 | Grossisti, si usa il più vicino al negozio |
In gioco: In un negozio in vendita, E apre prima una scelta tra Acquista e Gestione, con una telecamera sul venditore se c'è un NPC. Se il negozio è di qualcun altro, si apre direttamente il negozio. Senza proprietario Gestione porta all'offerta, da proprietario alla gestione con Panoramica (cassa, incasso oggi/7 giorni/totale, grafico, articoli quasi esauriti), Magazzino, Prezzi, Ordine e Cassa (prelievo/versamento in contanti o sul conto, cronologia, vendita del negozio). I clienti pagano in cassa e possono comprare solo ciò che è in magazzino.
Consegna: Scegli la merce, il costo viene pagato dalla cassa. Vieni teletrasportato al punto vanSpawn e messo nel furgone – vai dal grossista, E nel marker (carico), torna e parcheggia il furgone nel marker, poi vai dal venditore e premi E. Solo allora la merce entra in magazzino. Se il furgone viene distrutto, il tempo scade o lasci il server, la merce va persa (rimborso secondo refundPercent). Dopo un riavvio del server una consegna aperta viene rimborsata per intero.
Log Discord: webhook ownership in config/settings/config.server.lua (acquisto, vendita, consegne, prelievi/versamenti). Libera nell'editor rende di nuovo libero un negozio (magazzino e cassa vanno persi).
Problemi comuni
| Problema | Soluzione |
|---|---|
[ERROR] nella console del server | Lo script controlla l'installazione all'avvio. Leggi il messaggio, risolvi, riavvia lo script. |
| «Questo articolo non è valido» | L'oggetto manca nell'inventario (ESX: tabella items, ox_inventory: items.lua). |
| ox_inventory non viene rilevato | ensure ox_inventory deve stare prima di off_shops. |
| Il mercato nero è chiuso | Di default solo dalle 22 alle 5, ora di gioco (rules.hours). |
| Il mercato nero non c'è | Sono attive solo activeLocations posizioni – le altre al prossimo cambio. |
| Mercato nero: «Soldi insufficienti» | Il mercato nero accetta solo soldi sporchi (black_money). |
/shopeditor non si apre | Il tuo gruppo ESX deve essere in editor.groups. |
| «Il modello di PNG … non esiste» | Controlla il nome del modello, es. mp_m_shopkeep_01. I ped addon devono essere in stream. |
Non l’hai ancora acquistato?
Vedi Shops nel negozio