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 mObjects = new HashMap(2); /// /// 别人可以看到自己 /// public abstract bool CanSeeMe { get; } /// /// 自己可以看到别人 /// public abstract bool CanSeeOther { get; } /// /// 是否需要通知客户端进入位面 /// 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 Objects { get { return mObjects.Values; } } public InstanceZoneObject GetObject(uint id) { return mObjects.Get(id); } /// /// 获取AOI内指定类型单位数量 /// /// /// 选择器 /// public int GetObjectCount(Predicate 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(Predicate 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; } /// /// 获取AOI内指定name单位数量 /// /// /// public int GetUnitCountByName(string name) { return GetObjectCount((u) => { return u.Name == name; }); } /// /// 获取AOI内指定Force单位数量 /// /// /// public int GetUnitCountByForce(int force) { return GetObjectCount((u) => { return u.Force == force; }); } /// /// 获取AOI内指定模板单位数量 /// /// /// public int GetUnitCountByTemplateID(int unit_template_id) { return GetObjectCount((u) => { return u.Info.ID == unit_template_id; }); } /// /// 获取AOI内指定Force和指定模板单位数量 /// /// /// /// public int GetUnitCount(int force, int unit_template_id) { return GetObjectCount((u) => { return u.Force == force && u.Info.ID == unit_template_id; }); } public InstanceUnit FindUnitByName(string name) { return FindObject((u) => { return u.Name == name; }); } public InstanceUnit FindUnitByTemplateID(int unit_template_id) { return FindObject((u) => { return u.Info.ID == unit_template_id; }); } public int GetPlayerCount() { return GetObjectCount((u) => { return u.IsPlayer; }); } public bool hasPlayer() { foreach (var o in this.Objects) { if(o is InstancePlayer) { return true; } } return false; } #endregion //------------------------------------------------------------------------------------------------------------------------- } }