• 欢迎来到Minecraft插件百科!
  • 对百科编辑一脸懵逼?帮助:快速入门带您快速熟悉百科编辑!
  • 因近日遭受攻击,百科现已限制编辑,有意编辑请加入插件百科企鹅群:223812289

Dynmap/自定义方块

From Minecraft插件百科
Revision as of 20:46, 16 August 2021 by Ff98sha (talk | contribs) (创建页面,内容为“Dynmap 支持数据驱动的方法来支持对新的 Minecraft 方块的支持,比如通过某些插件和客户端 Mod 提供的新方块。这些定义对 Dynmap…”)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Dynmap 支持数据驱动的方法来支持对新的 Minecraft 方块的支持,比如通过某些插件和客户端 Mod 提供的新方块。这些定义对 Dynmap 的内部光线追踪非常敏感,并且可能在以后的版本没有任何通知就过时了 - 实际上会避免这一点,但是如果你要在这之上花费太多的经历之前请务必了解。

方块是如何被渲染的

Dynmap 的方块的渲染通过很多独特的机制完成,这些机制用于对不同的方块和 Mod 的需求。在所有情况下,方块的渲染由两个核心元素组成:一个模型用于定义方块的形状,一组材质来应用颜色到不同的表面。因为 Minecraft 的"方块"的特质,大多数的方块就是一个简单的立方体:所以大多数方块不需要自定义模型,可以被认为是一个简单的实体方块。

附加 Mod 的对自定义方块的支持文件是通过对每个 Mod 定义两个文件来实现的:一个定义纹理贴图(按照命名约定 *-texture.txt,放在 'renderdata' 文件夹(或者该文件夹下的子目录)),一个用于定义不是简单立方体的方块的模型(按照命名约定 *-models.txt,放在 'renderdata' 文件夹(或者该文件夹下的子目录))。对那些只有简单方块的 Mod,不需要 *-models.txt 文件(没有定义模型的方块全部处理为简单立方体)。

创建材质和模型定义文件
  • 材质和模型文件的基础特性
  • 查看材质定义文件的细节
  • 查看模型定义文件的细节
定义方块
  • 定义一个简单的立方体,查看定义一个简单的方块
  • 定义一个长方体方块,查看定义长方体方块
  • 定义基于自定义的方块渲染器的方块,查看自定义方块着色器 定义一个基于立体模型的方块,查看使用立体方块模型

材质和模型文件的基础特性

