예제 #1
0
        public bool ExcuteRelationship(List <BaseBuff> buffList, BuffCnf newCnf)
        {
            bool result = false;
            int  length = buffList.Count;

            for (int i = length - 1; i >= 0; i--)
            {
                BaseBuff oldBuff = buffList[i];
                if (!oldBuff.Info.CheckGroupById(newCnf.groupID))
                {
                    continue;
                }

                int      newLv   = newCnf.level;
                BuffInfo oldInfo = oldBuff.Info;
                int      lvInfo  = oldInfo.CheckLevel(newLv);
                if (lvInfo == BuffInfo.LESS) // 新buff等级低
                {
                    result = true;
                    BuffLog.Log("新buff等级低 不处理,新Buff:[{0}],levell:[{1}],老Buff[{2}],level:[{3}]",
                                newCnf.desc, newCnf.level, oldInfo.ToDes(), oldInfo.Level);
                    break;
                }
            }

            return(result);
        }
예제 #2
0
        public static BaseBuff Create(int buffId)
        {
            TestBuffFactoryMethod.CreateData();
            BuffCnf  buffObj = StaticCnf.FindData <BuffCnf>(buffId);
            BaseBuff buff    = new BaseBuff(TestBuffFactoryMethod.info);

            return(buff);
        }
예제 #3
0
        //提供给外部 移除Buff
        // TODO 移除的这块逻辑,目前不是特别明确
        public void DetachBuff(BuffId buffId)
        {
            // 1.不存在buff,return
            BaseBuff existBuff = _get_exist_buff(buffId._buffId);

            if (existBuff == null)
            {
                return;
            }

            // 2.存在就移除当前buff
            _detach_buff(existBuff._bid);
        }
예제 #4
0
        /* public SEffect Create(E_EffectType effect_type, int sub_type, string[] param, BaseEntity owner, Buff parent)
         * {
         *   if (effect_type == 0) return null;
         *
         *   int e_type = (int)effect_type;
         *   EffCnf cnf = new EffCnf("", effect_type, sub_type, param);
         *
         *   Dictionary<int, Type> effects;
         *   _effect_map.TryGetValue(e_type, out effects);
         *   if (effects == null)
         *   {
         *       EffectLog.Error("没有大类型为[{0}]的效果", e_type);
         *       return null;
         *   }
         *
         *   Type type;
         *   effects.TryGetValue(sub_type, out type);
         *   if (type == null)
         *   {
         *       EffectLog.Error("没有大类型为[{0}],小类型为[{1}]的效果", e_type, sub_type);
         *       return null;
         *   }
         *   SEffect effect = Activator.CreateInstance(type) as SEffect;
         *
         *   if (effect != null)
         *       effect.Init(cnf, owner, parent);
         *   else
         *       BuffLog.Log("找不到对应的效果" + effect_type);
         *   return effect;
         * }*/

        public BaseEffect Create(BaseBuff target_buff, EffectTemplateInfo info)
        {
            string     type_name = "Summer.EffectAttribute";
            Type       type      = Type.GetType(type_name);
            BaseEffect effect    = Activator.CreateInstance(type) as BaseEffect;

            if (effect == null)
            {
                return(null);
            }
            effect.OnInit(target_buff._bid, info);
            return(effect);
        }
예제 #5
0
        // 添加新Buff
        public void _internal_add_new_buff(BaseEntity caster, BuffCnf buffCnf)
        {
            BuffLog.Log("Attach Buff--> [{0}] add buff [{1}] ", _owner.ToDes(), buffCnf.desc);

            BaseBuff newBuff = _attach_buff(caster, buffCnf.id);
            /*//新Buff 默认情况下在OnAttach下会增加一层 TODO 剔除*/
            bool result = newBuff.AddLayer();

            // 触发回调
            if (result)
            {
                newBuff.RaiseEvent(E_BuffEvent.BUFF_ADD_LAYER);
            }
        }
예제 #6
0
        // caster(施法者) 释放 Buff Apply在owner(目标身)上
        public BaseBuff _attach_buff(BaseEntity caster, int buffId)
        {
            // caster==施法者
            // 1.创建一个Buff
            BaseBuff buff = BuffFactoryMethod.Create(buffId);

            //Buff.Log("Attach Buff-->[{0}] add [{1}] Buff", _owner.ToDes(), buff.info.ToDes());
            // 2.Buff添加到目标身上
            buff.OnAttach(_owner, caster);

            // 3.add to list, by priority, 目前没有优先的设计
            _buffList.Add(buff);

            // 4.set new timer
            return(buff);
        }
