角色数据信息
:::warning{title=概念区分注意}
旧时代Minecraft由于国内外翻译问题,通常将材质、纹理混为一谈,如材质包,实际名称为资源包或纹理包,其中纹理包仅对贴图进行修改调整。
而材质是指渲染层面的material!
:::
| key | 数据类型 | 说明 | 对应标点 |
| Name | str | 角色名字 | - |
| Identifier | str | 角色id,用来绑定相关资产(模型、纹理、动画等) | - |
| RenderMaterial | str | 角色材质(选填) | - |
| DebugRender | bool | 角色是否为调试外观形角色(选填) | - |
| DebugMaterial | str | 角色调试材质,当DebugRender为True时生效(选填) | - |
| RenderControllerList | strlist | 指定角色渲染控制器(选填) | - |
| MaterialsDictListByRenderController | dictlist | 角色材质适配制定角色渲染控制器(选填) | - |
| IsLocked | bool | 角色是否锁定以禁止使用 | - |
| LockedInfo | str | 角色锁定后的弹窗提示消息内容 | - |
| DamageType | str | 角色属性 | - |
| Level | int | 角色品级(1~5) | - |
| Info | str | 角色简介文字 | - |
| CV | str | 角色CV名字 | - |
| AttackTimes | int | 角色普通攻击段数 | - |
| ResetAttackTimer | float | 角色普通攻击后恢复重置攻击次数的时间(似乎已弃用,建议默认填写1.5) | - |
| ModName | str | 角色所在副包的mod名称 | - |
| ClientSystem | str | 角色所在副包的客户端系统实例名称 | - |
| ServerSystem | str | 角色所在副包的服务端系统实例名称 | - |
| IsMainPackPlayerAttack | bool | 是否使用主包的攻击逻辑,若为False,则需要伪继承逻辑函数 | - |
| IsMainPackPlayerSkill | bool | 是否使用主包的技能逻辑,若为False,则需要伪继承逻辑函数 | - |
| IsMainPackPlayerShanBi | bool | 是否使用主包的闪避逻辑,若为False,则需要伪继承逻辑函数 | - |
| IsMainPackPlayerBiShaJi | bool | 是否使用主包的终极技能逻辑,若为False,则需要伪继承逻辑函数 | - |
| IsMainPackPlayerAttackSound | bool | 是否使用主包的攻击音效逻辑 | - |
| IsMainPackAnimationController | bool | 是否使用主包的states动画控制器,若为False,则默认使用名为controller.animation.{Identifier}.states的动画控制器 | - |
| RenderAnimationList | strlist | 额外补充的动画列表 | - |
| RenderAnimationControllerList | strlist | 额外补充的动画控制器列表 | - |
| RenderSoundName | str | 角色待机音效名称 | - |
| RenderAttackSoundName | str | 角色攻击音效名称(已弃用) | - |
| RenderBeAttackedSoundName | str | 角色受击音效名称,当角色所受到的伤害达到最大生命值的10%,将有概率播放 | - |
| AttackDict | dictdict | 角色攻击配置 | - |
| AdvanceItemList | dictlistlist | 角色突破所需材料配置 | - |
| RenderInfoList | dictlist | 角色资料介绍信息 | - |
| 值 | 说明 |
| Dark | 暗 |
| Fire | 火 |
| Ice | 冰 |
| Grass | 草 |
| Light | 电 |
| Physics | 无 |
| Stone | 土 |
| Water | 水 |
| Wind | 风 |
| 名称 | 命名格式 | 示例 | 备注 |
| 角色大小动画 | animation.{RenderId}.scale | animation.ailian.scale | 必要 |
| 角色待机动画 | animation.{RenderId}.idle | animation.ailian.idle | 必要 |
| 第一人称待机动画 | animation.{RenderId}.first_person_idle | animation.ailian.first_person_idle | 必要 |
| 角色走路动画 | animation.{RenderId}.walk | animation.ailian.walk | 必要 |
| 第三人称走路动画 | animation.{RenderId}.third_person_walk | animation.ailian.third_person_walk | 必要 |
| 角色跑步动画 | animation.{RenderId}.sprint | animation.ailian.sprint | 必要 |
| 第三人称跑步动画 | animation.{RenderId}.third_person_sprint | animation.ailian.third_person_sprint | 必要 |
| 角色潜行中动画 | animation.{RenderId}.sneak_idle | animation.ailian.sneak_idle | 必要 |
| 第三人称潜行中动画 | animation.{RenderId}.third_person_sneak_idle | animation.ailian.third_person_sneak_idle | 必要 |
| 角色潜行移动动画 | animation.{RenderId}.sneak | animation.ailian.sneak | 必要 |
| 第三人称潜行移动中动画 | animation.{RenderId}.third_person_sneak | animation.ailian.third_person_sneak | 必要 |
| 角色游泳动画 | animation.{RenderId}.swim | animation.ailian.swim | 必要 |
| 第三人称游泳动画 | animation.{RenderId}.third_person_swim | animation.ailian.third_person_swim | 必要 |
| 角色坠落动画 | animation.{RenderId}.fall | animation.ailian.fall | 必要 |
| 第三人称坠落动画 | animation.{RenderId}.third_person_fall | animation.ailian.third_person_fall | 必要 |
| 角色无武器状态动画 | animation.{RenderId}.no_weapon | animation.ailian.no_weapon | 必要,如果不想用可以设置为空动画 |
| 第三人称无武器状态动画 | animation.{RenderId}.third_person_no_weapon | animation.ailian.third_person_no_weapon | 必要,如果不想用可以设置为空动画 |
| 角色攻击动画 | animation.{RenderId}.attack{attacktime} | animation.ailian.attack1 | 必要,假设配置文件AttackTimes为3,则需要有attack1,attack2,attack3动画 |
| 第三人称攻击动画 | animation.{RenderId}.third_person_attack{attacktime} | animation.ailian.third_person_attack1 | 必要,假设配置文件AttackTimes为3,则需要有attack1,attack2,attack3动画 |
- 角色攻击配置说明
- key为int数字时,表示普通攻击第几次所使用的配置。
- key为skill时,表示技能所使用的配置
- key为bishaji时,表示终极技能所使用的配置
| key | 数据类型 | 说明 | 备注 |
| AttackTimer | float | 攻击所需的时长 | - |
| DamagePercent | float | 造成多少百分比攻击力的伤害 | - |
| DamageTimerList | floatlist | 造成伤害的时间列表 | 需要去BlockBench根据动作填写 |
| ResetTiemr | float | 角色普通攻击后恢复重置攻击次数的时间 | 推荐为1.5 |
| SoundName | str | 角色攻击音效名 | 根据SoundTimerList播放 |
| RenderSoundName | str | 角色攻击说话音效名,50%概率播放 | 根据SoundTimerList播放 |
| SoundTimerList | floatlist | 延迟多少秒音效播放 | |
| Radius | float | 攻击距离 | 最小为3 |
| BetweenAngle | float | 攻击角度 | 0.0~360.0 |
| MotionPercent | floattuple | 攻击位移 | 在造成伤害时玩家会位移,x,y为正时向前 |
| SfxDict | dictlist | 攻击特效列表 | |
| ColdDownTimer | float | 冷却时间 | 仅限于key为skill使用 |
| Energy | int | 所需能量 | 仅限于key为bishaji的使用 |
| Perspective | int | 释放终极技能时摄像机切换的人称 | 仅限于key为bishaji的使用 |
| key | 数据类型 | 说明 | 备注 |
| FaceCamara | bool | 是否面向摄像机 | - |
| SfxId | str | 特效Id | - |
| Offset | tuple | 特效坐标偏移 | 三元数组 |
| Rot | tuple | 特效角度偏移 | 三元数组 |
| Scale | tuple | 特效大小乘积 | 三元数组 |
- 角色突破所需材料配置说明
AdvanceItemList内必须有6个dictlist,表示角色养成中6个突破分别需要的材料
| key | 数据类型 | 说明 | 备注 |
| Id | str | 物品id | - |
| Type | str | 类型 | 直接填写为Item |
| Num | int | 所需数量 | |
- 角色资料介绍信息
dictlist,游戏内会根据RenderInfoList自上而下排序,每个dict的介绍:
| key | 数据类型 | 说明 | 备注 |
| Title | str | 标题 | - |
| Type | str | 类型 | 没有用直接填写为Sound |
| SoundName | str | 播放的音效 | 没有用直接填写为'SoundName' |
| Content | str | 内容 | |
RenderList = [
{
'Name': '鲨鱼妹妹', # 角色名字
'Identifier': 'ailian', # 命名空间固定为GlobalConfig.NameSpace
'RenderMaterial': 'entity_alphatest_netease', # 材质,不填则默认描边模式
'DebugMaterial': 'entity_alphatest_netease', # 调试材质
'RenderControllerList': ['controller.render.al'], # 渲染控制器,为空表示使用默认渲染控制器
# 当RenderControllerList存在,则materials也修改
'MaterialsDictListByRenderController': [
{
'Key': 'al_hs',
'Value': 'dfm_al_hs_leg'
},
{
'Key': 'al_hs_up',
'Value': 'dfm_al_hs_legup'
}
],
'IsLocked': False,
'DebugRender': True,
'LockedInfo': '加班一周,通宵了,实在赶不赢,希望理解,下次开放!',
'DamageType': 'Ice',
'Level': 5,
'Info': '维多家政公司\ncv:魏婴',
'CV': '魏婴',
'AttackTimes': 4,
'ResetAttackTimer': 1.5,
# 这个角色所在的副包实例信息
'ModName': 'ailian',
'ClientSystem': 'ailianClientSystem',
'ServerSystem': 'ailianServerSystem',
# 是否使用主包的逻辑执行,反之直接给到副包Client中执行。因为继承这边很难操作,这样做一个伪继承
'IsMainPackPlayerAttack': False,
'IsMainPackPlayerSkill': False,
'IsMainPackPlayerShanBi': True,
'IsMainPackPlayerBiShaJi': False,
# 是否使用主包攻击音效逻辑,不包含角色音效
'IsMainPackPlayerAttackSound': True,
# 是否使用主包的states动画控制器,为False则默认使用controller.animation.{Identifier}.states,scale和weapon照常
'IsMainPackAnimationController': False,
# 额外补充动画
'RenderAnimationList': [
'newidle',
'skill',
'third_person_skill',
'bishaji',
'third_person_bishaji',
'pose2',
'third_person_pose2',
'super_sprint_start',
'super_sprint_idle',
'super_sprint_stop',
'third_person_super_sprint_start',
'third_person_super_sprint_idle',
'third_person_super_sprint_stop'
],
# 额外补充动画控制器
'RenderAnimationControllerList': [],
# 攻击等数据信息
'RenderSoundName': 'ailian_pose', # 角色待机说话的声音
'RenderAttackSoundName': 'None', # 命中目标的音效,没用
'RenderBeAttackedSoundName': 'None', # 受击音效
'AttackDict': {
# 如果IsMainPackPlayerAttack为False,那么可以自定义一些AttackDict参数来实现攻击的效果
# AttackTimer攻击动画的时间
# DamagePercent 伤害百分比
# DamageTimer伤害处罚的时间
# ResetTimer恢复攻击状态为0的间隔时间
# SoundName攻击音效
# MotionPercent (x, z)位移比例
1: {
'AttackTimer': 0.63,
'DamagePercent': 0.35,
'DamageTimerList': [0.33],
'ResetTimer': 2.00,
'SoundName': 'ailian_dao',
'RenderSoundName': 'ailian_attack2',
'SoundTimerList': [0],
'Radius': 5,
'BetweenAngle': 120.0,
'MotionPercent': (0.35, 0.35),
'SfxDict': []
},
2: {
'AttackTimer': 1,
'DamagePercent': 0.30,
'DamageTimerList': [0.61, 0.71, 0.88, 0.96, 1.04],
'ResetTimer': 2.33,
'SoundName': 'ailian_dao',
'RenderSoundName': 'ailian_attack2',
'SoundTimerList': [0.50],
'Radius': 5,
'BetweenAngle': 120.0,
'MotionPercent': (0.45, 0.45),
'SfxDict': []
},
3: {
'AttackTimer': 1.54,
'DamagePercent': 0.40,
'DamageTimerList': [0.42, 0.46, 0.54, 0.63, 0.71, 0.75, 0.80, 0.92, 1.00, 1.05, 1.10, 1.15, 1.20, 1.25, 1.30],
'ResetTimer': 1.46,
'SoundName': 'ailian_dao3',
'RenderSoundName': 'ailian_attack2',
'SoundTimerList': [0.53],
'Radius': 12.5,
'BetweenAngle': 120.0,
'MotionPercent': (0.2, 0.2),
'SfxDict': []
},
4: {
'AttackTimer': 0.05,
'DamagePercent': 0.00,
'DamageTimerList': [],
'ResetTimer': 0.05,
'SoundName': 'None',
'RenderSoundName': 'None',
'SoundTimerList': [0.33],
'Radius': 8.5,
'BetweenAngle': 60.0,
'MotionPercent': (0, 0),
'SfxDict': []
},
# 本来是这样,但是这个已经是在副包继承了,所以这里参数无意义!
'skill': {
'AttackTimer': 1.5,
'DamagePercent': 0.65,
'DamageTimerList': [1.08],
'ResetTimer': 0.10,
'SoundName': 'ailian_skill',
'RenderSoundName': 'None',
'SoundTimerList': [0.0],
'Radius': 7.0,
'BetweenAngle': 120.0,
'MotionPercent': (2, 2),
'ColdDownTimer': 4,
'SfxDict': [
{
'FaceCamara': False,
'SfxId': 'ailian_attack',
'Offset': (-1, -0.5, 0),
'Rot': (-30, -10, 45),
'Scale': (3.5, 2.5, 2.5)
},
{
'FaceCamara': False,
'SfxId': 'ailian_attack',
'Offset': (0, -0.5, 0),
'Rot': (-100, -10, 45),
'Scale': (3, 3, 3)
},
{
'FaceCamara': False,
'SfxId': 'ailian_attack',
'Offset': (0, -0.5, 0),
'Rot': (-30, 0, 45),
'Scale': (3, 3, 3)
},
{
'FaceCamara': False,
'SfxId': 'ailian_attack',
'Offset': (0, -0.5, 0),
'Rot': (-30, 10, 45),
'Scale': (3, 3, 3)
},
{
'FaceCamara': True,
'SfxId': 'ailian_skill',
'Offset': (-3, 5, 0),
'Rot': (-30, 10, 45),
'Scale': (15, 15, 15)
},
{
'FaceCamara': True,
'SfxId': 'ailian_boom',
'Offset': (-2.9, -0.5, 0),
'Rot': (-30, 10, 45),
'Scale': (3, 3, 3)
},
{
'FaceCamara': True,
'SfxId': 'ailian_boom2',
'Offset': (-2.6, -0.5, 0),
'Rot': (-30, 10, 45),
'Scale': (4, 4, 4)
}
]
},
'bishaji': {
'AttackTimer': 3.0,
'DamagePercent': 3.0,
'Perspective': 1,
'DamageTimerList': [1.00, 1.05, 1.10, 1.15, 1.20, 1.25, 1.30, 1.35, 1.40, 1.45, 1.50, 1.55, 1.60, 1.63],
'ResetTimer': 0.15,
'SoundName': 'ailian_bishaji2',
'RenderSoundName': 'None',
'SoundTimerList': [0.5],
'Radius': 10.0,
'BetweenAngle': 120.0,
'MotionPercent': (0, 0),
'Energy': 20,
'SfxDict': []
}
},
# 角色突破所需材料信息
'AdvanceItemList': [
[
{
'Id': 'bingya',
'Type': 'Item',
'Num': 5
},
{
'Id': 'bingguan',
'Type': 'Item',
'Num': 1
}
],
[
{
'Id': 'bingya',
'Type': 'Item',
'Num': 7
},
{
'Id': 'bingguan',
'Type': 'Item',
'Num': 3
}
],
[
{
'Id': 'bingya',
'Type': 'Item',
'Num': 10
},
{
'Id': 'bingguan',
'Type': 'Item',
'Num': 5
},
{
'Id': 'bingjing',
'Type': 'Item',
'Num': 3
}
],
[
{
'Id': 'bingya',
'Type': 'Item',
'Num': 15
},
{
'Id': 'bingguan',
'Type': 'Item',
'Num': 8
},
{
'Id': 'bingjing',
'Type': 'Item',
'Num': 6
},
{
'Id': 'binghexin',
'Type': 'Item',
'Num': 3
}
],
[
{
'Id': 'bingya',
'Type': 'Item',
'Num': 17
},
{
'Id': 'bingguan',
'Type': 'Item',
'Num': 11
},
{
'Id': 'bingjing',
'Type': 'Item',
'Num': 9
},
{
'Id': 'binghexin',
'Type': 'Item',
'Num': 5
}
],
[
{
'Id': 'bingya',
'Type': 'Item',
'Num': 21
},
{
'Id': 'bingguan',
'Type': 'Item',
'Num': 14
},
{
'Id': 'bingjing',
'Type': 'Item',
'Num': 12
},
{
'Id': 'binghexin',
'Type': 'Item',
'Num': 9
}
]
],
# 资料信息
'RenderInfoList': [
{
'Title': '尚未制作',
'Type': 'Sound',
'SoundName': 'diaolingkulou_attack',
'Content': '受极端天气影响,开发组周五提前下班了'
}
]
}
]