aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-API-Patches/0179-Add-Heightmap-API.patch
blob: 73e1e8d46ffe75df39ed69444f7d96e55f82553b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
Date: Sat, 1 Dec 2018 19:00:36 -0800
Subject: [PATCH] Add Heightmap API

Changed to use upstream's heightmap API - Machine_Maker

diff --git a/src/main/java/com/destroystokyo/paper/HeightmapType.java b/src/main/java/com/destroystokyo/paper/HeightmapType.java
new file mode 100644
index 0000000000000000000000000000000000000000..709e44ea1b14ab6917501c928e689cc6cbdf4bb4
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/HeightmapType.java
@@ -0,0 +1,39 @@
+package com.destroystokyo.paper;
+
+import org.bukkit.*;
+
+/**
+ * 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.
+ *
+ * @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)}.
+ */
+@Deprecated
+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
index d5d67b3d84cd88ed0f858497e68535ec0162c700..432d5711b7ec34eafeb27df82d367612dfe1fe54 100644
--- a/src/main/java/org/bukkit/Location.java
+++ b/src/main/java/org/bukkit/Location.java
@@ -638,6 +638,47 @@ public class Location implements Cloneable, ConfigurationSerializable {
         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(HeightMap.WORLD_SURFACE);
+    }
+
+    /**
+     * 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
+     * @deprecated Use {@link org.bukkit.Location#toHighestLocation(HeightMap)}
+     */
+    @NotNull
+    @Deprecated
+    public Location toHighestLocation(@NotNull final com.destroystokyo.paper.HeightmapType heightmap) {
+        final Location ret = this.clone();
+        ret.setY(this.getWorld().getHighestBlockYAt(this, heightmap));
+        return ret;
+    }
+
+    /**
+     * 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)
+     */
+    @NotNull
+    public Location toHighestLocation(@NotNull final HeightMap 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
index 19060c7d9c74b9b2808103f3d5627444aece6ccb..f8e104d5e61e52c5fe658d7cda373f62424c7bea 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
@@ -160,6 +160,87 @@ public interface World extends PluginMessageRecipient, Metadatable, net.kyori.ad
     @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.
+     * <p>
+     * <b>implNote:</b> Implementations are recommended to use an iterative search as a fallback before resorting to
+     * throwing an {@code UnsupportedOperationException}.
+     * </p>
+     *
+     * @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.
+     * @deprecated Upstream has added support for this, use {@link World#getHighestBlockYAt(int, int, HeightMap)}
+     *
+     * @see com.destroystokyo.paper.HeightmapType
+     */
+    @Deprecated
+    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.
+     * <p>
+     * <b>implNote:</b> Implementations are recommended to use an iterative search as a fallback before resorting to
+     * throwing an {@code UnsupportedOperationException}.
+     * </p>
+     *
+     * @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.
+     * @deprecated Upstream has added support for this, use {@link World#getHighestBlockYAt(Location, HeightMap)}
+     * @see com.destroystokyo.paper.HeightmapType
+     */
+    @Deprecated
+    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.
+     * <p>
+     * <b>implNote:</b> Implementations are recommended to use an iterative search as a fallback before resorting to
+     * throwing an {@code UnsupportedOperationException}.
+     * </p>
+     * @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.
+     * @deprecated Upstream has added support for this, use {@link World#getHighestBlockAt(int, int, HeightMap)}
+     * @see com.destroystokyo.paper.HeightmapType
+     */
+    @Deprecated
+    @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.
+     * <p>
+     * <b>implNote:</b> Implementations are recommended to use an iterative search as a fallback before resorting to
+     * throwing an {@code UnsupportedOperationException}.
+     * </p>
+     * @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.
+     * @deprecated Upstream has added support for this, use {@link World#getHighestBlockAt(Location, HeightMap)}
+     * @see com.destroystokyo.paper.HeightmapType
+     */
+    @Deprecated
+    @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
+
     /**
      * Gets the highest coordinate corresponding to the {@link HeightMap} at the
      * given coordinates.