using CommonAI.RTS;
using CommonLang.Vector;
using CommonAI.Zone.Attributes;
using CommonAI.Zone.Formula;

namespace CommonAI.Zone.Instance
{
    partial class InstanceZone
    {
        public delegate void InitHandler(InstanceZone zone);
        public delegate void PostEventHandler(InstanceZone zone, Event e);
        public delegate void SendMessageB2RHandler(InstanceZone zone, CommonAI.ZoneServer.SendMessageB2R e);
        public delegate void RecvMessageR2BHandler(InstanceZone zone, CommonAI.ZoneServer.SendMessageR2B e);
        public delegate void SendEventB2RHandler(InstanceZone zone, CommonAI.ZoneServer.SendEventB2R e);

        public delegate void ObjectPosChangedHandler(InstanceZone zone, InstanceZoneObject o);
        public delegate void ObjectSpaceChangedHandler(InstanceZone zone, InstanceZoneObject o, SpaceDivision.SpaceCellNode old_node, SpaceDivision.SpaceCellNode new_node);
        public delegate void ObjectAreaChangedHandler(InstanceZone zone, InstanceZoneObject o, ZoneArea old_node, ZoneArea new_node);

        public delegate void GameOverHandler(InstanceZone zone, GameOverEvent evt);
        public delegate void OnHandleObjectActionHandler(InstanceZoneObject obj, ObjectAction act);
        public delegate void OnHandleActionHandler(InstanceZone zone, Action act);
		public delegate bool OnHandleTryAddUnit(UnitInfo info);
		public delegate bool OnHandleTryAddItem(ItemTemplate info);

		/// <summary>
		/// 场景更新触发
		/// </summary>
		/// <param name="zone"></param>
		public delegate void UpdateHandler(InstanceZone zone);

        /// <summary>
        /// 当单位可攻击时触发,如果单位有出生动画,则动画完结后触发。
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="obj"></param>
        public delegate void UnitActivatedHandler(InstanceZone zone, InstanceUnit obj);

        /// <summary>
        /// 单位进入触发
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="obj"></param>
        public delegate void UnitAddedHandler(InstanceZone zone, InstanceUnit obj);

        /// <summary>
        /// 单位移除触发
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="obj"></param>
        public delegate void UnitRemovedHandler(InstanceZone zone, InstanceUnit obj);

		/// <summary>
		/// 物品移除触发
		/// </summary>
		/// <param name="zone"></param>
		/// <param name="obj"></param>
		public delegate void ItemRemovedHandler(InstanceZone zone, InstanceItem obj);

		/// <summary>
		/// 单位开始放技能
		/// </summary>
		/// <param name="zone"></param>
		/// <param name="u"></param>
		/// <param name="skill"></param>
		public delegate void UnitLaunchSkillHandler(InstanceZone zone, InstanceUnit u, InstanceUnit.SkillState skill);

        /// <summary>
        /// 单位死亡触发
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="obj"></param>
        /// <param name="attacker"></param>
        public delegate void UnitDeadHandler(InstanceZone zone, InstanceUnit obj, InstanceUnit attacker);

        /// <summary>
        /// 单位受到攻击触发
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="obj"></param>
        /// <param name="attacker"></param>
        public delegate void UnitDamageHandler(InstanceZone zone, InstanceUnit obj, InstanceUnit attacker, int reduceHP, AttackSource source);

        /// <summary>
        /// 单位复活触发
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="obj"></param>
        public delegate void UnitRebirthHandler(InstanceZone zone, InstanceUnit obj);

        /// <summary>
        /// 单位获取场景物品
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="unit"></param>
        /// <param name="item"></param>
        public delegate void UnitGotInstanceItemHandler(InstanceZone zone, InstanceUnit unit, InstanceItem item);

