private void createOrLoadChunk(Vector3i chunkPos) {
    Chunk chunk = nearCache.get(chunkPos);
    if (chunk == null && !preparingChunks.contains(chunkPos)) {
      preparingChunks.add(chunkPos);
      pipeline.doTask(
          new AbstractChunkTask(chunkPos) {
            @Override
            public String getName() {
              return "Create or Load Chunk";
            }

            @Override
            public void run() {
              ChunkStore chunkStore = storageManager.loadChunkStore(getPosition());
              Chunk chunk;
              if (chunkStore == null) {
                chunk = new ChunkImpl(getPosition());
                generator.createChunk(chunk);
              } else {
                chunk = chunkStore.getChunk();
              }

              InternalLightProcessor.generateInternalLighting(chunk);
              chunk.deflate();
              readyChunks.offer(
                  new ReadyChunkInfo(chunk, createBatchBlockEventMappings(chunk), chunkStore));
            }
          });
    }
  }
  @Override
  public void purgeWorld() {
    ChunkMonitor.fireChunkProviderDisposed(this);
    pipeline.shutdown();
    unloadRequestTaskMaster.shutdown(new ChunkUnloadRequest(), true);
    lightMerger.shutdown();

    for (Chunk chunk : nearCache.values()) {
      if (chunk.isReady()) {
        worldEntity.send(new BeforeChunkUnload(chunk.getPosition()));
        storageManager.deactivateChunk(chunk);
        chunk.dispose();
      }
    }
    nearCache.clear();
    readyChunks.clear();
    sortedReadyChunks.clear();
    storageManager.deleteWorld();
    preparingChunks.clear();
    worldEntity.send(new PurgeWorldEvent());

    pipeline = new ChunkGenerationPipeline(new ChunkTaskRelevanceComparator());
    unloadRequestTaskMaster = TaskMaster.createFIFOTaskMaster("Chunk-Unloader", 8);
    lightMerger = new LightMerger<>(this);
    lightMerger.restart();
    ChunkMonitor.fireChunkProviderInitialized(this);

    for (ChunkRelevanceRegion chunkRelevanceRegion : regions.values()) {
      for (Vector3i pos : chunkRelevanceRegion.getCurrentRegion()) {
        createOrLoadChunk(pos);
      }
      chunkRelevanceRegion.setUpToDate();
    }
  }
 @Override
 public void shutdown() {
   pipeline.shutdown();
   unloadRequestTaskMaster.shutdown(new ChunkUnloadRequest(), true);
   lightMerger.shutdown();
 }
 public void restart() {
   pipeline.restart();
   unloadRequestTaskMaster.restart();
   lightMerger.restart();
 }