All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bukkit.craftbukkit.chunkio.ChunkIOProvider Maven / Gradle / Ivy

package org.bukkit.craftbukkit.chunkio;

import net.minecraft.server.Chunk;
import net.minecraft.server.ChunkRegionLoader;
import net.minecraft.server.NBTTagCompound;
import org.bukkit.Server;
import org.bukkit.craftbukkit.util.AsynchronousExecutor;
import org.bukkit.craftbukkit.util.LongHash;

import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;

class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider {
  private final AtomicInteger threadNumber = new AtomicInteger(1);

  // async stuff
  public Chunk callStage1(QueuedChunk queuedChunk) throws RuntimeException {
    try {
      ChunkRegionLoader loader = queuedChunk.loader;
      Object[] data = loader.loadChunk(queuedChunk.world, queuedChunk.x, queuedChunk.z);

      if (data != null) {
        queuedChunk.compound = (NBTTagCompound) data[1];
        return (Chunk) data[0];
      }

      return null;
    } catch (IOException ex) {
      throw new RuntimeException(ex);
    }
  }

  // sync stuff
  public void callStage2(QueuedChunk queuedChunk, Chunk chunk) throws RuntimeException {
    if (chunk == null) {
      // If the chunk loading failed just do it synchronously (may generate)
      queuedChunk.provider.originalGetChunkAt(queuedChunk.x, queuedChunk.z);
      return;
    }

    queuedChunk.loader.loadEntities(chunk, queuedChunk.compound.getCompound("Level"), queuedChunk.world);
    chunk.setLastSaved(queuedChunk.provider.world.getTime());
    queuedChunk.provider.chunks.put(LongHash.toLong(queuedChunk.x, queuedChunk.z), chunk);
    chunk.addEntities();

    if (queuedChunk.provider.chunkProvider != null) {
      queuedChunk.provider.world.timings.syncChunkLoadStructuresTimer.startTiming(); // Spigot
      queuedChunk.provider.chunkProvider.recreateStructures(chunk, queuedChunk.x, queuedChunk.z);
      queuedChunk.provider.world.timings.syncChunkLoadStructuresTimer.stopTiming(); // Spigot
    }

    Server server = queuedChunk.provider.world.getServer();
    if (server != null) {
      server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkLoadEvent(chunk.bukkitChunk, false));
    }

    // Update neighbor counts
    for (int x = -2; x < 3; x++) {
      for (int z = -2; z < 3; z++) {
        if (x == 0 && z == 0) {
          continue;
        }

        Chunk neighbor = queuedChunk.provider.getChunkIfLoaded(chunk.locX + x, chunk.locZ + z);
        if (neighbor != null) {
          neighbor.setNeighborLoaded(-x, -z);
          chunk.setNeighborLoaded(x, z);
        }
      }
    }

    chunk.loadNearby(queuedChunk.provider, queuedChunk.provider, queuedChunk.x, queuedChunk.z);
  }

  public void callStage3(QueuedChunk queuedChunk, Chunk chunk, Runnable runnable) throws RuntimeException {
    runnable.run();
  }

  public Thread newThread(Runnable runnable) {
    Thread thread = new Thread(runnable, "Chunk I/O Executor Thread-" + threadNumber.getAndIncrement());
    thread.setDaemon(true);
    return thread;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy