mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-29 15:49:00 +01:00
Add PlayerSetSpawnEvent (#5690)
This commit is contained in:
parent
973d5bf77b
commit
299284be1d
2 changed files with 295 additions and 0 deletions
185
patches/api/Add-PlayerSetSpawnEvent.patch
Normal file
185
patches/api/Add-PlayerSetSpawnEvent.patch
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
||||||
|
Date: Wed, 19 May 2021 18:58:24 -0700
|
||||||
|
Subject: [PATCH] Add PlayerSetSpawnEvent
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/src/main/java/com/destroystokyo/paper/event/player/PlayerSetSpawnEvent.java b/src/main/java/com/destroystokyo/paper/event/player/PlayerSetSpawnEvent.java
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerSetSpawnEvent.java
|
||||||
|
@@ -0,0 +0,0 @@
|
||||||
|
+package com.destroystokyo.paper.event.player;
|
||||||
|
+
|
||||||
|
+import net.kyori.adventure.text.Component;
|
||||||
|
+import org.bukkit.Location;
|
||||||
|
+import org.bukkit.entity.Player;
|
||||||
|
+import org.bukkit.event.Cancellable;
|
||||||
|
+import org.bukkit.event.HandlerList;
|
||||||
|
+import org.bukkit.event.player.PlayerEvent;
|
||||||
|
+import org.jetbrains.annotations.NotNull;
|
||||||
|
+import org.jetbrains.annotations.Nullable;
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Called when a player's spawn is set, either by themselves or otherwise.<br>
|
||||||
|
+ * Cancelling this event will prevent the spawn from being set.
|
||||||
|
+ */
|
||||||
|
+public class PlayerSetSpawnEvent extends PlayerEvent implements Cancellable {
|
||||||
|
+
|
||||||
|
+ private static final HandlerList HANDLER_LIST = new HandlerList();
|
||||||
|
+
|
||||||
|
+ private final Cause cause;
|
||||||
|
+ private Location location;
|
||||||
|
+ private boolean forced;
|
||||||
|
+ private boolean notifyPlayer;
|
||||||
|
+ private Component notification;
|
||||||
|
+
|
||||||
|
+ private boolean cancelled;
|
||||||
|
+
|
||||||
|
+ public PlayerSetSpawnEvent(@NotNull Player who, @NotNull Cause cause, @Nullable Location location, boolean forced, boolean notifyPlayer, @Nullable Component notification) {
|
||||||
|
+ super(who);
|
||||||
|
+ this.cause = cause;
|
||||||
|
+ this.location = location;
|
||||||
|
+ this.forced = forced;
|
||||||
|
+ this.notifyPlayer = notifyPlayer;
|
||||||
|
+ this.notification = notification;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Gets the cause of this event.
|
||||||
|
+ *
|
||||||
|
+ * @return the cause
|
||||||
|
+ */
|
||||||
|
+ @NotNull
|
||||||
|
+ public Cause getCause() {
|
||||||
|
+ return cause;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Gets the location that the spawn is set to. The yaw
|
||||||
|
+ * of this location is the spawn angle.
|
||||||
|
+ *
|
||||||
|
+ * @return the spawn location, or null if removing the location
|
||||||
|
+ */
|
||||||
|
+ @Nullable
|
||||||
|
+ public Location getLocation() {
|
||||||
|
+ return location;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Sets the location to be set as the spawn location. The yaw
|
||||||
|
+ * of this location is the spawn angle.
|
||||||
|
+ *
|
||||||
|
+ * @param location the spawn location, or null to remove the spawn location
|
||||||
|
+ */
|
||||||
|
+ public void setLocation(@Nullable Location location) {
|
||||||
|
+ this.location = location;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Gets if this is a force spawn location
|
||||||
|
+ *
|
||||||
|
+ * @return true if forced
|
||||||
|
+ */
|
||||||
|
+ public boolean isForced() {
|
||||||
|
+ return forced;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Sets if this is a forced spawn location
|
||||||
|
+ *
|
||||||
|
+ * @param forced true to force
|
||||||
|
+ */
|
||||||
|
+ public void setForced(boolean forced) {
|
||||||
|
+ this.forced = forced;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Gets if this action will notify the player their spawn
|
||||||
|
+ * has been set.
|
||||||
|
+ *
|
||||||
|
+ * @return true to notify
|
||||||
|
+ */
|
||||||
|
+ public boolean willNotifyPlayer() {
|
||||||
|
+ return notifyPlayer;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Sets if this action will notify the player that their spawn
|
||||||
|
+ * has been set.
|
||||||
|
+ *
|
||||||
|
+ * @param notifyPlayer true to notify
|
||||||
|
+ */
|
||||||
|
+ public void setNotifyPlayer(boolean notifyPlayer) {
|
||||||
|
+ this.notifyPlayer = notifyPlayer;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Gets the notification message that will be sent to the player
|
||||||
|
+ * if {@link #willNotifyPlayer()} returns true.
|
||||||
|
+ *
|
||||||
|
+ * @return null if no notification
|
||||||
|
+ */
|
||||||
|
+ @Nullable
|
||||||
|
+ public Component getNotification() {
|
||||||
|
+ return notification;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Sets the notification message that will be sent to the player.
|
||||||
|
+ *
|
||||||
|
+ * @param notification null to send no message
|
||||||
|
+ */
|
||||||
|
+ public void setNotification(@Nullable Component notification) {
|
||||||
|
+ this.notification = notification;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public boolean isCancelled() {
|
||||||
|
+ return this.cancelled;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public void setCancelled(boolean cancel) {
|
||||||
|
+ this.cancelled = cancel;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public @NotNull HandlerList getHandlers() {
|
||||||
|
+ return HANDLER_LIST;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @NotNull
|
||||||
|
+ public static HandlerList getHandlerList() {
|
||||||
|
+ return HANDLER_LIST;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public enum Cause {
|
||||||
|
+ /**
|
||||||
|
+ * When a player interacts successfully with a bed.
|
||||||
|
+ */
|
||||||
|
+ BED,
|
||||||
|
+ /**
|
||||||
|
+ * When a player interacts successfully with a respawn anchor.
|
||||||
|
+ */
|
||||||
|
+ RESPAWN_ANCHOR,
|
||||||
|
+ /**
|
||||||
|
+ * When a player respawns.
|
||||||
|
+ */
|
||||||
|
+ PLAYER_RESPAWN,
|
||||||
|
+ /**
|
||||||
|
+ * When the {@code /spawnpoint} command is used on a player.
|
||||||
|
+ */
|
||||||
|
+ COMMAND,
|
||||||
|
+ /**
|
||||||
|
+ * When a plugin uses {@link Player#setBedSpawnLocation(Location)} or
|
||||||
|
+ * {@link Player#setBedSpawnLocation(Location, boolean)}.
|
||||||
|
+ */
|
||||||
|
+ PLUGIN,
|
||||||
|
+ /**
|
||||||
|
+ * Fallback cause.
|
||||||
|
+ */
|
||||||
|
+ UNKNOWN,
|
||||||
|
+ }
|
||||||
|
+}
|
110
patches/server/Add-PlayerSetSpawnEvent.patch
Normal file
110
patches/server/Add-PlayerSetSpawnEvent.patch
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
||||||
|
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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
|
--- a/src/main/java/net/minecraft/server/commands/SetSpawnCommand.java
|
||||||
|
+++ b/src/main/java/net/minecraft/server/commands/SetSpawnCommand.java
|
||||||
|
@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
|
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||||
|
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||||
|
@@ -0,0 +0,0 @@ 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 {
|
||||||
|
@@ -0,0 +0,0 @@ public class ServerPlayer extends Player {
|
||||||
|
return this.respawnForced;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ @Deprecated // Paper
|
||||||
|
public void setRespawnPosition(ResourceKey<Level> dimension, @Nullable BlockPos pos, float angle, boolean spawnPointSet, boolean sendMessage) {
|
||||||
|
+ // Paper start
|
||||||
|
+ this.setRespawnPosition(dimension, pos, angle, spawnPointSet, sendMessage, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.UNKNOWN);
|
||||||
|
+ }
|
||||||
|
+ public void setRespawnPosition(ResourceKey<Level> dimension, @Nullable BlockPos pos, float angle, boolean spawnPointSet, 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, spawnPointSet, 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().getY();
|
||||||
|
+ spawnPointSet = 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
|
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
|
||||||
|
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
|
||||||
|
@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
|
--- a/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java
|
||||||
|
+++ b/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java
|
||||||
|
@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||||
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||||
|
@@ -0,0 +0,0 @@ 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue