Chapter 9.6: Spawn dei Giocatori
Riepilogo: Le posizioni di spawn dei giocatori sono controllate da cfgplayerspawnpoints.xml (bolle di posizione) e init.c (equipaggiamento iniziale). Questo capitolo copre entrambi i file con valori vanilla reali di Chernarus.
Indice
- Panoramica di cfgplayerspawnpoints.xml
- Parametri di spawn
- Parametri del generatore
- Parametri di gruppo
- Bolle di spawn per nuovi giocatori
- Spawn per server hopper
- init.c -- Equipaggiamento iniziale
- Aggiungere punti di spawn personalizzati
- Errori comuni
Panoramica di cfgplayerspawnpoints.xml
Questo file si trova nella cartella della tua missione (ad esempio dayzOffline.chernarusplus/cfgplayerspawnpoints.xml). Ha tre sezioni, ciascuna con i propri parametri e bolle di posizione:
<fresh>-- personaggi completamente nuovi (prima vita o dopo la morte)<hop>-- server hopper (il giocatore aveva un personaggio su un altro server)<travel>-- spawn per viaggi/teletrasporto sulla mappa in-game
Parametri di spawn
Valori vanilla per lo spawn dei nuovi giocatori:
<spawn_params>
<min_dist_infected>30</min_dist_infected>
<max_dist_infected>70</max_dist_infected>
<min_dist_player>65</min_dist_player>
<max_dist_player>150</max_dist_player>
<min_dist_static>0</min_dist_static>
<max_dist_static>2</max_dist_static>
</spawn_params>| Parametro | Valore | Significato |
|---|---|---|
min_dist_infected | 30 | Il giocatore deve spawnare ad almeno 30m dall'infetto piu vicino |
max_dist_infected | 70 | Se non esiste una posizione a 30m+, accetta fino a 70m come intervallo di ripiego |
min_dist_player | 65 | Il giocatore deve spawnare ad almeno 65m da qualsiasi altro giocatore |
max_dist_player | 150 | Intervallo di ripiego -- accetta posizioni fino a 150m da altri giocatori |
min_dist_static | 0 | Distanza minima da oggetti statici (edifici, muri) |
max_dist_static | 2 | Distanza massima da oggetti statici -- mantiene i giocatori vicini alle strutture |
Il motore prova prima min_dist_*; se non esiste una posizione valida, rilassa verso max_dist_*.
Parametri del generatore
Il generatore crea una griglia di posizioni candidate intorno a ogni bolla:
<generator_params>
<grid_density>4</grid_density>
<grid_width>200</grid_width>
<grid_height>200</grid_height>
<min_dist_static>0</min_dist_static>
<max_dist_static>2</max_dist_static>
<min_steepness>-45</min_steepness>
<max_steepness>45</max_steepness>
</generator_params>| Parametro | Valore | Significato |
|---|---|---|
grid_density | 4 | Frequenza di campionamento (numero di suddivisioni) della griglia -- piu alta = piu candidati, costo CPU piu alto. Spaziatura tra i punti = grid_width / grid_density |
grid_width | 200 | Larghezza totale della griglia di candidati in metri (centrata sulla bolla) -- si estende ~100m per lato sull'asse X |
grid_height | 200 | Altezza totale della griglia di candidati in metri (centrata sulla bolla) -- si estende ~100m per lato sull'asse Z |
min_steepness / max_steepness | -45 / 45 | Intervallo di pendenza del terreno in gradi -- rifiuta pareti rocciose e colline ripide |
Ogni bolla ottiene una griglia 200x200m con punti candidati spaziati grid_width / grid_density = 200/4 = 50m l'uno dall'altro (nell'ordine di ~16-25 candidati). Il motore filtra per pendenza e distanza dagli oggetti statici, poi applica i spawn_params al momento dello spawn.
Parametro allow_in_water (1.28+)
A partire da DayZ 1.28, e stato aggiunto un nuovo parametro booleano allow_in_water in generator_params (valore predefinito: false). Se impostato su true, il generatore di punti di spawn considera valide anche le posizioni in acqua:
<generator_params>
<grid_density>4</grid_density>
<grid_width>200</grid_width>
<grid_height>200</grid_height>
<min_dist_static>0</min_dist_static>
<max_dist_static>2</max_dist_static>
<min_steepness>-45</min_steepness>
<max_steepness>45</max_steepness>
<allow_in_water>false</allow_in_water>
</generator_params>Per impostazione predefinita, il motore rifiuta qualsiasi posizione candidata che cade in acqua (stagni, fiumi, oceano). Impostare allow_in_water su true rimuove questo filtro. Questo e utile principalmente per mappe personalizzate con spawn su isole o scenari in cui lo spawn in acqua costiera e intenzionale. Per la maggior parte dei server, lascia questo valore su false per evitare che i giocatori spawnino nei laghi o nell'oceano.
Parametri di gruppo
<group_params>
<enablegroups>true</enablegroups>
<groups_as_regular>true</groups_as_regular>
<lifetime>120</lifetime>
<counter>2</counter>
</group_params>| Parametro | Valore | Significato |
|---|---|---|
enablegroups | true | Le bolle di posizione sono organizzate in gruppi nominati |
groups_as_regular | true | I gruppi sono trattati come punti di spawn regolari (qualsiasi gruppo puo essere selezionato) |
lifetime | 120 | Secondi durante i quali un gruppo di spawn resta attivo prima che il sistema passi a un altro gruppo. -1 = disabilitato |
counter | 2 | Numero di login durante i quali un gruppo resta attivo prima di essere sostituito (per gruppo). -1 = disabilitato |
lifetime controlla per quanto tempo un gruppo di spawn rimane il gruppo attivo prima che il sistema passi a un altro gruppo; non e un blocco per singola posizione. La spaziatura tra gli spawn simultanei e imposta da min_dist_player.
Bolle di spawn per nuovi giocatori
Chernarus vanilla definisce 11 gruppi lungo la costa per i nuovi spawn. Ogni gruppo raggruppa 3-8 posizioni intorno a una citta:
| Gruppo | Posizioni | Area |
|---|---|---|
| WestCherno | 4 | Lato ovest di Chernogorsk |
| EastCherno | 4 | Lato est di Chernogorsk |
| WestElektro | 5 | Elektrozavodsk ovest |
| EastElektro | 4 | Elektrozavodsk est |
| Kamyshovo | 5 | Costa di Kamyshovo |
| Solnechny | 5 | Area della fabbrica di Solnechniy |
| Orlovets | 4 | Tra Solnechniy e Nizhnoye |
| Nizhnee | 4 | Costa di Nizhnoye |
| SouthBerezino | 3 | Berezino sud |
| NorthBerezino | 8 | Berezino nord + costa estesa |
| Svetlojarsk | 3 | Porto di Svetlojarsk |
Esempi reali di gruppi
<generator_posbubbles>
<group name="WestCherno">
<pos x="6063.018555" z="1931.907227" />
<pos x="5933.964844" z="2171.072998" />
<pos x="6199.782715" z="2241.805176" />
<pos x="13552.5654" z="5955.893066" />
</group>
<group name="WestElektro">
<pos x="8747.670898" z="2357.187012" />
<pos x="9363.6533" z="2017.953613" />
<pos x="9488.868164" z="1898.900269" />
<pos x="9675.2216" z="1817.324585" />
<pos x="9821.274414" z="2194.003662" />
</group>
<group name="Kamyshovo">
<pos x="11830.744141" z="3400.428955" />
<pos x="11930.805664" z="3484.882324" />
<pos x="11961.211914" z="3419.867676" />
<pos x="12222.977539" z="3454.867188" />
<pos x="12336.774414" z="3503.847168" />
</group>
</generator_posbubbles>Le coordinate usano x (est-ovest) e z (nord-sud). L'asse Y (altitudine) viene calcolato automaticamente dalla heightmap del terreno.
Spawn per server hopper
Gli spawn per gli hopper sono piu permissivi sulla distanza dai giocatori e usano griglie piu piccole:
<!-- Differenze dei spawn_params per hop rispetto a fresh -->
<min_dist_player>25.0</min_dist_player> <!-- fresh: 65 -->
<max_dist_player>70.0</max_dist_player> <!-- fresh: 150 -->
<min_dist_static>0.5</min_dist_static> <!-- fresh: 0 -->
<!-- Differenze dei generator_params per hop -->
<grid_width>150</grid_width> <!-- fresh: 200 -->
<grid_height>150</grid_height> <!-- fresh: 200 -->
<!-- Differenze dei group_params per hop -->
<enablegroups>false</enablegroups> <!-- fresh: true -->
<lifetime>360</lifetime> <!-- fresh: 120 -->I gruppi hop sono distribuiti nell'entroterra: Balota (6), Cherno (5), Pusta (5), Kamyshovo (4), Solnechny (5), Nizhnee (6), Berezino (5), Olsha (4), Svetlojarsk (5), Dobroye (5). Con enablegroups=false, il motore tratta tutte le 50 posizioni come un pool piatto.
init.c -- Equipaggiamento iniziale
Il file init.c nella cartella della tua missione controlla la creazione del personaggio e l'equipaggiamento iniziale. Due override contano:
CreateCharacter-- chiamaGetGame().CreatePlayer(). Il motore sceglie la posizione da cfgplayerspawnpoints.xml prima che questo venga eseguito; non imposti la posizione di spawn qui.StartingEquipSetup-- viene eseguito dopo la creazione del personaggio. Il giocatore ha gia l'abbigliamento predefinito (maglietta, jeans, scarpe da ginnastica). Questo metodo aggiunge gli oggetti iniziali.
StartingEquipSetup vanilla (Chernarus)
override void StartingEquipSetup(PlayerBase player, bool clothesChosen)
{
EntityAI itemClothing;
EntityAI itemEnt;
float rand;
itemClothing = player.FindAttachmentBySlotName( "Body" );
if ( itemClothing )
{
SetRandomHealth( itemClothing ); // 0.45 - 0.65 salute
itemEnt = itemClothing.GetInventory().CreateInInventory( "BandageDressing" );
player.SetQuickBarEntityShortcut(itemEnt, 2);
string chemlightArray[] = { "Chemlight_White", "Chemlight_Yellow", "Chemlight_Green", "Chemlight_Red" };
int rndIndex = Math.RandomInt( 0, 4 );
itemEnt = itemClothing.GetInventory().CreateInInventory( chemlightArray[rndIndex] );
SetRandomHealth( itemEnt );
player.SetQuickBarEntityShortcut(itemEnt, 1);
rand = Math.RandomFloatInclusive( 0.0, 1.0 );
if ( rand < 0.35 )
itemEnt = player.GetInventory().CreateInInventory( "Apple" );
else if ( rand > 0.65 )
itemEnt = player.GetInventory().CreateInInventory( "Pear" );
else
itemEnt = player.GetInventory().CreateInInventory( "Plum" );
player.SetQuickBarEntityShortcut(itemEnt, 3);
SetRandomHealth( itemEnt );
}
itemClothing = player.FindAttachmentBySlotName( "Legs" );
if ( itemClothing )
SetRandomHealth( itemClothing );
}Cosa riceve ogni giocatore: BandageDressing (quickbar 2), Chemlight casuale (quickbar 1), frutta casuale -- 35% Apple, 30% Plum, 35% Pear (quickbar 3). SetRandomHealth imposta una condizione del 45-65% su tutti gli oggetti.
Aggiungere equipaggiamento iniziale personalizzato
// Aggiungi dopo il blocco della frutta, dentro il controllo dello slot Body
itemEnt = player.GetInventory().CreateInInventory( "KitchenKnife" );
SetRandomHealth( itemEnt );Aggiungere punti di spawn personalizzati
Per aggiungere un gruppo di spawn personalizzato, modifica la sezione <fresh> di cfgplayerspawnpoints.xml:
<group name="MyCustomSpawn">
<pos x="7500.0" z="7500.0" />
<pos x="7550.0" z="7520.0" />
<pos x="7480.0" z="7540.0" />
<pos x="7520.0" z="7480.0" />
</group>Passaggi:
- Apri la mappa nel gioco o usa iZurvive per trovare le coordinate
- Scegli 3-5 posizioni distribuite su 100-200m in un'area sicura (niente scogliere, niente acqua)
- Aggiungi il blocco
<group>dentro<generator_posbubbles> - Usa
xper est-ovest ezper nord-sud -- il motore calcola Y (altitudine) dal terreno - Riavvia il server -- non e necessario un wipe della persistenza
Per uno spawn equilibrato, mantieni almeno 4 posizioni per gruppo in modo che un singolo gruppo abbia abbastanza distribuzione da mantenere min_dist_player soddisfatto quando piu giocatori muoiono contemporaneamente.
Errori comuni
I giocatori spawnano nell'oceano
Hai scambiato z (nord-sud) con Y (altitudine), o hai usato coordinate fuori dall'intervallo 0-15360. Le posizioni costiere hanno valori z bassi (bordo sud). Ricontrolla con iZurvive.
Non abbastanza punti di spawn
Con solo 2-3 posizioni, il gruppo attivo non puo distribuire i giocatori e ne risulta raggruppamento. Il vanilla usa 49 posizioni fresh distribuite su 11 gruppi. Punta ad almeno 20 posizioni in 4+ gruppi.
Dimenticare la sezione hop
Una sezione <hop> vuota significa che i server hopper spawnano a 0,0,0 -- l'oceano su Chernarus. Definisci sempre i punti hop, anche se li copi da <fresh>.
Punti di spawn su terreno ripido
Il generatore rifiuta pendenze oltre i 45 gradi. Se tutte le posizioni personalizzate sono su colline, non esistono candidati validi. Usa terreno piatto vicino alle strade.
I giocatori spawnano sempre nello stesso punto
I gruppi con 1-2 posizioni hanno troppi pochi candidati perche il motore possa variare la posizione scelta. Aggiungi piu posizioni per gruppo.
