2.6
This commit is contained in:
@@ -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 | 方块是否为实心方块,影响生物在方块内是否受到窒息伤害|
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||

|
||||
|
||||
我们接下来可以在【关卡编辑器】中,将刚刚创建好的Pig预设拖到场景中,并放置到刚刚用栅栏圈出的区域里,这样它就不会导出乱跑了。
|
||||
我们接下来可以在【关卡编辑器】中,将刚刚创建好的Pig预设拖到场景中,并放置到刚刚用栅栏圈出的区域里,这样它就不会到处乱跑了。
|
||||
|
||||
放置完成后务必记得点击右上角的【保存】按钮,勤保存是一个很好的习惯。
|
||||
|
||||
|
||||
130
docs/mcguide/20-玩法开发/13-模组SDK编程/2-Python脚本开发/102-3.4版本物品id变更.md
Normal file
130
docs/mcguide/20-玩法开发/13-模组SDK编程/2-Python脚本开发/102-3.4版本物品id变更.md
Normal 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 |
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -96,6 +96,7 @@ time: 分钟
|
||||
| cosmetic_head | 骷髅模型/凋零骷髅模型/模型/僵尸模型/龙的模型/爬行者的模型/雕刻南瓜 |
|
||||
| compass | 指南针 |
|
||||
| mushroom_stick | 诡异菌钓竿 |
|
||||
| brush | 刷子 |
|
||||
|
||||
### 2.3 frequency(稀有度)
|
||||
|
||||
|
||||
@@ -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***
|
||||
|
||||
|
||||
@@ -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.0,component的值为一个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 | 物品名称 | 物品的描述信息 |
|
||||
|
||||
334
docs/mcguide/20-玩法开发/15-自定义游戏内容/2-自定义方块/3-特殊方块/11-自定义容器.md
Normal file
334
docs/mcguide/20-玩法开发/15-自定义游戏内容/2-自定义方块/3-特殊方块/11-自定义容器.md
Normal 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为108,ui中如果指定了大于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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -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 | 地图图标下生效 |
|
||||
|
||||
**其中,以上五个渲染控制器在渲染过程中并不保证顺序。**
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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的参数说明如下
|
||||
|
||||
|键|类型|解释|
|
||||
|
||||
BIN
docs/mcguide/20-玩法开发/18-性能优化/images/after_optimization.png
(Stored with Git LFS)
Normal file
BIN
docs/mcguide/20-玩法开发/18-性能优化/images/after_optimization.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
docs/mcguide/20-玩法开发/18-性能优化/images/before_optimization.png
(Stored with Git LFS)
Normal file
BIN
docs/mcguide/20-玩法开发/18-性能优化/images/before_optimization.png
(Stored with Git LFS)
Normal file
Binary file not shown.
131
docs/mcguide/20-玩法开发/18-性能优化/代码进阶优化.md
Normal file
131
docs/mcguide/20-玩法开发/18-性能优化/代码进阶优化.md
Normal 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值
|
||||
|
||||
#### 其他性能优化教程,敬请期待...
|
||||
177
docs/mcguide/20-玩法开发/18-性能优化/配置文件优化.md
Normal file
177
docs/mcguide/20-玩法开发/18-性能优化/配置文件优化.md
Normal 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**
|
||||
|
||||
优化前的内存占用(使用方块探针工具):
|
||||

|
||||
|
||||
优化后的内存占用(使用方块探针工具):
|
||||

|
||||
|
||||
## 总结
|
||||
|
||||
1. 优先使用结构文件/方块调色板存储大型数据
|
||||
2. 使用类组织相关配置
|
||||
3. 采用引用而不是重复定义
|
||||
4. 使用元组存储只读数据
|
||||
5. 按功能分割配置文件
|
||||
Reference in New Issue
Block a user