3,417
个编辑
MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针。
如果在编辑的过程中遇到了什么问题,可以去讨论板提问。
为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证。
MCBBS Wiki GitHub群组已上线!
您可以在回声洞中发表吐槽!
服务器状态监控。点击进入
本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>
(→RayTraceResult: // Edit via Wikiplus) |
(→World: // Edit via Wikiplus) |
||
| 第60行: | 第60行: | ||
== World == | == World == | ||
其实在笔者看来,World类是个设计得比较奇怪的类,从字面意思上看,它就是代表着某个维度——这么理解的确是对的。然而,World类可不仅承载了维度这一概念,甚至还包括了存档这一概念——World中相关信息的保存路径、世界生成时选择的设置(如是否有奖励箱生成),甚至“是否开启了极限模式”这种全局通用设置,你都能从一个World对象中获取。Mojang显然是把“维度”和“存档”这两个概念揉到了一个类中——即World类。 | |||
World类的设计极为复杂,相关的方法、用途也很多,这里只做简要说明。很多其他的东西,会在将来讲到添加新维度时,一并说明的。 | |||
=== 判断当前逻辑端 === | |||
没错,我们终于说到了,判断当前所处的逻辑端的方法——检查非静态字段isRemote的值——是true,则代表当前为逻辑客户端,否则为逻辑服务端。虽然也有其它一些方法来判断逻辑段,但都没有这种方法好用,因为World对象在Minecraft各处代码中均可见到。 | |||
== 在世界中放置方块 == | |||
在一个World中获取某坐标处的方块状态很简单,getBlockState这个方法即可胜任。与之类似地,放置方块,可以用setBlockState。 | |||
但我们注意到:后者有2个重载,形参列表的区别在于:有一个重载较另一个重载而言,多了一个:<code>int flags</code>。flags即标记,但它又是一个int类型的数——显然,它是一个幻数,具体含义到底如何,全看Mojang的底层设计如何了。如果去看看那个较为简单的方法,可以发现,它实际上是调用了另一个重载方法,并指定flags为3——为什么是3? | |||
显然,这很让人摸不着头脑。不过Forge在<code>Constants.BlockFlags</code>类下提供了相应的常量,并通过注释和常量名说明了flags的具体含义。简单地说,Minecraft会从传入的幻数中获取很多信息,每一种信息的具体值都由传入的幻数对应的二进制数的每一位决定: | |||
{| class="wikitable" style="text-align:center;" | |||
| style="font-weight:bold;" | 常量名及含义 | style="font-weight:bold;" | 数值(二进制形式) | | |||
|- | |||
| NOTIFY_NEIGHBORS(邻近方块更新) | 0b00001 | | |||
|- | |||
| SEND_TO_CLIENTS(将相关数据同步到客户端) | 0b00010 | | |||
|- | |||
| NO_RENDERER(该方块的渲染状态不会被更新) | 0b00100 | | |||
|- | |||
| RENDERER_MAIN_THREAD(让方块的渲染状态在游戏主线程中立刻被更新) | 0b01000 | | |||
|- | |||
| NO_OBSERVERS(该行为不会被观察者方块观测到) | 0b10000 | | |||
|} | |||
Minecraft的默认行为是采取前两项行为,因此默认的幻数值是把前两项行为对应的数进行按位或运算,即0b00011——实际上也就是上文提到的3。你可能会注意到,第三条和第四条是相冲突的,当发生冲突时,以第三条为准。 | |||