示例#1
0
 public void NotifyApplyEffect(DE_Effect effectDe, short animId, E_Unit caster, E_Unit target)
 {
     if (target.m_IsDead)
     {
         return;
     }
     m_effectStage.InitWithCasterAndTarget(effectDe, animId, caster, target);
     // Client
     m_networkService.SendServerCommand(SC_ApplyAllEffect.Instance(
                                            EM_Sight.s_instance.GetInSightCharacterNetworkId(target.m_networkId, true),
                                            target.m_networkId,
                                            m_effectStage.GetNo()));
     // 若命中
     if (m_effectStage.m_hit)
     {
         AttachHatred(target, caster, m_effectStage.m_hatred);
         AttachHpAndMpChange(target, caster, m_effectStage.m_deltaHp, m_effectStage.m_deltaMp);
         AttachStealHp(target, caster, m_effectStage.m_deltaHp);
         AttachStatus(target, caster, m_effectStage.m_statusIdAndValueAndTimeArr);
     }
 }
            public void InitWithCasterAndTarget(DE_Effect effectDe, short animId, E_Unit caster, E_Unit target)
            {
                m_de     = effectDe;
                m_animId = animId;
                // 计算命中
                float hitRate = (100 + effectDe.m_hitRate) * caster.m_HitRate * 0.01f;

                m_hit = MyRandom.NextInt(1, 101) <= hitRate;
                if (m_hit)
                {
                    // 计算基础伤害 (或能量剥夺)
                    m_deltaHp = effectDe.m_deltaHp;
                    m_deltaMp = effectDe.m_deltaMp;
                    for (int i = 0; i < effectDe.m_attrBonus.Count; i++)
                    {
                        switch (effectDe.m_attrBonus[i].Item1)
                        {
                        case ActorUnitConcreteAttributeType.ATTACK:
                            m_deltaHp = m_deltaHp + (int)(caster.m_Attack * effectDe.m_attrBonus[i].Item2);
                            break;

                        case ActorUnitConcreteAttributeType.MAGIC:
                            m_deltaHp = m_deltaHp + (int)(caster.m_Magic * effectDe.m_attrBonus[i].Item2);
                            break;

                        case ActorUnitConcreteAttributeType.MAX_HP:
                            m_deltaHp = m_deltaHp + (int)(caster.m_MaxHp * effectDe.m_attrBonus[i].Item2);
                            break;

                        case ActorUnitConcreteAttributeType.MAX_MP:
                            m_deltaHp = m_deltaHp + (int)(caster.m_MaxMp * effectDe.m_attrBonus[i].Item2);
                            break;
                        }
                    }
                    // 计算暴击
                    float criticalRate = effectDe.m_criticalRate * caster.m_CriticalRate * 0.01f;
                    float bonus        = criticalRate > 1?criticalRate - 1:0;
                    m_critical = MyRandom.NextInt(1, 101) <= criticalRate;
                    if (m_critical)
                    {
                        m_deltaHp = (int)(m_deltaHp * (1f + (float)caster.m_CriticalBonus * 0.01f + 2 * bonus));
                    }
                    if (m_deltaHp < 0)
                    {
                        switch (effectDe.m_type)
                        {
                        case EffectType.PHYSICS:
                            m_deltaHp = GetDamage(m_deltaHp, target.m_Defence);
                            break;

                        case EffectType.MAGIC:
                            m_deltaHp = GetDamage(m_deltaHp, target.m_Resistance);
                            break;
                        }
                    }
                    // 减伤+易伤
                    if (m_deltaHp < 0)
                    {
                        if (effectDe.m_type == EffectType.PHYSICS)
                        {
                            m_deltaHp = (int)(m_deltaHp * (target.m_PhysicsVulernability * 0.01f + 1) * (1 - target.m_DamageReduction * 0.01f));
                        }
                        else
                        {
                            m_deltaHp = (int)(m_deltaHp * (target.m_MagicVulernability * 0.01f + 1) * (1 - target.m_DamageReduction * 0.01f));
                        }
                    }

                    // 计算状态
                    m_statusIdAndValueAndTimeArr = new (short, float, float) [effectDe.m_statusIdAndValueAndTimeList.Count];
示例#3
0
 public DE_ConsumableData(DO_Consumable consumDo)
 {
     m_itemEffect = new DE_Effect(consumDo.m_effect, (short)(consumDo.m_itemId * 100));
 }