Vai al contenuto
Tutta la documentazione

PVP

Sistema PvP con zone FFA, zone Only e match a squadre nelle lobby. Ogni zona e ogni match gira in una dimensione propria. In più ci sono una classifica e un pannello del match. La tabella la crea lo script da solo.

Requisiti
  • ESX Legacy (es_extended, testato con 1.14)
  • oxmysql
  • OneSync
  • In ESX deve essere impostato Config.EnablePVP = true (predefinito)
  • Per il menu garage sulle mappe con veicoli: esxmenudefault (o un menu tuo tramite ClientVehicleMenu)

Funzionalità

  • Zone FFA: tutti contro tutti. Per ogni zona armi fisse o le armi del giocatore. Respawn con giubbotto e breve protezione allo spawn.
  • Zone Only: tutti hanno le stesse armi, a scelta con un veicolo (es. BF 400) a ogni spawn.
  • Lobby: squadra A contro squadra B in modalità best-of con round decisivo. Si possono scegliere mappa, modalità (a piedi o veicolo), round, fino a 3 armi e una password facoltativa. Il proprietario può espellere, mescolare e sciogliere.
  • Spettatore: chi viene eliminato in un round guarda i compagni ancora vivi e cambia con ← →.
  • Pannello del match in alto al centro e Classifica con i filtri FFA, Only e Lobby (incluse vittorie e sconfitte).
  • Protezione armi: le armi fisse esistono solo nel PvP. Le armi vere e le loro munizioni restano protette.
  • Log su Discord, export e funzioni tue per collegare altri script.

Installazione

  1. Metti la cartella off_pvp nella tua cartella resources.
  2. Aggiungi nel server.cfg, dopo oxmysql ed ESX:
cfg
ensure oxmysql
ensure es_extended
ensure off_pvp
  1. Adatta punti PvP, zone e mappe in config/ al tuo server.

La tabella off_pvp_stats viene creata automaticamente al primo avvio.

Coordinate di esempio

Le zone in config/settings/config.ffa.lua e config/settings/config.only.lua e le mappe in config/settings/config.lobby.lua sono solo esempi. Controlla tutte le posizioni in gioco e inserisci le tue.

Configurazione

Le impostazioni sono in config/settings/: config.lua per tutto ciò che è generale, config.ffa.lua, config.only.lua e config.lobby.lua per le tre modalità.

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 o it
serverInfo.color{ 155, 89, 255 }Colore della UI (RGB)
serverInfo.design3Design dell'interfaccia: 1 = Classico, 2 = Scontrino, 3 = Storefront
blurtrueSfondo sfocato finché il menu è aperto
quitCommand'quitffa'Comando per uscire da FFA, Only, lobby e match in corso
defaultPed's_m_y_valet_01'NPC per i punti senza un ped valido
points1 esempioPunti PvP in cui E apre il menu (vedi sotto)
markervedi fileAspetto dei punti marker: type, size, alpha, drawDistance
respawn.seconds3Attesa fino al respawn in FFA e Only
respawn.protection3Secondi di invulnerabilità dopo lo spawn
respawn.armour100Giubbotto dopo lo spawn
killHealtrueVita e giubbotto al massimo dopo ogni kill (FFA, Only e Lobby)
leaderboardSize50Quanti giocatori mostra la classifica per modalità (3–500)

Punti PvP (points):

CampoDescrizione
idNome univoco del punto
labelNome nel testo di aiuto e sul blip
positionvec4(x, y, z, heading)
interaction'ped' = NPC, 'marker' = marker a terra
pedModello dell'NPC, senza un modello valido vale defaultPed
scenarioAnimazione dell'NPC (facoltativa)
blip{ sprite, color, scale }, false = nessun blip

config/settings/config.ffa.lua e config/settings/config.only.lua

Config.ffa e Config.only contengono le zone. Ogni zona ha:

CampoDescrizione
idNome univoco, che è anche il nome dell'immagine: web/dist/assets/maps/<id>.png
labelNome nel menu
centerCentro della zona, vec3
radiusRaggio in metri. Chi lo lascia viene messo su uno spawn casuale
maxPlayersGiocatori contemporaneamente
spawnsLista di vec4. Al respawn viene usato lo spawn più lontano dagli altri giocatori
weapons{ name, ammo }. FFA: facoltativo, senza lista si combatte con le proprie armi e si consumano munizioni vere. Only: obbligatorio
vehicleSolo Only, facoltativo: { model, label }. Si spawna su questo veicolo

config/settings/config.lobby.lua

