4 Commits

Author SHA1 Message Date
panFD
44ce6cd30c feat: 添加击晕状态相关功能
1. 新增击晕概率、抗性属性配置与组件字段
2. 实现击晕判定逻辑与视图特效播放
3. 增加击晕时技能CD暂停清零的处理
4. 配置默认击晕持续时间为2秒
2026-06-12 21:34:39 +08:00
panFD
3ea1a4d44c feat(skill/buff): 新增眩晕buff相关资源与预制体
新增了眩晕buff的动画剪辑、动画元数据、眩晕buff预制体以及对应的预制体元数据文件,同时更新了技能图标资源。
2026-06-12 21:28:54 +08:00
panFD
82adaf4069 refactor(hero-config): 调整击退推拉流为穿刺风怒流配置
1. 重命名英雄分类注释和对应英雄描述文本,将击退相关效果替换为穿透、风怒效果
2. 更新英雄绑定的技能ID,移除击退相关的属性配置
3. 同步修改技能注释和描述文本,移除击退相关描述
4. 标记废弃的强化技能为暂未使用
2026-06-12 20:37:13 +08:00
panFD
7aa8a47a65 refactor(hero): 统一角色状态初始化逻辑并调整UI布局
1. 将HeroSpine和HeroViewComp的默认状态从"idle"改为空字符串
2. 替换HeroViewComp中直接调用as.idle()为status_change方法
3. 调整role_controller预制体的UI元素位置和尺寸,适配240宽度布局
2026-06-12 20:28:33 +08:00
19 changed files with 3054 additions and 3848 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,125 @@
[
{
"__type__": "cc.AnimationClip",
"_name": "stun",
"_objFlags": 0,
"__editorExtras__": {
"embeddedPlayerGroups": []
},
"_native": "",
"sample": 20,
"speed": 1,
"wrapMode": 2,
"enableTrsBlending": false,
"_duration": 0.45,
"_hash": 500763545,
"_tracks": [
{
"__id__": 1
}
],
"_exoticAnimation": null,
"_events": [],
"_embeddedPlayers": [],
"_additiveSettings": {
"__id__": 7
},
"_auxiliaryCurveEntries": []
},
{
"__type__": "cc.animation.ObjectTrack",
"_binding": {
"__type__": "cc.animation.TrackBinding",
"path": {
"__id__": 2
},
"proxy": null
},
"_channel": {
"__id__": 5
}
},
{
"__type__": "cc.animation.TrackPath",
"_paths": [
{
"__id__": 3
},
{
"__id__": 4
},
"spriteFrame"
]
},
{
"__type__": "cc.animation.HierarchyPath",
"path": "skill"
},
{
"__type__": "cc.animation.ComponentPath",
"component": "cc.Sprite"
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 6
}
},
{
"__type__": "cc.ObjectCurve",
"_times": [
0,
0.05,
0.1,
0.15,
0.2,
0.25,
0.3,
0.35,
0.4
],
"_values": [
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@1069b",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@5e490",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@33f1e",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@71255",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@4a25e",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@9eaf3",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@3f6a9",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@bf2fe",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@eab68",
"__expectedType__": "cc.SpriteFrame"
}
]
},
{
"__type__": "cc.AnimationClipAdditiveSettings",
"enabled": false,
"refClip": null
}
]

View File

@@ -0,0 +1,13 @@
{
"ver": "2.0.3",
"importer": "animation-clip",
"imported": true,
"uuid": "f069198d-2c19-4ebc-bd5f-66a3138b914f",
"files": [
".cconb"
],
"subMetas": {},
"userData": {
"name": "stun"
}
}

View File

