Пример #1
0
        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);
        }
Пример #2
0
 //删除buff
 public bool DelBuff(BuffList _this, BuffData thisbuff)
 {
     if (thisbuff == null)
     {
         return(false);
     }
     thisbuff.SetActive(false);
     return(true);
 }
Пример #3
0
 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));
     }
 }
Пример #4
0
 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);
     });
 }
Пример #5
0
 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);
         }
     }
 }
Пример #6
0
 //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);
 }
Пример #7
0
        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);
                }
            }
        }
Пример #8
0
 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;
     }
 }
Пример #9
0
 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;
     }
 }
Пример #10
0
        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);
        }
Пример #11
0
 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;
         }
     }
 }
Пример #12
0
        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);
        }
Пример #13
0
 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));
     }
 }
Пример #14
0
 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);
 }
Пример #15
0
        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;
                }
            }
        }
Пример #16
0
 //刷新Buff的事件触发标记
 public void UpdataBuff_Flag(BuffList _this, BuffData buff)
 {
     buff.m_Flag.ReSetAllFlag();
 }
Пример #17
0
 public static void DoEffect(Scene scene, ObjCharacter target, BuffData buff, int DelayView)
 {
     BuffEvent.DoBuff(scene, target, buff, DelayView, m_sType);
 }
Пример #18
0
        //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);
                }
            }
        }
Пример #19
0
 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);
 }
Пример #20
0
 public static void DoEffect(Scene scene, ObjCharacter target, BuffData buff)
 {
     BuffEvent.DoBuff(scene, target, buff, 0, m_sType);
 }
Пример #21
0
 //删除buff
 public bool DelBuff(BuffData thisbuff)
 {
     return(mImpl.DelBuff(this, thisbuff));
 }
Пример #22
0
 //修改Buff表格数据
 public static void ModifyBuffTableData(ObjCharacter casterHero, BuffData buff, int buffId, int buffLevel)
 {
     mImpl.ModifyBuffTableData(casterHero, buff, buffId, buffLevel);
 }
Пример #23
0
 //刷新Buff的事件触发标记
 public void UpdataBuff_Flag(BuffData buff)
 {
     mImpl.UpdataBuff_Flag(this, buff);
 }