protected override bool OnCreateComponent() { controllerComponent = AddCComponent <CControllerComponent>(); teamComponent = AddCComponent <CTeamComponent>(); m_MovementComponent = AddEntityComponent <MovementComponent>(); m_AnimatorComponent = AddCComponent <CAnimatorComponent>(); propertyComponent = AddCComponent <CPropertyComponent>(); m_AttackComponent = AddCComponent <CAttackComponent>(); createDamageComponent = AddCComponent <CCreateDamageComponent>(); takeDamageComponent = AddCComponent <CTakeDamageComponent>(); return(true); }
/// <summary> /// 生成Damage数据 /// </summary> Damage CreateDamage(DamageData damageData, CTakeDamageComponent target) { if (active && target != null && target.active) { //创建伤害 float damageValue = damageData.GetDamageValue(target); Damage damage = new Damage(damageData.batchOid, damageData.caster, this, target, damageData.damageSource, damageData.damageType, damageValue, damageData.getHitTime, damageData.hitBack, damageData.damageInterval, damageData.mark); return(damage); } else { return(null); } }
public Damage(uint batchOid, IDamageCaster caster, CCreateDamageComponent creator, CTakeDamageComponent receiver, DamageSource source, DamageType type, float damageValue, float getHitTime, float hitBack, float damageInterval, DamageMark mark) { time = Time.time; if (caster == null) { Debug.LogError("caster 不可以为空"); } this.batchOid = batchOid; this.caster = caster; this.creator = creator; this.receiver = receiver; m_SourceDamageValue = damageValue; receiveDamageValue = damageValue; damageType = type; damageSource = source; this.hitBack = hitBack; this.getHitTime = getHitTime; this.damageInterval = damageInterval; if (this.getHitTime <= 0) { this.getHitTime = Config.combat.getHitTime; } if (this.damageInterval <= 0) { this.damageInterval = Config.combat.damageInterval; } damageMark = mark; m_DamageActionMark = DamageResultMark.None; m_Lock = false; }
public float GetDamageValue(CTakeDamageComponent target) { switch (valueType) { case DamageValueType.Point: return(damage); case DamageValueType.MaxHpPercent: return(target.propertyComponent.hpMax * damage); case DamageValueType.CurHpPercent: return(target.propertyComponent.hp * damage); case DamageValueType.Custom: return(getCustomDamageHandle(target)); default: return(0); } }
public bool ApplyDamage(DamageData damageData, CTakeDamageComponent target) { if (!active || target == null) { return(false); } //生成伤害数据 Damage damage = CreateDamage(damageData, target); if (damage != null) { //修改伤害标记 modifyDamageMark.Process(damage); //接收伤害的预处理 if (!target.PreTakeDamage(damage)) { return(false); } //检查敌对关系 if (!Damage.CheckMark(damageData.mark, DamageMark.ForbidCheckRelation) && !CheckRelation(target)) { return(false); } //攻击前检查 if (damageData.damageSource == DamageSource.Attack) { PreProcessAttack(target); } //处理伤害数据 ProcessDamage(damage); //发送伤害数据 target.TakeDamage(damage); return(true); } else { return(false); } }
bool CheckRelation(CTakeDamageComponent target) { return(CTeamComponent.GetRelation(teamComponent, target.relationComponent) == Relation.Enemy); }
/// <summary> /// 预处理攻击游戏 /// </summary> /// <param name="target"></param> /// <returns></returns> void PreProcessAttack(CTakeDamageComponent target) { onBeforeAttack.Invoke(target); target.OnBeforeUnderAttack(this); }