You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Minecraft模组开发:玩家登录传下界触发Invalid Player Data错误求助

Minecraft模组开发:传送至下界触发“Invalid Player Data”错误解决

你的问题核心出在下界重生点的设置上。原版Minecraft不允许将下界设置为玩家的原生重生维度(床在下界会爆炸,无法正常绑定重生点),而你的下界代码中调用了setPlayerRespawnPoint(player, Level.NETHER, sharedSpawnPosition),这会尝试将玩家的重生点写入下界维度,违反游戏的玩家数据规则,从而触发“Invalid Player Data”错误。

对比末地代码,即便原版末地也无法用床设置重生点,但游戏对末地的重生数据存储限制更宽松;而下界的原生规则直接禁止将其设为重生维度,写入这类数据会直接导致玩家数据验证失败。

解决方案

  1. 移除下界重生点设置代码
    直接删掉setPlayerRespawnPoint(player, Level.NETHER, sharedSpawnPosition)这一行。如果需要玩家死后回到下界,不要修改原生重生点,而是通过监听PlayerDeathEvent事件,在玩家死亡后强制传送回下界。

  2. 优化传送逻辑顺序
    使用changeDimension的重载方法直接指定目标位置,避免分开调用changeDimensionteleportTo可能引发的冲突:

    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());
            }
        }
    }
    
  3. 延迟执行传送逻辑
    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

火山引擎 最新活动