Vai al contenuto
Tutta la documentazione

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.

Requisiti
  • 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

  1. Metti la cartella off_shops nella tua cartella resources.
  2. Tutti gli oggetti di config/settings/config.items.lua devono esistere nel tuo inventario – ESX: tabella items, ox_inventory: ox_inventory/data/items.lua. Le armi (weapon_…) con ESX non hanno bisogno di una voce.
  3. Nel server.cfg – dopo ESX, oxmysql e il tuo inventario:
cfg
ensure oxmysql
ensure es_extended
ensure ox_inventory
ensure off_shops

Le tabelle vengono create automaticamente e integrate con gli aggiornamenti.

Configurazione

config/settings/config.lua

OpzionePredefinitoDescrizione
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.design3Design dell'interfaccia: 1 = Classico, 2 = Scontrino, 3 = Storefront
blurtrueSfondo sfocato finché il negozio è aperto. L'editor resta nitido (anteprima)
useTargetfalsetrue = ox_target invece di E
pedSpeechtrueL'NPC saluta, si congeda e ringrazia a voce
purchase.maxPerItem25Quantità massima per articolo e acquisto
deals.enabled / count / discountPercentfalse / 2 / 20Offerte del giorno (solo negozi normali, niente armi): on/off, numero, sconto in percentuale
marker.color / marker.alpha{ 155, 89, 255 } / 150Colore predefinito e opacità dei marcatori
editor.command / editor.groups'shopeditor' / { 'projektleitung' }Comando e gruppi ESX per l'editor
stats.enabled / updateMinutestrue / 10Statistiche dal vivo su Discord, aggiornamento in minuti
blackmarket.rotation / activeLocations'day' / 1Cambio del mercato nero ('day', 'week', 'month') e quanti ce ne sono contemporaneamente
blackmarket.itemsPerCategory / priceVariancePercent2 / 15Articoli per categoria nel periodo, variazione di prezzo in percentuale
shopTypesnormal, weapon, blackmarketPer 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

lua
{ 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' } },
CampoDescrizione
type'normal', 'weapon' o 'blackmarket'
interactionType'ped' (NPC, vec4 con direzione dello sguardo) o 'marker'
categoriesQuali categorie vende il negozio
priceOpzionale: prezzo d'acquisto · senza price il negozio non è in vendita
label / rules / blip = falseOpzionale: 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

lua
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 in web/dist/assets/weapons/<name>.png.

config/functions.lua

FunzioneA 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)PredefinitoDescrizione
enabledtrueNegozi in vendita sì/no. No = tutto come senza la funzione
maxPerPlayer1Quanti negozi può avere un giocatore
startStock / maxStock20 / 200Scorta iniziale per articolo dopo l'acquisto / scorta massima per articolo
priceRange.min / max0.8 / 1.5Prezzo di vendita consentito = prezzo base × min a max
wholesaleFactor0.6Prezzo all'ingrosso = prezzo base × fattore
sellBackPercent60Riacquisto del server in % del prezzo d'acquisto
van / orderMaxUnits / orderMinutes'speedo' / 300 / 20Furgone, pezzi max. per viaggio, limite di tempo in minuti
vanSpawnvec4(...)Punto di spawn del furgone, il giocatore viene teletrasportato lì
refundPercent0Rimborso in % se la consegna fallisce o viene annullata
wholesalers3 × vec3Grossisti, 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

ProblemaSoluzione
[ERROR] nella console del serverLo 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 rilevatoensure ox_inventory deve stare prima di off_shops.
Il mercato nero è chiusoDi 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 apreIl 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