MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针

如果在编辑的过程中遇到了什么问题,可以去讨论板提问。

为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证

MCBBS Wiki GitHub群组已上线!

您可以在回声洞中发表吐槽!

服务器状态监控。点击进入

本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>

用户:MashKJo/1.12.2模组开发教程/11.高级物品和方块 - 前置概念:修订间差异

跳到导航 跳到搜索
→‎World:​ // Edit via Wikiplus
→‎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。你可能会注意到,第三条和第四条是相冲突的,当发生冲突时,以第三条为准。
行政员、​优秀编辑者、​界面管理员、​监督员、​管理员、​小部件编辑者
3,417

个编辑

我们提供服务需要使用Cookie。您使用我们的服务,即表示您同意我们使用Cookie。

导航菜单