Config.lobby contiene le impostazioni delle lobby:

OpzionePredefinitoDescrizione
maxPlayers10Giocatori per lobby, al massimo la metà per squadra
maxLobbies8Lobby contemporaneamente
maxWeapons3Armi che si possono scegliere alla creazione
rounds1 / 15 / 5Round: min, max e default
prepareSeconds3Preparazione prima di ogni round (congelati, senza armi), nel primo round 3 secondi in più
roundEndSeconds1Pausa dopo un round
resultSeconds1Visualizzazione del risultato, poi si torna indietro
roundMinutes5Limite di tempo per round, 0 = nessun limite
spectateDelay3Secondi dopo la morte prima di passare a spettatore
startRange50.0Quanto vicino a un punto PvP devono essere tutti i membri all'avvio
overtimeRounds1Round decisivi in caso di parità, 0 = pareggio
armour100Giubbotto all'inizio di ogni round
weapons10 armiArmi tra cui scegliere alla creazione: { name, ammo }
vehicles3 veicoliVeicoli predefiniti per le mappe con veicoli senza lista propria: { model, label }

Config.maps contiene le mappe per le lobby:

CampoDescrizione
id / labelNome univoco (= nome dell'immagine, come per le zone) e nome visualizzato
mode'foot' = a piedi, 'vehicle' = mappa con veicoli
center / radiusSfera mostrata nel match (vec3 e metri). Serve solo per la visualizzazione, non c'è nessun confine
vehiclesFacoltativo, lista veicoli propria { model, label }. Senza lista vale Config.lobby.vehicles
teams.a / teams.bUno spawn (vec4) per squadra. Tutti i giocatori della squadra iniziano lì ogni round
garage / vehicleSpawnSolo mappe con veicoli, per squadra: marker del garage (vec3) e punto di uscita (vec4)

config/functions.lua

Qui colleghi i tuoi script. Gli errori al loro interno finiscono in console, lo script continua a funzionare. kind è sempre 'ffa', 'only' o 'lobby'.

FunzioneLatoA cosa serve
ServerCanJoin(source, kind, id)Serverreturn false, 'Text' impedisce l'ingresso e l'avvio della lobby, es. in prigione
ServerKill(killer, victim, kind, id)ServerKill conteggiata, es. soldi come ricompensa
ServerDeath(victim, killer, kind, id, teamkill)ServerOgni morte, killer può essere nil
ServerMatchEnded(lobbyId, result)ServerMatch terminato: { winner, score, map, teams }, winner = 'a', 'b' o nil
ServerJoined(source, kind, id)ServerIl giocatore entra in una zona o in un match
ServerLeft(source, kind, id, reason)Serverreason = 'quit', 'drop', 'end', 'kick' o 'stop'
Notify(message, type) / HelpNotify(text)ClientNotifica e testo di aiuto · Server: Notify(source, message, type)
ClientRevive(position)ClientRianimare, es. uno script ambulance tuo
ClientDeath(kind) / ClientRespawn(kind)ClientMorte e respawn nel PvP, es. nascondere la schermata di morte
ClientGiveLoadout(loadout)ClientDare e restituire le armi
ClientSetFuel(vehicle, fuel)ClientScript carburante
ClientVehicleSpawned(vehicle, plate, kind)ClientVeicolo PvP spawnato, es. dare le chiavi
ClientVehicleMenu(vehicles, onSelect)ClientMenu garage sulle mappe con veicoli (predefinito: menu ESX Default)
ClientStateChanged(state)Client{ kind, id, team } all'ingresso, nil all'uscita, es. bloccare il telefono o il tuo HUD

config/settings/config.server.lua e lingue

Webhook Discord per lobby (lobby creata, match avviato, match terminato, lobby sciolta) e zones (ingresso e uscita da una zona). '' disattiva un log. Tutti i testi sono in config/locales/ (un file per lingua).

In gioco

  • Menu: E a un punto PvP. Funziona solo da vivo, a piedi, nella dimensione normale e non nel gangwar.
  • FFA e Only: Entra ti teletrasporta nella zona. Dopo la morte riparti da uno spawn dopo respawn.seconds. In alto vedi kill, morti e i giocatori nella zona.
  • Uscire: /quitffa (o il tuo quitCommand) ti riporta nel punto in cui sei entrato. Vita e giubbotto sono come prima, le tue armi tornano. Il comando fa uscire anche da una lobby in attesa.
  • Crea lobby: scegli mappa, modalità, round, armi e, se vuoi, una password. I nuovi giocatori vanno nella squadra più piccola. Si può cambiare finché l'altra squadra non è piena. Dopo 5 password sbagliate la lobby è bloccata per te per 60 secondi.
  • Proprietario: avvia, mescola, espelle e scioglie. Se il proprietario esce, subentra il membro successivo.
  • Avvio: chi è morto, in un'altra dimensione, nel gangwar o più lontano di startRange da un punto PvP viene tolto dalla lobby. Ogni squadra ha bisogno di almeno un giocatore.
  • Match:
  • Ogni round inizia con la preparazione (congelati, senza armi), poi arrivano armi e giubbotto.
  • Vince il round chi elimina tutta la squadra avversaria. Durante un round non c'è respawn. Se gli ultimi due cadono insieme, nessuno prende il punto.
  • Se scade il tempo, vince la squadra con più giocatori vivi, in caso di parità nessuno prende il punto.
  • Vince il match chi per primo conquista più della metà dei round. Se tutti i round sono stati giocati, vince il punteggio più alto. In caso di parità ci sono round decisivi (overtimeRounds), poi pareggio.
  • Il fuoco amico è attivo. Un teamkill conta come morte, non come kill.
  • Chi lascia un match in corso riceve una sconfitta. Se poi una squadra resta vuota, l'altra vince subito.
  • Dopo tutti tornano al loro punto di partenza, la lobby resta aperta e torna in attesa.
  • Spettatore: dopo spectateDelay secondi guardi un compagno vivo. In basso al centro ci sono il suo nome e le frecce. ← e → cambiano.
  • Garage (mappe con veicoli): durante il round, E al marker del garage della tua squadra apre la lista dei veicoli. Ogni giocatore ha un veicolo, uno nuovo sostituisce il vecchio.
  • Classifica: i migliori giocatori per modalità (numero tramite leaderboardSize), ordinati per kill. I nuovi valori compaiono al massimo dopo un minuto, dopo un match subito.

Per sviluppatori

lua
-- Server
local inPvp = exports.off_pvp:IsInPvp(source)        -- FFA, Only o match in corso
local ffa = exports.off_pvp:IsFFA(source)
local only = exports.off_pvp:IsOnly(source)
local lobby = exports.off_pvp:IsLobby(source)        -- in un match in corso
local inLobby = exports.off_pvp:IsInLobby(source)    -- membro di una lobby, in attesa o nel match
local info = exports.off_pvp:GetPvp(source)          -- { kind, id, team, alive, kills, deaths } o nil
local removed = exports.off_pvp:RemoveFromPvp(source) -- toglie il giocatore da zona, match o lobby in attesa, true/false
local stats = exports.off_pvp:GetStats(source)       -- { ffa = { kills, deaths }, only = { ... }, lobby = { kills, deaths, wins, losses } } o nil

-- Client
local inPvp = exports.off_pvp:IsInPvp()
local ffa = exports.off_pvp:IsFFA()
local only = exports.off_pvp:IsOnly()
local lobby = exports.off_pvp:IsLobby()
local spectating = exports.off_pvp:IsSpectating()
local info = exports.off_pvp:GetPvp()                -- { kind, id, team, phase } o nil
  • Statebag offPvp: 'ffa', 'only' o 'lobby' finché il giocatore è in una zona o in un match.
  • offinventory: canOpen() in off_inventory/config/functions.lua blocca inventario e bagagliaio nel PvP non appena offpvp è attivo.

Problemi comuni

All'avvio lo script segnala errori e avvisi nella console del server. Zone e mappe con errori vengono indicate lì e ignorate.

ProblemaSoluzione
«Al momento non è possibile.» all'aperturaSei morto, in un'altra dimensione o nel gangwar.
Una zona o una mappa manca nel menuControlla la console, la voce ha un errore (es. nessuno spawn).
Nessuna immagine per la zona o la mappaManca web/dist/assets/maps/<id>.png.
Il garage non apre nessun menuAvvia esxmenudefault o adatta ClientVehicleMenu.
I giocatori non si fanno dannoImposta Config.EnablePVP = true in ESX.
Lo script ambulance mostra la schermata di morte nel PvPNascondila in ClientDeath e mostrala di nuovo in ClientRespawn.
Nel posto sbagliato dopo un crashAl login successivo torni automaticamente al punto di partenza.
Riavvio della resource durante un matchTutti tornano indietro, il match non viene conteggiato. Meglio non riavviare durante i match.

Non l’hai ancora acquistato?

Vedi PVP nel negozio