aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/api/0347-More-Projectile-API.patch
blob: ba63dbcd3bfce9526ac87f062143934f9cd444e7 (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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
Date: Wed, 26 May 2021 19:34:43 -0400
Subject: [PATCH] More Projectile API

Co-authored-by: Nassim Jahnke <nassim@njahnke.dev>

diff --git a/src/main/java/org/bukkit/entity/AbstractArrow.java b/src/main/java/org/bukkit/entity/AbstractArrow.java
index 839e5b7df49f42b5fec7729997bef3370ba36d80..b36298679d6d52d09fe4bb8e52e19e18f6df742a 100644
--- a/src/main/java/org/bukkit/entity/AbstractArrow.java
+++ b/src/main/java/org/bukkit/entity/AbstractArrow.java
@@ -130,17 +130,21 @@ public interface AbstractArrow extends Projectile {
      * Gets the ItemStack which will be picked up from this arrow.
      *
      * @return The picked up ItemStack
+     * @deprecated use {@link #getItemStack()}
      */
     @NotNull
     @ApiStatus.Experimental
+    @Deprecated(forRemoval = true, since = "1.20.4") // Paper
     public ItemStack getItem();
 
     /**
      * Sets the ItemStack which will be picked up from this arrow.
      *
      * @param item ItemStack set to be picked up
+     * @deprecated until 1.20.5 when the behavior is more defined
      */
     @ApiStatus.Experimental
+    @Deprecated // Paper - remove in 1.20.5
     public void setItem(@NotNull ItemStack item);
 
     /**
@@ -194,4 +198,44 @@ public interface AbstractArrow extends Projectile {
         CREATIVE_ONLY;
     }
     // Paper end
+
+    // Paper start - more projectile API
+    /**
+     * Gets the ItemStack for this arrow.
+     *
+     * @return The ItemStack, as if a player picked up the arrow
+     */
+    @NotNull
+    org.bukkit.inventory.ItemStack getItemStack();
+
+    /**
+     * Sets the amount of ticks this arrow has been alive in the world
+     * This is used to determine when the arrow should be automatically despawned.
+     *
+     * @param ticks lifetime ticks
+     */
+    void setLifetimeTicks(int ticks);
+
+    /**
+     * Gets how many ticks this arrow has been in the world for.
+     *
+     * @return ticks this arrow has been in the world
+     */
+    int getLifetimeTicks();
+
+    /**
+     * Gets the sound that is played when this arrow hits an entity.
+     *
+     * @return sound that plays
+     */
+    @NotNull
+    org.bukkit.Sound getHitSound();
+
+    /**
+     * Sets the sound that is played when this arrow hits an entity.
+     *
+     * @param sound sound that is played
+     */
+    void setHitSound(@NotNull org.bukkit.Sound sound);
+    // Paper end - more projectile API
 }
diff --git a/src/main/java/org/bukkit/entity/Firework.java b/src/main/java/org/bukkit/entity/Firework.java
index 0d31aa0b22cf1e849572294e2cfe38b48c9210af..217d348ad0bbef720b25d3b507a55ca8105b7731 100644
--- a/src/main/java/org/bukkit/entity/Firework.java
+++ b/src/main/java/org/bukkit/entity/Firework.java
@@ -16,6 +16,8 @@ public interface Firework extends Projectile {
 
     /**
      * Apply the provided meta to the fireworks
+     * <p>
+     * Adjusts detonation ticks automatically.
      *
      * @param meta The FireworkMeta to apply
      */
@@ -54,31 +56,39 @@ public interface Firework extends Projectile {
      * {@link #getMaxLife()}, the firework will detonate.
      *
      * @param ticks the ticks to set. Must be greater than or equal to 0
+     * @deprecated use {@link #setTicksFlown(int)}
      * @return true if the life was set, false if this firework has already detonated
      */
+    @Deprecated(forRemoval = true) // Paper
     boolean setLife(int ticks);
 
     /**
      * Get the ticks that this firework has been alive. When this value reaches
      * {@link #getMaxLife()}, the firework will detonate.
      *
+     * @deprecated use {@link #getTicksFlown()}
      * @return the life ticks
      */
+    @Deprecated(forRemoval = true) // Paper
     int getLife();
 
     /**
      * Set the time in ticks this firework will exist until it is detonated.
      *
      * @param ticks the ticks to set. Must be greater than 0
+     * @deprecated use {@link #setTicksToDetonate(int)}
      * @return true if the time was set, false if this firework has already detonated
      */
+    @Deprecated(forRemoval = true) // Paper
     boolean setMaxLife(int ticks);
 
     /**
      * Get the time in ticks this firework will exist until it is detonated.
      *
+     * @deprecated use {@link #getTicksToDetonate()}
      * @return the maximum life in ticks
      */
+    @Deprecated(forRemoval = true) // Paper
     int getMaxLife();
 
     /**
@@ -127,4 +137,52 @@ public interface Firework extends Projectile {
         return getAttachedTo();
     }
     // Paper end
+
+    // Paper start - Firework API
+    /**
+     * Gets the item used in the firework.
+     *
+     * @return firework item
+     */
+    @NotNull
+    public org.bukkit.inventory.ItemStack getItem();
+
+    /**
+     * Sets the item used in the firework.
+     * <p>
+     * Firework explosion effects are used from this item.
+     *
+     * @param itemStack item to set
+     */
+    void setItem(@org.jetbrains.annotations.Nullable org.bukkit.inventory.ItemStack itemStack);
+
+    /**
+     * Gets the number of ticks the firework has flown.
+     *
+     * @return ticks flown
+     */
+    int getTicksFlown();
+
+    /**
+     * Sets the number of ticks the firework has flown.
+     * Setting this greater than detonation ticks will cause the firework to explode.
+     *
+     * @param ticks ticks flown
+     */
+    void setTicksFlown(int ticks);
+
+    /**
+     * Gets the number of ticks the firework will detonate on.
+     *
+     * @return the tick to detonate on
+     */
+    int getTicksToDetonate();
+
+    /**
+     * Set the amount of ticks the firework will detonate on.
+     *
+     * @param ticks ticks to detonate on
+     */
+    void setTicksToDetonate(int ticks);
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/entity/FishHook.java b/src/main/java/org/bukkit/entity/FishHook.java
index 94e1a30ea1bc26821065a6d89c1f5669bd1d08ae..6ed83d3e4d23e0dc0e1b156a1ee221aaba5c7210 100644
--- a/src/main/java/org/bukkit/entity/FishHook.java
+++ b/src/main/java/org/bukkit/entity/FishHook.java
@@ -322,4 +322,20 @@ public interface FishHook extends Projectile {
          */
         BOBBING;
     }
+
+    // Paper start - More FishHook API
+    /**
+     * Get the number of ticks the hook needs to wait for a fish to bite.
+     *
+     * @return Number of ticks
+     */
+    int getWaitTime();
+
+    /**
+     * Sets the number of ticks the hook needs to wait for a fish to bite.
+     *
+     * @param ticks Number of ticks
+     */
+    void setWaitTime(int ticks);
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/entity/Projectile.java b/src/main/java/org/bukkit/entity/Projectile.java
index 06e3ad9cd8f39de0ef6ead794df1492415bc4302..c3933fb5cd9708826effeef2ad2f81c9f7900a37 100644
--- a/src/main/java/org/bukkit/entity/Projectile.java
+++ b/src/main/java/org/bukkit/entity/Projectile.java
@@ -12,6 +12,7 @@ public interface Projectile extends Entity {
      * Retrieve the shooter of this projectile.
      *
      * @return the {@link ProjectileSource} that shot this projectile
+     * @see #getOwnerUniqueId()
      */
     @Nullable
     public ProjectileSource getShooter();
@@ -41,4 +42,89 @@ public interface Projectile extends Entity {
      */
     @Deprecated(forRemoval = true)
     public void setBounce(boolean doesBounce);
+    // Paper start
+
+    /**
+     * Gets whether the projectile has left the
+     * hitbox of their shooter and can now hit entities.
+     *
+     * @return has left shooter's hitbox
+     */
+    boolean hasLeftShooter();
+
+    /**
+     * Sets whether the projectile has left the
+     * hitbox of their shooter and can now hit entities.
+     *
+     * This is recalculated each tick if the projectile has a shooter.
+     *
+     * @param leftShooter has left shooter's hitbox
+     */
+    void setHasLeftShooter(boolean leftShooter);
+
+    /**
+     * Gets whether the projectile has been
+     * shot into the world and has sent a projectile
+     * shot game event.
+     *
+     * @return has been shot into the world
+     */
+    boolean hasBeenShot();
+
+    /**
+     * Sets whether the projectile has been
+     * shot into the world and has sent a projectile
+     * shot game event in the next tick.
+     *
+     * Setting this to false will cause a game event
+     * to fire and the value to be set back to true.
+     *
+     * @param beenShot has been in shot into the world
+     */
+    void setHasBeenShot(boolean beenShot);
+
+    /**
+     * Gets whether this projectile can hit an entity.
+     * <p>
+     * This method returns true under the following conditions:
+     * <p>
+     * - The shooter can see the entity ({@link Player#canSee(Entity)}) <p>
+     * - The entity is alive and not a spectator <p>
+     * - The projectile has left the hitbox of the shooter ({@link #hasLeftShooter()})<p>
+     * - If this is an arrow with piercing, it has not pierced the entity already
+     *
+     * @param entity the entity to check if this projectile can hit
+     * @return true if this projectile can damage the entity, false otherwise
+     */
+    boolean canHitEntity(@org.jetbrains.annotations.NotNull Entity entity);
+
+    /**
+     * Makes this projectile hit a specific entity.
+     * This uses the current position of the projectile for the hit point.
+     * Using this method will result in {@link org.bukkit.event.entity.ProjectileHitEvent} being called.
+     * @param entity the entity to hit
+     * @see #hitEntity(Entity, org.bukkit.util.Vector)
+     * @see #canHitEntity(Entity) 
+     */
+    void hitEntity(@org.jetbrains.annotations.NotNull Entity entity);
+
+    /**
+     * Makes this projectile hit a specific entity from a specific point.
+     * Using this method will result in {@link org.bukkit.event.entity.ProjectileHitEvent} being called.
+     * @param entity the entity to hit
+     * @param vector the direction to hit from
+     * @see #hitEntity(Entity)
+     * @see #canHitEntity(Entity) 
+     */
+    void hitEntity(@org.jetbrains.annotations.NotNull Entity entity, @org.jetbrains.annotations.NotNull org.bukkit.util.Vector vector);
+
+    /**
+     * Gets the owner's UUID
+     *
+     * @return the owner's UUID, or null if not owned
+     * @see #getShooter()
+     */
+    @Nullable
+    java.util.UUID getOwnerUniqueId();
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/entity/ShulkerBullet.java b/src/main/java/org/bukkit/entity/ShulkerBullet.java
index 4623e0d767b343cbdc6fcf20b3b2ff7ff14863cf..dd69a68d1f005c25329bb0366d161ae9b061e108 100644
--- a/src/main/java/org/bukkit/entity/ShulkerBullet.java
+++ b/src/main/java/org/bukkit/entity/ShulkerBullet.java
@@ -18,4 +18,61 @@ public interface ShulkerBullet extends Projectile {
      * @param target the entity to target
      */
     void setTarget(@Nullable Entity target);
+    // Paper start
+    /**
+     * Gets the relative offset that this shulker bullet should move towards,
+     * note that this will change each tick as the skulker bullet approaches the target.
+     *
+     * @return target delta offset
+     */
+    @org.jetbrains.annotations.NotNull
+    org.bukkit.util.Vector getTargetDelta();
+
+
+    /**
+     * Sets the relative offset that this shulker bullet should move towards,
+     * note that this will change each tick as the skulker bullet approaches the target.
+     * This is usually relative towards their target.
+     *
+     * @param vector target
+     */
+    void setTargetDelta(@org.jetbrains.annotations.NotNull org.bukkit.util.Vector vector);
+
+    /**
+     * Gets the current movement direction.
+     * This is used to determine the next movement direction to ensure
+     * that the bullet does not move in the same direction.
+     *
+     * @return null or their current direction
+     */
+    @Nullable
+    org.bukkit.block.BlockFace getCurrentMovementDirection();
+
+    /**
+     * Set the current movement direction.
+     * This is used to determine the next movement direction to ensure
+     * that the bullet does not move in the same direction.
+     *
+     * Set to null to simply pick a random direction.
+     *
+     * @param movementDirection null or a direction
+     */
+    void setCurrentMovementDirection(@Nullable org.bukkit.block.BlockFace movementDirection);
+
+    /**
+     * Gets how many ticks this shulker bullet
+     * will attempt to move in its current direction.
+     *
+     * @return number of steps
+     */
+    int getFlightSteps();
+
+    /**
+     * Sets how many ticks this shulker bullet
+     * will attempt to move in its current direction.
+     *
+     * @param steps number of steps
+     */
+    void setFlightSteps(int steps);
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/entity/ThrownPotion.java b/src/main/java/org/bukkit/entity/ThrownPotion.java
index 7051e07b4e456aae0ec9e37808b59e5fa62a4027..225ac312613b9e8f3cf680819f2ebe350d1bf48a 100644
--- a/src/main/java/org/bukkit/entity/ThrownPotion.java
+++ b/src/main/java/org/bukkit/entity/ThrownPotion.java
@@ -32,12 +32,34 @@ public interface ThrownPotion extends ThrowableProjectile {
 
     /**
      * Set the ItemStack for this thrown potion.
-     * <p>
-     * The ItemStack must be of type {@link org.bukkit.Material#SPLASH_POTION}
-     * or {@link org.bukkit.Material#LINGERING_POTION}, otherwise an exception
-     * is thrown.
      *
      * @param item New ItemStack
      */
     public void setItem(@NotNull ItemStack item);
+
+    // Paper start - Projectile API
+    /**
+     * Gets a copy of the PotionMeta for this thrown potion.
+     * This includes what effects will be applied by this potion.
+     *
+     * @return potion meta
+     */
+    @NotNull
+    org.bukkit.inventory.meta.PotionMeta getPotionMeta();
+
+    /**
+     * Sets the PotionMeta of this thrown potion.
+     * This will modify the effects applied by this potion.
+     * <p>
+     * Note that the type of {@link #getItem()} is irrelevant
+     *
+     * @param meta potion meta
+     */
+    void setPotionMeta(@NotNull org.bukkit.inventory.meta.PotionMeta meta);
+
+    /**
+     * Splashes the potion at its current location.
+     */
+    void splash();
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/entity/Trident.java b/src/main/java/org/bukkit/entity/Trident.java
index c8015ff610e3c1222cb368ea1d8a0c2f3785d9c7..02584eced96944a551140f8150c65a7c0f4bb55e 100644
--- a/src/main/java/org/bukkit/entity/Trident.java
+++ b/src/main/java/org/bukkit/entity/Trident.java
@@ -38,5 +38,24 @@ public interface Trident extends AbstractArrow, ThrowableProjectile {
      * @throws IllegalArgumentException if the loyalty level is lower than 0 or greater than 127
      */
     void setLoyaltyLevel(int loyaltyLevel);
+
+    /**
+     * Gets if this trident has dealt damage to an
+     * entity yet or has hit the floor.
+     *
+     * If neither of these events have occurred yet, this will
+     * return false.
+     *
+     * @return has dealt damage
+     */
+    boolean hasDealtDamage();
+
+    /**
+     * Sets if this trident has dealt damage to an entity
+     * yet or has hit the floor.
+     *
+     * @param hasDealtDamage has dealt damage or hit the floor
+     */
+    void setHasDealtDamage(boolean hasDealtDamage);
 }
 // Paper end