        /// <summary>
        /// 单位获取物品进背包
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="unit"></param>
        /// <param name="item"></param>
        /// <param name="count"></param>
        public delegate void UnitGotInventoryItemHandler(InstanceZone zone, InstanceUnit unit, ItemTemplate item, int count);
        /// <summary>
        /// 单位丢失物品
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="unit"></param>
        /// <param name="item"></param>
        /// <param name="count"></param>
        public delegate void UnitLostInventoryItemHandler(InstanceZone zone, InstanceUnit unit, ItemTemplate item, int count);
        /// <summary>
        /// 单位获取物品
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="unit"></param>
        /// <param name="item"></param>
        /// <param name="item_creater"></param>
        public delegate void UnitUseItemHandler(InstanceZone zone, InstanceUnit unit, ItemTemplate item, InstanceUnit item_creater);
        /// <summary>
        /// 单位中BUFF
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="unit"></param>
        /// <param name="buff"></param>
        public delegate void UnitGotBuffHandler(InstanceZone zone, InstanceUnit unit, InstanceUnit.BuffState buff);
        /// <summary>
        /// 单位失去BUFF
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="unit"></param>
        /// <param name="buff"></param>
        public delegate void UnitLostBuffHandler(InstanceZone zone, InstanceUnit unit, InstanceUnit.BuffState buff);
        /// <summary>
        /// 单位获取金币
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="add_money"></param>
        public delegate void UnitGotMoneyHandler(InstanceUnit obj, int add_money);
        /// <summary>
        /// 单位和其他单位产生交互
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="obj"></param>
        /// <param name="pickable"></param>
        public delegate void UnitPickUnitHandler(InstanceZone zone, InstanceUnit obj, InstanceUnit pickable);

		/// <summary>
		/// 单位脱战
		/// </summary>
		/// <param name="zone"></param>
		/// <param name="obj"></param>
		/// <param name="pickable"></param>
		public delegate void UnitOutBattleHandler(InstanceZone zone, InstanceUnit obj);

		/// <summary>
		/// 单位尝试检取道具监听,
		/// 返回False禁止检取
		/// </summary>
		/// <param name="zone"></param>
		/// <param name="unit"></param>
		/// <param name="item"></param>
		/// <returns></returns>
		public delegate bool TryPickItemHandler(InstanceZone zone, InstanceUnit unit, InstanceItem item);

        /// <summary>
        /// 单位完成采集道具
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="unit"></param>
        /// <param name="item"></param>
        /// <returns></returns>
        public delegate bool FinishPickItemHandler(InstanceZone zone, InstanceUnit unit, InstanceItem item);

        /// <summary>
        /// 添加物品到场景
        /// </summary>
        /// <param name="zone"></param>
        /// <param name="item"></param>
        /// <param name="item_creater"></param>
        public delegate void ItemAddedHandler(InstanceZone zone, InstanceItem item, InstanceUnit item_creater);

        //----------------------------------------------------------------------------------------------------

        /// <summary>
        /// 玩家准备完毕
        /// </summary>
        /// <param name="player"></param>
        public delegate void PlayerReadyHandler(InstancePlayer player);

        /// <summary>
        /// 【服务端】任务已接受
        /// </summary>
        /// <param name="player"></param>
        /// <param name="quest"></param>
        public delegate void QuestAcceptedHandler(InstancePlayer player, string quest);
        /// <summary>
        /// 【服务端】任务已提交
        /// </summary>
        /// <param name="player"></param>
        /// <param name="quest"></param>
        public delegate void QuestCommittedHandler(InstancePlayer player, string quest);
        /// <summary>
        /// 【服务端】任务已放弃
        /// </summary>
        /// <param name="player"></param>
        /// <param name="quest"></param>
        public delegate void QuestDroppedHandler(InstancePlayer player, string quest);
        /// <summary>
        /// 【服务端】任务状态已更新
        /// </summary>
        /// <param name="player"></param>
        /// <param name="quest"></param>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public delegate void QuestStatusChangedHandler(InstancePlayer player, string quest, string key, string value);


        //----------------------------------------------------------------------------------------------------
        private UpdateHandler mOnUpdate;
        private InitHandler mOnInit;
        private ObjectPosChangedHandler mOnObjectPosChanged;
        private ObjectSpaceChangedHandler mOnObjectSpaceChanged;
        private ObjectAreaChangedHandler mOnObjectAreaChanged;

