我的世界Bukkit服务器插件开发教程(五)方块Blocks

本文详细讲解了三维坐标系在Minecraft Bukkit插件开发中的应用,包括如何在指定位置创建、更改和移动方块,以及使用坐标跟踪和世界定位。涉及方块类型转换和移动算法,适合初学者理解空间操作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

五、方块Blocks

我怕不更新会被骂,所以更了。

坐标系

小伙纸,求一下 ∑ i = 0 ∞ i 2 \sum_{i=0}^\infty i^2 i=0i2(bushi


是的,你没猜错,我们要涉及到史上最NB超级无敌掌门狗——数学中的坐标系
首先要知道,我们现在的世界是三维的,三维:长、宽、高 x , y , z x,y,z x,y,z
在这里插入图片描述
形象点讲,你的左边和右边是 x x x轴,上面和下面是 y y y轴,前面和后面是 z z z

方块

方块……没啥好讲的,这次讲的是创建、更改、移动一个方块
为什么没有创建移动两个方法呢?

更改方块

最基本的一种了
1.1.引入
给定 ( X , Y , Z ) (X,Y,Z) (X,Y,Z)的,设我们要在 ( X , Y , Z ) (X,Y,Z) (X,Y,Z)的地方添加一个草方块,如何实现


1.2.找到给定的x,y,z坐标的方块
方块,到处都有,它是在主世界吗?它是在下界,抑或是末地?
所以,我们首先需要知道这种方块在哪个世界。

//如果你不修改世界名,世界名默认是world
World world = Bukkit.getWorld("world");

它的坐标已经给定了,既然确定了大地方和小地方,那么就可以找到方块了。

//在world中找到坐标为(x,y,z)的方块
Block block = world.getBlockAt(x,y,z);

这样,block就是坐标( x , y , z x,y,z x,y,z)的坐标


当然了,找到block基本都是通过玩家的坐标所找到的。
1.3.找到玩家身下的方块

Player player = (Player)sender;

再找到玩家的坐标:player.getLocation()

Block block = player.getLocation();

1.1~1.3是基本功,不然找不到方块你还怎么更改方块?


1.4.更改方块的类型
例如,现在有一个 b l o c k block block存储了一个方块(假设TA是草方块吧)我需要把他改变成一个钻需块(钻需!)那么只需:

//setType:更改方块类型
//Material:Material类里面存储了所有的东西,TA是强大又无敌的
block.setType(Material.DIAMOND_BLOCK);

上面那个栗子就是创建一个方块,你可能会疑惑为什么更改方块的类型就是创建一个方块


其实,世界中到处都是方块,空气也是方块(空气方块)不过是透明的了,将空气方块改成钻石方块,可以看做是添加一个方块,移动一个方块
那么!它!就是!更改就是创建和移动的思想!(重要的dingyi说yi遍!)


1.5.移动方块
b l o c k block block存储了一种方块(遍地都是的草方块中的一个钻需块吧),并给定了 b l o c k block block ( x , y , z ) (x,y,z) (x,y,z)坐标,现在想让这个方块向它的右边方移动一格。


如果你看过一些手画的动画,会发现每一帧都是一幅画
这个原理也是如此,想想呗,想不出来再看。


很简单(对于我而言啦)。
动画看似是连贯的,譬如
既然知道它的坐标,那么正前方就是 ( x + 1 , y , z ) (x+1,y,z) (x+1,y,z),这样就获取了它正前方的坐标。
向正前方移动一个,根据更改就是创建和移动的思想,右边无非就是个钻需块,只需更改它的类型
但是这样又有问题:它原本的坐标还是个钻需块,要把它变成草方块

//block2就是正前方的方块,(x,y,z)已经给出,(x+1,y,z)就是右方的坐标
Block block2 = world.getBlockAt(x+1,y,z);
/*
根据思想:
向右移动就是将它前面的方块改成钻石块
即block2需要改成钻石块
*/
block2.setType(Material.DIAMOND_BLOCK);
/*
那block还没有改类型,会被看成是两个钻石块连在一起
要把它隐瞒起来
即block需要改成草方块
*/
block.setType(Material.GRASS_BLOCK);

再来,如果我们嵌个for循环,那么会被看成一个钻需块一直向TA的正前方滚动。


这时候需要注意一下:
这时候的 b l o c k block block是在不断发生变化的,
如果把上面框起来加个for,那么 b l o c k block block所在位置虽然改成了草方块,
但是当 b l o c k 2 block2 block2迈向第二步的时候,这时候 b l o c k 2 block2 block2的坐标是 ( x + 2 , y , z ) (x+2,y,z) (x+2,y,z)
依照我们刚刚所讲的, b l o c k 2 block2 block2的后面需要改为草方块 ( x + 1 , y , z ) (x+1,y,z) (x+1,y,z)的地方是需要改的,
但是,并没有成功,只是 ( x , y , z ) (x,y,z) (x,y,z)的地方在改变TA的类型
于是乎,我们需要将 b l o c k block block赋值于 ( x + 1 , y , z ) (x+1,y,z) (x+1,y,z)
那么这个对象是谁呢,对的! b l o c k 2 block2 block2,或者说是 ( x + 1 , y , z ) (x+1,y,z) (x+1,y,z)的地方的方块


这相当于 b l o c k block block是跟在 b l o c k 2 block2 block2后面捡石子的人, b l o c k 2 block2 block2每次迈向一步都在扔石子,那我们是需要把这颗石子捡起来,但 b l o c k block block如果一直不动,永远不在 b l o c k 2 block2 block2的身后紧紧跟着,只在 ( x , y , z ) (x,y,z) (x,y,z)的地方永远捡TA的石子,那么,这个捡石子的人永远是失败的

//向前走50步
Block block = world.getBlockAt(x,y,z), block2;
block.setType(Material.DIAMOND_BLOCK);
for(int i=1;i<=50;i++) {
	block2 = world.getBlockAt(x+i,y,z);
	block2.setType(Material.DIAMOND_BLOCK);
	//block,捡石子的人,TA需要跟在block2的后面捡石子,于是乎,block本身需要改变TA的位置
	block.setType(Material.GRASS_BLOCK);
	block = world.getBlockAt(x+i,y,z);
}

效果图:
在这里插入图片描述
有个缺陷,它是在一瞬间完成的,如果是一秒一个那就能看到实际效果了


后期如果把定时器讲完那么就能开发出一个非常NB的插件了(点赞更下期!)
源代码


上一篇:我的世界Bukkit服务器插件开发教程(四)配置文件
下一篇:我的世界Bukkit服务器插件开发教程(六)线程

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值