From 723559e9f071a16f0a59a7931ee7ca27a5a4a38d Mon Sep 17 00:00:00 2001
From: Andreas Prues <68807218+Lama06@users.noreply.github.com>
Date: Sat, 11 Feb 2023 16:55:45 +0100
Subject: [PATCH] More Win Screen API (#8805)
Adds methods to get and set whether a player has seen the win screen before.
---
patches/api/Win-Screen-API.patch | 29 +++++++++++++++++++++++++++++
patches/server/Win-Screen-API.patch | 12 ++++++++++++
2 files changed, 41 insertions(+)
diff --git a/patches/api/Win-Screen-API.patch b/patches/api/Win-Screen-API.patch
index a79f2a9912..8e1c3f86cf 100644
--- a/patches/api/Win-Screen-API.patch
+++ b/patches/api/Win-Screen-API.patch
@@ -18,10 +18,39 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * and exits the end for the first time.
+ * In vanilla, the win screen starts with a poem and then continues with the credits but its content can be
+ * changed by using a resource pack.
++ *
++ * Calling this method does not change the value of {@link #hasSeenWinScreen()}.
++ * That means that the win screen is still displayed to a player if they leave the end for the first time, even though
++ * they have seen it before because this method was called.
++ * Note this method does not make the player invulnerable, which is normally expected when viewing credits.
+ *
++ * @see #hasSeenWinScreen()
++ * @see #setHasSeenWinScreen(boolean)
+ * @see https://minecraft.fandom.com/wiki/End_Poem#Technical_details
+ */
+ public void showWinScreen();
++
++ /**
++ * Returns whether this player has seen the win screen before.
++ * When a player leaves the end the win screen is shown to them if they have not seen it before.
++ *
++ * @return Whether this player has seen the win screen before
++ * @see #setHasSeenWinScreen(boolean)
++ * @see #showWinScreen()
++ * @see https://minecraft.fandom.com/wiki/End_Poem
++ */
++ public boolean hasSeenWinScreen();
++
++ /**
++ * Changes whether this player has seen the win screen before.
++ * When a player leaves the end the win screen is shown to them if they have not seen it before.
++ *
++ * @param hasSeenWinScreen Whether this player has seen the win screen before
++ * @see #hasSeenWinScreen()
++ * @see #showWinScreen()
++ * @see https://minecraft.fandom.com/wiki/End_Poem
++ */
++ public void setHasSeenWinScreen(boolean hasSeenWinScreen);
+ // Paper end
+
// Paper start
diff --git a/patches/server/Win-Screen-API.patch b/patches/server/Win-Screen-API.patch
index e845f93c2f..71a3c40a36 100644
--- a/patches/server/Win-Screen-API.patch
+++ b/patches/server/Win-Screen-API.patch
@@ -3,6 +3,8 @@ From: Lama06
Date: Sat, 21 Jan 2023 13:53:23 +0100
Subject: [PATCH] Win Screen API
+== AT ==
+public net.minecraft.server.level.ServerPlayer seenCredits
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
@@ -19,6 +21,16 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ var packet = new ClientboundGameEventPacket(ClientboundGameEventPacket.WIN_GAME, 1);
+ getHandle().connection.send(packet);
+ }
++
++ @Override
++ public boolean hasSeenWinScreen() {
++ return getHandle().seenCredits;
++ }
++
++ @Override
++ public void setHasSeenWinScreen(boolean hasSeenWinScreen) {
++ getHandle().seenCredits = hasSeenWinScreen;
++ }
+ // Paper end
+
@Override