        private PostEventHandler mOnPostEvent;
        private SendMessageB2RHandler mOnSendToGS;
        private RecvMessageR2BHandler mOnRecvFromGS;
        private SendEventB2RHandler mOnSendMessageB2REvent;

        private UnitActivatedHandler mOnUnitActivated;
        private UnitAddedHandler mOnUnitAdded;
        private UnitRemovedHandler mOnUnitRemoved;
		private ItemRemovedHandler mOnItemRemoved;
		private UnitLaunchSkillHandler mOnUnitLaunchSkill;
        private UnitDeadHandler mOnUnitDead;
        private UnitDamageHandler mOnUnitDamage;
        private UnitRebirthHandler mOnUnitRebirth;
        private UnitGotInstanceItemHandler mOnUnitGotInstanceItem;
        private UnitGotInventoryItemHandler mOnUnitGotInventoryItem;
        private UnitLostInventoryItemHandler mOnUnitLostInventoryItem;
        private UnitUseItemHandler mOnUnitUseItem;
        private UnitGotBuffHandler mOnUnitGotBuff;
        private UnitLostBuffHandler mOnUnitLostBuff;
        private UnitGotMoneyHandler mOnUnitGotMoney;
        private UnitPickUnitHandler mOnUnitPickUnit;
		private UnitOutBattleHandler mOnUnitOutBattle;

		private GameOverHandler mOnGameOver;
        private OnHandleObjectActionHandler mOnHandleObjectAction;
        private OnHandleActionHandler mOnHandleAction;

		//是否可以加入单位
		private OnHandleTryAddUnit mTryAddUnit;
		private OnHandleTryAddItem mTryAddItem;

		private TryPickItemHandler mTryPickItem;
        private FinishPickItemHandler mFinishPickItem;
        private ItemAddedHandler mItemAdded;
        private PlayerReadyHandler mPlayerReady;

        private QuestAcceptedHandler mOnQuestAccepted;
        private QuestCommittedHandler mOnQuestCommitted;
        private QuestDroppedHandler mOnQuestDropped;
        private QuestStatusChangedHandler mOnQuestStatusChanged;


        protected virtual void ClearEvents()
        {
            this.mOnUpdate = null;
            this.mOnInit = null;
            this.mOnObjectPosChanged = null;
            this.mOnObjectSpaceChanged = null;
            this.mOnObjectAreaChanged = null;

            this.mOnPostEvent = null;
            this.mOnSendToGS = null;
            this.mOnRecvFromGS = null;
            this.mOnSendMessageB2REvent = null;

            this.mOnUnitActivated = null;
            this.mOnUnitAdded = null;
            this.mOnUnitRemoved = null;
			this.mOnItemRemoved = null;
            this.mOnUnitDead = null;
            this.mOnUnitDamage = null;
            this.mOnUnitRebirth = null;
            this.mOnUnitGotInstanceItem = null;
            this.mOnUnitGotInventoryItem = null;
            this.mOnUnitLostInventoryItem = null;
            this.mOnUnitUseItem = null;
            this.mOnUnitGotBuff = null;
            this.mOnUnitLostBuff = null;
            this.mOnUnitGotMoney = null;
            this.mOnUnitPickUnit = null;

            this.mOnGameOver = null;
            this.mOnHandleObjectAction = null;
            this.mOnHandleAction = null;

            this.mTryPickItem = null;
            this.mFinishPickItem = null;
            this.mItemAdded = null;
            this.mPlayerReady = null;

            this.mOnQuestAccepted = null;
            this.mOnQuestCommitted = null;
            this.mOnQuestDropped = null;
            this.mOnQuestStatusChanged = null;

        }
        //----------------------------------------------------------------------------------------------------


        public event UpdateHandler OnUpdate { add { mOnUpdate += value; } remove { mOnUpdate -= value; } }

