Por que isso importa para o seu servidor
Evento é o que segura jogador em horário morto. O problema é que evento feito à mão exige GM presente, e GM presente é a coisa mais escassa de qualquer projeto — principalmente às três da tarde de uma terça.
Este motor tira o GM da equação. Você define os horários uma vez, e a partir daí o servidor abre a inscrição, espera o mínimo de jogadores, teleporta, roda, apura e paga. Se ninguém se inscreve, ele cancela e tenta no próximo horário, sem deixar nada quebrado.
Existe até um recurso para o pior cenário — servidor com pouca gente online: os jogadores simulados entram para completar o time e o evento acontece mesmo assim.
O cabeçalho: regras globais
<eventEngine enabled="true" fixedSchedule="false" increasePvp="true"
maxLevel="86" minLevel="1" maxParticipants="200"
participantsPerIp="0" registrationTime="1" timeBetweenEvents="1">
| Atributo | O que faz |
|---|---|
enabled | Liga ou desliga o motor inteiro. |
fixedSchedule | Com true, os eventos rodam exatamente nos horários listados. Com false, o motor tem liberdade para encaixar respeitando timeBetweenEvents. |
increasePvp | Se as mortes dentro do evento contam para o contador de PvP do personagem. |
minLevel / maxLevel | Faixa de nível aceita. Vale para todos os eventos. |
maxParticipants | Teto de inscritos por evento. |
participantsPerIp | Quantos personagens do mesmo IP podem entrar. 0 é sem limite — suba para 1 ou 2 se quiser cortar quem entra com várias janelas para ganhar sozinho. |
registrationTime | Minutos de inscrição aberta antes de começar. |
timeBetweenEvents | Intervalo mínimo, em minutos, entre um evento e o próximo. |
Jogadores simulados
<fakePlayers count="5" enabled="false" maxPerTeam="25"
minRealPlayers="2" onlyWhenNotFull="true" spawnDelaySeconds="0"/>
Preenchem o evento quando falta gente. minRealPlayers é a trava que importa: com 2, o evento só roda se houver pelo menos dois jogadores de verdade — os simulados completam, mas não fazem o evento sozinhos. onlyWhenNotFull="true" faz eles saírem de cena assim que jogadores reais chegam.
Vem desligado por padrão. É uma ferramenta de servidor novo, para os primeiros meses.
Troca de pontos
<pointExchange day="7" hour="14" itemId="57" rate="1"/>
Os pontos ganhos nos eventos viram item pelo comando .eventexchange. day vai de 1 (segunda) a 7 (domingo), hour de 0 a 23, rate é quantos itens saem por ponto. No exemplo, domingo às 14h o jogador troca ponto por adena, um para um.
Concentrar a troca num dia e horário cria um evento social por si só — todo mundo aparece no mesmo momento.
Um evento
<event enabled="false" id="2" type="TEAM_VS_TEAM"
minPlayers="2" runningTime="5" winPoints="15">
<schedule times="11:00,17:00,23:00"/>
<teams>
<team name="Gryffindor"><loc x="148387" y="46572" z="-3408"/></team>
<team name="Slytherin"><loc x="150567" y="46597" z="-3408"/></team>
</teams>
<rewards>
<onKill chance="5" itemId="57" max="2" min="1"/>
<winner><reward count="2" itemId="57"/></winner>
<draw><reward count="1" itemId="57"/></draw>
<top1><reward count="3" itemId="57"/></top1>
</rewards>
</event>
| Atributo | O que faz |
|---|---|
enabled | Liga só este evento. Os oito vêm desligados de fábrica. |
id | Identificador fixo do modo. Não mude. |
type | O modo: DEATHMATCH, TEAM_VS_TEAM, CAPTURE_THE_FLAG, BATTLE_ROYALE, HUNTING_GROUNDS, PARTY, SPOIL, FIGHT_BOSS. |
minPlayers | Mínimo de inscritos para o evento acontecer. Abaixo disso ele cancela. |
runningTime | Duração em minutos. |
winPoints | Pontos dados ao vencedor, gastos depois no .eventexchange. |
Agenda
<schedule times="11:00,17:00,23:00"/>
Horários separados por vírgula, formato 24h. Espalhe pelos três turnos: um evento de manhã, um à tarde e um à noite cobre fusos diferentes e dá ritmo ao dia.
Mapa
Muda conforme o modo:
respawnSpotscom váriosloc— usado no Deathmatch: o jogador renasce num ponto sorteado da lista.teamscom umloccada — usado no TvT e no CTF: define onde cada time nasce.doors— portas que o evento abre ou fecha durante a partida. Pode ficar vazio.
As coordenadas são x, y e z do mundo. Pegue com //loc dentro do jogo, no lugar exato onde quer o spawn.
Recompensas
| Tag | Quando paga |
|---|---|
onKill | A cada abate. chance é a probabilidade percentual, min e max a faixa de quantidade. |
winner | Para o time ou jogador vencedor. |
draw | Em caso de empate. |
top1, top2, top3 | Para os melhores colocados individualmente. |
winnerTop | Para o topo do time vencedor. |
Combinar onKill de chance baixa com prêmio de vitória alto funciona melhor do que o contrário: mantém o evento disputado até o fim, em vez de virar uma corrida por abates isolados.
Ligando o primeiro evento
- Escolha o modo e mude
enabledparatrue. - Ajuste
schedule timespara horários em que o seu servidor tem gente. - Confira
minPlayers— um valor alto demais faz o evento nunca acontecer. - Coloque as coordenadas do mapa com
//loc. - Defina as recompensas.
- Recarregue os dados.
Comece com um evento ligado e observe uma semana. Oito eventos ativos num servidor pequeno competem entre si e nenhum enche.
Cuidados
participantsPerIp="0"é sem limite. Num servidor com premiação boa, isso convida a múltiplas janelas.minPlayersé a diferença entre evento e frustração. Melhor cancelar por falta de gente do que rodar um TvT de 2 contra 1.- Coordenada errada teleporta para dentro da textura. Teste o spawn antes de abrir para o público.
increasePvp="true"mistura evento e ranking. Se você tem ranking de PvP com premiação, avalie deixar emfalsepara o evento não virar o caminho fácil.
Como isso conversa com o resto da base
Os comandos .register, .leave e .eventexchange são a interface do jogador com este motor — estão documentados na aba de comandos do catálogo. Os jogadores simulados compartilham configuração com fakesettings.xml, e a premiação usa os mesmos itens do sistema de recompensas em reward/.