Files
netease-bedrock-wiki/mconline/90-知识库获奖教程/4-SDK实用技巧/5-简化物品信息字典并用于存储.md
2025-08-25 18:36:29 +08:00

62 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 简化物品信息字典并用于存储
> 本篇教程获得第二期知识库优秀教程奖。
>
> 获奖作者MI4C。
开发者可以通过各种事件或接口获取物品信息字典,物品信息字典的介绍可以看[物品信息字典](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/20-%E7%8E%A9%E6%B3%95%E5%BC%80%E5%8F%91/10-%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/1-%E6%88%91%E7%9A%84%E4%B8%96%E7%95%8C%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5.html#%E7%89%A9%E5%93%81%E4%BF%A1%E6%81%AF%E5%AD%97%E5%85%B8)。
在这个字典中包含了普通的信息例如newItemName、count、userData在事件中想要获取userData需要调用GetUserDataInEvent接口旧版本的信息例如itemName远古版本的信息例如itemId、modId、modItemId部分现代事件和接口不会包含远古信息用于接口内部识别物品的信息例如isDiggerItem。
![img](./images/5_0.png)
在实际开发中部分开发者可能会发现物品信息字典中的信息在userData的值中重复出现了这其实是为了方便开发者对物品的部分通用属性进行修改而不用了解和修改userData。其他存在于userData中的信息也可以通过特定接口进行修改例如SetAttackDamageSetItemLayerSetItemTierLevel。
![img](./images/5_1.png)
## 简化物品信息字典
如果要将物品信息进行存储那么这些在userData外的无用信息我们就可以进行剔除只保留关键的信息。
据本人测试仅需保留物品信息字典中的newItemNamenewAuxValuecountuserData即可将物品的信息全部保留下来。
可以通过新建一个字典,并将关键信息拷贝至新字典,即可实现物品信息字典的简化。
## 用于存储
我们可以将物品信息字典存储在非常多的位置例如可以将其存储于另一个物品的userData中可以将其存储于实体或世界的自定义数据ExtraData可以将其储存于方块实体BlockEntityData或TileEntityCustomData甚至可以将其存储于本地配置文件中ConfigData
这些存储虽然方便但是在读取的时候可能会破坏userData中的数据所以这里推荐将物品信息字典转换为字符串再进行存储。
json模块是可以在游戏环境使用的模块之一其中json.dumps可以将python对象转换成json字符串json.loads可以将json字符串转换成python对象。
![img](./images/5_2.png)
## 从已存储的数据中读取
上述已介绍了json模块中的loads方法由于引擎使用的是py2所以我们从json字符串中转出来的python对象还需要将unicode类型转换为str类型。
(这里我们用递归和生成式来对对象进行处理) 。
![img](./images/5_3.png)
## 用简化后的物品信息字典重新生成物品
虽然大部分信息都储存于itemDict的userData中但是 **是否显示在手上** 这个属性却只读取itemDict这一层级的数据所以我们需要下述操作
```python
if itemDict['userData']:
itemDict['showInHand'] = itemDict['userData'].get('display', {}).get('ShowInHand', {}).get('__value__', False)
```
这样使用简化后的物品信息字典,也可以生成正确的物品了。