@@ -0,0 +1,274 @@
[
{
"__type__": "cc.Prefab",
"_name": "stun",
"_objFlags": 0,
"__editorExtras__": {},
"_native": "",
"data": {
"__id__": 1
},
"optimizationPolicy": 0,
"persistent": false
},
{
"__type__": "cc.Node",
"_name": "stun",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": null,
"_children": [
{
"__id__": 2
}
],
"_active": true,
"_components": [
{
"__id__": 8
},
{
"__id__": 10
}
],
"_prefab": {
"__id__": 12
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_lrot": {
"__type__": "cc.Quat",
"x": 0,
"y": 0,
"z": 0,
"w": 1
},
"_lscale": {
"__type__": "cc.Vec3",
"x": 1,
"y": 1,
"z": 1
},
"_mobility": 0,
"_layer": 1,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.Node",
"_name": "skill",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": {
"__id__": 1
},
"_children": [],
"_active": true,
"_components": [
{
"__id__": 3
},
{
"__id__": 5
}
],
"_prefab": {
"__id__": 7
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 0,
"y": 85,
"z": 0
},
"_lrot": {
"__type__": "cc.Quat",
"x": 0,
"y": 0,
"z": 0,
"w": 1
},
"_lscale": {
"__type__": "cc.Vec3",
"x": 1,
"y": 0.8,
"z": 1
},
"_mobility": 0,
"_layer": 1,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 2
},
"_enabled": true,
"__prefab": {
"__id__": 4
},
"_contentSize": {
"__type__": "cc.Size",
"width": 113,
"height": 50
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "b4sNQPJWFKha7x75SWXmRj"
},
{
"__type__": "cc.Sprite",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 2
},
"_enabled": true,
"__prefab": {
"__id__": 6
},
"_customMaterial": null,
"_srcBlendFactor": 2,
"_dstBlendFactor": 4,
"_color": {
"__type__": "cc.Color",
"r": 255,
"g": 255,
"b": 255,
"a": 206
},
"_spriteFrame": {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@1069b",
"__expectedType__": "cc.SpriteFrame"
},
"_type": 1,
"_fillType": 1,
"_sizeMode": 1,
"_fillCenter": {
"__type__": "cc.Vec2",
"x": 0,
"y": 0
},
"_fillStart": 0.2,
"_fillRange": 1,
"_isTrimmedMode": true,
"_useGrayscale": false,
"_atlas": {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6",
"__expectedType__": "cc.SpriteAtlas"
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "9a+65VIghBm4HQxuHPQ/mg"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "7a5LvbdlxEc6FKa7cun2oB",
"instance": null,
"targetOverrides": null,
"nestedPrefabInstanceRoots": null
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 9
},
"_contentSize": {
"__type__": "cc.Size",
"width": 80,
"height": 110
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "63NP9yq3hEUKD/OZZZ5t7x"
},
{
"__type__": "cc.Animation",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 11
},
"playOnLoad": true,
"_clips": [
{
"__uuid__": "f069198d-2c19-4ebc-bd5f-66a3138b914f",
"__expectedType__": "cc.AnimationClip"
}
],
"_defaultClip": {
"__uuid__": "f069198d-2c19-4ebc-bd5f-66a3138b914f",
"__expectedType__": "cc.AnimationClip"
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "c6LOemuvJKyYCqlF/yUJcr"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "c46/YsCPVOJYA4mWEpNYRx",
"instance": null,
"targetOverrides": null
}
]

View File

@@ -0,0 +1,13 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "c0e8071a-4bba-45fe-b712-751274ce67d8",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "stun"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 783 KiB

After

Width:  |  Height:  |  Size: 121 KiB

View File