        [EventTriggerDescAttribute("场景初始化时触发")]
        public event InitHandler OnInit { add { mOnInit += value; } remove { mOnInit -= value; } }
        [EventTriggerDescAttribute("单位位置发生变化时触发")]
        public event ObjectPosChangedHandler OnObjectPosChanged { add { mOnObjectPosChanged += value; } remove { mOnObjectPosChanged -= value; } }
        [EventTriggerDescAttribute("单位空间分割发生变化时触发")]
        public event ObjectSpaceChangedHandler OnObjectSpaceChanged { add { mOnObjectSpaceChanged += value; } remove { mOnObjectSpaceChanged -= value; } }
        [EventTriggerDescAttribute("单位Area发生变化时触发")]
        public event ObjectAreaChangedHandler OnObjectAreaChanged { add { mOnObjectAreaChanged += value; } remove { mOnObjectAreaChanged -= value; } }

        [EventTriggerDescAttribute("场景推送消息时触发")]
        public event PostEventHandler OnPostEvent { add { mOnPostEvent += value; } remove { mOnPostEvent -= value; } }

        [EventTriggerDescAttribute("【战斗服->游戏服】已发送字符串消息")]
        public event SendMessageB2RHandler OnSendMessageToGS { add { mOnSendToGS += value; } remove { mOnSendToGS -= value; } }
        [EventTriggerDescAttribute("【游戏服->战斗服】已接收字符串消息")]
        public event RecvMessageR2BHandler OnRecvMessageFromGS { add { mOnRecvFromGS += value; } remove { mOnRecvFromGS -= value; } }
        [EventTriggerDescAttribute("【战斗服->游戏服】发送自定义事件")]
        public event SendEventB2RHandler OnSendEventB2R { add { mOnSendMessageB2REvent += value; } remove { mOnSendMessageB2REvent -= value; } }


        [EventTriggerDescAttribute("当单位可攻击时触发,如果单位有出生动画,则动画完结后触发。")]
        public event UnitActivatedHandler OnUnitActivated { add { mOnUnitActivated += value; } remove { mOnUnitActivated -= value; } }
        [EventTriggerDescAttribute("单位进入触发")]
        public event UnitAddedHandler OnUnitAdded { add { mOnUnitAdded += value; } remove { mOnUnitAdded -= value; } }
        [EventTriggerDescAttribute("单位移除触发")]
        public event UnitRemovedHandler OnUnitRemoved { add { mOnUnitRemoved += value; } remove { mOnUnitRemoved -= value; } }
		[EventTriggerDescAttribute("物品移除触发")]
		public event ItemRemovedHandler OnItemRemoved { add { mOnItemRemoved += value; } remove { mOnItemRemoved -= value; } }
		[EventTriggerDescAttribute("单位死亡触发")]
        public event UnitDeadHandler OnUnitDead { add { mOnUnitDead += value; } remove { mOnUnitDead -= value; } }
        [EventTriggerDescAttribute("单位受到攻击触发")]
        public event UnitDamageHandler OnUnitDamage { add { mOnUnitDamage += value; } remove { mOnUnitDamage -= value; } }
        [EventTriggerDescAttribute("单位复活触发")]
        public event UnitRebirthHandler OnUnitRebirth { add { mOnUnitRebirth += value; } remove { mOnUnitRebirth -= value; } }
        [EventTriggerDescAttribute("单位释放技能")]
        public event UnitLaunchSkillHandler OnUnitLaunchSkill { add { mOnUnitLaunchSkill += value; } remove { mOnUnitLaunchSkill -= value; } }
        [EventTriggerDescAttribute("单位获取物品")]
        public event UnitGotInstanceItemHandler OnUnitGotInstanceItem { add { mOnUnitGotInstanceItem += value; } remove { mOnUnitGotInstanceItem -= value; } }
        [EventTriggerDescAttribute("单位获取背包物品")]
        public event UnitGotInventoryItemHandler OnUnitGotInventoryItem { add { mOnUnitGotInventoryItem += value; } remove { mOnUnitGotInventoryItem -= value; } }
        [EventTriggerDescAttribute("单位丢失背包物品")]
        public event UnitLostInventoryItemHandler OnUnitLostInventoryItem { add { mOnUnitLostInventoryItem += value; } remove { mOnUnitLostInventoryItem -= value; } }
        [EventTriggerDescAttribute("单位使用道具")]
        public event UnitUseItemHandler OnUnitUseItem { add { mOnUnitUseItem += value; } remove { mOnUnitUseItem -= value; } }
        [EventTriggerDescAttribute("单位中BUFF")]
        public event UnitGotBuffHandler OnUnitGotBuff { add { mOnUnitGotBuff += value; } remove { mOnUnitGotBuff -= value; } }
        [EventTriggerDescAttribute("单位失去BUFF")]
        public event UnitLostBuffHandler OnUnitLostBuff { add { mOnUnitLostBuff += value; } remove { mOnUnitLostBuff -= value; } }
        [EventTriggerDescAttribute("单位获得金币")]
        public event UnitGotMoneyHandler OnUnitGotMoney { add { mOnUnitGotMoney += value; } remove { mOnUnitGotMoney -= value; } }
        [EventTriggerDescAttribute("单位和其他单位产生交互")]
        public event UnitPickUnitHandler OnUnitPickUnit { add { mOnUnitPickUnit += value; } remove { mOnUnitPickUnit -= value; } }
		[EventTriggerDescAttribute("单位脱战")]
		public event UnitOutBattleHandler OnUnitOutBattle { add { mOnUnitOutBattle += value; } remove { mOnUnitOutBattle -= value; } }
		
