Пример #1
0
        public double GetMerlinInjurePercent(IObject attacker, IObject defender, EMerlinSecretAttrType eType)
        {
            double val = 0.0;

            try
            {
                switch (eType)
                {
                case EMerlinSecretAttrType.EMSAT_FrozenP:
                    val += RoleAlgorithm.GetFrozenPercent(attacker);
                    break;

                case EMerlinSecretAttrType.EMSAT_PalsyP:
                    val += RoleAlgorithm.GetPalsyPercent(attacker);
                    break;

                case EMerlinSecretAttrType.EMSAT_SpeedDownP:
                    val += RoleAlgorithm.GetSpeedDownPercent(attacker);
                    break;

                case EMerlinSecretAttrType.EMSAT_BlowP:
                    val += RoleAlgorithm.GetBlowPercent(attacker);
                    break;
                }
                if (defender is Robot || defender is GameClient)
                {
                    switch (eType)
                    {
                    case EMerlinSecretAttrType.EMSAT_FrozenP:
                        val -= ((defender is GameClient) ? RoleAlgorithm.GetExtProp(defender as GameClient, 97) : (defender as Robot).DeFrozenPercent);
                        break;

                    case EMerlinSecretAttrType.EMSAT_PalsyP:
                        val -= ((defender is GameClient) ? RoleAlgorithm.GetExtProp(defender as GameClient, 98) : (defender as Robot).DePalsyPercent);
                        break;

                    case EMerlinSecretAttrType.EMSAT_SpeedDownP:
                        val -= ((defender is GameClient) ? RoleAlgorithm.GetExtProp(defender as GameClient, 99) : (defender as Robot).DeSpeedDownPercent);
                        break;

                    case EMerlinSecretAttrType.EMSAT_BlowP:
                        val -= ((defender is GameClient) ? RoleAlgorithm.GetExtProp(defender as GameClient, 100) : (defender as Robot).DeBlowPercent);
                        break;
                    }
                }
                return((val > 0.0) ? val : 0.0);
            }
            catch (Exception ex)
            {
                if (attacker is GameClient)
                {
                    GameClient client = attacker as GameClient;
                    if (null != client)
                    {
                        DataHelper.WriteFormatExceptionLog(ex, Global.GetDebugHelperInfo(client.ClientSocket), false, false);
                    }
                }
            }
            return((val > 0.0) ? val : 0.0);
        }
Пример #2
0
        /// <summary>
        /// 获取伤害概率
        /// </summary>
        /// <param name="attacker">攻击者</param>
        /// <param name="eType">伤害类型</param>
        /// <returns></returns>
        public double GetMerlinInjurePercent(IObject attacker, EMerlinSecretAttrType eType)
        {
            double val = 0.0;

            try
            {
                // 根据类型获取角色伤害概率
                switch (eType)
                {
                case EMerlinSecretAttrType.EMSAT_FrozenP:     // 冰冻
                    val += RoleAlgorithm.GetFrozenPercent(attacker);
                    break;

                case EMerlinSecretAttrType.EMSAT_SpeedDownP:     // 减速
                    val += RoleAlgorithm.GetSpeedDownPercent(attacker);
                    break;

                case EMerlinSecretAttrType.EMSAT_PalsyP:     // 麻痹
                    val += RoleAlgorithm.GetPalsyPercent(attacker);
                    break;

                case EMerlinSecretAttrType.EMSAT_BlowP:     // 重击
                    val += RoleAlgorithm.GetBlowPercent(attacker);
                    break;
                }
                return(val);
            }
            catch (Exception ex)
            {
                if (attacker is GameClient)
                {
                    GameClient client = attacker as GameClient;
                    if (null != client)
                    {
                        DataHelper.WriteFormatExceptionLog(ex, Global.GetDebugHelperInfo(client.ClientSocket), false);
                    }
                }
            }
            return(val);
        }
