3232import net .minecraft .server .world .ChunkTicketType ;
3333import net .minecraft .server .world .ServerWorld ;
3434import net .minecraft .text .Text ;
35+ import net .minecraft .util .ErrorReporter ;
3536import net .minecraft .util .Unit ;
3637import net .minecraft .util .math .ChunkPos ;
3738import net .minecraft .world .World ;
@@ -91,13 +92,13 @@ private void onDisconnect(DisconnectionInfo info, CallbackInfo ci) {
9192 }
9293 }
9394
94- @ WrapOperation (method = "onReady" , at = @ At (value = "INVOKE " , target = "Lnet/minecraft/server/PlayerManager;createPlayer( Lcom/mojang/authlib/GameProfile;Lnet/minecraft/network/packet/c2s/common/SyncedClientOptions;)Lnet/minecraft/server/network/ServerPlayerEntity;" ))
95- private ServerPlayerEntity replacePlayer (PlayerManager instance , GameProfile profile , SyncedClientOptions syncedOptions , Operation <ServerPlayerEntity > original ) {
95+ @ WrapOperation (method = "onReady" , at = @ At (value = "NEW " , target = "( Lnet/minecraft/server/MinecraftServer;Lnet/minecraft/server/world/ServerWorld; Lcom/mojang/authlib/GameProfile;Lnet/minecraft/network/packet/c2s/common/SyncedClientOptions;)Lnet/minecraft/server/network/ServerPlayerEntity;" ))
96+ private ServerPlayerEntity replacePlayer (MinecraftServer server , ServerWorld world , GameProfile profile , SyncedClientOptions clientOptions , Operation <ServerPlayerEntity > original ) {
9697 if (this .vmp$heldPlayer != null ) {
9798 this .vmp$dropTicket ();
9899 return this .vmp$heldPlayer ;
99100 } else {
100- return original .call (instance , profile , syncedOptions );
101+ return original .call (server , world , profile , clientOptions );
101102 }
102103 }
103104
@@ -116,19 +117,20 @@ private void delayJoinWorld(ServerPlayerConfigurationTask instance, Consumer<Pac
116117 return ;
117118 }
118119
119- ServerPlayerEntity player = playerManager . createPlayer ( this .profile , this .syncedOptions );
120+ ServerPlayerEntity player = new ServerPlayerEntity ( this . server , this . server . getOverworld (), this .profile , this .syncedOptions );
120121 this .vmp$heldPlayer = player ;
121122
122- RegistryKey <World > registryKey = playerManager .loadPlayerData (player )
123- .flatMap (nbt -> DimensionType .worldFromDimensionNbt (new Dynamic <>(NbtOps .INSTANCE , nbt .get ("Dimension" ))).resultOrPartial (LOGGER ::error ))
124- .orElse (World .OVERWORLD );
125- ServerWorld storedWorld = playerManager .getServer ().getWorld (registryKey );
126123 ServerWorld actualWorld ;
127- if (storedWorld == null ) {
128- LOGGER .warn ("Unknown respawn dimension {}, defaulting to overworld" , registryKey );
129- actualWorld = playerManager .getServer ().getOverworld ();
130- } else {
131- actualWorld = storedWorld ;
124+ try (ErrorReporter .Logging logging = new ErrorReporter .Logging (player .getErrorReporterContext (), LOGGER )) {
125+ RegistryKey <World > registryKey = playerManager .loadPlayerData (player , logging )
126+ .flatMap (view -> view .read ("Dimension" , World .CODEC )).orElse (World .OVERWORLD );
127+ ServerWorld storedWorld = playerManager .getServer ().getWorld (registryKey );
128+ if (storedWorld == null ) {
129+ LOGGER .warn ("Unknown respawn dimension {}, defaulting to overworld" , registryKey );
130+ actualWorld = playerManager .getServer ().getOverworld ();
131+ } else {
132+ actualWorld = storedWorld ;
133+ }
132134 }
133135
134136 ChunkPos chunkPos = new ChunkPos (player .getBlockPos ());
0 commit comments