예제 #7
0
        // 删除过期
        public void _force_expire(float dt)
        {
            int length = _buffList.Count - 1;

            for (int i = length; i >= 0; i--)
            {
                BaseBuff buff = _buffList[i];
                if (buff.Info.ForceExpire)
                {
                    DetachBuff(buff._bid);
                }
                else if (!buff.IsActive())
                {
                    DetachBuff(buff._bid);
                }
            }
        }
예제 #8
0
        // buff 叠加
        public void _internal_buff_overlap(BaseBuff oldBuff, BuffCnf buffCnf)
        {
            // 层级+1
            bool result = oldBuff.AddLayer();

            if (!result)
            {
                BuffLog.Log("Buff Add Layer 达到最大等级");
                _internal_buff_refresh_time(oldBuff);
                return;
            }


            if (oldBuff.Info.RefreshOnAttach)
            {
                _internal_buff_refresh_time(oldBuff);
            }
            // 触发回调
            // old_buff.RaiseEvent(E_BuffEvent.buff_add_layer);
        }
예제 #9
0
        // BUG 2018.10.22 针对Buff之间的关系,抽象出一个接口,
        // 提供给外部 caster(释放buff者)给自身owner添加Buff 处理buff之间的相互关系  重叠/替换/抵消
        public void AttachBuff(BaseEntity caster, int buffId)
        {
            BuffLog.Assert(!_owner.AttributeProp.IsDead(), "目标[{0}]已经死亡,无法添加Buff:[{1}]", _owner.ToDes(), buffId);
            if (_owner.AttributeProp.IsDead())
            {
                return;
            }

            // 1.根据Id查找对应的ID
            BuffCnf newCnf = BuffHelper.FindBuffById(buffId);

            BuffLog.Log("Attach Buff [{0}]", newCnf.desc);
            // 2.检测buff之间的 关系
            int count  = 0;
            int length = _buffList.Count;

            for (int i = length - 1; i >= 0; i--)
            {
                BaseBuff oldBuff = _buffList[i];
                if (!oldBuff.Info.CheckGroupById(newCnf.groupID))
                {
                    continue;
                }
                count++;
                // TODO BUG逻辑有一定的问题,如果注释掉下面一行代码
                //if (count != 1) continue;

                int newLv = newCnf.level;
                // 1/0/-1 1=本buff等级更高,0=等级相等,-1=本buff等级会第一点
                BuffInfo oldInfo = oldBuff.Info;
                int      lvInfo  = oldInfo.CheckLevel(newLv);

                if (lvInfo == BuffInfo.LESS) // 新buff等级低
                {
                    BuffLog.Log("新buff等级低 不处理,新Buff:[{0}],levell:[{1}],老Buff[{2}],level:[{3}]",
                                newCnf.desc, newCnf.level, oldInfo.ToDes(), oldInfo.Level);
                    continue;
                }
                if (lvInfo == BuffInfo.EQUAL && oldInfo.Multilayer) // 等级相等,可层级叠加
                {
                    BuffLog.Log("Buff:[{0}],等级相等,可层级叠加", oldInfo.ToDes());
                    _internal_buff_overlap(oldBuff, newCnf);
                }
                else if (lvInfo == BuffInfo.EQUAL && !oldInfo.Multilayer) // 等级相等,不可叠加
                {
                    BuffLog.Log("Buff:[{0}],等级相等,不可叠加", oldInfo.ToDes());
                    _internal_buff_refresh_time(oldBuff);
                }
                else // 新buff等级高
                {
                    BuffLog.Log("Buff:[{0}],新Buff等级高,覆盖", oldInfo.ToDes());
                    _internal_buff_overlay(caster, _buffList[i], newCnf);
                }

                _update_attr(0); //让在update中发挥作用的buff马上生效
            }
            if (count == 0)
            {
                _internal_add_new_buff(caster, newCnf);
            }
            else if (count > 1)
            {
                LogManager.Error("Buff Group Id 超过1个数量");
            }
        }
예제 #10
0
 // buff 时间刷新
 public void _internal_buff_refresh_time(BaseBuff buff)
 {
     buff.Info.ResetTimeOut();
 }
예제 #11
0
 // buff 覆盖 高等级覆盖低等级
 public void _internal_buff_overlay(BaseEntity caster, BaseBuff oldBuff, BuffCnf buffCnf)
 {
     DetachBuff(oldBuff._bid);
     _internal_add_new_buff(caster, buffCnf);
 }