Ejemplo n.º 1
0
 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);
 }
Ejemplo n.º 2
0
 /// <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);
     }
 }
Ejemplo n.º 3
0
    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;
    }
Ejemplo n.º 4
0
    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);
        }
    }
Ejemplo n.º 5
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);
        }
    }
Ejemplo n.º 6
0
 bool CheckRelation(CTakeDamageComponent target)
 {
     return(CTeamComponent.GetRelation(teamComponent, target.relationComponent) == Relation.Enemy);
 }
Ejemplo n.º 7
0
 /// <summary>
 /// 预处理攻击游戏
 /// </summary>
 /// <param name="target"></param>
 /// <returns></returns>
 void PreProcessAttack(CTakeDamageComponent target)
 {
     onBeforeAttack.Invoke(target);
     target.OnBeforeUnderAttack(this);
 }