99
1010import net .minecraft .core .BlockPos ;
1111import net .minecraft .network .chat .Component ;
12+ import net .minecraft .resources .ResourceKey ;
1213import net .minecraft .resources .ResourceLocation ;
1314import net .minecraft .server .level .ServerLevel ;
1415import net .minecraft .server .level .ServerPlayer ;
@@ -101,19 +102,33 @@ public static boolean executeHome(ServerPlayer player) {
101102 }
102103
103104 int cost = ReflectionConstants .getCommandCost (reflection , "home" );
104- Optional <Vec3 > homePos = findHomePosition (player );
105- if (homePos .isEmpty ()) {
105+ Optional <HomeLocation > homeLoc = findHomePosition (player );
106+ if (homeLoc .isEmpty ()) {
106107 player .displayClientMessage (
107108 Component .literal ("\u00A7 cYou have no home to return to." ),
108109 false );
109110 return false ;
110111 }
111112
112- Vec3 home = homePos .get ();
113+ HomeLocation home = homeLoc .get ();
114+ ServerLevel targetLevel = player .server .getLevel (home .dimension );
115+ if (targetLevel == null ) {
116+ player .displayClientMessage (
117+ Component .literal ("\u00A7 cThat place no longer exists." ),
118+ false );
119+ return false ;
120+ }
121+
113122 reflection .addErosion (cost );
114123 reflection .recordCommandUse ("home" );
115124
116- player .teleportTo (home .x , home .y , home .z );
125+ Vec3 pos = home .position ;
126+ if (player .level ().dimension () != home .dimension ) {
127+ player .teleportTo (targetLevel , pos .x , pos .y , pos .z , player .getYRot (), player .getXRot ());
128+ } else {
129+ player .teleportTo (pos .x , pos .y , pos .z );
130+ }
131+
117132 player .level ().playSound (null , player .blockPosition (),
118133 SoundEvents .ENDERMAN_TELEPORT , SoundSource .PLAYERS , 1.0f , 0.8f );
119134
@@ -137,25 +152,29 @@ public static boolean executeHome(ServerPlayer player) {
137152 }).orElse (false );
138153 }
139154
140- private static Optional <Vec3 > findHomePosition (ServerPlayer player ) {
155+ private static Optional <HomeLocation > findHomePosition (ServerPlayer player ) {
141156 BlockPos bedPos = player .getRespawnPosition ();
142157 if (bedPos != null ) {
143- ServerLevel respawnLevel = player .server .getLevel (player .getRespawnDimension ());
158+ ResourceKey <Level > respawnDim = player .getRespawnDimension ();
159+ ServerLevel respawnLevel = player .server .getLevel (respawnDim );
144160 if (respawnLevel != null ) {
145161 Optional <Vec3 > bedSpawn = Player .findRespawnPositionAndUseSpawnBlock (
146162 respawnLevel , bedPos , player .getRespawnAngle (), true , false );
147163 if (bedSpawn .isPresent ()) {
148- return bedSpawn ;
164+ return Optional . of ( new HomeLocation ( respawnDim , bedSpawn . get ())) ;
149165 }
150166 }
151167 }
152168
153169 ServerLevel overworld = player .server .getLevel (Level .OVERWORLD );
154170 if (overworld != null ) {
155171 BlockPos spawnPos = overworld .getSharedSpawnPos ();
156- return Optional .of (new Vec3 (spawnPos .getX () + 0.5 , spawnPos .getY (), spawnPos .getZ () + 0.5 ));
172+ return Optional .of (new HomeLocation (Level .OVERWORLD ,
173+ new Vec3 (spawnPos .getX () + 0.5 , spawnPos .getY (), spawnPos .getZ () + 0.5 )));
157174 }
158175
159176 return Optional .empty ();
160177 }
178+
179+ private record HomeLocation (ResourceKey <Level > dimension , Vec3 position ) {}
161180}
0 commit comments