美文网首页
Bukkit插件开发教程 - Block(方块)

Bukkit插件开发教程 - Block(方块)

作者: Zoyn_ | 来源:发表于2018-07-24 19:26 被阅读0次

    方块 - Block

    学习目标

    • 了解在BukkitAPI中,对方块的一些操作
    • 如何将方块转换成其子对象

    了解在BukkitAPI中,对方块的一些操作

    既然是对方块进行操作,我们首先需要获得一个Block对象,我们可以通过以下的一些方法来获取到一个Block对象

    • 利用Location来获取方块
    • 利用World+Location来获取方块
    我们先来讲讲第一种

    第一种的话我们首先需要的是一个叫Location的东西,这个是用于表示一个在MC世界里的一个点,它类似于我们在数学上所说的空间直角坐标系上的一个点,只不过它有了而外的两个东西,Pitch和Yaw,于是Location就有个一个叫方向的概念,在BukkitAPI中可以用BlockFace来表示方向

    得到一个Location对象我们不妨可以直接使用 Entity#getLocation 方法进行获取
    以下的范例我们使用player来做一个entity

    // 得到玩家的坐标
    Location location = player.getLocation();
    // 通过坐标得到对应世界下对应的方块
    Block block = player.getLocation();
    
    第二种

    第二种的话引入一个叫World的概念,它用于表示一个MC世界,若我们想获取该世界的一个方块,我们可以使用方法 World#getBlockAt(int, int, int)
    填入的是3个整形,那么它近似的可以等于Location(world, int, int, int)

    // 三个整形
    int x = 6;
    int y = 6;
    int z = 6;
    // 以下使用了Bukkit类中的静态方法getWorld,填入的是世界名,即可得到对应的世界对象
    World world = Bukkit.getWorld("world");
    // 利用给定的坐标得到对应的方块
    Block block = world.getBlockAt(x, y, z);
    

    如何将方块转换成其子对象

    在BukkitAPI中,Block是作为一个"活着"的对象存在的,那么如果我们想对一个Block进行进一步的操作,就需要先获取它的BlockState对象

    BlockState可以用来表示当前tick时该Block的一个"快照",在对其进行操作之后可以调用其update()方法来进行方块更新

    范例: 给一个Chest方块增加物品

    // 在BukkitAPI中,它存在着一些特殊的方块,那么对应的也有一个类用于表示它,那么箱子方块就是一个很好的例子
    
    // 首先得到block对象
    Block block = blabla;
    // 得到该方块的BlockState后我们才能进行强转的操作!!!
    BlockState state = block.getBlockState();
    Chest chest = (Chest) state;
    // 得到该箱子的容器对象
    Inventory inventory = chest.getBlockInventory();
    inventory.addItem(new ItemStack(Material.APPLE));
    

    以上的范例我们并没有调用update方法进行方块更新,是因为在高版本当中,我们在当前tick做的修改操作,它在下一tick会自动的更新,所以我们可以不需要进行手动的一个更新 (当然你发现不能更新的时候就可以手动更新)

    相关文章

      网友评论

          本文标题:Bukkit插件开发教程 - Block(方块)

          本文链接:https://www.haomeiwen.com/subject/xzmymftx.html