123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- using CommonAI.Zone.Attributes;
- using CommonAI.Zone.Instance;
- using CommonLang;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace CommonAI.Zone.Helper
- {
- public abstract class ObjectAoiStatus
- {
- private HashMap<uint, InstanceZoneObject> mObjects = new HashMap<uint, InstanceZoneObject>(2);
- /// <summary>
- /// 别人可以看到自己
- /// </summary>
- public abstract bool CanSeeMe
- {
- get;
- }
- /// <summary>
- /// 自己可以看到别人
- /// </summary>
- public abstract bool CanSeeOther
- {
- get;
- }
- /// <summary>
- /// 是否需要通知客户端进入位面
- /// </summary>
- public abstract bool IsNeedNotifyClient
- {
- get;
- }
- internal void AddObject(InstanceZoneObject o)
- {
- if (mObjects.TryAdd(o.ID, o))
- {
- onObjectEnter(o);
- if (m_OnObjectEnter != null)
- {
- m_OnObjectEnter.Invoke(this, o);
- }
- }
- }
- internal void RemoveObject(InstanceZoneObject o)
- {
- if (mObjects.Remove(o.ID))
- {
- onObjectLeave(o);
- if (m_OnObjectLeave != null)
- {
- m_OnObjectLeave.Invoke(this, o);
- }
- }
- }
- protected virtual void onObjectEnter(InstanceZoneObject o) { }
- protected virtual void onObjectLeave(InstanceZoneObject o) { }
- //-------------------------------------------------------------------------------------------------------------------------
- #region EVENTS
- public delegate void OnObjectEnterHandler(ObjectAoiStatus aoi, InstanceZoneObject o);
- public delegate void OnObjectLeaveHandler(ObjectAoiStatus aoi, InstanceZoneObject o);
- private OnObjectEnterHandler m_OnObjectEnter;
- private OnObjectLeaveHandler m_OnObjectLeave;
- [EventTriggerDescAttribute("单位进入AOI")]
- public event OnObjectEnterHandler OnObjectEnter { add { m_OnObjectEnter += value; } remove { m_OnObjectEnter -= value; } }
- [EventTriggerDescAttribute("单位离开AOI")]
- public event OnObjectLeaveHandler OnObjectLeave { add { m_OnObjectLeave += value; } remove { m_OnObjectLeave -= value; } }
- #endregion
- //-------------------------------------------------------------------------------------------------------------------------
- #region API
- public IEnumerable<InstanceZoneObject> Objects { get { return mObjects.Values; } }
- public InstanceZoneObject GetObject(uint id)
- {
- return mObjects.Get(id);
- }
-
- /// <summary>
- /// 获取AOI内指定类型单位数量
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="select">选择器</param>
- /// <returns></returns>
- public int GetObjectCount<T>(Predicate<T> select) where T : InstanceZoneObject
- {
- int ret = 0;
- foreach (var o in this.Objects)
- {
- if (o is T)
- {
- var u = o as T;
- if (select(u))
- {
- ret++;
- }
- }
- }
- return ret;
- }
- public T FindObject<T>(Predicate<T> select) where T : InstanceZoneObject
- {
- foreach (var o in this.Objects)
- {
- if (o is T)
- {
- var u = o as T;
- if (select(u))
- {
- return u;
- }
- }
- }
- return null;
- }
- /// <summary>
- /// 获取AOI内指定name单位数量
- /// </summary>
- /// <param name="name"></param>
- /// <returns></returns>
- public int GetUnitCountByName(string name)
- {
- return GetObjectCount<InstanceUnit>((u) => { return u.Name == name; });
- }
- /// <summary>
- /// 获取AOI内指定Force单位数量
- /// </summary>
- /// <param name="force"></param>
- /// <returns></returns>
- public int GetUnitCountByForce(int force)
- {
- return GetObjectCount<InstanceUnit>((u) => { return u.Force == force; });
- }
- /// <summary>
- /// 获取AOI内指定模板单位数量
- /// </summary>
- /// <param name="unit_template_id"></param>
- /// <returns></returns>
- public int GetUnitCountByTemplateID(int unit_template_id)
- {
- return GetObjectCount<InstanceUnit>((u) => { return u.Info.ID == unit_template_id; });
- }
- /// <summary>
- /// 获取AOI内指定Force和指定模板单位数量
- /// </summary>
- /// <param name="force"></param>
- /// <param name="unit_template_id"></param>
- /// <returns></returns>
- public int GetUnitCount(int force, int unit_template_id)
- {
- return GetObjectCount<InstanceUnit>((u) => { return u.Force == force && u.Info.ID == unit_template_id; });
- }
- public InstanceUnit FindUnitByName(string name)
- {
- return FindObject<InstanceUnit>((u) => { return u.Name == name; });
- }
- public InstanceUnit FindUnitByTemplateID(int unit_template_id)
- {
- return FindObject<InstanceUnit>((u) => { return u.Info.ID == unit_template_id; });
- }
- public int GetPlayerCount()
- {
- return GetObjectCount<InstancePlayer>((u) => { return u.IsPlayer; });
- }
- public bool hasPlayer()
- {
- foreach (var o in this.Objects)
- {
- if(o is InstancePlayer)
- {
- return true;
- }
- }
- return false;
- }
- #endregion
- //-------------------------------------------------------------------------------------------------------------------------
- }
- }
|