# Mod 开发BUG解决方案
# 开发打包问题
# SDK包加载不成功
可能的原因如下:
检查SDK包和mod的路径不能在中文路径下面
检查当前存档是否加载过其余mod,清理或者重新创建一份存档
检查mod的uuid是否和别的mod一样,每个mod中的uuid必须唯一
生成uuid的方法:
import uuid uuid.uuid4()
# 加载多个mod,只有一个mod生效
每个mod在注册服务端、客户端的system的时候,是不是system名字一样?如果一样的话只会第一个注册成功的mod生效
检查一下多个mod的uuid是不是一样的(在resource和behavior文件夹的manifest.json里面)
检查一下多个mod中注册的物品、道具、方块、装备等东西的ID是不是有一样的
# 前一个mod卸载后,后一个mod加载不正常
请检查是否调用了UnListenForEvent、UnDefineEvent等清理注册事件的接口。如果没有调用,则mod卸载之后可能内存中还有残留数据,会影响到下一个安装的mod。
# 上传的包含mod玩法的地图,在本地玩都OK,但是在联机大厅玩却是原版的生存地图
上传的地图mod,压缩包下请严格只包含唯一一个一级目录。 比如,下面这样的就是正确的(只有一个一级目录,一级目录下面就是resource和behavior文件夹)
# 上架的地图mod只有地图生效了,mod没生效
请检查打包mod时,设定的modAPI版本号是否正确,是不是由于线上的APP版本已经不支持这个API版本导致mod没生效
请检查一下存档里面的world_behavior_packs.json 和 world_resource_packs.json 的内容,是否与behavior_packs和resource_packs的 manifest.json 的内容一致,只有保持一致,mod才会在地图中加载成功
# 更新了mod资源,下载到的mod还是旧版本
每次更新了mod资源之后,要在mod的behavior和resource文件夹下面,更改 pack_manifest.json 的版本号,比如上个mod的version是[0, 0, 1],那么这次mod的version就要是[0, 0, 2]。地图mod和组件mod如果有更新,都要改version才会触发更新
# 上传MOD,提示打包失败
- 路径过深,目前mod资源最长的路径只能到150个字符,路径深度超过150个字符就会上传失败
- 目录格式不对,一般上传的mod文件,zip文件下面要有唯一一个一级目录,然后在这个目录下面包含behavior和resource文件夹
- mod的behavior文件夹下面的entities文件夹要有一个
__init__.py
文件 - mod的python文件里面有语法错误
- mod里面没有modMain.py
# mod在联机大厅\网络游戏服上运行的时候,手机客户端的部分逻辑无法正常运行
如果开发的mod运行在联机大厅\网络游戏服上面的时候,客户端有一部分逻辑失效了,很有可能是是客户端线程里面import了包含服务端线程内容的模块,导致客户端线程不能正常工作
# 开发打包设置建议
# 1.地图mod server.properties 设置
地图mod请在存档中放置一个server.properties,这样在联机大厅玩这个地图mod,玩家每次进入都是server.properties文件中设置的游戏模式
请使用GetMinecraftEnum(),尽量避免硬编码
# 2.命名规则
namespace、自定义物品名称等尽量命名的独特一点,防止与别的mod冲突
# 3.不要使用中文文件名
mod里面不要有中文或乱码字符命名的文件(behavior文件夹和resource文件夹),否则会导致mod在游戏中加载失败
# 4.脚本编码格式
请在每个python文件的开头, 指定编码格式:# -*- coding: utf-8 -*- -
,否则可能会导致import模块异常
# 开发包断言错误
# 索引
错误码 | 类别 | 简介 | 相关链接 |
---|---|---|---|
1001 | UI | UI控件缺少type字段 | 控件通用属性 |
1002 | UI | UI控件type属性错误 | 控件通用属性 |
1003 | UI | UI控件controls内缺少特定子控件 | 按钮控件 |
2001 | 自定义远程武器 | 自定义远程武器序列帧未找到对应texture | 自定义远程武器 |
2002 | 自定义远程武器 | 自定义远程武器序列帧配置错误 | 自定义远程武器 |
3001 | JSON | JSON文件格式错误 | 1.JSON语法 (opens new window) 2.使用vscode检查JSON格式 |
3002 | JSON | JSON文件内容错误 | MC官方WIKI (opens new window) |
4001 | 自定义配方 | 配置的物品加载失败 | 自定义物品 |
5001 | 自定义物品 | 自定义物品ID错误 | 自定义物品 |
# 1001
# 错误信息
Assertion failed: Type not specified (or @-base not found) for control: (testPanel) in namespace: (limitedRespawnUI) @ UIControlFactory::_createFromResolvedDef Function: UIControlFactory::_createFromResolvedDef in c:\editor\handheld\src-client\common\client\gui\controls\uicontrolfactory.cpp @ 346
# 参数描述
序号 | 参数 | 描述 |
---|---|---|
1 | for control: (testPanel) | UI控件的名称 |
2 | in namespace: (limitedRespawnUI) | UI控件的命名空间namespce |
# 解决方案
检查资源包下的ui文件,可搜索对应的命名空间namespace来定位文件,再通过控件名称来确定出错的控件,如本例出错文件内容如下:
{
"namespace" : "limitedRespawnUI", # 命名空间namespace,可用于搜索
"main" : {
"controls" : [
{
"testPanel@limitedRespawnUI.somePanel" : {} # 控件名称
}
],
"type" : "screen",
...
},
"somePanel" : { # 由于被继承,名称被覆盖,所以并非这个名称
"layer" : 1,
"offset" : [ 0, 0 ],
"size" : [ 100, 100 ],
"visible" : true
# 出错位置,缺少"type"字段,应添加 "type": "panel"
}
}
# 1002
# 错误信息
Assertion failed: Type (wrong) not recognized for control: (testPanel) in namespace: (test) @ UIControlFactory::_createFromResolvedDef Function: UIControlFactory::_createFromResolvedDef in c:\editor\handheld\src-client\common\client\gui\controls\uicontrolfactory.cpp @ 353
# 参数描述
序号 | 参数 | 描述 |
---|---|---|
1 | Type (wrong) | 错误的类型 |
2 | for control: (testPanel) | UI控件的名称 |
3 | in namespace: (test) | UI控件的命名空间namespce |
# 解决方案
检查资源包下的ui文件,可搜索对应的命名空间namespace来定位文件,再通过控件名称来确定出错的控件,如本例出错文件内容如下:
{
"namespace" : "test", # 命名空间namespace,可用于搜索
"main" : {
"controls" : [
{
"testPanel@test.somePanel" : {} # 控件名称
}
],
"type" : "screen",
...
},
"somePanel" : { # 由于被继承,名称被覆盖,所以并非这个名称
"layer" : 1,
"offset" : [ 0, 0 ],
"size" : [ 100, 100 ],
"type" : "wrong", # 出错位置,没有“wrong”类型的基础控件,这里应改为“panel”
"visible" : true
}
}
将上面文件的***wrong***改为***panel***即可。
附:支持的基础控件类型有:button, custom, dropdown, edit_box, factory, grid, image, input_panel, label, panel, screen, scrollbar_box, scroll_track, scroll_view, slider, slider_box, stack_panel, toggle, selection_wheel, combox, layout, joystick, stack_grid, rich_text, mul_lines, sixteen_nine_layout, anim_porecess_bar。
# 1003
# 错误信息
Assertion failed: Control name could not be resolved: (hover) in (testButton), with base type (0) @ UIControl::_resolveControlNames Function: UIControl::_resolveControlNames in c:\editor\handheld\src-client\common\client\gui\controls\uicontrol.cpp @ 1139
# 参数描述
序号 | 参数 | 描述 |
---|---|---|
1 | (hover) | 缺少的子control名称 |
2 | in (testButton) | UI控件名称 |
3 | with base type (0) | UI控件的基本类型 |
# 解决方案
检查资源包下的ui文件,可搜索对应的控件名称来确定出错的控件,如本例出错文件内容如下:
{
"namespace" : "test",
"main@common.base_screen": {
"controls": [
{
"testButton@test.someButton": {} # 控件名称,可用于搜索
}
]
},
"someButton@common.button" : { # 由于被继承,名称被覆盖,所以并非这个名称
"$default_texture" : "textures/ui/a",
"$hover_texture" : "textures/ui/b",
"anchor_from" : "top_left",
"anchor_to" : "top_left",
"controls" : [
{"default" : {"layer" : 2,"texture" : "$default_texture","type" : "image"}},
{"pressed" : {"layer" : 2,"texture" : "$hover_texture","type" : "image"}}
# 出错位置,缺少"hover"的定义
],
"layer" : 1,
"offset" : [ "0%+0px", "0%+0px" ],
"size" : [ "100%+0px", "100%+0px" ],
"visible" : true
}
}
在上述文件出错位置添加{"hover" : {"layer" : 2,"texture" : "$hover_texture","type" : "image"}}即可。
附:UI控件基础类型与对应的数字序号如下表:
序号 | 控件基础类型 | 序号 | 控件基础类型 | 序号 | 控件基础类型 |
---|---|---|---|---|---|
0 | button | 10 | screen | 20 | layout |
1 | custom | 11 | scrollbar_box | 21 | stack_grid |
2 | dropdown | 12 | scroll_track | 22 | joystick |
3 | edit_box | 13 | scroll_view | 23 | rich_text |
4 | factory | 14 | selection_wheel | 24 | sixteen_nine_layout |
5 | grid | 15 | slider | 25 | mul_lines |
6 | image | 16 | slider_box | 26 | anim_porecess_bar |
7 | input_panel | 17 | stack_panel | ||
8 | label | 18 | toggle | ||
9 | panel | 19 | combox |
# 2001
# 错误信息
Assertion failed: Can not find texture (customrangedweapon:bow_frame) in (item_texture.json) for custom item (customrangedweapon:bow) Condition is false: false Function: CustomRangedWeaponItem::initClient in c:\editor\handheld\src-plugins\common\world\item\customrangedweaponitem.cpp @ 72
# 参数描述
序号 | 参数 | 描述 |
---|---|---|
1 | texture (customrangedweapon:bow_frame) | 自定义远程武器的texture_name配置值 |
2 | (item_texture.json) | 图片列表所在文件 |
3 | custom item (customrangedweapon:bow) | 自定义远程武器的identifier |
# 解决方案
检查资源包netease_items_res目录下对应自定义远程武器的json文件中的***texture_name***字段,本例中texture_name为customrangedweapon:bow_frame,json文件内容如下:
{
"format_version": "1.10",
"minecraft:item": {
"description": {
"identifier": "customrangedweapon:bow", # 自定义远程武器的identifier
"category": "Equipment"
},
"components": {
"minecraft:icon": "customrangedweapon:bow",
"netease:frame_animation": {
"frame_count": 4,
"texture_name": "customrangedweapon:bow_frame", # 对应item_texture.json中的命名
"animate_in_toolbar": true
}
}
}
}
检查资源包textures下item_texture.json文件中是否存在***customrangedweapon:bow_frame***的textures定义。本例文件内容如下。
{
"resource_pack_name": "vanilla",
"texture_name": "atlas.items",
"texture_data": {
"customrangedweapon:bow": {
"textures": [
"textures/items/customitems_ranged_weapon_0"
]
},
# 错误位置,需要在此处添加customrangedweapon:bow_frame的textures定义
...
}
}
在上述文件中错误位置添加以下内容即可。
"customrangedweapon:bow_frame": {
"textures": [
"textures/items/customitems_ranged_weapon_0",
"textures/items/customitems_ranged_weapon_1",
"textures/items/customitems_ranged_weapon_2",
"textures/items/customitems_ranged_weapon_3"
]
}
# 2002
# 错误信息
Assertion failed: The frame_count (4) of custom item (customrangedweapon:bow) should be (2) specificed in (item_texture.json) by (customrangedweapon:bow) Condition is false: textureCount >= m_frameCount Function: CustomRangedWeaponItem::initClient in c:\editor\handheld\src\plugins\common\world\item\customrangedweaponitem.cpp @ 71
# 参数描述
序号 | 参数 | 描述 |
---|---|---|
1 | frame_count (4) | 自定义远程武器的frame_count配置值 |
2 | custom item (customrangedweapon:bow) | 自定义远程武器的identifier |
3 | should be (2) | 下述item_texture.json中列出的序列帧图片数量 |
4 | specificed in (item_texture.json) | 图片列表所在文件 |
5 | by (customrangedweapon:bow) | 上述item_texture.json中指定给本自定义远程武器的序列帧id |
# 解决方案
检查资源包netease_items_res目录下对应自定义远程武器的json文件中的***frame_count***字段,本例中frame_count为3,json文件内容如下:
{
"format_version": "1.10",
"minecraft:item": {
"description": {
"identifier": "customrangedweapon:bow", # 自定义远程武器的identifier
"category": "Equipment"
},
"components": {
"minecraft:icon": "customrangedweapon:bow",
"netease:frame_animation": {
"frame_count": 4, # 自定义远程武器的frame_count配置值
"texture_name": "customrangedweapon:bow_frame", # 对应item_texture.json中的命名
"animate_in_toolbar": true
}
}
}
}
检查资源包textures下item_texture.json文件中***customrangedweapon:bow_frame***对应的***textures***数量,本例中该数量为2,文件内容如下。(***customrangedweapon:bow_frame***对应上述自定义远程武器的json文件中***texture_name***字段内容)
{
"resource_pack_name": "vanilla",
"texture_name": "atlas.items",
"texture_data": {
"customrangedweapon:bow_frame": {
"textures": [
"textures/items/customitems_ranged_weapon_0", # 这里只配置了2个texture,与上述frame_count=4不符,导致出错
"textures/items/customitems_ranged_weapon_1"
]
}
}
}
修改第一个文件中的frame_count为2或者在第二个文件中添加两个texture即可修复错误。
# 3001
# 错误信息
Assertion failed: JSON: textures/item_texture.json has an error: * Line 5, Column 25 Syntax error: value, object or array expected.Condition is false: false Function: TextureAtlas::loadMetaFile in c:\game\handheld\src-client\common\client\renderer\texture\textureatlas.cpp @ 583
# 参数描述
序号 | 参数 | 描述 |
---|---|---|
1 | textures/item_texture.json | 存在错误格式的JSON文件 |
2 | Line 5 | 文件中错误所在行 |
3 | Column 25 | 文件中错误所在列 |
# 解决方案
在自己的mod目录下查找上述格式错误的文件,检查其内容是否存在格式错误
附:使用vscode检查JSON文件格式
使用vscode打开对应的json文件,vscode会使用红色波浪线标注出错误位置。
# 3002
# 错误信息
Assertion failed: node parse failed: minecraft:map_color Condition is false: ret Function: JsonUtil::JsonSchemaObjectNode<class JsonUtil::JsonParseState<class JsonUtil::EmptyClass,struct BlockDefinition>,struct BlockDefinition>::_validate in h:\mceditor\branches\editor_1.21_20210121\handheld\src\common\util\jsonutils.h @ 1008
# 参数描述
序号 | 参数 | 描述 |
---|---|---|
1 | minecraft:map_color | 内容错误的字段 |
# 解决方案
在自己的mod目录下搜索上述存在错误内容的字段,检查是否与原生内容中对应字段内容相符。如上述 minecraft:map_color。建议在MC官方WIKI (opens new window)上搜索此关键字获得对应的描述信息。
附:参考MC中的原生内容
使用vscode打开游戏目录下的“data”文件夹,一般使用MC Studio时,会在以下目录存在一个完整的游戏端。
C:\MCStudioDownload\game\MinecraftPE_Netease\1.21.0.119233
其中“1.21.0.119233”为版本号,可能发生变化。因此我们需要使用vscode(或其他支持全局搜索的工具)打开“C:\MCStudioDownload\game\MinecraftPE_Netease\1.21.0.119233\data”目录,全局搜索希望参考的字段,注意:部分字段在这里是找不到的,但实际也能使用,一般以MC官方WIKI (opens new window)为准。
# 4001
# 错误信息
Assertion failed: can not make the recipe, item missing: mymod:item1 Condition is false: false Function: Recipes::_loadIngredientFromJson in h:\mceditor\branches\editor_1.21_20210121\handheld\src\common\world\item\crafting\recipes.cpp @ 984
# 参数描述
序号 | 参数 | 描述 |
---|---|---|
1 | mymod:item1 | 缺少的物品定义 |
# 解决方案
这种错误是未找到对应的物品定义导致的。通常原因有两种:1.配方中填写的id错误;2.对应自定义物品的json文件内容错误,导致未注册成功。第一种情况,可在自己的mod中搜索该名称检查是否正确;如果是自定义物品json文件内容有误,则一般还会弹出自定义物品相关的错误弹窗,再按具体的信息处理即可。
# 5001
# 错误信息
Assertion failed: [custom define item]JSON: netease_items_beh/caomei.json Item identifiers must have a namespace Condition is false: false Function: _loadModItemData::<lambda_acd29d58b6c79a1277582817d332e35f>::operator () in h:\mceditor\branches\editor_1.21_20210121\handheld\src\common\world\item\itemregistry.cpp @ 387
# 参数描述
序号 | 参数 | 描述 |
---|---|---|
1 | netease_items_beh/caomei.json | 存在错误内容的文件 |
# 解决方案
在mod中找到上述错误文件,检查identifier字段是否错误。
例:
{
"format_version": "1.10",
"minecraft:item": {
"description": {
"category": "Construction",
"identifier": "caomei", # 错误位置,缺少命名空间,应该改为mymod:caomei
"register_to_create_menu": true
},
"components": {
"minecraft:max_stack_size": 64
}
}
}
上述文件的"identifier"字段缺少命名空间,命名空间即用“:”隔开的前半段,自行添加即可。(命名空间名可自定义)
← 2.12版本物品id变更 实验性功能 →