New patches

This commit is contained in:
Cryptite
2024-12-29 11:13:59 -06:00
parent c948431efc
commit 385449edaf
3 changed files with 90 additions and 51 deletions

View File

@@ -6,29 +6,34 @@ Subject: [PATCH] Add PlayerPreRespawnEvent
diff --git a/src/main/java/io/papermc/paper/event/player/PlayerPreRespawnEvent.java b/src/main/java/io/papermc/paper/event/player/PlayerPreRespawnEvent.java diff --git a/src/main/java/io/papermc/paper/event/player/PlayerPreRespawnEvent.java b/src/main/java/io/papermc/paper/event/player/PlayerPreRespawnEvent.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..c98a1e76e565d4b95b5fe31f734f8ab496348ecb index 0000000000000000000000000000000000000000..53b830c7a349d58b1bb8b242b3edd144c6dcbdb0
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/event/player/PlayerPreRespawnEvent.java +++ b/src/main/java/io/papermc/paper/event/player/PlayerPreRespawnEvent.java
@@ -0,0 +1,54 @@ @@ -0,0 +1,76 @@
+package io.papermc.paper.event.player; +package io.papermc.paper.event.player;
+ +
+import org.apache.commons.lang3.Validate; +import org.apache.commons.lang3.Validate;
+import org.bukkit.Location; +import org.bukkit.Location;
+import org.bukkit.entity.Player; +import org.bukkit.entity.Player;
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.HandlerList; +import org.bukkit.event.HandlerList;
+import org.bukkit.event.player.PlayerEvent; +import org.bukkit.event.player.PlayerEvent;
+import org.bukkit.event.player.PlayerRespawnEvent;
+import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Nullable;
+ +
+/** +/**
+ * Called before a player's respawn location is determined. + * Called before a player's respawn location is determined.
+ */ + */
+public class PlayerPreRespawnEvent extends PlayerEvent { +public class PlayerPreRespawnEvent extends PlayerEvent implements Cancellable {
+ private static final HandlerList handlers = new HandlerList(); + private static final HandlerList handlers = new HandlerList();
+ private final PlayerRespawnEvent.RespawnReason respawnReason;
+ private Location respawnLocation; + private Location respawnLocation;
+ private boolean cancelled;
+ +
+ public PlayerPreRespawnEvent(@NotNull final Player respawnPlayer) { + public PlayerPreRespawnEvent(@NotNull final Player respawnPlayer, PlayerRespawnEvent.RespawnReason respawnReason) {
+ super(respawnPlayer); + super(respawnPlayer);
+ this.respawnReason = respawnReason;
+ } + }
+ +
+ /** + /**
@@ -53,6 +58,13 @@ index 0000000000000000000000000000000000000000..c98a1e76e565d4b95b5fe31f734f8ab4
+ this.respawnLocation = respawnLocation; + this.respawnLocation = respawnLocation;
+ } + }
+ +
+ /**
+ * @return Returns the reason the player was respawned.
+ */
+ public PlayerRespawnEvent.RespawnReason getRespawnReason() {
+ return respawnReason;
+ }
+
+ @NotNull + @NotNull
+ @Override + @Override
+ public HandlerList getHandlers() { + public HandlerList getHandlers() {
@@ -63,4 +75,14 @@ index 0000000000000000000000000000000000000000..c98a1e76e565d4b95b5fe31f734f8ab4
+ public static HandlerList getHandlerList() { + public static HandlerList getHandlerList() {
+ return handlers; + return handlers;
+ } + }
+
+ @Override
+ public boolean isCancelled() {
+ return cancelled;
+ }
+
+ @Override
+ public void setCancelled(boolean cancel) {
+ this.cancelled = cancel;
+ }
+} +}

View File

@@ -5,62 +5,45 @@ Subject: [PATCH] Add PlayerPreRespawnEvent
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
index 46f060f33fcbc6a4568a7fcfba29e83a4d192578..3f2f5673663b812cba05c058a7afd3598eb4685a 100644 index 46f060f33fcbc6a4568a7fcfba29e83a4d192578..28b1ec198970b88515b37ef651c90916f3aef347 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java --- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java
@@ -807,25 +807,37 @@ public abstract class PlayerList { @@ -808,19 +808,31 @@ public abstract class PlayerList {
boolean isRespawn = false;
// Paper end - Add PlayerPostRespawnEvent // Paper end - Add PlayerPostRespawnEvent
- // CraftBukkit start - fire PlayerRespawnEvent // CraftBukkit start - fire PlayerRespawnEvent
- TeleportTransition teleporttransition; - TeleportTransition teleporttransition;
- if (location == null) { + TeleportTransition teleporttransition = null;
if (location == null) {
- teleporttransition = entityplayer.findRespawnPositionAndUseSpawnBlock(!flag, TeleportTransition.DO_NOTHING, reason); - teleporttransition = entityplayer.findRespawnPositionAndUseSpawnBlock(!flag, TeleportTransition.DO_NOTHING, reason);
- + // Slice start
- if (!flag) entityplayer.reset(); // SPIGOT-4785 + io.papermc.paper.event.player.PlayerPreRespawnEvent preRespawnEvent = new io.papermc.paper.event.player.PlayerPreRespawnEvent(entityplayer.getBukkitEntity(), reason);
+ if (!preRespawnEvent.callEvent()) return entityplayer;
+
+ Location respawnLocation = preRespawnEvent.getRespawnLocation();
+ if (respawnLocation != null) {
+ location = respawnLocation;
+ teleporttransition = new TeleportTransition(((CraftWorld) respawnLocation.getWorld()).getHandle(), CraftLocation.toVec3D(respawnLocation), Vec3.ZERO, respawnLocation.getYaw(), respawnLocation.getPitch(), TeleportTransition.DO_NOTHING);
+ } else {
+ teleporttransition = entityplayer.findRespawnPositionAndUseSpawnBlock(!flag, TeleportTransition.DO_NOTHING, reason);
+ }
+ // Slice end
if (!flag) entityplayer.reset(); // SPIGOT-4785
- // Paper start - Add PlayerPostRespawnEvent - // Paper start - Add PlayerPostRespawnEvent
- if (teleporttransition == null) return entityplayer; // Early exit, mirrors belows early return for disconnected players in respawn event - if (teleporttransition == null) return entityplayer; // Early exit, mirrors belows early return for disconnected players in respawn event
- isRespawn = true; - isRespawn = true;
- location = CraftLocation.toBukkit(teleporttransition.position(), teleporttransition.newLevel().getWorld(), teleporttransition.yRot(), teleporttransition.xRot()); - location = CraftLocation.toBukkit(teleporttransition.position(), teleporttransition.newLevel().getWorld(), teleporttransition.yRot(), teleporttransition.xRot());
- // Paper end - Add PlayerPostRespawnEvent - // Paper end - Add PlayerPostRespawnEvent
- } else { + // Paper start - Add PlayerPostRespawnEvent
- teleporttransition = new TeleportTransition(((CraftWorld) location.getWorld()).getHandle(), CraftLocation.toVec3D(location), Vec3.ZERO, location.getYaw(), location.getPitch(), TeleportTransition.DO_NOTHING); + if (teleporttransition == null || entityplayer.connection.isDisconnected()) return entityplayer; // Early exit, mirrors belows early return for disconnected players in respawn event
- } + isRespawn = true;
- // Spigot Start + location = CraftLocation.toBukkit(teleporttransition.position(), teleporttransition.newLevel().getWorld(), teleporttransition.yRot(), teleporttransition.xRot());
- if (teleporttransition == null) { // Paper - Add PlayerPostRespawnEvent - diff on change - spigot early returns if respawn pos is null, that is how they handle disconnected player in respawn event + // Paper end - Add PlayerPostRespawnEvent
- return entityplayer; } else {
+ // Slice start teleporttransition = new TeleportTransition(((CraftWorld) location.getWorld()).getHandle(), CraftLocation.toVec3D(location), Vec3.ZERO, location.getYaw(), location.getPitch(), TeleportTransition.DO_NOTHING);
+ TeleportTransition teleporttransition = null;
+ io.papermc.paper.event.player.PlayerPreRespawnEvent preRespawnEvent = new io.papermc.paper.event.player.PlayerPreRespawnEvent(entityplayer.getBukkitEntity());
+ preRespawnEvent.callEvent();
+ Location respawnLocation = preRespawnEvent.getRespawnLocation();
+ if (respawnLocation != null) {
+ teleporttransition = new TeleportTransition(((CraftWorld) respawnLocation.getWorld()).getHandle(), CraftLocation.toVec3D(respawnLocation), Vec3.ZERO, respawnLocation.getYaw(), respawnLocation.getPitch(), TeleportTransition.DO_NOTHING);
+ }
+ // Slice end
+
+ if (teleporttransition == null) {
+ // CraftBukkit start - fire PlayerRespawnEvent
+ if (location == null) {
+ teleporttransition = entityplayer.findRespawnPositionAndUseSpawnBlock(!flag, TeleportTransition.DO_NOTHING, reason);
+
+ if (!flag) entityplayer.reset(); // SPIGOT-4785
+ // Paper start - Add PlayerPostRespawnEvent
+ if (teleporttransition == null) return entityplayer; // Early exit, mirrors belows early return for disconnected players in respawn event
+ isRespawn = true;
+ location = CraftLocation.toBukkit(teleporttransition.position(), teleporttransition.newLevel().getWorld(), teleporttransition.yRot(), teleporttransition.xRot());
+ // Paper end - Add PlayerPostRespawnEvent
+ } else {
+ teleporttransition = new TeleportTransition(((CraftWorld) location.getWorld()).getHandle(), CraftLocation.toVec3D(location), Vec3.ZERO, location.getYaw(), location.getPitch(), TeleportTransition.DO_NOTHING);
+ }
+
+ // Spigot Start
+ if (teleporttransition == null) { // Paper - Add PlayerPostRespawnEvent - diff on change - spigot early returns if respawn pos is null, that is how they handle disconnected player in respawn event
+ return entityplayer;
+ }
+ // Spigot End
} }
- // Spigot End +
ServerLevel worldserver = teleporttransition.newLevel(); // Spigot Start
entityplayer1.spawnIn(worldserver); if (teleporttransition == null) { // Paper - Add PlayerPostRespawnEvent - diff on change - spigot early returns if respawn pos is null, that is how they handle disconnected player in respawn event
entityplayer1.unsetRemoved(); return entityplayer;

View File

@@ -0,0 +1,34 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Cryptite <cryptite@gmail.com>
Date: Sun, 29 Dec 2024 09:09:41 -0600
Subject: [PATCH] Fix authorless book loading
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
index 507f908916cbeb592496f963b46e4c2121a7b5e3..429eea868c749c5aece3e1afb96da760c154cfe1 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
@@ -24,6 +24,7 @@ import net.minecraft.commands.Commands;
import net.minecraft.commands.arguments.item.ItemParser;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
+import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtOps;
import net.minecraft.nbt.StringTag;
import net.minecraft.nbt.Tag;
@@ -524,6 +525,15 @@ public final class CraftMagicNumbers implements UnsafeValues {
net.minecraft.nbt.CompoundTag compound = deserializeNbtFromBytes(data);
final int dataVersion = compound.getInt("DataVersion");
compound = ca.spottedleaf.dataconverter.minecraft.MCDataConverter.convertTag(ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.ITEM_STACK, compound, dataVersion, this.getDataVersion()); // Paper - replace data conversion system
+
+ CompoundTag components = compound.getCompound("components");
+ if (!components.isEmpty()) {
+ CompoundTag bookContent = components.getCompound("minecraft:written_book_content");
+ if (!bookContent.isEmpty() && !bookContent.getAllKeys().contains("author")) {
+ bookContent.putString("author", "");
+ }
+ }
+
return CraftItemStack.asCraftMirror(net.minecraft.world.item.ItemStack.parse(MinecraftServer.getServer().registryAccess(), compound).orElseThrow());
}