even MOOOOOOOOOOOOAAAAAAAAAAAAAAAARRRRRRRRRRRRR patches

This commit is contained in:
Jake 2021-11-24 12:43:28 -08:00 committed by MiniDigger | Martin
parent 1cb76e15be
commit 6ccc23f457
37 changed files with 62 additions and 60 deletions

View file

@ -0,0 +1,23 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: kennytv <jahnke.nassim@gmail.com>
Date: Fri, 26 Mar 2021 11:23:27 +0100
Subject: [PATCH] Expose protocol version
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
index bcd10b2c9255d778b678310febf1937301d01a50..6dbd520182b1e7713a68baad09b7f613424ef619 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
@@ -154,5 +154,12 @@ public interface UnsafeValues {
* @return the itemstack rarity
*/
public io.papermc.paper.inventory.ItemRarity getItemStackRarity(ItemStack itemStack);
+
+ /**
+ * Returns the server's protocol version.
+ *
+ * @return the server's protocol version
+ */
+ int getProtocolVersion();
// Paper end
}

View file

@ -0,0 +1,407 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
Date: Thu, 1 Apr 2021 00:34:41 -0700
Subject: [PATCH] Allow for Component suggestion tooltips in
AsyncTabCompleteEvent
diff --git a/src/main/java/com/destroystokyo/paper/event/server/AsyncTabCompleteEvent.java b/src/main/java/com/destroystokyo/paper/event/server/AsyncTabCompleteEvent.java
index 619ed37169c126a8c75d02699a04728bac49d10d..4cd97cb102e1ec53b3fe1a451b65b4b640fde099 100644
--- a/src/main/java/com/destroystokyo/paper/event/server/AsyncTabCompleteEvent.java
+++ b/src/main/java/com/destroystokyo/paper/event/server/AsyncTabCompleteEvent.java
@@ -24,6 +24,11 @@
package com.destroystokyo.paper.event.server;
import com.google.common.collect.ImmutableList;
+import io.papermc.paper.util.TransformingRandomAccessList;
+import net.kyori.adventure.text.Component;
+import net.kyori.examination.Examinable;
+import net.kyori.examination.ExaminableProperty;
+import net.kyori.examination.string.StringExaminer;
import org.apache.commons.lang.Validate;
import org.bukkit.Location;
import org.bukkit.command.Command;
@@ -34,6 +39,7 @@ import org.bukkit.event.HandlerList;
import java.util.ArrayList;
import java.util.List;
+import java.util.stream.Stream;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -48,15 +54,29 @@ public class AsyncTabCompleteEvent extends Event implements Cancellable {
private final boolean isCommand;
@Nullable
private final Location loc;
- @NotNull private List<String> completions;
+ private final List<Completion> completions = new ArrayList<>();
+ private final List<String> stringCompletions = new TransformingRandomAccessList<>(
+ this.completions,
+ Completion::suggestion,
+ Completion::completion
+ );
private boolean cancelled;
private boolean handled = false;
private boolean fireSyncHandler = true;
+ public AsyncTabCompleteEvent(@NotNull CommandSender sender, @NotNull String buffer, boolean isCommand, @Nullable Location loc) {
+ super(true);
+ this.sender = sender;
+ this.buffer = buffer;
+ this.isCommand = isCommand;
+ this.loc = loc;
+ }
+
+ @Deprecated
public AsyncTabCompleteEvent(@NotNull CommandSender sender, @NotNull List<String> completions, @NotNull String buffer, boolean isCommand, @Nullable Location loc) {
super(true);
this.sender = sender;
- this.completions = completions;
+ this.completions.addAll(fromStrings(completions));
this.buffer = buffer;
this.isCommand = isCommand;
this.loc = loc;
@@ -84,7 +104,7 @@ public class AsyncTabCompleteEvent extends Event implements Cancellable {
*/
@NotNull
public List<String> getCompletions() {
- return completions;
+ return this.stringCompletions;
}
/**
@@ -98,8 +118,42 @@ public class AsyncTabCompleteEvent extends Event implements Cancellable {
* @param completions the new completions
*/
public void setCompletions(@NotNull List<String> completions) {
+ if (completions == this.stringCompletions) {
+ return;
+ }
Validate.notNull(completions);
- this.completions = new ArrayList<>(completions);
+ this.completions.clear();
+ this.completions.addAll(fromStrings(completions));
+ }
+
+ /**
+ * The list of {@link Completion completions} which will be offered to the sender, in order.
+ * This list is mutable and reflects what will be offered.
+ * <p>
+ * If this collection is not empty after the event is fired, then
+ * the standard process of calling {@link Command#tabComplete(CommandSender, String, String[])}
+ * or current player names will not be called.
+ *
+ * @return a list of offered completions
+ */
+ public @NotNull List<Completion> completions() {
+ return this.completions;
+ }
+
+ /**
+ * Set the {@link Completion completions} offered, overriding any already set.
+ * If this collection is not empty after the event is fired, then
+ * the standard process of calling {@link Command#tabComplete(CommandSender, String, String[])}
+ * or current player names will not be called.
+ * <p>
+ * The passed collection will be cloned to a new List. You must call {{@link #completions()}} to mutate from here
+ *
+ * @param newCompletions the new completions
+ */
+ public void completions(final @NotNull List<Completion> newCompletions) {
+ Validate.notNull(newCompletions, "new completions");
+ this.completions.clear();
+ this.completions.addAll(newCompletions);
}
/**
@@ -174,4 +228,102 @@ public class AsyncTabCompleteEvent extends Event implements Cancellable {
public static HandlerList getHandlerList() {
return handlers;
}
+
+ private static @NotNull List<Completion> fromStrings(final @NotNull List<String> strings) {
+ final List<Completion> list = new ArrayList<>();
+ for (final String it : strings) {
+ list.add(new CompletionImpl(it, null));
+ }
+ return list;
+ }
+
+ /**
+ * A rich tab completion, consisting of a string suggestion, and a nullable {@link Component} tooltip.
+ */
+ public interface Completion extends Examinable {
+ /**
+ * Get the suggestion string for this {@link Completion}.
+ *
+ * @return suggestion string
+ */
+ @NotNull String suggestion();
+
+ /**
+ * Get the suggestion tooltip for this {@link Completion}.
+ *
+ * @return tooltip component
+ */
+ @Nullable Component tooltip();
+
+ @Override
+ default @NotNull Stream<? extends ExaminableProperty> examinableProperties() {
+ return Stream.of(ExaminableProperty.of("suggestion", this.suggestion()), ExaminableProperty.of("tooltip", this.tooltip()));
+ }
+
+ /**
+ * Create a new {@link Completion} from a suggestion string.
+ *
+ * @param suggestion suggestion string
+ * @return new completion instance
+ */
+ static @NotNull Completion completion(final @NotNull String suggestion) {
+ return new CompletionImpl(suggestion, null);
+ }
+
+ /**
+ * Create a new {@link Completion} from a suggestion string and a tooltip {@link Component}.
+ *
+ * <p>If the provided component is null, the suggestion will not have a tooltip.</p>
+ *
+ * @param suggestion suggestion string
+ * @param tooltip tooltip component, or null
+ * @return new completion instance
+ */
+ static @NotNull Completion completion(final @NotNull String suggestion, final @Nullable Component tooltip) {
+ return new CompletionImpl(suggestion, tooltip);
+ }
+ }
+
+ static final class CompletionImpl implements Completion {
+ private final String suggestion;
+ private final Component tooltip;
+
+ CompletionImpl(final @NotNull String suggestion, final @Nullable Component tooltip) {
+ this.suggestion = suggestion;
+ this.tooltip = tooltip;
+ }
+
+ @Override
+ public @NotNull String suggestion() {
+ return this.suggestion;
+ }
+
+ @Override
+ public @Nullable Component tooltip() {
+ return this.tooltip;
+ }
+
+ @Override
+ public boolean equals(final @Nullable Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || this.getClass() != o.getClass()) {
+ return false;
+ }
+ final CompletionImpl that = (CompletionImpl) o;
+ return this.suggestion.equals(that.suggestion)
+ && java.util.Objects.equals(this.tooltip, that.tooltip);
+ }
+
+ @Override
+ public int hashCode() {
+ return java.util.Objects.hash(this.suggestion, this.tooltip);
+ }
+
+ @Override
+ public @NotNull String toString() {
+ return StringExaminer.simpleEscaping().examine(this);
+ }
+ }
}
diff --git a/src/main/java/io/papermc/paper/util/TransformingRandomAccessList.java b/src/main/java/io/papermc/paper/util/TransformingRandomAccessList.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f560a51277ccbd46a9142cfa057d276118c1c7b
--- /dev/null
+++ b/src/main/java/io/papermc/paper/util/TransformingRandomAccessList.java
@@ -0,0 +1,169 @@
+package io.papermc.paper.util;
+
+import org.checkerframework.checker.nullness.qual.NonNull;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.AbstractList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.RandomAccess;
+import java.util.function.Function;
+import java.util.function.Predicate;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Modified version of the Guava class with the same name to support add operations.
+ *
+ * @param <F> backing list element type
+ * @param <T> transformed list element type
+ */
+public final class TransformingRandomAccessList<F, T> extends AbstractList<T> implements RandomAccess {
+ final List<F> fromList;
+ final Function<? super F, ? extends T> toFunction;
+ final Function<? super T, ? extends F> fromFunction;
+
+ /**
+ * Create a new {@link TransformingRandomAccessList}.
+ *
+ * @param fromList backing list
+ * @param toFunction function mapping backing list element type to transformed list element type
+ * @param fromFunction function mapping transformed list element type to backing list element type
+ */
+ public TransformingRandomAccessList(
+ final @NonNull List<F> fromList,
+ final @NonNull Function<? super F, ? extends T> toFunction,
+ final @NonNull Function<? super T, ? extends F> fromFunction
+ ) {
+ this.fromList = checkNotNull(fromList);
+ this.toFunction = checkNotNull(toFunction);
+ this.fromFunction = checkNotNull(fromFunction);
+ }
+
+ @Override
+ public void clear() {
+ this.fromList.clear();
+ }
+
+ @Override
+ public T get(int index) {
+ return this.toFunction.apply(this.fromList.get(index));
+ }
+
+ @Override
+ public @NotNull Iterator<T> iterator() {
+ return this.listIterator();
+ }
+
+ @Override
+ public @NotNull ListIterator<T> listIterator(int index) {
+ return new TransformedListIterator<F, T>(this.fromList.listIterator(index)) {
+ @Override
+ T transform(F from) {
+ return TransformingRandomAccessList.this.toFunction.apply(from);
+ }
+
+ @Override
+ F transformBack(T from) {
+ return TransformingRandomAccessList.this.fromFunction.apply(from);
+ }
+ };
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return this.fromList.isEmpty();
+ }
+
+ @Override
+ public boolean removeIf(Predicate<? super T> filter) {
+ checkNotNull(filter);
+ return this.fromList.removeIf(element -> filter.test(this.toFunction.apply(element)));
+ }
+
+ @Override
+ public T remove(int index) {
+ return this.toFunction.apply(this.fromList.remove(index));
+ }
+
+ @Override
+ public int size() {
+ return this.fromList.size();
+ }
+
+ @Override
+ public T set(int i, T t) {
+ return this.toFunction.apply(this.fromList.set(i, this.fromFunction.apply(t)));
+ }
+
+ @Override
+ public void add(int i, T t) {
+ this.fromList.add(i, this.fromFunction.apply(t));
+ }
+
+ static abstract class TransformedListIterator<F, T> implements ListIterator<T>, Iterator<T> {
+ final Iterator<F> backingIterator;
+
+ TransformedListIterator(ListIterator<F> backingIterator) {
+ this.backingIterator = checkNotNull((Iterator<F>) backingIterator);
+ }
+
+ private ListIterator<F> backingIterator() {
+ return cast(this.backingIterator);
+ }
+
+ static <A> ListIterator<A> cast(Iterator<A> iterator) {
+ return (ListIterator<A>) iterator;
+ }
+
+ @Override
+ public final boolean hasPrevious() {
+ return this.backingIterator().hasPrevious();
+ }
+
+ @Override
+ public final T previous() {
+ return this.transform(this.backingIterator().previous());
+ }
+
+ @Override
+ public final int nextIndex() {
+ return this.backingIterator().nextIndex();
+ }
+
+ @Override
+ public final int previousIndex() {
+ return this.backingIterator().previousIndex();
+ }
+
+ @Override
+ public void set(T element) {
+ this.backingIterator().set(this.transformBack(element));
+ }
+
+ @Override
+ public void add(T element) {
+ this.backingIterator().add(this.transformBack(element));
+ }
+
+ abstract T transform(F from);
+
+ abstract F transformBack(T to);
+
+ @Override
+ public final boolean hasNext() {
+ return this.backingIterator.hasNext();
+ }
+
+ @Override
+ public final T next() {
+ return this.transform(this.backingIterator.next());
+ }
+
+ @Override
+ public final void remove() {
+ this.backingIterator.remove();
+ }
+ }
+}
diff --git a/src/test/java/org/bukkit/AnnotationTest.java b/src/test/java/org/bukkit/AnnotationTest.java
index 61441e56da69ee8cb92a2b1239f5406425a8344d..b4f1d5034db98b021225bb082915bf4c463aaf52 100644
--- a/src/test/java/org/bukkit/AnnotationTest.java
+++ b/src/test/java/org/bukkit/AnnotationTest.java
@@ -48,6 +48,8 @@ public class AnnotationTest {
// Generic functional interface
"org/bukkit/util/Consumer",
// Paper start
+ "io/papermc/paper/util/TransformingRandomAccessList",
+ "io/papermc/paper/util/TransformingRandomAccessList$TransformedListIterator",
// Timings history is broken in terms of nullability due to guavas Function defining that the param is NonNull
"co/aikar/timings/TimingHistory$2",
"co/aikar/timings/TimingHistory$2$1",

View file

@ -0,0 +1,26 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Thu, 8 Apr 2021 17:36:15 -0700
Subject: [PATCH] add isDeeplySleeping to HumanEntity
diff --git a/src/main/java/org/bukkit/entity/HumanEntity.java b/src/main/java/org/bukkit/entity/HumanEntity.java
index aae6331de24c1a65e3f708cfdc3890364bc8e681..28d1ff809e44bda0324ffac957c1d455be02e783 100644
--- a/src/main/java/org/bukkit/entity/HumanEntity.java
+++ b/src/main/java/org/bukkit/entity/HumanEntity.java
@@ -324,6 +324,15 @@ public interface HumanEntity extends LivingEntity, AnimalTamer, InventoryHolder
*/
public void setCooldown(@NotNull Material material, int ticks);
+ // Paper start
+ /**
+ * If the player has slept enough to count towards passing the night.
+ *
+ * @return true if the player has slept enough
+ */
+ public boolean isDeeplySleeping();
+ // Paper end
+
/**
* Get the sleep ticks of the player. This value may be capped.
*

View file

@ -0,0 +1,44 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Thu, 22 Apr 2021 16:45:15 -0700
Subject: [PATCH] add consumeFuel to FurnaceBurnEvent
diff --git a/src/main/java/org/bukkit/event/inventory/FurnaceBurnEvent.java b/src/main/java/org/bukkit/event/inventory/FurnaceBurnEvent.java
index bc71bc2d3ace0d19d730c09f05f9e0655bcee8f5..caef53d0f6546516fa7aabb2cb3abed70808b3ba 100644
--- a/src/main/java/org/bukkit/event/inventory/FurnaceBurnEvent.java
+++ b/src/main/java/org/bukkit/event/inventory/FurnaceBurnEvent.java
@@ -16,6 +16,7 @@ public class FurnaceBurnEvent extends BlockEvent implements Cancellable {
private int burnTime;
private boolean cancelled;
private boolean burning;
+ private boolean consumeFuel = true; // Paper
public FurnaceBurnEvent(@NotNull final Block furnace, @NotNull final ItemStack fuel, final int burnTime) {
super(furnace);
@@ -70,6 +71,25 @@ public class FurnaceBurnEvent extends BlockEvent implements Cancellable {
public void setBurning(boolean burning) {
this.burning = burning;
}
+ // Paper start
+ /**
+ * Gets whether the furnace's fuel will be consumed or not.
+ *
+ * @return whether the furnace's fuel will be consumed
+ */
+ public boolean willConsumeFuel() {
+ return consumeFuel;
+ }
+
+ /**
+ * Sets whether the furnace's fuel will be consumed or not.
+ *
+ * @param consumeFuel true to consume the fuel
+ */
+ public void setConsumeFuel(boolean consumeFuel) {
+ this.consumeFuel = consumeFuel;
+ }
+ // Paper end
@Override
public boolean isCancelled() {

View file

@ -0,0 +1,43 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Thu, 22 Apr 2021 00:28:20 -0700
Subject: [PATCH] add get-set drop chance to EntityEquipment
diff --git a/src/main/java/org/bukkit/inventory/EntityEquipment.java b/src/main/java/org/bukkit/inventory/EntityEquipment.java
index d5b50a4a954fed35d37f03f1a277cc173ca106df..3f2f5beadfd6df0aaab5853783001ec2cca7a819 100644
--- a/src/main/java/org/bukkit/inventory/EntityEquipment.java
+++ b/src/main/java/org/bukkit/inventory/EntityEquipment.java
@@ -406,4 +406,32 @@ public interface EntityEquipment {
*/
@Nullable
Entity getHolder();
+ // Paper start
+ /**
+ * Gets the drop chance of specified slot.
+ *
+ * <ul>
+ * <li>A drop chance of 0.0F will never drop
+ * <li>A drop chance of 1.0F will always drop
+ * </ul>
+ *
+ * @param slot the slot to get the drop chance of
+ * @return the drop chance for the slot
+ */
+ float getDropChance(@NotNull EquipmentSlot slot);
+
+ /**
+ * Sets the drop chance of the specified slot.
+ *
+ * <ul>
+ * <li>A drop chance of 0.0F will never drop
+ * <li>A drop chance of 1.0F will always drop
+ * </ul>
+ *
+ * @param slot the slot to set the drop chance of
+ * @param chance the drop chance for the slot
+ * @throws UnsupportedOperationException when called on non-{@link Mob} entities
+ */
+ void setDropChance(@NotNull EquipmentSlot slot, float chance);
+ // Paper end
}

View file

@ -0,0 +1,58 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Wed, 21 Apr 2021 15:58:25 -0700
Subject: [PATCH] Added PlayerDeepSleepEvent
diff --git a/src/main/java/io/papermc/paper/event/player/PlayerDeepSleepEvent.java b/src/main/java/io/papermc/paper/event/player/PlayerDeepSleepEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..e3ee540bb0a5bc578b148fbcf8b5e39ab9c8575c
--- /dev/null
+++ b/src/main/java/io/papermc/paper/event/player/PlayerDeepSleepEvent.java
@@ -0,0 +1,46 @@
+package io.papermc.paper.event.player;
+
+import org.bukkit.entity.Player;
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.player.PlayerEvent;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Called when a player has slept long enough
+ * to count as passing the night/storm.
+ * <p>
+ * Cancelling this event will prevent the player from being counted as deeply sleeping
+ * unless they exit and re-enter the bed.
+ */
+public class PlayerDeepSleepEvent extends PlayerEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
+ private boolean cancelled;
+
+ public PlayerDeepSleepEvent(@NotNull Player player) {
+ super(player);
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return cancelled;
+ }
+
+ @Override
+ public void setCancelled(boolean cancel) {
+ this.cancelled = cancel;
+ }
+
+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
+}

View file

@ -0,0 +1,125 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Tue, 7 Jul 2020 10:53:22 -0700
Subject: [PATCH] More World API
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
index 49cbc8c1f05f2d48177f1b8fec25e2e1439be0d8..5f9daafea35f9763189e3436eaf20c975158e712 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
@@ -3498,6 +3498,114 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
@Nullable
public Location locateNearestStructure(@NotNull Location origin, @NotNull StructureType structureType, int radius, boolean findUnexplored);
+ // Paper start
+ /**
+ * Locates the nearest biome based on an origin, biome type, and radius to search.
+ * Step defaults to {@code 8}.
+ *
+ * @param origin Origin location
+ * @param biome Biome to find
+ * @param radius radius to search
+ * @return Location of biome or null if not found in specified radius
+ */
+ @Nullable
+ Location locateNearestBiome(@NotNull Location origin, @NotNull Biome biome, int radius);
+
+ /**
+ * Locates the nearest biome based on an origin, biome type, and radius to search
+ * and step
+ *
+ * @param origin Origin location
+ * @param biome Biome to find
+ * @param radius radius to search
+ * @param step Search step 1 would mean checking every block, 8 would be every 8th block
+ * @return Location of biome or null if not found in specified radius
+ */
+ @Nullable
+ Location locateNearestBiome(@NotNull Location origin, @NotNull Biome biome, int radius, int step);
+
+ /**
+ * Checks if the world:
+ * <ul>
+ * <li>evaporates water</li>
+ * <li>dries sponges</li>
+ * <li>has lava spread faster and further</li>
+ * </ul>
+ *
+ * @return true if ultrawarm, false if not
+ * @deprecated use {@link #isUltraWarm()}
+ */
+ @Deprecated
+ boolean isUltrawarm();
+
+ /**
+ * Gets the coordinate scaling of this world.
+ *
+ * @return the coordinate scale
+ */
+ double getCoordinateScale();
+
+ /**
+ * Checks if the world has skylight access
+ *
+ * @return whether there is skylight
+ * @deprecated use {@link #hasSkyLight()}
+ */
+ @Deprecated
+ boolean hasSkylight();
+
+ /**
+ * Checks if the world has a bedrock ceiling
+ *
+ * @return whether the world has a bedrock ceiling
+ * @deprecated use {@link #hasCeiling()}
+ */
+ @Deprecated
+ boolean hasBedrockCeiling();
+
+ /**
+ * Checks if beds work
+ *
+ * @return whether beds work
+ * @deprecated use {@link #isBedWorks()}
+ */
+ @Deprecated
+ boolean doesBedWork();
+
+ /**
+ * Checks if respawn anchors work
+ *
+ * @return whether respawn anchors work
+ * @deprecated use {@link #isRespawnAnchorWorks()}
+ */
+ @Deprecated
+ boolean doesRespawnAnchorWork();
+
+ /**
+ * Checks if this world has a fixed time
+ *
+ * @return whether this world has fixed time
+ */
+ boolean isFixedTime();
+
+ /**
+ * Gets the collection of materials that burn infinitely in this world.
+ *
+ * @return the materials that will forever stay lit by fire
+ */
+ @NotNull
+ Collection<Material> getInfiniburn();
+
+ /**
+ * Posts a specified game event at a location
+ *
+ * @param sourceEntity optional source entity
+ * @param gameEvent the game event to post
+ * @param position the position in the world where to post the event to listeners
+ */
+ void sendGameEvent(@Nullable Entity sourceEntity, @NotNull GameEvent gameEvent, @NotNull Vector position);
+ // Paper end
+
// Spigot start
/**
* Returns the view distance used for this world.

View file

@ -0,0 +1,131 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Thu, 24 Dec 2020 12:27:49 -0800
Subject: [PATCH] Added PlayerBedFailEnterEvent
diff --git a/src/main/java/io/papermc/paper/event/player/PlayerBedFailEnterEvent.java b/src/main/java/io/papermc/paper/event/player/PlayerBedFailEnterEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..e0028733615ddc9e34359f673ca1c3cadb133948
--- /dev/null
+++ b/src/main/java/io/papermc/paper/event/player/PlayerBedFailEnterEvent.java
@@ -0,0 +1,119 @@
+package io.papermc.paper.event.player;
+
+import net.kyori.adventure.text.Component;
+import org.bukkit.block.Block;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.player.PlayerEvent;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public class PlayerBedFailEnterEvent extends PlayerEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
+ private final FailReason failReason;
+ private final Block bed;
+ private boolean willExplode;
+ private Component message;
+ private boolean cancelled;
+
+ public PlayerBedFailEnterEvent(@NotNull Player player, @NotNull FailReason failReason, @NotNull Block bed, boolean willExplode, @Nullable Component message) {
+ super(player);
+ this.failReason = failReason;
+ this.bed = bed;
+ this.willExplode = willExplode;
+ this.message = message;
+ }
+
+ @NotNull
+ public FailReason getFailReason() {
+ return failReason;
+ }
+
+ @NotNull
+ public Block getBed() {
+ return bed;
+ }
+
+ public boolean getWillExplode() {
+ return willExplode;
+ }
+
+ public void setWillExplode(boolean willExplode) {
+ this.willExplode = willExplode;
+ }
+
+ @Nullable
+ public Component getMessage() {
+ return message;
+ }
+
+ public void setMessage(@Nullable Component message) {
+ this.message = message;
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return cancelled;
+ }
+
+ /**
+ * Cancel this event.
+ * <p>
+ * <b>NOTE: This does not cancel the player getting in the bed, but any messages/explosions
+ * that may occur because of the interaction.</b>
+ * @param cancel true if you wish to cancel this event
+ */
+ @Override
+ public void setCancelled(boolean cancel) {
+ cancelled = cancel;
+ }
+
+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
+
+ public static enum FailReason {
+ /**
+ * The world doesn't allow sleeping (ex. Nether or The End). Entering
+ * the bed is prevented and the bed explodes.
+ */
+ NOT_POSSIBLE_HERE,
+ /**
+ * Entering the bed is prevented due to it not being night nor
+ * thundering currently.
+ * <p>
+ * If the event is forcefully allowed during daytime, the player will
+ * enter the bed (and set its bed location), but might get immediately
+ * thrown out again.
+ */
+ NOT_POSSIBLE_NOW,
+ /**
+ * Entering the bed is prevented due to the player being too far away.
+ */
+ TOO_FAR_AWAY,
+ /**
+ * Bed is obstructed.
+ */
+ OBSTRUCTED,
+ /**
+ * Entering the bed is prevented due to there being some other problem.
+ */
+ OTHER_PROBLEM,
+ /**
+ * Entering the bed is prevented due to there being monsters nearby.
+ */
+ NOT_SAFE;
+
+ public static final FailReason[] VALUES = values();
+ }
+}

View file

@ -0,0 +1,101 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Spyridon Pagkalos <spyridon@ender.gr>
Date: Thu, 25 Mar 2021 20:25:47 +0200
Subject: [PATCH] Introduce beacon activation/deactivation events
diff --git a/src/main/java/io/papermc/paper/event/block/BeaconActivatedEvent.java b/src/main/java/io/papermc/paper/event/block/BeaconActivatedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..7575ca7dd84dee89528ec2e5e5f99f97d8a10f58
--- /dev/null
+++ b/src/main/java/io/papermc/paper/event/block/BeaconActivatedEvent.java
@@ -0,0 +1,40 @@
+package io.papermc.paper.event.block;
+
+import org.bukkit.block.Beacon;
+import org.bukkit.block.Block;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.block.BlockEvent;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Called when a beacon is activated.
+ * Activation occurs when the beacon beam becomes visible.
+ */
+public class BeaconActivatedEvent extends BlockEvent {
+ private static final HandlerList handlers = new HandlerList();
+
+ public BeaconActivatedEvent(@NotNull Block block) {
+ super(block);
+ }
+
+ /**
+ * Returns the beacon that was activated.
+ *
+ * @return the beacon that was activated.
+ */
+ @NotNull
+ public Beacon getBeacon() {
+ return (Beacon) block.getState();
+ }
+
+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+
+ @NotNull
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
+}
diff --git a/src/main/java/io/papermc/paper/event/block/BeaconDeactivatedEvent.java b/src/main/java/io/papermc/paper/event/block/BeaconDeactivatedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..34f18468b4cfc08717cc3442778c9e85124e5a22
--- /dev/null
+++ b/src/main/java/io/papermc/paper/event/block/BeaconDeactivatedEvent.java
@@ -0,0 +1,43 @@
+package io.papermc.paper.event.block;
+
+import org.bukkit.Material;
+import org.bukkit.block.Beacon;
+import org.bukkit.block.Block;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.block.BlockEvent;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Called when a beacon is deactivated, either because its base block(s) or itself were destroyed.
+ */
+public class BeaconDeactivatedEvent extends BlockEvent {
+ private static final HandlerList handlers = new HandlerList();
+
+ public BeaconDeactivatedEvent(@NotNull Block block) {
+ super(block);
+ }
+
+ /**
+ * Returns the beacon that was deactivated.
+ * This will return null if the beacon does not exist.
+ * (which can occur after the deactivation of a now broken beacon)
+ *
+ * @return The beacon that got deactivated, or null if it does not exist.
+ */
+ @Nullable
+ public Beacon getBeacon() {
+ return block.getType() == Material.BEACON ? (Beacon) block.getState() : null;
+ }
+
+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+
+ @NotNull
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
+}

View file

@ -0,0 +1,64 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: HexedHero <6012891+HexedHero@users.noreply.github.com>
Date: Thu, 29 Apr 2021 10:31:44 +0100
Subject: [PATCH] PlayerMoveEvent Improvements
diff --git a/src/main/java/org/bukkit/event/player/PlayerMoveEvent.java b/src/main/java/org/bukkit/event/player/PlayerMoveEvent.java
index 1a58734d919fae247eeb85dd785fd59990856505..b484abf3b06b1fb3577b43d50d64498dcd7652c9 100644
--- a/src/main/java/org/bukkit/event/player/PlayerMoveEvent.java
+++ b/src/main/java/org/bukkit/event/player/PlayerMoveEvent.java
@@ -93,6 +93,53 @@ public class PlayerMoveEvent extends PlayerEvent implements Cancellable {
this.to = to;
}
+ // Paper start - PlayerMoveEvent improvements
+ /**
+ * Check if the player has changed position (even within the same block) in the event
+ *
+ * @return whether the player has changed position or not
+ */
+ public boolean hasChangedPosition() {
+ return hasExplicitlyChangedPosition() || !from.getWorld().equals(to.getWorld());
+ }
+
+ /**
+ * Check if the player has changed position (even within the same block) in the event, disregarding a possible world change
+ *
+ * @return whether the player has changed position or not
+ */
+ public boolean hasExplicitlyChangedPosition() {
+ return from.getX() != to.getX() || from.getY() != to.getY() || from.getZ() != to.getZ();
+ }
+
+ /**
+ * Check if the player has moved to a new block in the event
+ *
+ * @return whether the player has moved to a new block or not
+ */
+ public boolean hasChangedBlock() {
+ return hasExplicitlyChangedBlock() || !from.getWorld().equals(to.getWorld());
+ }
+
+ /**
+ * Check if the player has moved to a new block in the event, disregarding a possible world change
+ *
+ * @return whether the player has moved to a new block or not
+ */
+ public boolean hasExplicitlyChangedBlock() {
+ return from.getBlockX() != to.getBlockX() || from.getBlockY() != to.getBlockY() || from.getBlockZ() != to.getBlockZ();
+ }
+
+ /**
+ * Check if the player has changed orientation in the event
+ *
+ * @return whether the player has changed orientation or not
+ */
+ public boolean hasChangedOrientation() {
+ return from.getPitch() != to.getPitch() || from.getYaw() != to.getYaw();
+ }
+ // Paper end
+
private void validateLocation(@NotNull Location loc) {
Preconditions.checkArgument(loc != null, "Cannot use null location!");
Preconditions.checkArgument(loc.getWorld() != null, "Cannot use null location with null world!");

View file

@ -0,0 +1,73 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Thu, 22 Apr 2021 17:17:54 -0700
Subject: [PATCH] add RespawnFlags to PlayerRespawnEvent
diff --git a/src/main/java/org/bukkit/event/player/PlayerRespawnEvent.java b/src/main/java/org/bukkit/event/player/PlayerRespawnEvent.java
index e2c87a23e4743a34cfe911a71fd82b5a5ba1f9b7..a951568def24f809a6a019eefe623974c1867e22 100644
--- a/src/main/java/org/bukkit/event/player/PlayerRespawnEvent.java
+++ b/src/main/java/org/bukkit/event/player/PlayerRespawnEvent.java
@@ -17,17 +17,30 @@ public class PlayerRespawnEvent extends PlayerEvent {
private Location respawnLocation;
private final boolean isBedSpawn;
private final boolean isAnchorSpawn;
+ private final java.util.Set<RespawnFlag> respawnFlags; // Paper
@Deprecated
public PlayerRespawnEvent(@NotNull final Player respawnPlayer, @NotNull final Location respawnLocation, final boolean isBedSpawn) {
this(respawnPlayer, respawnLocation, isBedSpawn, false);
}
+ @Deprecated // Paper
public PlayerRespawnEvent(@NotNull final Player respawnPlayer, @NotNull final Location respawnLocation, final boolean isBedSpawn, final boolean isAnchorSpawn) {
+ // Paper start
+ this(respawnPlayer, respawnLocation, isBedSpawn, isAnchorSpawn, com.google.common.collect.ImmutableSet.builder());
+ }
+
+ public PlayerRespawnEvent(@NotNull final Player respawnPlayer, @NotNull final Location respawnLocation, final boolean isBedSpawn, final boolean isAnchorSpawn, @NotNull final com.google.common.collect.ImmutableSet.Builder<org.bukkit.event.player.PlayerRespawnEvent.RespawnFlag> respawnFlags) {
+ // Paper end
super(respawnPlayer);
this.respawnLocation = respawnLocation;
this.isBedSpawn = isBedSpawn;
this.isAnchorSpawn = isAnchorSpawn;
+ // Paper start
+ if (this.isBedSpawn) { respawnFlags.add(RespawnFlag.BED_SPAWN); }
+ if (this.isAnchorSpawn) { respawnFlags.add(RespawnFlag.ANCHOR_SPAWN); }
+ this.respawnFlags = respawnFlags.build();
+ // Paper end
}
/**
@@ -80,4 +93,31 @@ public class PlayerRespawnEvent extends PlayerEvent {
public static HandlerList getHandlerList() {
return handlers;
}
+
+ // Paper start
+ /**
+ * Get the set of flags that apply to this respawn.
+ *
+ * @return an immutable set of the flags that apply to this respawn
+ */
+ @NotNull
+ public java.util.Set<RespawnFlag> getRespawnFlags() {
+ return respawnFlags;
+ }
+
+ public enum RespawnFlag {
+ /**
+ * Will use the bed spawn location
+ */
+ BED_SPAWN,
+ /**
+ * Will use the respawn anchor location
+ */
+ ANCHOR_SPAWN,
+ /**
+ * Is caused by going to the end portal in the end.
+ */
+ END_PORTAL,
+ }
+ // Paper end
}

View file

@ -0,0 +1,41 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: HexedHero <6012891+HexedHero@users.noreply.github.com>
Date: Thu, 6 May 2021 14:56:26 +0100
Subject: [PATCH] Add more WanderingTrader API
diff --git a/src/main/java/org/bukkit/entity/WanderingTrader.java b/src/main/java/org/bukkit/entity/WanderingTrader.java
index 55394ed5c68cb0bf4333fc918e3b4c8c4e3db0c6..da76e1ed5406322073dd8c7a89ca55aa68620ac4 100644
--- a/src/main/java/org/bukkit/entity/WanderingTrader.java
+++ b/src/main/java/org/bukkit/entity/WanderingTrader.java
@@ -28,4 +28,30 @@ public interface WanderingTrader extends AbstractVillager {
* {@link WanderingTrader} is forcibly despawned
*/
public void setDespawnDelay(int despawnDelay);
+
+ // Paper start - Add more WanderingTrader API
+ /**
+ * Set if the Wandering Trader can and will drink an invisibility potion.
+ * @param bool whether the mob will drink
+ */
+ public void setCanDrinkPotion(boolean bool);
+
+ /**
+ * Get if the Wandering Trader can and will drink an invisibility potion.
+ * @return whether the mob will drink
+ */
+ public boolean canDrinkPotion();
+
+ /**
+ * Set if the Wandering Trader can and will drink milk.
+ * @param bool whether the mob will drink
+ */
+ public void setCanDrinkMilk(boolean bool);
+
+ /**
+ * Get if the Wandering Trader can and will drink milk.
+ * @return whether the mob will drink
+ */
+ public boolean canDrinkMilk();
+ // Paper end
}