aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0605-Add-PlayerSetSpawnEvent.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0605-Add-PlayerSetSpawnEvent.patch')
-rw-r--r--patches/server/0605-Add-PlayerSetSpawnEvent.patch204
1 files changed, 204 insertions, 0 deletions
diff --git a/patches/server/0605-Add-PlayerSetSpawnEvent.patch b/patches/server/0605-Add-PlayerSetSpawnEvent.patch
new file mode 100644
index 0000000000..cd6f103ac2
--- /dev/null
+++ b/patches/server/0605-Add-PlayerSetSpawnEvent.patch
@@ -0,0 +1,204 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <[email protected]>
+Date: Wed, 19 May 2021 18:59:10 -0700
+Subject: [PATCH] Add PlayerSetSpawnEvent
+
+
+diff --git a/src/main/java/net/minecraft/server/commands/SetSpawnCommand.java b/src/main/java/net/minecraft/server/commands/SetSpawnCommand.java
+index a2d0699e8427b2262a2396495111125eccafbb66..15db9368227dbc29d07d74e85bd126b345b526b6 100644
+--- a/src/main/java/net/minecraft/server/commands/SetSpawnCommand.java
++++ b/src/main/java/net/minecraft/server/commands/SetSpawnCommand.java
+@@ -38,24 +38,34 @@ public class SetSpawnCommand {
+ ResourceKey<Level> resourcekey = source.getLevel().dimension();
+ Iterator iterator = targets.iterator();
+
++ final Collection<ServerPlayer> actualTargets = new java.util.ArrayList<>(); // Paper - Add PlayerSetSpawnEvent
+ while (iterator.hasNext()) {
+ ServerPlayer entityplayer = (ServerPlayer) iterator.next();
+
+- entityplayer.setRespawnPosition(resourcekey, pos, angle, true, false, org.bukkit.event.player.PlayerSpawnChangeEvent.Cause.COMMAND); // CraftBukkit
++ // Paper start - Add PlayerSetSpawnEvent
++ if (entityplayer.setRespawnPosition(resourcekey, pos, angle, true, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.COMMAND)) {
++ actualTargets.add(entityplayer);
++ }
++ // Paper end - Add PlayerSetSpawnEvent
+ }
++ // Paper start - Add PlayerSetSpawnEvent
++ if (actualTargets.isEmpty()) {
++ return 0;
++ }
++ // Paper end - Add PlayerSetSpawnEvent
+
+ String s = resourcekey.location().toString();
+
+- if (targets.size() == 1) {
++ if (actualTargets.size() == 1) { // Paper - Add PlayerSetSpawnEvent
+ source.sendSuccess(() -> {
+- return Component.translatable("commands.spawnpoint.success.single", pos.getX(), pos.getY(), pos.getZ(), angle, s, ((ServerPlayer) targets.iterator().next()).getDisplayName());
++ return Component.translatable("commands.spawnpoint.success.single", pos.getX(), pos.getY(), pos.getZ(), angle, s, ((ServerPlayer) actualTargets.iterator().next()).getDisplayName()); // Paper - Add PlayerSetSpawnEvent
+ }, true);
+ } else {
+ source.sendSuccess(() -> {
+- return Component.translatable("commands.spawnpoint.success.multiple", pos.getX(), pos.getY(), pos.getZ(), angle, s, targets.size());
++ return Component.translatable("commands.spawnpoint.success.multiple", pos.getX(), pos.getY(), pos.getZ(), angle, s, actualTargets.size()); // Paper - Add PlayerSetSpawnEvent
+ }, true);
+ }
+
+- return targets.size();
++ return actualTargets.size(); // Paper - Add PlayerSetSpawnEvent
+ }
+ }
+diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+index 415a48203aa150056cb224e3eb65a1f62f0741e7..770f99014f3cccbbc666f0aa8530dfb545ced7b6 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+@@ -1352,7 +1352,7 @@ public class ServerPlayer extends Player {
+ } else if (this.bedBlocked(blockposition, enumdirection)) {
+ return Either.left(Player.BedSleepingProblem.OBSTRUCTED);
+ } else {
+- this.setRespawnPosition(this.level().dimension(), blockposition, this.getYRot(), false, true, PlayerSpawnChangeEvent.Cause.BED); // CraftBukkit
++ this.setRespawnPosition(this.level().dimension(), blockposition, this.getYRot(), false, true, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.BED); // Paper - Add PlayerSetSpawnEvent
+ if (this.level().isDay()) {
+ return Either.left(Player.BedSleepingProblem.NOT_POSSIBLE_NOW);
+ } else {
+@@ -2307,44 +2307,50 @@ public class ServerPlayer extends Player {
+ return this.respawnForced;
+ }
+
++ @Deprecated // Paper - Add PlayerSetSpawnEvent
+ public void setRespawnPosition(ResourceKey<Level> dimension, @Nullable BlockPos pos, float angle, boolean forced, boolean sendMessage) {
+- // CraftBukkit start
+- this.setRespawnPosition(dimension, pos, angle, forced, sendMessage, PlayerSpawnChangeEvent.Cause.UNKNOWN);
+- }
+-
+- public void setRespawnPosition(ResourceKey<Level> resourcekey, @Nullable BlockPos blockposition, float f, boolean flag, boolean flag1, PlayerSpawnChangeEvent.Cause cause) {
+- ServerLevel newWorld = this.server.getLevel(resourcekey);
+- Location newSpawn = (blockposition != null) ? CraftLocation.toBukkit(blockposition, newWorld.getWorld(), f, 0) : null;
+-
+- PlayerSpawnChangeEvent event = new PlayerSpawnChangeEvent(this.getBukkitEntity(), newSpawn, flag, cause);
+- Bukkit.getServer().getPluginManager().callEvent(event);
+- if (event.isCancelled()) {
+- return;
+- }
+- newSpawn = event.getNewSpawn();
+- flag = event.isForced();
+-
+- if (newSpawn != null) {
+- resourcekey = ((CraftWorld) newSpawn.getWorld()).getHandle().dimension();
+- blockposition = BlockPos.containing(newSpawn.getX(), newSpawn.getY(), newSpawn.getZ());
+- f = newSpawn.getYaw();
+- } else {
+- resourcekey = Level.OVERWORLD;
+- blockposition = null;
+- f = 0.0F;
++ // Paper start - Add PlayerSetSpawnEvent
++ this.setRespawnPosition(dimension, pos, angle, forced, sendMessage, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.UNKNOWN);
++ }
++ @Deprecated
++ public boolean setRespawnPosition(ResourceKey<Level> dimension, @Nullable BlockPos pos, float angle, boolean forced, boolean sendMessage, PlayerSpawnChangeEvent.Cause cause) {
++ return this.setRespawnPosition(dimension, pos, angle, forced, sendMessage, cause == PlayerSpawnChangeEvent.Cause.RESET ?
++ com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLAYER_RESPAWN : com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.valueOf(cause.name()));
++ }
++ public boolean setRespawnPosition(ResourceKey<Level> dimension, @Nullable BlockPos pos, float angle, boolean forced, boolean sendMessage, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause cause) {
++ Location spawnLoc = null;
++ boolean willNotify = false;
++ if (pos != null) {
++ boolean flag2 = pos.equals(this.respawnPosition) && dimension.equals(this.respawnDimension);
++ spawnLoc = io.papermc.paper.util.MCUtil.toLocation(this.getServer().getLevel(dimension), pos);
++ spawnLoc.setYaw(angle);
++ willNotify = sendMessage && !flag2;
++ }
++
++ PlayerSpawnChangeEvent dumbEvent = new PlayerSpawnChangeEvent(this.getBukkitEntity(), spawnLoc, forced,
++ cause == com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLAYER_RESPAWN ? PlayerSpawnChangeEvent.Cause.RESET : PlayerSpawnChangeEvent.Cause.valueOf(cause.name()));
++ dumbEvent.callEvent();
++
++ com.destroystokyo.paper.event.player.PlayerSetSpawnEvent event = new com.destroystokyo.paper.event.player.PlayerSetSpawnEvent(this.getBukkitEntity(), cause, dumbEvent.getNewSpawn(), dumbEvent.isForced(), willNotify, willNotify ? net.kyori.adventure.text.Component.translatable("block.minecraft.set_spawn") : null);
++ event.setCancelled(dumbEvent.isCancelled());
++ if (!event.callEvent()) {
++ return false;
+ }
+- // CraftBukkit end
+- if (blockposition != null) {
+- boolean flag2 = blockposition.equals(this.respawnPosition) && resourcekey.equals(this.respawnDimension);
++ if (event.getLocation() != null) {
++ dimension = event.getLocation().getWorld() != null ? ((CraftWorld) event.getLocation().getWorld()).getHandle().dimension() : dimension;
++ pos = io.papermc.paper.util.MCUtil.toBlockPosition(event.getLocation());
++ angle = event.getLocation().getYaw();
++ forced = event.isForced();
++ // Paper end - Add PlayerSetSpawnEvent
+
+- if (flag1 && !flag2) {
+- this.sendSystemMessage(Component.translatable("block.minecraft.set_spawn"));
++ if (event.willNotifyPlayer() && event.getNotification() != null) { // Paper - Add PlayerSetSpawnEvent
++ this.sendSystemMessage(PaperAdventure.asVanilla(event.getNotification())); // Paper - Add PlayerSetSpawnEvent
+ }
+
+- this.respawnPosition = blockposition;
+- this.respawnDimension = resourcekey;
+- this.respawnAngle = f;
+- this.respawnForced = flag;
++ this.respawnPosition = pos;
++ this.respawnDimension = dimension;
++ this.respawnAngle = angle;
++ this.respawnForced = forced;
+ } else {
+ this.respawnPosition = null;
+ this.respawnDimension = Level.OVERWORLD;
+@@ -2352,6 +2358,7 @@ public class ServerPlayer extends Player {
+ this.respawnForced = false;
+ }
+
++ return true; // Paper - Add PlayerSetSpawnEvent
+ }
+
+ public SectionPos getLastSectionPos() {
+diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
+index cedfc39539f7eb7d2cc0dfeda347cf59fadd95fc..a4d2ddbb9cee1682fc5d91e90d2fd0b74a47aa3c 100644
+--- a/src/main/java/net/minecraft/server/players/PlayerList.java
++++ b/src/main/java/net/minecraft/server/players/PlayerList.java
+@@ -871,7 +871,7 @@ public abstract class PlayerList {
+ location = CraftLocation.toBukkit(vec3d, worldserver1.getWorld(), f1, 0.0F);
+ } else if (blockposition != null) {
+ entityplayer1.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.NO_RESPAWN_BLOCK_AVAILABLE, 0.0F));
+- entityplayer1.setRespawnPosition(null, null, 0f, false, false, PlayerSpawnChangeEvent.Cause.RESET); // CraftBukkit - SPIGOT-5988: Clear respawn location when obstructed
++ entityplayer1.setRespawnPosition(null, null, 0f, false, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLAYER_RESPAWN); // CraftBukkit - SPIGOT-5988: Clear respawn location when obstructed // Paper - Add PlayerSetSpawnEvent
+ }
+ }
+
+diff --git a/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java b/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java
+index ecaa7f0b2bf795f16187f11fa27f6d5d435ccbfe..acd5ec218b8d4c096f44ae2eec1379eeaf30ddc5 100644
+--- a/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java
+@@ -87,9 +87,14 @@ public class RespawnAnchorBlock extends Block {
+ ServerPlayer entityplayer = (ServerPlayer) player;
+
+ if (entityplayer.getRespawnDimension() != world.dimension() || !pos.equals(entityplayer.getRespawnPosition())) {
+- entityplayer.setRespawnPosition(world.dimension(), pos, 0.0F, false, true, org.bukkit.event.player.PlayerSpawnChangeEvent.Cause.RESPAWN_ANCHOR); // CraftBukkit
++ if (entityplayer.setRespawnPosition(world.dimension(), pos, 0.0F, false, true, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.RESPAWN_ANCHOR)) { // Paper - Add PlayerSetSpawnEvent
+ world.playSound((Player) null, (double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, SoundEvents.RESPAWN_ANCHOR_SET_SPAWN, SoundSource.BLOCKS, 1.0F, 1.0F);
+ return InteractionResult.SUCCESS;
++ // Paper start - Add PlayerSetSpawnEvent
++ } else {
++ return InteractionResult.FAIL;
++ }
++ // Paper end - Add PlayerSetSpawnEvent
+ }
+ }
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index 667d0f7f50f7000d71efe429e2218e0358e22698..75d06c92de46a8cb374985435e89bb3b03962ee4 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -1318,9 +1318,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ @Override
+ public void setBedSpawnLocation(Location location, boolean override) {
+ if (location == null) {
+- this.getHandle().setRespawnPosition(null, null, 0.0F, override, false, PlayerSpawnChangeEvent.Cause.PLUGIN);
++ this.getHandle().setRespawnPosition(null, null, 0.0F, override, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLUGIN); // Paper - Add PlayerSetSpawnEvent
+ } else {
+- this.getHandle().setRespawnPosition(((CraftWorld) location.getWorld()).getHandle().dimension(), CraftLocation.toBlockPosition(location), location.getYaw(), override, false, PlayerSpawnChangeEvent.Cause.PLUGIN);
++ this.getHandle().setRespawnPosition(((CraftWorld) location.getWorld()).getHandle().dimension(), CraftLocation.toBlockPosition(location), location.getYaw(), override, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLUGIN); // Paper - Add PlayerSetSpawnEvent
+ }
+ }
+