Chapter 9.6: Spawn graczy
Podsumowanie: Lokalizacje spawnu graczy sa kontrolowane przez cfgplayerspawnpoints.xml (bable pozycji) i init.c (startowy ekwipunek). Ten rozdzial omawia oba pliki z prawdziwymi vanillowymi wartosciami z Chernarusa.
Spis tresci
- Przeglad cfgplayerspawnpoints.xml
- Parametry spawnu
- Parametry generatora
- Parametry grup
- Bable swiezego spawnu
- Spawny hopowe
- init.c -- Startowy ekwipunek
- Dodawanie niestandardowych punktow spawnu
- Typowe bledy
Przeglad cfgplayerspawnpoints.xml
Ten plik znajduje sie w folderze misji (np. dayzOffline.chernarusplus/cfgplayerspawnpoints.xml). Ma trzy sekcje, kazda z wlasnymi parametrami i bablami pozycji:
<fresh>-- zupelnie nowe postacie (pierwsze zycie lub po smierci)<hop>-- server hoperzy (gracz mial postac na innym serwerze)<travel>-- spawny przy podrozy/teleportacji po mapie w grze
Parametry spawnu
Vanillowe wartosci swiezego spawnu:
<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>| Parametr | Wartosc | Znaczenie |
|---|---|---|
min_dist_infected | 30 | Gracz musi pojawic sie co najmniej 30m od najblizszego zarazonego |
max_dist_infected | 70 | Jesli nie istnieje pozycja 30m+ dalej, akceptuj do 70m jako zakres awaryjny |
min_dist_player | 65 | Gracz musi pojawic sie co najmniej 65m od jakiegokolwiek innego gracza |
max_dist_player | 150 | Zakres awaryjny -- akceptuj pozycje do 150m od innych graczy |
min_dist_static | 0 | Minimalna odleglosc od statycznych obiektow (budynki, sciany) |
max_dist_static | 2 | Maksymalna odleglosc od statycznych obiektow -- trzyma graczy blisko budowli |
Silnik najpierw probuje min_dist_*; jesli nie istnieje prawidlowa pozycja, luzuje wymagania w kierunku max_dist_*.
Parametry generatora
Generator tworzy siatke pozycji kandydackich wokol kazdego babla:
<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>| Parametr | Wartosc | Znaczenie |
|---|---|---|
grid_density | 4 | Czestotliwosc probkowania (liczba podzialow) siatki -- wyzsza wartosc = wiecej kandydatow, wyzszy koszt CPU. Odstep miedzy punktami = grid_width / grid_density |
grid_width | 200 | Calkowita szerokosc siatki kandydackiej w metrach (wycentrowana na bablu) -- rozciaga sie ~100m na kazda strone na osi X |
grid_height | 200 | Calkowita wysokosc siatki kandydackiej w metrach (wycentrowana na bablu) -- rozciaga sie ~100m na kazda strone na osi Z |
min_steepness / max_steepness | -45 / 45 | Zakres nachylenia terenu w stopniach -- odrzuca klify i strome wzgorza |
Kazdy babel otrzymuje siatke 200x200m z punktami kandydackimi rozlozonymi w odstepach grid_width / grid_density = 200/4 = 50m (rzedu ~16-25 kandydatow). Silnik filtruje po nachyleniu i odleglosci od obiektow statycznych, a nastepnie stosuje spawn_params w momencie spawnu.
Parametr allow_in_water (1.28+)
Od DayZ 1.28 do generator_params dodano nowy parametr logiczny allow_in_water (domyślnie: false). Gdy ustawiony na true, generator punktów spawnu uznaje pozycje w wodzie za prawidłowe punkty spawnu:
<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>Domyślnie silnik odrzuca każdą pozycję kandydacką, która wypada w wodzie (stawy, rzeki, ocean). Ustawienie allow_in_water na true usuwa ten filtr. Jest to przydatne głównie dla niestandardowych map ze spawnami na wyspach lub scenariuszy, w których spawny w wodzie przybrzeżnej są zamierzone. Dla większości serwerów pozostaw wartość false, aby uniknąć spawnowania graczy w jeziorach lub oceanie.
Parametry grup
<group_params>
<enablegroups>true</enablegroups>
<groups_as_regular>true</groups_as_regular>
<lifetime>120</lifetime>
<counter>2</counter>
</group_params>| Parametr | Wartosc | Znaczenie |
|---|---|---|
enablegroups | true | Bable pozycji sa organizowane w nazwane grupy |
groups_as_regular | true | Grupy sa traktowane jako zwykle punkty spawnu (kazda grupa moze byc wybrana) |
lifetime | 120 | Sekundy, przez ktore grupa spawnu pozostaje aktywna, zanim system przelaczy sie na inna grupe. -1 = wylaczone |
counter | 2 | Liczba logowan, przez ktore grupa pozostaje aktywna, zanim zostanie zamieniona (na grupe). -1 = wylaczone |
lifetime kontroluje, jak dlugo grupa spawnu pozostaje aktywna grupa, zanim system przelaczy sie na inna grupe; nie jest to blokada per-pozycja. Odstep miedzy jednoczesnymi spawnami jest wymuszany przez min_dist_player.
Bable swiezego spawnu
Vanillowy Chernarus definiuje 11 grup wzdluz wybrzeza dla swiezych spawnow. Kazda grupa skupia 3-8 pozycji wokol miasta:
| Grupa | Pozycje | Obszar |
|---|---|---|
| WestCherno | 4 | Zachodnia strona Chernogorska |
| EastCherno | 4 | Wschodnia strona Chernogorska |
| WestElektro | 5 | Zachodni Elektrozawodsk |
| EastElektro | 4 | Wschodni Elektrozawodsk |
| Kamyshovo | 5 | Wybrzeze Kamyszowo |
| Solnechny | 5 | Okolice fabryki Solniecznego |
| Orlovets | 4 | Miedzy Solniecznym a Nizhnoe |
| Nizhnee | 4 | Wybrzeze Nizhnoe |
| SouthBerezino | 3 | Poludniowe Berezino |
| NorthBerezino | 8 | Polnocne Berezino + rozszerzone wybrzeze |
| Svetlojarsk | 3 | Port Swietlojarsk |
Prawdziwe przyklady grup
<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>Wspolrzedne uzywaja x (wschod-zachod) i z (polnoc-poludnie). Os Y (wysokosc) jest obliczana automatycznie z mapy wysokosci terenu.
Spawny hopowe
Spawny hopowe sa bardziej liberalne pod wzgledem odleglosci od graczy i uzywaja mniejszych siatek:
<!-- Roznice spawn_params hopowych od swiezych -->
<min_dist_player>25.0</min_dist_player> <!-- swieze: 65 -->
<max_dist_player>70.0</max_dist_player> <!-- swieze: 150 -->
<min_dist_static>0.5</min_dist_static> <!-- swieze: 0 -->
<!-- Roznice generator_params hopowych -->
<grid_width>150</grid_width> <!-- swieze: 200 -->
<grid_height>150</grid_height> <!-- swieze: 200 -->
<!-- Roznice group_params hopowych -->
<enablegroups>false</enablegroups> <!-- swieze: true -->
<lifetime>360</lifetime> <!-- swieze: 120 -->Grupy hopowe sa rozlozone w glab ladu: Balota (6), Cherno (5), Pusta (5), Kamyszowo (4), Solnieczny (5), Nizhnoe (6), Berezino (5), Olsha (4), Swietlojarsk (5), Dobroye (5). Przy enablegroups=false silnik traktuje wszystkie 50 pozycji jako plaska pule.
init.c -- Startowy ekwipunek
Plik init.c w folderze misji kontroluje tworzenie postaci i startowy ekwipunek. Dwa nadpisania maja znaczenie:
CreateCharacter-- wywolujeGetGame().CreatePlayer(). Silnik wybiera pozycje z cfgplayerspawnpoints.xml zanim to sie uruchomi; nie ustawiasz pozycji spawnu tutaj.StartingEquipSetup-- uruchamia sie po utworzeniu postaci. Gracz ma juz domyslne ubrania (koszula, jeansy, trampki). Ta metoda dodaje przedmioty startowe.
Vanillowy StartingEquipSetup (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 zdrowia
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 );
}Co to daje kazdemu graczowi: BandageDressing (pasek 2), losowy Chemlight (pasek 1), losowy owoc -- 35% Apple, 30% Plum, 35% Pear (pasek 3). SetRandomHealth ustawia 45-65% stanu na wszystkich przedmiotach.
Dodawanie niestandardowego ekwipunku startowego
// Dodaj po bloku owocu, wewnatrz sprawdzenia slotu Body
itemEnt = player.GetInventory().CreateInInventory( "KitchenKnife" );
SetRandomHealth( itemEnt );Dodawanie niestandardowych punktow spawnu
Aby dodac niestandardowa grupe spawnu, edytuj sekcje <fresh> pliku 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>Kroki:
- Otworz mape w grze lub uzyj iZurvive, aby znalezc wspolrzedne
- Wybierz 3-5 pozycji rozlozonych na 100-200m w bezpiecznym obszarze (bez klifow, bez wody)
- Dodaj blok
<group>wewnatrz<generator_posbubbles> - Uzyj
xdla wschod-zachod izdla polnoc-poludnie -- silnik oblicza Y (wysokosc) z terenu - Zrestartuj serwer -- czyszczenie trwalosci nie jest wymagane
Dla zrownowazonych spawnow zachowaj co najmniej 4 pozycje na grupe, aby pojedyncza grupa miala wystarczajacy rozrzut, by spelnic min_dist_player, gdy wielu graczy zginie jednoczesnie.
Typowe bledy
Gracze pojawiaja sie w oceanie
Pomyliles z (polnoc-poludnie) z Y (wysokosc) lub uzyles wspolrzednych spoza zakresu 0-15360. Pozycje na wybrzezu maja niskie wartosci z (poludniowy brzeg). Sprawdz z iZurvive.
Zbyt malo punktow spawnu
Przy zaledwie 2-3 pozycjach aktywna grupa nie moze rozproszyc graczy i dochodzi do skupiania sie. Vanilla uzywa 49 swiezych pozycji w 11 grupach. Cel to co najmniej 20 pozycji w 4+ grupach.
Zapomnienie o sekcji hop
Pusta sekcja <hop> oznacza, ze server hoperzy pojawiaja sie na wspolrzednych 0,0,0 -- w oceanie na Chernarusie. Zawsze definiuj punkty hopowe, nawet jesli skopiujesz je z <fresh>.
Punkty spawnu na stromym terenie
Generator odrzuca nachylenia powyzej 45 stopni. Jesli wszystkie niestandardowe pozycje sa na zboczach, nie istnieja prawidlowi kandydaci. Uzywaj plaskiego terenu blisko drog.
Gracze zawsze pojawiaja sie w tym samym miejscu
Grupy z 1-2 pozycjami maja zbyt malo kandydatow, aby silnik mogl zroznicowac wybrana pozycje. Dodaj wiecej pozycji na grupe.
