方块 - 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会自动的更新,所以我们可以不需要进行手动的一个更新 (当然你发现不能更新的时候就可以手动更新)