+ BoundingBoxType.registerTypes();
+ EventBus.subscribe(WorldLoaded.class, this::worldLoaded);
+ EventBus.subscribe(StructuresLoaded.class, this::structuresLoaded);
+ EventBus.subscribe(PlayerLoggedIn.class, this::playerLoggedIn);
+ EventBus.subscribe(PlayerLoggedOut.class, this::playerLoggedOut);
+ EventBus.subscribe(PlayerSubscribed.class, this::onPlayerSubscribed);
+ EventBus.subscribe(ServerTick.class, e -> serverTick());
+ }
+
+ protected void setSeed(long seed) {
+ this.seed = seed;
+ }
+
+ protected void setWorldSpawn(int spawnX, int spawnZ) {
+ this.spawnX = spawnX;
+ this.spawnZ = spawnZ;
+ }
+
+ private void worldLoaded(WorldLoaded event) {
+ DimensionId dimensionId = event.getDimensionId();
+ long seed = event.getSeed();
+ if (dimensionId == DimensionId.OVERWORLD) {
+ setSeed(seed);
+ setWorldSpawn(event.getSpawnX(), event.getSpawnZ());
+ }
+ Logger.info("create world dimension: %s (seed: %d)", dimensionId, seed);
+ }
+
+ private void structuresLoaded(StructuresLoaded event) {
+ DimensionId dimensionId = event.getDimensionId();
+ StructureProcessor structureProcessor = getStructureProcessor(dimensionId);
+ structureProcessor.process(event.getStructures());
+ }
+
+ private StructureProcessor getStructureProcessor(DimensionId dimensionId) {
+ StructureProcessor structureProcessor = structureProcessors.get(dimensionId);
+ if (structureProcessor == null) {
+ structureProcessor = new StructureProcessor(getOrCreateCache(dimensionId));
+ structureProcessors.put(dimensionId, structureProcessor);
+ }
+ return structureProcessor;
+ }
+
+ private void playerLoggedIn(PlayerLoggedIn event) {
+ if (seed == null || spawnX == null || spawnZ == null) {
+ return;
+ }
+ ServerPlayer player = event.getPlayer();
+ player.sendPacket(InitializeClient.getPayload(seed, spawnX, spawnZ));