// TODO: 吸血技能. // 吸取敌人攻击力,转换其中一部分变成自己的攻击力 // /num 吸取敌人血的百分比 // /type 0:固定值 1:比例 // /convert 吸取血之后加到自己身上的百分比 // /angryCost 怒气 // /selfInc 0:convert吸取血之后加到自己身上的百分比 1:自身攻击力增加convert private void castSuckSkill(float num, int type, float convert, int angryCost = 0, int selfInc = 0) { BT_Logical war = owner._war; BT_Monster enemy = war.enemy(owner); BT_MonsterTeam selfTeam = owner.ownerTeam; if (selfTeam.curAngry >= angryCost) { if (enemy.alive) { float suck = num; if (type == 1) { suck = num * Consts.oneHundred * enemy.curAtt; } if (suck > enemy.curAtt) { suck = enemy.curAtt; } if (angryCost > 0) // 扣怒气... { selfTeam.costAngry(angryCost); } CMsgSkillSuckAttack msg = new CMsgSkillSuckAttack(this, enemy.pveId, MathHelper.MidpointRounding(suck)); war.addMsgToRecorder(msg); // 减敌方血,加给自己. BT_Hurt hurt = new BT_Hurt() { damageVal = suck, hurtType = BT_Hurt_Type.HURT_SKILL, }; int finalSuck = enemy.sufferAttack(hurt, owner); float addAtt = 0f; if (selfInc == 0) { addAtt = convert * Consts.oneHundred * finalSuck; } else { addAtt = convert * Consts.oneHundred * owner.curAtt; } owner.curAttAdd(addAtt); msg.convertAttack = MathHelper.MidpointRounding(addAtt); msg.finalSuckAtt = finalSuck; msg.sufferCurAtt = enemy.curAtt; msg.casterCurAtt = owner.curAtt; msg.curAngry = selfTeam.curAngry; } } }
// TODO: 直接攻击型技能 // 对对方造成damage的伤害... private CMsgSkillAttack makeAttackMsg(BT_Monster enemy, float damage) { BT_Hurt hurt = new BT_Hurt() { damageVal = damage, hurtType = BT_Hurt_Type.HURT_SKILL, }; CMsgSkillAttack msg = new CMsgSkillAttack(this, enemy.pveId, MathHelper.MidpointRounding(damage)); int finalDamage = enemy.sufferAttack(hurt, owner); msg.finalAtt = finalDamage; msg.curAtt = enemy.curAtt; msg.curAngry = enemy.ownerTeam.curAngry; return(msg); }
//受到普通伤害. public void sufferNormalAttack(int att, BT_Monster enemy, bool beReBound = false) { CMsgNormalAttack msg = new CMsgNormalAttack(_pveIndex, att, beReBound ? CMsgHeader.STATUS_REBOUND_ATT : CMsgHeader.STATUS_ATTACK); _war.addMsgToRecorder(msg); BT_Hurt hurt = new BT_Hurt() { hurtType = BT_Hurt_Type.HURT_COMMON, damageVal = att }; int finalDamage = sufferAttack(hurt, enemy); msg.finalAtt = finalDamage; msg.curAtt = curAtt; }
//返回实现伤害值 public int sufferAttack(BT_Hurt damage, BT_Monster enemy) { int finalDamage = MathHelper.MidpointRounding(damage.damageVal); //技能来的攻击 if ((damage.hurtType == BT_Hurt_Type.HURT_SKILL || damage.hurtType == BT_Hurt_Type.HURT_ANGRY_SKILL) && canSufferSkillDamage() == false) { finalDamage = 0; } #region 各种buff or defbuff处理... //伤害全部防御技能 short bufDebuffType = CMsgHeader.BUFF_DEBUFF_GOLDDEFENSE; BT_BuffOrDebuff goldShieldBuf = getBuffOrDebuff(bufDebuffType); if (goldShieldBuf != null && --goldShieldBuf.round >= 0) { finalDamage = 0; CMsgSkillBuffDebuffEffect msg = new CMsgSkillBuffDebuffEffect(this, goldShieldBuf); _war.addMsgToRecorder(msg); _buffArr[bufDebuffType] = goldShieldBuf; } //伤害加深 bufDebuffType = CMsgHeader.BUFF_DEBUFF_HURTUP; BT_BuffOrDebuff hurtUpDebuff = getBuffOrDebuff(bufDebuffType, false); if (hurtUpDebuff != null && --hurtUpDebuff.round >= 0) { int rDamage = MathHelper.MidpointRounding(damage.damageVal * (1 + hurtUpDebuff.rate * Consts.oneHundred)); CMsgSkillBuffDebuffEffect msg = new CMsgSkillBuffDebuffEffect(this, hurtUpDebuff); msg.arg1 = MathHelper.MidpointRounding(damage.damageVal); msg.arg2 = rDamage; _war.addMsgToRecorder(msg); _debuffArr[bufDebuffType] = hurtUpDebuff; finalDamage = rDamage; } //反弹部分伤害到敌人... bufDebuffType = CMsgHeader.BUFF_DEBUFF_REBOUND; BT_BuffOrDebuff reboundBuff = getBuffOrDebuff(bufDebuffType); if (reboundBuff != null && --reboundBuff.round >= 0 && enemy.alive) { float rebound = damage.damageVal * reboundBuff.rate * Consts.oneHundred; damage.damageVal -= rebound; enemy.sufferNormalAttack(MathHelper.MidpointRounding(rebound), this, true); _buffArr[bufDebuffType] = reboundBuff; finalDamage = MathHelper.MidpointRounding(damage.damageVal); } //护盾技能... bufDebuffType = CMsgHeader.BUFF_DEBUFF_DEFENSE; BT_BuffOrDebuff shieldBuff = getBuffOrDebuff(bufDebuffType); if (shieldBuff != null && shieldBuff.suckDmg > 0) { int beforeShield = shieldBuff.suckDmg; if (beforeShield > damage.damageVal) { shieldBuff.suckDmg -= MathHelper.MidpointRounding(damage.damageVal); finalDamage = 0; } else { damage.damageVal -= beforeShield; shieldBuff.suckDmg = 0; finalDamage = MathHelper.MidpointRounding(damage.damageVal); } CMsgSkillBuffDebuffEffect msg = new CMsgSkillBuffDebuffEffect(this, shieldBuff); msg.arg1 = beforeShield; msg.arg2 = shieldBuff.suckDmg; _war.addMsgToRecorder(msg); _buffArr[bufDebuffType] = shieldBuff; } #endregion setCurAtt(_curAtt - finalDamage); return(finalDamage); }