Game server · Agendamento · CASE 005
Engine Manager: eventos de mundo agendados
Eventos de mundo diários — zonas de farm e ondas de bosses — descritos em XML e executados por tarefas que se reagendam sozinhas.
Baseado no código-fonte do game server (Java, base aCis), desenvolvido por mim. O diagrama simplifica a arquitetura.
01
Problema
Abrir zonas especiais e ondas de bosses em horários fixos do dia, com spawns definidos por coordenadas, sem scripts manuais a cada janela.
02
Contexto
Eventos de mundo independentes do Event Manager: não exigem inscrição, rodam em paralelo e precisam conviver com comandos de admin a qualquer momento.
03
Solução proposta
O EngineManager lê engine.xml — horários (ex.: 12:15, 19:15 e 23:15), duração, contagem regressiva e spawns com ondas e respawn — em records imutáveis (EngineInfo, EngineNPC) e instancia cada engine por reflection. Cada AbstractEngineTask é um Runnable autoagendado: roda com tick de 1 s na janela, anuncia a contagem, executa o hook onProgress e, ao terminar, remove os NPCs e agenda a própria próxima janela.
04
Arquitetura
PartyFarm abre uma zona com dezenas de spawns durante a janela; WaveFarm libera a próxima onda de bosses quando todos da onda atual morrem e encerra quando não há mais ondas. O estado é volatile e run/stop/force são synchronized, mantendo o tick consistente com comandos de admin.
05
Tecnologias
- Java
- Records
- Reflection
- Agendamento
- XML
06
Trade-offs
Cada engine se reagenda sozinha
Sem scheduler central, adicionar engines é trivial; em troca, o controle de tempo fica distribuído entre as tarefas.
Configuração imutável em records
Leitura segura entre threads e reload previsível: recarregar para todas as tarefas e recria tudo.
Tick de 1 s
Precisão suficiente para anúncios e ondas, com custo desprezível por engine.
07
Resultados
- Eventos de mundo diários sem intervenção manual.
- Ondas de bosses com progressão automática.
- Novas engines com uma classe e um bloco de XML; comandos de admin para iniciar, parar e recarregar.