我正在 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
你必须考虑这段代码在哪里执行...(几乎)这个项目中的每个代码都由服务器执行一次,由客户端执行一次!您已经用以下行“解决了它”:
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);
如果您只想由客户端激活!