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); }
/// <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); }
/// <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); }
/// <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); }
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); }
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); }