Skip to content

Chapter 9.6: Spawnovani hracu ​


Shrnuti: Lokace spawnu hracu jsou rizeny souborem cfgplayerspawnpoints.xml (pozicni bubliny) a init.c (pocatecni vybaveni). Tato kapitola pokryva oba soubory s realnymi vanilkovymi hodnotami z Chernarusu.


Obsah ​


Prehled cfgplayerspawnpoints.xml ​

Tento soubor se nachazi ve slozce vasi mise (napr. dayzOffline.chernarusplus/cfgplayerspawnpoints.xml). Ma tri sekce, kazda s vlastnimi parametry a pozicnimi bublinami:

  • <fresh> -- zcela nove postavy (prvni zivot nebo po smrti)
  • <hop> -- server hopperi (hrac mel postavu na jinem serveru)
  • <travel> -- spawny pri cestovani/teleportu po mape ve hre

Parametry spawnu ​

Vanilkove hodnoty pro cerstvy spawn:

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>
ParametrHodnotaVyznam
min_dist_infected30Hrac se musi spawnit alespon 30 m od nejblizsiho nakazeneho
max_dist_infected70Pokud neexistuje pozice 30 m+ daleko, prijmout az 70 m jako zakladni rozsah
min_dist_player65Hrac se musi spawnit alespon 65 m od jakehokoliv jineho hrace
max_dist_player150Zakladni rozsah -- prijmout pozice az 150 m od ostatnich hracu
min_dist_static0Minimalni vzdalenost od statickych objektu (budovy, zdi)
max_dist_static2Maximalni vzdalenost od statickych objektu -- udrzuje hrace blizko struktur

Engine nejprve zkusi min_dist_*; pokud neexistuje zadna platna pozice, uvolni se smerem k max_dist_*.


Parametry generatoru ​

Generator vytvari mrizku kandidatnich pozic kolem kazde bubliny:

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>
ParametrHodnotaVyznam
grid_density4Frekvence vzorkovani (pocet podrozdeleni) mrizky -- vyssi = vice kandidatu, vyssi zatez CPU. Rozestup mezi body = grid_width / grid_density
grid_width200Celkova sirka kandidatni mrizky v metrech (vystredena na bubline) -- roztahuje se ~100 m na kazdou stranu na ose X
grid_height200Celkova vyska kandidatni mrizky v metrech (vystredena na bubline) -- roztahuje se ~100 m na kazdou stranu na ose Z
min_steepness / max_steepness-45 / 45Rozsah sklonu terenu ve stupnich -- odmita utesy a strme kopce

Kazda bublina dostane mrizku 200x200 m s kandidatnimi body rozmistenymi grid_width / grid_density = 200/4 = 50 m od sebe (radove ~16-25 kandidatu). Engine filtruje podle sklonu a vzdalenosti od statickych objektu, pote aplikuje spawn_params pri spawnu.

Parametr allow_in_water (1.28+) ​

Od DayZ 1.28 byl do generator_params přidán nový booleovský parametr allow_in_water (výchozí: false). Když je nastaven na true, generátor spawnových bodů bude považovat pozice ve vodě za platné spawnové body:

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>

Ve výchozím nastavení engine odmítne jakoukoli kandidátní pozici, která spadá do vody (rybníky, řeky, oceán). Nastavení allow_in_water na true tento filtr odstraní. Toto je primárně užitečné pro vlastní mapy se spawny na ostrovech nebo scénáře, kde jsou spawny v pobřežní vodě záměrné. Pro většinu serverů ponechte hodnotu na false, abyste zabránili spawnování hráčů v jezerech nebo oceánu.


Parametry skupin ​

xml
<group_params>
    <enablegroups>true</enablegroups>
    <groups_as_regular>true</groups_as_regular>
    <lifetime>120</lifetime>
    <counter>2</counter>
</group_params>
ParametrHodnotaVyznam
enablegroupstruePozicni bubliny jsou organizovany do pojmenovanych skupin
groups_as_regulartrueSkupiny jsou zpracovavany jako bezne spawnovaci body (jakakoliv skupina muze byt vybrana)
lifetime120Sekundy, po ktere zustava spawnovaci skupina aktivni, nez system prepne na jinou skupinu. -1 = vypnuto
counter2Pocet prihlaseni, po ktere zustava skupina aktivni, nez dojde k prepnuti (na skupinu). -1 = vypnuto

lifetime ridi, jak dlouho zustava spawnovaci skupina aktivni skupinou, nez system prepne na jinou skupinu; neni to zamek jednotlivych pozic. Rozestup mezi soucasnymi spawny je vynucovan parametrem min_dist_player.


Bubliny pro cerstve spawny ​

Vanilkovy Chernarus definuje 11 skupin podél pobrezi pro cerstve spawny. Kazda skupina shlukuje 3-8 pozic kolem mesta:

SkupinaPoziceOblast
WestCherno4Zapadni strana Chernogorsku
EastCherno4Vychodni strana Chernogorsku
WestElektro5Zapadni Elektrozavodsk
EastElektro4Vychodni Elektrozavodsk
Kamyshovo5Pobrezi Kamyshova
Solnechny5Oblast tovarny Solnechniy
Orlovets4Mezi Solnechniy a Nizhnoye
Nizhnee4Pobrezi Nizhnoye
SouthBerezino3Jizni Berezino
NorthBerezino8Severni Berezino + rozsirene pobrezi
Svetlojarsk3Pristav Svetlojarsk

