Files
Shiroha/shiroha-server/minecraft-patches/features/0003-Correct-player-respawn-place.patch
T

55 lines
3.4 KiB
Diff
Raw Normal View History

2026-07-09 00:03:09 +08:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Helvetica Volubi <suisuroru@blue-millennium.fun>
Date: Wed, 8 Jul 2026 20:55:35 +0800
Subject: [PATCH] Correct player respawn place
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
index 16f49ae6736c475207f31392307e280ec06edbc3..38f327804ab6fc24bd313d14c4d28a69365a4283 100644
2026-07-09 00:03:09 +08:00
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
@@ -511,8 +511,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
double amountX = selectMaxX - selectMinX;
double amountZ = selectMaxZ - selectMinZ;
- int selectX = amountX < 1.0 ? Mth.floor(worldBorder.getCenterX()) : (int)Mth.floor((amountX + 1.0) * random.nextDouble() + selectMinX);
- int selectZ = amountZ < 1.0 ? Mth.floor(worldBorder.getCenterZ()) : (int)Mth.floor((amountZ + 1.0) * random.nextDouble() + selectMinZ);
2026-07-14 11:32:51 +08:00
+ // Shiroha start - Correct player respawn place
2026-07-09 00:03:09 +08:00
+ int selectX = amountX < 0.0 ? Mth.floor(worldBorder.getCenterX()) : (int)Mth.floor(amountX * random.nextDouble() + selectMinX);
+ int selectZ = amountZ < 0.0 ? Mth.floor(worldBorder.getCenterZ()) : (int)Mth.floor(amountZ * random.nextDouble() + selectMinZ);
2026-07-14 11:32:51 +08:00
+ // Shiroha end - Correct player respawn place
2026-07-09 00:03:09 +08:00
return new BlockPos(selectX, 0, selectZ);
}
@@ -523,10 +525,20 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
}
private static BlockPos findSpawnAround(ServerLevel world, BlockPos selected) {
2026-07-14 11:32:51 +08:00
+ // Shiroha start - Correct player respawn place
2026-07-09 00:03:09 +08:00
+ BlockPos inChunk = PlayerSpawnFinder.getLevelRespawnPos(world, selected.getX(), selected.getZ());
+ if (inChunk != null) {
+ AABB checkVolume = PlayerSpawnFinder.PLAYER_DIMENSIONS.makeBoundingBox((double)inChunk.getX() + 0.5, (double)inChunk.getY(), (double)inChunk.getZ() + 0.5);
+
+ if (world.noCollision(null, checkVolume, true)) {
+ return inChunk;
+ }
+ }
2026-07-14 11:32:51 +08:00
+ // Shiroha end - Correct player respawn place
2026-07-09 00:03:09 +08:00
// try hard to find, so that we don't attempt another chunk load
for (int dz = -SPAWN_RADIUS_SELECTION_SEARCH; dz <= SPAWN_RADIUS_SELECTION_SEARCH; ++dz) {
for (int dx = -SPAWN_RADIUS_SELECTION_SEARCH; dx <= SPAWN_RADIUS_SELECTION_SEARCH; ++dx) {
- BlockPos inChunk = PlayerSpawnFinder.getLevelRespawnPos(world, selected.getX() + dx, selected.getZ() + dz);
2026-07-14 11:32:51 +08:00
+ inChunk = PlayerSpawnFinder.getLevelRespawnPos(world, selected.getX() + dx, selected.getZ() + dz); // Shiroha - Correct player respawn place
2026-07-09 00:03:09 +08:00
if (inChunk == null) {
continue;
}
2026-07-27 20:47:44 +08:00
@@ -1997,7 +2009,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
2026-07-09 00:03:09 +08:00
}
if (newLevel.dimension() == lastDimension) {
- this.connection.internalTeleport(PositionMoveRotation.of(transition), transition.relatives()); // CraftBukkit
2026-07-14 11:32:51 +08:00
+ this.connection.internalTeleport(PositionMoveRotation.of(transition), transition.relatives()); // CraftBukkit // Shiroha - Correct player respawn place
2026-07-09 00:03:09 +08:00
this.connection.resetPosition();
transition.postTeleportTransition().onTransition(this);
return this;