Minecraft模组开发:玩家登录传下界触发Invalid Player Data错误求助
Minecraft模组开发:传送至下界触发“Invalid Player Data”错误解决
你的问题核心出在下界重生点的设置上。原版Minecraft不允许将下界设置为玩家的原生重生维度(床在下界会爆炸,无法正常绑定重生点),而你的下界代码中调用了setPlayerRespawnPoint(player, Level.NETHER, sharedSpawnPosition),这会尝试将玩家的重生点写入下界维度,违反游戏的玩家数据规则,从而触发“Invalid Player Data”错误。
对比末地代码,即便原版末地也无法用床设置重生点,但游戏对末地的重生数据存储限制更宽松;而下界的原生规则直接禁止将其设为重生维度,写入这类数据会直接导致玩家数据验证失败。
解决方案
移除下界重生点设置代码
直接删掉setPlayerRespawnPoint(player, Level.NETHER, sharedSpawnPosition)这一行。如果需要玩家死后回到下界,不要修改原生重生点,而是通过监听PlayerDeathEvent事件,在玩家死亡后强制传送回下界。优化传送逻辑顺序
使用changeDimension的重载方法直接指定目标位置,避免分开调用changeDimension和teleportTo可能引发的冲突:public void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { if (event.getEntity() instanceof ServerPlayer player && !player.level.isClientSide) { ServerLevel netherDimension = player.getServer().getLevel(Level.NETHER); if (netherDimension == null) { return; } if (player.level.dimension() != Level.NETHER) { if (sharedSpawnPosition == null) { sharedSpawnPosition = findSafeIslandPosition(netherDimension); } BlockPos spawnPos = addRandomOffset(sharedSpawnPosition); // 直接通过changeDimension指定传送位置 player.changeDimension(netherDimension, new ServerPlayer.GameModeChange(player.gameMode.getGameModeForPlayer()), spawnPos.atCenter()); } } }延迟执行传送逻辑
PlayerLoggedInEvent触发时玩家数据可能尚未完全加载完成,可通过服务器延迟任务确保数据加载完毕:public void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { if (event.getEntity() instanceof ServerPlayer player && !player.level.isClientSide) { player.getServer().executeLater(() -> { ServerLevel netherDimension = player.getServer().getLevel(Level.NETHER); if (netherDimension == null || player.level.dimension() == Level.NETHER) { return; } if (sharedSpawnPosition == null) { sharedSpawnPosition = findSafeIslandPosition(netherDimension); } BlockPos spawnPos = addRandomOffset(sharedSpawnPosition); player.changeDimension(netherDimension, new ServerPlayer.GameModeChange(player.gameMode.getGameModeForPlayer()), spawnPos.atCenter()); }); } }
内容的提问来源于stack exchange,提问作者Gustavo Zago




