Spawn de Jogadores
Resumo: Locais de spawn de jogadores sao controlados por cfgplayerspawnpoints.xml (bolhas de posicao) e init.c (equipamento inicial). Este capitulo cobre ambos os arquivos com valores reais do vanilla de Chernarus.
Sumario
- Visao Geral do cfgplayerspawnpoints.xml
- Parametros de Spawn
- Parametros do Gerador
- Parametros de Grupo
- Bolhas de Spawn para Novos Jogadores
- Spawns de Hop
- init.c -- Equipamento Inicial
- Adicionando Pontos de Spawn Customizados
- Erros Comuns
Visao Geral do cfgplayerspawnpoints.xml
Este arquivo fica na sua pasta de missao (ex.: dayzOffline.chernarusplus/cfgplayerspawnpoints.xml). Ele tem tres secoes, cada uma com seus proprios parametros e bolhas de posicao:
<fresh>-- personagens novos (primeira vida ou apos morte)<hop>-- server hoppers (jogador tinha um personagem em outro servidor)<travel>-- spawns de viagem/teleporte no mapa in-game
Parametros de Spawn
Valores vanilla de spawn para novos jogadores:
<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 | Valor | Significado |
|---|---|---|
min_dist_infected | 30 | O jogador deve spawnar a pelo menos 30m do infectado mais proximo |
max_dist_infected | 70 | Se nenhuma posicao a 30m+ existir, aceitar ate 70m como faixa de fallback |
min_dist_player | 65 | O jogador deve spawnar a pelo menos 65m de qualquer outro jogador |
max_dist_player | 150 | Faixa de fallback -- aceitar posicoes ate 150m de outros jogadores |
min_dist_static | 0 | Distancia minima de objetos estaticos (construcoes, muros) |
max_dist_static | 2 | Distancia maxima de objetos estaticos -- mantem jogadores perto de estruturas |
O engine tenta min_dist_* primeiro; se nenhuma posicao valida existir, ele relaxa em direcao a max_dist_*.
Parametros do Gerador
O gerador cria uma grade de posicoes candidatas ao redor de cada bolha:
<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 | Valor | Significado |
|---|---|---|
grid_density | 4 | Frequencia de amostragem (numero de subdivisoes) da grade -- maior = mais candidatos, maior custo de CPU. Espacamento entre pontos = grid_width / grid_density |
grid_width | 200 | Largura total da grade de candidatos em metros (centrada na bolha) -- estende ~100m para cada lado no eixo X |
grid_height | 200 | Altura total da grade de candidatos em metros (centrada na bolha) -- estende ~100m para cada lado no eixo Z |
min_steepness / max_steepness | -45 / 45 | Faixa de inclinacao do terreno em graus -- rejeita faces de penhasco e encostas ingremes |
Cada bolha recebe uma grade de 200x200m com pontos candidatos espacados grid_width / grid_density = 200/4 = 50m entre si (na ordem de ~16-25 candidatos). O engine filtra por inclinacao e distancia estatica, depois aplica spawn_params no momento do spawn.
Parametro allow_in_water (1.28+)
A partir do DayZ 1.28, um novo parametro booleano allow_in_water foi adicionado ao generator_params (padrao: false). Quando definido como true, o gerador de pontos de spawn considerara posicoes na agua como pontos de spawn validos:
<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>Por padrao, o engine rejeita qualquer posicao candidata que caia na agua (lagos, rios, oceano). Definir allow_in_water como true remove esse filtro. Isso e util principalmente para mapas customizados com spawns em ilhas ou cenarios onde spawns costeiros na agua sao intencionais. Para a maioria dos servidores, deixe como false para evitar jogadores spawnando em lagos ou no oceano.
Parametros de Grupo
<group_params>
<enablegroups>true</enablegroups>
<groups_as_regular>true</groups_as_regular>
<lifetime>120</lifetime>
<counter>2</counter>
</group_params>| Parametro | Valor | Significado |
|---|---|---|
enablegroups | true | Bolhas de posicao sao organizadas em grupos nomeados |
groups_as_regular | true | Grupos sao tratados como pontos de spawn regulares (qualquer grupo pode ser selecionado) |
lifetime | 120 | Segundos que um grupo de spawn permanece ativo antes do sistema trocar para outro grupo. -1 = desabilitado |
counter | 2 | Numero de logins que um grupo permanece ativo antes de ser trocado (por grupo). -1 = desabilitado |
lifetime controla por quanto tempo um grupo de spawn permanece como o grupo ativo antes do sistema trocar para outro grupo; nao e um bloqueio por posicao. O espacamento entre spawns simultaneos e imposto por min_dist_player.
Bolhas de Spawn para Novos Jogadores
O Chernarus vanilla define 11 grupos ao longo da costa para spawns de novos jogadores. Cada grupo agrupa 3-8 posicoes ao redor de uma cidade:
| Grupo | Posicoes | Area |
|---|---|---|
| WestCherno | 4 | Lado oeste de Chernogorsk |
| EastCherno | 4 | Lado leste de Chernogorsk |
| WestElektro | 5 | Elektrozavodsk oeste |
| EastElektro | 4 | Elektrozavodsk leste |
| Kamyshovo | 5 | Litoral de Kamyshovo |
| Solnechny | 5 | Area da fabrica de Solnechniy |
| Orlovets | 4 | Entre Solnechniy e Nizhnoye |
| Nizhnee | 4 | Costa de Nizhnoye |
| SouthBerezino | 3 | Berezino sul |
| NorthBerezino | 8 | Berezino norte + costa estendida |
| Svetlojarsk | 3 | Porto de Svetlojarsk |
Exemplos Reais de Grupo
<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>Coordenadas usam x (leste-oeste) e z (norte-sul). O eixo Y (altitude) e calculado automaticamente a partir do heightmap do terreno.
Spawns de Hop
Spawns de hop sao mais lenientes na distancia de jogadores e usam grades menores:
<!-- Diferencas de spawn_params do hop em relacao ao 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 -->
<!-- Diferencas de generator_params do hop -->
<grid_width>150</grid_width> <!-- fresh: 200 -->
<grid_height>150</grid_height> <!-- fresh: 200 -->
<!-- Diferencas de group_params do hop -->
<enablegroups>false</enablegroups> <!-- fresh: true -->
<lifetime>360</lifetime> <!-- fresh: 120 -->Grupos de hop sao espalhados no interior: Balota (6), Cherno (5), Pusta (5), Kamyshovo (4), Solnechny (5), Nizhnee (6), Berezino (5), Olsha (4), Svetlojarsk (5), Dobroye (5). Com enablegroups=false, o engine trata todas as 50 posicoes como um pool plano.
init.c -- Equipamento Inicial
O arquivo init.c na sua pasta de missao controla a criacao de personagem e equipamento inicial. Duas sobrescritas importam:
CreateCharacter-- chamaGetGame().CreatePlayer(). O engine escolhe a posicao do cfgplayerspawnpoints.xml antes disso rodar; voce nao define a posicao de spawn aqui.StartingEquipSetup-- roda apos a criacao do personagem. O jogador ja tem roupas padrao (camisa, jeans, tenis). Este metodo adiciona itens iniciais.
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 de saude
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 );
}O que isso da a cada jogador: BandageDressing (quickbar 2), Chemlight aleatorio (quickbar 1), fruta aleatoria -- 35% Apple, 30% Plum, 35% Pear (quickbar 3). SetRandomHealth define 45-65% de condicao em todos os itens.
Adicionando equipamento inicial customizado
// Adicione apos o bloco de fruta, dentro da verificacao do slot Body
itemEnt = player.GetInventory().CreateInInventory( "KitchenKnife" );
SetRandomHealth( itemEnt );Adicionando Pontos de Spawn Customizados
Para adicionar um grupo de spawn customizado, edite a secao <fresh> do 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>Passos:
- Abra seu mapa in-game ou use o iZurvive para encontrar coordenadas
- Escolha 3-5 posicoes espalhadas por 100-200m em uma area segura (sem penhascos, sem agua)
- Adicione o bloco
<group>dentro de<generator_posbubbles> - Use
xpara leste-oeste ezpara norte-sul -- o engine calcula Y (altitude) a partir do terreno - Reinicie o servidor -- nenhum wipe de persistencia e necessario
Para spawn balanceado, mantenha pelo menos 4 posicoes por grupo para que um unico grupo tenha espalhamento suficiente para manter min_dist_player satisfeito quando multiplos jogadores morrem de uma vez.
Erros Comuns
Jogadores spawnando no oceano
Voce trocou z (norte-sul) com Y (altitude), ou usou coordenadas fora da faixa 0-15360. Posicoes costeiras tem valores baixos de z (borda sul). Verifique com o iZurvive.
Pontos de spawn insuficientes
Com apenas 2-3 posicoes, o grupo ativo nao consegue espalhar os jogadores e ocorre agrupamento. O vanilla usa 49 posicoes de spawn para novos jogadores em 11 grupos. Tente ter pelo menos 20 posicoes em 4+ grupos.
Esquecendo a secao hop
Uma secao <hop> vazia significa que server hoppers spawnam em 0,0,0 -- o oceano em Chernarus. Sempre defina pontos de hop, mesmo que voce os copie do <fresh>.
Pontos de spawn em terreno ingreme
O gerador rejeita inclinacoes acima de 45 graus. Se todas as posicoes customizadas estao em encostas, nenhum candidato valido existe. Use terreno plano perto de estradas.
Jogadores sempre spawnando no mesmo lugar
Grupos com 1-2 posicoes tem poucos candidatos para o engine variar a posicao escolhida. Adicione mais posicoes por grupo.
