Skip to content

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 ​

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:

xml
<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>
ParametrWartoscZnaczenie
min_dist_infected30Gracz musi pojawic sie co najmniej 30m od najblizszego zarazonego
max_dist_infected70Jesli nie istnieje pozycja 30m+ dalej, akceptuj do 70m jako zakres awaryjny
min_dist_player65Gracz musi pojawic sie co najmniej 65m od jakiegokolwiek innego gracza
max_dist_player150Zakres awaryjny -- akceptuj pozycje do 150m od innych graczy
min_dist_static0Minimalna odleglosc od statycznych obiektow (budynki, sciany)
max_dist_static2Maksymalna 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:

xml
<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>
ParametrWartoscZnaczenie
grid_density4Czestotliwosc probkowania (liczba podzialow) siatki -- wyzsza wartosc = wiecej kandydatow, wyzszy koszt CPU. Odstep miedzy punktami = grid_width / grid_density
grid_width200Calkowita szerokosc siatki kandydackiej w metrach (wycentrowana na bablu) -- rozciaga sie ~100m na kazda strone na osi X
grid_height200Calkowita wysokosc siatki kandydackiej w metrach (wycentrowana na bablu) -- rozciaga sie ~100m na kazda strone na osi Z
min_steepness / max_steepness-45 / 45Zakres 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:

xml
<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 ​

xml
<group_params>
    <enablegroups>true</enablegroups>
    <groups_as_regular>true</groups_as_regular>
    <lifetime>120</lifetime>
    <counter>2</counter>
</group_params>
ParametrWartoscZnaczenie
enablegroupstrueBable pozycji sa organizowane w nazwane grupy
groups_as_regulartrueGrupy sa traktowane jako zwykle punkty spawnu (kazda grupa moze byc wybrana)
lifetime120Sekundy, przez ktore grupa spawnu pozostaje aktywna, zanim system przelaczy sie na inna grupe. -1 = wylaczone
counter2Liczba 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:

GrupaPozycjeObszar
WestCherno4Zachodnia strona Chernogorska
EastCherno4Wschodnia strona Chernogorska
WestElektro5Zachodni Elektrozawodsk
EastElektro4Wschodni Elektrozawodsk
Kamyshovo5Wybrzeze Kamyszowo
Solnechny5Okolice fabryki Solniecznego
Orlovets4Miedzy Solniecznym a Nizhnoe
Nizhnee4Wybrzeze Nizhnoe
SouthBerezino3Poludniowe Berezino
NorthBerezino8Polnocne Berezino + rozszerzone wybrzeze
Svetlojarsk3Port Swietlojarsk

Prawdziwe przyklady grup ​

xml
<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:

xml
<!-- 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 -- wywoluje GetGame().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) ​

c
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 ​

c
// 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:

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:

  1. Otworz mape w grze lub uzyj iZurvive, aby znalezc wspolrzedne
  2. Wybierz 3-5 pozycji rozlozonych na 100-200m w bezpiecznym obszarze (bez klifow, bez wody)
  3. Dodaj blok <group> wewnatrz <generator_posbubbles>
  4. Uzyj x dla wschod-zachod i z dla polnoc-poludnie -- silnik oblicza Y (wysokosc) z terenu
  5. 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.

Released under CC BY-SA 4.0 | Code examples under MIT License