aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0697-Add-PlayerSetSpawnEvent.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0697-Add-PlayerSetSpawnEvent.patch')
-rw-r--r--patches/server/0697-Add-PlayerSetSpawnEvent.patch110
1 files changed, 110 insertions, 0 deletions
diff --git a/patches/server/0697-Add-PlayerSetSpawnEvent.patch b/patches/server/0697-Add-PlayerSetSpawnEvent.patch
new file mode 100644
index 0000000000..5af986d650
--- /dev/null
+++ b/patches/server/0697-Add-PlayerSetSpawnEvent.patch
@@ -0,0 +1,110 @@
+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 e95f2222814e104bf9194a96385737dffe2cb2b5..249ab7357aa19d87179fa4c3ae89d9d37f32fbfb 100644
+--- a/src/main/java/net/minecraft/server/commands/SetSpawnCommand.java
++++ b/src/main/java/net/minecraft/server/commands/SetSpawnCommand.java
+@@ -33,7 +33,7 @@ public class SetSpawnCommand {
+ ResourceKey<Level> resourceKey = source.getLevel().dimension();
+
+ for(ServerPlayer serverPlayer : targets) {
+- serverPlayer.setRespawnPosition(resourceKey, pos, angle, true, false);
++ serverPlayer.setRespawnPosition(resourceKey, pos, angle, true, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.COMMAND); // Paper - PlayerSetSpawnEvent
+ }
+
+ String string = resourceKey.location().toString();
+diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+index ec202a84a37acf2c58492380789a24b31032dc40..55bdc0abb1fe42c02479678c3840d1d4da3253ae 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+@@ -1274,7 +1274,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);
++ this.setRespawnPosition(this.level.dimension(), blockposition, this.getYRot(), false, true, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.BED); // Paper - PlayerSetSpawnEvent
+ if (this.level.isDay()) {
+ return Either.left(Player.BedSleepingProblem.NOT_POSSIBLE_NOW);
+ } else {
+@@ -2102,12 +2102,33 @@ public class ServerPlayer extends Player {
+ return this.respawnForced;
+ }
+
++ @Deprecated // Paper
+ public void setRespawnPosition(ResourceKey<Level> dimension, @Nullable BlockPos pos, float angle, boolean forced, boolean sendMessage) {
++ // Paper start
++ this.setRespawnPosition(dimension, pos, angle, forced, sendMessage, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.UNKNOWN);
++ }
++ public void 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 = net.minecraft.server.MCUtil.toLocation(this.getServer().getLevel(dimension), pos);
++ spawnLoc.setYaw(angle);
++ willNotify = sendMessage && !flag2;
++ }
++ com.destroystokyo.paper.event.player.PlayerSetSpawnEvent event = new com.destroystokyo.paper.event.player.PlayerSetSpawnEvent(this.getBukkitEntity(), cause, spawnLoc, forced, willNotify, willNotify ? net.kyori.adventure.text.Component.translatable("block.minecraft.set_spawn") : null);
++ if (!event.callEvent()) {
++ return;
++ }
++ if (event.getLocation() != null) {
++ dimension = event.getLocation().getWorld() != null ? ((CraftWorld) event.getLocation().getWorld()).getHandle().dimension() : dimension;
++ pos = net.minecraft.server.MCUtil.toBlockPosition(event.getLocation());
++ angle = (float) event.getLocation().getYaw();
++ forced = event.isForced();
++ // Paper end
+
+- if (sendMessage && !flag2) {
+- this.sendMessage(new TranslatableComponent("block.minecraft.set_spawn"), Util.NIL_UUID);
++ if (event.willNotifyPlayer() && event.getNotification() != null) { // Paper
++ this.sendMessage(PaperAdventure.asVanilla(event.getNotification()), Util.NIL_UUID); // Paper
+ }
+
+ this.respawnPosition = pos;
+diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
+index 88820ba073e89638304b26e52a39a426f76fb2e9..81957d99205fcee40752914180f9f4a1158a613f 100644
+--- a/src/main/java/net/minecraft/server/players/PlayerList.java
++++ b/src/main/java/net/minecraft/server/players/PlayerList.java
+@@ -895,7 +895,7 @@ public abstract class PlayerList {
+ f1 = (float) Mth.wrapDegrees(Mth.atan2(vec3d1.z, vec3d1.x) * 57.2957763671875D - 90.0D);
+ }
+
+- entityplayer1.setRespawnPosition(worldserver1.dimension(), blockposition, f, flag1, false);
++ entityplayer1.setRespawnPosition(worldserver1.dimension(), blockposition, f, flag1, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLAYER_RESPAWN); // Paper - PlayerSetSpawnEvent
+ flag2 = !flag && flag3;
+ isBedSpawn = true;
+ location = new Location(worldserver1.getWorld(), vec3d.x, vec3d.y, vec3d.z, f1, 0.0F);
+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 d620f559cdd1bd0e161a99123ef6c6f64e3302df..07e893f1859abe3c2a765694c21309d60346ca82 100644
+--- a/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java
+@@ -73,7 +73,7 @@ public class RespawnAnchorBlock extends Block {
+ if (!world.isClientSide) {
+ ServerPlayer serverPlayer = (ServerPlayer)player;
+ if (serverPlayer.getRespawnDimension() != world.dimension() || !pos.equals(serverPlayer.getRespawnPosition())) {
+- serverPlayer.setRespawnPosition(world.dimension(), pos, 0.0F, false, true);
++ serverPlayer.setRespawnPosition(world.dimension(), pos, 0.0F, false, true, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.RESPAWN_ANCHOR); // Paper - 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;
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index f23dbb48e051d69ecae408080a30a1ebe8c32a2b..d5c05d7f09a9b7dd82401760baea2bc429438dbf 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -1106,9 +1106,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);
++ this.getHandle().setRespawnPosition(null, null, 0.0F, override, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLUGIN); // Paper - PlayerSetSpawnEvent
+ } else {
+- this.getHandle().setRespawnPosition(((CraftWorld) location.getWorld()).getHandle().dimension(), new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()), location.getYaw(), override, false);
++ this.getHandle().setRespawnPosition(((CraftWorld) location.getWorld()).getHandle().dimension(), new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()), location.getYaw(), override, false); // Paper - PlayerSetSpawnEvent
+ }
+ }
+