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];
public DE_ConsumableData(DO_Consumable consumDo) { m_itemEffect = new DE_Effect(consumDo.m_effect, (short)(consumDo.m_itemId * 100)); }