		[EventTriggerDescAttribute("收到游戏结束事件")]
        public event GameOverHandler OnGameOver { add { mOnGameOver += value; } remove { mOnGameOver -= value; } }
        [EventTriggerDescAttribute("收到客户端输入的动作")]
        public event OnHandleObjectActionHandler OnHandleObjectAction { add { mOnHandleObjectAction += value; } remove { mOnHandleObjectAction -= value; } }
        [EventTriggerDescAttribute("收到场景输入的动作(通常是游戏服)")]
        public event OnHandleActionHandler OnHandleAction { add { mOnHandleAction += value; } remove { mOnHandleAction -= value; } }
        [EventTriggerDescAttribute("单位尝试检取采集道具,返回False禁止检取")]
        public event TryPickItemHandler OnTryPickItem { add { mTryPickItem += value; } remove { mTryPickItem -= value; } }
        [EventTriggerDescAttribute("单位完成采集道具")]
        public event FinishPickItemHandler OnFinishPickItem { add { mFinishPickItem += value; } remove { mFinishPickItem -= value; } }
        [EventTriggerDescAttribute("添加物品单位到场景")]
        public event ItemAddedHandler OnItemAdded { add { mItemAdded += value; } remove { mItemAdded -= value; } }
        [EventTriggerDescAttribute("玩家准备完毕")]
        public event PlayerReadyHandler OnPlayerReady { add { mPlayerReady += value; } remove { mPlayerReady -= value; } }

		[EventTriggerDescAttribute("单位尝试加入到场景")]
		public event OnHandleTryAddUnit OnTryAddUnit { add { mTryAddUnit += value; } remove { mTryAddUnit -= value; } }

		[EventTriggerDescAttribute("物品尝试加入到场景")]
		public event OnHandleTryAddItem OnTryAddItem { add { mTryAddItem += value; } remove { mTryAddItem -= value; } }

		[EventTriggerDescAttribute("【游戏服->战斗服】任务已接受")]
        public event QuestAcceptedHandler OnQuestAccepted { add { mOnQuestAccepted += value; } remove { mOnQuestAccepted -= value; } }
        [EventTriggerDescAttribute("【游戏服->战斗服】任务已提交")]
        public event QuestCommittedHandler OnQuestCommitted { add { mOnQuestCommitted += value; } remove { mOnQuestCommitted -= value; } }
        [EventTriggerDescAttribute("【游戏服->战斗服】任务已放弃")]
        public event QuestDroppedHandler OnQuestDropped { add { mOnQuestDropped += value; } remove { mOnQuestDropped -= value; } }
        [EventTriggerDescAttribute("【游戏服->战斗服】任务状态已更新")]
        public event QuestStatusChangedHandler OnQuestStatusChanged { add { mOnQuestStatusChanged += value; } remove { mOnQuestStatusChanged -= value; } }

    }
}