Пример #3
0
        /// <summary>
        /// 计算特殊伤害/触发特殊伤害效果
        /// </summary>
        /// <param name="attacker">攻击者</param>
        /// <param name="defender">防守者</param>
        /// <param name="nBaseInjure">已造成伤害基数</param>
        /// <param name="eref">伤害类型</param>
        /// <returns>伤害值</returns>
        public int CalcMerlinInjure(IObject attacker, IObject defender, int nBaseInjure, ref EMerlinSecretAttrType eref)
        {
            eref = EMerlinSecretAttrType.EMSAT_None; // 默认为无伤害

            try
            {
                //  不是玩家或者机器人  否掉
                if (!(attacker is GameClient) && !(attacker is Robot))
                {
                    return(0);
                }

                //  被攻击者不是玩家或机器人 或者怪物 否掉
                if (!(defender is GameClient) && !(defender is Robot) && !(defender is Monster))
                {
                    return(0);
                }

                // 没有造成伤害
                if (nBaseInjure <= 0)
                {
                    return(0);
                }

                // 获取伤害类型
                eref = GetMerlinInjureType(attacker);
                if (eref == EMerlinSecretAttrType.EMSAT_None)
                {
                    return(0);
                }

                // 触发伤害效果
                int nInjure = TriggerEffect(attacker, defender, nBaseInjure, eref); // 造成的伤害

                return(nInjure);
            }
            catch (Exception ex)
            {
                if (attacker is GameClient)
                {
                    GameClient client = attacker as GameClient;
                    if (null != client)
                    {
                        DataHelper.WriteFormatExceptionLog(ex, Global.GetDebugHelperInfo(client.ClientSocket), false);
                    }
                }
            }

            return(0);
        }
Пример #4
0
        /// <summary>
        /// 触发伤害效果
        /// </summary>
        /// <param name="attacker">攻击者</param>
        /// <param name="defender">防守者</param>
        /// <param name="nBaseInjure">已造成伤害基数</param>
        /// <param name="eType">伤害类型</param>
        /// <returns>伤害值</returns>
        private int TriggerEffect(IObject attacker, IObject defender, int nBaseInjure, EMerlinSecretAttrType eType)
        {
            int nInjure = 0; // 造成的伤害

            try
            {
                // 根据类型计算伤害
                switch (eType)
                {
                case EMerlinSecretAttrType.EMSAT_SpeedDownP:     // 减速
                    // 效果1:触发后追加本次伤害的50%
                    nInjure = (int)(nBaseInjure * 0.5);

                    // 效果2:触发后100%的几率降低目标30%的移动速度4秒
                    if (Global.GetRandomNumber(0, 10001) <= 10000)
                    {
                        double[] param = { 0.3, 4.0 };     // 参数列表
                        MagicAction.ProcessAction(attacker, defender, MagicActionIDs.MU_ADD_MOVE_SPEED_DOWN, param);
                    }
                    break;

                case EMerlinSecretAttrType.EMSAT_FrozenP:     // 冰冻
                    // 效果1:触发后追加本次伤害的50%
                    nInjure = (int)(nBaseInjure * 0.5);

                    // 效果2:触发后100%的几率冻结目标2秒
                    if (Global.GetRandomNumber(0, 10001) <= 10000)
                    {
                        double[] param = { 0.99, 2.0 };     // 参数列表
                        MagicAction.ProcessAction(attacker, defender, MagicActionIDs.MU_ADD_FROZEN, param);
                    }
                    break;

                case EMerlinSecretAttrType.EMSAT_BlowP:     // 重击
                    // 效果1:触发后追加本次伤害的100%
                    nInjure = nBaseInjure;
                    break;

                case EMerlinSecretAttrType.EMSAT_PalsyP:     // 麻痹
                    // 效果1:触发后追加本次伤害的50%
                    nInjure = (int)(nBaseInjure * 0.5);

                    // 效果2:触发后100%的几率另目标晕眩1秒
                    if (Global.GetRandomNumber(0, 10001) <= 10000)
                    {
                        double[] param = { 0.99, 1.0 };     // 参数列表
                        MagicAction.ProcessAction(attacker, defender, MagicActionIDs.MU_ADD_PALSY, param);
                    }
                    break;

                default:     // 默认无伤害
                    return(0);

                    break;
                }

                return(nInjure);
            }
            catch (Exception ex)
            {
                if (attacker is GameClient)
                {
                    GameClient client = attacker as GameClient;
                    if (null != client)
                    {
                        DataHelper.WriteFormatExceptionLog(ex, Global.GetDebugHelperInfo(client.ClientSocket), false);
                    }
                }
            }
            return(nInjure);
        }