Realne priklady skupin ​

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>

Souradnice pouzivaji x (vychod-zapad) a z (sever-jih). Osa Y (nadmorska vyska) se pocita automaticky z vyskove mapy terenu.


Hop spawny ​

Hop spawny jsou shovivavejsi na vzdalenost od hracu a pouzivaji mensi mrizky:

xml
<!-- Rozdily spawn_params hopu oproti cerstvemu -->
<min_dist_player>25.0</min_dist_player>   <!-- cerstvy: 65 -->
<max_dist_player>70.0</max_dist_player>   <!-- cerstvy: 150 -->
<min_dist_static>0.5</min_dist_static>    <!-- cerstvy: 0 -->

<!-- Rozdily generator_params hopu -->
<grid_width>150</grid_width>              <!-- cerstvy: 200 -->
<grid_height>150</grid_height>            <!-- cerstvy: 200 -->

<!-- Rozdily group_params hopu -->
<enablegroups>false</enablegroups>        <!-- cerstvy: true -->
<lifetime>360</lifetime>                  <!-- cerstvy: 120 -->

Hop skupiny jsou rozlozeny do vnitrozemí: Balota (6), Cherno (5), Pusta (5), Kamyshovo (4), Solnechny (5), Nizhnee (6), Berezino (5), Olsha (4), Svetlojarsk (5), Dobroye (5). S enablegroups=false engine zachazi se vsemi 50 pozicemi jako s plochou zasobou.


init.c -- pocatecni vybaveni ​

Soubor init.c ve slozce vasi mise ridi vytvareni postav a pocatecni vybaveni. Dva prepisy jsou dulezite:

  • CreateCharacter -- vola GetGame().CreatePlayer(). Engine vybere pozici z cfgplayerspawnpoints.xml pred spustenim teto funkce; pozici spawnu zde nenastavujete.
  • StartingEquipSetup -- spusten po vytvoreni postavy. Hrac jiz ma vychozi obleceni (tricko, dziny, tenisky). Tato metoda pridava pocatecni predmety.

Vanilkovy 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 zdravi

        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 kazdy hrac dostane: BandageDressing (rychly panel 2), nahodny Chemlight (rychly panel 1), nahodne ovoce -- 35 % Apple, 30 % Plum, 35 % Pear (rychly panel 3). SetRandomHealth nastavuje 45-65 % stav na vsech predmetech.

Pridani vlastniho pocatecniho vybaveni ​

c
// Pridejte za blok ovoce, uvnitr kontroly slotu Body
itemEnt = player.GetInventory().CreateInInventory( "KitchenKnife" );
SetRandomHealth( itemEnt );

Pridani vlastnich spawnovacich bodu ​

Pro pridani vlastni skupiny spawnu upravte sekci <fresh> souboru 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>

Kroky:

  1. Otevrte mapu ve hre nebo pouzijte iZurvive pro nalezeni souradnic
  2. Vyberte 3-5 pozic rozmístenych v okruhu 100-200 m v bezpecne oblasti (zadne utesy, zadna voda)
  3. Pridejte blok <group> dovnitr <generator_posbubbles>
  4. Pouzijte x pro vychod-zapad a z pro sever-jih -- engine pocita Y (nadmorskou vysku) z terenu
  5. Restartujte server -- wipe persistence neni potreba

Pro vyvazene spawnovani udrzujte alespon 4 pozice na skupinu, aby jedna skupina mela dostatecny rozptyl pro splneni min_dist_player, kdyz zemre vice hracu soucasne.


Caste chyby ​

Hraci se spawnuji v oceanu ​

Zamenili jste z (sever-jih) s Y (nadmorska vyska), nebo jste pouzili souradnice mimo rozsah 0-15360. Pozice na pobrezi maji nizke hodnoty z (jizni okraj). Dvojitou kontrolu provedte s iZurvive.

Nedostatek spawnovacich bodu ​

S pouze 2-3 pozicemi nemuze aktivni skupina rozptylit hrace a dochazi ke shlukovani. Vanilka pouziva 49 cerstvych pozic v 11 skupinach. Cilte na alespon 20 pozic ve 4+ skupinach.

Zapomenuti na hop sekci ​

Prazdna sekce <hop> znamena, ze se server hopperi spawnuji na 0,0,0 -- na Chernarusu to je ocean. Vzdy definujte hop body, i kdyz je zkopirujete z <fresh>.

Spawnovaci body na strmen terenu ​

Generator odmita sklony nad 45 stupnu. Pokud jsou vsechny vlastni pozice na svazich, neexistuji zadni platni kandidati. Pouzijte rovny teren blizko silnic.

Hraci se vzdy spawnuji na stejnem miste ​

Skupiny s 1-2 pozicemi maji prilis malo kandidatu, aby engine mohl menit vybranou pozici. Pridejte vice pozic na skupinu.

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