@@ -1386,7 +1386,7 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": -180,
"x": -240,
"y": 0,
"z": 0
},
@@ -1785,7 +1785,7 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 180,
"width": 240,
"height": 110
},
"_anchorPoint": {
@@ -2387,7 +2387,7 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 180,
"width": 240,
"height": 110
},
"_anchorPoint": {
@@ -2910,7 +2910,7 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 180,
"width": 240,
"height": 110
},
"_anchorPoint": {
@@ -3509,7 +3509,7 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 180,
"width": 240,
"height": 110
},
"_anchorPoint": {
@@ -4764,7 +4764,7 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 180,
"x": 240,
"y": 0,
"z": 0
},
@@ -5163,7 +5163,7 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 180,
"width": 240,
"height": 110
},
"_anchorPoint": {
@@ -5765,7 +5765,7 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 180,
"width": 240,
"height": 110
},
"_anchorPoint": {
@@ -9317,7 +9317,7 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 540,
"width": 720,
"height": 200
},
"_anchorPoint": {
@@ -9345,8 +9345,8 @@
},
"_alignFlags": 44,
"_target": null,
"_left": 90,
"_right": 90,
"_left": 0,
"_right": 0,
"_top": 0,
"_bottom": -2,
"_horizontalCenter": 0,

View File

