From c6821f93c476b26ffeb1ec24e16d0b067b22b987 Mon Sep 17 00:00:00 2001 From: Bukkit/Spigot Date: Tue, 7 Jun 2011 03:22:03 -0400 Subject: [PATCH] Added ChunkSnapshot for efficient, thread-safe copies of Chunk data. Thanks mikeprimm! By: EvilSeph --- paper-api/src/main/java/org/bukkit/Chunk.java | 6 ++ .../main/java/org/bukkit/ChunkSnapshot.java | 84 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 paper-api/src/main/java/org/bukkit/ChunkSnapshot.java diff --git a/paper-api/src/main/java/org/bukkit/Chunk.java b/paper-api/src/main/java/org/bukkit/Chunk.java index 3315bbea30..637a3faca4 100644 --- a/paper-api/src/main/java/org/bukkit/Chunk.java +++ b/paper-api/src/main/java/org/bukkit/Chunk.java @@ -40,6 +40,12 @@ public interface Chunk { */ Block getBlock(int x, int y, int z); + /** + * Capture thread-safe read-only snapshot of chunk data + * @return ChunkSnapshot + */ + ChunkSnapshot getChunkSnapshot(); + Entity[] getEntities(); BlockState[] getTileEntities(); diff --git a/paper-api/src/main/java/org/bukkit/ChunkSnapshot.java b/paper-api/src/main/java/org/bukkit/ChunkSnapshot.java new file mode 100644 index 0000000000..6d7252449c --- /dev/null +++ b/paper-api/src/main/java/org/bukkit/ChunkSnapshot.java @@ -0,0 +1,84 @@ +package org.bukkit; + +/** + * Represents a static, thread-safe snapshot of chunk of blocks + * Purpose is to allow clean, efficient copy of a chunk data to be made, and then handed off for processing in another thread (e.g. map rendering) + */ +public interface ChunkSnapshot { + + /** + * Gets the X-coordinate of this chunk + * + * @return X-coordinate + */ + int getX(); + + /** + * Gets the Z-coordinate of this chunk + * + * @return Z-coordinate + */ + int getZ(); + + /** + * Gets name of the world containing this chunk + * + * @return Parent World Name + */ + String getWorldName(); + + /** + * Get block type for block at corresponding coordinate in the chunk + * + * @param x 0-15 + * @param y 0-127 + * @param z 0-15 + * @return 0-255 + */ + int getBlockTypeId(int x, int y, int z); + + /** + * Get block data for block at corresponding coordinate in the chunk + * + * @param x 0-15 + * @param y 0-127 + * @param z 0-15 + * @return 0-15 + */ + int getBlockData(int x, int y, int z); + + /** + * Get sky light level for block at corresponding coordinate in the chunk + * + * @param x 0-15 + * @param y 0-127 + * @param z 0-15 + * @return 0-15 + */ + int getBlockSkyLight(int x, int y, int z); + + /** + * Get light level emitted by block at corresponding coordinate in the chunk + * + * @param x 0-15 + * @param y 0-127 + * @param z 0-15 + * @return 0-15 + */ + int getBlockEmittedLight(int x, int y, int z); + + /** + * Gets the highest non-air coordinate at the given coordinates + * + * @param x X-coordinate of the blocks + * @param z Z-coordinate of the blocks + * @return Y-coordinate of the highest non-air block + */ + int getHighestBlockYAt(int x, int z); + + /** + * Get world full time when chunk snapshot was captured + * @return time in ticks + */ + long getCaptureFullTime(); +}