类 net.minecraft.client.entity.player.ClientPlayerEntity 无法转换为类 net.minecraft.entity.player.ServerPlayerEntity

问题描述 投票:0回答:1

我正在 1.16.5 上制作 mod,但是当我根据教程为图块实体创建 gui 并运行 minecraft 来测试 gui 时,minecraft 崩溃了并写信给我 类 net.minecraft.client.entity.player.ClientPlayerEntity 无法转换为类 net.minecraft.entity.player.ServerPlayerEntity 但是本教程的作者没有收到此错误。

    @SuppressWarnings("deprecation")
    @Override
    public ActionResultType use(BlockState p_225533_1_, World worldIn, BlockPos pos,
            PlayerEntity player, Hand p_225533_5_, BlockRayTraceResult p_225533_6_) {
        if(worldIn.isClientSide()) {
            TileEntity te = worldIn.getBlockEntity(pos);
            if(te instanceof DisplayCaseTileEntity) {
                NetworkHooks.openGui((ServerPlayerEntity) player, (DisplayCaseTileEntity) te, pos); // the problem in this line
            }
        }
        return super.use(p_225533_1_, worldIn, pos, player, p_225533_5_, p_225533_6_);
    }

我尝试将 ServerPlayerEntity 更改为 PlayerEntity 但 openGui() 仅适用于 ServerPlayerEntity

java user-interface minecraft minecraft-forge
1个回答
0
投票

你必须考虑这段代码在哪里执行...(几乎)这个项目中的每个代码都由服务器执行一次,由客户端执行一次!您已经用以下行“解决了它”:

if(worldIn.isClientSide()) {

但是当客户端执行代码时,它当然只给你一个ClientPlayerEntity类的对象! 您的代码唯一的问题是您忘记了一个感叹号来否定 IF 语句。

if(!worldIn.isClientSide()) {

方法

NetworkHooks.openGui(...);

只能由服务器执行... 如果您将来有只应由服务器执行的方法,请使用:

import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;

public class OnlyForServer {
    @OnlyIn(Dist.DEDICATED_SERVER)
    public void method() {
        ...
    }
}

您当然也可以使用:

@OnlyIn(Dist.CLIENT);

如果您只想由客户端激活!

© www.soinside.com 2019 - 2024. All rights reserved.