mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-15 07:01:36 +08:00
13d1abf01e
Upstream has released updates that appears to apply and compile correctly. This update has only been PARTIALLY tested by PaperMC and as with ANY update, please do your own testing I've tested basic region file saving as well as our oversized chunks approach. Bukkit Changes: e167e549 Clarify MerchantInventory#getSelectedRecipe. 3a1d5b8f Apply default permissions by registration order. c64cc93f Make tags Keyed ec037ed7 Added a method to get a list of tags bfb6ef86 Introduce rotation methods to the Vector class fc727372 Remove draft API from FluidLevelChangeEvent CraftBukkit Changes:6430d9c0
SPIGOT-4632: BlockState location is not fixed14cd1688
Fix CraftInventoryMerchant#getSelectedRecipe if there is no active merchant recipe.c24abab7
Load custom permissions after default permissions.bc99dfe8
Make tags Keyed6fce004f
Added a method to get a list of tags Spigot Changes: e5e5c7c6 Allow Saving Large Chunks e8d3881c Rebuild patches
334 lines
10 KiB
Diff
334 lines
10 KiB
Diff
From ba7ca826a69db5f365c35ebf7ea2f7834f8aaa7e Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Mon, 15 Jan 2018 21:46:46 -0500
|
|
Subject: [PATCH] Basic PlayerProfile API
|
|
|
|
Provides basic elements of a PlayerProfile to be used by future API/events
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/profile/PlayerProfile.java b/src/main/java/com/destroystokyo/paper/profile/PlayerProfile.java
|
|
new file mode 100644
|
|
index 00000000..529c5376
|
|
--- /dev/null
|
|
+++ b/src/main/java/com/destroystokyo/paper/profile/PlayerProfile.java
|
|
@@ -0,0 +1,142 @@
|
|
+package com.destroystokyo.paper.profile;
|
|
+
|
|
+import javax.annotation.Nonnull;
|
|
+import javax.annotation.Nullable;
|
|
+import java.util.Collection;
|
|
+import java.util.Set;
|
|
+import java.util.UUID;
|
|
+
|
|
+/**
|
|
+ * Represents a players profile for the game, such as UUID, Name, and textures.
|
|
+ */
|
|
+public interface PlayerProfile {
|
|
+
|
|
+ /**
|
|
+ * @return The players name, if set
|
|
+ */
|
|
+ @Nullable String getName();
|
|
+
|
|
+ /**
|
|
+ * Sets this profiles Name
|
|
+ *
|
|
+ * @param name The new Name
|
|
+ * @return The previous Name
|
|
+ */
|
|
+ String setName(@Nullable String name);
|
|
+
|
|
+ /**
|
|
+ * @return The players unique identifier, if set
|
|
+ */
|
|
+ @Nullable UUID getId();
|
|
+
|
|
+ /**
|
|
+ * Sets this profiles UUID
|
|
+ *
|
|
+ * @param uuid The new UUID
|
|
+ * @return The previous UUID
|
|
+ */
|
|
+ UUID setId(@Nullable UUID uuid);
|
|
+
|
|
+ /**
|
|
+ * @return A Mutable set of this players properties, such as textures.
|
|
+ * Values specified here are subject to implementation details.
|
|
+ */
|
|
+ @Nonnull Set<ProfileProperty> getProperties();
|
|
+
|
|
+ /**
|
|
+ * Check if the Profile has the specified property
|
|
+ * @param property Property name to check
|
|
+ * @return If the property is set
|
|
+ */
|
|
+ boolean hasProperty(String property);
|
|
+
|
|
+ /**
|
|
+ * Sets a property. If the property already exists, the previous one will be replaced
|
|
+ * @param property Property to set.
|
|
+ */
|
|
+ void setProperty(ProfileProperty property);
|
|
+
|
|
+ /**
|
|
+ * Sets multiple properties. If any of the set properties already exist, it will be replaced
|
|
+ * @param properties The properties to set
|
|
+ */
|
|
+ void setProperties(Collection<ProfileProperty> properties);
|
|
+
|
|
+ /**
|
|
+ * Removes a specific property from this profile
|
|
+ * @param property The property to remove
|
|
+ * @return If a property was removed
|
|
+ */
|
|
+ boolean removeProperty(String property);
|
|
+
|
|
+ /**
|
|
+ * Removes a specific property from this profile
|
|
+ * @param property The property to remove
|
|
+ * @return If a property was removed
|
|
+ */
|
|
+ default boolean removeProperty(@Nonnull ProfileProperty property) {
|
|
+ return removeProperty(property.getName());
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Removes all properties in the collection
|
|
+ * @param properties The properties to remove
|
|
+ * @return If any property was removed
|
|
+ */
|
|
+ default boolean removeProperties(Collection<ProfileProperty> properties) {
|
|
+ boolean removed = false;
|
|
+ for (ProfileProperty property : properties) {
|
|
+ if (removeProperty(property)) {
|
|
+ removed = true;
|
|
+ }
|
|
+ }
|
|
+ return removed;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Clears all properties on this profile
|
|
+ */
|
|
+ void clearProperties();
|
|
+
|
|
+ /**
|
|
+ * @return If the profile is now complete (has UUID and Name)
|
|
+ */
|
|
+ boolean isComplete();
|
|
+
|
|
+ /**
|
|
+ * Like {@link #complete(boolean)} but will try only from cache, and not make network calls
|
|
+ * Does not account for textures.
|
|
+ *
|
|
+ * @return If the profile is now complete (has UUID and Name)
|
|
+ */
|
|
+ boolean completeFromCache();
|
|
+
|
|
+ /**
|
|
+ * If this profile is not complete, then make the API call to complete it.
|
|
+ * This is a blocking operation and should be done asynchronously.
|
|
+ *
|
|
+ * This will also complete textures. If you do not want to load textures, use {{@link #complete(boolean)}}
|
|
+ * @return If the profile is now complete (has UUID and Name) (if you get rate limited, this operation may fail)
|
|
+ */
|
|
+ default boolean complete() {
|
|
+ return complete(true);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * If this profile is not complete, then make the API call to complete it.
|
|
+ * This is a blocking operation and should be done asynchronously.
|
|
+ *
|
|
+ * Optionally will also fill textures.
|
|
+ * @param textures controls if we should fill the profile with texture properties
|
|
+ * @return If the profile is now complete (has UUID and Name) (if you get rate limited, this operation may fail)
|
|
+ */
|
|
+ boolean complete(boolean textures);
|
|
+
|
|
+ /**
|
|
+ * Whether or not this Profile has textures associated to it
|
|
+ * @return If has a textures property
|
|
+ */
|
|
+ default boolean hasTextures() {
|
|
+ return hasProperty("textures");
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/com/destroystokyo/paper/profile/ProfileProperty.java b/src/main/java/com/destroystokyo/paper/profile/ProfileProperty.java
|
|
new file mode 100644
|
|
index 00000000..d17061e6
|
|
--- /dev/null
|
|
+++ b/src/main/java/com/destroystokyo/paper/profile/ProfileProperty.java
|
|
@@ -0,0 +1,72 @@
|
|
+package com.destroystokyo.paper.profile;
|
|
+
|
|
+import com.google.common.base.Preconditions;
|
|
+
|
|
+import javax.annotation.Nonnull;
|
|
+import javax.annotation.Nullable;
|
|
+import java.util.Objects;
|
|
+
|
|
+/**
|
|
+ * Represents a property on a {@link PlayerProfile}
|
|
+ */
|
|
+public class ProfileProperty {
|
|
+ private final String name;
|
|
+ private final String value;
|
|
+ private final String signature;
|
|
+
|
|
+ public ProfileProperty(@Nonnull String name, @Nonnull String value) {
|
|
+ this(name, value, null);
|
|
+ }
|
|
+
|
|
+ public ProfileProperty(@Nonnull String name, @Nonnull String value, @Nullable String signature) {
|
|
+ this.name = Preconditions.checkNotNull(name, "ProfileProperty name can not be null");
|
|
+ this.value = Preconditions.checkNotNull(value, "ProfileProperty value can not be null");
|
|
+ this.signature = signature;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * @return The property name, ie "textures"
|
|
+ */
|
|
+ @Nonnull
|
|
+ public String getName() {
|
|
+ return name;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * @return The property value, likely to be base64 encoded
|
|
+ */
|
|
+ @Nonnull
|
|
+ public String getValue() {
|
|
+ return value;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * @return A signature from Mojang for signed properties
|
|
+ */
|
|
+ @Nullable
|
|
+ public String getSignature() {
|
|
+ return signature;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * @return If this property has a signature or not
|
|
+ */
|
|
+ public boolean isSigned() {
|
|
+ return this.signature != null;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean equals(Object o) {
|
|
+ if (this == o) return true;
|
|
+ if (o == null || getClass() != o.getClass()) return false;
|
|
+ ProfileProperty that = (ProfileProperty) o;
|
|
+ return Objects.equals(name, that.name) &&
|
|
+ Objects.equals(value, that.value) &&
|
|
+ Objects.equals(signature, that.signature);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public int hashCode() {
|
|
+ return Objects.hash(name);
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
|
|
index eb180374..75634a8d 100644
|
|
--- a/src/main/java/org/bukkit/Bukkit.java
|
|
+++ b/src/main/java/org/bukkit/Bukkit.java
|
|
@@ -51,6 +51,9 @@ import org.bukkit.generator.ChunkGenerator;
|
|
import org.bukkit.inventory.ItemFactory;
|
|
import org.bukkit.inventory.meta.ItemMeta;
|
|
|
|
+import javax.annotation.Nullable; // Paper
|
|
+import javax.annotation.Nonnull; // Paper
|
|
+
|
|
/**
|
|
* Represents the Bukkit core, for version and Server singleton handling
|
|
*/
|
|
@@ -1492,6 +1495,37 @@ public final class Bukkit {
|
|
public static boolean suggestPlayerNamesWhenNullTabCompletions() {
|
|
return server.suggestPlayerNamesWhenNullTabCompletions();
|
|
}
|
|
+
|
|
+ /**
|
|
+ * Creates a PlayerProfile for the specified uuid, with name as null
|
|
+ * @param uuid UUID to create profile for
|
|
+ * @return A PlayerProfile object
|
|
+ */
|
|
+ public static com.destroystokyo.paper.profile.PlayerProfile createProfile(@Nonnull UUID uuid) {
|
|
+ return server.createProfile(uuid);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Creates a PlayerProfile for the specified name, with UUID as null
|
|
+ * @param name Name to create profile for
|
|
+ * @return A PlayerProfile object
|
|
+ */
|
|
+ public static com.destroystokyo.paper.profile.PlayerProfile createProfile(@Nonnull String name) {
|
|
+ return server.createProfile(name);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Creates a PlayerProfile for the specified name/uuid
|
|
+ *
|
|
+ * Both UUID and Name can not be null at same time. One must be supplied.
|
|
+ *
|
|
+ * @param uuid UUID to create profile for
|
|
+ * @param name Name to create profile for
|
|
+ * @return A PlayerProfile object
|
|
+ */
|
|
+ public static com.destroystokyo.paper.profile.PlayerProfile createProfile(@Nullable UUID uuid, @Nullable String name) {
|
|
+ return server.createProfile(uuid, name);
|
|
+ }
|
|
// Paper end
|
|
|
|
public static Server.Spigot spigot()
|
|
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
|
|
index c57f81fd..1d1f7784 100644
|
|
--- a/src/main/java/org/bukkit/Server.java
|
|
+++ b/src/main/java/org/bukkit/Server.java
|
|
@@ -52,6 +52,9 @@ import org.bukkit.generator.ChunkGenerator;
|
|
import org.bukkit.inventory.ItemFactory;
|
|
import org.bukkit.inventory.meta.ItemMeta;
|
|
|
|
+import javax.annotation.Nullable; // Paper
|
|
+import javax.annotation.Nonnull; // Paper
|
|
+
|
|
/**
|
|
* Represents a server implementation.
|
|
*/
|
|
@@ -1292,5 +1295,30 @@ public interface Server extends PluginMessageRecipient {
|
|
* @return true if player names should be suggested
|
|
*/
|
|
boolean suggestPlayerNamesWhenNullTabCompletions();
|
|
+
|
|
+ /**
|
|
+ * Creates a PlayerProfile for the specified uuid, with name as null
|
|
+ * @param uuid UUID to create profile for
|
|
+ * @return A PlayerProfile object
|
|
+ */
|
|
+ com.destroystokyo.paper.profile.PlayerProfile createProfile(@Nonnull UUID uuid);
|
|
+
|
|
+ /**
|
|
+ * Creates a PlayerProfile for the specified name, with UUID as null
|
|
+ * @param name Name to create profile for
|
|
+ * @return A PlayerProfile object
|
|
+ */
|
|
+ com.destroystokyo.paper.profile.PlayerProfile createProfile(@Nonnull String name);
|
|
+
|
|
+ /**
|
|
+ * Creates a PlayerProfile for the specified name/uuid
|
|
+ *
|
|
+ * Both UUID and Name can not be null at same time. One must be supplied.
|
|
+ *
|
|
+ * @param uuid UUID to create profile for
|
|
+ * @param name Name to create profile for
|
|
+ * @return A PlayerProfile object
|
|
+ */
|
|
+ com.destroystokyo.paper.profile.PlayerProfile createProfile(@Nullable UUID uuid, @Nullable String name);
|
|
// Paper end
|
|
}
|
|
--
|
|
2.20.1
|
|
|