public BuffResult NetBuffResult(Scene scene, BuffData buff, int damageType, int damageValue, BuffType type, int delayView) { var caster = buff.GetCaster(); var bear = buff.GetBear(); var nowHp = bear.GetAttribute(eAttributeType.HpNow); if (scene != null && scene.isNeedDamageModify) { if (Scene.IsNeedChangeHp(bear) != null) { nowHp = (int)(nowHp / scene.BeDamageModify); } } var result = new BuffResult { SkillObjId = caster.ObjId, TargetObjId = bear.ObjId, BuffTypeId = buff.GetBuffId(), Type = type, Damage = damageValue, ViewTime = Extension.AddTimeDiffToNet(delayView), Param = { damageType, nowHp } }; return(result); }
//删除buff public bool DelBuff(BuffList _this, BuffData thisbuff) { if (thisbuff == null) { return(false); } thisbuff.SetActive(false); return(true); }
public void AddDuration(BuffData _this, float fDuration) { _this.m_fDuration += fDuration; if (_this.mOverTrigger != null) { var nextTime = SceneServerControl.Timer.GetNextTime(_this.mOverTrigger); SceneServerControl.Timer.ChangeTime(ref _this.mOverTrigger, nextTime.AddSeconds(fDuration)); } }
private void StarTrigger(BuffData _this) { //Logger.Info("StarTrigger by Buffid={0}",m_nBuffId); _this.mOverTrigger = SceneServerControl.Timer.CreateTrigger(DateTime.Now.AddSeconds(_this.m_fDuration), () => { _this.mOverTrigger = null; TimeOver(_this); }); }
public static void DoEffect(Scene scene, ObjCharacter bear, BuffData buff, int damage) { if (buff.m_HitType < eHitType.Hit) { var tempList = bear.BuffList.CopyBuff(); foreach (var dobuff in tempList) { BuffEvent.DoBuff(scene, bear, dobuff, 0, m_sType, damage, bear, (int)buff.m_HitType); } } }
//Buff所在场景,承受者,Buff实例,触发点,特定参数(伤害值,治疗值),另一个个Obj参数(释放者,击杀者等等不一定) public static void DoBuff(Scene scene, ObjCharacter obj, BuffData buff, int delayView, eEffectEventType eventType, int Param = 0, ObjCharacter otherObj = null, int checkParam = 0) { mImpl.DoBuff(scene, obj, buff, delayView, eventType, Param, otherObj, checkParam); }
public static void DoEffect(Scene scene, ObjCharacter target, BuffData buff, ObjCharacter caster, int damage) { var tempList = target.BuffList.CopyBuff(); foreach (var dobuff in tempList) { if (dobuff.GetActive()) { BuffEvent.DoBuff(scene, caster, dobuff, 0, m_sType, damage, target); } } }
private void OnEventTime(BuffData _this) { if (_this.m_bActive == false) { return; } if (_this.m_Bear == null) { Logger.Warn("buffdata OnEventTime Bear is null!! guid={1},buffid={0}", _this.m_nBuffId, _this.mId); if (_this.m_UpdataTrigger != null) { SceneServerControl.Timer.DeleteTrigger(_this.m_UpdataTrigger); _this.m_UpdataTrigger = null; } } _this.m_nUpdataCount += BuffData.UpdataMillisecond; if (_this.m_nUpdataCount % 1000 == 0) { if (_this.m_Bear != null) { SecondOne.DoEffect(_this.m_Bear.Scene, _this.m_Bear, _this); } } if (_this.m_nUpdataCount % 3000 == 0) { if (_this.m_Bear != null) { SecondThree.DoEffect(_this.m_Bear.Scene, _this.m_Bear, _this); } } if (_this.m_nUpdataCount % 5000 == 0) { if (_this.m_Bear != null) { SecondFive.DoEffect(_this.m_Bear.Scene, _this.m_Bear, _this); } } //m_UpdataTrigger = SceneServerControl.Timer.CreateTrigger(DateTime.Now.AddSeconds(1), OnEventTime); if (_this.mBuff.Duration != -1 && _this.m_nUpdataCount >= _this.m_fDuration * 1000) { if (_this.m_UpdataTrigger != null) { SceneServerControl.Timer.DeleteTrigger(_this.m_UpdataTrigger); TimeOver(_this); } else { TimeOver(_this); } //m_UpdataTrigger = null; } }
public void SetCaster(BuffData _this, ObjCharacter caster) { if (_this.m_Caster == null) { _this.m_Caster = new WeakReference <ObjCharacter>(caster); } else { _this.m_Caster.SetTarget(caster); } if (caster != null) { _this.mCasterId = caster.ObjId; } }
private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); // public bool CheckEffectOk(BuffData buff, ObjCharacter bearObj, eEffectEventType eventType, int effectIndex, int param) { if (buff == null) { return(false); } var tbBuff = buff.mBuff; if (tbBuff.effectid[effectIndex] == -1 || tbBuff.effectpoint[effectIndex] == -1) { return(false); } if (!BitFlag.GetLow(tbBuff.effectpoint[effectIndex], (int)eventType)) { return(false); } switch (eventType) { case eEffectEventType.HpLessPercent: { var nowHp = bearObj.Attr.GetDataValue(eAttributeType.HpNow); var maxHp = bearObj.Attr.GetDataValue(eAttributeType.HpMax); if (nowHp * 10000L > maxHp * tbBuff.EffectPointParam[effectIndex]) // 是否血量百分比触发 { return(false); } } break; case eEffectEventType.Critical: case eEffectEventType.WasCrit: { var condition = tbBuff.EffectPointParam[effectIndex]; var hitType = param; if (!BitFlag.GetLow(condition, hitType)) { return(false); } } break; } return(true); }
public void SetActive(BuffData _this, bool bActive) { _this.m_bActive = bActive; if (!bActive) { if (_this.m_UpdataTrigger != null) { SceneServerControl.Timer.DeleteTrigger(_this.m_UpdataTrigger); _this.m_UpdataTrigger = null; } if (_this.mOverTrigger != null) { SceneServerControl.Timer.DeleteTrigger(_this.mOverTrigger); _this.mOverTrigger = null; } } }
public int AbsorbDamage(BuffData _this, int damage, byte effectIndex, ref int remainValue) { if (!_this.RemainAbsorbDict.TryGetValue(effectIndex, out remainValue)) { return(0); } if (remainValue <= 0) { return(0); } var canAbsorbValue = GetCanAbsorb(_this, effectIndex, damage); var absorbValue = Math.Min(canAbsorbValue, remainValue); // 实际吸收值 remainValue = _this.RemainAbsorbDict.modifyValue(effectIndex, -absorbValue); // 修改buff return(absorbValue); }
public void SetDuration(BuffData _this, float fDuration, bool bNewTrigger = false) { //float diffitem = fDuration - m_fDuration; _this.m_fDuration = fDuration; if (!bNewTrigger) { return; } if (_this.mOverTrigger != null) { SceneServerControl.Timer.ChangeTime(ref _this.mOverTrigger, DateTime.Now.AddSeconds(fDuration)); } if (_this.m_UpdataTrigger != null) { _this.m_nUpdataCount = 0; //SceneServerControl.Timer.ChangeTime(m_UpdataTrigger, DateTime.Now.AddSeconds(1)); } }
public int GetLastSeconds(BuffData _this) { if (_this.m_fDuration < 0.01) { return(-1); } if (_this.mOverTrigger != null) { var overTime = SceneServerControl.Timer.GetNextTime(_this.mOverTrigger); if (overTime > DateTime.Now) { return((int)(overTime - DateTime.Now).TotalSeconds); } return(-1); } if (_this.m_nUpdataCount >= _this.m_fDuration * 1000) { return(-1); } return((int)_this.m_fDuration - _this.m_nUpdataCount / 1000); }
public void CalcAttrDamage(Dictionary <int, int> totalDamage, BuffData buff) { if (totalDamage.Count > 0) { // 有伤害数 var caster = buff.GetCaster(); var bear = buff.GetBear(); var damage = caster.Attr.GetAttrDamageValue(bear, eAttributeType.FireAttack); if (damage > 0) { totalDamage[(int)eDamageType.FireAttr] = damage; } damage = caster.Attr.GetAttrDamageValue(bear, eAttributeType.IceAttack); if (damage > 0) { totalDamage[(int)eDamageType.IceAttr] = damage; } damage = caster.Attr.GetAttrDamageValue(bear, eAttributeType.PoisonAttack); if (damage > 0) { totalDamage[(int)eDamageType.PoisonAttr] = damage; } } }
//刷新Buff的事件触发标记 public void UpdataBuff_Flag(BuffList _this, BuffData buff) { buff.m_Flag.ReSetAllFlag(); }
public static void DoEffect(Scene scene, ObjCharacter target, BuffData buff, int DelayView) { BuffEvent.DoBuff(scene, target, buff, DelayView, m_sType); }
//Buff所在场景,承受者,Buff实例,触发点,特定参数(伤害值,治疗值),另一个个Obj参数(释放者,击杀者等等不一定) public void DoBuff(Scene scene, ObjCharacter obj, BuffData buff, int delayView, eEffectEventType eventType, int Param = 0, ObjCharacter otherObj = null, int checkParam = 0) { if (null == buff) { return; } if (!buff.GetActive()) { return; //没有激活的Buff不生效 } if (!buff.IsCoolDown()) { return; } //该BUFF产生的伤害统计 var thisbuffdamage = new Dictionary <int, int>(); //该BuFF产生的治疗统计 var thisbuffhealth = new Dictionary <int, int>(); //该BuFF产生的回蓝统计 var thisbuffmana = new Dictionary <int, int>(); var tb_buff = buff.mBuff; for (var j = 0; j != tb_buff.effectid.Length; ++j) { if (!CheckEffectOk(buff, obj, eventType, j, checkParam)) { continue; } //执行BUFF效果需要 switch ((eEffectType)tb_buff.effectid[j]) { case eEffectType.DoDamage: { BuffEffect.DO_DAMAGE(thisbuffdamage, scene, obj, buff, j, CheckEventResetHitType(eventType)); } break; case eEffectType.DoHealth: { BuffEffect.DO_HEALTH(thisbuffhealth, scene, obj, buff, j, CheckEventResetHitType(eventType)); } break; case eEffectType.RefAttr: BuffEffect.REF_ATTR(scene, obj, buff, j); break; case eEffectType.PositionChange: BuffEffect.POSITION_CHANGE(scene, obj, buff, j); break; case eEffectType.ProAddBuff: BuffEffect.PRO_ADD_BUFF(scene, obj, buff, j); break; case eEffectType.DamageHealth: { if (Param > 0) { BuffEffect.DAMAGE_HEALTH(scene, obj, Param, buff, j); } } break; case eEffectType.DispelBuff: { BuffEffect.DispelBuff(eventType, scene, obj, buff, j); } break; case eEffectType.SpecialState: { BuffEffect.SPEIALSTATE(eventType, scene, obj, buff, j); } break; case eEffectType.CreateMonsterType1: { BuffEffect.CREATER_MONSTER1TYPE(scene, obj, buff, j); } break; case eEffectType.ModifySkill: { BuffEffect.NO_MODIFYSKILL(eventType, scene, obj, buff, j); } break; case eEffectType.ModifyBuff: { BuffEffect.NO_MODIFYBUFF(eventType, scene, obj, buff, j); } break; case eEffectType.ModifyModel: { BuffEffect.NO_MODIFYMODEL(eventType, obj, buff); } break; case eEffectType.CreateMonster: { BuffEffect.CREATER_MONSTER(eventType, scene, obj, buff, j); } break; case eEffectType.ExpModify: { BuffEffect.EXP_MODIFY(eventType, scene, obj, buff, j); } break; case eEffectType.ExpModify2: { BuffEffect.EXP_MODIFY2(eventType, scene, obj, buff, j); } break; case eEffectType.DoMana: { BuffEffect.DO_MANA(thisbuffmana, scene, obj, buff, j, CheckEventResetHitType(eventType)); } break; case eEffectType.KillSelf: { BuffEffect.Kill_SELF(scene, obj, buff, j); } break; case eEffectType.DoSkill: { BuffEffect.DoSkill(scene, obj, otherObj, buff, j); } break; case eEffectType.HpInRangeTriggerBuff: { BuffEffect.HP_TRIGGER_ADDBUFF(scene, obj, buff, j); } break; case eEffectType.AddExp: { BuffEffect.EXP_ADD(eventType, scene, obj, buff, j); break; } } buff.AddCoolDownTime(); } CalcAttrDamage(thisbuffdamage, buff); if (thisbuffdamage.Count > 0 || thisbuffhealth.Count > 0 || thisbuffmana.Count > 0) { var caster = buff.GetCaster(); if (caster != null) { var replyMsg = new BuffResultMsg(); //发送伤害 foreach (var thisdamage in thisbuffdamage) { var damagevalue = thisdamage.Value; var absorbDamage = 0; obj.DoDamage(eHitType.Hit, buff, caster, delayView, ref damagevalue, thisdamage.Key, ref absorbDamage); //if (absorbDamage > 0) //{ // 吸收 // replyMsg.buff.Add(new BuffResult // { // SkillObjId = caster.ObjId, // TargetObjId = obj.ObjId, // BuffTypeId = buff.GetBuffId(), // Type = BuffType.HT_NODAMAGE, // Damage = damagevalue, // ViewTime = Extension.AddTimeDiffToNet(delayView) // }); //} if (damagevalue > 0) { if (thisdamage.Key == (int)eDamageType.FireAttr) { var result = NetBuffResult(scene, buff, thisdamage.Key, damagevalue, BuffType.HT_Fire_DAMAGE, delayView); replyMsg.buff.Add(result); continue; } else if (thisdamage.Key == (int)eDamageType.IceAttr) { var result = NetBuffResult(scene, buff, thisdamage.Key, damagevalue, BuffType.HT_Ice_DAMAGE, delayView); replyMsg.buff.Add(result); continue; } else if (thisdamage.Key == (int)eDamageType.PoisonAttr) { var result = NetBuffResult(scene, buff, thisdamage.Key, damagevalue, BuffType.HT_Poison_DAMAGE, delayView); replyMsg.buff.Add(result); continue; } CauseCrit.DoEffect(scene, caster, buff, damagevalue); WasCrit.DoEffect(scene, obj, buff, damagevalue); //Logger.Info("伤害类型:{0},伤害值:{1}", thisdamage.Key, damagevalue); if (buff.m_HitType == eHitType.Hit) { var result = NetBuffResult(scene, buff, thisdamage.Key, damagevalue, BuffType.HT_NORMAL, delayView); replyMsg.buff.Add(result); } else if (buff.m_HitType == eHitType.Lucky) { var result = NetBuffResult(scene, buff, thisdamage.Key, damagevalue, BuffType.HT_CRITICAL, delayView); replyMsg.buff.Add(result); } else if (buff.m_HitType == eHitType.Excellent) { var result = NetBuffResult(scene, buff, thisdamage.Key, damagevalue, BuffType.HT_EXCELLENT, delayView); replyMsg.buff.Add(result); } //击中回复生效 var HitRecoveryValue = caster.GetAttribute(eAttributeType.HitRecovery); if (HitRecoveryValue > 0) { var healthvalue = HitRecoveryValue; caster.DoHealth(eHitType.Hit, buff, caster, ref healthvalue, 8); //Logger.Info("治疗类型:{0},治疗值:{1}",8, healthvalue); var nowHp = caster.GetAttribute(eAttributeType.HpNow); if (scene != null && scene.isNeedDamageModify) { if (Scene.IsNeedChangeHp(caster) != null) { nowHp = (int)(nowHp / scene.BeDamageModify); } } replyMsg.buff.Add(new BuffResult { SkillObjId = caster.ObjId, TargetObjId = caster.ObjId, BuffTypeId = buff.GetBuffId(), Type = BuffType.HT_HEALTH, Damage = healthvalue, ViewTime = Extension.AddTimeDiffToNet(delayView), Param = { 0, nowHp } }); } //本Buff的吸血效果(给释放方的) for (var j = 0; j != tb_buff.effectid.Length; ++j) { if (tb_buff.effectid[j] == 18 && tb_buff.effectparam[j, 1] == 0) //有吸血效果,并且是释放者 { BuffEffect.DAMAGE_HEALTH(scene, obj, damagevalue, buff, j, thisbuffhealth); } } //伤害反弹 if (thisdamage.Key != (int)eDamageType.Rebound && thisdamage.Key != (int)eDamageType.Blood) { var DamageReboundValue = obj.GetAttribute(eAttributeType.DamageReboundPro); if (DamageReboundValue > 0) { var damageReboundValue = damagevalue * DamageReboundValue / 10000; if (damageReboundValue > 0) { //caster.DoHealth(eHitType.Hit, buff, caster, ref healthvalue, 8); caster.DoRealDamage(eHitType.Hit, buff, obj, delayView, ref damageReboundValue, (int)eDamageType.Rebound); //Logger.Info("伤害类型:{0},伤害值:{1}", eDamageType.Rebound, damageReboundValue); var nowHp = caster.GetAttribute(eAttributeType.HpNow); if (scene != null && scene.isNeedDamageModify) { if (Scene.IsNeedChangeHp(caster) != null) { nowHp = (int)(nowHp / scene.BeDamageModify); } } replyMsg.buff.Add(new BuffResult { SkillObjId = obj.ObjId, TargetObjId = caster.ObjId, BuffTypeId = buff.GetBuffId(), Type = BuffType.HT_REBOUND, Damage = damageReboundValue, ViewTime = Extension.AddTimeDiffToNet(delayView), Param = { 0, nowHp } }); } } } } else if (absorbDamage <= 0) { //免疫 replyMsg.buff.Add(new BuffResult { SkillObjId = caster.ObjId, TargetObjId = obj.ObjId, BuffTypeId = buff.GetBuffId(), Type = BuffType.HT_NODAMAGE, Damage = damagevalue, ViewTime = Extension.AddTimeDiffToNet(delayView) }); } } //发送治疗 foreach (var thishealth in thisbuffhealth) { if (obj.GetAttribute(eAttributeType.HpNow) == obj.GetAttribute(eAttributeType.HpMax)) { continue; } var healthvalue = thishealth.Value; obj.DoHealth(eHitType.Hit, buff, caster, ref healthvalue, thishealth.Key); //Logger.Info("治疗类型:{0},治疗值:{1}", thishealth.Key, healthvalue); var nowHp = obj.GetAttribute(eAttributeType.HpNow); if (scene != null && scene.isNeedDamageModify) { if (Scene.IsNeedChangeHp(obj) != null) { nowHp = (int)(nowHp / scene.BeDamageModify); } } replyMsg.buff.Add(new BuffResult { SkillObjId = caster.ObjId, TargetObjId = obj.ObjId, BuffTypeId = buff.GetBuffId(), Type = BuffType.HT_HEALTH, Damage = healthvalue, ViewTime = Extension.AddTimeDiffToNet(delayView), Param = { 0, nowHp } }); } //发送回蓝 foreach (var thishealth in thisbuffmana) { var healthvalue = thishealth.Value; obj.DoMana(eHitType.Hit, buff, caster, ref healthvalue, thishealth.Key); //Logger.Info("回蓝类型:{0},回蓝值:{1}", thishealth.Key, healthvalue); replyMsg.buff.Add(new BuffResult { SkillObjId = caster.ObjId, TargetObjId = obj.ObjId, BuffTypeId = buff.GetBuffId(), Type = BuffType.HT_MANA, Damage = healthvalue, ViewTime = Extension.AddTimeDiffToNet(delayView) }); } obj.BroadcastBuffList(replyMsg); } } }
private void StarUpdata(BuffData _this) { Logger.Info("StarUpdata by Buffid={0}", _this.m_nBuffId); _this.m_UpdataTrigger = SceneServerControl.Timer.CreateTrigger(DateTime.Now.AddSeconds(1), () => { OnEventTime(_this); }, BuffData.UpdataMillisecond); }
public static void DoEffect(Scene scene, ObjCharacter target, BuffData buff) { BuffEvent.DoBuff(scene, target, buff, 0, m_sType); }
//删除buff public bool DelBuff(BuffData thisbuff) { return(mImpl.DelBuff(this, thisbuff)); }
//修改Buff表格数据 public static void ModifyBuffTableData(ObjCharacter casterHero, BuffData buff, int buffId, int buffLevel) { mImpl.ModifyBuffTableData(casterHero, buff, buffId, buffLevel); }
//刷新Buff的事件触发标记 public void UpdataBuff_Flag(BuffData buff) { mImpl.UpdataBuff_Flag(this, buff); }