Пример #5
0
        private int TriggerEffect(IObject attacker, IObject defender, int nBaseInjure, EMerlinSecretAttrType eType, double percent)
        {
            int nInjure = 0;

            try
            {
                switch (eType)
                {
                case EMerlinSecretAttrType.EMSAT_FrozenP:
                {
                    nInjure = (int)((double)nBaseInjure * 0.5);
                    double[] param = new double[]
                    {
                        0.99,
                        2.0 * percent
                    };
                    MagicAction.ProcessAction(attacker, defender, MagicActionIDs.MU_ADD_FROZEN, param, -1, -1, 0, 1, -1, 0, 0, -1, 0, false, false, 1.0, 1, 0.0);
                    break;
                }

                case EMerlinSecretAttrType.EMSAT_PalsyP:
                {
                    nInjure = (int)((double)nBaseInjure * 0.5);
                    double[] param = new double[]
                    {
                        0.99,
                        1.0 * percent
                    };
                    MagicAction.ProcessAction(attacker, defender, MagicActionIDs.MU_ADD_PALSY, param, -1, -1, 0, 1, -1, 0, 0, -1, 0, false, false, 1.0, 1, 0.0);
                    break;
                }

                case EMerlinSecretAttrType.EMSAT_SpeedDownP:
                {
                    nInjure = (int)((double)nBaseInjure * 0.5);
                    double[] param = new double[]
                    {
                        0.3,
                        4.0 * percent
                    };
                    MagicAction.ProcessAction(attacker, defender, MagicActionIDs.MU_ADD_MOVE_SPEED_DOWN, param, -1, -1, 0, 1, -1, 0, 0, -1, 0, false, false, 1.0, 1, 0.0);
                    break;
                }

                case EMerlinSecretAttrType.EMSAT_BlowP:
                    nInjure = nBaseInjure;
                    break;

                default:
                    return(0);
                }
                return(nInjure);
            }
            catch (Exception ex)
            {
                if (attacker is GameClient)
                {
                    GameClient client = attacker as GameClient;
                    if (null != client)
                    {
                        DataHelper.WriteFormatExceptionLog(ex, Global.GetDebugHelperInfo(client.ClientSocket), false, false);
                    }
                }
            }
            return(nInjure);
        }
Пример #6
0
 public int CalcMerlinInjure(IObject attacker, IObject defender, int nBaseInjure, ref EMerlinSecretAttrType eref)
 {
     eref = EMerlinSecretAttrType.EMSAT_None;
     try
     {
         if (!(attacker is GameClient) && !(attacker is Robot))
         {
             return(0);
         }
         if (!(defender is GameClient) && !(defender is Robot) && !(defender is Monster))
         {
             return(0);
         }
         if (nBaseInjure <= 0)
         {
             return(0);
         }
         double percent = 1.0;
         eref = this.GetMerlinInjureType(attacker, defender, ref percent);
         if (eref == EMerlinSecretAttrType.EMSAT_None)
         {
             return(0);
         }
         return(this.TriggerEffect(attacker, defender, nBaseInjure, eref, percent));
     }
     catch (Exception ex)
     {
         if (attacker is GameClient)
         {
             GameClient client = attacker as GameClient;
             if (null != client)
             {
                 DataHelper.WriteFormatExceptionLog(ex, Global.GetDebugHelperInfo(client.ClientSocket), false, false);
             }
         }
     }
     return(0);
 }