103 lines
6.8 KiB
Diff
103 lines
6.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Cryptite <cryptite@gmail.com>
|
|
Date: Mon, 10 Apr 2023 07:46:18 -0500
|
|
Subject: [PATCH] Add PlayerGetRespawnLocationEvent
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
|
|
index 1e5f709115007ff19901c0a6c3cf884d9e4d3a6c..81c28b63e9dfe21d8f17f465468c40cf5ef84e9a 100644
|
|
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
|
|
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
|
|
@@ -867,49 +867,57 @@ public abstract class PlayerList {
|
|
|
|
// CraftBukkit start - fire PlayerRespawnEvent
|
|
if (location == null) {
|
|
- // boolean isBedSpawn = false; // Paper - Add PlayerPostRespawnEvent; moved up
|
|
- ServerLevel worldserver1 = this.server.getLevel(entityplayer.getRespawnDimension());
|
|
- if (worldserver1 != null) {
|
|
- Optional optional;
|
|
+ // Slice start
|
|
+ Player respawnPlayer = entityplayer1.getBukkitEntity();
|
|
+ org.bukkit.event.player.PlayerGetRespawnLocationEvent preRespawnEvent = new org.bukkit.event.player.PlayerGetRespawnLocationEvent(respawnPlayer);
|
|
+ preRespawnEvent.callEvent();
|
|
+ location = preRespawnEvent.getRespawnLocation();
|
|
|
|
- if (blockposition != null) {
|
|
- optional = net.minecraft.world.entity.player.Player.findRespawnPositionAndUseSpawnBlock(worldserver1, blockposition, f, flag1, true); // Paper - Fix SPIGOT-5989
|
|
- } else {
|
|
- optional = Optional.empty();
|
|
- }
|
|
+ if (location == null) {
|
|
+ // Slice end
|
|
+ // boolean isBedSpawn = false; // Paper - Add PlayerPostRespawnEvent; moved up
|
|
+ ServerLevel worldserver1 = this.server.getLevel(entityplayer.getRespawnDimension());
|
|
+ if (worldserver1 != null) {
|
|
+ Optional optional;
|
|
+
|
|
+ if (blockposition != null) {
|
|
+ optional = net.minecraft.world.entity.player.Player.findRespawnPositionAndUseSpawnBlock(worldserver1, blockposition, f, flag1, true); // Paper - Fix SPIGOT-5989
|
|
+ } else {
|
|
+ optional = Optional.empty();
|
|
+ }
|
|
|
|
- if (optional.isPresent()) {
|
|
- BlockState iblockdata = worldserver1.getBlockState(blockposition);
|
|
- boolean flag3 = iblockdata.is(Blocks.RESPAWN_ANCHOR);
|
|
- isAnchorSpawn = flag3; // Paper - Fix PlayerRespawnEvent
|
|
- Vec3 vec3d = (Vec3) optional.get();
|
|
- float f1;
|
|
+ if (optional.isPresent()) {
|
|
+ BlockState iblockdata = worldserver1.getBlockState(blockposition);
|
|
+ boolean flag3 = iblockdata.is(Blocks.RESPAWN_ANCHOR);
|
|
+ isAnchorSpawn = flag3; // Paper - Fix PlayerRespawnEvent
|
|
+ Vec3 vec3d = (Vec3) optional.get();
|
|
+ float f1;
|
|
|
|
- if (!iblockdata.is(BlockTags.BEDS) && !flag3) {
|
|
- f1 = f;
|
|
- } else {
|
|
- Vec3 vec3d1 = Vec3.atBottomCenterOf(blockposition).subtract(vec3d).normalize();
|
|
+ if (!iblockdata.is(BlockTags.BEDS) && !flag3) {
|
|
+ f1 = f;
|
|
+ } else {
|
|
+ Vec3 vec3d1 = Vec3.atBottomCenterOf(blockposition).subtract(vec3d).normalize();
|
|
|
|
- f1 = (float) Mth.wrapDegrees(Mth.atan2(vec3d1.z, vec3d1.x) * 57.2957763671875D - 90.0D);
|
|
- }
|
|
+ f1 = (float) Mth.wrapDegrees(Mth.atan2(vec3d1.z, vec3d1.x) * 57.2957763671875D - 90.0D);
|
|
+ }
|
|
|
|
- // entityplayer1.setRespawnPosition(worldserver1.dimension(), blockposition, f, flag1, false); // CraftBukkit - not required, just copies old location into reused entity
|
|
- flag2 = !flag && flag3;
|
|
- isBedSpawn = true;
|
|
- 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, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLAYER_RESPAWN); // CraftBukkit - SPIGOT-5988: Clear respawn location when obstructed // Paper - Add PlayerSetSpawnEvent
|
|
+ // entityplayer1.setRespawnPosition(worldserver1.dimension(), blockposition, f, flag1, false); // CraftBukkit - not required, just copies old location into reused entity
|
|
+ flag2 = !flag && flag3;
|
|
+ isBedSpawn = true;
|
|
+ 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, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLAYER_RESPAWN); // CraftBukkit - SPIGOT-5988: Clear respawn location when obstructed // Paper - Add PlayerSetSpawnEvent
|
|
+ }
|
|
}
|
|
- }
|
|
|
|
- if (location == null) {
|
|
- worldserver1 = this.server.getLevel(Level.OVERWORLD);
|
|
- blockposition = entityplayer1.getSpawnPoint(worldserver1);
|
|
- location = CraftLocation.toBukkit(blockposition, worldserver1.getWorld(), worldserver1.levelData.getSpawnAngle(), 0.0F).add(0.5F, 0.1F, 0.5F); // Paper - Expose world spawn angle
|
|
+ if (location == null) {
|
|
+ worldserver1 = this.server.getLevel(Level.OVERWORLD);
|
|
+ blockposition = entityplayer1.getSpawnPoint(worldserver1);
|
|
+ location = CraftLocation.toBukkit(blockposition, worldserver1.getWorld(), worldserver1.levelData.getSpawnAngle(), 0.0F).add(0.5F, 0.1F, 0.5F); // Paper - Expose world spawn angle
|
|
+ }
|
|
}
|
|
|
|
- Player respawnPlayer = entityplayer1.getBukkitEntity();
|
|
PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(respawnPlayer, location, isBedSpawn && !isAnchorSpawn, isAnchorSpawn, reason, com.google.common.collect.ImmutableSet.<org.bukkit.event.player.PlayerRespawnEvent.RespawnFlag>builder().add(respawnFlags)); // Paper - PlayerRespawnEvent changes
|
|
this.cserver.getPluginManager().callEvent(respawnEvent);
|
|
// Spigot Start
|