2020-05-06 09:48:49 +00:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2019-04-11 03:36:31 +00:00
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
Date: Sat, 1 Dec 2018 19:00:36 -0800
Subject: [PATCH] Add Heightmap API
2020-02-09 00:32:48 +00:00
Deprecated 2020-02-08 MC 1.15.2
2019-04-11 03:36:31 +00:00
diff --git a/src/main/java/com/destroystokyo/paper/HeightmapType.java b/src/main/java/com/destroystokyo/paper/HeightmapType.java
new file mode 100644
2020-05-06 09:48:49 +00:00
index 0000000000000000000000000000000000000000..709e44ea1b14ab6917501c928e689cc6cbdf4bb4
2019-04-11 03:36:31 +00:00
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/HeightmapType.java
2020-02-09 00:32:48 +00:00
@@ -0,0 +1,39 @@
2019-04-11 03:36:31 +00:00
+package com.destroystokyo.paper;
+
2020-02-09 00:32:48 +00:00
+import org.bukkit.*;
2019-04-11 03:36:31 +00:00
+
+/**
+ * Enumeration of different heightmap types maintained by the server. Generally using these maps is much faster
+ * than using an iterative search for a block in a given x, z coordinate.
2020-02-09 00:32:48 +00:00
+ *
+ * @deprecated Upstream has added their own API for using the game heightmaps. See {@link org.bukkit.HeightMap} and the
+ * non-deprecated getHighestBlock methods on World such as {@link org.bukkit.World#getHighestBlockAt(Location, HeightMap)}.
2019-04-11 03:36:31 +00:00
+ */
2020-02-09 00:32:48 +00:00
+@Deprecated
2019-04-11 03:36:31 +00:00
+public enum HeightmapType {
+
+ /**
+ * The highest block used for lighting in the world. Also the block returned by {@link World#getHighestBlockYAt(int, int)}}
+ */
+ LIGHT_BLOCKING,
+
+ /**
+ * References the highest block in the world.
+ */
+ ANY,
+
+ /**
+ * References the highest solid block in a world.
+ */
+ SOLID,
+
+ /**
+ * References the highest solid or liquid block in a world.
+ */
+ SOLID_OR_LIQUID,
+
+ /**
+ * References the highest solid or liquid block in a world, excluding leaves.
+ */
+ SOLID_OR_LIQUID_NO_LEAVES;
+}
diff --git a/src/main/java/org/bukkit/Location.java b/src/main/java/org/bukkit/Location.java
2020-05-06 09:48:49 +00:00
index 77d9cd0a1f54b5eb233eddbcff1bfa76bc182e9a..5904750329a5c7061de6e4fe32335b0d4e6a5e04 100644
2019-04-11 03:36:31 +00:00
--- a/src/main/java/org/bukkit/Location.java
+++ b/src/main/java/org/bukkit/Location.java
2019-05-06 02:58:04 +00:00
@@ -638,6 +638,33 @@ public class Location implements Cloneable, ConfigurationSerializable {
2019-04-11 03:36:31 +00:00
return centerLoc;
}
+ // Paper start - Add heightmap api
+
+ /**
+ * Returns a copy of this location except with y = getWorld().getHighestBlockYAt(this.getBlockX(), this.getBlockZ())
+ * @return A copy of this location except with y = getWorld().getHighestBlockYAt(this.getBlockX(), this.getBlockZ())
+ * @throws NullPointerException if {{@link #getWorld()}} is {@code null}
+ */
+ @NotNull
+ public Location toHighestLocation() {
+ return this.toHighestLocation(com.destroystokyo.paper.HeightmapType.LIGHT_BLOCKING);
+ }
+
+ /**
+ * Returns a copy of this location except with y = getWorld().getHighestBlockYAt(this.getBlockX(), this.getBlockZ(), heightmap)
+ * @param heightmap The heightmap to use for finding the highest y location.
+ * @return A copy of this location except with y = getWorld().getHighestBlockYAt(this.getBlockX(), this.getBlockZ(), heightmap)
+ * @throws NullPointerException if {{@link #getWorld()}} is {@code null}
+ * @throws UnsupportedOperationException if {@link World#getHighestBlockYAt(int, int, com.destroystokyo.paper.HeightmapType)} does not support the specified heightmap
+ */
+ @NotNull
+ public Location toHighestLocation(@NotNull final com.destroystokyo.paper.HeightmapType heightmap) {
+ final Location ret = this.clone();
+ ret.setY(this.getWorld().getHighestBlockYAt(this, heightmap));
+ return ret;
+ }
+ // Paper end
+
/**
* Creates explosion at this location with given power
*
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
2020-06-25 09:27:25 +00:00
index e3d4da353e5f876f0456106b350838917f492051..143fcbcdbfad551cd4392f54cf189fe3bee41706 100644
2019-04-11 03:36:31 +00:00
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
2020-03-26 02:37:20 +00:00
@@ -160,6 +160,87 @@ public interface World extends PluginMessageRecipient, Metadatable {
2019-04-11 03:36:31 +00:00
@NotNull
public Block getHighestBlockAt(@NotNull Location location);
+ // Paper start - Add heightmap API
+ /**
+ * Returns the highest block's y-coordinate at the specified block coordinates that match the specified heightmap's conditions.
2019-04-14 11:22:38 +00:00
+ * <p>
+ * <b>implNote:</b> Implementations are recommended to use an iterative search as a fallback before resorting to
+ * throwing an {@code UnsupportedOperationException}.
+ * </p>
+ *
2019-04-11 03:36:31 +00:00
+ * @param x The block's x-coordinate.
+ * @param z The block's z-coordinate.
+ * @param heightmap The specified heightmap to use. See {@link com.destroystokyo.paper.HeightmapType}
+ * @return The highest block's y-coordinate at (x, z) that matches the specified heightmap's conditions.
+ * @throws UnsupportedOperationException If the heightmap type is not supported.
2020-02-09 00:32:48 +00:00
+ * @deprecated Upstream has added support for this, use {@link World#getHighestBlockYAt(int, int, HeightMap)}
2019-04-14 11:22:38 +00:00
+ *
2019-04-11 03:36:31 +00:00
+ * @see com.destroystokyo.paper.HeightmapType
+ */
2020-02-09 00:32:48 +00:00
+ @Deprecated
2019-04-11 03:36:31 +00:00
+ public int getHighestBlockYAt(int x, int z, @NotNull com.destroystokyo.paper.HeightmapType heightmap) throws UnsupportedOperationException;
+
+ /**
+ * Returns the highest block's y-coordinate at the specified block coordinates that match the specified heightmap's conditions.
+ * Note that the y-coordinate of the specified location is ignored.
2019-04-14 11:22:38 +00:00
+ * <p>
+ * <b>implNote:</b> Implementations are recommended to use an iterative search as a fallback before resorting to
+ * throwing an {@code UnsupportedOperationException}.
+ * </p>
+ *
2019-04-11 03:36:31 +00:00
+ * @param location The specified block coordinates.
+ * @param heightmap The specified heightmap to use. See {@link com.destroystokyo.paper.HeightmapType}
+ * @return The highest block's y-coordinate at {@code location} that matches the specified heightmap's conditions.
+ * @throws UnsupportedOperationException If the heightmap type is not supported.
2020-02-09 00:32:48 +00:00
+ * @deprecated Upstream has added support for this, use {@link World#getHighestBlockYAt(Location, HeightMap)}
2019-04-11 03:36:31 +00:00
+ * @see com.destroystokyo.paper.HeightmapType
+ */
2020-02-09 00:32:48 +00:00
+ @Deprecated
2019-04-11 03:36:31 +00:00
+ default int getHighestBlockYAt(@NotNull Location location, @NotNull com.destroystokyo.paper.HeightmapType heightmap) throws UnsupportedOperationException {
+ return this.getHighestBlockYAt(location.getBlockX(), location.getBlockZ(), heightmap);
+ }
+
+ /**
+ * Returns the highest {@link Block} at the specified block coordinates that match the specified heightmap's conditions.
2019-04-14 11:22:38 +00:00
+ * <p>
+ * <b>implNote:</b> Implementations are recommended to use an iterative search as a fallback before resorting to
+ * throwing an {@code UnsupportedOperationException}.
+ * </p>
2019-04-11 03:36:31 +00:00
+ * @param x The block's x-coordinate.
+ * @param z The block's z-coordinate.
+ * @param heightmap The specified heightmap to use. See {@link com.destroystokyo.paper.HeightmapType}
+ * @return The highest {@link Block} at (x, z) that matches the specified heightmap's conditions.
+ * @throws UnsupportedOperationException If the heightmap type is not supported.
2020-02-09 00:32:48 +00:00
+ * @deprecated Upstream has added support for this, use {@link World#getHighestBlockAt(int, int, HeightMap)}
2019-04-11 03:36:31 +00:00
+ * @see com.destroystokyo.paper.HeightmapType
+ */
2020-02-09 00:32:48 +00:00
+ @Deprecated
2019-04-11 03:36:31 +00:00
+ @NotNull
+ default Block getHighestBlockAt(int x, int z, @NotNull com.destroystokyo.paper.HeightmapType heightmap) throws UnsupportedOperationException {
+ return this.getBlockAt(x, this.getHighestBlockYAt(x, z, heightmap), z);
+ }
+
+ /**
+ * Returns the highest {@link Block} at the specified block coordinates that match the specified heightmap's conditions.
+ * Note that the y-coordinate of the specified location is ignored.
2019-04-14 11:22:38 +00:00
+ * <p>
+ * <b>implNote:</b> Implementations are recommended to use an iterative search as a fallback before resorting to
+ * throwing an {@code UnsupportedOperationException}.
+ * </p>
2019-04-11 03:36:31 +00:00
+ * @param location The specified block coordinates.
+ * @param heightmap The specified heightmap to use. See {@link com.destroystokyo.paper.HeightmapType}
+ * @return The highest {@link Block} at {@code location} that matches the specified heightmap's conditions.
+ * @throws UnsupportedOperationException If the heightmap type is not supported.
2020-02-09 00:32:48 +00:00
+ * @deprecated Upstream has added support for this, use {@link World#getHighestBlockAt(Location, HeightMap)}
2019-04-11 03:36:31 +00:00
+ * @see com.destroystokyo.paper.HeightmapType
+ */
2020-02-09 00:32:48 +00:00
+ @Deprecated
2019-04-11 03:36:31 +00:00
+ @NotNull
+ default Block getHighestBlockAt(@NotNull Location location, @NotNull com.destroystokyo.paper.HeightmapType heightmap) throws UnsupportedOperationException {
+ return this.getHighestBlockAt(location.getBlockX(), location.getBlockZ(), heightmap);
+ }
+ // Paper end
+
/**
2020-02-09 00:32:48 +00:00
* Gets the highest coordinate corresponding to the {@link HeightMap} at the
* given coordinates.