This commit is contained in:
boybook
2025-12-01 20:59:16 +08:00
parent 12738a142c
commit 760c2dd9ad
5535 changed files with 21070 additions and 2021 deletions

View File

@@ -197,7 +197,7 @@ customTips 设置支持自定义格式:包含四种自带格式:
| explosionResistance | float | 方块爆炸抗性|
| loot | str | loot table控制掉落物(只有定义了"minecraft:loot"组件的方块有数据,其余默认为空字符串"")|
| mapColor | str | 用十六进制颜色定义该方块在地图上显示的颜色(只有定义了"minecraft:map_color"组件的方块以及部分原版方块有数据,其余默认为"#0")|
| unwalkable | bool | 生物是否可在上方行走,默认为false(只有定义了"<a href="../../../mconline/100-历史归档教程/20-玩法地图教程/第07章使用实验玩法增加自定义内容/课程01.接触新自定义方块.html#minecraft-unwalkable">minecraft:unwalkable</a>"组件的方块有数据,其余默认为false)|
| unwalkable | bool | 生物是否可在上方行走,默认为false(只有定义了"<a href="../../../mconline/20-玩法地图教程/第07章使用实验玩法增加自定义内容/课程01.接触新自定义方块.html#minecraft-unwalkable">minecraft:unwalkable</a>"组件的方块有数据,其余默认为false)|
| tier | dict/None | 与挖掘相关的属性,具体见<a href="../../20-玩法开发/15-自定义游戏内容/2-自定义方块/1-JSON组件.html">挖掘属性</a>(只有定义了"netease:tier"组件的方块有数据,其余默认为None)|
| renderLayer | int | 方块渲染时使用的<a href="../../../mcdocs/1-ModAPI/枚举值/RenderLayer.html" rel="noopenner"> 材质 </a>|
| solid | bool | 方块是否为实心方块,影响生物在方块内是否受到窒息伤害|

View File

@@ -1,5 +1,5 @@
---
front:
front:
hard: 入门
time: 分钟
---
@@ -281,7 +281,7 @@ c = Vector3.Dot(a, b) # 1 * 0 + 2 * 3 + 3 * 1 = 9
| 数据类型 | 说明 |
| :------- | :------------- |
| float | 两个向量的积 |
| Vector3 | 两个向量的积 |
- 示例
@@ -296,6 +296,72 @@ c = Vector3.Cross(a, b)
## 成员方法
### x
- 描述
返回该向量的x坐标值。
- 返回值
| 数据类型 | 说明 |
| :------- | :-------------- |
| float | 该向量x的坐标值 |
- 示例
```python
from common.utils.mcmath import Vector3
a = Vector3(3.0, 4.0, 0.0)
print a.x # 打印 3.0
```
### y
- 描述
返回该向量的y坐标值。
- 返回值
| 数据类型 | 说明 |
| :------- | :-------------- |
| float | 该向量y的坐标值 |
- 示例
```python
from common.utils.mcmath import Vector3
a = Vector3(3.0, 4.0, 0.0)
print a.y # 打印 4.0
```
### z
- 描述
返回该向量的z坐标值。
- 返回值
| 数据类型 | 说明 |
| :------- | :-------------- |
| float | 该向量z的坐标值 |
- 示例
```python
from common.utils.mcmath import Vector3
a = Vector3(3.0, 4.0, 0.0)
print a.z # 打印 0.0
```
### Length
- 描述
@@ -551,4 +617,4 @@ print a / 2 # 打印结果(1.5, 2, 0)
- 描述
判断两个向量是否不等当各分量均相等时返回False
判断两个向量是否不等当各分量均相等时返回False

View File

@@ -42,7 +42,7 @@
![](./images/0-2.gif)
我们接下来可以在【关卡编辑器】中将刚刚创建好的Pig预设拖到场景中并放置到刚刚用栅栏圈出的区域里这样它就不会导出乱跑了。
我们接下来可以在【关卡编辑器】中将刚刚创建好的Pig预设拖到场景中并放置到刚刚用栅栏圈出的区域里这样它就不会到处乱跑了。
放置完成后务必记得点击右上角的【保存】按钮,勤保存是一个很好的习惯。

View File

@@ -0,0 +1,130 @@
# 3.4版本物品id变更
## 简介
微软在1.21.00继续修改了部分方块ID取消了附加值相关链接请参阅[基岩版扁平化](https://zh.minecraft.wiki/w/%E5%AE%98%E6%96%B9%E9%A1%B5%E9%9D%A2/%E5%9F%BA%E5%B2%A9%E7%89%88%E6%89%81%E5%B9%B3%E5%8C%96),请开发者注意适配。
## 处理方法
在ModSDK的接口与事件中我们针对上述情况做了以下处理
1. 对于返回物品信息字典的接口与事件:
newItemName及newAuxValue返回新版名称与附加值。
原字段itemName及auxValue返回旧版名称与附加值。
2. 对于接受物品信息字典的接口与事件:
当字典存在newItemName及newAuxValue时使用这两个字段。
不存在时使用旧字段itemName及auxValue。
## 注意事项
* 通过附加值获取获取方块状态接口没有做兼容例如GetBlockAuxValueFromStates、GetBlockStatesFromAuxValue、GetBlockStates、SetBlockStates如果您的组件对此有依赖则需要对这次的改动自行做兼容处理。
* **开发完成或正在开发的组件建议统一采用newItemName及newAuxValue字段也不要新旧字段混用。**
* 某些写法可能会失效,例如
```python
# 获取itemDict然后在他基础上修改itemName或auxValue后再用来生成
itemdict = GetPlayerItem()
itemdict['itemName'] = 'xxx'
itemdict['auxValue'] = itemdict['auxValue']+1
SpawnItemToPlayerInv(itemdict)
```
因为GetPlayerItem返回的itemDict含有新字段再传入SpawnItemToPlayerInv时会读取新字段生成物品因此对原字段的修改无效。
## 物品名称变更表
以下为3.4版本变更了名称的物品列表表格内的名称省略了minecraft命名空间。
| 中文名称 | 旧命名 | 旧附加值 | 新命名 |
| :------- | ------ | -------- | ------ |
| 草方块 | grass | 0 | grass_block |
| 橡树树苗 | sapling | 0 | oak_sapling |
| 云杉树苗 | sapling | 1 | spruce_sapling |
| 白桦树苗 | sapling | 2 | birch_sapling |
| 丛林树苗 | sapling | 3 | jungle_sapling |
| 金合欢树苗 | sapling | 4 | acacia_sapling |
| 深色橡树苗 | sapling | 5 | dark_oak_sapling |
| 橡树树叶 | leaves | 0 | oak_leaves |
| 云杉树叶 | leaves | 1 | spruce_leaves |
| 白桦树叶 | leaves | 2 | birch_leaves |
| 丛林树叶 | leaves | 3 | jungle_leaves |
| 金合欢树叶 | leaves2 | 0 | acacia_leaves |
| 深色橡树叶 | leaves2 | 1 | dark_oak_leaves |
| 矮草丛 | 0 | tallgrass | short_grass |
| 蕨 | 2 | tallgrass | fern |
| 虞美人 | 0 | red_flower | poppy |
| 兰花 | 1 | red_flower | blue_orchid |
| 绒球葱 | 2 | red_flower | allium |
| 蓝花美耳草 | 3 | red_flower | azure_bluet |
| 红色郁金香 | 4 | red_flower | red_tulip |
| 橙色郁金香 | 5 | red_flower | orange_tulip |
| 白色郁金香 | 6 | red_flower | white_tulip |
| 粉红色郁金香 | 7 | red_flower | pink_tulip |
| 滨菊 | 8 | red_flower | oxeye_daisy |
| 矢车菊 | 9 | red_flower | cornflower |
| 铃兰 | 10 | red_flower | lily_of_the_valley |
| 平滑石台阶 | 0 | stone_block_slab | smooth_stone_slab |
| 砂岩台阶 | 1 | stone_block_slab | sandstone_slab |
| 石化橡木台阶 | 2 | stone_block_slab | petrified_oak_slab |
| 圆石台阶 | 3 | stone_block_slab | cobblestone_slab |
| 红砖台阶 | 4 | stone_block_slab | brick_slab |
| 石砖台阶 | 5 | stone_block_slab | stone_brick_slab |
| 石英台阶 | 6 | stone_block_slab | quartz_slab |
| 下界砖台阶 | 7 | stone_block_slab | nether_brick_slab |
| 双橡木台阶 | 0 | double_wooden_slab | oak_double_slab |
| 双云杉木台阶 | 1 | double_wooden_slab | spruce_double_slab |
| 双白桦木台阶 | 2 | double_wooden_slab | birch_double_slab |
| 双丛林木台阶 | 3 | double_wooden_slab | jungle_double_slab |
| 双金合欢木台阶 | 4 | double_wooden_slab | acacia_double_slab |
| 双深色橡木台阶 | 5 | double_wooden_slab | dark_oak_double_slab |
| 橡木台阶 | 0 | wooden_slab | oak_slab |
| 云杉木台阶 | 1 | wooden_slab | spruce_slab |
| 白桦木台阶 | 2 | wooden_slab | birch_slab |
| 丛林木台阶 | 3 | wooden_slab | jungle_slab |
| 金合欢木台阶 | 4 | wooden_slab | acacia_slab |
| 深色橡木台阶 | 5 | wooden_slab | dark_oak_slab |
| 向日葵 | 0 | double_plant | sunflower |
| 丁香 | 1 | double_plant | lilac |
| 高草丛 | 2 | double_plant | tall_grass |
| 大型蕨 | 3 | double_plant | large_fern |
| 玫瑰丛 | 4 | double_plant | rose_bush |
| 牡丹 | 5 | double_plant | peony |
| 管珊瑚块 | 0 | coral_block | tube_coral_block |
| 脑纹珊瑚块 | 1 | coral_block | brain_coral_block |
| 气泡珊瑚块 | 2 | coral_block | bubble_coral_block |
| 火珊瑚块 | 3 | coral_block | fire_coral_block |
| 鹿角珊瑚块 | 4 | coral_block | horn_coral_block |
| 失活的管珊瑚块 | 5 | coral_block | dead_tube_coral_block |
| 失活的脑纹珊瑚块 | 6 | coral_block | dead_brain_coral_block |
| 失活的气泡珊瑚块 | 7 | coral_block | dead_bubble_coral_block |
| 失活的火珊瑚块 | 8 | coral_block | dead_fire_coral_block |
| 失活的鹿角珊瑚块 | 9 | coral_block | dead_horn_coral_block |
| 管珊瑚扇 | 0 | coral_fan | tube_coral_fan |
| 脑纹珊瑚扇 | 1 | coral_fan | brain_coral_fan |
| 气泡珊瑚扇 | 2 | coral_fan | bubble_coral_fan |
| 火珊瑚扇 | 3 | coral_fan | fire_coral_fan |
| 鹿角珊瑚扇 | 4 | coral_fan | horn_coral_fan |
| 失活的管珊瑚扇 | 0 | coral_fan_dead | dead_tube_coral_fan |
| 失活的脑纹珊瑚扇 | 1 | coral_fan_dead | dead_brain_coral_fan |
| 失活的气泡珊瑚扇 | 2 | coral_fan_dead | dead_bubble_coral_fan |
| 失活的火珊瑚扇 | 3 | coral_fan_dead | dead_fire_coral_fan |
| 失活的鹿角珊瑚扇 | 4 | coral_fan_dead | dead_horn_coral_fan |
| 橡木 | 0 | wood | oak_wood |
| 云杉木 | 1 | wood | spruce_wood |
| 白桦木 | 2 | wood | birch_wood |
| 丛林木 | 3 | wood | jungle_wood |
| 金合欢木 | 4 | wood | acacia_wood |
| 深色橡木 | 5 | wood | dark_oak_wood |
| 去皮橡木 | 8 | wood | stripped_oak_wood |
| 去皮云杉木 | 9 | wood | stripped_spruce_wood |
| 去皮桦木 | 10 | wood | stripped_birch_wood |
| 去皮丛林木 | 11 | wood | stripped_jungle_wood |
| 去皮金合欢木 | 12 | wood | stripped_acacia_wood |
| 去皮深色橡木 | 13 | wood | stripped_dark_oak_wood |

View File

@@ -10,7 +10,7 @@ time: 分钟
## 示例下载
下载地址:[示例Demo](https://g79.gdl.netease.com/3.3Demo.zip)。
下载地址:[示例Demo](https://g79.gdl.netease.com/3.6Demo.zip)。
@@ -175,7 +175,7 @@ time: 分钟
- 自定义云成就-CloudAchievementMod
展示了[云成就](../../28-成就系统/云成就使用文档.md)的基本用法
展示了[云成就](../../29-成就系统/云成就使用文档.md)的基本用法
- 微软粒子发射骨骼模型-NeteaseModelParticleDemo

View File

@@ -159,10 +159,10 @@ selection: true
> plant_at列表中需要保持格式一致["minecraft:grass", "minecraft:dirt"]["grass", "dirt"],否则在相邻自定义农作物种植新的农作物会导致上一个农作物被破坏
```json
"minecraft:seed": {
"minecraft:seed": {
"crop_result": "sweet_berry_bush",
"plant_at": ["grass", "dirt", "podzol"]
},
},
```
### minecraft:stacked\_by\_data

View File

@@ -96,6 +96,7 @@ time: 分钟
| cosmetic_head | 骷髅模型/凋零骷髅模型/模型/僵尸模型/龙的模型/爬行者的模型/雕刻南瓜 |
| compass | 指南针 |
| mushroom_stick | 诡异菌钓竿 |
| brush | 刷子 |
### 2.3 frequency(稀有度)

View File

@@ -69,13 +69,13 @@ Json支持多种软件打开和查看这里我们使用vscode进行查看。
<br/>
## <a href="../../../mconline/100-历史归档教程/20-玩法地图教程/第05章设置NPC的基本状态和交易表/课程03.给NPC添加对应的交易表.html" rel="noopenner"> 自定义交易表 </a>配置对应文件
## <a href="../../../mconline/20-玩法地图教程/第05章设置NPC的基本状态和交易表/课程03.给NPC添加对应的交易表.html" rel="noopenner"> 自定义交易表 </a>配置对应文件
> 行为包json***behavior_pack_xxxxxx/trading/交易表名称.json***
<br/>
## <a href="../../../mconline/100-历史归档教程/10-addon教程/第12章更完善的自定义掉落物/课程01.更完善的自定义掉落物.html" rel="noopenner"> 自定义掉落表 </a>配置对应文件
## <a href="../../../mconline/10-addon教程/第12章更完善的自定义掉落物/课程01.更完善的自定义掉落物.html" rel="noopenner"> 自定义掉落表 </a>配置对应文件
> 行为包json***behavior_pack_xxxxxx/loot_tables/掉落表名称.json***

View File

@@ -1,5 +1,5 @@
---
front:
front:
hard: 入门
time: 分钟
---
@@ -10,36 +10,35 @@ time: 分钟
基岩版自定义方块的json结构曾经过多次调整当填写format_version时需要按照对应版本的json结构编写components。
你可以在以下两个版本进行选择:
例如`minecraft:destroy_time`在1.10.0中为
- 1.16.0
```json
"minecraft:destroy_time": {
"value": 4.0
}
```
该版本的components结构详见[bedrock.dev](https://bedrock.dev/zh/docs/1.16.0.0/1.16.0.66/Blocks)。
而在1.16.0的版本中为
- 1.10.0
该版本的components结构详见[bedrock.dev](https://bedrock.dev/zh/docs/1.12.0.0/1.12.0.28/Blocks)。该版本相比于1.16.0component的值为一个Json Object例如`minecraft:destroy_time`在1.10.0中为
```json
"minecraft:destroy_time": {
"value": 4.0
}
```
而在更高的版本中为
```json
"minecraft:destroy_time": 4.0
```
```json
"minecraft:destroy_time": 4.0
```
而在1.19.20以上的版本中为
```json
"minecraft:destructible_by_mining": {
"seconds_to_destroy": 4.0
}
```
## description
| 键 | 类型 | 默认值 | 解释 |
| ----------------------- | ---- | ------ | ------------------------------------------------------------ |
| identifier | str | | 包括命名空间及物品名。需要全局唯一。<br>建议使用mod名称作为命名空间 |
| category | str | construction | 注册分类,可选的值有:<br>construction注册到建筑<br>equipment注册到装备<br>items注册到物品<br>nature注册到自然<br>commands只有指令和API可获取<br>none只有API可获取<br>以及<a href="../../../20-玩法开发/15-自定义游戏内容/13-自定义物品分页.html#使用" rel="noopenner">自定义分页</a>名称 |
| identifier | str | | 包括命名空间及物品名。需要全局唯一。建议使用mod名称作为命名空间 |
| register_to_create_menu | bool | false | 是否注册到创造栏 |
| category | str | Nature | 注册到创造栏的分类,可选的值有:<br/>Construction<br/>Nature<br/>Equipment<br/>Items |
## components
@@ -47,55 +46,252 @@ time: 分钟
对于原版component你可以在上方的format_version解释中找到更多的参数及解释。
<span id="minecraft_loot"></span>
### minecraft:loot
可用于使用loot table控制掉落物
可参考[CustomBlocksMod](../../13-模组SDK编程/60-Demo示例.md#CustomBlocksMod)的customblocks:customblocks_test_ore方块
### minecraft:max\_stack\_size
<span id="minecraft_friction"></span>
### minecraft:friction
可用于设置方块的摩擦力,取值范围为(0.0-0.9)。`注意此摩擦力和原版方块的摩擦力不是同一个摩擦力`
<span id="minecraft_max_stack_size"></span>
### minecraft:max_stack_size
可用于设置方块物品最大堆叠数量,`注意该值不能超过64`
### minecraft:destroy\_time
<span id="minecraft_destroy_time"></span>
可用于控制挖掘所需的时间。该值的含义与[官方wiki](https://zh.minecraft.wiki/w/%E6%8C%96%E6%8E%98#.E6.96.B9.E5.9D.97.E7.A1.AC.E5.BA.A6)的“硬度”一致
### minecraft:destroy_time
可用于控制挖掘所需的时间。该值的含义与[官方wiki](https://minecraft-zh.gamepedia.com/%E6%8C%96%E6%8E%98#.E6.96.B9.E5.9D.97.E7.A1.AC.E5.BA.A6)的“硬度”一致
主要用于[挖掘](./2-功能.md#wajue)的功能
### minecraft:block\_light\_emission
<span id="minecraft_destructible_by_mining"></span>
可用于设置方块亮度。关于亮度及方块光源可参考[官方wiki](https://zh.minecraft.wiki/w/%E4%BA%AE%E5%BA%A6)
### minecraft:destructible_by_mining
可用于控制挖掘所需的时间。该值的含义与[官方wiki](https://minecraft-zh.gamepedia.com/%E6%8C%96%E6%8E%98#.E6.96.B9.E5.9D.97.E7.A1.AC.E5.BA.A6)的“硬度”一致
- 如果设置为 `true`,方块会采用默认的破坏时间。
- 如果设置为 `false`,方块将不可被挖掘破坏。
- 如果省略该组件,则方块同样会使用默认的破坏时间。
- 如果类型为object则是以下参数
| 键 | 类型| 默认值 | 解释|
|------------------|--------|----------------|-------------|
| seconds_to_destroy| 浮点数| `0.0` |设置方块的硬度,实际破坏时间 = 1.5 × seconds_to_destroy。 |
此组件需要在`format_version`大于等于1.19.20的方块行为中代替[minecraft:destroy_time](./1-JSON组件.md###minecraft:destroy_time)使用。
主要用于[挖掘](./2-功能.md#wajue)的功能
<span id="minecraft_block_light_emission"></span>
### minecraft:block_light_emission
可用于设置方块亮度,取值范围为[0, 1]。关于亮度及方块光源可参考[官方wiki](https://minecraft-zh.gamepedia.com/%E4%BA%AE%E5%BA%A6)
主要用于[亮度](./2-功能.md#liangdu)的功能
### minecraft:explosion\_resistance
<span id="minecraft_light_emission"></span>
可用于设置爆炸抗性。原版方块的爆炸抗性见[官方wiki](https://zh.minecraft.wiki/w/%E7%88%86%E7%82%B8#.E7.88.86.E7.82.B8.E6.8A.97.E6.80.A7)
### minecraft:light_emission
### minecraft:block\_light\_absorption
可用于设置方块亮度, 取值范围为[0, 15]。此组件需要在`format_version`大于等于1.19.20的方块行为中代替
[minecraft:block_light_emission](./1-JSON组件.md###minecraft:block_light_emission)使用。
关于亮度及方块光源可参考[官方wiki](https://minecraft-zh.gamepedia.com/%E4%BA%AE%E5%BA%A6)
可用于设置方块的透光率。具体可参考[官方wiki](https://zh.minecraft.wiki/w/%E4%BA%AE%E5%BA%A6#.E9.98.BB.E7.A2.8D.E5.85.89.E7.85.A7.E7.9A.84.E6.96.B9.E5.9D.97)
主要用于[亮度](./2-功能.md#liangdu)的功能
<span id="minecraft_explosion_resistance"></span>
### minecraft:explosion_resistance
可用于设置爆炸抗性。原版方块的爆炸抗性见[官方wiki](https://minecraft-zh.gamepedia.com/%E7%88%86%E7%82%B8#.E7.88.86.E7.82.B8.E6.8A.97.E6.80.A7)
<span id="minecraft_destructible_by_explosion"></span>
### minecraft:destructible_by_explosion
可用于控制挖掘所需的时间。该值的含义与[官方wiki](https://minecraft-zh.gamepedia.com/%E6%8C%96%E6%8E%98#.E6.96.B9.E5.9D.97.E7.A1.AC.E5.BA.A6)的“硬度”一致
- 如果设置为 `true`,方块会采用默认的爆炸抗性。
- 如果设置为 `false`,方块将不可被爆炸破坏。
- 如果省略该组件,则方块同样会使用默认的爆炸抗性。
- 如果类型为object则是以下参数
| 键 | 类型| 默认值 | 解释|
|------------------|--------|----------------|-------------|
| explosion_resistance| 浮点数| `0.0` |设置方块的爆炸抗性,实际爆炸抗性 = 5 × explosion_resistance。 |
此组件需要在`format_version`大于等于1.19.20的方块行为中代替[minecraft:explosion_resistance](./1-JSON组件.md###minecraft:explosion_resistance)使用。
原版方块的爆炸抗性见[官方wiki](https://minecraft-zh.gamepedia.com/%E7%88%86%E7%82%B8#.E7.88.86.E7.82.B8.E6.8A.97.E6.80.A7)
<span id="minecraft_block_light_absorption"></span>
### minecraft:block_light_absorption
可用于设置方块的透光率。具体可参考[官方wiki](https://minecraft-zh.gamepedia.com/%E4%BA%AE%E5%BA%A6#.E9.98.BB.E7.A2.8D.E5.85.89.E7.85.A7.E7.9A.84.E6.96.B9.E5.9D.97)
默认为不透光。
主要用于[亮度](./2-功能.md#liangdu)的功能
### minecraft:map\_color
<span id="minecraft_light_dampening"></span>
### minecraft:light_dampening
可用于设置方块吸光程度, 取值范围为[0, 15]。此组件需要在 `format_version`大于等于1.19.20的方块行为中代替[minecraft:block_light_absorption](./1-JSON组件.md###minecraft:block_light_absorption)使用。
关于亮度及方块光源可参考[官方wiki](https://minecraft-zh.gamepedia.com/%E4%BA%AE%E5%BA%A6)
主要用于[亮度](./2-功能.md#liangdu)的功能
<span id="minecraft_map_color"></span>
### minecraft:map_color
可用于设置方块显示在地图上的颜色
<span id="minecraft_display_name"></span>
### minecraft:display_name
指定语言文件键,用于映射鼠标悬停在物品栏和快捷栏中的方块物品上时显示的文本。如果给定的字符串无法解析为本地字符串,则将显示给定的原始字符串。使用需要方块行为的 `format_version`大于等于1.19.60。
<span id="netease_portal"></span>
### netease:portal
| 键 | 类型 | 默认值 | 解释 |
| -------------------- | ------ | ------ | ------------------------------------------------------------ |
| particle_east_west | string | | 可选对应于粒子json文件中的identifier用于控制方块与Z轴同向时播放的粒子特效 |
| particle_north_south | string | | 可选对应于粒子json文件中的identifier用于控制方块与X轴同向时播放的粒子特效 |
| target_dimension | int | | 必须设置,用于控制进入传送门方块后到达的目标维度 |
- **自定义传送门方块的base_block需要设为portal。**
- 粒子特效应放置于`resource/particles`,粒子特效编写可参考[官方关于粒子组件的说明](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/particlesreference/particlecomponentlist?view=minecraft-bedrock-stable)。
- **目标维度为0或3-20的整数或者大于21的新版自定义维度的数值1下界和2末地会被视作0来处理。**
<span id="netease_mob_spawner"></span>
### netease:mob_spawner
可在netease:mob_spawner组件中设置刷怪的类型目前支持原生生物、微软自定义生物。
| 键 | 类型 | 默认值 | 解释 |
| ---- | ------ | ------ | -------------------------------- |
| type | string | | 必须设置,用于控制生成的生物类型 |
- 原生生物type为"minecraft:Namespaced ID",如"minecraft:parrot"Namespaced ID可参考[官方wiki](https://zh.minecraft.wiki/w/%E5%9F%BA%E5%B2%A9%E7%89%88%E6%95%B0%E6%8D%AE%E5%80%BC/%E5%AE%9E%E4%BD%93ID)中各Mob的详细信息。
- 微软自定义生物type为"minecraft:entity"中"description"的"identifier"项,可参考[自定义生物文档](../../3-自定义生物/01-自定义基础生物.md)及[CustomBlocksMod](../../../13-模组SDK编程/60-Demo示例.md#CustomBlocksMod)中的customblocks_test_mobspawner1.json。
- 自定义刷怪箱方块的base_block需要设为mob_spawner。
<span id="netease_water_destory"></span>
### netease:water_destory
可在netease:water_destory组件中设置是否无法摆放在水源和流水方块中如果设置为true会被流水摧毁。
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | -------------------------------------------- |
| value | bool | | 必须设置,用于设置无法摆放在水源和流水方块中 |
- 可以在方块的loottable中设置被水流摧毁后的掉落物
<span id="netease_water_only"></span>
### netease:water_only
可在netease:water_only组件中设置是否必须放置在水中。
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ------------------------------------ |
| value | bool | | 必须设置,用于设置是否必须放在水中。 |
<span id="netease_water_source"></span>
### netease:water_source
可在netease:water_source组件中设置是否在水源方块中表现为含水。
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | -------------------------------------- |
| value | bool | | 必须设置,是否在水源方块中表现为含水。 |
<span id="netease_water_flow_source"></span>
### netease:water_flow_source
可在netease:water_flow_source组件中设置是否在水源和流水方块中表现为含水。
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | -------------------------------------------- |
| value | bool | | 必须设置,是否在水源和流水方块中表现为含水。 |
<span id="netease_snow_recover_able"></span>
### netease:snow_recover_able
可在netease:snow_recover_able组件中设置方块是否能含雪。
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | -------------------------------- |
| value | bool | | 必须设置,用于设置方块是否能含雪 |
- 目前自定义含雪方块和方块实体不兼容(包括自定义方块实体,自定义刷怪箱等),请不要一起使用。
<span id="netease_can_built_over"></span>
### netease:can_built_over
可在netease:can_built_over组件中设置在放置其他方块时如果该位置已有含netease:can_built_over配置的方块其他方块能否和放置在此方块中。
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ------------------------------------------------------------ |
| value | bool | | 必须设置用于设置在放置其他方块时如果该位置已有含netease:can_built_over配置的方块其他方块能否和放置在此方块中 |
<span id="netease_tier"></span>
### netease:tier
用于设置与挖掘相关的属性
主要用于[挖掘](./2-功能.md#wajue)的功能
| 键 | 类型 | 默认值 | 解释 |
| :-------------: | :----: | :----: | :----------------------------------------------------------- |
| digger | string | | 必须设置。表示方块使用此工具挖掘时有速度加成。<br>可选的值有:<br> shovel铲<br> pickaxe镐<br> hatchet斧<br> hoe |
| destroy_special | bool | false | 可选。<br>当设置为true时表示只有使用digger设置的工具进行挖掘才会产生掉落物。 |
| level | int | 0 | 可选。<br>当destroy_special为true时才会生效。表示挖掘所需的工具等级若手持工具等级小于该值则不会产生掉落物。<br>原版工具的等级:<br> 空手/其他非工具物品0<br> 木制/金制工具0<br> 石制工具1<br> 铁制工具2<br> 钻石工具3 |
| 键 | 类型 | 默认值 | 解释 |
| :-------------: | :----: | :----: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| digger | string | | 必须设置。表示方块使用此工具挖掘时有速度加成。<br/>可选的值有: <br/>shovel<br/>pickaxe<br/>hatchet<br/>hoe |
| destroy_special | bool | false | 可选。当设置为true时表示只有使用digger设置的工具进行挖掘才会产生掉落物。 |
| level | int | 0 | 可选。当destroy_special为true时才会生效。表示挖掘所需的工具等级若手持工具等级小于该值则不会产生掉落物。<br/>原版工具的等级: <br/>空手/其他非工具物品0<br/>木制/金制工具0<br/>石制工具1 <br/>铁制工具2 <br/>钻石工具3 |
<span id="netease_aabb"></span>
### netease:aabb
@@ -109,27 +305,29 @@ time: 分钟
可参考[CustomBlocksMod](../../13-模组SDK编程/60-Demo示例.md#CustomBlocksMod)的customblocks_model_flower及customblocks_model_wire方块。
| 键 | 类型 | 默认值 | 解释 |
| --------- | ------------- | ------ | ------------------------------------------------------------ |
| collision | object或array | | 计算与物体碰撞时用的碰撞盒 |
| clip | object或array | | 计算射线检测时用的碰撞盒。如准心选取及弹射物碰撞。<br>那么当该AABB没有体积时准心与弹射物都会无视这个方块 |
| 键 | 类型 | 默认值 | 解释 |
| --------- | ------------- | ------ | -------------------------------------------------------------------------------------------------------------- |
| collision | object或array | | 计算与物体碰撞时用的碰撞盒 |
| clip | object或array | | 计算射线检测时用的碰撞盒。如准心选取及弹射物碰撞。那么当该AABB没有体积时准心与弹射物都会无视这个方块 |
当collision或clip为object时用于表示恒定大小的单一碰撞盒结构为
| 键 | 类型 | 默认值 | 解释 |
| ---- | ------------ | --------- | ---------------------------------- |
| min | array(float) | [0, 0, 0] | min的三个值必须小于等于max的三个值 |
| max | array(float) | [1, 1, 1] | |
| 键 | 类型 | 默认值 | 解释 |
| --- | ------------ | --------- | ---------------------------------- |
| min | array(float) | [0, 0, 0] | min的三个值必须小于等于max的三个值 |
| max | array(float) | [1, 1, 1] | |
当collision或clip为array时用于可变化的多个碰撞盒的组合通常用于可变化的自定义方块模型。元素的结构为
| | 类型 | 默认值 | 解释 |
| ------ | ------------ | --------- | ------------------------------------------------------------ |
| enable | molang | true | 控制是否开启该碰撞箱<br/>目前仅支持is_connect查询详见[netease:connection](#netease_connection) |
| min | array(float) | [0, 0, 0] | min的三个值必须小于等于max的三个值 |
| max | array(float) | [1, 1, 1] | |
| | 类型 | 默认值 | 解释 |
| ------ | ------------ | --------- | ------------------------------------------------------------------------------------------------ |
| enable | molang | true | 控制是否开启该碰撞箱目前仅支持is_connect查询详见[netease:connection](#netease_connection) |
| min | array(float) | [0, 0, 0] | min的三个值必须小于等于max的三个值 |
| max | array(float) | [1, 1, 1] | |
### netease:face\_directional
<span id="netease_face_directional"></span>
### netease:face_directional
用于设置方块的多面向
@@ -137,21 +335,21 @@ time: 分钟
| 键 | 类型 | 默认值 | 解释 |
| ---- | ------ | ------ | ----------------------------------------------------- |
| type | string | | direction四面向方块<br>facing_direction六面向方块 |
| type | string | | direction四面向方块facing_direction六面向方块 |
需要注意使用netease:face_directional组件的六面向方块的放置出来的贴图朝向和手持时的贴图朝向不同。
可以通过修改blocks.json中的carried_textures属性重新定义手持方块贴图的朝向来解决该问题。
<span id="netease:fuel "></span>
### netease:fuel
设置方块的燃料属性,允许该方块作为燃料在熔炉中燃烧
可燃类物品组件。允许该方块物品作为燃料在熔炉中燃烧
| 键 | 类型 | 默认值 | 解释 |
| -------- | ----- | ------ | -------------------------------- |
| duration | float | 0.0 | 该方块可提供的熔炉燃烧时长(秒) |
| 键 | 类型 | 默认值 | 解释 |
| -------- | ----- | ------ | ----------------------------------------- |
| duration | float | 0 | 可填, 该物品可提供的熔炉燃烧时长(秒) |
### netease:render\_layer
<span id="netease_render_layer"></span>
### netease:render_layer
用于设置方块渲染时使用的材质
@@ -159,7 +357,9 @@ time: 分钟
| 键 | 类型 | 默认值 | 解释 |
| ----- | ------ | ------ | ------------------------------------------------------------ |
| value | string | | 目前支持的材质有:<br>opaque不透明即“terrain_opaque”材质。默认为此项<br>alpha全透明即“terrain_alpha”材质如火焰该材质用于异形方块用在方块类上但与其他方块重合时会出现闪烁可以使用no_crop_face_block组件避免闪烁。<br>blend半透明即“terrain_blend”材质如彩色玻璃。<br>optionalAlpha局部透明与alpha不同alpha超过一定距离将不渲染而optionalAlpha不会能配合no_crop_face_block组件实现原版叶子效果。 |
| value | string | | 目前支持的材质有:<br>opaque不透明即“terrain_opaque”材质。默认为此项<br/>alpha全透明即“terrain_alpha”材质如火焰该材质用于异形方块用在方块类上但与其他方块重合时会出现闪烁可以使用no_crop_face_block组件避免闪烁。<br/>blend半透明即“terrain_blend”材质如彩色玻璃。<br/>optionalAlpha局部透明与alpha不同alpha超过一定距离将不渲染而optionalAlpha不会能配合no_crop_face_block组件实现原版叶子效果。 |
<span id="netease_solid"></span>
### netease:solid
@@ -169,9 +369,11 @@ time: 分钟
可参考[CustomBlocksMod](../../13-模组SDK编程/60-Demo示例.md#CustomBlocksMod)的customblocks:customblocks_model_flower方块。
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ------------------------------------------------------------ |
| value | bool | true | 为true时生物在方块内会受到窒息伤害<br>为false时生物在方块内不会受到窒息伤害 |
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ------------------------------------------------------------------------------- |
| value | bool | true | 为true时生物在方块内会受到窒息伤害为false时生物在方块内不会受到窒息伤害 |
<span id="netease_pathable"></span>
### netease:pathable
@@ -179,58 +381,66 @@ time: 分钟
可参考[CustomBlocksMod](../../13-模组SDK编程/60-Demo示例.md#CustomBlocksMod)的customblocks:customblocks_model_flower方块。
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ------------------------------------------------------------ |
| value | bool | false | 为true时寻路时被当作空气<br>为false时寻路时被当作障碍物并且可在其上方行走 |
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ------------------------------------------------------------------------------- |
| value | bool | false | 为true时寻路时被当作空气为false时寻路时被当作障碍物并且可在其上方行走 |
### netease:block\_entity
<span id="netease_block_entity"></span>
### netease:block_entity
用于给自定义方块添加[自定义方块实体](./4-自定义方块实体.md)。
可参考[CustomBlocksMod](../../13-模组SDK编程/60-Demo示例.md#CustomBlocksMod)的customblocks:customblocks_test_block_entity方块。
| 键 | 类型 | 默认值 | 解释 |
| ------- | ---- | ------ | ------------------------------------------------------------ |
| tick | bool | false | 为true时当玩家进入方块tick范围时该方块每秒会发送**20次**ServerBlockEntityTickEvent事件<br>为false时该方块不会发送ServerBlockEntityTickEvent事件 |
| client_tick | bool | false | 为true时当玩家进入方块tick范围时该方块每秒会发送**20次**ModBlockEntityTickClientEvent事件<br>为false时该方块不会发送ModBlockEntityTickClientEvent事件 |
| movable | bool | true | 为true时该方块可被粘性活塞拉回<br>为false时该方块不可被粘性活塞拉回 |
| 键 | 类型 | 默认值 | 解释 |
| ----------- | ---- | ------ | ------------------------------------------------------------ |
| tick | bool | false | 为true时当玩家进入方块tick范围时该方块每秒会发送**20次**ServerBlockEntityTickEvent事件<br/>为false时该方块不会发送ServerBlockEntityTickEvent事件 |
| client_tick | bool | false | 为true时当玩家进入方块tick范围时该方块每秒会发送**20次**ModBlockEntityTickClientEvent事件<br/>为false时该方块不会发送ModBlockEntityTickClientEvent事件 |
| movable | bool | true | 为true时该方块可被粘性活塞拉回为false时该方块不可被粘性活塞拉回 |
### netease:random\_tick
<span id="netease_random_tick"></span>
### netease:random_tick
用于给自定义方块定义是否可以随机tick并且设置该tick事件是否发送到脚本层。
| 键 | 类型 | 默认值 | 解释 |
| -------------- | ---- | ------ | ------------------------------------------------------------ |
| enable | bool | false | 方块是否随机tick |
| tick_to_script | bool | false | 是否发送事件<a href="../../../../mcdocs/1-ModAPI/事件/方块.html#blockrandomtickserverevent" rel="noopenner"> BlockRandomTickServerEvent </a>到python脚本 |
| 键 | 类型 | 默认值 | 解释 |
| -------------- | ---- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| enable | bool | false | 方块是否随机tick |
| tick_to_script | bool | false | 是否发送事件 BlockRandomTickServerEvent 到python脚本 |
### netease:block\_animate\_random\_tick
### netease:block_animate_random_tick
频率更高的方块tick用于实现类似樱花树叶的方块特效。给自定义方块配置该组件后开发者可以在**客户端**监听<a href="../../../../mcdocs/1-ModAPI/事件/方块.html#blockanimaterandomtickevent" rel="noopenner"> BlockAnimateRandomTickEvent </a>事件给方块附加逻辑。
| 键 | 类型 | 默认值 | 解释 |
| ------------ | ----- | ------ | ------ |
| trigger_rate | float | 0.1 | 触发率 |
| send_event | bool | true | 触发BlockAnimateRandomTickEvent事件 |
该组件采用了和原版樱花树叶/末地烛相同的逻辑支持无需方块实体即可tick且性能开销低。不建议在事件里将数据传给服务端因为每个玩家客户端tick到的方块都是随机的可能相同也可能不同,除非你知道自己在做什么
该组件采用了和原版樱花树叶/末地烛相同的逻辑支持无需方块实体即可tick且性能开销低。不建议在事件里将数据传给服务端因为每个玩家客户端tick到的方块都是随机的可能相同也可能不同。
**方块离玩家越近,触发频率越大**当方块距离玩家16个方块以内时如果设置trigger_rate为1几乎每秒都能触发原版樱花树叶的触发率为0.1约等于总是10%的概率触发落叶。随着方块离玩家越远触发几率也会递减。最大触发距离为32-40格32是玩家静止不动时的值玩家移动时最多可能有8个方块距离的偏移。
**设备性能越好,触发频率越大**游戏引擎会记录帧耗时超时的tick不会触发Python事件避免大量方块同时tick导致卡顿。
### netease:redstone\_property
### netease:redstone_property
用于给自定义方块设置红石属性
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ------------------------------------------------------------ |
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ----------------------------------------------------------------------------------------------- |
| value | str | None | 目前只支持break_on_push设置之后方块可以被活塞破坏变成掉落物否则方块会被活塞推动而不破坏 |
### netease:neighborchanged\_sendto\_script
### netease:neighborchanged_sendto_script
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ------------------------------------------------------------ |
| value | bool | false | 方块周围环境变化是否发送事件<a href="../../../../mcdocs/1-ModAPI/事件/方块.html#blockneighborchangedserverevent#blockneighborchangedserverevent" rel="noopenner"> BlockNeighborChangedServerEvent </a>到脚本层 |
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| value | bool | false | 方块周围环境变化是否发送事件 BlockNeighborChangedServerEvent 到脚本层 |
<span id="netease_connection"></span>
### netease:connection
@@ -250,7 +460,9 @@ time: 分钟
| 名称 | 解释 |
| ---------------- | ------------------------------------------------------------ |
| query.is_connect | 传入一个参数返回该方块与对应临面上的方块是否有connection属性<br/>参数取值与对应的面:<br>0-down面1-up面2-north面3-south面4-west面5-east面。 |
| query.is_connect | 传入一个参数返回该方块与对应临面上的方块是否有connection属性参数取值与对应的面<br/>0-down面<br/>1-up面<br/>2-north面<br/>3-south面<br/>4-west面<br/>5-east面。 |
<span id="netease_redstone"></span>
### netease:redstone
@@ -265,7 +477,9 @@ time: 分钟
| type | str | | 红石类型:<br/>producer红石源<br/>consumer红石机械元件 |
| strength | int | 15 | 红石信号值,范围[0,15] |
### netease:listen\_block\_remove
<span id="listen_block_remove"></span>
### netease:listen_block_remove
用于配置自定义方块是否监听方块的<a href="../../../../mcdocs/1-ModAPI/事件/方块.html#blockremoveserverevent" rel="noopenner"> BlockRemoveServerEvent </a>事件
@@ -273,7 +487,9 @@ time: 分钟
| ----- | ---- | ------ | ------------ |
| value | bool | false | 是否监听事件 |
### netease:may\_place\_on
<span id="netease_may_place_on"></span>
### netease:may_place_on
用于配置自定义方块可存在于哪些方块的上面。
@@ -281,13 +497,15 @@ time: 分钟
可参考CustomBlocksMod示例中的customblocks_model_flower
| 键 | 类型 | 默认值 | 说明 |
| --------------- | ------------ | ------ | ------------------------------------------------------------ |
| block | list(str) | | 方块identifier的列表。这些方块的所有[方块状态](../../10-基本概念/1-我的世界基础概念.md#方块状态)都可放置 |
| block_state | list(object) | | [方块状态](../../10-基本概念/1-我的世界基础概念.md#方块状态)的列表。<br>每个元素只对应一个特定的方块状态,如果方块有多个种类的状态,需要考虑排列组合的所有情况<br>最终可在上面放置的方块是block字段与block_state字段的并集 |
| spawn_resources | bool | true | 已存在的方块因下方的方块发生改变而被破坏时,是否生成掉落物 |
| 键 | 类型 | 默认值 | 说明 |
| --------------- | ------------ | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| block | list(str) | | 方块identifier的列表。这些方块的所有[方块状态](../../10-基本概念/1-我的世界基础概念.md#方块状态)都可放置 |
| block_state | list(object) | | [方块状态](../../10-基本概念/1-我的世界基础概念.md#方块状态)的列表。每个元素只对应一个特定的方块状态如果方块有多个种类的状态需要考虑排列组合的所有情况最终可在上面放置的方块是block字段与block_state字段的并集 |
| spawn_resources | bool | true | 已存在的方块因下方的方块发生改变而被破坏时,是否生成掉落物 |
### netease:fire\_resistant
<span id="netease_fire_resistant"></span>
### netease:fire_resistant
用于配置自定义方块是否防火。
@@ -299,7 +517,7 @@ time: 分钟
| ----- | ---- | ------ | -------- |
| value | bool | | 是否防火 |
### netease:block\_properties
### netease:block_properties
用于配置自定义方块的方块属性
@@ -307,35 +525,35 @@ time: 分钟
可参考CustomBlocksMod示例中的customblocks_slime、customblocks_flower_extend
| 键 | 类型 | 默认值 | 说明 |
| ----- | ---- | ------ | -------- |
| 键 | 类型 | 默认值 | 说明 |
| ---------- | ----- | ------ | -------------- |
| properties | array | | 所有属性字符串 |
其中properties数组目前支持以下字符串填充
| 键 | 说明 |
| ----- |-------- |
| piston_block_grabber | 被活塞推动时是否带动旁边方块 |
| slime | 主要用于变为移动方块(例如被活塞推)时修改对实体力的计算 |
|breaks_when_fallen_on_by_heavy| 当重力方块结束下落在该方块位置后,自身是否被毁坏|
| 键 | 说明 |
| ------------------------------ | -------------------------------------------------------- |
| piston_block_grabber | 被活塞推动时是否带动旁边方块 |
| slime | 主要用于变为移动方块(例如被活塞推)时修改对实体力的计算 |
| breaks_when_fallen_on_by_heavy | 当重力方块结束下落在该方块位置后,自身是否被毁坏 |
如果方块碰撞盒体积使用netease:aabb或minecraft:entity_collision改小可能会导致无法触发目前可参考范围是边长0.4以下不会触发)。
### netease:on\_stand\_on
### netease:on_stand_on
用于触发实体站在方块上的事件
可参考CustomBlocksMod示例中的customblocks_slime利用了该事件组合做出了个模拟原版粘液块的效果。
| 键 | 类型 | 默认值 | 说明 |
| ----- | ---- | ------ | -------- |
| 键 | 类型 | 默认值 | 说明 |
| ----------------- | ---- | ------ | -------------------- |
| send_python_event | bool | | 是否发送事件至python |
当send_python_event为true时该方块会触发OnStandOnBlockClientEvent、OnStandOnBlockServerEvent事件。
如果方块碰撞盒体积使用netease:aabb或minecraft:entity_collision改小可能会导致无法触发目前可参考范围是边长0.4以下不会触发)。
### netease:on\_before\_fall\_on
### netease:on_before_fall_on
用于触发实体刚下落至方块的事件,主要用于伤害计算
@@ -343,7 +561,7 @@ time: 分钟
如果方块碰撞盒体积使用netease:aabb或minecraft:entity_collision改小可能会导致无法触发目前可参考范围是边长0.4以下不会触发)。
### netease:on\_after\_fall\_on
### netease:on_after_fall_on
用于触发实体下落至方块后的事件,主要用于力的计算
@@ -351,25 +569,27 @@ time: 分钟
如果方块碰撞盒体积使用netease:aabb或minecraft:entity_collision改小可能会导致无法触发目前可参考范围是边长0.4以下不会触发)。
### netease:on\_entity\_inside
### netease:on_entity_inside
用于触发实体碰撞盒所在位置有方块时的事件(判断位置逻辑有无方块,与方块碰撞盒大小无关)。
当send_python_event为true时该方块会触发OnEntityInsideBlockClientEvent、OnEntityInsideBlockServerEvent事件。
### netease:on\_step\_on
### netease:on_step_on
用于触发实体刚移动至一个实心方块上的事件
可参考CustomBlocksMod示例中的customblocks_slime在触发该事件时进行了日志打印
### netease:on\_step\_off
### netease:on_step_off
用于触发实体刚离开一个实心方块上的事件
可参考CustomBlocksMod示例中的customblocks_slime在触发该事件时进行了日志打印
### netease:block\_random\_offset
<span id="netease_offset"></span>
### netease:block_random_offset
用于设置方块的偏移,能实现原版花朵的偏移效果。
@@ -377,12 +597,14 @@ time: 分钟
该组件会把方块的材质设置为透明且不可与netease:render_layer的不透明材质一起共用否则会出现渲染错误
| 键 | 类型 | 默认值 | 解释 |
| ------- | ------------- | ------ | ------------------------------------------------------------ |
| 键 | 类型 | 默认值 | 解释 |
| ------- | ------------- | ------ | ------------------------------------------------------------------------------ |
| x_scope | [float,float] | [0,0] | x轴方向的偏移范围size为2的array取值范围为0.0~1.0,如果两个值相同则为指定点 |
| z_scope | [float,float] | [0,0] | z轴方向的偏移范围size为2的array取值范围为0.0~1.0,如果两个值相同则为指定点 |
### netease:block\_chest
<span id="block_chest"></span>
### netease:block_chest
用于给方块添加箱子功能使用了该组件会创建一个block_entity方块会与其他block_entity逻辑有冲突请谨慎使用。
@@ -392,16 +614,29 @@ time: 分钟
使用SetBlockNew接口创建自定义箱子的时候需要先调用一次SetBlockNew将目标位置方块设置为Air再使用AddTimer延后调用SetBlockNew创建自定义箱子
| 键 | 类型 | 默认值 | 解释 |
| ------------------ | ---- | ------ | ------------------------------------------------------------ |
| custom_description | str | | 箱子UI上面显示的箱子名称不填为空 |
| chest_capacity | int | | 必填箱子的容量行数取值范围1-8如果can_pair取值为true且该值大于4将自动变为4 |
| can_pair | bool | false | 是否可以与隔壁箱子组合,合成一个大箱子 |
| 键 | 类型 | 默认值 | 解释 |
| ------------------ | ---- | ------ | ------------------------------------------------------------------------------------------ |
| custom_description | str | | 箱子UI上面显示的箱子名称不填为空 |
| chest_capacity | int | | 必填箱子的容量行数取值范围1-8如果can_pair取值为true且该值大于4将自动变为4 |
| can_pair | bool | false | 是否可以与隔壁箱子组合,合成一个大箱子 |
| is_shulker_box | bool | false | 是否为潜影盒箱子,如果开启摧毁方块将不会掉落,与原版潜影盒功能相同,无法与隔壁箱子进行组合 |
| mute | bool | true | 是否关闭箱子开启与关闭时的音效 |
| can_be_blocked | bool | false | 是否能被阻挡,即箱子上面有阻挡的方块时能否打开箱子 |
| mute | bool | true | 是否关闭箱子开启与关闭时的音效 |
| can_be_blocked | bool | false | 是否能被阻挡,即箱子上面有阻挡的方块时能否打开箱子 |
<span id="block_container"></span>
### netease:no\_crop\_face\_block
### netease:block_container
[自定义容器](./3-特殊方块/11-自定义容器.md)组件使用时需要将base_block设为netease_container。相比[netease:block_chest](#netease-block-chest)该组件支持使用资源包UI Json配置方块打开后的UI界面方便开发者制作自定义熔炉等界面而无需考虑复杂的交互逻辑数据同步逻辑等。
| 键 | 类型 | 默认值 | 解释 |
| ------------------ | ---- | ----- | ------------------------------------------ |
| custom_description | str | | 容器ui打开时的title复用原版ui时生效 |
| screen_name | str | | 交互方块时打开的ui形如namespace.screenName |
| container_size | int | | 方块容器能够存放的物品槽位数量取值范围1-108需与ui槽位匹配。若ui槽位大于配置容量超过配置的部分无法放入物品若ui槽位小于配置容量按shift可放入但无法在ui中显示 |
<span id="no_crop_face_block"></span>
### netease:no_crop_face_block
该组件能实现当两个方块相邻时相邻面渲染其中一个方块的一面与原版2个叶子方块相邻效果一致不会把相邻面都裁剪掉
@@ -417,10 +652,12 @@ time: 分钟
}
```
### netease:custom\_tips
<span id="custom_tips"></span>
### netease:custom_tips
该组件用于自定义方块Item的物品信息描述与自定义物品中的 netease:customtips 作用相同
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | -------- | -------------- |
| value | str | 物品名称 | 物品的描述信息 |
| value | str | 物品名称 | 物品的描述信息 |

View File

@@ -0,0 +1,334 @@
---
hard: 入门
time: 分钟
---
# 自定义容器
## 概述
该功能类似自定义箱子使用原生c++驱动背包界面,实现自定义容器界面的方块。
包含长按分堆、双击合堆、右键拖放等功能方块破坏后内部物品会掉落方便开发者制作自定义熔炉等界面而无需考虑复杂的UI逻辑数据同步逻辑等。
## base_block新增netease_container
base_block指定现在可以指定为netease_container
## netease:block_container
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | -------- | -------------- |
| custom_description | str | 容器名 | 容器ui打开时的title复用原版ui时生效|
| screen_name | str | ui名 | 交互方块时打开的ui形如namespace.screenName |
| container_size | int | 容器容量 | 方块容器能够存放的物品槽位数量取值范围1-108需与ui槽位匹配。若ui槽位大于配置容量超过配置的部分无法放入物品若ui槽位小于配置容量按shift可放入但无法在ui中显示
| hopper | str | {} | 配置支持漏斗漏入漏出详细请见下面hopper字段说明 |
## hopper字段说明
- hopper漏斗字段无此字段或字段为空时无用dict
- input是否支持漏入True为使用input_solt字段中漏入规则False为不支持漏入input_solt不会起作用。缺省代表支持全部漏入input_slot不会起作用
- input_slot支持漏入字段list当input字段存在且为True时漏入规则才会生效无此字段、字段为空、input字段不存在时代表所有朝向支持漏入
- face支持漏入的面int
- slot支持漏入netease_container的槽位如[1,10]代表1和10槽位支持漏入其余槽位不支持漏入无此字段和字段为空时代表所有槽位支持漏入 list
- output为true时代表支持自定义容器底部漏出功能bool无此字段代表支持底部漏出
## hopper字段举例
```json
"hopper": {
"input": true,
"input_slot": [
{
"face": 1,
"slot": [1,10]
}
],
"output": true
}
```
### 注意事项
- netease_container的size限定为1-108不在该范围会导致注册失败需在组件中配置
- netease_ui_container的size为108ui中如果指定了大于108的slot将无法放入物品无需配置
## 自定义容器事件
1. PlayerTryPutCustomContainerItemServerEvent事件玩家尝试改变自定义容器物品时触发该事件开发者可以监听该事件实现其他逻辑
## 示例
自定义容器方块配置:
```json
{
"format_version": "1.16.100",
"minecraft:block": {
"components": {
"netease:block_container": {
"custom_description": "自定义方块容器",
"screen_name": "netease_container.netease_custom_container_screen", // 交互该方块时打开的ui
"container_size": 27 // 关闭后保存在方块中的容器size对应ui中的netease_container扩展写法
}
},
"description": {
"base_block": "netease_container",
"category": "construction",
"identifier": "test:my_custom_container"
}
}
}
```
ui配置
> 此处以原版箱子的json为基础进行修改
注意:
- collection_name指定为netease_container
- ui的grid空格数量如果大于组件中设置的size那超出的那一部分无法放置物品
```json
{
"namespace": "netease_container",
"test_collection": {
"type": "stack_panel",
"size": [ "100%", "100%c" ],
"controls": [
{
"row_1": {
"type": "stack_panel",
"orientation": "horizontal",
"size": [ "100%", "100%cm" ],
"collection_name": "netease_container",
"controls": [
{
"a@netease_container.custom_grid_item": {
"collection_index": 27
}
},
{
"padding": {
"type": "panel",
"size": [ 4, 0 ]
}
},
{
"b@netease_container.custom_grid_item": {
"collection_index": 28
}
}
]
}
},
{
"padding_1": {
"type": "panel",
"size": [ "100%", 4 ]
}
},
{
"row_2": {
"type": "stack_panel",
"orientation": "horizontal",
"size": [ "100%", "100%cm" ],
"collection_name": "netease_container",
"controls": [
{
"c@netease_container.custom_grid_item": {
"collection_index": 29
}
},
{
"padding": {
"type": "panel",
"size": [ 4, 0 ]
}
},
{
"d@netease_container.custom_grid_item": {
"collection_index": 30
}
}
]
}
},
{
"padding_2": {
"type": "panel",
"size": [ "100%", 4 ]
}
}
]
},
"custom_grid_item@common.container_item": {
"$item_collection_name": "netease_container"
},
"custom_drop_grid_item@common.container_item": {
"$item_collection_name": "netease_ui_container"
},
"netease_custom_container_grid": {
"type": "grid",
"size": [ 162, "100.0%c" ],
"anchor_from": "top_left",
"anchor_to": "top_left",
"grid_dimensions": [ 9, 3 ],
"grid_item_template": "netease_container.custom_grid_item",
"collection_name": "netease_container",
"maximum_grid_items": 27
},
"netease_drop_container_grid": {
"type": "grid",
"size": [ 162, "100.0%c" ],
"anchor_from": "top_left",
"anchor_to": "top_left",
"grid_dimensions": [ 9, 2 ],
"grid_item_template": "netease_container.custom_drop_grid_item",
"collection_name": "netease_ui_container",
"maximum_grid_items": 18
},
"container_label": {
"type": "label",
"offset": [ 7, -1 ],
"anchor_from": "top_left",
"anchor_to": "top_left",
"text": "$container_title",
"size": [ "90%", "default" ],
"color": "$title_text_color",
"layer": 2
},
"selected_item_details@common.selected_item_details": {
"offset": [ 0, 0 ]
},
"netease_custom_container_panel_top_half": {
"type": "panel",
"size": [ "100%", "100.0%c" ],
"offset": [ 0, 11 ],
"anchor_to": "top_left",
"anchor_from": "top_left",
"controls": [
{
"container_label@netease_container.container_label": {}
},
{
"netease_custom_container_grid1@netease_container.netease_custom_container_grid": {
"offset": [ 7, 10 ]
}
},
{
"netease_custom_container_grid2@netease_container.netease_drop_container_grid": {
"offset": [ 7, 70 ]
}
}
]
},
"netease_custom_container_panel": {
"type": "panel",
"controls": [
{
"container_gamepad_helpers@common.container_gamepad_helpers": {}
},
{
"flying_item_renderer@common.flying_item_renderer": {
"layer": 11
}
},
{
"selected_item_details_factory@common.selected_item_details_factory": {
"control_name": "@netease_container.selected_item_details"
}
},
{
"item_lock_notification_factory@common.item_lock_notification_factory": {
"control_name": "@common.item_lock_notification"
}
},
{
"root_panel@common.root_panel": {
"size": [ 176, 220 ],
"layer": 1,
"controls": [
{
"common_panel@common.common_panel": {
"size": [ "100%", "100.0%c" ],
"$dialog_background|default": "common.dialog_background_opaque",
"controls": [
{
"bg_image@$dialog_background": {
"size": [ "100%", "100.0%c+-37.0px" ],
"layer": 1,
"controls": [
{
"chest_panel": {
"type": "panel",
"layer": 5,
"size": [ "100%", "100.0%c+-7.0px" ],
"controls": [
{
"netease_custom_container_panel_top_half@netease_container.netease_custom_container_panel_top_half": {}
},
{
"inventory_panel_bottom_half_with_label@common.inventory_panel_bottom_half_with_label": {}
},
{
"hotbar_grid@common.hotbar_grid_template": {}
}
]
}
},
{
"inventory_selected_icon_button@common.inventory_selected_icon_button": {}
},
{
"gamepad_cursor@common.gamepad_cursor_button": {}
},
{
"close@common.close_button": {
"layer": "$close_button_layer",
"offset": "$close_button_offset",
"ignored": "$use_compact_close_button"
}
},
{
"compact_close@common.compact_close_button": {
"layer": "$close_button_layer",
"offset": "$close_button_offset",
"ignored": "(not $use_compact_close_button)"
}
}
],
"bindings": [
{
"binding_name": "$close_button_visible_binding_name",
"binding_name_override": "#visible"
}
]
}
}
]
}
}
]
}
}
]
},
"netease_custom_container_screen@common.inventory_screen_common": {
"$close_on_player_hurt|default": true,
"close_on_player_hurt": "$close_on_player_hurt",
"variables": [
{
"requires": "$desktop_screen",
"$screen_content": "netease_container.netease_custom_container_panel",
"$screen_bg_content": "common.screen_background",
"$screen_background_alpha": 0.4
},
{
"requires": "$pocket_screen",
"$screen_content": "netease_container_pocket.netease_custom_container_panel"
}
]
}
}
```

View File

@@ -500,23 +500,23 @@ resource_pack/models/entity/squirrel.geo.json
```json
"render_controllers": [
{ "controller.render.player.first_person": "variable.is_first_person" },
{ "controller.render.player.third_person": "!variable.is_first_person && !variable.map_face_icon" },
{ "controller.render.player.map": "variable.map_face_icon" },
{ "controller.render.player.first_person_bloom": "variable.is_first_person" },
{ "controller.render.player.third_person_bloom": "!variable.is_first_person && !variable.map_face_icon" }
{"controller.render.player.first_person_spectator": "variable.is_first_person && query.is_spectator"},
{"controller.render.player.third_person_spectator": "!variable.is_first_person && !variable.map_face_icon && query.is_spectator"},
{"controller.render.player.first_person": "variable.is_first_person && !query.is_spectator"},
{"controller.render.player.third_person": "!variable.is_first_person && !variable.map_face_icon && !query.is_spectator"},
{"controller.render.player.map": "variable.map_face_icon"}
],
```
在render_controllers数组中玩家存在五个渲染控制器。
| 渲染控制器名称 | 渲染控制器应用条件 | 说明 |
| ------------------------------------------- | ---------------------------------------------------- | -------------------------------- |
| controller.render.player.first_person | variable.is_first_person | 第一人称该渲染控制器生效 |
| controller.render.player.third_person | !variable.is_first_person && !variable.map_face_icon | 非第一人称下同时非地图图标下生效 |
| controller.render.player.map | variable.map_face_icon | 地图图标模式下生效 |
| controller.render.player.first_person_bloom | variable.is_first_person | 第一人称时该渲染控制器生效 |
| controller.render.player.third_person_bloom | !variable.is_first_person && !variable.map_face_icon | 非第一人称下同时非地图图标下生效 |
| ------------------------------------------- | ---------------------------------------------------- | -------------------------------- |
| controller.render.player.first_person_spectator | variable.is_first_person && query.is_spectator | 第一人称且旁观者模式下该渲染控制器生效 |
| controller.render.player.third_person_spectator | !variable.is_first_person && !variable.map_face_icon && query.is_spectator | 非第一人称非地图图标、旁观者模式下生效 |
| controller.render.player.first_person | variable.is_first_person && !query.is_spectator | 第一人称且非旁观者模式下生效 |
| controller.render.player.third_person | !variable.is_first_person && !variable.map_face_icon && !query.is_spectator | 第一人称、非地图图标、非旁观者模式下生效 |
| controller.render.player.map | variable.map_face_icon | 地图图标下生效 |
**其中,以上五个渲染控制器在渲染过程中并不保证顺序。**

View File

@@ -49,10 +49,20 @@ components中可以配置的组件如下
| netease:generator_noise | 空object | | 噪声生成器,用于生成随机凹凸的地面<br>如果没有配置任何生成器,则默认使用该生成器<br>(对三个原生维度无效) |
| netease:generator_flat | 空object | | 超平坦生成器,仅主世界和下界类型可用<br>(对三个原生维度无效) |
| netease:generator_legacy | 空object | | 旧世界/经典(有限地图)生成器,仅主世界类型可用<br>(对三个原生维度无效) |
| netease:ban_vanilla_feature | 空object | | 清除原版feature可解决类似空岛玩法天空悬浮结构问题仅主世界类型维度可用) |
| netease:ban_vanilla_feature | 空object | | 清除原版feature可解决类似空岛玩法天空悬浮结构问题任何维度可用) |
| netease:spawn_biomes | array(string) | 该维度下的forest, forest_hills, plains, taiga, taiga_hills, jungle, jungle_hills | 该维度下可供玩家出生的群系名称的列表<br>请确保列表的群系会生成在该维度 |
| [netease:biome_source](./2-群系地貌.md#8-4.群系源节点类型) | array(dict) | | 该维度下的群系源,仅主世界类型可用<br>(对三个原生维度无效) |
| netease:ban_vanilla_structure | object | 屏蔽所有原版结构 | 选择性屏蔽原版结构,示例见下方,支持主世界、下界、末地维度类型 |
| netease:ban_vanilla_mineshaft | 空object | | 屏蔽废弃矿井 |
| netease:ban_vanilla_monument | 空object | | 屏蔽海底遗迹 |
| netease:ban_vanilla_mansion | 空object | | 屏蔽林地府邸 |
| netease:ban_vanilla_temple | 空object | | 屏蔽神庙 |
| netease:ban_vanilla_pillageroutpost | 空object | | 屏蔽掠夺者前哨 |
| netease:ban_vanilla_ruinedportal | 空object | | 屏蔽破坏的传送门(仅主世界类型维度可用) |
| netease:ban_vanilla_ruins | 空object | | 屏蔽水下遗迹 |
| netease:ban_vanilla_shipwreck | 空object | | 屏蔽沉船 |
| netease:ban_vanilla_stronghold | 空object | | 屏蔽要塞 |
| netease:ban_vanilla_village | 空object | | 屏蔽村庄 |
使用白名单,只允许生成沉船和要塞,其他所有原版结构都不生成,结构名称和[`/locate`](https://learn.microsoft.com/en-us/minecraft/creator/commands/commands/locate?view=minecraft-bedrock-stable#structurefeature)指令中的相同。
@@ -62,6 +72,29 @@ components中可以配置的组件如下
}
```
allowlist里面填写的是原版结构类型并非自定义结构的名称。如需屏蔽自定义结构请填写netease_large_feature。
目前allowlist字段可以填写字段如下
```
"end_city"
"fortress"
"mineshaft"
"monument"
"ruins"
"stronghold"
"temple"
"village"
"mansion"
"shipwreck"
"ruined_portal"
"buried_treasure"
"pillager_outpost"
"bastion_remnant"
"ancient_city"
"trail_ruins"
"trial_chambers"
"netease_large_feature"
```
使用黑名单,除了不生成废弃传送门和海底神殿外,其他原版结构正常生成。
```json

View File

@@ -57,9 +57,8 @@ selection: true
|format_version|str||格式版本请填写0.0.1|
|name|str||指令名称例如gamemode|
|description|str||指令描述也支持在语言文件例如zh_CN.lang中定义|
|permission_level|str|game_directors|权限等级,可选any、game_directors、admin、host、owner具体含义如下<br>any任何人都能运行此命令<br>game_directors任何操作员都可以运行此命令包括命令方块<br>admin任何操作员都可以运行此命令但命令方块不能<br>host任何服务器主机都可以运行此命令<br>owner只有专用服务器可以运行此命令|
|requires_cheats|bool|true|是否需要开启作弊才可使用该指令若设为false需要同时将permission_level设为any|
|permission_level|str|game_directors|权限等级可选game_directors、admin、host、owner、any,具体含义如下<br>game_directors任何操作员都可以运行此命令包括命令方块<br>admin任何操作员都可以运行此命令但命令方块不能<br>host任何服务器主机都可以运行此命令<br>owner只有专用服务器可以运行此命令<br>any任何人都可以运行此命令|
- args是一个包含object的列表定义指令的参数。每个object都代表一个参数object的顺序决定指令参数的输入顺序每个object的参数说明如下
|键|类型|解释|

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,131 @@
---
front: https://nie.res.netease.com/r/pic/20210728/5507b669-4c6f-4958-b5d0-b8556ab4cfb5.png
hard: 进阶
time: 10分钟
---
# ModAPI代码进阶优化
> 本文档介绍了一些高级的ModAPI代码优化技巧帮助开发者们编写更高效的代码。
> 我们将结合一些开发情景,逐一讲解优化流程
## 使用实体Attr实现Molang同步
### 背景说明
在开发过程中假设我们需要给玩家添加创造飞行或鞘翅动画效果。但是翻找wiki却发现原版并没有提供相关的Molang所以我们需要自定义以下两个Molang变量
```
query.mod.ysm_is_create_flying # 是否正在创造飞行
query.mod.ysm_is_elytra_flying # 是否正在鞘翅飞行
```
### 实现方案对比
**不推荐的方案:**
通过tick函数持续获取玩家状态并与客户端通信来设置Molang值
这种方式会导致严重的性能开销,十分的不友好
**推荐的方案:**
结合以下两个关键功能实现:
1. [OnPlayerActionServerEvent](https://mc.163.com/dev/mcmanual/mc-dev/mcdocs/1-ModAPI/事件/玩家.html#onplayeractionserverevent) - 用于监听玩家动作状态
2. [实体自定义属性](https://mc.163.com/dev/mcmanual/mc-dev/mcdocs/1-ModAPI/接口/实体/索引.html?catalog=1#自定义属性) - 实现Molang值的自动同步
### 工作原理
众所周知,当使用服务端的`SetAttr`接口设置属性值后,系统会自动将这些值同步到客户端
在实体Attr文档中我们可以找到一个关键接口`RegisterUpdateFunc`,它用于注册属性值变化时的回调函数
这个机制就是实现实体Molang值自动同步的核心
### Attr同步优点
- 高性能、低功耗的实现方式
- 使用游戏原生发包的Attr通信比直接通信接口更快
- 自动处理可见渲染范围内的同步,无需手动监听`AddPlayerCreatedClientEvent`事件
- 适合在tick内进行多次操作统一更新数据
### 代码实现
##### 服务端代码
```python
# 服务端代码实现
ServerComp = serverApi.GetEngineCompFactory()
class PlayerActionServerSystem(ServerSystem):
def __init__(self, namespace, systemName):
ServerSystem.__init__(self, namespace, systemName)
def OnPlayerActionServerEvent(self, args):
# 玩家动作事件,当玩家开始/停止某些动作时触发该事件
playerId = args["playerId"]
actionType = args["actionType"]
modAttr = ServerComp.CreateModAttr(playerId)
# 使用鞘翅飞行/创造飞行的动作枚举值为(15,16,34,35)
if actionType == 34:
# 开始创造飞行
modAttr.SetAttr("playerIsCreateFlying", 1)
elif actionType == 35:
# 停止创造飞行
modAttr.SetAttr("playerIsCreateFlying", 0)
elif actionType == 15:
# 开始鞘翅飞行
modAttr.SetAttr("playerIsElytraFlying", 1)
elif actionType == 16:
# 停止鞘翅飞行
modAttr.SetAttr("playerIsElytraFlying", 0)
```
##### 客户端代码
```python
# 客户端代码实现
ClientComp = clientApi.GetEngineCompFactory()
levelId = clientApi.GetLevelId()
playerId = clientApi.GetLocalPlayerId()
# 注册自定义Molang变量
ClientComp.CreateQueryVariable(levelId).Register("query.mod.ysm_is_create_flying", 0)
ClientComp.CreateQueryVariable(levelId).Register("query.mod.ysm_is_elytra_flying", 0)
# key为需要监听的attr名称,value为需要设置的对应Molang变量名称
queryDict = {
"playerIsFlying": "query.mod.ysm_is_flying",
"playerIsElytraFlying": "query.mod.ysm_is_elytra_flying"
}
# 根据queryDict自动配置监听,简化代码
def CreateAttrCallBack(bindQuery):
def _eventFuckCallBack(args):
ClientComp.CreateQueryVariable(args["entityId"]).Set(bindQuery, args["newValue"])
return _eventFuckCallBack
class PlayerActionClientSystem(ClientSystem):
def __init__(self, namespace, systemName):
ClientSystem.__init__(self, namespace, systemName)
# 注册本地玩家的属性值变化回调函数
modAttr = ClientComp.CreateModAttr(playerId)
for attr, query in queryDict.items():
ClientComp.CreateModAttr(playerId).RegisterUpdateFunc(attr, CreateAttrCallBack(query))
def OnAddPlayerAOIClient(self, args):
"""玩家加入游戏或进入视野时触发,注册属性值变化回调"""
pId = args["playerId"]
modAttr = ClientComp.CreateModAttr(pId)
for attr, query in queryDict.items():
ClientComp.CreateModAttr(pId).RegisterUpdateFunc(attr, CreateAttrCallBack(query))
```
### 工作流程说明
1. 客户端为本地玩家和其他玩家注册属性值变化的回调函数
2. 服务端通过`OnPlayerActionServerEvent`事件监测玩家的飞行状态
3. 使用`SetAttr`设置属性值,自动同步到客户端
4. 客户端的回调函数被触发更新相应的Molang值
#### 其他性能优化教程,敬请期待...

View File

@@ -0,0 +1,177 @@
---
front: https://nie.res.netease.com/r/pic/20210728/5507b669-4c6f-4958-b5d0-b8556ab4cfb5.png
hard: 进阶
time: 20分钟
---
# 配置文件优化指南
本文介绍了如何优化Python配置文件的内存使用。
## 1. 使用结构优化建筑生成
在建筑生成和放置方面我们推荐使用结构文件而不是Python配置。
### 使用feature\_rules控制建筑生成
参考教程:[自定义特征](../15-自定义游戏内容/4-自定义维度/4-自定义特征.md)
**优点:**
* 无需代码处理,无卡顿效果
* 采用微软原生机制,性能优异
**缺点:**
* feature\_rules文件中的molang表达式不宜过于复杂
* 复杂的表达式可能导致内存占用增加,影响游戏加载速度
### 通过API放置structure
参考API<a href="../../../mcdocs/1-ModAPI/接口/世界/地图.html#placestructure" rel="noopenner">PlaceStructure</a>
**优点:**
* 提供灵活的代码控制能力
* 可实现复杂的生成规则
**缺点:**
* 放置时可能出现短暂卡顿
## 2. 使用方块调色板节约内存
方块调色板可用于保存建筑数据。使用<a href="../../../mcdocs/1-ModAPI/接口/世界/方块组合.html#getblockpalettebetweenpos" rel="noopenner">GetBlockPaletteBetweenPos</a>等接口获取方块调色板后,使用<a href="../../../mcdocs/1-ModAPI/接口/方块/方块调色板.html#serializeblockpalette" rel="noopenner">SerializeBlockPalette</a>将调色板转化成字典后,手动存入配置文件中。
**优点:**
* 方块调色板是高度压缩的字典结构,可最大程度节约内存
* 对应的放置接口<a href="../../../mcdocs/1-ModAPI/接口/世界/方块组合.html#setblockbyblockpalette" rel="noopenner">SetBlockByBlockPalette</a>是原生c++批量放置,性能较好
* 可实现复杂的生成规则
**缺点:**
* 放置时可能出现短暂卡顿
## 3. 使用引用避免重复定义
在配置文件中,应避免重复定义相同的配置项,而是采用引用方式:
* 错误的写法
```python
# 存在大量重复的方块数据定义
building = {
'build_A': {
'size': [0, 1, 2],
'blocks': [
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
],
},
}
```
* 正确的写法
```python
# 定义基础方块数据
AirBlock = {'aux': 0, 'name': 'minecraft:air'}
GrassBlock = {'aux': 0, 'name': 'minecraft:grass'}
StoneBlock = {'aux': 0, 'name': 'minecraft:stone'}
# 通过引用复用方块数据
building = {
'build_A': {
'size': (0, 1, 2),
'blocks': [
AirBlock, AirBlock, StoneBlock, AirBlock, AirBlock,
GrassBlock, AirBlock, GrassBlock, AirBlock, AirBlock, StoneBlock,
],
},
}
```
## 4. 使用元组替代字典
对于只读的配置数据,建议使用元组代替字典,以提高内存使用效率:
* 错误的写法
```python
# 定义基础方块数据
AirBlock = {'aux': 0, 'name': 'minecraft:air'}
GrassBlock = {'aux': 0, 'name': 'minecraft:grass'}
StoneBlock = {'aux': 0, 'name': 'minecraft:stone'}
```
* 正确的写法
```python
# 使用元组存储只读数据,提高内存效率
AirBlock = ('minecraft:air', 0)
GrassBlock = ('minecraft:grass', 0)
StoneBlock = ('minecraft:stone', 0)
```
## 5. 分割配置文件并动态加载
如果你的配置文件已经有几十M的大小建议将配置文件按功能模块分割采用动态加载方式
* 错误的写法
```python
# 一次性导入所有配置
from build import build1, build2, build3
```
* 正确的写法
```python
def load_build_config(data):
building = data['build']
if build == '1':
# 按需导入配置
import build1
place_build(data, build1)
elif build == '2':
# 按需导入配置
import build2
place_build(data, build)
```
## 注意事项
* 建议将一个模块切割得尽量细,并结合前面所述的方法减少单个模块的大小,否则动态加载模块也会带来卡顿。
* 即便使用动态加载,如果玩家将各个类型的建筑都摆放一次,那么所有配置也会被加载进来,大量占用内存。
* 如果想进一步优化可以将配置存储为json文件通过json方式使用和卸载相关接口<a href="../../../mcdocs/1-ModAPI/接口/通用/工具.html#getmodconfigjson" rel="noopenner">GetModConfigJson</a>
* 可以使用`zlib`库压缩数据。
## 优化效果
**优化前内存占用715.32M、优化后占用下降到了224.46M**
优化前的内存占用(使用方块探针工具):
![image](./images/before_optimization.png)
优化后的内存占用(使用方块探针工具):
![image](./images/after_optimization.png)
## 总结
1. 优先使用结构文件/方块调色板存储大型数据
2. 使用类组织相关配置
3. 采用引用而不是重复定义
4. 使用元组存储只读数据
5. 按功能分割配置文件