
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.
- 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
- Metti la cartella
off_pvpnella tua cartellaresources. - Aggiungi nel
server.cfg, dopo oxmysql ed ESX:
ensure oxmysql
ensure es_extended
ensure off_pvp- Adatta punti PvP, zone e mappe in
config/al tuo server.
La tabella off_pvp_stats viene creata automaticamente al primo avvio.
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
| 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 o it |
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 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 |
points | 1 esempio | Punti PvP in cui E apre il menu (vedi sotto) |
marker | vedi file | Aspetto dei punti marker: type, size, alpha, drawDistance |
respawn.seconds | 3 | Attesa fino al respawn in FFA e Only |
respawn.protection | 3 | Secondi di invulnerabilità dopo lo spawn |
respawn.armour | 100 | Giubbotto dopo lo spawn |
killHeal | true | Vita e giubbotto al massimo dopo ogni kill (FFA, Only e Lobby) |
leaderboardSize | 50 | Quanti giocatori mostra la classifica per modalità (3–500) |
Punti PvP (points):
| Campo | Descrizione |
|---|---|
id | Nome univoco del punto |
label | Nome nel testo di aiuto e sul blip |
position | vec4(x, y, z, heading) |
interaction | 'ped' = NPC, 'marker' = marker a terra |
ped | Modello dell'NPC, senza un modello valido vale defaultPed |
scenario | Animazione 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:
| Campo | Descrizione |
|---|---|
id | Nome univoco, che è anche il nome dell'immagine: web/dist/assets/maps/<id>.png |
label | Nome nel menu |
center | Centro della zona, vec3 |
radius | Raggio in metri. Chi lo lascia viene messo su uno spawn casuale |
maxPlayers | Giocatori contemporaneamente |
spawns | Lista 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 |
vehicle | Solo Only, facoltativo: { model, label }. Si spawna su questo veicolo |
config/settings/config.lobby.lua
Config.lobby contiene le impostazioni delle lobby:
| Opzione | Predefinito | Descrizione |
|---|---|---|
maxPlayers | 10 | Giocatori per lobby, al massimo la metà per squadra |
maxLobbies | 8 | Lobby contemporaneamente |
maxWeapons | 3 | Armi che si possono scegliere alla creazione |
rounds | 1 / 15 / 5 | Round: min, max e default |
prepareSeconds | 3 | Preparazione prima di ogni round (congelati, senza armi), nel primo round 3 secondi in più |
roundEndSeconds | 1 | Pausa dopo un round |
resultSeconds | 1 | Visualizzazione del risultato, poi si torna indietro |
roundMinutes | 5 | Limite di tempo per round, 0 = nessun limite |
spectateDelay | 3 | Secondi dopo la morte prima di passare a spettatore |
startRange | 50.0 | Quanto vicino a un punto PvP devono essere tutti i membri all'avvio |
overtimeRounds | 1 | Round decisivi in caso di parità, 0 = pareggio |
armour | 100 | Giubbotto all'inizio di ogni round |
weapons | 10 armi | Armi tra cui scegliere alla creazione: { name, ammo } |
vehicles | 3 veicoli | Veicoli predefiniti per le mappe con veicoli senza lista propria: { model, label } |
Config.maps contiene le mappe per le lobby:
| Campo | Descrizione |
|---|---|
id / label | Nome univoco (= nome dell'immagine, come per le zone) e nome visualizzato |
mode | 'foot' = a piedi, 'vehicle' = mappa con veicoli |
center / radius | Sfera mostrata nel match (vec3 e metri). Serve solo per la visualizzazione, non c'è nessun confine |
vehicles | Facoltativo, lista veicoli propria { model, label }. Senza lista vale Config.lobby.vehicles |
teams.a / teams.b | Uno spawn (vec4) per squadra. Tutti i giocatori della squadra iniziano lì ogni round |
garage / vehicleSpawn | Solo 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'.
| Funzione | Lato | A cosa serve |
|---|---|---|
ServerCanJoin(source, kind, id) | Server | return false, 'Text' impedisce l'ingresso e l'avvio della lobby, es. in prigione |
ServerKill(killer, victim, kind, id) | Server | Kill conteggiata, es. soldi come ricompensa |
ServerDeath(victim, killer, kind, id, teamkill) | Server | Ogni morte, killer può essere nil |
ServerMatchEnded(lobbyId, result) | Server | Match terminato: { winner, score, map, teams }, winner = 'a', 'b' o nil |
ServerJoined(source, kind, id) | Server | Il giocatore entra in una zona o in un match |
ServerLeft(source, kind, id, reason) | Server | reason = 'quit', 'drop', 'end', 'kick' o 'stop' |
Notify(message, type) / HelpNotify(text) | Client | Notifica e testo di aiuto · Server: Notify(source, message, type) |
ClientRevive(position) | Client | Rianimare, es. uno script ambulance tuo |
ClientDeath(kind) / ClientRespawn(kind) | Client | Morte e respawn nel PvP, es. nascondere la schermata di morte |
ClientGiveLoadout(loadout) | Client | Dare e restituire le armi |
ClientSetFuel(vehicle, fuel) | Client | Script carburante |
ClientVehicleSpawned(vehicle, plate, kind) | Client | Veicolo PvP spawnato, es. dare le chiavi |
ClientVehicleMenu(vehicles, onSelect) | Client | Menu 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 tuoquitCommand) 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
startRangeda 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
spectateDelaysecondi 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
-- 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()inoff_inventory/config/functions.luablocca 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.
| Problema | Soluzione |
|---|---|
| «Al momento non è possibile.» all'apertura | Sei morto, in un'altra dimensione o nel gangwar. |
| Una zona o una mappa manca nel menu | Controlla la console, la voce ha un errore (es. nessuno spawn). |
| Nessuna immagine per la zona o la mappa | Manca web/dist/assets/maps/<id>.png. |
| Il garage non apre nessun menu | Avvia esxmenudefault o adatta ClientVehicleMenu. |
| I giocatori non si fanno danno | Imposta Config.EnablePVP = true in ESX. |
| Lo script ambulance mostra la schermata di morte nel PvP | Nascondila in ClientDeath e mostrala di nuovo in ClientRespawn. |
| Nel posto sbagliato dopo un crash | Al login successivo torni automaticamente al punto di partenza. |
| Riavvio della resource durante un match | Tutti tornano indietro, il match non viene conteggiato. Meglio non riavviare durante i match. |
Non l’hai ancora acquistato?
Vedi PVP nel negozio