2022-03-16 20:34:09 +00:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
|
|
|
|
Date: Sat, 26 Feb 2022 13:27:31 -0700
|
|
|
|
Subject: [PATCH] Add debug for invalid GameProfiles on skull blocks/items
|
|
|
|
|
|
|
|
Improves the error message for placed in world skull blocks by default,
|
|
|
|
also adds 'Paper.debugInvalidSkullProfiles' system property which can be
|
|
|
|
set to 'true' for extra debug info (trace of updateGameprofile caller).
|
|
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
|
2022-06-09 21:27:06 +00:00
|
|
|
index c5d5d90d10b30f30d1262367b3d75df43fbdb231..e017020b7630f54c506d93ab0504c6f3299fc80b 100644
|
2022-03-16 20:34:09 +00:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
|
2022-06-09 21:27:06 +00:00
|
|
|
@@ -114,13 +114,28 @@ public class SkullBlockEntity extends BlockEntity {
|
2022-03-16 20:34:09 +00:00
|
|
|
updateGameprofile(this.owner, (owner) -> {
|
|
|
|
this.owner = owner;
|
|
|
|
this.setChanged();
|
|
|
|
+ // Paper start
|
|
|
|
+ }, () -> {
|
|
|
|
+ final @Nullable Level level = this.getLevel();
|
|
|
|
+ return "SkullBlockEntity at " + this.getBlockPos() + (level == null ? "" : (" in level: " + level.dimension().location()));
|
|
|
|
+ // Paper end
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void updateGameprofile(@Nullable GameProfile owner, Consumer<GameProfile> callback) {
|
|
|
|
+ // Paper start
|
|
|
|
+ updateGameprofile(owner, callback, null);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private static final boolean DEBUG_INVALID_SKULL_PROFILES = Boolean.getBoolean("Paper.debugInvalidSkullProfiles");
|
|
|
|
+
|
|
|
|
+ public static void updateGameprofile(@Nullable GameProfile owner, Consumer<GameProfile> callback, final @Nullable java.util.function.Supplier<String> debugInfo) {
|
|
|
|
if (owner != null && !StringUtil.isNullOrEmpty(owner.getName()) && (!owner.isComplete() || !owner.getProperties().containsKey("textures")) && profileCache != null && sessionService != null) {
|
|
|
|
+ final @Nullable Throwable trace = DEBUG_INVALID_SKULL_PROFILES ? new Throwable("updateGameprofile caller debug trace") : null;
|
|
|
|
profileCache.getAsync(owner.getName(), (profile) -> {
|
|
|
|
Util.PROFILE_EXECUTOR.execute(() -> { // Paper - not a good idea to use BLOCKING OPERATIONS on the worldgen executor
|
|
|
|
+ try {
|
|
|
|
+ // Paper end
|
|
|
|
Util.ifElse(profile, (profilex) -> {
|
|
|
|
Property property = Iterables.getFirst(profilex.getProperties().get("textures"), (Property)null);
|
|
|
|
if (property == null) {
|
2022-06-09 21:27:06 +00:00
|
|
|
@@ -137,6 +152,20 @@ public class SkullBlockEntity extends BlockEntity {
|
2022-03-16 20:34:09 +00:00
|
|
|
callback.accept(owner);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
+ // Paper start
|
|
|
|
+ } catch (final Exception ex) {
|
|
|
|
+ if (trace != null) {
|
|
|
|
+ ex.addSuppressed(trace);
|
|
|
|
+ }
|
|
|
|
+ final String ownerMessage = "Original profile: '" + owner + "'";
|
|
|
|
+ final String debugMessage = " Run with -DPaper.debugInvalidSkullProfiles=true for further debug information.";
|
|
|
|
+ final String message = ownerMessage + (trace == null ? debugMessage : "");
|
|
|
|
+ if (debugInfo == null) {
|
|
|
|
+ throw new RuntimeException(message, ex);
|
|
|
|
+ }
|
|
|
|
+ throw new RuntimeException(debugInfo.get() + " " + message, ex);
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
});
|
|
|
|
});
|
|
|
|
} else {
|