using CommonAI.Zone;
using CommonAI.Zone.Formula;
using CommonAI.Zone.Instance;
using CommonLang;
using System;
using XmdsCommon.Plugin;
using XmdsCommonServer.Plugin;
using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator;
using XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills;

namespace XmdsCommonSkill.Plugin.Buffs
{

    /// <summary>
    ///BUFF:buff每秒触发,附近队友附加相应buff
    /// </summary>
    public class XmdsBuff_AddBuff : XmdsBuffBase
    {
        //增加buffID
        public int addBuffId = 0;

        //附近队友范围
        public int addBuffRange = 5;

        public override int GetAbilityID()
        {
            return (int)XmdsCommon.Plugin.XmdsBuffProperties.XmdsBuffAbility.AddBuff;
        }

		public override void CopyTo(UnitBuff other)
		{
			var ret = other as XmdsBuff_AddBuff;
			ret.addBuffId = this.addBuffId;
			ret.addBuffRange = this.addBuffRange;
			base.CopyTo(other);
		}

		protected override void OnBindTemplate(ref BuffTemplate buffTemplate)
        {
            //DOT类技能首帧无效.
            buffTemplate.FirstTimeEnable = false;
            base.OnBindTemplate(ref buffTemplate);
        }

        protected override int OnBuffHit(XmdsVirtual hitter,
            XmdsVirtual attacker, CommonAI.Zone.Formula.AttackSource source,
            ref XmdsVirtual.AtkResult result)
        {
            //血量平分
            //治疗自己和队友
            using (var list = ListObjectPool<InstanceUnit>.AllocAutoRelease())
            {
                attacker.mUnit.Parent.getObjectsRoundRange<InstanceUnit>(
                    (obj, dx, dy, dr) =>
                    {
                        var u = obj as InstanceUnit;
                        //己方单位.
                        if (attacker.IsAllies(u.Virtual as XmdsVirtual, false, true))
                        {
                            return CMath.includeRoundPoint(dx, dy, dr, u.X, u.Y);
                        }

                        return false;
                    },
                    attacker.mUnit.X,
                    attacker.mUnit.Y,
                    addBuffRange,
                    list, attacker.mUnit.AoiStatus);


                //加血 & 加速
                for (int i = 0; i < list.Count; i++)
                {
                    list[i].AddBuff(this.addBuffId, attacker.mUnit);
                }
            }

            return base.OnBuffHit(hitter, attacker, source, ref result); ;
		}
	}
}