/// <summary> /// 外部调用的话 只针对自己的Buff /// </summary> /// <param name="buffs">Buffs.</param> /// <param name="bulletID">Bullet I.</param> public void applyBuff_Src(List <BuffCtrl> buffs, int bulletID) { //添加buff,trigger是buff的施加者 for (int i = 0; i < buffs.Count; i++) { BuffCtrl each = buffs [i]; //如果是指定的施加者相同并且施加者的目标包含buff的使用者 each.owner.characterCtrl.AddBuff(each); // 如果是伤害buff,需要根据ID号激活,为了细分伤害 if (each.serverData.sample.getType() == BuffType.damage) { if (bulletID == 0 || bulletID == each.bulletID || each.trigger == each.owner) { //激活相同ID的伤害buff,0全激活 each.activeDamageBuff(bulletID); } else { continue; } } else { each.activeOtherBuff(); //激活buff } each.owner.characterCtrl.BeHit(serverData.sample.CanHitBack()); //引爆伤害 } }
void subDamage(SkillCtrl skillctrl) { foreach (BuffCtrl each in buffs) { if (each.serverData.sample.getType() == BuffType.damage && each.owner == target) { int subDamage = (int)(each.serverData.serverDamage * 0.2f); for (int i = 0; i < 4; i++) { BuffCtrl ctrl = new BuffCtrl(); ctrl.owner = each.owner; ctrl.trigger = each.trigger; ctrl.DisplayEffect = each.DisplayEffect; ctrl.option = each.option; ctrl.parentSkill = each.parentSkill; ctrl.serverData = new BuffData(each.serverData.sid, subDamage); ctrl.serverData.damageEffect = ""; buffs.Add(ctrl); } each.serverData.serverDamage = subDamage; break; } } }
public void removeBuff(BuffCtrl _buff) { if (_buff != null) { BuffList.Remove(_buff); } }
public void addDamage(BuffCtrl buff) { if (damageBuff == null) { damageBuff = new List <BuffCtrl> (); } damageBuff.Add(buff); }
/// <summary> /// 加召唤兽怒气 /// </summary> public void applyMonsterBuffOnly(CharacterData trigger) { //trigger是buff的施加者 for (int i = 0; i < trigger.characterCtrl.activeAction.Skill.buffs.Count; i++) { BuffCtrl each = trigger.characterCtrl.activeAction.Skill.buffs [i]; //如果是指定的施加者相同并且施加者的目标包含buff的使用者 if (each.serverData.sample.getType() == BuffType.power) { each.activeOtherBuff(); } } }
BuffCtrl copyDamageBuff(BuffCtrl orgBuff) { BuffCtrl ctrl = new BuffCtrl(); ctrl.owner = orgBuff.owner; ctrl.trigger = orgBuff.trigger; ctrl.DisplayEffect = orgBuff.DisplayEffect; ctrl.option = orgBuff.option; ctrl.parentSkill = orgBuff.parentSkill; ctrl.serverData = new BuffData(orgBuff.serverData.sid, orgBuff.serverData.serverDamage); ctrl.serverData.damageEffect = orgBuff.serverData.damageEffect; return(ctrl); }
/** 重新计算BodyBuff */ void RecalculateBodyBuff(BuffCtrl _buff) { if (_buff.serverData.sample.getDisplayType() != BuffIconType.BodyEffect) { return; } //如果是其他类型,创建bodyEffect if (bodyBuff != null) { bodyBuff.removeEffect(); bodyBuff = null; } bodyBuff = _buff; bodyBuff.CreateDurationBuffEffect(); }
public void AddBuff(BuffCtrl _buff) { buffs.Add(_buff); if (_buff.serverData.sample.getType() == BuffType.damage) { return; } if (_buff.serverData.sample.getType() != BuffType.attr_change && _buff.serverData.sample.getType() != BuffType.jinghua) { RecalculateBodyBuff(_buff); } if (_buff.serverData.sample.getType() == BuffType.jinghua) { removeAllchangeBuff(); } RecalculateBuffData(); }
/// <summary> /// 移除buff /// </summary> /// <param name="_buff">_buff.</param> public void RemoveBuff(BuffCtrl _buff) { for (int i = 0; i < buffs.Count; i++) { if (buffs[i].serverData.sid == _buff.serverData.sid) { buffs.Remove(buffs[i]); } } buffs.Remove(_buff); if (_buff.serverData.sample.getType() == BuffType.damage) { return; } removeBuffByEffect(_buff); RecalculateBuffData(); }
/// <summary> /// 移除buff后相应的效果处理 /// </summary> /// <param name="_buff">_buff.</param> public void removeBuffByEffect(BuffCtrl _buff) { if (_buff.serverData.sample.getType() == BuffType.vertigo) { EffectManager.Instance.CreateEffect(hitPoint, "Effect/Single/RemoveVertigo"); } if (_buff.serverData.sample.getType() == BuffType.frozen) { EffectManager.Instance.CreateEffect(hitPoint, "Effect/Single/RemoveFrozen"); } if (_buff.serverData.sample.getType() == BuffType.silence) { EffectManager.Instance.CreateEffect(hitPoint, "Effect/Single/RemoveSilence"); } if (_buff.serverData.sample.getDisplayType() == BuffIconType.BodyEffect) { // 移除之前的bodyEffect效果 if (bodyBuff == _buff) { bodyBuff.removeEffect(); bodyBuff = null; //这里重新遍历身上的BUFF,创建特效出来 for (int i = 0; i < buffs.Count; i++) { if (buffs[i].serverData.sample.getType() != BuffType.attr_change) { RecalculateBodyBuff(buffs[i]); } } } } if (_buff.serverData.sample.getTransformID() != "0") { //变形卡还原 cardCtrl.changePicture(null); } }
public void AddBuffCtrl(BuffCtrl _buff) { buffs.Add(_buff); }
public void replaceBuff(BuffCtrl _buff) { }
public void addBuff(BuffCtrl _buff) { BuffList.Add(_buff); // MonoBase.print ("buff add,length:" + BuffList.Count); }
/// <summary> /// 远程单体攻击的细分伤害 /// </summary> IEnumerator subRemoteAttack() { BuffCtrl damageBuff = null; int damageAll = 0; //找到对应的伤害buff,单体目标肯定只有1 foreach (BuffCtrl each in activeAction.Skill.buffs) // 先统计所有buff伤害 { if (each.serverData.sample.getType() == BuffType.damage) { //算出单次伤害 damageAll += each.serverData.serverDamage; } } List <BuffCtrl> tempTotalBuffs = new List <BuffCtrl>(); //找到对应的伤害buff,单体目标肯定只有1 foreach (BuffCtrl each in activeAction.Skill.buffs) // 细分累计的伤害数据 { if (each.serverData.sample.getType() == BuffType.damage) { int subDamage = (int)(damageAll / activeAction.Skill.serverData.sample.getAttackNum()); each.serverData.serverDamage = subDamage; damageBuff = each; } else { tempTotalBuffs.Add(each); } } //移除本来的,后面会补完 activeAction.Skill.RemoveBuffCtrl(damageBuff); //动画表现 for (int i = 0; i < activeAction.Skill.serverData.sample.getAttackNum(); i++) { //一颗子弹一个buff BuffCtrl newbuff = copyDamageBuff(damageBuff); activeAction.Skill.AddBuffCtrl(newbuff); BulletCtrl bullet = null; List <BuffCtrl> tmplist = new List <BuffCtrl> (); tmplist.Add(newbuff); //表现连击 UiManager.Instance.battleWindow.comboBar.init(i + 1, damageAll); playCharacterAnim(this, "cardThrowAnim"); if (i == activeAction.Skill.serverData.sample.getAttackNum() - 1) { //最后一个伤害补足 tempTotalBuffs.Add(newbuff); newbuff.serverData.serverDamage = damageAll - damageBuff.serverData.serverDamage * (activeAction.Skill.serverData.sample.getAttackNum() - 1); bullet = EffectManager.Instance.CreateBulletEffect(characterData, activeAction.Skill.targets[0], tempTotalBuffs, activeAction.Skill.serverData.sample.getBulletEffect(), true); newbuff.bulletID = bullet.GetInstanceID(); yield break; } else { bullet = EffectManager.Instance.CreateBulletEffect(characterData, activeAction.Skill.targets [0], tmplist, activeAction.Skill.serverData.sample.getBulletEffect(), false); newbuff.bulletID = bullet.GetInstanceID(); yield return(new WaitForSeconds(0.2f)); } } }
IEnumerator subMeleeAttack() { BuffCtrl damageBuff = null; int damageAll = 0; //找到对应的伤害buff,单体目标肯定只有1 foreach (BuffCtrl each in activeAction.Skill.buffs) // 先统计所有buff伤害 { if (activeAction.Skill.serverData.sample.getAttackNum() > 1) { if (each.serverData.sample.getType() == BuffType.damage && each.serverData.serverDamage <= 0) { //算出单次伤害 damageAll += each.serverData.serverDamage; } } else { if (each.serverData.sample.getType() == BuffType.damage) { //算出单次伤害 damageAll += each.serverData.serverDamage; } } } foreach (BuffCtrl each in activeAction.Skill.buffs) // 细分累计的伤害数据 { if (activeAction.Skill.serverData.sample.getAttackNum() > 1) { if (each.serverData.sample.getType() == BuffType.damage && each.serverData.serverDamage <= 0) { int subDamage = (int)(damageAll / activeAction.Skill.serverData.sample.getAttackNum()); each.serverData.serverDamage = subDamage; damageBuff = each; } } else { if (each.serverData.sample.getType() == BuffType.damage) { int subDamage = (int)(damageAll / activeAction.Skill.serverData.sample.getAttackNum()); each.serverData.serverDamage = subDamage; damageBuff = each; } } } //原来的一个再加上复制的几个 damageBuff.bulletID = 1; for (int i = 1; i < activeAction.Skill.serverData.sample.getAttackNum(); i++) { BuffCtrl ctrl = copyDamageBuff(damageBuff); ctrl.bulletID = i + 1; //设置子弹id,对应攻击ID爆对应伤害 activeAction.Skill.AddBuffCtrl(ctrl); if (i == activeAction.Skill.serverData.sample.getAttackNum() - 1) { //最后一个伤害补足 ctrl.serverData.serverDamage = damageAll - damageBuff.serverData.serverDamage * (activeAction.Skill.serverData.sample.getAttackNum() - 1); } } cardCtrl.attackScaleDown(); //动画表现 List <BuffCtrl> bufftemp = null; for (int i = 0; i < activeAction.Skill.serverData.sample.getAttackNum(); i++) { //中途人死了中断细分攻击 if (activeAction.Skill.targets [0].characterCtrl.state == enum_character_state.deaded || activeAction.Skill.targets [0].characterCtrl.state == enum_character_state.deading) { break; } playCharacterAnim(this, "cardHitAnim"); if (i == 0) { for (int j = 0; j < activeAction.Skill.buffs.Count; j++) { if (activeAction.Skill.buffs[j].serverData.sample.getDisplayType() == BuffIconType.BodyEffect || (activeAction.Skill.buffs[j].trigger == activeAction.Skill.buffs[j].owner && activeAction.Skill.buffs[j].serverData.serverDamage > 0 && activeAction.Skill.buffs[j].serverData.sample.getType() == BuffType.damage)) { if (bufftemp == null) { bufftemp = new List <BuffCtrl>(); } bufftemp.Add(activeAction.Skill.buffs[j]); } } } if (i == 1 && bufftemp != null) { for (int m = 0; m < bufftemp.Count; m++) { activeAction.Skill.buffs.Remove(bufftemp[m]); } } activeAction.Skill.applyBuff(activeAction.Skill.buffs, i + 1); UiManager.Instance.battleWindow.comboBar.init(i + 1, damageAll); yield return(new WaitForSeconds(0.3f)); } StartCoroutine(cardCtrl.goBack()); //AttackAnimComplete() //触发反击 BattleManager.Instance.getActiveBattleInfo().FightBack(characterData, SkillActiveType.SkillHit); //触发急救 BattleManager.Instance.getActiveBattleInfo().Medical(characterData); }
public void RemoveBuffCtrl(BuffCtrl _buff) { buffs.Remove(_buff); }
public CharacterAction(enum_character_Action _action, BuffCtrl _buff) { action = _action; buff = _buff; }
/// <summary> /// 根据战斗技能数据穿件buff控制列表 /// </summary> /// <param name="each">战斗技能数据</param> public int createBuffCtrlList(BattleSkillErlang each) { //buff if (each.skillMsg.operationType == BattleReportService.ATTR_CHANGE || each.skillMsg.operationType == BattleReportService.BUFFER_ADD || each.skillMsg.operationType == BattleReportService.BUFFER_REPLACE || each.skillMsg.operationType == BattleReportService.BUFFER_REMOVE) { //如果没有上次技能,说明第一个是buff,不合格式,跳过 BuffCtrl newBuff = new BuffCtrl(); if (lastSkill == null) { Debug.Log("error format!!!!!"); return(0); } //关于Hp的buff if (each.skillMsg.operationType == BattleReportService.ATTR_CHANGE && each.skillMsg.valueType == StringKit.toInt(BattleReportService.HP)) { each.skillMsg.skillSID = BuffSampleManager.SID_HP; } //关于怒气的buff if (each.skillMsg.operationType == BattleReportService.ATTR_CHANGE && each.skillMsg.valueType == StringKit.toInt(BattleReportService.ANGER)) { each.skillMsg.skillSID = BuffSampleManager.SID_ANGER; } //如果伤害类型是召唤兽怒气 if (each.skillMsg.valueType == StringKit.toInt(BattleReportService.ANGER)) { newBuff.init(BattleManager.Instance.getBattleCharacterData(each.skillMsg.targets [0]), lastSkill.user, BuffManager.Instance.CreateBuffData(each.skillMsg.skillSID, each.skillMsg.damage, lastSkill.serverData.sample.getDamageEffect()), false, each.skillMsg.skillID, lastSkill); lastSkill.AddBuffCtrl(newBuff); } else { CharacterData buffOwner; if (lastSkill.serverData.sample.getType() == SkillType.HelpOther) { //如果是援护 buffOwner = BattleManager.Instance.getBattleCharacterData(each.skillMsg.targets [0]); newBuff.init(buffOwner, lastSkill.trigger, BuffManager.Instance.CreateBuffData(each.skillMsg.skillSID, each.skillMsg.damage, lastSkill.serverData.sample.getDamageEffect()), false, each.skillMsg.skillID, lastSkill); lastSkill.triggerSkill.AddBuffCtrl(newBuff); newBuff.serverData.sample.changeDamageType(BuffDamageType.beIntervene); } else if (lastSkill.serverData.sample.getType() == SkillType.GroupAttack) { buffOwner = BattleManager.Instance.getBattleCharacterData(each.skillMsg.targets [0]); newBuff.init(buffOwner, lastSkill.user, BuffManager.Instance.CreateBuffData(each.skillMsg.skillSID, each.skillMsg.damage, lastSkill.serverData.sample.getDamageEffect()), false, each.skillMsg.skillID, lastSkill); lastSkill.AddBuffCtrl(newBuff); } else if (lastSkill.serverData.sample.getType() == SkillType.ComboAttack) { buffOwner = BattleManager.Instance.getBattleCharacterData(each.skillMsg.targets [0]); newBuff.init(buffOwner, lastSkill.user, BuffManager.Instance.CreateBuffData(each.skillMsg.skillSID, each.skillMsg.damage, lastSkill.serverData.sample.getDamageEffect()), false, each.skillMsg.skillID, lastSkill); lastSkill.AddBuffCtrl(newBuff); } else { //普通伤害buff buffOwner = BattleManager.Instance.getBattleCharacterData(each.skillMsg.targets [0]); // MonoBase.print("skillMsg.skillID:"+each.skillMsg.skillID); //Debug.LogError("lastSkill==="+lastSkill.serverData.sample.sid); newBuff.init(buffOwner, lastSkill.user, BuffManager.Instance.CreateBuffData(each.skillMsg.skillSID, each.skillMsg.damage, lastSkill.serverData.sample.getDamageEffect()), false, each.skillMsg.skillID, lastSkill); lastSkill.AddBuffCtrl(newBuff); if (lastSkill.serverData.sample.getType() == SkillType.FightBack) { newBuff.serverData.sample.changeDamageType(BuffDamageType.beRebound); } if (lastBuff != null) { if (lastBuff.option == buff_option.Add || lastBuff.option == buff_option.active) { //如果上个buff操作类型是增加buff //检查是否为特殊伤害类型,比如毒 newBuff.serverData.sample.changeDamageType(lastBuff.serverData.sample.getDamageType()); } } } } //lastSkill.AddBuffCtrl(newBuff); //根据操作类型不同做不同操作 switch (each.skillMsg.operationType) { case BattleReportService.ATTR_CHANGE: addBuff(newBuff); newBuff.option = buff_option.none; break; case BattleReportService.BUFFER_REPLACE: newBuff.serverData.replaceID = each.skillMsg.oldSkillID; newBuff.option = buff_option.Replace; // replaceBuff (newBuff); break; case BattleReportService.BUFFER_REMOVE: addBuff(newBuff); // MonoBase. print(newBuff.buffData.database.buffType); newBuff.option = buff_option.Remove; break; case BattleReportService.BUFFER_ADD: // newBuff.buffData.IsDurationBuff = true; newBuff.option = buff_option.Add; addBuff(newBuff); newBuff.serverData.serverAttr_attack = each.skillMsg.getValueByEffectType(BuffEffectType.ATTACK); newBuff.serverData.serverAttr_defend = each.skillMsg.getValueByEffectType(BuffEffectType.DEFENSE); newBuff.serverData.serverAttr_magic = each.skillMsg.getValueByEffectType(BuffEffectType.MAGIC); newBuff.serverData.serverAttr_dex = each.skillMsg.getValueByEffectType(BuffEffectType.AGILE); break; case BattleReportService.BUFFER_ABILITY: // newBuff.buffData.IsDurationBuff = true; newBuff.option = buff_option.active; addBuff(newBuff); newBuff.serverData.serverAttr_attack = each.skillMsg.getValueByEffectType(BuffEffectType.ATTACK); newBuff.serverData.serverAttr_defend = each.skillMsg.getValueByEffectType(BuffEffectType.DEFENSE); newBuff.serverData.serverAttr_magic = each.skillMsg.getValueByEffectType(BuffEffectType.MAGIC); newBuff.serverData.serverAttr_dex = each.skillMsg.getValueByEffectType(BuffEffectType.AGILE); break; default: addBuff(newBuff); break; } lastBuff = newBuff; //下一个skill return(1); } //继续往下 return(2); }