@@ -35,6 +35,7 @@ export enum FightSet {
FiIGHT_TIME = 30,//战斗时间
// BACK_CHANCE=40,//击退概率
FROST_TIME = 3,//冰冻时间
STUN_TIME = 2,//击晕时间
SKILL_CAST_DELAY = 0.15,
CSKILL_START_X = -340,
CSKILL_START_Y = 30,

View File

@@ -29,6 +29,8 @@ export enum Attrs {
// ==================== 特殊效果属性 ====================
freeze_chance = "freeze_chance", // 冰冻概率
freeze_res = "freeze_res", // 冰冻抗性
stun_chance = "stun_chance", // 击晕概率
stun_res = "stun_res", // 击晕抗性
knockback_chance = "knockback_chance", // 击退概率
knockback_distance = "knockback_distance", // 击退距离强化
knockback_res = "knockback_res", // 击退抗性

View File

@@ -189,7 +189,7 @@ export const SkillUpList = {
/******
*
* 射箭类技能 带暴击属性
* 火法技能 带击退属性
* 火法技能
* 冰法技能 带冰冻属性
*
*/
@@ -213,18 +213,18 @@ export const SkillSet: Record<number, SkillConfig> = {
6004: {
uuid: 6004, name: "光箭绿", sp_name: "atk_c3", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
RType: RType.bezier, EType: EType.collision, info: "一定几率击退目标",
RType: RType.bezier, EType: EType.collision, info: "普通远程攻击",
},
//怪物战士类型统一使用 6005
6005: {
uuid: 6005, name: "光箭深红", sp_name: "atk_c4", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
RType: RType.bezier, EType: EType.collision, info: "一定几率击退目标",
RType: RType.bezier, EType: EType.collision, info: "普通远程攻击",
},
6006: {
uuid: 6006, name: "光箭灰白", sp_name: "atk_c5", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
RType: RType.bezier, EType: EType.collision, info: "一定几率击退目标",
RType: RType.bezier, EType: EType.collision, info: "普通远程攻击",
},
6007: {
uuid: 6007, name: "水球", sp_name: "ball_water", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
@@ -255,7 +255,7 @@ export const SkillSet: Record<number, SkillConfig> = {
6102: {
uuid: 6102, name: "龙卷风", sp_name: "ball_winds", icon: "1126", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害,一定几率击退目标,高阶技能",
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害,高阶技能",
},
//怪物法师统一使用 暗影球
6103: {
@@ -276,7 +276,7 @@ export const SkillSet: Record<number, SkillConfig> = {
6106: {
uuid: 6106, name: "冰推", sp_name: "ice_t", icon: "1173", TGroup: TGroup.Enemy, readyAnm: "blues", endAnm: "", act: "max",
DTType: DTType.range, frz: 0, ap: 150, hit_count: 6, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
RType: RType.fixed, EType: EType.animationEnd, info: "召唤冰墙阻挡敌人,有概率冰冻,100%击退",
RType: RType.fixed, EType: EType.animationEnd, info: "召唤冰墙阻挡敌人,有概率冰冻",
},
6107: {
uuid: 6107, name: "陨石", sp_name: "fire_yuns", icon: "1173", TGroup: TGroup.Enemy, readyAnm: "reds", endAnm: "", act: "max",
@@ -329,12 +329,12 @@ export const SkillSet: Record<number, SkillConfig> = {
6406: {
uuid: 6406, name: "击退强化", sp_name: "buff_wind", icon: "1255", TGroup: TGroup.Team, readyAnm: "up_blue", endAnm: "", act: "atk",
DTType: DTType.single, kind: SkillKind.Support, ap: 1, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.support,
RType: RType.fixed, EType: EType.animationEnd, buff_type: Attrs.knockback_chance, info: "全体友方击退概率提升10%持续1次",
RType: RType.fixed, EType: EType.animationEnd, info: "暂未使用",
},
6407: {
uuid: 6407, name: "距推强化", sp_name: "buff_wind", icon: "1255", TGroup: TGroup.Team, readyAnm: "up_blue", endAnm: "", act: "atk",
DTType: DTType.single, kind: SkillKind.Support, ap: 1, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.support,
RType: RType.fixed, EType: EType.animationEnd, buff_type: Attrs.knockback_distance, info: "全体友方击退距离提升20点持续1次",
RType: RType.fixed, EType: EType.animationEnd, info: "暂未使用",
},
6408: {
uuid: 6408, name: "穿刺强化", sp_name: "buff_wind", icon: "1255", TGroup: TGroup.Team, readyAnm: "up_ap", endAnm: "", act: "atk",

View File

@@ -335,28 +335,28 @@ export const HeroInfo: Record<number, heroInfo> = {
// ========== 击退推拉流 ==========
// ========== 穿刺风怒流 ==========
5209:{uuid:5209,name:"风弓手",path:"ha2", fac:FacSet.HERO,pool_lv:1,lv:1,type:HType.Long,
hp:140,ap:45,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Fast3].cd,ccd:0}},
atking:[{s_uuid:6406,t_num:2}],
info:"快速射击每2次攻击为全队叠加击退概率"},
atking:[{s_uuid:6408,t_num:2}],
info:"快速射击每2次攻击为全队叠加穿透概率"},
5210:{uuid:5210,name:"龙卷猎手",path:"ha3", fac:FacSet.HERO,pool_lv:2,lv:1,type:HType.Long,
hp:170,ap:70,
skills:{6005:{uuid:6005,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Normal2].cd,ccd:0}},
atking:[{s_uuid:6102,t_num:2,overrides:{bck:30,hit_count:3}}],
info:"每2次攻击释放龙卷风30%击退概率推开一排敌人"},
atking:[{s_uuid:6102,t_num:2,overrides:{hit_count:3}}],
info:"每2次攻击释放龙卷风攻击一排敌人"},
5404:{uuid:5404,name:"风暴刺客",path:"hc2", fac:FacSet.HERO,pool_lv:4,lv:1,type:HType.Melee,
hp:250,ap:100,
skills:{6001:{uuid:6001,lv:1,cd:AtkSpeedSet[AtkSpeedLv.Fast2].cd,ccd:0}},
atking:[
{s_uuid:6407,t_num:1},
{s_uuid:6102,t_num:3,overrides:{bck:50,hit_count:5,ap:120}}
{s_uuid:6409,t_num:1},
{s_uuid:6102,t_num:3,overrides:{hit_count:5,ap:120}}
],
dead:[{s_uuid:6406,t_num:1}],
info:"极速近战,每次攻击给全队加击退距离每3次攻击释放龙卷风死后全队永久击退率加成"},
dead:[{s_uuid:6408,t_num:1}],
info:"极速近战,每次攻击给全队加风怒次数每3次攻击释放龙卷风死后全队永久穿透率加成"},
// ========== 暴击爆发流 ==========
5211:{uuid:5211,name:"猎鹰射手",path:"ha4", fac:FacSet.HERO,pool_lv:1,lv:1,type:HType.Long,
@@ -496,7 +496,7 @@ export const HeroList: number[] = [
5101, 5106, 5107, 5108,
// 治疗续航流
5301, 5302, 5303, 5304, 5305,
// 击退推拉
// 穿刺风怒
5209, 5210, 5404,
// 暴击爆发流
5211, 5212, 5405,

View File

@@ -184,17 +184,31 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
const freezeChance = (damageEvent.Attrs[Attrs.freeze_chance] || 0) - (TAttrsComp.freeze_res || 0);
const isFrost = !TAttrsComp.isFrost() && this.checkChance(freezeChance);
// 击晕判定
const stunChance = (damageEvent.Attrs[Attrs.stun_chance] || 0) - (TAttrsComp.stun_res || 0);
const isStun = !TAttrsComp.isStun() && this.checkChance(stunChance);
// 击退判定
const knockbackChance = (damageEvent.Attrs[Attrs.knockback_chance] || 0) - (TAttrsComp.knockback_res || 0);
const isKnockback = this.checkChance(knockbackChance);
// ✅ 触发视图层表现(伤害数字、受击动画、冰冻、击退)
// ✅ 触发视图层表现(伤害数字、受击动画、冰冻、击晕、击退)
if (targetView) {
targetView.do_atked(damage, isCrit, damageEvent.s_uuid, false);
targetView.playEnd(skillConf.endAnm);
if (isFrost) {
TAttrsComp.toFrost();
targetView.in_iced(TAttrsComp.frost_end_time);
if (damageEvent.Attrs.fac === FacSet.HERO) {
smc.vmdata.scores.freeze_count++;
}
}
if (isStun) {
TAttrsComp.toStun();
targetView.in_stun(TAttrsComp.stun_end_time);
if (damageEvent.Attrs.fac === FacSet.HERO) {
smc.vmdata.scores.stun_count++;
}
}
if (isKnockback) {
targetView.back(damageEvent.Attrs[Attrs.knockback_distance] || 0);

View File

@@ -49,6 +49,8 @@ export class HeroAttrsComp extends ecs.Comp {
critical_res: number = 0; // 暴击抗性
freeze_chance: number = 0; // 冰冻概率
freeze_res: number = 0; // 冰冻抗性
stun_chance: number = 0; // 击晕概率
stun_res: number = 0; // 击晕抗性
knockback_chance: number = 0; // 击退概率
knockback_distance: number = 0; // 击退距离强化
knockback_res: number = 0; // 击退抗性
@@ -61,6 +63,7 @@ export class HeroAttrsComp extends ecs.Comp {
frost_end_time: number = 0;
stun_end_time: number = 0;
boom: boolean = false; // 自爆怪
@@ -100,6 +103,7 @@ export class HeroAttrsComp extends ecs.Comp {
*/
initAttrs() {
this.frost_end_time = 0;
this.stun_end_time = 0;
}
/*******************基础属性管理********************/
@@ -163,10 +167,34 @@ export class HeroAttrsComp extends ecs.Comp {
this.frost_end_time = Math.max(this.frost_end_time, frostTime);
}
toStun(time: number=1) {
const stunTime = FightSet.STUN_TIME * time;
this.stun_end_time = Math.max(this.stun_end_time, stunTime);
// 击晕时 CD 清零
for (const key in this.skills) {
const skill = this.skills[key];
if (skill) {
skill.ccd = 0;
}
}
}
updateCD(dt: number){
// 如果处于冰冻状态,则技能 CD 暂停刷新
if (this.isFrost()) return;
// 如果处于击晕状态,则技能 CD 暂停刷新(且保持清零状态)
if (this.isStun()) {
for (const key in this.skills) {
const skill = this.skills[key];
if (skill) {
skill.ccd = 0;
}
}
return;
}
for (const key in this.skills) {
const skill = this.skills[key];
if (!skill) continue;
@@ -185,6 +213,9 @@ export class HeroAttrsComp extends ecs.Comp {
isFrost(): boolean {
return this.frost_end_time > 0
}
isStun(): boolean {
return this.stun_end_time > 0
}
getSkillLevel(skillId: number): number {
if (!skillId) return 0;
return this.skills[skillId]?.lv ?? 0;
@@ -352,6 +383,8 @@ export class HeroAttrsComp extends ecs.Comp {
this.critical_res = 0;
this.freeze_chance = 0;
this.freeze_res = 0;
this.stun_chance = 0;
this.stun_res = 0;
this.knockback_chance = 0;
this.knockback_distance = 0;
this.knockback_res = 0;
@@ -363,6 +396,7 @@ export class HeroAttrsComp extends ecs.Comp {
this.boom = false;
this.frost_end_time = 0;
this.stun_end_time = 0;
// 重置技能距离缓存
this.maxSkillDistance = 0;
@@ -406,7 +440,12 @@ export class HeroBuffSystem extends ecs.ComblockSystem implements ecs.ISystemUpd
attrsComp.frost_end_time = 0;
}
}
if(attrsComp.stun_end_time > 0){
attrsComp.stun_end_time -= 0.1;
if(attrsComp.stun_end_time <= 0){
attrsComp.stun_end_time = 0;
}
}
}
void e;
}

View File

@@ -8,7 +8,7 @@ export class HeroSpine extends Component {
@property(HeroAnmComp)
anm: HeroAnmComp = null;
status:string="idle";
status:string="";
onLoad() {
// 角色控制组件

View File

@@ -31,7 +31,7 @@ export class HeroViewComp extends CCComp {
// ==================== View 层属性(表现相关)====================
as: HeroSpine = null!
status:String = "idle"
status:String = ""
scale: number = 1; // 显示方向
box_group:number = BoxSet.HERO; // 碰撞组
realDeadTime:number=0.1
@@ -104,10 +104,10 @@ export class HeroViewComp extends CCComp {
/** 初始化/重置视图状态 */
init() {
this.status = "idle";
this.status = "";
this.deadCD = 0;
this.lastBarUpdateTime = 0;
this.as.idle()
this.status_change("idle");
// 初始化 UI 节点
this.initUINodes();
@@ -308,6 +308,11 @@ export class HeroViewComp extends CCComp {
this.spawnTimedFx("game/skill/buff/iced", this.node, t);
}
/** 击晕特效 */
in_stun(t: number = 1) {
this.spawnTimedFx("game/skill/buff/stun", this.node, t);
}
/** 技能提示 */
private tooltip(type: number = 1, value: string = "", s_uuid: number = 1001, y: number = 50) {
let pos = v3(0, 60);

View File

@@ -110,6 +110,7 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
mockAttrs.ap = highestAp;
mockAttrs.critical = 0;
mockAttrs.freeze_chance = 0;
mockAttrs.stun_chance = 0;
mockAttrs.puncture_chance = 0;
mockAttrs.fac = FacSet.HERO;
mockAttrs.type = HType.Long; // 假定为远程,拥有较长索敌范围

View File

@@ -212,6 +212,7 @@ export class Skill extends ecs.Entity {
sDataCom.Attrs[Attrs.critical] = cAttrsComp.getRuntimeCritical() + sCrt;
sDataCom.Attrs[Attrs.critical_damage] = cAttrsComp.getRuntimeCritDamageBonus();
sDataCom.Attrs[Attrs.freeze_chance] = cAttrsComp.getRuntimeFreezeChance() + sFrz;
sDataCom.Attrs[Attrs.stun_chance] = cAttrsComp.stun_chance || 0;
sDataCom.Attrs[Attrs.knockback_chance] = cAttrsComp.knockback_chance || 0;
sDataCom.Attrs[Attrs.knockback_distance] = cAttrsComp.knockback_distance || 0;
sDataCom.Attrs[Attrs.puncture_chance] = cAttrsComp.getRuntimePunctureChance(); // 初始化携带施法者的穿透概率