材质和模型定义文件遵循一些常见的格式惯例:

  • 每个定义都是面向单行的,尽管部分定义会影响到下一行的定义
  • 所有行按照文件中的顺序处理
  • 以数字符号(#)或分号(;)将被视为一条注释并被忽略
  • 任何一行都可以以版本限制开始,只允许在 Minecraft 的特定版本或与文件相关的 Mod 的特定版本进行处理。对于 Minecraft 的版本限制,格式为 [<低版本>-<高版本>],<低版本>为可选的,<高版本>为最大可用的 Minecraft 版本(如,[1.5.0-1.6.4] 将会导致该行仅在 Minecraft 1.5.0 到 1.6.4 版本之间才被处理,[-1.6.4] 将不会在任何版本高于 1.6.4 的 Minecraft 中被处理,而 [1.5.2-] 将会在 Minecraft 高于 1.5.2 时进行处理)。对于 Mod 版本限制,格式是类似的:[mod:<低版本>-<高版本>]。

纹理和模型定义文件都支持以下的定义行,这些通常用于文件的开头:

  • 'version:' - 如果设置,此选项指定了对 Minecraft 版本的限制。该行的格式为 version:<低版本>-<高版本>,<低版本> 和 <高版本> 指定了 Minecraft 的最小和最大的可用版本。如果指定的范围与实际不符,那么此文件将终止处理,并且不会被使用。
  • 'modname:' - 如果设置,此选项指定了相关的 Mod 的名称,这是区分大小写的,必须和 Mod 名称相同,如果使用不同的名称(比如不同的版本),可以提供多个版本(使用逗号分隔)。每个名称后面都可以添加可选的版本限制 [<低版本>-<高版本>],这样只有安装了指定的 Mod 并且版本相符才会使用该定义文件。例如,modname:BiomesOPlenty[-0.5.8] 将只有在安装了 BiomeOPlenty 0.5.8 之前的版本才会加载此定义文件。
  • 'cfgfile:' - 如果设置,则设置寻找配置文件的相对路径(假设格式为 Minecraft Forge 的标准配置文件的格式)。这会让相关的配置文件加载,并且定义不同种类的设置的符号(特别是不同的方块 ID)。查看配置设定查看详细信息。
  • 'var:' - 如果设置,这将为配置文件的没有设置的选项设置默认值(比如老版本没有的方块的 ID)。设置的格式为使用逗号分隔的 <属性>=<数字> 列表。(比如 'var:template.id=0,architect.id=0,pathMarker.id=0)。如果需要添加 var 行,请在 cfgfile: 之前添加它们(否则将会覆盖配置文件的值)。
配置设定映射

通过 cfgfile: 行加载的配置文件将产生可用的符号,配置文件的选项的名称映射到这些符号的方法如下:

  • 每个设置将会和和它包含的子设置结合,以 / 作为分隔,比如 "blocks" 下的 "my Block ID" 设定将转换为 blocks/my Block ID。
  • 这些符号的任何空格将会转换为下划线,如 blocks/my Block ID 将转换为 blocks/my_Block_ID。
  • 如果设置以 "block/" 或者 "blocks/" 开头,那么将会将这一部分去除,如 blocks/my_Block_ID 将会转换为 my_Block_ID,但是 biomes/my_Biome 不会发生改变。
  • 如果符号以 "item/" 开头,那么将会替换为 item_,如 item/myItem 将会转换为 item_myItem。
  • 最终,属性值与符号连接。

配置文件中的符号可用于定义文件中的各种特定情况(最常用于方块 ID 属性值)。尝试使用未使用过的符号 - 通过配置文件或通过 var: 定义行 - 将在加载定义文件时发生错误。

材质定义文件

材质定义文件(*-texture.txt 文件)提供了数据的三个关键设置:

  • 需要什么材质文件,以及他们怎么被读取
  • 每个自定义方块的每个面应用什么材质,伴随着的还有这些材质如何被使用(例如:根据生物群系的不同来进行染色,旋转,添加覆盖层,等等)
  • 在Mod提供自定义生物群系时,附加属性需要决定怎样提供生物群系敏感的材质
定义材质文件

在历史之中,Minecraft使用了很多定义材质的方法,并且这些方法变化了好几次(特别是在1.5版本,1.6版本又变了一次)。要想处理这些不同之处的话,你需要指定一些定义标志。

为1.6.x和之后的服务器定义材质

至于 Minecraft v1.6.0,大多数嵌入的材质都包括在 assets/minecraft/textures/blocks 路径(在Minecraft客户端的Jar文件中,或者在资源包的ZIP文件中)下找到的单个文件。对于 v1.6.x 和晚些的Minecraft Forge Mod,材质资源需要在给予的Mod文件(ZIP或JAR)中找到,路径为 assets/\/textures/blocks (其中 \ 是用小写表示的Mod名字)。

要想指定加载材质所使用的相对路径,'texturepath:' 这一行应该被包括在材质文件之中。在设置之后,给予的路径可以用来读取任何指定的材质(或者,至少直到加载下一个 texturepath: 行——在这一点上,它的路径可以用来加载额外的材质)。举个例子,Minecraft V1.6.x ,或更晚版本的 BiomesOPlenty Mod 的材质应该为:

 texturepath:assets/biomesoplenty/textures/blocks/

只要路径制定好了,材质文件需要渲染单独需要渲染的方块,使用 'texture:' 行。这些行的格式像下面那样:

 texture:id=<texture-id>

其中 不仅用来表明它会用于定义文件中定义材质,它也是文件名的基础部分,用于读取材质文件(通过向texturepath中加入,然后加入一个“.png”扩展名 —— 举个例子,ID为“test123”会读取材质资源 assets/biomesoplenty/textures/blocks/tes123.png ,这里使用之前的 texturepath 示例)。如果ID需要与文件名不同的话,你可以指定全名:

 texture:id=<texture-id>,filename=<full-filename>

举个例子:

 texture:id=test123.id,filename=assets/biomesoplenty/textures/blocks/tes123.png

对于一个材质文件包含多于一个材质的情况而言,材质的数目横向(X的数目)和纵向(Y的数目)可以被指定:

 texture:id=<texture-id>,xcount=<xcount>,ycount=<ycount>

在这种情况之下,文件被读取然后分成指定的网格。分开的材质通过行序指数来排列:\ + \*\ : 所以,第一个材质,即网格的左上角的材质,指数为0,它右面的那个材质指数为1,以此类推,直到下一行的第一个材质为止(这些都是指数,即X数目)。对于单个材质文件而言(默认情况),只会使用指数为0的那一个。

一些材质文件可以特别格式化: 材质定义的位置在文件之中,而不是网格(举个例子,箱子,玩家或怪物的材质文件)。遇到这些情况时,查看特殊材质文件种类来获得支持的类型的有关信息。遇到这些情况时,“format”属性可以用于定义文件的布局。

 texture:id=<texture-id>,format=<file-format>
为 1.5.x 定义材质

为 Minecraft v1.5.x定义的材质的处理方式与1.6.x的处理方式有一点类似,但是有一些关键性的不同之处:

  • 原版的材质的路径为客户端JAR或材质包的 textures/blocks 路径之中
  • 对于Minecraft Forge Mod的材质通常可以在Mod的ZIP或JAR文件中的mods/\/textures/blocks 路径找到

对于v1.5.x的Mod而言, 'texturemod:' 行可以用来指定材质路径的特殊名字('mods//textures/blocks' 中 \ 的名字)。如果没有指定的话, \ 默认会使用提供在文件中 'modname:' 这一行的Mod名字。所以,对于v1.5.x格式的Mod,请使用这行字:

 texturemod:<modname>

它就相当于使用这行字

 texturepath:mods/<modname>/textures/blocks/

另外,材质的指数和格式和v1.6.x及以后的版本相同。注意:使用 'texturepath:' 行结果会使定义文件中的所有 'texturemod:' 行全部被忽略。

为v1.4.x或更早的版本定义材质

Minecraft v1.4.7 和更早版本中的材质几乎都在包括网格的16x16的材质文件之中(这相当于X数量为16,Y数量为16)。对于这些文件而言,你经常要使用 'texturefile:' 行。 'texturefile:' 行几乎可以说完全等于 'texture:' 行,只是默认的X数量为16,Y数量为16而已(针对 'texture:' 中的单个材质来说,等于X数值为1,Y数值为1)。

在 v1.5.x之前,Minecraft Forge Mod定义材质资源没有统一的方法,所以 'texturepath:' 命令,或者文件名的 'texturefile:' 或 'texture:' 属性行通常是必需的。

材质的参考系

只要所需的材质读取之后,不同的指令就可以用来指定Mod中不同方块不同面的材质。在所有的情况下,某个特殊材质的参考是通过结合材质文件中的指数(单个材质的材质文件通常是0)和'texture:' 或 'texturefile:'行中 'id' 属性的值实现的。总的来说,格式如下:

 <index>:<texture-id>

在所有方块定义行中,又能够指定默认材质ID,可用于所有缺失 ":\" 后缀的参考系: 'txtid=' 属性。通过指定 'txtid=\' 属性,对于 '\' 的参考变得等价于 '\:\'。材质指数值限制在0至999之间,包含这两个数。

除了选择使用的材质之外,材质参考系也能够做出一系列修改功能,这会影响材质在渲染时的处理过程。这些修改功能通过为材质增加一系列特殊值来实现(都是1000的倍数),加入的位置为 \ 。这些修改的定义值为:

  • 1000 : 材质使用生物群系使用的草方块的颜色进行染色(assets/minecraft/textures/colormap/grass.png ,版本为v1.6.x 或更晚)
  • 2000 : 材质使用生物群系使用的树叶方块的颜色进行染色(assets/minecraft/textures/colormap/foliage.png,版本为v1.6.x 或更晚)
  • 3000 : 材质使用生物群系使用的水方块的颜色进行染色(通过 MCPatcher/Optifine - assets/minecraft/mcpatcher/colormap/water.png ,版本为v1.6.x 或更晚).
  • 4000 : 材质顺时针旋转90度
  • 5000 : 材质顺时针旋转180度
  • 6000 : 材质顺时针旋转270度
  • 7000 : 材质横向镜面翻转(左面变为右面)
  • 8000 : 材质向下偏移50%高度
  • 9000 : 材质向下偏移50%高度,且横向镜面翻转
  • 10000 : 材质被转换用于倾斜火把(特殊情况)
  • 11000 : 材质是草方块一边(对于生物群系染色和雪颜色两者兼容的特殊情况)
  • 12000 : 材质在代表内表面,且接近其他相同类型的方块时透明(例如玻璃和水方块的内部)
  • 13000 : 材质使用云杉树叶的颜色着色
  • 14000 : 材质使用白桦树叶的颜色着色
  • 15000 : 材质使用睡莲的颜色着色
  • 17000 : 材质使用 colorMult 属性的值或 custColorMult 属性类定义的值着色(特别分出来一条)
  • 18000 : 相当于270度旋转 (6000) 和草的色调 (1000)
  • 19000 : 相当于270度旋转 (6000) 和树叶的色调 (2000)
  • 20000 : 相当于270度旋转 (6000) 和水的色调 (3000)
  • 21000 : 相当于多色调和 (17000) 和内部透明 (12000)
  • 22000 : 相当于树叶色调 (2000) 和多色调 (17000)
方块ID数值

某个特殊方块的材质的定义需要定义给定的方块类型要使用哪个方块ID。内置的Minecraft基础方块当前拥有修复后的方块ID数值,但是Minecraft Forge Mod的所有方块ID是通过他们的配置文件来控制的。这些ID通过"cfgfile:"行来读取(请查看 材质和模型文件的基础特性 获得关于这一行的更多信息,以及配置文件中一些有用的内容的设置)在所有方块定义行之中,方块ID通过 'id=' 属性来指定。 'id=' 属性的值可以是数值(必须连续不间断),根据Mod的配置文件中定义的符号名称,或是展示名称的组合,加号 (+),和数值。在所有情况中,如果ID的值是0或附属的话,这个ID值就会被忽略(允许禁用方块,忽略更简单)。

定义方块材质地图
  • 要想定义简单的正方体方块,查看 定义一个简单的方块
  • 要想定义长方体方块,查看 定义长方体方块
  • 要想定义以自定义方块着色器为基础的方块,查看 自定义方块着色器
  • 要想定义根据不定体积的方块模型的话,请查看 使用立体方块模型

特殊材质文件种类

除了默认的材质(以XY值定义的网格线),Dynmap也支持一些其他特殊的材质。

当前定义的类型包括以下内容:

GRID - 这是一种默认材质,对应在正方形网格线<xcount>宽和<ycount> 高,每个材质都有2像素。 材质序号从左(index=0)排列到最右边(ending with index=<xcount>-1),下一排又从左边开始排序 (index=<xcount>),以此类推。

CHEST - 这是一种类似于箱子的材质。索引编号为:

  • 0 : 箱子顶部
  • 1 : 箱子左侧
  • 2 : 箱子右侧
  • 3 : 箱子前部
  • 4 : 箱子背部
  • 5 : 箱子底部

BIGCHEST - 这是一种类似于大箱子的材质。索引编号为:

  • 0 : 箱子顶部 - 左方
  • 1 : 箱子顶部 - 右方
  • 2 : 箱子前部 - 左方
  • 3 : 箱子前部 - 右方
  • 4 : 箱子左侧
  • 5 : 箱子右侧
  • 6 : 箱子背部 - 左方
  • 7 : 箱子背部 - 右方
  • 8 : 箱子底部 - 左方
  • 9 : 箱子底部 - 右方

SIGN - 这是一种类似于路牌的材质。索引编号为:

  • 0 : 牌子前部
  • 1 : 牌子背部
  • 2 : 牌子顶部
  • 3 : 牌子底部
  • 4 : 牌子左方
  • 5 : 牌子右方
  • 6 : 柱子前部
  • 7 : 柱子背部
  • 8 : 柱子左侧
  • 9 : 柱子右侧

SKIN - 这是一种类似于人体的材质。索引编号为:

  • 0 : 前部
  • 1 : 左侧
  • 2 : 右侧
  • 3 : 背部
  • 4 : 顶部
  • 5 : 底部

CUSTOM - 这是种更人性化的材质,允许将任意矩形材质作为索引材质。 参数 <xcount> 和 <ycount> 是用来识别材质图片大小的值(正常大小的材质的分辨率应该是(16 <xcount>) (16 * <ycount>))。 材质文件的属性必须明确包含一个'title<N>='属性。N是材质的索引编号(比如N=0,1,2)字段的值对应于:

   tile<N>=<source-offset-X>:<source-offset-Y>/<dimension-X>:<dimension-Y>

亦或是:

   tile<N>=<source-offset-X>:<source-offset-Y>/<dimension-X>:<dimension-Y>/<dest-offset-X>:<dest-offset-Y>

其中:

  • <source-offset-X> 是材质文件左上角的横坐标,以缩放的像素为单位。
  • <source-offset-Y> 是材质文件左上角的纵坐标,以缩放的像素为单位。
  • <dimension-X> 是材质文件中横坐标的材质,以缩放的像素为单位。
  • <dimension-Y> 是材质文件中纵坐标的材质,以缩放的像素为单位。
  • <dest-offset-X> 是指定材质的左上角横坐标(默认为0),以缩放像素为单位。
  • <dest-offset-Y> 是指定材质的左上角纵坐标(默认为0),以缩放像素为单位。

模型定义文件

当一些Mod中的方块不是常见的实体立方体时,Mod的模型定义文件(贴图)提供了自定义块物理形状的方式。 因此,如果Mod的自定义块仅由简单的实体立方体组成时,则该方块可能不需要额外的模型定义文件。

无论何种情况,模型定义文件中定义的模型都提供了一组表面或补丁,这些材质贴图定义在材质定义文件中。 由于方块的模型是唯一的,使用常见形状方块的模型很容易产生复用(例如:对任何类型的楼梯来讲,这些楼梯的模型都是一模一样的,他们只是被渲染了不同材质)。

从非常容易到非常复杂,定义模型的方法有很多种(包括Java类附加提供的自定义渲染代码在内). 一如往常的是,较为简单的方法也更快捷有效。

材质定义文件中常见的方法

一般而言, 配置项 'modname:', 'version:', 'cfgfile:', 'var:' 和其他模块配置相关的项目应该在模型定义文件及其相应的材质定义文件之间保持一致。 在材质和模型文件的基础特性详细查看这些常见的定义。 如果这些配置项不一致可能会导致渲染出错(因为材质资源没有对应的模型可以应用)亦或是加载错误(由于使用的模型没有提供对应的材质资源)。

模型的定义
  • 定义一个简单的长方体模型 - 一个或多个尺寸小于一个整方块的矩形棱柱 - 详见定义长方体模型.
  • 使用现有的自定义模型渲染 - 楼梯、栅栏/围墙、玻璃窗/铁栅栏 - 详见使用自定方块着色器.
  • 定义容器模型 - 形状类似于一个3D小立方体网格 - 详见定义立体模型.
  • 定义基于补丁的模型- 有材质的任意表面集合 - 详见定义补丁模型.
  • 创建新的自定义模型渲染类 - 详见编写自定方块着色器.

定义长方体模型

长方体模型是最易于定义的自定义模型。 它们表示一种很简单的方块,其中一个方块由一个已在其一个或多个维度上或截断的完整多维数据集组成。标准块之间的样本包括板(其Y(垂直)轴已被剪切在0.5以上或以下),雪(其中Y被限制在不同深度的不同值)和压力位置(所有3个轴都被剪切)。

由于长方体仍然是六边形状,所以纹理的定义和应用与简单的固体方块相同: 纹理被简单地裁剪为每个维度。 每个材质被视为应用于立方体的相应未剪切面的全宽和高度,因此仅绘制与面部的剪切范围匹配的材质部分。

若想定义长方体模型,则需要在 'boxblock:' 行中设定所需要的参数。需要设定的参数如下所示:

  • id - 需要使用的模型的方块ID. 至少需要一个 id 属性,但是可以使用正无穷大多的id属性 - 允许将相同的模型用于多个块。请在材质定义文件中查阅有关指定方块ID的详细信息。
  • data - 这提供了要应用的模型的特定元数据值。 一般的, data=**,表示由 id 属性指示的每个块ID的所有元数据值。 否则,一个或多个 data=number* 属性可用于为模型选择特定的元数据值。
  • xmin - 此项定义了方块X轴的最小剪切值: 当该属性定义时,方块的X值将从X轴上提供的值的偏移开始 (默认值为0.0)。
  • xmax - 此项定义了方块X轴的最大剪切值: 当该属性定义时,方块的X值将以X轴上提供的值的偏移量结束 (默认值为1.0)。
  • ymin - 此项定义了方块Y轴的最小剪切值: 当该属性定义时,方块的Y值将从Y轴上提供的值的偏移开始 (默认值为0.0)。
  • ymax - 此项定义了方块Y轴的最大剪切值: 当该属性定义时,方块的Y值将以Y轴上提供的值的偏移量结束 (默认值为1.0)。
  • zmin - 此项定义了方块Z轴的最小剪切值: 当该属性定义时,方块的Z值将从Z轴上提供的值的偏移开始 (默认值为0.0)。
  • zmax - 此项定义了方块Z轴的最大剪切值: 当该属性定义时,方块的Z值将以Z轴上提供的值的偏移量结束 (默认值为1.0)。
  • 对于所有的剪切值,属性都是自定义配置的 - 默认值与相应轴上完整立方体的限制范围一致:0.0 为最小, 1.0 为最大。 参数值限制在0.0和1.0之间的值,包括给定的轴的最小剪切值必须小于或等于该轴的最大剪切值。
演示方案

普通日光传感器: 宽度限制为0.375(16个像素中的6个)的全宽度方块。

     boxblock:id=151,data=*,ymax=0.375

地毯: 宽度限制为0.0625(16个像素中的1个)的全宽度方块。

     boxblock:id=171,data=*,ymax=0.0625

雪方块:每个元数据值具有不同高度限制的全宽方块

     boxblock:id=78,data=0,data=8,ymax=0.125
     boxblock:id=78,data=1,data=9,ymax=0.25
     boxblock:id=78,data=2,data=10,ymax=0.375
     boxblock:id=78,data=3,data=11,ymax=0.5
     boxblock:id=78,data=4,data=12,ymax=0.625
     boxblock:id=78,data=5,data=13,ymax=0.75
     boxblock:id=78,data=6,data=14,ymax=0.875

压板(使用相同形状的4个不同ID的块):剪裁堆叠三个维度的轴上(水平0.0625和0.9275之间,垂直为0.0和0.0625)

     boxblock:id=72,id=70,id=147,id=148,data=*,xmin=0.0625,xmax=0.9275,ymax=0.0625,zmin=0.0625,zmax=0.9275

按钮方块(不同的方块ID,具有用于放置方向的不同元值):剪裁堆叠三个维度的轴上

     boxblock:id=77,id=143,data=1,data=9,xmax=0.125,ymin=0.375,ymax=0.625,zmin=0.3125,zmax=0.6875
     boxblock:id=77,id=143,data=2,data=10,xmin=0.875,ymin=0.375,ymax=0.625,zmin=0.3125,zmax=0.6875
     boxblock:id=77,id=143,data=3,data=11,zmax=0.125,ymin=0.375,ymax=0.625,xmin=0.3125,xmax=0.6875
     boxblock:id=77,id=143,data=4,data=12,zmin=0.875,ymin=0.375,ymax=0.625,xmin=0.3125,xmax=0.6875

使用自定义方块着色器

一些类型的方块相比较于将静态模型直接赋予指定ID和数据值的方块这种简单的方法而言,其渲染的逻辑更加复杂。这包括依照相邻方块而做出改变的方块(红石线,栅栏,围墙,玻璃板和楼梯等等),同时它们的模型也依赖于TileEntity数据和其他信息(例如头颅,RailCraft的铁轨,和Immibis' Microblocks等等)。

要想使用自定义方块渲染器定义模型的话,你需要提供"customblock:" 文本行。这一行应该包括这些基础属性:

  • id - 本模型所用于的方块ID。你最少提供一个 id 属性,但是只要你需要的话可以有无限多——这允许相同的模型可以作用于多个方块。查看方块ID数字来获得定义方块ID的有关细节。
  • data - 这项提供模型应用于的方块的数据值。默认地,data=** 代表所有id属性中的方块的所有数据值。另外,你也可以提供多个 data=number* 属性,这用于为模型选择多个数据值。
  • class - 这项提供自定义方块渲染器所使用的类的类名,同时这一项也是必需的。

"customblock:" 行可能也有其他的属性,这些属性可以标识出指定的自定义方块渲染器。

自定义方块渲染器总是会创建渲染面(即材质被应用的那个表面)的序列。相应的渲染面的序列通过自定义方块渲染器而定义。材质的参考内容通过材质定义文件提供,你需要在相应的"block:"文本行中指定 patch<N> 属性。

创建自定义方块渲染器

下面的自定义方块渲染器都是由Dynmap所提供的,它们可以用来渲染适当的自定义方块。

  • org.dynmap.hdmap.renderer.BoxRenderer 类 - 用于实现立方体模型 的渲染器
  • Class org.dynmap.hdmap.renderer.CTMVertTextureRenderer
  • org.dynmap.hdmap.renderer.FenceWallBlockRenderer类 - 用于栅栏和围墙的渲染器
  • Class org.dynmap.hdmap.renderer.FrameRenderer
  • Class org.dynmap.hdmap.renderer.ImmibisMicroRenderer
  • org.dynmap.hdmap.renderer.PaneRenderer 类 - 用于玻璃板和铁栅栏的渲染器
  • Class org.dynmap.hdmap.renderer.RailCraftSlabBlockRenderer
  • Class org.dynmap.hdmap.renderer.RailCraftTrackRenderer
  • org.dynmap.hdmap.renderer.RedstoneWireRenderer 类 - 用于红石线的渲染器
  • Class org.dynmap.hdmap.renderer.RotatedBoxRenderer
  • Class org.dynmap.hdmap.renderer.RotatedPatchRenderer
  • Class org.dynmap.hdmap.renderer.RPMicroRenderer
  • Class org.dynmap.hdmap.renderer.RPRotatedBoxRenderer
  • Class org.dynmap.hdmap.renderer.RPSupportFrameRenderer
  • org.dynmap.hdmap.renderer.SkullRenderer 类 - 用于渲染原版头颅的渲染器
  • org.dynmap.hdmap.renderer.StairBlockRenderer 类 - 用于渲染普通楼梯方块的渲染器
  • Class org.dynmap.hdmap.renderer.TFCLooseRockRenderer
  • Class org.dynmap.hdmap.renderer.TFCSupportRenderer
  • Class org.dynmap.hdmap.renderer.TFCWoodRenderer
  • Class org.dynmap.hdmap.renderer.ThaumFurnaceRenderer

BoxRender类

BoxRenderer 类是简单的用于渲染一个立方体(纹理方面)的渲染器,但是减少了 XYZ 范围。与大多数自定义渲染器不同,应用于此模型的纹理对应于与简单方块相同的属性。 注意:这是用于实现定义立方体模型的自定义渲染器。

属性
  • xmin - 此选项设置了方块 X 轴的最小剪切值:当设置后,方块的 X 维将会从提供的偏移值开始(相对于默认的 0.0)。
  • xmax - 此选项设置了方块 X 轴的最大剪切值:当设置后,方块的 X 维将会从提供的偏移值终止(相对于默认的 1.0)。
  • ymin - 此选项设置了方块 Y 轴的最小剪切值:当设置后,方块的 Y 维将会从提供的偏移值开始(相对于默认的 0.0)。
  • ymax - 此选项设置了方块 Y 轴的最大剪切值:当设置后,方块的 Y 维将会从提供的偏移值终止(相对于默认的 1.0)。
  • zmin - 此选项设置了方块 Z 轴的最小剪切值:当设置后,方块的 Z 维将会从提供的偏移值开始(相对于默认的 0.0)。
  • zmax - 此选项设置了方块 Z 轴的最大剪切值:当设置后,方块的 Z 维将会从提供的偏移值终止(相对于默认的 1.0)。
纹理补丁
  • patch0 - 负的 X 方向(西)
  • patch1 - 负的 Y 方向(底)
  • patch2 - 负的 Z 方向(北)
  • patch3 - 正的 X 方向(东)
  • patch4 - 正的 Y 方向(顶)
  • patch5 - 正的 Z 方向(南)

FenceWallBlockRenderer类

FenceWallBlockRenderer 类用于渲染对应原版的篱笆或墙的模型的方块。这些这些放开连接到相同的 ID,但是也可以指定为其他的方块,使用 'link<N>' 属性。

属性
  • type - 模型的种类,可以是 'fence' 篱笆,'wall' 墙。如果没有提供,则为 'fence'。
  • link<N> - 允许方块连接到附加的方块 ID(其他固体方块),可以指定为任何数字,只要<N>的值是连续的(比如 link0=数字,link1=数字)。
材质补丁
  • patch0 - 所有面的材质(除了顶部和底部)
  • patch1 - 模型的顶部的材质
  • patch2 - 模型的底部的材质
PaneRenderer类

PaneRenderer 类用于创建玻璃板、铁栅栏和其他的类似的连接方式的方块的模型。

属性

材质补丁
  • patch0 - 板模型的所有面("玻璃")
  • patch1 - 板模型的边缘("边框")

RedstoneWireRenderer类

RedstoneWireRenderer 类用于正确渲染红石线的模型。

属性

材质补丁
  • patch0 - 对应竖直红石线的材质(顶部,底部)
  • patch1 - 对应交叉红石线的材质(顶部,底部,左右)

SkullRenderer类

SkullRenderer 类用于渲染头颅。渲染器使用 TileEntity 字段用于确定头部方向("Rot"),并确定头颅类型("SkullType")。每个头颅需要 6 个材质 - 来自 'SKIN' 种类的采指纹键(包含人体模型的纹理文件)。你必须使用正确的 'texturefile:' 来加载此文件 - 比如僵尸头颅就是这样的:

 texturefile:id=zombie,filename=mob/zombie.png,format=SKIN

使用 SkullRender 连接到 "block:" 需要提供 6 中材质引用给 SkullType 的每个定义的值:patch0 到 patch5 为第一个索引 (0),patch6 到 patch11 为第二个 (1),等等。

属性

材质补丁

SkullType 的每个值对应 N=0 到 N=最大值:

  • patch<6 x N> - 头颅底部 (SKIN 材质索引 5)
  • patch<6 x N + 1> - 头颅顶部 (SKIN 材质索引 4)
  • patch<6 x N + 2> - 头颅后面 (SKIN 材质索引 1)
  • patch<6 x N + 3> - 头颅前面 (SKIN 材质索引 0)
  • patch<6 x N + 4> - 头颅侧面 (SKIN 材质索引 2)
  • patch<6 x N + 5> - 头颅侧面 (SKIN 材质索引 3)

StairBlockRenderer类

StairBlockRender 类定义了一个用于渲染标准台阶方块的渲染器。当使用时,他应该处理台阶方块的所有元数据。渲染器处理所有的台阶连接、转角和方位(倒置或其他)的信息。

渲染器可以选择台阶每个表面使用的材质,通过以下方法:

  • 普通情况(非 TileEntity 方块),通过打包提供的材质(一个侧面,一个顶部,一个底部)。
  • 对基于 TileEntity 的方块,通过读取 TileEntity 的特殊字段,通过一个映射寻找来查看每个表面使用什么材质。
属性
  • textureindex - 此可选的参数用于指定包含一个数字或字符串的 TileEntity 属性能用于选择渲染方块使用的材质。
  • texturecnt - 此可选的参数仅与 textureindex 参数相关,此参数指定了映射的材质的数量用于确定 textureindex:通过 'textmap(texturecnt-1)' 确定 'textmap0'。
  • textmap<N> - 每个从 N=0 到 N=(texturecnt-1),包含了 TileEntity 字段通过 textureindex 标记的应该使用 'patch<N>' 的台阶材质。
材质补丁

如果 textureindex 没有被设置:

  • patch0 - 使用于侧面的(垂直面)方块的材质
  • patch1 - 使用于顶部的方块的材质
  • patch2 - 使用于底部的方块的材质

如果 textureindex 被设置:

  • patch0 - 当方块的 TileEntity 的 textureindex 字段与 textmap0 属性相同时用于渲染侧面的材质。此选项也用于如果 textureindex TileEntity 字段没有匹配任何 textmap<N> 属性的情况。
  • patch1 - 当方块的 TileEntity 的 textureindex 字段与 textmap1 属性相同时用于渲染侧面的材质。
  • patch<N> - 当方块的 TileEntity 的 textureindex 字段与 textmap<N> 属性相同时用于渲染侧面的材质。

定义立体模型

体积模型用于提供复杂的形状。体积模型的材质与长方体模型中的格式相同 - 每 6 个面的材质对应方块的面,材质限制了方块面的最大大小。材质定义文件中的定义与长方体模型的方法完全相同。

体积模型基于将块的每个维度除以所提供的常数( scale ),可以是 -2 至高达 16(1,2,4,8或16) 的任何幂。这将使立方体被分成一组更小的立方体,每个立方体都是 1/scale x 1/scale x 1/scale 。然后通过指定这些较小的方块中的哪一个被填充而不是空的来定义模型。

模型通过很多行配置来设置,第一行是 "block:" 行,有以下属性:

  • id - 设置模型使用的方块 ID,至少需要指定一个方块id,但是也可以使用更多的 - 允许一个模型使用多个方块组成。查看方块ID部分来查看更多指定方块ID的细节。
  • data - 指定方块使用的元数据。默认 data=**,指定所有方块id的元数据,或者使用一个或者更多个 data=number* 属性指定详细的元数据。
  • scale - 模型的细分的大小设定。

比如向下的活塞可以这样设定:

     block:id=34,data=0,data=8,scale=8

在 "block:" 之后,你需要设置一个或者更多的方块层 - 从第 0 层(底层)开始到第 (scale-1) 层(顶层)。每一个层都是通过 "layer:" 来定义,用逗号分隔。下一个在 "layer:" 之后的 scale 定义自方块:每个行代表 Z 轴上方块的一个层(第一个最低,最后的最高),每一个都有 scale 字符(代表 X 轴上的最低到最高的子方块) - 每个 '*' 代表一个填充的方块,每个 '-' 代表留空的方块、任何指定的但没有设置的层都是默认为空。

比如一个向下的活塞的完整定义是这样的:

     block:id=34,data=0,data=8,scale=8
     layer:2,3,4,5,6,7
     --------
     --------
     --------
     ---**---
     ---**---
     --------
     --------
     --------
     layer:0,1
     ********
     ********
     ********
     ********
     ********
     ********
     ********
     ********

这种情况下,这个立方体被切割为 8 x 8 x 8 片: 8 层 8 x 8 的子方块。活塞头占用了底部的两层 (0 和 1 层),推拉杆正中的 1/4 的部分(2 到 7 层)。

体积模型的翻转

作为手动定义体积模型的替代方式,附加的体积模型可以通过翻转已有的体积模型来完成,可以翻转 Y 轴的 0,90,180 或者 270 度。

定义一个翻转的体积模型,你需要像以往一样添加一行 "block:" (保证 scale 属性匹配源模型),然后添加 "rotate:" 行紧跟其后。"rotate:" 的属性包括:

  • id - 源模型的方块 ID(复制并翻转的模型),至少需要一个 id
  • data - 源模型的元数据,至少需要一个 data,并且为数字
  • rot - 旋转的值,有效的值为 0 90 180 270。此属性是必需的

注意:体积模型的旋转对材质的应用没有影响:原来应用在北面的材质旋转后仍会在北面

定义一个简单的方块

一个简单的方块是一个固体立方体,填充整个立方体。这是最简单的一种方块形式,最好尽可能的使用(无论是简化实现还是性能)。由于固体立方体是默认的模型,这些方块不需要在模型定义文件中有对应的模型。方块的材质通过 'block:' 行设置。

一个简单的方块有 6 个面,有很多的等效的属性:

  • top 或 face1 或 patch4 (方块顶部)
  • bottom 或 face0 或 patch1 (方块底部)
  • north 或 face4 或 patch0 (方块西面,负 X 轴方向)
  • south 或 face5 或 patch3 (方块东面,正 X 轴方向)
  • west 或 face3 或 patch5 (方块南面,负 Z 轴方向)
  • east 或 face2 或 patch2 (方块北面,正 Z 轴方向)

通过以下方式设置对应的属性来提供材质引用,需要添加 'id=':

   block:id=<block-id>,<side>=<index-plus-function>:<texture-id>,<side>=<index-plus-function>:<texture-id>,...

每一个常见的面的组合也有方便设置的属性,这允许你将相同的材质应用到多个面:

  • allfaces (六个面使用相同的材质)
  • allsides (所有的侧面使用相同的材质)
  • topbottom (顶面和底面使用相同的材质)

由于遗留的问题,标准的方块也需要设置属性 stdrot=true,否则顶部和底部的材质将会使用错误的旋转(90度)。

如果相同的材质映射应用于所有的元数据,那么应该设置属性 data=(尽管当没有其他的 data= 存在时这是默认值)。如果有只有特定的元数据使用给定的材质映射,那么应该提供多个 data=<数字> 属性。

如果多个方块的 ID 使用相同的材质,则可以同一个 block: 行指定多个 id= 属性。

如果需要,可以指定以下其他的特殊属性:

  • txtid - 此选项允许在没有 : texture-id 后缀的 block: 定义中指定默认的材质。
  • transparency - 这将会影响方块照明的计算。如果设置为 OPAQUE(默认),那么方块的表面亮度将会基于相邻方块的亮度计算,如果设置为 TRANSPARENCY,方块的亮度基于自身的光线亮度,如果设置为 SEMITRANSPARENT,方块的亮度为两种情况混合的特殊情况(一般由阻挡光线但没有完全填充的立方体使用,如台阶和半砖)。如果设置为 LEAVES,那么使用特殊的照明情况(通常与 TRANSPARENCY 相同,除了某些版本的 Spout)。
  • colorMult - 这会影响使用 multiplier-tinting 选项的任何材质(17000, 21000),由 6 位的十六进制组成:RRGGBB,RR 是红色分量(00-FF),GG 是绿色分量(00-FF),BB 是蓝色分量(00-FF)。
  • !customColorMult" - 这会影响使用 multiplier-tinting 选项的任何材质(17000, 21000),由一个着色器类名组成,目前有这些值:
    • org.dynmap.hdmap.colormult.TFBandedWoodColorMultiplier - 针对暮色森林 Mod 的 banded wood 的特殊的着色器类
    • org.dynmap.hdmap.colormult.TFMagicLeafColorMultiplier - 针对暮色森林 Mod 的银树叶(Magic Tree Leaves)的特殊的着色器类
    • org.dynmap.hdmap.colormult.TFSpecialLeafColorMultiplier - 针对暮色森林 Mod 的特殊的树叶(Special Leaves)的特殊的着色器类
  • layer<M> 或 layer<M>-<N> - 此选项允许材质被"堆叠" - 如果某个面的材质是透明的,那么下一层的材质将被应用于那些部分。layer<M> 或 layer<M>-<N> 属性的值是对应的 patch<序数> 定义的索引,用于下一层的对应 patch<M> 的材质或者在 patch<M> 和 patch<N> 之间的材质。对于标准的长方体,标准的面使用 patch0 到 patch6,所以任何附加的覆盖层材质应该使用 patch6 或者更高的值。
  • patch<M> 或 patch<M>-<N> - 此选项允许这是附加的材质引用,基于超过 6 的(patch0 到 patch5,或之前指定的其他别名)。对于简单的立方体,这里只需要定义覆盖的材质。这里的值是一个材质引用,应用到第 M 个 patch 或者 M 到 N 之前的所有 patch。

定义长方体方块

长方体块只是一个简单的立方体块,在其一个或多个轴上被截。 其结果是一个矩形棱柱形,否则有材质,以同样的方式作为一个简单的方块也会得到同样的结果。

定义一个长方体快,首先应该添加"boxblock:" 行在材质定义文件中。 在定义长方体模型获取更详细的介绍。

这是一个木制压力板(需要三维的裁剪)的模型定义的示例:

     boxblock:id=72,data=*,xmin=0.0625,xmax=0.9275,ymax=0.0625,zmin=0.0625,zmax=0.9275

接下来,方块的材质被定义为一个简单的实心方块:只需用 "block:" 行设定6个方向所引用的材质即可。在定义一个简单的方块获取更详细的介绍。 相应的木质压力板(如上)的材质定义是:

     block:id=72,allfaces=0:planks_oak,stdrot=true,transparency=TRANSPARENT

注意:大多数适合作为长方体块渲染的块将要求 透明属性 设置为透明,不阻止对其他方块的光照,或半透明的块阻止光照(如半砖或楼梯)。

自定义方块着色器

使用提供的模型定义自定义块可以前往此处使用自定方块着色器,第一步是选择和配置渲染模型定义文件。 在配置 'customblock:' 行中, 必须包含一个或多个方块的 ID (通过 id 识别), 任何需要的元数据值 (通过 data 识别)和自定义渲染器类 (通过 class 识别)。 例如,砂岩台阶方块的定义如下:

     customblock:id=128,,data=*,class=org.dynmap.hdmap.renderer.StairBlockRenderer

此外,这些核心属性将由自定义渲染器提供一部分(可能需要)附加属性来帮助使用者正确配置渲染。 详情请在 'Attributes' 来查阅关于渲染器类提供的附加属性的细节。

接下来,材质参考资源需要被定义为自定义渲染器所支持的材质。 在 'Patches Requiring Textures' 的自定义渲染器的描述部分定义了 patch\<N\> 需要为方块提供的属性。 仔细阅读这些帮助,配置项 'block:' 行必须在材质定义文件中包含,以及在 'patchN' 设定每个补丁的显示属性。 例如,楼梯方块上所需要的的自定义渲染器需要三块:一个是方块边缘,一个是方块顶部,一个是方块底部:对于砂岩楼梯方块,提供以下示例:

     block:id=128,data=*,patch0=0:sandstone_normal,patch1=0:sandstone_top,patch2=0:sandstone_bottom,transparency=SEMITRANSPARENT

注意:大多数自定义渲染器定义的是不完整的方块, 不透明块, 所以 方块透明度 属性通常需要在 "block:" 行中配置。 对需要不遮挡其他方块的方块设置合适的透明度, 或设置为半透明的方块,防止光照被该方块所阻挡(例如石板和楼梯)。

使用立体方块模型

基于原版模型的方块可以具有相对复杂的形状, 同时也使用相同的纹理定义方案,用于一个简单的方块亦或是长方体方块。材质资源在模型中的应用遵循与常见方块模型和矩形方块模型相同的模式 - 即模型的六个面分别对应于材质, 材质也会自动适配方块每个面的大小。 因此,材质的定义与在 Texture Definition Files 中定义的方式都是把方块作为一个简单方块和矩形方块处理。

首先将完整的立方体切割成若干个子块来定义体积模型,在 scale 的条件下处理 - 使方块被渲染为通过 scale × scale × scale 计算得出的子块。 然后,通过被占用或填充的模型的每个子块都被标记,允许创建子块的任何处理。详情请在定义立体模型中查阅。

下面展示的一个例子是由体积模型渲染的漏斗:

     block:id=154,data=*,scale=16
     layer:0,1,2,3
     ----------------
     ----------------
     ----------------
     ----------------
     ----------------
     ----------------
     ------****------
     ------****------
     ------****------
     ------****------
     ----------------
     ----------------
     ----------------
     ----------------
     ----------------
     ----------------
     layer:4,5,6,7,8,9
     ----------------
     ----------------
     ----------------
     ----------------
     ----********----
     ----********----
     ----********----
     ----********----
     ----********----
     ----********----
     ----********----
     ----********----
     ----------------
     ----------------
     ----------------
     ----------------
     layer:10
     ****************
     ****************
     ****************
     ****************
     ****************
     ****************
     ****************
     ****************
     ****************
     ****************
     ****************
     ****************
     ****************
     ****************
     ****************
     ****************
     layer:11,12,13,14,15
     ****************
     ****************
     **------------**
     **------------**
     **------------**
     **------------**
     **------------**
     **------------**
     **------------**
     **------------**
     **------------**
     **------------**
     **------------**
     **------------**
     ****************
     ****************

定义一个模型,以简单方块的方案提供材质引用 - 详情请在定义一个简单的方块中查阅。而对于漏斗的定义在下方贴出:

     block:id=154,data=*,allsides=0:hopper_outside,top=0:hopper_inside,bottom=0:hopper_outside,stdrot=true