@@ -101,14 +101,14 @@ export class Skill extends ecs.Entity {
this . addComponents < SMoveDataComp > ( SMoveDataComp ) ;
}
load ( startPos : Vec3 , parent : Node , s_uuid : number , targetPos : Vec3 ,
caster :HeroViewComp , cAttrsComp :HeroAttrsComp , skill_lv :number = 0 , ext_dmg :number = 0 , overrides? : SkillOverrides ) {
caster : HeroViewComp , cAttrsComp : HeroAttrsComp , skill_lv : number = 0 , ext_dmg : number = 0 , overrides? : SkillOverrides ) {
let config = SkillSet [ s_uuid ] ;
if ( ! config ) {
mLogger . error ( this . debugMode , 'Skill' , "[Skill] 技能配置不存在:" , s_uuid ) ;
return ;
}
config = mergeSkillParams ( config , overrides ) ;
const path = ` game/skill/atk/ ${ config . sp_name } ` ;
const initSkillNode = ( prefab : Prefab ) = > {
const node : Node = Skill . getFromPool ( path ) || instantiate ( prefab ) ;
@@ -119,7 +119,7 @@ export class Skill extends ecs.Entity {
this . prefabPath = path ;
this . skillNode = node ;
let skillParent : Node | null = null ;
if ( smc . map && smc . map . MapView && smc . map . MapView . scene && smc . map . MapView . scene . entityLayer && smc . map . MapView . scene . entityLayer . node ) {
skillParent = smc . map . MapView . scene . entityLayer . node . getChildByName ( "SKILL" ) ;
@@ -127,18 +127,18 @@ export class Skill extends ecs.Entity {
if ( ! skillParent || ! skillParent . isValid ) {
skillParent = parent ;
}
if ( ! skillParent || ! skillParent . isValid ) {
mLogger . error ( this . debugMode , 'Skill' , "[Skill] 父节点无效" ) ;
if ( node . isValid ) node . destroy ( ) ;
return ;
mLogger . error ( this . debugMode , 'Skill' , "[Skill] 父节点无效" ) ;
if ( node . isValid ) node . destroy ( ) ;
return ;
}
node . parent = skillParent ;
node . active = true ;
// 设置节点属性
let face = caster . node . scale . x < 0 ? - 1 : 1
node . setScale ( v3 ( Math . abs ( node . scale . x ) * face , node . scale . y , 1 ) )
let face = caster . node . scale . x < 0 ? - 1 : 1
node . setScale ( v3 ( Math . abs ( node . scale . x ) * face , node . scale . y , 1 ) )
// 初始视图
const SView = node . getComponent ( SkillView ) ;
if ( ! SView ) {
@@ -146,21 +146,21 @@ export class Skill extends ecs.Entity {
if ( node . isValid ) node . destroy ( ) ;
return ;
}
if ( config . EType != EType . collision ) {
const collider = node . getComponent ( BoxCollider2D ) ;
if ( collider ) {
collider . enabled = false
if ( config . EType != EType . collision ) {
const collider = node . getComponent ( BoxCollider2D ) ;
if ( collider ) {
collider . enabled = false
}
}
// 只设置必要的运行时属性,配置信息通过 SkillSet[uuid] 访问
// 核心标识
SView . s_uuid = s_uuid
SView . group = caster . box_group
// 核心标识
SView . s_uuid = s_uuid
SView . group = caster . box_group
this . add ( SView ) ;
startPos . x = startPos . x + SView . atk_x * face
startPos . y = startPos . y + SView . atk_y
startPos . x = startPos . x + SView . atk_x * face
startPos . y = startPos . y + SView . atk_y
node . setPosition ( startPos ) ;
@@ -179,7 +179,7 @@ export class Skill extends ecs.Entity {
sMoveCom . bezierStartHeight = config . bezier_start_y ? ? sMoveCom . bezierStartHeight ;
sMoveCom . bezierMidHeight = config . bezier_mid_y ? ? sMoveCom . bezierMidHeight ;
sMoveCom . bezierArc = config . bezier_arc ? ? sMoveCom . bezierArc ;
// 从SkillView获取移动参数, 位置初始化由SMoveSystem统一处理
// 从SkillView获取移动参数, 位置初始化由SMoveSystem统一处理
sMoveCom . atk_x = SView . atk_x ;
sMoveCom . atk_y = SView . atk_y ;
@@ -199,30 +199,31 @@ export class Skill extends ecs.Entity {
if ( ! sDataCom ) {
sDataCom = this . add ( SDataCom ) ;
}
sDataCom . reset ( ) ;
sDataCom . group = caster . box_group
sDataCom . casterEid = caster . ent . eid
sDataCom . reset ( ) ;
sDataCom . group = caster . box_group
sDataCom . casterEid = caster . ent . eid
sDataCom . Attrs = { } ;
const SUp = SkillUpList [ s_uuid ] ? SkillUpList [ s_uuid ] : SkillUpList [ 1001 ] ;
const sCrt = ( config . crt ? ? 0 ) + ( SUp . crt * skill_lv ) ;
const sFrz = ( config . frz ? ? 0 ) + ( SUp . frz * skill_lv ) ;
const sStun = ( config . stun ? ? 0 ) + ( SUp . stun * skill_lv ) ;
const sAp = config . ap + ( SUp . ap * skill_lv ) ;
const sHit = config . hit_count + ( SUp . hit_count * skill_lv ) ;
sDataCom . Attrs [ Attrs . ap ] = Math . floor ( cAttrsComp . ap * sAp / 100 ) ; //技能的ap是百分值 需要/100 而且需要再最终计算总ap时再/100, 不然会出现ap为90%变0
const SUp = SkillUpList [ s_uuid ] ? SkillUpList [ s_uuid ] : SkillUpList [ 1001 ] ;
const sCrt = ( config . crt ? ? 0 ) + ( SUp . crt * skill_lv ) ;
const sFrz = ( config . frz ? ? 0 ) + ( SUp . frz * skill_lv ) ;
const sStun = ( config . stun ? ? 0 ) + ( SUp . stun * skill_lv ) ;
const sBck = ( config . bck ? ? 0 ) + ( SUp . bck * skill_lv ) ;
const sAp = config . ap + ( SUp . ap * skill_lv ) ;
const sHit = config . hit_count + ( SUp . hit_count * skill_lv ) ;
sDataCom . Attrs [ Attrs . ap ] = Math . floor ( cAttrsComp . ap * sAp / 100 ) ; //技能的ap是百分值 需要/100 而且需要再最终计算总ap时再/100, 不然会出现ap为90%变0
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 . getRuntimeStunChance ( ) + sStun ;
sDataCom . Attrs [ Attrs . knockback_chance ] = cAttrsComp . knockback_chance || 0 ;
sDataCom . Attrs [ Attrs . knockback_chance ] = cAttrsComp . knockback_chance + sBck ;
sDataCom . Attrs [ Attrs . knockback_distance ] = cAttrsComp . knockback_distance || 0 ;
sDataCom . Attrs [ Attrs . puncture_chance ] = cAttrsComp . getRuntimePunctureChance ( ) ; // 初始化携带施法者的穿透概率
sDataCom . s_uuid = s_uuid
sDataCom . s_uuid = s_uuid
sDataCom . skill_lv = Math . max ( 0 , skill_lv ) ;
sDataCom . fac = cAttrsComp . fac
sDataCom . ext_dmg = ext_dmg
sDataCom . fac = cAttrsComp . fac
sDataCom . ext_dmg = ext_dmg
sDataCom . hit_count = 0
sDataCom . max_hit_count = Math . max ( 1 , sHit )
sDataCom . max_hit_count = Math . max ( 1 , sHit )
SView . init ( ) ;
} ;
@@ -248,10 +249,10 @@ export class Skill extends ecs.Entity {
this . remove ( SDataCom ) ;
this . remove ( SMoveDataComp )
this . remove ( StimeDataComp )
// 移除组件会触发 reset, 但我们在 reset 中移除了 destroy
this . remove ( SkillView )
// 回收节点到对象池
if ( this . skillNode && this . skillNode . isValid && this . prefabPath ) {
Skill . putToPool ( this . prefabPath , this . skillNode ) ;