using CommonAI.Zone.Instance;
using CommonAI.Zone.Formula;
using XmdsCommon.Message;
using XmdsCommon.Plugin;
using XmdsCommonServer.Message;
using XmdsCommon.EditorData;
using XmdsCommonServer.Plugin.Units;
using CommonAI.Zone;

namespace XmdsCommonServer.Plugin
{
    /// <summary>
    /// FileName: XmdsVirtual.cs
    /// Author: Alex.Yu
    /// Corporation:... 
    /// Description: 用于伤害数值计算.
    /// DateTime: 2015/5/13 14:17:23
    /// </summary>
    partial class XmdsVirtual
    {
        #region PickUnit复活.

        protected void mUnit_OnPickUnit(InstanceUnit obj, InstanceUnit pickable, int time)
        {
            //点击已方阵营死亡玩家//
            if (pickable is InstancePlayer && pickable.Force == mUnit.Force && pickable.IsDead())
            {
                XmdsUnitProperties prop = (XmdsUnitProperties)(pickable.Info.Properties);
                XmdsVirtual zv = (XmdsVirtual)obj.Virtual;
                //开始读条复活死亡单位//
                CommonAI.Zone.Instance.InstanceUnit.StatePickObject spo = mUnit.startPickProgressObject(pickable, time, (s, p) =>
                     {
                         //如果单位已经处于活状态,则中断.
                         if (pickable.IsDead() == true)
                         {
                             SendSaveMessage(obj, pickable);
                         }
                     });

                if (spo != null)
                {
                    spo.SetCheckTargetAcvite(OnCheckPickable);
                }
            }
        }

        private bool OnCheckPickable(InstanceUnit unit, InstanceZoneObject pickable, ref string reason)
        {
            bool ret = false;

            if (pickable is InstanceUnit)
            {
                InstanceUnit iu = (InstanceUnit)pickable;
                if (iu.IsDead() == false)//如果单位复活则立即中断.
                {
                    ret = true;
                }
            }

            return ret;
        }

        private void SendSaveMessage(InstanceUnit obj, InstanceUnit pickable)
        {

        }

        /// <summary>
        /// 发送施救信息.
        /// </summary>
        /// <param name="evt"></param>
        public void SendSaveMessage(ShowRebirthDialogueB2R evt)
        {
            if (evt != null)
            {
                this.mUnit.queueEvent(evt);
            }
        }

        #endregion

        #region 上下坐骑.

        /// <summary>
        /// 开始召唤坐骑.
        /// </summary>
        /// <param name="timeMS"></param>
        /// <param name="isSummonMount"></param>
        /// <param name="status"></param>
        public void StartSummonMount(int timeMS, bool isSummonMount, string status)
        {
            if (isSummonMount == false)
            {
                TakeOffMount();
            }
            else
            {
                //时间为0.不做动作,直接上坐骑.
                if (timeMS == 0)
                {
                    SyncMountStatus(isSummonMount);
                }
                else
                {
                    this.mUnit.startPickProgressSelf(timeMS, (s, p) =>
                    {
                        SyncMountStatus(isSummonMount);
                    }, status);
                }
            }

        }
        /// <summary>
        /// 通知游戏服单位坐骑状态变更.
        /// </summary>
        /// <param name="isSummonMount"></param>
        private void SendSummonMountNotify(bool isSummonMount)
        {

            if (this.mUnit is InstancePlayer)
            {
                SummonMountEventB2R evt = new SummonMountEventB2R();
                evt.playerId = (this.mUnit as InstancePlayer).PlayerUUID;
                evt.IsSummonMount = isSummonMount;

                this.mUnit.queueEvent(evt);
                var teamVirtual = (this.mUnit as XmdsInstancePlayer).TeamVirtual;
                //XmdsTeamInfo TeamInfo = (this.mUnit as XmdsInstancePlayer).TeamInfo;
                if (teamVirtual != null && isSummonMount && teamVirtual.TeamLeader == this.mUnit)
                {
                    teamVirtual.notifyTeamerRide();
                }
            }

        }
        /// <summary>
        /// 同步坐骑状态.
        /// </summary>
        /// <param name="isSummonMount"></param>
        private void SyncMountStatus(bool isSummonMount)
        {
            IsMounted = isSummonMount;
            //通知游戏服.
            SendSummonMountNotify(isSummonMount);
        }
      
        /// <summary>
        /// 检查坐骑状态.
        /// </summary>
        /// <param name="attacker"></param>
        private void MountOnHitCheck(XmdsVirtual attacker)
        {
            if (!IsMounted) { return; }

            //被玩家单位或BOSS攻击时下马.
            //bool IsBoss = false;

            //if (attacker is XmdsVirtual_Monster)
            //{
            //    MonsterVisibleDataB2C edata = attacker.mUnit.GenSyncInfo(false).ExtData as MonsterVisibleDataB2C;

            //    if (edata != null && edata.MType == MonsterVisibleDataB2C.MonsterType.MType4)
            //    {
            //        IsBoss = true;
            //    }
            //}

           // if (attacker.IsPlayerUnit() || IsBoss)
            {
                SendMsgToClient(CommonAI.XmdsConstConfig.TIPS_UNDER_ATTACK);
                this.TakeOffMount();
            }
        }

        /// <summary>
        /// 放技能时检查影响坐骑状态.
        /// </summary>
        private void MountOnLaunchSkillCheck()
        {
            if (!IsMounted) { return; }

            this.TakeOffMount();
        }

        /// <summary>
        /// 中BUFF时检查是否影响坐骑状态.
        /// </summary>
        /// <param name="node"></param>
        private void MountOnBuffBegin(BuffTemplate buff)
        {
            if (!IsMounted) { return; }

            //控制类BUFF,会强制取消坐骑状态.
            if (XmdsInstanceUtils.IsControlBuff(buff))
            {
                this.TakeOffMount();
            }
        }

        /// <summary>
        /// 被攻击时检查是否影响坐骑状态.
        /// </summary>
        /// <param name="source"></param>
        private void MountOnHit(AttackSource source)
        {
            if (!IsMounted) { return; }

            if (source.OutIsDamage == true)
            {
                this.TakeOffMount();
            }
        }

        #endregion
    }
}