bd38e0318a
Updated Upstream (Bukkit/CraftBukkit) Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: f02baa38 PR-988: Add World#getIntersectingChunks(BoundingBox) 9321d665 Move getItemInUse up to LivingEntity 819eef73 PR-959: Add access to current item's remaining ticks c4fdadb0 SPIGOT-7601: Add AbstractArrow#getItem be8261ca Add support for Java 22 26119676 PR-979: Add more translation keys 66753362 PR-985: Correct book maximum pages and characters per page documentation c8be92fa PR-980: Improve getArmorContents() documentation f1120ee2 PR-983: Expose riptide velocity to PlayerRiptideEvent CraftBukkit Changes: dfaa89bbe PR-1369: Add World#getIntersectingChunks(BoundingBox) 51bbab2b9 Move getItemInUse up to LivingEntity 668e09602 PR-1331: Add access to current item's remaining ticks a639406d1 SPIGOT-7601: Add AbstractArrow#getItem 0398930fc SPIGOT-7602: Allow opening in-world horse and related inventories ffd15611c SPIGOT-7608: Allow empty lists to morph to any PDT list 2188dcfa9 Add support for Java 22 45d6a609f SPIGOT-7604: Revert "SPIGOT-7365: DamageCause blocked by shield should trigger invulnerableTime" 06d915943 SPIGOT-7365: DamageCause blocked by shield should trigger invulnerableTime ca3bc3707 PR-1361: Add more translation keys 366c3ca80 SPIGOT-7600: EntityChangeBlockEvent is not fired for frog eggs 06d0f9ba8 SPIGOT-7593: Fix sapling growth physics / client-side updates 45c2608e4 PR-1366: Expose riptide velocity to PlayerRiptideEvent 29b6bb79b SPIGOT-7587: Remove fixes for now-resolved MC-142590 and MC-109346
352 Zeilen
19 KiB
Diff
352 Zeilen
19 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
Date: Tue, 4 Jul 2023 11:27:10 -0700
|
|
Subject: [PATCH] Fix BanList API
|
|
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
|
|
index ef2dfa30686bba3eb510bf95172174cc9972422e..96408d505ce80799868ff84554a3b0b25adabb22 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
|
|
@@ -115,17 +115,17 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa
|
|
}
|
|
|
|
@Override
|
|
- public BanEntry<PlayerProfile> ban(String reason, Date expires, String source) {
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> ban(String reason, Date expires, String source) { // Paper - fix ban list API
|
|
return ((ProfileBanList) this.server.getBanList(BanList.Type.PROFILE)).addBan(this.getPlayerProfile(), reason, expires, source);
|
|
}
|
|
|
|
@Override
|
|
- public BanEntry<PlayerProfile> ban(String reason, Instant expires, String source) {
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> ban(String reason, Instant expires, String source) { // Paper - fix ban list API
|
|
return ((ProfileBanList) this.server.getBanList(BanList.Type.PROFILE)).addBan(this.getPlayerProfile(), reason, expires, source);
|
|
}
|
|
|
|
@Override
|
|
- public BanEntry<PlayerProfile> ban(String reason, Duration duration, String source) {
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> ban(String reason, Duration duration, String source) { // Paper - fix ban list API
|
|
return ((ProfileBanList) this.server.getBanList(BanList.Type.PROFILE)).addBan(this.getPlayerProfile(), reason, duration, source);
|
|
}
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/ban/CraftProfileBanEntry.java b/src/main/java/org/bukkit/craftbukkit/ban/CraftProfileBanEntry.java
|
|
index 13e5e44b069121e51b9486c445902937f1d6c6d8..4a37c8172b42b10472bb90c9310c7ae3eeaa3481 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/ban/CraftProfileBanEntry.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/ban/CraftProfileBanEntry.java
|
|
@@ -9,7 +9,7 @@ import org.bukkit.BanEntry;
|
|
import org.bukkit.craftbukkit.profile.CraftPlayerProfile;
|
|
import org.bukkit.profile.PlayerProfile;
|
|
|
|
-public final class CraftProfileBanEntry implements BanEntry<PlayerProfile> {
|
|
+public final class CraftProfileBanEntry implements BanEntry<com.destroystokyo.paper.profile.PlayerProfile> { // Paper
|
|
private static final Date minorDate = Date.from(Instant.parse("1899-12-31T04:00:00Z"));
|
|
private final UserBanList list;
|
|
private final GameProfile profile;
|
|
@@ -33,8 +33,8 @@ public final class CraftProfileBanEntry implements BanEntry<PlayerProfile> {
|
|
}
|
|
|
|
@Override
|
|
- public PlayerProfile getBanTarget() {
|
|
- return new CraftPlayerProfile(this.profile);
|
|
+ public com.destroystokyo.paper.profile.PlayerProfile getBanTarget() { // Paper
|
|
+ return new com.destroystokyo.paper.profile.CraftPlayerProfile(this.profile); // Paper
|
|
}
|
|
|
|
@Override
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/ban/CraftProfileBanList.java b/src/main/java/org/bukkit/craftbukkit/ban/CraftProfileBanList.java
|
|
index 172202accf4448a933fcf1ff820316c7910dd7f7..50ee7656580d386db473c054f5c5ec57bb2b1424 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/ban/CraftProfileBanList.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/ban/CraftProfileBanList.java
|
|
@@ -24,42 +24,80 @@ public class CraftProfileBanList implements ProfileBanList {
|
|
}
|
|
|
|
@Override
|
|
- public BanEntry<PlayerProfile> getBanEntry(String target) {
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> getBanEntry(String target) { // Paper
|
|
Preconditions.checkArgument(target != null, "Target cannot be null");
|
|
|
|
return this.getBanEntry(CraftProfileBanList.getProfile(target));
|
|
}
|
|
|
|
@Override
|
|
- public BanEntry<PlayerProfile> getBanEntry(PlayerProfile target) {
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> getBanEntry(PlayerProfile target) { // Paper
|
|
Preconditions.checkArgument(target != null, "Target cannot be null");
|
|
|
|
- return this.getBanEntry(((CraftPlayerProfile) target).buildGameProfile());
|
|
+ return this.getBanEntry(((com.destroystokyo.paper.profile.SharedPlayerProfile) target).buildGameProfile()); // Paper
|
|
+ }
|
|
+ // Paper start - fix ban list API
|
|
+ @Override
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> getBanEntry(final com.destroystokyo.paper.profile.PlayerProfile target) {
|
|
+ Preconditions.checkArgument(target != null, "target cannot be null");
|
|
+
|
|
+ return this.getBanEntry(((com.destroystokyo.paper.profile.SharedPlayerProfile) target).buildGameProfile());
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> addBan(final com.destroystokyo.paper.profile.PlayerProfile target, final String reason, final Date expires, final String source) {
|
|
+ Preconditions.checkArgument(target != null, "PlayerProfile cannot be null");
|
|
+ Preconditions.checkArgument(target.getId() != null, "The PlayerProfile UUID cannot be null");
|
|
+
|
|
+ return this.addBan(((com.destroystokyo.paper.profile.SharedPlayerProfile) target).buildGameProfile(), reason, expires, source);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean isBanned(final com.destroystokyo.paper.profile.PlayerProfile target) {
|
|
+ return this.isBanned((com.destroystokyo.paper.profile.SharedPlayerProfile) target);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void pardon(final com.destroystokyo.paper.profile.PlayerProfile target) {
|
|
+ this.pardon((com.destroystokyo.paper.profile.SharedPlayerProfile) target);
|
|
}
|
|
|
|
@Override
|
|
- public BanEntry<PlayerProfile> addBan(String target, String reason, Date expires, String source) {
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> addBan(final com.destroystokyo.paper.profile.PlayerProfile target, final String reason, final Instant expires, final String source) {
|
|
+ Date date = expires != null ? Date.from(expires) : null;
|
|
+ return this.addBan(target, reason, date, source);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> addBan(final com.destroystokyo.paper.profile.PlayerProfile target, final String reason, final Duration duration, final String source) {
|
|
+ Instant instant = duration != null ? Instant.now().plus(duration) : null;
|
|
+ return this.addBan(target, reason, instant, source);
|
|
+ }
|
|
+ // Paper end - fix ban list API
|
|
+
|
|
+ @Override
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> addBan(String target, String reason, Date expires, String source) { // Paper - fix ban list API
|
|
Preconditions.checkArgument(target != null, "Ban target cannot be null");
|
|
|
|
return this.addBan(CraftProfileBanList.getProfileByName(target), reason, expires, source);
|
|
}
|
|
|
|
@Override
|
|
- public BanEntry<PlayerProfile> addBan(PlayerProfile target, String reason, Date expires, String source) {
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> addBan(PlayerProfile target, String reason, Date expires, String source) { // Paper - fix ban list API
|
|
Preconditions.checkArgument(target != null, "PlayerProfile cannot be null");
|
|
Preconditions.checkArgument(target.getUniqueId() != null, "The PlayerProfile UUID cannot be null");
|
|
|
|
- return this.addBan(((CraftPlayerProfile) target).buildGameProfile(), reason, expires, source);
|
|
+ return this.addBan(((com.destroystokyo.paper.profile.SharedPlayerProfile) target).buildGameProfile(), reason, expires, source); // Paper
|
|
}
|
|
|
|
@Override
|
|
- public BanEntry<PlayerProfile> addBan(PlayerProfile target, String reason, Instant expires, String source) {
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> addBan(PlayerProfile target, String reason, Instant expires, String source) { // Paper - fix ban list API
|
|
Date date = expires != null ? Date.from(expires) : null;
|
|
return this.addBan(target, reason, date, source);
|
|
}
|
|
|
|
@Override
|
|
- public BanEntry<PlayerProfile> addBan(PlayerProfile target, String reason, Duration duration, String source) {
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> addBan(PlayerProfile target, String reason, Duration duration, String source) { // Paper - fix ban list API
|
|
Instant instant = duration != null ? Instant.now().plus(duration) : null;
|
|
return this.addBan(target, reason, instant, source);
|
|
}
|
|
@@ -76,8 +114,8 @@ public class CraftProfileBanList implements ProfileBanList {
|
|
}
|
|
|
|
@Override
|
|
- public Set<BanEntry<PlayerProfile>> getEntries() {
|
|
- ImmutableSet.Builder<BanEntry<PlayerProfile>> builder = ImmutableSet.builder();
|
|
+ public Set<BanEntry<com.destroystokyo.paper.profile.PlayerProfile>> getEntries() { // Paper
|
|
+ ImmutableSet.Builder<BanEntry<com.destroystokyo.paper.profile.PlayerProfile>> builder = ImmutableSet.builder(); // Paper
|
|
for (UserBanListEntry entry : this.list.getEntries()) {
|
|
GameProfile profile = entry.getUser();
|
|
builder.add(new CraftProfileBanEntry(profile, entry, this.list));
|
|
@@ -88,9 +126,14 @@ public class CraftProfileBanList implements ProfileBanList {
|
|
|
|
@Override
|
|
public boolean isBanned(PlayerProfile target) {
|
|
+ // Paper start
|
|
+ return this.isBanned((com.destroystokyo.paper.profile.SharedPlayerProfile) target);
|
|
+ }
|
|
+ private boolean isBanned(com.destroystokyo.paper.profile.SharedPlayerProfile target) {
|
|
+ // Paper end
|
|
Preconditions.checkArgument(target != null, "Target cannot be null");
|
|
|
|
- return this.isBanned(((CraftPlayerProfile) target).buildGameProfile());
|
|
+ return this.isBanned(target.buildGameProfile()); // Paper
|
|
}
|
|
|
|
@Override
|
|
@@ -102,9 +145,14 @@ public class CraftProfileBanList implements ProfileBanList {
|
|
|
|
@Override
|
|
public void pardon(PlayerProfile target) {
|
|
+ // Paper start
|
|
+ this.pardon((com.destroystokyo.paper.profile.SharedPlayerProfile) target);
|
|
+ }
|
|
+ private void pardon(com.destroystokyo.paper.profile.SharedPlayerProfile target) {
|
|
+ // Paper end
|
|
Preconditions.checkArgument(target != null, "Target cannot be null");
|
|
|
|
- this.pardon(((CraftPlayerProfile) target).buildGameProfile());
|
|
+ this.pardon(target.buildGameProfile()); // Paper
|
|
}
|
|
|
|
@Override
|
|
@@ -114,7 +162,7 @@ public class CraftProfileBanList implements ProfileBanList {
|
|
this.pardon(CraftProfileBanList.getProfile(target));
|
|
}
|
|
|
|
- public BanEntry<PlayerProfile> getBanEntry(GameProfile profile) {
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> getBanEntry(GameProfile profile) { // Paper
|
|
if (profile == null) {
|
|
return null;
|
|
}
|
|
@@ -127,7 +175,7 @@ public class CraftProfileBanList implements ProfileBanList {
|
|
return new CraftProfileBanEntry(profile, entry, this.list);
|
|
}
|
|
|
|
- public BanEntry<PlayerProfile> addBan(GameProfile profile, String reason, Date expires, String source) {
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> addBan(GameProfile profile, String reason, Date expires, String source) { // Paper
|
|
if (profile == null) {
|
|
return null;
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
index e111017c3de7b374c702fed20a5e98557011ea06..748f49fd3fd4a3c1ed287d1eeed23ce5efecb8d4 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
@@ -1655,23 +1655,23 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|
}
|
|
|
|
@Override
|
|
- public BanEntry<PlayerProfile> ban(String reason, Date expires, String source) {
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> ban(String reason, Date expires, String source) { // Paper - fix ban list API
|
|
return this.ban(reason, expires, source, true);
|
|
}
|
|
|
|
@Override
|
|
- public BanEntry<PlayerProfile> ban(String reason, Instant expires, String source) {
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> ban(String reason, Instant expires, String source) { // Paper - fix ban list API
|
|
return this.ban(reason, expires != null ? Date.from(expires) : null, source);
|
|
}
|
|
|
|
@Override
|
|
- public BanEntry<PlayerProfile> ban(String reason, Duration duration, String source) {
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> ban(String reason, Duration duration, String source) { // Paper - fix ban list API
|
|
return this.ban(reason, duration != null ? Instant.now().plus(duration) : null, source);
|
|
}
|
|
|
|
@Override
|
|
- public BanEntry<PlayerProfile> ban(String reason, Date expires, String source, boolean kickPlayer) {
|
|
- BanEntry<PlayerProfile> banEntry = ((ProfileBanList) this.server.getBanList(BanList.Type.PROFILE)).addBan(this.getPlayerProfile(), reason, expires, source);
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> ban(String reason, Date expires, String source, boolean kickPlayer) { // Paper - fix ban list API
|
|
+ BanEntry<com.destroystokyo.paper.profile.PlayerProfile> banEntry = ((ProfileBanList) this.server.getBanList(BanList.Type.PROFILE)).addBan(this.getPlayerProfile(), reason, expires, source); // Paper - fix ban list API
|
|
if (kickPlayer) {
|
|
this.kickPlayer(reason);
|
|
}
|
|
@@ -1679,12 +1679,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|
}
|
|
|
|
@Override
|
|
- public BanEntry<PlayerProfile> ban(String reason, Instant instant, String source, boolean kickPlayer) {
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> ban(String reason, Instant instant, String source, boolean kickPlayer) { // Paper - fix ban list API
|
|
return this.ban(reason, instant != null ? Date.from(instant) : null, source, kickPlayer);
|
|
}
|
|
|
|
@Override
|
|
- public BanEntry<PlayerProfile> ban(String reason, Duration duration, String source, boolean kickPlayer) {
|
|
+ public BanEntry<com.destroystokyo.paper.profile.PlayerProfile> ban(String reason, Duration duration, String source, boolean kickPlayer) { // Paper - fix ban list API
|
|
return this.ban(reason, duration != null ? Instant.now().plus(duration) : null, source, kickPlayer);
|
|
}
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerProfile.java b/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerProfile.java
|
|
index 6f779c6f4422c5b5dc22f66e3e702c714d0e052b..41336821d4e0430e19f2fc021f09430d7a1302f6 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerProfile.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerProfile.java
|
|
@@ -28,7 +28,7 @@ import org.bukkit.profile.PlayerProfile;
|
|
import org.bukkit.profile.PlayerTextures;
|
|
|
|
@SerializableAs("PlayerProfile")
|
|
-public final class CraftPlayerProfile implements PlayerProfile, com.destroystokyo.paper.profile.SharedPlayerProfile { // Paper
|
|
+public final class CraftPlayerProfile implements PlayerProfile, com.destroystokyo.paper.profile.SharedPlayerProfile, com.destroystokyo.paper.profile.PlayerProfile { // Paper
|
|
|
|
@Nonnull
|
|
public static GameProfile validateSkullProfile(@Nonnull GameProfile gameProfile) {
|
|
@@ -123,7 +123,7 @@ public final class CraftPlayerProfile implements PlayerProfile, com.destroystoky
|
|
}
|
|
|
|
@Override
|
|
- public CompletableFuture<PlayerProfile> update() {
|
|
+ public CompletableFuture update() { // Paper - have to remove generic to avoid clashing between bukkit.PlayerProfile and paper.PlayerProfile
|
|
return CompletableFuture.supplyAsync(this::getUpdatedProfile, Util.PROFILE_EXECUTOR); // Paper - don't submit BLOCKING PROFILE LOOKUPS to the world gen thread
|
|
}
|
|
|
|
@@ -277,4 +277,71 @@ public final class CraftPlayerProfile implements PlayerProfile, com.destroystoky
|
|
// Paper - diff on change
|
|
return profile;
|
|
}
|
|
+
|
|
+ // Paper start - This must implement our PlayerProfile so generic casts succeed from cb.CraftPlayerProfile to paper.PlayerProfile
|
|
+ // The methods don't actually have to be implemented, because the profile should immediately be cast to SharedPlayerProfile
|
|
+ @Override
|
|
+ public String setName(final String name) {
|
|
+ throw new UnsupportedOperationException("Do not cast to com.destroystokyo.paper.profile.PlayerProfile");
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public UUID getId() {
|
|
+ throw new UnsupportedOperationException("Do not cast to com.destroystokyo.paper.profile.PlayerProfile");
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public UUID setId(final UUID uuid) {
|
|
+ throw new UnsupportedOperationException("Do not cast to com.destroystokyo.paper.profile.PlayerProfile");
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public java.util.Set<com.destroystokyo.paper.profile.ProfileProperty> getProperties() {
|
|
+ throw new UnsupportedOperationException("Do not cast to com.destroystokyo.paper.profile.PlayerProfile");
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean hasProperty(final String property) {
|
|
+ throw new UnsupportedOperationException("Do not cast to com.destroystokyo.paper.profile.PlayerProfile");
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setProperty(final com.destroystokyo.paper.profile.ProfileProperty property) {
|
|
+ throw new UnsupportedOperationException("Do not cast to com.destroystokyo.paper.profile.PlayerProfile");
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setProperties(final java.util.Collection<com.destroystokyo.paper.profile.ProfileProperty> properties) {
|
|
+ throw new UnsupportedOperationException("Do not cast to com.destroystokyo.paper.profile.PlayerProfile");
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void clearProperties() {
|
|
+ throw new UnsupportedOperationException("Do not cast to com.destroystokyo.paper.profile.PlayerProfile");
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean completeFromCache() {
|
|
+ throw new UnsupportedOperationException("Do not cast to com.destroystokyo.paper.profile.PlayerProfile");
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean completeFromCache(final boolean onlineMode) {
|
|
+ throw new UnsupportedOperationException("Do not cast to com.destroystokyo.paper.profile.PlayerProfile");
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean completeFromCache(final boolean lookupUUID, final boolean onlineMode) {
|
|
+ throw new UnsupportedOperationException("Do not cast to com.destroystokyo.paper.profile.PlayerProfile");
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean complete(final boolean textures) {
|
|
+ throw new UnsupportedOperationException("Do not cast to com.destroystokyo.paper.profile.PlayerProfile");
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean complete(final boolean textures, final boolean onlineMode) {
|
|
+ throw new UnsupportedOperationException("Do not cast to com.destroystokyo.paper.profile.PlayerProfile");
|
|
+ }
|
|
}
|